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

上一篇 / 下一篇  2012-04-12 11:18:40 / 个人分类:Java

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

  一、类的初始化51Testing软件测试网vA_/an

IX|:I7m0  对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。51Testing软件测试网9N,vrsy-w{)K` r,J

51Testing软件测试网Q-b0O@1c)]]}9l

  类的编译决定了类的初始化过程。51Testing软件测试网L$E$g&r[i,YH!L9sB

(~mN8i8SA&D%^`0  编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:51Testing软件测试网-bCuf5o-I4Lm

o9kE+p9cn kR7N0  1)先按照静态成员变量的定义顺序在类内部声明成员变量。51Testing软件测试网w j/Kl9]g3{

51Testing软件测试网FD/X:U4]

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

Q5Nq3~C*U051Testing软件测试网@0U mXnW5}#DYo

  一个java类和编译后的class对应的转换如下:51Testing软件测试网(],f @%RmV.R

+J|g!dSL;{%R(Rn0  源文件:

v6}(wyO ]D.] khR051Testing软件测试网v6{0^J?a Tg

51Testing软件测试网"\2J/L`/J.Y6i9e

  1. public class Person{  
  2. public static String name="张三";  
  3. public static int age;  
  4. static{  
  5.        age=20;  
  6. System.out.println("初始化age");  
  7. }  
  8. public static String address;  
  9. static{  
  10. address="北京市";  
  11. age=34;  
  12. }  
  13. public static void main(String[] args) {  
  14.                    System.out.println(name);  
  15.                    System.out.println(age);  
  16.                    System.out.println(address);  
  17.          }  
  18. }
51Testing软件测试网6W oT^&D9YI fk&X%s

51Testing软件测试网OxBvStO\}

51Testing软件测试网7_ B&I7U fq}r

  当java源代码转换成一个class文件后,其转换成类似下面的代码:51Testing软件测试网%i'p&tlg z:}#UO[

/wou5P }5w L0

j+~4]FLh0
  1. public class Person{  
  2. public static String name;  
  3. public static int age;  
  4. public static String address;  
  5. static{  
  6. name="张三";  
  7. age=20;  
  8. System.out.println("初始化age");  
  9. address="北京市";  
  10. age=34;  
  11. }  
  12. public static void main(String[] args) {  
  13.                    System.out.println(name);  
  14.                    System.out.println(age);  
  15.                    System.out.println(address);  
  16.          }  
  17. }

6SPyruah5L051Testing软件测试网3\!gZ*_ZAW2K)Iq O

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

$m6?l9{SkI},u ~8\0
二、对象的生成51Testing软件测试网Y0ccrU,v:N

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

&vW)c"cy"d9j+AC(}0

,D6gI1s-b;X*\Y:o0

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

r.` ];IY0

2d;IjiR"|yl6{ l051Testing软件测试网s w9b.A+k.D3_

  编译器转换成class文件后,会转换成类似下面的代码:51Testing软件测试网TB RH+T.mA,z.D

5m%Z.ns)D5u0

%l~kM e;F|Aj0
  1. public class Person{  
  2.  public String name;  
  3.  public int age;  
  4.  public String address;  
  5.  public Person(){  
  6.  name="李四";  
  7.  age=56;  
  8.  System.out.println("初始化age");  
  9.  address="上海";  
  10.  name="张三";  
  11.  age=29;  
  12.  address="北京市";  
  13.  name="赵六";  
  14.  age=23;  
  15.  address="上海市";  
  16.  }  
  17.  }

#D,aP ?0Dg)b0

SP,{jzh$` H:tC0

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

2~%u`DVi0

TAG:

 

评分:0

我来说两句

Open Toolbar