多態出現的原因:java的引用變量有兩種類型:一個是編譯時的類型,一個是運行時類型。java
編譯時類型:聲明該變量時使用的類型決定。this
運行時類型:實際賦給該變量的對象決定code
若是編譯時和運行時類項不同就會出現所謂的多態(polymorphism)。對象
多態:相同類項的變量執行同一個方法時,呈現出不一樣的行爲特徵這就是多態。繼承
注意:引用變量在編譯階段只能調用其編譯時類項所具備的方法,但運行時則執行運行時類項所具備的方法,所以編譯java代碼時,引用變量只能調用聲明該變量時類項裏包含的方法,如:Object p = new Person()定義一個變量p,p只能調用Object類得方法而不能調用person類裏定義的非重寫方法。內存
與方法不一樣的是對象的屬性則不具備多態性。get
子類從父類繼承分紅兩種:編譯
1.方法的繼承:
方法的繼承,父類直接把本身的方法轉移到子類中去,固然前提是父類的方法修飾符的訪問範圍是子類能夠訪問的範圍且子類訪問權限不能比父低,可是若是子類已經重寫了父類的方法,這時候這個方法就不能從父類轉移到子類中。class
2.成員變量的繼承 :
成員變量就會有點奇妙了,它不會從父類轉移到子類,而是保留在父類中,這就會出現,子類和父類可能同時擁有兩個相同名字的變量。變量
下面用一段代碼來講明這種相對比較複雜的關係:
public class Test { public static void main(String[] args) { Father a = new Father(); Chilren b = new Chilren(); Father c = new Chilren(); a.getAge(); System.out.println(a.age); b.getAge(); System.out.println(b.age); c.getAge(); System.out.println(c.age); } } class Father { int age = 40; public void getAge() { System.out.println(age); } } class Chilren extends Father { int age = 18; public void getAge() { System.out.println(age); } } 輸出 40 40 18 18 18 40
前四個結果能夠理解,可是最後兩個結果有人可能會問爲何結果會不同,這段代碼就體現了,成員變量繼承和方法繼承的區別。
能夠得出結論:Father c = new Chilren(); 在以上父類引用指向子類對象狀況下,訪問變量看的是引用類型,因此c.age是父類的成員變量,而c.getAge()訪問到的是子類Chilren的方法,因此在這個方法中用到的age變量是Chilren的變量
反正一句話,訪問變量看聲明,訪問方法看實際對象類型(new出來的類型)
接下來對代碼作部分修改:
public static void main(String[] args) { Chilren b = new Chilren(); Father c = b System.out.println(b.age); System.out.println(c.age); } 輸出 18 40
b 和c 兩個引用都是指向內存中同一個對象,可是打印出來的結果倒是不一樣,這就說明了,內存中保存了兩個 age的值,一個是18 一個是40 。
這裏就會產生一些疑問,在內存中他們是怎麼存儲的?這時候會想到有個super關鍵字,經過super. 能夠訪問到父類的變量和方法,這裏有人會說:「super.表明的就是一個父類對象,由於他指向父類」 以前我也是這麼想,可是看過一些書後知道其實不是這樣。
其實super.不是「東西」,說道super.天然會想到this.,有人把他們歸爲同類,其實他們大大不。this:是一個真真實實對象,表明的就是當前對象,能夠用 return this; 去返回一個對象。
super:不是一個對象,不是指向父類對象的意思,super只是修飾了他後邊的內容,告訴JVM,後面這部份內容不是當前對象所屬類的內容而已,若用return super,JVM是不容許的,是一種錯誤的語法。
迴歸到上面這段代碼,這裏並非說內存中有兩個對象 b 和 c ,內存中其實就只有一個 b對象 ,只是c 不只有本身的實例 變量,同時也存在父類所定義的所有實例變量。
因此能夠得出結論:在實例化一個子類的同時,系統會給子類全部實例變量分配內存,也會給他的父類的實例變量分配內存,即便父子類中存在重名的實例變量,也會兩個都分配內存的,這個時候子類只是隱藏了父類的這個變量,但仍是會給它分配內存,而後能夠用super來訪問屬於父類的變量。