在core java 2书中有下面一段话:
调用构造器的具体处理步骤:
1、所有数据域被初始化为默认值。
2、按照在类声明中出现的次序依次执行所有域初始化语句和初始化块。
3、如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
4、执行这个构造器主体。可是从下面的代码输出结果看却与上面的有些矛盾 class A {
private int radius = 10;
public A()
{
draw();
}
public void draw()
{
}
}
class B extends A
{
private int radius = 1;
public B()
{
}
public void draw()
{
System.out.println(radius);
}
public static void main(String[] args)
{
B a = new B();
}
}输出的结果为:
0如果按上面的第二条和条三条的顺序来执行的话应该输出1才是啊, 因为在调用第二个构造器之前完成了 “按照在类声明中出现的次序依次执行所有域初始化语句和初始化块。”,那么这时的radius就是1了啊?大家怎么看呢?
调用构造器的具体处理步骤:
1、所有数据域被初始化为默认值。
2、按照在类声明中出现的次序依次执行所有域初始化语句和初始化块。
3、如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
4、执行这个构造器主体。可是从下面的代码输出结果看却与上面的有些矛盾 class A {
private int radius = 10;
public A()
{
draw();
}
public void draw()
{
}
}
class B extends A
{
private int radius = 1;
public B()
{
}
public void draw()
{
System.out.println(radius);
}
public static void main(String[] args)
{
B a = new B();
}
}输出的结果为:
0如果按上面的第二条和条三条的顺序来执行的话应该输出1才是啊, 因为在调用第二个构造器之前完成了 “按照在类声明中出现的次序依次执行所有域初始化语句和初始化块。”,那么这时的radius就是1了啊?大家怎么看呢?
基类的构造器先于子类的构造器被调用。
而在基类的构造器内部调用draw(); 根据多态行为,应该调用子类的draw()方法,就是System.out.println(radius);
但此时,由于子类的初始化工作还没进行。radius 也就没有被初始化成1。所以此时输出的是0
public B(){
super();
}
老师讲过的,呵呵……
ECLIPSE自动在private int radius; 里面加了个final,变成private final int radius
结果就成了1
越来越有趣了
class A {
private int radius = 10;
public A() //构造方法
{
draw();
}
public void draw()
{
}
}
class B extends A
{
private int radius = 1;
public B()
{
}
public void draw()
{
System.out.println(radius);
}
public static void main(String[] args)
{
B a = new B();
System.out.println(a.radius);
}
}
3、如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。 按照上面这两条规则,
如果先执行第二步的话,那么private int radius = 10; (这一句将被执行),然后再调用基类的构造函数.那么就是输出1啊