java 型別轉換與編譯錯誤,執行時錯誤

2021-08-27 19:01:53 字數 1197 閱讀 4516

在特定的情況下,我們可以把子類轉換成父類的「例項」,這就是向上轉型;相反,我們也可以把父類轉換成子類的「例項」,這就是向下轉型。向上轉型是安全的,向下轉型則不然。

假設我們有三個類:bird,parrot,swallow,後兩個類繼承了bird類。

向上轉型

class bird 

public void eat() }

class parrot extends bird

public void say() }

class swallow extends bird

public void sleep() }

public class main

public void upcast() }

結果為:

bird.fly()

parrot.say()

parrot.eat()

bird.fly()

parrot.eat()

bird類有乙個fly方法,子類parrot和swallow都可以使用它;bird有乙個eat方法,子類parrot和swallow覆蓋了整個方法;子類parrot增加了乙個say方法,子類swallow增加了乙個sleep方法。

我們使用bird b = p這個語句將p轉型為bird的乙個例項。然後,當呼叫b.fly()時,實際上呼叫的仍然是bird的fly()方法;但是當呼叫b.eat時,實際上呼叫的parrot的方法eat方法,而不是bird的eat方法。另外,當p轉型為bird後,由於bird沒有say方法,那麼b.say方法不可用。

向下轉型

public class main2 

public void downcast()

public void downcasterror()

}

第一種轉型方法之所以能夠順利進行,是因為bird b本來就是乙個parrot例項,我們把它轉回去,當然不會出錯。

混合轉型

public class main3 

public void multcast()

}

如果我們直接使用s = (swallow)p進行轉型,那麼在編譯時就會產生錯誤。但是如果先把乙個parrot的例項轉換成bird,然後再把bird轉換成swallow,執行時將會出現錯誤。

感謝金絲燕大學校長

glibc與MSVC CRT,crt編譯錯誤及解決

http book.51cto.com 2009 04 22 15 29 俞甲子 石凡 潘愛民 電子工業出版社 11.2.3 glibc與msvc crt 4 當你在程式裡包含了某個c 標準庫的標頭檔案時,msvc編譯器就認為該源 檔案是乙個c 源 程式,它會在編譯時根據編譯選項,在目標檔案 的 d...

繼承與多型的使用 編譯錯誤和執行錯誤的分析

為了準備學校期中考試,特意複習了繼承與多型各種情況的分析 在instantiate乙個物體 object 時,分別有兩種型別需要注意 actual type 這個object的實際型別,也可以叫做static type 這個型別是在 編譯期間用到的 dynamic type 這個型別是 在run t...

C 與namespace有關的兩個編譯錯誤的講解

某次,在大型的工程 中,我這樣呼叫 include using namespace std namespace a namespace b int main 編譯出錯 error fun was not declared in this scope,查了一下,原來是名空間在搗鬼。另外,名空間中的函式...