Java类变量和成员变量初始化过程

 

昨天看了一本叫做《突破程序员基本功的16课》的书,个人感觉还可以,主要对Java的技巧进行了一些深入的讲解,让我对类的初始化和对象的创建有了新的认识。

 

一、类的初始化

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

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

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

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

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

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

源文件:

复制代码
publicclass Person{
  publicstatic String name="张三";
  publicstaticint age;
  static{
age=20;
    System.out.println("初始化age");
  }
  publicstatic String address;
  static{
    address="北京市";
    age=34;
  }
  publicstaticvoid main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}
复制代码

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

复制代码
publicclass Person{
  publicstatic String name;
  publicstaticint age;
  publicstatic String address;
  static{
    name="张三";
    age=20;
    System.out.println("初始化age");
    address="北京市";
    age=34;
  }
  publicstaticvoid main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}
复制代码

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

 

二、对象的生成

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

复制代码
 1publicclass Person{
 2   {
 3     name="李四";
 4     age=56;
 5     System.out.println("初始化age");
 6     address="上海";
 7   }
 8   public String name="张三";
 9   publicint age=29;
10   public String address="北京市";
11   public Person(){
12     name="赵六";
13     age=23;
14     address="上海市";
15   }
16 }
复制代码



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

复制代码
 1publicclass Person{
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信