1、繼承函數
繼承好處this
一、提升代碼的重用性
二、提升代碼的擴展性和維護性
三、爲多態打下了基礎spa
繼承類型code
繼承子類建立對象的過程對象
2、super關鍵字的使用blog
理解:super表明父類的引用,用於訪問父類的屬性、方法、構造繼承
語法class
訪問父類的屬性:super.屬性名 = 值;
訪問父類的方法:super.方法(實參列表);
訪問父類的構造:super(實參列表);
基礎
注意:必須在子類的構造器的第一句變量
注意:在相對子類中,用super去訪問父類的成員
特色
一、當子類須要顯式調用父類的構造器時,則必須經過super關鍵字
二、當子類和父類的成員重名時,爲了訪問父類的成員,則必須經過super關鍵字
聯想:
當局部變量和當前類的成員變量重名時,能夠經過this區分開
噹噹前類的成員變量和父類的成員變量重名時,能夠經過super區分開
注意
一、super的使用不限於直接父類(還可訪問爺爺類,找不到再往上找)
二、若是父類和爺爺類中都相同的成員,則默認訪問的是父類的成員,遵循就近原則
三、this(實參列表)和super(實參列表)不能同時出如今構造器中
this和super的對比
1.this:表明本類對象,能夠訪問本類的屬性、方法、構造。它的出現主要爲了區分紅員變量和局部變量,以及調用本類構造器。
經過this訪問成員時,先從本類中查找,若是找不到再從直接父類找,若是還找不到,繼續往上追溯找間接父類,直到找到爲止!
2.super:表明父類引用,能夠訪問父類的屬性、方法、構造。它的出現主要爲了區分本類和父類的成員,以及調用父類構造器。
經過super訪問成員時,先從直接父類找,若是還找不到,繼續往上追溯找間接父類,直到找到爲止!
class Animal { void eat() { System.out.println("animal : eat"); } } class Dog extends Animal { void eat() { System.out.println("dog : eat"); } void eatTest() { this.eat(); // this 調用本身的方法 super.eat(); // super 調用父類方法 } } public class Test { public static void main(String[] args) { Animal a = new Animal(); a.eat(); Dog d = new Dog(); d.eatTest(); } }
輸出結果:
animal : eat
dog : eat
animal : eat
3、構造器
子類是不繼承父類的構造器(構造方法或者構造函數)的,它只是調用(隱式或顯式)。若是父類的構造器帶有參數,則必須在子類的構造器中顯式地經過 super 關鍵字調用父類的構造器並配以適當的參數列表。
若是父類構造器沒有參數,則在子類的構造器中不須要使用 super 關鍵字調用父類構造器,系統會自動調用父類的無參構造器。
class SuperClass { private int n; SuperClass(){ System.out.println("SuperClass()"); } SuperClass(int n) { System.out.println("SuperClass(int n)"); this.n = n; } } // SubClass 類繼承 class SubClass extends SuperClass{ private int n; SubClass(){ // 自動調用父類的無參數構造器 System.out.println("SubClass"); } public SubClass(int n){ super(300); // 調用父類中帶有參數的構造器 System.out.println("SubClass(int n):"+n); this.n = n; } } // SubClas2 類繼承 class SubClass2 extends SuperClass{ private int n; SubClass2(){ super(300); // 調用父類中帶有參數的構造器 System.out.println("SubClass2"); } public SubClass2(int n){ // 自動調用父類的無參數構造器 System.out.println("SubClass2(int n):"+n); this.n = n; } } public class TestSuperSub{ public static void main (String args[]){ System.out.println("------SubClass 類繼承------"); SubClass sc1 = new SubClass(); SubClass sc2 = new SubClass(100); System.out.println("------SubClass2 類繼承------"); SubClass2 sc3 = new SubClass2(); SubClass2 sc4 = new SubClass2(200); } }
輸出結果:
------SubClass 類繼承------ SuperClass() SubClass SuperClass(int n) SubClass(int n):100 ------SubClass2 類繼承------ SuperClass(int n) SubClass2 SuperClass() SubClass2(int n):200
4、final用法
final 關鍵字聲明類能夠把類定義爲不能繼承的,即最終類;或者用於修飾方法,該方法不能被子類重寫:
聲明類:
final class 類名 {//類體}
聲明方法:
修飾符(public/private/default/protected) final 返回值類型 方法名(){//方法體}
注:實例變量也能夠被定義爲 final,被定義爲 final 的變量不能被修改。被聲明爲 final 類的方法自動地聲明爲 final,可是實例變量並非 final