代码如下
package lecture2;
abstract class A{
private int x=100;
A(){
this.print();
}
public abstract void print();
}
class B extends A{
private int x=200;
B(int x){
this.x=x;
}
public void print() {
System.out.println("x="+x);
}
}
public class lecture2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
B b=new B(20);
b.print();
}
}
输出结果为:
x=0
x=2
为什么输出结果中第一行的x为0
子类要实例化必须先实例化父类 实例化父类的时候调用了 this.print(); this是子类 调用了子类的 print() 方法 此时x 还是默认值 0
你这个代码执行顺序是
B b = new B(20)这一句是这样的
1调用了B的构造函数
2调用了A的构造函数,
3初始化了A中的x是100
4this.print()这一句话调用的是B的print方法,因为这个时候B里面的x还没有被赋值,所以x是0,输出的是0,就是x=0
5B中的x被赋值为200
6B的构造函数里面的this.x = 20 B中的x值被改为了20
然后就是b.print()
输出x=20
似乎x=2更不好理解,怎么就输出20了呢