Java类变量和成员变量初始化过程的应用介绍

_____CHELSEA

_____CHELSEA

2016-02-19 10:11

今天图老师小编要跟大家分享Java类变量和成员变量初始化过程的应用介绍,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

一、类的初始化

对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。

类的编译决定了类的初始化过程。

编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:

1)       先按照静态成员变量的定义顺序在类内部声明成员变量。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

2)       再按照原java类中对成员变量的初始化顺序进行初始化。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

一个java类和编译后的class对应的转换如下:

源文件:
代码如下:

public class Person{
  public static String name="张三";
  public static int age;
  static{
       age=20;
    System.out.println("初始化age");
  }
  public static String address;
  static{
    address="北京市";
    age=34;
  }
  public static void main(String[] args) {
                   System.out.println(name);
                   System.out.println(age);
                   System.out.println(address);
         }
}

当java源代码转换成一个class文件后,其转换成类似下面的代码:
代码如下:

public class Person{
  public static String name;
  public static int age;
  public static String address;
  static{
    name="张三";
    age=20;
    System.out.println("初始化age");
    address="北京市";
    age=34;
  }
  public static void main(String[] args) {
                   System.out.println(name);
                   System.out.println(age);
                   System.out.println(address);
         }
}

初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。

二、对象的生成

对于对象的生成其初始化过程与类的初始化过程类似,但会增加构造函数阶段,源代码如下:
代码如下:

public class Person{
   {
     name="李四";
     age=56;
     System.out.println("初始化age");
     address="上海";
   }
   public String name="张三";
   public int age=29;
   public String address="北京市";
   public Person(){
     name="赵六";
     age=23;
     address="上海市";
   }
 }

编译器转换成class文件后,会转换成类似下面的代码:
代码如下:

public class Person{
   public String name;
   public int age;
   public String address;
   public Person(){
     name="李四";
     age=56;
     System.out.println("初始化age");
     address="上海";
     name="张三";
     age=29;
     address="北京市";
     name="赵六";
     age=23;
     address="上海市";
   }
 }

可以看到,对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。本人以前一直对类初始化过程一直没有一个深刻的理解,就是搞不清到底是怎么初始化的,只能按照书上所说的记住了初始化顺序,但是过一段时间有给忘了,所以这次总算给弄清楚了,还是按照一个模型来解释初始化机制比较好啊,不用再背了,只有理解了才能不易忘

展开更多 50%)
分享

猜你喜欢

Java类变量和成员变量初始化过程的应用介绍

编程语言 网络编程
Java类变量和成员变量初始化过程的应用介绍

浅谈Java变量的初始化顺序详解

编程语言 网络编程
浅谈Java变量的初始化顺序详解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

深入理解final变量的初始化

编程语言 网络编程
深入理解final变量的初始化

关于初始化C++类成员

编程语言 网络编程
关于初始化C++类成员

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Linux内核初始化过程简要介绍

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Linux内核初始化过程简要介绍

初始化类对象

C语言教程 C语言函数
初始化类对象

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

基于request.getAttribute与request.getParameter的区别详解

基于request.getAttribute与request.getParameter的区别详解

QQ空间自定义导航操作方法

QQ空间自定义导航操作方法
下拉加载更多内容 ↓