Java繼承:super關鍵字、構造器、final用法

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

相關文章
相關標籤/搜索