回覆列表
  • 1 # 寒來一暑往

    繼承是從人類社會提取的一個名詞,子代能繼承父代的一些特性,在程式設計中也引入了這樣的概念,目的是提高程式碼複用、也方便分門別類。繼承是所有面向物件語言不可缺少的部分,在Java中,繼承無處不在,因為所有的類都繼承自Object。繼承讓類與類之間產生is-a的關係。繼承讓已有的類派生出新類,新類具有父類的屬性和方法,還能擁有自己的屬性和方法。繼承提高了程式碼複用率和可維護性。類與類之間產生親緣關係,是實現多型的基礎。繼承也增加了耦合性。(面向物件思維:高內聚(獨立完成工作)低耦合(類與類之間有關係))Java繼承特點Java只支援單繼承,不支援多繼承(extends A,B,C,D......),因為繼承多個類都存在相同屬性或者方法名相同方法體不同的方法,子類呼叫父類的成員就不知道到底是呼叫哪個。一個類只能擁有一個父類!但是Java支援多層繼承class Living{}class Animal extends Living{}class Dog extends Animal{}如果想要使用這個繼承體系所有的功能,那就使用最底層的類派生新類。如果要看這個繼承體系的共性,那就看頂層基類的功能。單繼承雖然足夠安全,但是在某些情況下不能體現真實事物的關係,因此Java在介面上允許多實現,這樣就彌補了單繼承的不足,並且介面的方法都是抽象方法,多實現不會增加複雜性,有利於派生類功能的擴充套件!interface Ainterface Bclass C implements A,B{}、繼承要注意的地方:構造器是一個特俗的方法,子類並不能繼承父類的構造方法,但是可以透過super關鍵字來訪問父類的構造方法。子類所有的構造器都會預設先訪問父類的無參構造器,因為繼承是為了子類獲得父類的成員,因此子類初始化之前會先完成父類成員的初始化。如果父類只有有參構造器,子類必須顯式建立構造器,不論子類的構造器引數型別是否與父類一致,都必須在子類的構造器中顯式使用super呼叫和父類構造器引數一致的構造器,否則編譯錯誤。class Animal(int age){ System.out.println(age); }; class Dog extends Animal{ public Dog(int age){ super(age); } public Dog(){ super(6);//必須呼叫父類構造器 } } 繼承中的執行順序構造器執行順序繼承體系中的構造器執行順序例項化子類物件時,總是先執行父類構造器。建立任何物件都是從該類最頂層類的構造器開始執行,依次往下,最後執行本類構造器。如果父類透過this呼叫了多個父類過載構造器,還會依次執行此父類的多個構造器。靜態域的執行順序呼叫子類構造器例項化子類物件時,父類先載入到記憶體中並先執行父類靜態域。由於構造器是從頂層開始執行,因此靜態域也如此。靜態域優先於構造器執行,也優先於main方法。繼承的缺點繼承破壞了父類的封裝,暴露了父類的內部成員,父子類之間耦合嚴重。子類可以對父類進行修改。因此我們應該靈活運送繼承的三種關係:私有繼承、保護繼承、共有繼承。任何繼承關係中,基類的私有成員都不能被訪問。在私有繼承中,基類的非私有成員在子類中變成私有,只有子類內部呼叫,建立的子類物件都不能訪問。在保護繼承中,大多數情況下與共有繼承一樣,但是不允許其他包的類訪問。

  • 中秋節和大豐收的關聯?
  • 11個月大的寶貝便秘怎麼辦?