1、局部变量初始化:对于方法的局部变量,java以编译时错误的形式来保证局部变量的初始化。
2、成员变量:基本数据类型会被自动初始化为0,布尔类型被初始化为false,对象的引用被初始化为null。
3、静态数据的初始化:以下代码演示静态存储区域是何时初始化的。
- package test_2012_10.Static;
- import test_2012_10.Utils.Print;
- class Bowl{
- Bowl(int marker){
- Print.print("Bowl(" + marker + ")");
- }
- void f1(int marker){
- Print.print("f1(" + marker + ")");
- }
- }
- class Table{
- static Bowl bowl1 = new Bowl(1);
- Table(){
- Print.print("Table()");
- bowl2.f1(1);
- }
- void f2(int marker){
- Print.print("f2(" + marker + ")");
- }
- static Bowl bowl2 = new Bowl(2);
- }
- class CupBoard{
- Bowl bowl3 = new Bowl(3);//类的成员变量(在执行构造方法前初始化)
- static Bowl bowl4 = new Bowl(4);
- CupBoard(){
- Print.print("CupBoard()");
- bowl4.f1(2);
- }
- void f3(int marker){
- Print.print("f3(" + marker + ")");
- }
- static Bowl bowl5 = new Bowl(5);
- }
- public class Static_Test {
- public static void main(String[] args) {
- Print.print("Creating new CupBoard() in main");
- new CupBoard();
- Print.print("Creating new CupBoard() in main");
- new CupBoard();
- table.f2(1);
- cupBoard.f3(1);
- }
- static Table table = new Table();//首先会初始化静态域
- static CupBoard cupBoard = new CupBoard();
- }
- 结果如下:
- owl(1)
- Bowl(2)
- Table()
- f1(1)
- Bowl(4)
- Bowl(5)
- Bowl(3)
- CupBoard()
- f1(2)
- Creating new CupBoard() in main
- Bowl(3)
- CupBoard()
- f1(2)
- Creating new CupBoard() in main
- Bowl(3)
- CupBoard()
- f1(2)
- f2(1)
- f3(1)
总结一下对象创建的过程,假设有个名为Dog的类
1、即使没有显式的使用static关键字,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象时(构造器可以看成是静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。
2、然后载入Dog.class,有关静态初始化的所有操作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
3、当用new Dog()创建对象的时候,首先在堆上为Dog对象分配足够的存储空间。
4、这块存储空间会被清零,这就自动的将Dog对象中所有基本数据类型都设置成了默认值(对于数字来说是0,对于布尔和字符型也相同),而引用则被设置成null。
5、执行所有出现于字段定义处的初始化动作。
6、执行构造器,这可能会牵扯很多动作,尤其是涉及到继承。