爲了不重複代碼太多,致使代碼很差維護,你們須要學會如何複用代碼,代碼複用的兩種方式,組合和繼承安全
組合:在新類中建立現有類的對象
繼承:建立現有類的新類ide
class Instrument { public void play() { System.out.println("Instrument.play()"); } } public class Wind extends Instrument { public void play() { System.out.println("Wind.play()"); } } public class Music { public static void tune(Instrument i){ i.play(); } public static void main(String[] args) { Wind flute = new Wind(); Music.tune(flute); // 向上轉型 } }
從一個更具體的類型轉化爲更通常的類型,因此向上轉型用掛失安全的。子類可能會比父類包含更多的方法,必須至少具備和父類同樣的方法。code
final方法的做用是防止子類經過重寫改變方法的行爲
類中全部的private方法都是隱式的指定爲final,由於不能訪問private方法,因此不能重寫它。給private方法加上final修飾並不會給方法帶來額外的含義。重寫一個private方法時編譯並不會報錯,一個方法是private的,他就不屬於父類的一部分,只是建立了一個同名的方法而已對象
final類的做用是該類不容許被繼承繼承
對於上述向上轉型的例子,編譯器如何知道該調用哪一個方法,方法的入參只是一個Instrument引用
java採用後期綁定,在運行時根據對象的類型進行綁定,在運行時判斷對象的類型,從而調用方法,在編譯時編譯器不知道對象的類型,java對於static和final方法沒法採用後期綁定(private方法也是隱式的final)get
注:多態只是針對於普通方法,對於屬性和靜態方法不會存在多態
屬性在編譯時就會被解析編譯器
public class Parent { public int field = 0; public int getField(){ return field; } } public class Child extends Parent { public int field = 1; @Override public int getField(){ return field; } } public class TestField { public static void main(String[] args) { Parent parent = new Child(); System.out.println("parent.field= "+parent.field); System.out.println("parent.getField= "+parent.getField()); Child child = new Child(); System.out.println("child.field= "+child.field); System.out.println("child.getField= "+child.getField()); } }
執行結果博客
parent.field= 0 parent.getField= 1 child.field= 1 child.getField= 1
Parent.field和Child。field被分配了不一樣的存儲空間,Child實際上是存在兩個filed屬性的:自己的以及父類的,可是在引用Child的field的時候,默認的field屬性是來自於自己的,若是要獲取父類的該屬性,須要使用super.field來顯示地指定獲取父類屬性
可是這種狀況通常不會發生,首先屬性通常來講都是私有private的,其次子類和父類通常也不會起相同的屬性名字編譯
對於靜態方法的話,靜態方法只與類關聯,與對象無關
因爲自己的博客百度沒有收錄,博客地址http://zhhll.icu