繼承與多態

構造器
構造器又稱構造函數和構造方法,用於構建當前類的對象的行爲和初始化類的相關屬性。
其格式爲 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();
多個同樣的方法同樣的對象名和類型,但是執行過程卻不一樣。父類引用指向子類對象,調用方法時會調用子類的實現,而不是父類的實現,一個執行從父類繼承過來或重寫的方法,另一個執行自己的方法。
這樣就叫做多態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章