当子类继承父类时,子类会获得父类中定义的成员变量和方法。在权限允许的情况下,子类可以直接访问父类的成员变量和方法。笼统的说是这样的,但是Java中对继承成员变量和方法的处理是不同的。
//父类
public class Base {
private int i = 2;
public Base() {
this.display();
}
public void display() {
System.out.println("输出i:" + i);
}
}
//子类
public class Dervied extends Base {
private int i = 22;
public Dervied() {
this.i = 222;
}
public void display() {
System.out.println(i);
}
public static void main(String[] args) {
new Dervied();
}
}
此时的输出结果是多少呢? 22 还是 222 还是 其他什么? 答案( 0 )
分析: 我们在main方法中new了一个Dervied对象。JVM会为该对象分配内存空间。由于子类继承父类,所以在该对象中会存在2个实例变量i (默认值为0)。
然后会调用对应的无参构造方法。 我们知道,对象初始化过程如下:
1.调用父类的非静态代码块(如果有的话,此处没有)
2.调用父类的构造方法。
3.调用子类的非静态代码块(如果有的话,此处没有)
4.调用子类的构造方法。
通过上述初始化过程我们此处可以得知,
1。先给该对象的所有成员变量分配内存空间(每个成员变量都有默认值 0 |false |null .。。。)
2.调用父类的构造方法(此处为无参构造方法)
3.由于在父类中调用了this.display()。 (此处的this 是指什么?)
结论(在构造方法中的this指的是:this所在的构造方法的变量 )
由于是调用子类的构造方法导致的父类的构造方法被调用,所以此处的this指的是Derived的实例变量(!!!)
4.由于this指向的是子类的实例变量,所以调用的display方法也是被子类重写过的方法
由于此刻子类中的i变量值还没有被初始化,所以子类的display输出结果是 0 而不是22 或222
如果在父类构造方法中加入一句话 system.out.println(this.getClass());
输出结果应该为什么呢 ?
答案是: class extend.Dervied
由此可见上述分析是正确的
参考资料:疯狂Java