1、局部变量初始化:对于方法的局部变量,java以编译时错误的形式来保证局部变量的初始化。

2、成员变量:基本数据类型会被自动初始化为0,布尔类型被初始化为false,对象的引用被初始化为null。

3、静态数据的初始化:以下代码演示静态存储区域是何时初始化的。

 

  1. package test_2012_10.Static;  
  2.  
  3. import test_2012_10.Utils.Print;  
  4.  
  5.  
  6. class Bowl{  
  7.     Bowl(int marker){  
  8.         Print.print("Bowl(" + marker + ")");  
  9.     }  
  10.     void f1(int marker){  
  11.         Print.print("f1(" + marker + ")");  
  12.     }  
  13. }  
  14.  
  15. class Table{  
  16.     static Bowl bowl1 = new Bowl(1);  
  17.     Table(){  
  18.         Print.print("Table()");  
  19.         bowl2.f1(1);  
  20.     }  
  21.     void f2(int marker){  
  22.         Print.print("f2(" + marker + ")");  
  23.     }  
  24.     static Bowl bowl2 = new Bowl(2);  
  25. }  
  26.  
  27. class CupBoard{  
  28.     Bowl bowl3 = new Bowl(3);//类的成员变量(在执行构造方法前初始化)  
  29.     static Bowl bowl4 = new Bowl(4);  
  30.     CupBoard(){  
  31.         Print.print("CupBoard()");  
  32.         bowl4.f1(2);  
  33.     }  
  34.     void f3(int marker){  
  35.         Print.print("f3(" + marker + ")");  
  36.     }  
  37.     static Bowl bowl5 = new Bowl(5);  
  38. }  
  39.  
  40. public class Static_Test {  
  41.       
  42.     public static void main(String[] args) {  
  43.         Print.print("Creating new CupBoard() in main");  
  44.         new CupBoard();  
  45.         Print.print("Creating new CupBoard() in main");  
  46.         new CupBoard();  
  47.         table.f2(1);  
  48.         cupBoard.f3(1);  
  49.           
  50.     }  
  51.     static Table table = new Table();//首先会初始化静态域  
  52.     static CupBoard cupBoard = new CupBoard();  
  53.  
  54. }  
  55. 结果如下:  
  56. owl(1)  
  57. Bowl(2)  
  58. Table()  
  59. f1(1)  
  60. Bowl(4)  
  61. Bowl(5)  
  62. Bowl(3)  
  63. CupBoard()  
  64. f1(2)  
  65. Creating new CupBoard() in main  
  66. Bowl(3)  
  67. CupBoard()  
  68. f1(2)  
  69. Creating new CupBoard() in main  
  70. Bowl(3)  
  71. CupBoard()  
  72. f1(2)  
  73. f2(1)  
  74. f3(1

总结一下对象创建的过程,假设有个名为Dog的类

1、即使没有显式的使用static关键字,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象时(构造器可以看成是静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。

2、然后载入Dog.class,有关静态初始化的所有操作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。

3、当用new Dog()创建对象的时候,首先在堆上为Dog对象分配足够的存储空间。

4、这块存储空间会被清零,这就自动的将Dog对象中所有基本数据类型都设置成了默认值(对于数字来说是0,对于布尔和字符型也相同),而引用则被设置成null。

5、执行所有出现于字段定义处的初始化动作。

6、执行构造器,这可能会牵扯很多动作,尤其是涉及到继承。