package test;
public class Sub extends Super {
int j = 30;
Sub() {
print();
j = 40;
}
void print() {
System.out.print(j);
}
public static void main(String[] args) {
System.out.print(new Sub().j);
}
}
class Super {
int i = 10;
Super() {
print();
i = 20;
}
void print() {
System.out.print(i);
}
}
public class Sub extends Super {
int j = 30;
Sub() {
print();
j = 40;
}
void print() {
System.out.print(j);
}
public static void main(String[] args) {
System.out.print(new Sub().j);
}
}
class Super {
int i = 10;
Super() {
print();
i = 20;
}
void print() {
System.out.print(i);
}
}
System.out.print(new Sub().j);
先执行 new Sub()。
先声明成员变量 int j = 30;
到了构造方法。
Sub() {
super();//默认会加这一条语句。所以先执行父类构造方法。
print();
j = 40;
}
父类构造方法。
Super() {
print();//由于没执行 i 的 赋值,直接执行构造方法。打印出 i 的默认值 0
i = 20;//最后父类 i = 20;
}跳回到子类。
print();打印出 j 的初始值 30
j = 40;
然后回到main 函数 打印出40结果 03040
int j = 30;//(2) Sub() {
//super(); //(3)
print();//(6)
j = 40;//(8)
} void print() {
System.out.print(j);//(7)这时j=30,//(10)此时j=40
} public static void main(String[] args) {
System.out.print(new Sub().j);//(1)先执行new Sub(),(9)打印new Sub().j
}
}class Super {
int i = 10; Super() {
print();//(4)
i = 20;
} void print() {
System.out.print(i);//(5)此时i没有赋值,为默认值0
}
}
2 父类的print方法被子类覆写了,跳到父类的构造方法时,执行的是子类被覆写的print()方法。
3 第一个输出是把j(=0)输出了。
4 父类构造方法执行完后,回到子类,这时先给变量j显示赋值(j=30).
5 子类构造方法执行,输出30。
6 最后40好理解。楼主可以把父类构造方法直接输出一个字符串,比如 System.out.println("Hello"); 可以看到根本不执行。
抱歉,上面这句话不对, 是在父类的print()方法里,加上一句。(不是在构造方法里。)
那就是赋值的执行过程是这样的?
int j;//声明
Sub() {
super();
j=30;//赋值
print();
j = 40;
}
这部分还是要好好研究下。总算定型了,要么那个大神再来讲解下。
还有那个super();覆盖问题是不是可以理解为直接把父类那段构造方法直接复制下来。比如
int j;//声明
Sub() {
print();
i = 20;//父类构造方法。
j=30;//赋值
print();
j = 40;
}
如果是这样就好理解多了。
有很多模板方法设计模式是在类里面调用的abstract方法, 而这些方法全是由子类实现的.
为什么在第3步说j=0?
参考一下上面网址.
Sub() {
super();
j=30;//赋值
print();
j = 40;
}
这个应该是对的