高手请进:类中奇怪的大括号 和 类实例初始化顺序?
我找到个有趣的例子,自己改了改
有两个问题百思不得其解,高手指点
public class Base {
int i = 10;
{
System.out.println( "Base: "+i);
//问题1:这是什么用法???,i需要在{}之前定义,否则出错,上句什么时候执行?
}
Base(int x){
f();
}
void f(){System.out.println( "Base f "+i);}
}
public class BSub extends Base{
int i = 30;
public BSub() {
super(1);//实际调用的方法f是子类的f
}
void f(){System.out.println( "BSub f "+i);}
//问题2:打印的i是0,这是子类还是父类的i?
//这里类实例化的顺序到底是怎样的??
public static void main(String[] args){
new BSub();
}
}
------解决方案--------------------问题2:打印的i是0,这是子类的i
这是覆盖,子类的方法覆盖父类的方法
------解决方案--------------------回biti509()
“请注意以下,父类的变量(显示赋值的)在其构造函数执行前已经就初始化了,怎么解释?”
这里之所以“搞”,就是因为子类构造函数中多了个super(),这个super()比较特殊,看似是经由子类的构造函数调用的,实则不完全是或者说不是,我那句犯了个错误,我想说明的一个顺序是 父类显式初始化-父类构造函数-子类显式初始化-子类构造函数,有下程序可证:
class Base
{
int i = 10;
{
System.out.println( "Base: " + i);
}
Base(int x)
{
System.out.println( "father 's constructor x= "+1);
f();
}
void f()
{
System.out.println( "Base f " + i);
}
}
public class Test extends Base
{
int i = 30;
{
System.out.println( "Test: " + i);
}
public Test()
{
super(1);
System.out.println( "son 's Test ");
}
void f()
{
System.out.println( "BSub f " + i);
}
public static void main(String[] args)
{
new Test();
}
}