父類與子類引用的問題

2021-08-29 08:59:22 字數 758 閱讀 4263

class a

public void func2()

}class b extend a

public void func3()

}class c

public void calla(a a)

}編譯器能夠自動將類b的例項物件b直接賦值給a類的引用變數,也就是子類能夠自動轉換成父類型別。另外,程式可以直接建立乙個類b的例項物件,傳遞給需要 類a的例項物件作引數的calla()方法,在引數傳遞的過程中發生了隱式自動型別轉換。子類能夠自動轉換成父類的道理非常容易理解。

2、父類轉換成子類

如果知道calla方法中傳遞的引數a實際上就是子類b的乙個引用物件,想在calla方法中呼叫子類的特有方法,如何做:

public void calla(a a)

編譯有問題,因為對編譯器來說,它只分析程式語法,它只知道變數a的引用型別是類a,而類a又沒有func3這個方法,所以編譯不通過。**改為:

public void calla(a a)

編譯還是有問題,因為編譯器是不能將父類物件自動轉換成子類的。

public void calla(a a)

-instanceof 操作符-

可以用instanceof判斷是否乙個類實現了某個介面,也可以用它來判斷乙個例項物件是否屬於乙個類

public void calla(a a) else

}只要記住:乙個男人肯定也是人,乙個人卻不一定是男人的道理,就非常容易理解父類和子類之間的轉換關係了。

父類引用子類物件

父類引用子類物件 package test class fruit1 string get1 父類引用子類物件 如果父類的方法可以被重寫 靜態方法不能被重寫,因為它是隨著類的建立而存在於記憶體,只有乙份 並且已經重寫,那麼呼叫的是子類的方法 反之,則呼叫父類裡的方法 public class fru...

父類引用轉化為子類引用

物件引用實際上就是乙個指標,父類的引用可以指向乙個子類例項的。但是這個引用是不能呼叫子類擴充套件的方法的。比如 class a void f class b extends a void f1 a a new b a.f1 編譯不通過,因為物件a是沒有f1 方法的。b a.f1 編譯時可以通過的,因...

子類與父類,

public class a public virtual void testm2 public class b a public new void testm2 很多時候子類override是為了基類使用時可以有靈活的構造配置,多型 使用方總是基類物件所以如果子類有它自己的成員 包括new的成員函...