public class T{
public static void main(String[] args){
C cc = new C();
}
}
class A{
int i = 55;
public A(){
show();
}
public void show(){
// System.out.println("A show()");
System.out.println(i);
}
}
class C extends A{
int i = 88;
public void show(){
// System.out.println("C show()");
// System.out.println(super.i);
System.out.println(this.i);
}
}
public static void main(String[] args){
C cc = new C();
}
}
class A{
int i = 55;
public A(){
show();
}
public void show(){
// System.out.println("A show()");
System.out.println(i);
}
}
class C extends A{
int i = 88;
public void show(){
// System.out.println("C show()");
// System.out.println(super.i);
System.out.println(this.i);
}
}
子类show();覆盖了父类A的 其执行过程中i=55;i=88;没有执行的机会,所以i是默认的0;
所以输出为0;
System.out.println(this.i);这里this没用 并不是this.i, i就是本类中定义的i了
调用public A()的时候是执行的父类中的show()还是执行的子类中的show() 好像不会执行父类中的
为什么执行的过程中就没有机会执行i呢 是不是存在子类中存在两个i 那系统到底应该调用哪一个呢 所以系统就不会调用这两个i了 而是选的默认值 这样想对不对
子类show();覆盖了父类A的 其执行过程中i=55;i=88;没有执行的机会,所以i是默认的0;
所以输出为0;
1)在其他任何事物发生前,将分配给各个对象的存储空间初始化为二进制的零~
2)调用基类构造器。此时,调用被覆盖的show()方法。由于1)的原因.i=0;
3)按照声明的顺序调用成员的初始化方法.-----thinking in java有详细说明的~建议楼主去看看~
父类初始化块---->父类构造方法---->子类初始化块---->子类构造父类A构造方法调用了被重载的show方法,此时走子类C的show(),而show使用了子类未初始化的i,所以是0
父类静态块---->子类静态块---->父类非静态块---->父类构造方法---->子类非静态块---->子类构造方法class A{
int i = 55;
{
System.out.println("noneStaticBlock A");
System.out.println(i);
}
static{
System.out.println("staticBlock A");
}
public A(){
show();
}
public void show(){
System.out.println(i);
}
}
class C extends A{
int i = 88;
{
System.out.println("noneStaticBlock C");
System.out.println(i);
}
static{
System.out.println("static C");
}
public void show(){
System.out.println(i);
}
}
public class Test{
public static void main(String args[]){
C c = new C();
}
}