Java之訪問子類對象的實例變量

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Julin1214/article/details/51488095

子類的方法可以訪問父類的實例變量,這是因爲子類繼承父類就會獲得父類的成員變量和方法。

父類的方法不能訪問子類的實例變量,父類無從知道它將被哪個子類繼承,它的子類將會增加怎樣的成員變量。

Java對象不是由構造器創建的,只是負責對Java對象實例變量執行初始化。在執行構造器之前,該對象所佔的內存已經被分配下來,這些內存裏的值默認是空值。基本數據類型的默認值爲0或false,引用類型的變量的默認值爲null。

下面我們用例子來說明:

<pre name="code" class="java"><span style="font-size:14px;">//父類
public class Base {


	private int i=2;
	public Base(){
		System.out.println("Base 構造器111:"+i);
		this.display();
		System.out.println("Base 構造器:"+i);
	}
	public void display() {
		System.out.println("Base"+i);
	}
}
//繼承Base的子類
public class Derived extends Base{


	private int i=22;
	
	public Derived() {
		// TODO Auto-generated constructor stub
		System.out.println("Derived構造器:"+i);
		i=222;
		System.out.println("Derivedfangfa:"+i);
	}
	public void display() {
		System.out.println("Derived方法:"+i);
	}
}
測試:
public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Derived(); //1
}
結果:
Base 構造器111:2
Derived方法:0
Base 構造器:2
Derived構造器:22
Derivedfangfa:222
運行該程序會發現輸出的值爲0,並不是2,22或222。</span>



運行該程序會發現輸出的值爲0,並不是2,22或222。
我們從內存分配的角度來分析程序的輸出結果。
1.當程序在創建Derived對象的時候,系統開始爲這個Derived對象分配內存空間。
Derived對象分配兩塊內存,分別用於存放Derived對象的兩個i實例變量,其中一個屬於Base類定義的I實例變量,另一個屬於Derived類定義的i實例變量,此時這兩個i實例的值都爲0;
程序在執行Derived類之前會隱式調用父類的構造器,(也就是咱們在父類構造器文章中提到過的三點調用父類哪個構造器的執行順序,不清楚者請移步《父類構造器》文章進行觀看)。
表面上看Base類的構造器內只有一行代碼
this.display(),
但是由於定義i實例變量時指定了初始值,編譯器經過處理後,其實應該包含兩行代碼
i=2;
this.display(); 
(構造器是進行初始化值的!!!)
當this在構造器中時,this代表正在初始化的對象。從源碼上看,此時的this位於Base()構造器內,但是這些代碼實際放在了Derived類中執行,是Derived構造器隱式調用了Base()構造器的代碼。
當變量的編譯時和運行時類型不同時,通過該變量訪問它引用的對象的實例變量時,該實例變量的值由聲明該變量的類型決定。但通過該變量調用它引用的對象的實例方法時,該方法行爲將由它實際所引用的對象來決定。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章