繼承與多型

2021-08-08 13:30:21 字數 2388 閱讀 8363

構造器

構造器又稱建構函式和構造方法,用於構建當前類的物件的行為和初始化類的相關屬性。

其格式為 public 類名(){}

當你建立乙個類的時候會自動預設乙個構造方法,當你建立物件的時候,構造方法會自動呼叫。

例如 person p = new person();

前面的person p 為宣告物件類似於宣告變數,也可以說就是宣告變數,在這種時候構造方法是不會被呼叫的。必須要在建立物件,即

new person();在這個時候會呼叫構造方法。

另外有很多人認為構造方法是沒有返回值的,因為從**方面看

public 類名()是看不到返回型別的。但是並不是這樣,看不見並不代表沒有,就像建立類時預設的構造方法,我們雖然看不見的,但是卻是真正存在的。所以構造方法是有返回值的,只不過它的返回值是記憶體位址,是固定的。

說到記憶體位址,便說下記憶體。記憶體分為兩個部分,棧儲存區域,和堆儲存區域。前者是放變數引用,後者放物件實體。變數的的引用這裡是變數的名字,如person p;而物件實體是位址+真正的物件 (裡面包括屬性和方法)

說到這裡有乙個知識點叫做「引用傳遞」

引用就是變數名,引用傳遞指不同變數名儲存的位址的傳遞關係

舉乙個例子:
我們首先定義兩個物件

person p = new person();

person p1 = new person();

p.name = 「老王」;

p1.name = 「老張」;

p = p1;

p1.name = 「小王」;

system.out.println(p.name);

system.out.println(p1.name);

得出的結果為兩個都是小王

原因是定義第乙個物件的時候 把變數名p 存在棧儲存區域,其指向堆儲存區域的乙個位址,裡面存有name=「老王」,同理定義p1時,把p1存在棧儲存區域,其只想裡面存有老張的位址。執行到p=p1時,p不指向原來的位址,改為指向p1的位址,p1的位址改變了,所以p隨p1一起發生了變化。

位址 真正的物件

位址 public string name;老王

位址 public string name;

老張(小王)

變數名

person p

person p1

方法過載

方法過載就是在同乙個類中,如果方法名相同,但是其引數型別、引數順序、引數個數不同的方法互為方法過載。

例如: public void study(){}

public void study(int a){}

public void study (string a){}

public void study (string a,int b){}

public void study (int a,string b){}

除此之外 構造方法也可以過載

繼承體系

繼承是指子類繼承父類未私有的所有方法和屬性

其中用到關鍵字 extends

格式為 class 子類名 extends class 父類名 {}

繼承只允許乙個子類擁有乙個父類,但是乙個父類可以擁有很多子類。而且可以有層次繼承,如c繼承b,b繼承a,都是可以的。如果有很多類時,並且其有共同點,就可以用到繼承來實現。

如果乙個子類不想用父類的某個方法,這裡可以用到方法重寫。方法重寫必須是在繼承的條件下才可以實現的。重寫的方法與從父類繼承的方法的名稱 型別完全一致。有規定說同乙個類中不可以出現兩個名稱 型別相同的方法,但是重寫時可以。因為重寫的方法會覆蓋掉父類的方法。在這裡會有乙個自動轉型的知識點,自動轉型就是子類的型別自動轉化為父類的型別。例如:

father是父類 son是子類

定義乙個son的物件

son s = new son();

在這裡也可以定義為

father s = new son();

因為屬於son的就是屬於father的

如果在這個時候你使son的方法重寫father的方法,則呼叫的是重寫後的,如果沒有重寫,則呼叫原有的方法。

在自動轉型的情況下,還可以發現乙個知識點

叫做多型

例如 father s = new son();

son s=new son();

s.speak();

s.speak();

多個同樣的方法同樣的物件名和型別,但是執行過程卻不一樣。父類引用指向子類物件,呼叫方法時會呼叫子類的實現,而不是父類的實現,乙個執行從父類繼承過來或重寫的方法,另乙個執行自己的方法。

這樣就叫做多型。

繼承與多型

繼承 繼承是c 語言支援 重用及多型的重要機制。通過繼承,可以繼承可以在現有類的基礎上派生出新類,新類將共享現有類的成員,並且還可以新增新的成員。c 語言中,重用主要表現為可以使用現成的類 如.net框架類庫中的類 來定義新類,主要方法有組合和繼承兩種 繼承是物件導向程式設計支援 重用的另乙個重要機...

繼承與多型

虛函式只要在基類裡定義,所以繼承類都不用重新定義為虛函式,自動成為虛函式。虛函式必須有實現,普通成員函式在沒有呼叫時可以沒有實現 定義 class animal 只需要在基類定義函式為虛,子類中不需要新增virtual.smile函式在沒有呼叫時可以不實現。當有函式為虛函式時,析構函式應定義為vir...

繼承與多型

繼承需要符合的關係 is a,父類更通用 子類更具體 子類繼承父類的所有屬性和方法 不包括父類構造方法 super可以呼叫父類的方法和構造方法 子類可以重寫父類的方法 使用多型之後,當需要增加新的子類型別時,無需更改總部類,程式的可擴充套件性及可維護性增強 簡單來說,多型是具有表現多種形態的能力的特...