1. 程式人生 > >Java繼承

Java繼承

多重 子類重寫 tty animal 訪問 str 類構造 style cnblogs

繼承的特性

  • 子類擁有父類非private的屬性,方法。

  • 子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。

  • 子類可以用自己的方式實現父類的方法。

  • Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關系就是C類是B類的父類,B類是A類的父類,這是java繼承區別於C++繼承的一個特性。

  • 提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯系)。


繼承關鍵字

繼承可以使用 extends 和 implements 這兩個關鍵字來實現繼承,而且所有的類都是繼承於 java.lang.Object,當一個類沒有繼承的兩個關鍵字,則默認繼承object(這個類在 java.lang

包中,所以不需要 import)祖先類。

extends關鍵字

在 Java 中,類的繼承是單一繼承,也就是說,一個子類只能擁有一個父類,所以 extends 只能繼承一個類。

extends 關鍵字

 1 public class Animal { 
 2     private String name;   
 3     private int id; 
 4     public Animal(String myName, String myid) { 
 5         //初始化屬性值
 6     } 
 7     public void eat() {  //吃東西方法的具體實現  } 
8 public void sleep() { //睡覺方法的具體實現 } 9 } 10 11 public class Penguin extends Animal{ 12 }

implements關鍵字

使用 implements 關鍵字可以變相的使java具有多繼承的特性,使用範圍為類繼承接口的情況,可以同時繼承多個接口(接口跟接口之間采用逗號分隔)。

implements 關鍵字

public interface A {
    public void eat();
    public void sleep();
}
 
public interface
B { public void show(); } public class C implements A,B { }

super 與 this 關鍵字

super關鍵字:我們可以通過super關鍵字來實現對父類成員的訪問,用來引用當前對象的父類。

this關鍵字:指向自己的引用。

實例

public class SuperDemo {
    public static void main(String []args) {
        new SubClass().showMessage();
    }
}
 
class SuperClass {
    int i = 50;
}
 
class SubClass extends SuperClass {
    int i =100;
    public void showMessage() {
        System.out.printf("super.i = %d, this.i = %d\n", super.i, this.i);
    }
}

輸出結果為:

super.i = 50, this.i = 100

final關鍵字

final 關鍵字聲明類可以把類定義為不能繼承的,即最終類;或者用於修飾方法,該方法不能被子類重寫:

  • 聲明類:

    final class 類名 {//類體}
  • 聲明方法:

    修飾符(public/private/default/protected) final 返回值類型 方法名(){//方法體} 

:實例變量也可以被定義為 final,被定義為 final 的變量不能被修改。被聲明為 final 類的方法自動地聲明為 final,但是實例變量並不是 final


構造器

子類不能繼承父類的構造器(構造方法或者構造函數),但是父類的構造器帶有參數的,則必須在子類的構造器中顯式地通過super關鍵字調用父類的構造器並配以適當的參數列表。

如果父類有無參構造器,則在子類的構造器中用super調用父類構造器不是必須的,如果沒有使用super關鍵字,系統會自動調用父類的無參構造器。

實例

 1 class SuperClass {
 2   private int n;
 3   SuperClass(){
 4     System.out.println("SuperClass()");
 5   }
 6   SuperClass(int n) {
 7     System.out.println("SuperClass(int n)");
 8     this.n = n;
 9   }
10 }
11 class SubClass extends SuperClass{
12   private int n;
13   
14   SubClass(){
15     super(300);
16     System.out.println("SubClass");
17   }  
18   
19   public SubClass(int n){
20     System.out.println("SubClass(int n):"+n);
21     this.n = n;
22   }
23 }
24 public class TestSuperSub{
25   public static void main (String args[]){
26     SubClass sc = new SubClass();
27     SubClass sc2 = new SubClass(200); 
28   }
29 }

輸出結果為:

SuperClass(int n)
SubClass
SuperClass()
SubClass(int n):200

總結:

1、為什麽使用繼承

從已有的類派生出新的類,稱為繼承。

在不同的類中也可能會有共同的特征和動作,可以把這些共同的特征和動作放在一個類中,讓其它類共享。

因此可以定義一個通用類,然後將其擴展為其它多個特定類,這些特定類繼承通用類中的特征和動作。

繼承是 Java 中實現軟件重用的重要手段,避免重復,易於維護,易於理解。

2、父類和子類

如果類 B 從類 A 派生,或者說類 B 擴展自類 A,或者說類 B 繼承類 A,

則稱類 A 為"父類",也稱為超類、基類;

稱類 B 為"子類",也稱為次類、擴展類、派生類。

子類從它的父類中繼承可訪問的數據域和方法,也可以添加新的數據域和新的方法。

定義繼承的語法:

修飾符 class 子類名 extends 父類名

例如:Shape 類是父類,其子類可以有 Circle 類、Rectangle 類、Triangle 類,等等。

繼承的註意點:

  • 子類不是父類的子集,子類一般比父類包含更多的數據域和方法。
  • 父類中的 private 數據域在子類中是不可見的,因此在子類中不能直接使用它們。
  • 繼承是為"是一個"的關系建模的,父類和其子類間必須存在"是一個"的關系,否則不能用繼承。
    但也並不是所有"是一個"的關系都應該用繼承。例如,正方形是一個矩形,但不能讓 Square 類來繼承 Rectangle 類,因為正方形不能從矩形擴展得到任何東西。正確的繼承關系是 Square 類繼承 Shape 類
  • Java 只允許單一繼承(即一個子類只能有一個直接父類),C++ 可以多重繼承(即一個子類有多個直接父類)。

3、super 關鍵字

super 表示使用它的類的父類。super 可用於:

  • 調用父類的構造方法;
  • 調用父類的方法(子類覆蓋了父類的方法時);
  • 訪問父類的數據域(可以這樣用但沒有必要這樣用)。

調用父類的構造方法語法:

super();  

   

super(參數列表);

註意:super 語句必須是子類構造方法的第一條語句。不能在子類中使用父類構造方法名來調用父類構造方法。 父類的構造方法不被子類繼承。調用父類的構造方法的唯一途徑是使用 super 關鍵字,如果子類中沒顯式調用,則編譯器自動將 super(); 作為子類構造方法的第一條語句。這會形成一個構造方法鏈。

靜態方法中不能使用 super 關鍵字。

調用父類的方法語法:

super.方法名(參數列表);

如果是繼承的方法,是沒有必要使用 super 來調用,直接即可調用。但如果子類覆蓋或重寫了父類的方法,則只有使用 super 才能在子類中調用父類中的被重寫的方法。

4、this 關鍵字

this 關鍵字表示當前對象。可用於:

  • 調用當前類的構造方法,並且必須是方法的第一條語句。如:this(); 調用默認構造方法。this(參數); 調用帶參構造方法。
  • 限定當前對象的數據域變量。一般用於方法內的局部變量與對象的數據域變量同名的情況。如 this.num = num。this.num 表示當前對象的數據域變量 num,而 num 表示方法中的局部變量。
 

Java繼承