class Cat extends Super{
int j=30;
Cat(){
print();
j=40;
}
void print(){
System.out.println(j);
}
public static void main(String[] args) {
System.out.println(new Cat().j);
}
}
class Super{
int i=10;
Super(){
print();
i=20;
}
void print(){
System.out.println(i);
}
}
执行过程 麻烦帮我分析一下 为啥是
0
30
40
------解决方案--------------------
------解决方案--------------------
囧、、参考2楼、。一楼前一部分说的是错误的!
------解决方案--------------------
因为在new Cat()的时候,先调用执行其父类的初始话工作,这个时候子类的属性都还未初始话,所以都是默认值(类的属性都会有默认值的,int类型数据的默认值为0),所以这个时候调用print方法的时候打印出来的是j的默认值0,父类初始化结束后,在初始化子类,这个时候j的值就是30了,所以调用print方法的时候打的是30
------解决方案--------------------
"调用父类构造方法是,调用的是print是子类重写过的方法,打印的是j的值,并不是i的值"
收益了!
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
LZ,听理论的可能还不大清楚,不过你用sysout一步步的调试,看看执行顺序一目了然。
- Java code
public class FileTest extends Super{ int j=30; FileTest(){ //第六,父类的构造方法运行结束,开始运行子类的构造方法,此时J为30,调用print()方法打印j=30 print(); //第七,设置j为40,此时J=40,main方法中打印new FileTest().j为40,程序结束 j=40; } void print(){ //第四,因为子类重写了父类的方法,所以先进这里,而j这个变量在父类中还是空值,因为J是int所以为0 System.out.println("子类:"+j); } public static void main(String[] args) { //第一,创建子类实例,进入父类构造方法 System.out.println(new FileTest().j); }}class Super{ int i=10; Super(){ //第二,进入父类构造方法 //第三,进入print()方法,如果子类重写了改方法那么就要进入子类的重写方法中,父类中该方法不会执行 print(); //第五,设置i的值 i=20; } void print(){ System.out.println("父类:"+i); }}