理解什麼是繼承首先我們知道,面對對象有三大特征:封裝:解決了數據的安全性問題繼承:解決了代碼的重用問題多態:解決了程式的擴展問題上一篇博客中,我們瞭解了一下封裝,現在我了再來看看什麼是繼承。在現實生活中,我們可以把封裝理解成兒子對父親財產的繼承。而在面向對象程式設計中的繼承,是一個對象從另一個對象獲...
理解什麼是繼承
首先我們知道,面對對象有三大特征:
封裝:解決了數據的安全性問題 繼承:解決了代碼的重用問題 多態:解決了程式的擴展問題 上一篇博客中,我們瞭解了一下封裝,現在我了再來看看什麼是繼承。 在現實生活中,我們可以把封裝理解成兒子對父親財產的繼承。而在面向對象程式設計中的繼承,是一個對象從另一個對象獲取屬性和方法的過程。繼承是利用現有的類創建新類的過程,現有的類稱作基類(父類),創建的新類稱為派生類(子類),派生類可以擁有所有基類的非私有的屬性和方法。
例如,我們可以有一個類“人”,而我們要創建一個新的類“學生”,學生也是屬於“人”的一種,有“人”這個類的一些共通屬性行為,我們就可以把“學生”這個類繼承自“人”,而還有“小學生”、“中學生”、“大學生”,他們都屬於學生,我們可以讓他們繼承自“學生”類。
在繼承中,最高層的應該是最具有普遍性的、最符合一般情況的,往下一層,都應該比上一層更具體,在繼承中子類能夠自動共用基類中的成員屬性和成員方法。
如何使用繼承
在Java中,要繼承,需要使用extends關鍵字,繼承的語法格式如下:
[訪問修飾符] class 子類名 extends 父類名 { 成員列表 } 如 public Student extends Person{ ...... }
例子:
按照上面的舉例,我們先定義一個Person類
public class Person{ public String name; public int age; public void sleep(){ System.out.println("我正在睡覺"); } public void eat(){ System.out.println("我正在吃飯"); } }
對於“人”來說,人都有一個名字,都有年齡,能夠睡覺,也可以吃飯。
而我學如果此時需要有一個學生類,學生也屬與人,學生也都有人的特征,此時我們便可以使學生繼承於人。
public class Student extends Person{ public String sid; //學號 public String cls; //班級 public void study(){ System.out.println("我正在學習"); } }
對於學生來說,學生有自己的學號,有自己的班級,還有學習等等功能。
public class Test{ public static void main(String[] args){ Student stu = new Student(); stu.name = "張三"; stu.age = 20; //我們可以為Student類型的對象設置name和age,因為S圖等繼承自Person,所以也擁有Person類的屬性和方法。 stu.sleep(); stu.eat(); //我們也可以使用Person類的方法。 stu.sid = "S20150101001"; //當然,我們也可以使用Student自己的屬性和方法 stu.cls = "1001"; stu.study(); Person p = new Person(); p.study(); //錯誤,父類不可以使用子類的屬性和方法。 } }
當然,如果還需要有大學生等,我們可以定義大學生,使大學生繼承自學生類,大學生便可以擁有學生類和“人”類的屬性和方法。
需要註意的是,Java中的繼承是單繼承,也就是說,只能繼承一個父類,如果Student繼承了Person類,那就不能再直接繼承其他的類。
繼承中的構造方法
需要註意的是,父類中的構造方法是不能被繼承的。
同時需要我們註意的是,在對象的構建過程中,會先構建出父類,在構建出子類,這個比較好理解,就想在現實生活中一樣,只有先有父親,而後才有兒子一樣。
例如:
class ParentClass { //定義父類 public ParentClass() { //構造方法 System.out.println("這是父類的構造方法。"); } } class ChildClass extends ParentClass { //子類繼承於父類 public ChildClass() { //構造方法 System.out.println("這是子類的構造方法。"); } } public class ConstructorTest { //該類用於容納main方法 public static void main(String[] args) { ChildClass cc = new ChildClass(); //實例化子類對象 } }
執行輸出:
這是父類的構造方法。
這是子類的構造方法。
因此:
- 當實例化子類的對象時,必須先執行父類的構造方法,然後再執行子類的構造方法。
- 如果父類還有更上級的父類,就會先調用最高父類的構造方法,再逐個依次地將所有繼承關係的父類構造方法全部執行。
- 如果父類的構造方法執行失敗,那麼子類的對象也將無法實例化。
super關鍵字
在Java中,用super關鍵字可以對父類進行操作。
super主要有兩種用途:
第一種用途是:在子類的構造方法中,super關鍵字可以顯式地調用父類的構造方法,用於將參數傳遞給它; 其語法是:super(參數); 需要註意的是:該條語句必須是構造方法中的第一條語句。 第二中用途是:如果子類中有和父類相同名字的成員,在子類中是預設使用子類中的成員的,但是我們可以super關鍵字顯式調用父類中的成員。 語法:super.成員名 需要註意的是:父類中該成員不是private的。Java中繼承的特點與繼承作用
特點
繼承是單向的,子類可以訪問父類中的成員,但父類無法訪問子類的成員。
Java中只允許單繼承,一個子類只能擁有一個父類。
作用
引入繼承,實現了代碼重用;
引入繼承,實現了遞增式的程式設計。
能減少代碼和數據的重覆冗餘度,並通過增強一致性來減少模塊間的介面和界面,從而增強了程式的可維護性;
能清晰地體現出類與類之間的層次結構關係。