建構函式是特殊的。
他們不是成熟的oo成員,所以他們不是繼承的。
如果乙個子類
覆蓋了超類中的
乙個方法或變數 - 如果子類實現了乙個具有相同名稱的成員,換句話說 -
隱藏超類的成員。
為了準確,覆蓋乙個變數隱藏它,並且覆蓋乙個方法只是覆蓋它,但效果是一樣的:覆蓋的成員基本上是隱藏的。
您仍然可以使用
super
關鍵字
來獲取超類的成員:1
super.hiddenmembername
在這種情況下adult
,所有它繼承的是在object
(tostring()
例如)
上的方法
。因此,以下**段完全可以接受:1
2adult anadult = new adult();
anadult.tostring();
該tostring()
方法不是明確存在的adult
,而是adult
繼承它。
這裡有一些「陷阱」,你應該記住。
首先,在乙個子類中給變數和方法與該類的超類中的變數和方法相同的名稱很容易,然後在不能呼叫繼承的方法時變得困惑。
記住,當乙個方法與乙個已經存在於乙個超類中的子類中具有相同的名稱時,你已經隱藏了它。
其次,建構函式不是繼承的,
而是被呼叫。
在您編寫的任何子類建構函式中,對超類建構函式進行隱式呼叫,這是子類建構函式的第一件事。
你必須這樣生活
沒有什麼可以改變它。
例如,我們的
adult
建構函式實際上在執行時看起來像這樣,即使我們沒有在body中輸入任何東西: 123
public adult()
建構函式體中的這一行呼叫超類的無引數建構函式。
在這種情況下,這是建構函式
object
。
假設我們有另乙個類叫做baby
。
看起來像這樣:1 23
4567
89
1011
1213
1415
16public class baby
public void move()
public void talk()
}
我們adult
和baby
班級看起來很相似。
事實上,它們幾乎相同。
這種**重複使維護**比它需要更痛苦。
我們可以建立乙個超類,將所有常見元素移動到該類,並刪除**重複。
我們的超類可以被呼叫
person
,它可能是這樣的: 123
4567
89
1011
1213
1415
public class person
public void move()
public void talk()
}
現在我們可以擁有adult
和baby
子類person
,這使得這兩個類目前很簡單: 123
4567
8public class adult
}
public class baby
}
我們有乙個層次結構,我們可以將每個子類的例項引用為層次結構中任何乙個超類的例項。
例如:123
45
adult anadult = new adult();
system.out.println("anadult is an object: " + (adult instanceof object));
system.out.println("anadult is a person: " + (adult instanceof person));
system.out.println("anadult is anadult: " + (adult instanceof adult));
system.out.println("anadult is a baby: " + (adult instanceof baby));
這個**將給我們三個true
結果和乙個false
結果。
您還可以將物件投射到其層次結構中的任何型別,如下所示:1 23
adult anadult = new adult();
person aperson = (person) anadult;
aperson.move();
這段**將會編譯沒有問題。
我們可以轉換乙個
adult
型別person
,然後呼叫它的person
方法。
因為我們有這個層次結構,我們的子類的**更簡單。
但是你在這裡看到乙個問題嗎?
現在所有
adult
的人和所有人baby
(藉口不好的複數)會以同樣的方式說話和移動。
每個行為只有乙個實現。
這不是我們想要的,因為成年人不會像嬰兒一樣說話或移動。
我們可以覆蓋
move()
和talk()
子類,但是我們在我們的超類中定義了基本上無用的「標準」行為。
我們真正想要的是強制我們每個子類以自己的特定方式移動和談話的一種方式。
這就是抽象類。
程式設計題 中級 單詞倒排
程式設計題 中級 單詞倒排 對字串中的所有單詞進行倒排。說明 1 每個單詞是以26個大寫或小寫英文本母構成 2 非構成單詞的字元均視為單詞間隔符 3 要求倒排後的單詞間隔符以乙個空格表示 如果原字串中相鄰單詞間有多個間隔符時,倒排轉換後也只允許出現乙個空格間隔符 4 每個單詞最長20個字母 輸入描述...
華為oj中級 201301 JAVA 題目2 3級
描述 請編寫乙個函式 允許增加子函式 計算n x m的棋盤格仔 n為橫向的格仔數,m為豎向的格仔數 沿著各自邊緣線從左上角走到右下角,總共有多少種走法,要求不能走回頭路,即 只能往右和往下走,不能往左和往上走。知識點 字串,迴圈,函式,指標,列舉,位運算,結構體,聯合體,檔案操作,遞迴 執行時間限制...
Java中級之執行緒池原始碼剖析
引用必須註明出處!執行緒池伴隨著執行緒的產生而產生,主要用於執行緒復用,減少記憶體洩露。執行緒池中使用thread作為執行體,使用runnable介面作為執行者,乙個個執行者以任務的方式在執行體裡完成。任務以下指乙個實現runnable介面的worker物件,任務放在thread中被執行 原理 co...