Java繼承
繼承的特性
-
子類擁有父類非private的屬性,方法。
-
子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。
-
子類可以用自己的方式實現父類的方法。
-
Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關系就是C類是B類的父類,B類是A類的父類,這是java繼承區別於C++繼承的一個特性。
-
提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯系)。
繼承關鍵字
繼承可以使用 extends 和 implements 這兩個關鍵字來實現繼承,而且所有的類都是繼承於 java.lang.Object,當一個類沒有繼承的兩個關鍵字,則默認繼承object(這個類在 java.lang
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 interfaceB { 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繼承