繼承進一步使用,以及super關鍵字

2021-09-08 18:20:55 字數 3880 閱讀 1907

目標:

1)掌握子類物件例項化過程

2)掌握方法覆蓋概念和實現。

3)掌握super關鍵字的作用。

子類物件在例項化之前,必須先呼叫父類中的構造方法,再呼叫子類中的構造方法。

};執行結果:

父類person中的構造。

子類student中的構造。

姓名:張三,年齡:30,學校:清華大學

在生活中也很好理解,沒有父親就沒有孩子。

實際上,對於子類的構造方法中,隱含了乙個「super()」的語句。有時候,也將父類稱為超類,所以呼叫父類構造方法,用super()

super關鍵字必須寫在構造方法的首行。

方法覆寫就是指:子類中定義了與父類中同名的方法。

1)但是在方法覆寫時必須考慮訪問許可權,即:被子類覆寫的方法,不能擁有比父類更嚴格的訪問許可權。

2)所以,如果在父類中使用public定義的方法,子類的訪問許可權必須是public,否則無法編譯。

3)private

class person

};class student extends person

};public

class

overridedemo01

};執行結果:

student-->void print()。

訪問許可權:

private:最小的訪問許可權。

default:什麼都不寫,例如:string name;

public:最大的訪問許可權。

以下是訪問許可權出問題的錯誤操作。

package

methoud;

class person

};class student extends person

};public

class

thisdemo06

};

由於子類的訪問許可權default小於public,所以編譯通過不了。

從之前正確操作可以看出,如果子類將父類的方法覆寫了,呼叫的時候,肯定是呼叫被覆寫過的方法,那麼如果非要呼叫父類的方法。

通過「super」關鍵字可以完成功能,super關鍵字可以從子類訪問父類的內容。

如果要訪問被覆寫過的方法的方法:super.方法();

例如:

class person

};class student extends person

};public

class

overridedemo03

};執行結果:

person --> void print()。

student --> void print()。

如果要使用「super」不一定非要在方法覆寫之後使用,也可以明確表示某個方法是從父類中繼承而來的。

使用super只是更加明確的說直接從父類中尋找,就不從子類找了。因為沒有super呼叫方法,首先從子類尋找,如果子類沒有才到父類尋找。

例如:如果上面那個例子中super.print()把super去掉,就會造成無限期迴圈遞迴,自己呼叫自己。

如果父類中使用private關鍵字宣告乙個方法,那麼在子類中使用default許可權算是擴大許可權,覆寫嗎?

答案是:no,不算覆寫。

正常覆寫:

class person

public

void fun()

};class student extends person

};public

class

overridedemo04

};執行結果:

student --> void print()。

這裡因為正常覆寫,所以直接呼叫了子類中的覆寫方法。

錯誤的覆寫:

package

methoud;

class person

public

void fun()

};class student extends person

};public

class

thisdemo06

};執行結果:

person-->void print();

可見,這裡並沒有呼叫子類中的「覆寫」方法,而是呼叫父類中預設的方法。說明這裡並沒有達到覆寫的作用,子類中的方法其實是另外定義了乙個方法。

這點需要注意!

覆蓋,就是指子類中宣告了父類中同名的屬性。

class person;

class student extends person

};public

class

overridedemo05

};

可見,要使用被覆蓋的父類中的屬性,需要使用super關鍵字。

super表示的是從子類呼叫父類中的指定操作。例如呼叫屬性,方法,構造等等。

因為在子類例項化的時候,會預設呼叫父類中的無引數構造方法(「super()」)。如果想呼叫有參構造方法,則必須在子類中明確宣告。

class person

public

void

setname(string name)

public

void setage(int

age)

public

string getname()

public

intgetage()

public

string getinfo()

};class student extends person

public

void

setschool(string school)

public

string getschool()

public

string getinfo()

};public

class

superdemo01

};

不管任何時候,子類例項化的時候,永遠要先去呼叫父類中的構造方法,預設呼叫的是無參構造方法。

1)對於this和super本身都可以呼叫構造方法,而且呼叫的時候都必須放在構造方法的首行。所以這兩個方法肯定不能同時出現。

進一步了解this和super

問 例項一 輸出為child grandfather child father 從示例1可以知道 this總是指向呼叫該方法的物件,而super總是用於呼叫處方法所處的類的直接父類 例項二 而例項二中 輸出為child father 僅僅是將父類print改為private讓子類無法覆寫,為何子類物...

繼承的進一步研究

本章目標 掌握子類物件的例項化過程 掌握方法覆寫的概念及實現 掌握super關鍵字的作用 子類物件例項化過程 在繼承的操作中,對於子類物件的例項化也是有要求的 子類物件在例項化之前必須首先呼叫父類中的構造方法之後再呼叫子類自己的構造方法 觀察子類物件的例項化過程 class person publi...

進一步使用c

1.簡單程式結構 程式是由函式構成。任何程式都是從main函式開始執行 除個別情況 函式由函式頭和函式體構成。函式頭由函式返回值資料型別,函式名,傳入函式資訊組成。函式體由一系列語句和宣告組成。函式名後的圓括號可識別函式。圓括號裡面可以為空,也可以有引數。變數的宣告內容為,變數資料型別和變數名。函式...