子類的方法可以訪問父類的實(shí)例變量,這是因?yàn)樽宇惱^承父類商乎,就會(huì)獲得父類的成員變量和成員方法,父類的方法不能訪問子類的實(shí)例變量鲜戒,因?yàn)楦割惛緹o法知道它將被哪一個(gè)子類所繼承抹凳,但是在極端情況下可能出現(xiàn)父類訪問子類的情況。
class Base{
//定義一個(gè)實(shí)例變量
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();
}
}
此代碼運(yùn)行的結(jié)果為0失都,為了解釋這個(gè)問題颖系,首先要澄清一個(gè)概念,java對象是由構(gòu)造器創(chuàng)建的嗎信粮?很多書籍或資料多會(huì)說是的趁啸,但是實(shí)際情況構(gòu)造器只是負(fù)責(zé)對java對象實(shí)例變量進(jìn)行初始化。在執(zhí)行構(gòu)造器代碼之前旅掂,該對像所占內(nèi)存已經(jīng)被分配出來了访娶,也就是說該對像的實(shí)例對象已經(jīng)全都分配了內(nèi)存空間了。
this.play();中我們指出當(dāng)this在構(gòu)造器中時(shí),this代表正在初始化的java對象典勇。此時(shí)的情況this位于Base類中但是這些代碼其實(shí)是在Derived 類中執(zhí)行的叮趴。