当前位置: 技术问答>java相关
Thinking in Java 的一个例子,请高手给讲解一下
来源: 互联网 发布时间:2015-11-06
本文导语: class Bowl { Bowl(int marker) { System.out.println("Bowl("+marker+")"); } void f(int marker) { System.out.println("f("+marker+")"); } }; class Table { static Bowl b1=new Bowl(1); Table() { System.out.println("Table()"); b2.f(1); } void f2(int marker) { ...
class Bowl
{
Bowl(int marker)
{
System.out.println("Bowl("+marker+")");
}
void f(int marker)
{
System.out.println("f("+marker+")");
}
};
class Table
{
static Bowl b1=new Bowl(1);
Table()
{
System.out.println("Table()");
b2.f(1);
}
void f2(int marker)
{
System.out.println("f2("+marker+")");
}
static Bowl b2=new Bowl(2);
};
class Cupboard
{
Bowl b3=new Bowl(3);
static Bowl b4=new Bowl(4);
Cupboard()
{
System.out.println("Cupboard()");
b4.f(2);
}
void f3(int marker)
{
System.out.println("f3("+marker+")");
}
static Bowl b5=new Bowl(5);
};
public class StaticInitialization
{
public static void main(String[] args)
{
System.out.println("Creating new Cupboard() in main");
new Cupboard();
System.out.println("Creating new Cupboard() in main");
new Cupboard();
t2.f2(1);
t3.f3(1);
}
static Table t2=new Table();
static Cupboard t3=new Cupboard();
};
以上的例子输出结果如下:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
对以上的结果不是很理解,为什么不首先是Creating new Cupboard() in main
请各位指教,谢谢
{
Bowl(int marker)
{
System.out.println("Bowl("+marker+")");
}
void f(int marker)
{
System.out.println("f("+marker+")");
}
};
class Table
{
static Bowl b1=new Bowl(1);
Table()
{
System.out.println("Table()");
b2.f(1);
}
void f2(int marker)
{
System.out.println("f2("+marker+")");
}
static Bowl b2=new Bowl(2);
};
class Cupboard
{
Bowl b3=new Bowl(3);
static Bowl b4=new Bowl(4);
Cupboard()
{
System.out.println("Cupboard()");
b4.f(2);
}
void f3(int marker)
{
System.out.println("f3("+marker+")");
}
static Bowl b5=new Bowl(5);
};
public class StaticInitialization
{
public static void main(String[] args)
{
System.out.println("Creating new Cupboard() in main");
new Cupboard();
System.out.println("Creating new Cupboard() in main");
new Cupboard();
t2.f2(1);
t3.f3(1);
}
static Table t2=new Table();
static Cupboard t3=new Cupboard();
};
以上的例子输出结果如下:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
对以上的结果不是很理解,为什么不首先是Creating new Cupboard() in main
请各位指教,谢谢
|
当某个class被java编译器装载(即遇到new或调用其静态成员)时,其初始化如下:
有父类时-->装载父类-->初始化父类所有static成员(对象与数据成员)-->初始化子类所有static成员-->产生对象-->初始化父类所有non-static成员-->调用父类构造函数-->初始化子类所有non-static成员-->调用子类构造函数
无父类时-->初始化所有static成员-->产生对象-->初始化所有non-static成员-->调用构造函数
有父类时-->装载父类-->初始化父类所有static成员(对象与数据成员)-->初始化子类所有static成员-->产生对象-->初始化父类所有non-static成员-->调用父类构造函数-->初始化子类所有non-static成员-->调用子类构造函数
无父类时-->初始化所有static成员-->产生对象-->初始化所有non-static成员-->调用构造函数
|
首先初始化static对象,
也就是说static Table t2=new Table();先被初始化
然后是Table类中的static对象(static Bowl b1=new Bowl(1);)
再调用Bowl构建器
也就是说static Table t2=new Table();先被初始化
然后是Table类中的static对象(static Bowl b1=new Bowl(1);)
再调用Bowl构建器
|
呵呵,你看是很认真的啊!要彻底了解JAVA的编译机制是要花一番工夫的!
这里的初始化我也看过了,首先初始化所有static对象,如果有继承,就先构造父类,然后子类,最后是构造MAIN中的对象
这里的初始化我也看过了,首先初始化所有static对象,如果有继承,就先构造父类,然后子类,最后是构造MAIN中的对象