子类的方法可以访问父类的实例变量,这是因为子类继承父类,就会获得父类的成员变量和成员方法,父类的方法不能访问子类的实例变量,因为父类根本无法知道它将被哪一个子类所继承,但是在极端情况下可能出现父类访问子类的情况。
class Base{
//定义一个实例变量
private int i=2;
public Base(){
this.play();
}
public void play(){
System.out.println(i);
}
}
class Derived extends Base{
private int i=22;
public Derived() {
i=222;
// TODO Auto-generated constructor stub
}
public void play(){
System.out.println(i);
}
}
public class BianDemo{
public static void main(String[] args) {
new Derived();
}
}
此代码运行的结果为0,为了解释这个问题,首先要澄清一个概念,java对象是由构造器创建的吗?很多书籍或资料多会说是的,但是实际情况构造器只是负责对java对象实例变量进行初始化。在执行构造器代码之前,该对像所占内存已经被分配出来了,也就是说该对像的实例对象已经全都分配了内存空间了。
this.play();中我们指出当this在构造器中时,this代表正在初始化的java对象。此时的情况this位于Base类中但是这些代码其实是在Derived 类中执行的。