標籤:功能 手動 支援 類成員變數 而且 報錯 資料區 能力 代碼區
一、繼承
1、繼承的概念
繼承是物件導向編程技術的基石,是一種由已有的類建立新類的機制。
類的繼承性是子類(subclass)可以從父類自動繼承其全部屬性和方法的能力。而且子類中聲明的任何執行個體方法都能調用它們。
Java不支援多重繼承,一個子類只有一個父類。
繼承關係也稱為泛化關係,描述父類與子類的關係,UML中用帶空心三角形的直線表示。
2、子類
建立子類:extends superclass語句指明所要繼承的父類。
需要清楚的是,Java中Object類是所有類的父類,它的方法可以被所有類調用。
子類自動從父類繼承的是public、protected修飾的屬性和方法,而無法訪問private修飾的屬性和方法。
對於default存取權限(無存取修飾詞),若子類父類位於同一包中,子類可以繼承父類預設成員;若不是,不能繼承。
3、子類能做的事
- 子類可以直接使用繼承來的成員變數,就像使用自己定義的變數;
- 聲明新的成員變數,若名字和父類的成員變數相同,就會隱藏父類的成員變數;
- 繼承而來的方法也能直接使用
- 在子類中實現一個簽名與父類方法一樣的方法,則會覆蓋父類的方法;
- 子類的構造方法可以使用super調用父類的構造方法;
4、構造方法與子類的記憶體結構
類的構造方法不能擁有修飾符、傳回型別和異常聲明子句。
子類的構造方法被調用時,首先調用父類的構造方法,然後執行執行個體變數和靜態變數的初始化塊,最後才執行子類自己的構造方法。
5、關於父類構造方法的調用
如果子類的構造方法沒有顯示調用父類的構造方法,那麼編譯器會自動為它加上一個預設的super()方法調用。但是,如果父類又沒有預設的無參構造方法,編譯器就會報錯,編譯器會報錯。
而且,super()語句必須是子類構造方法的第一個子句。
6、執行個體變數初始化器,{...}語句塊
除了構造方法外,使用這個“執行個體變數初始化器”初始化對象的屬性!
它會在類的構造方法被調用時運行,運行於父類的構造器之後,當前類的構造方法之前。
7、類變數初始化器 static{...}
初始化類變數,也就是靜態代碼塊,只能初始化一次!(會最早被執行)
8、子類的記憶體配置
Java中記憶體被分為堆(heap)、棧(stack)、全域資料區和代碼區。
new出來的對象都放在堆裡,它的使用通過引用來調用它。
引用被壓入棧裡(因為引用很小,適合在棧裡進進出出)。
實際上,從記憶體的角度看,子類會擁有父類的所有屬性(即包括private),但是子類的對象並不能直接存取父類中的私人變數,這也是類封裝的關鍵。
二、Java中的修飾符
按被修飾的對象:類修飾符、屬性修飾符、方法修飾符
按功能:
1、存取權限修飾符
public、private、protected、default(之前已經介紹)
2、final修飾符
final意味著不可變。
修飾類:類不能被擴充,即不能被繼承。
修飾屬性:屬性值不能改變,意味著聲明時要手動初始化。
修飾方法:方法不能被重寫,即為最終版本,子類不能修改。
3、abstract修飾符
修飾類:該類為抽象類別,不能被執行個體化,必須擴充後才能產生對象。
修飾方法:抽象方法,必須被子類重寫(override)。
4、static修飾符
表名屬性和方法都隸屬於類~可以通過類名訪問。
5、super修飾符
super是指向父類的引用,相當於父類的名字,它使被屏蔽的父類成員變數或者成員方法變為可見。
如果子類中,隱藏、覆蓋了父類的屬性和方法,可以通過super進行調用。
super的使用:
-
- 訪問父類的隱藏屬性:super.variable
- 調用父類被重寫的方法:super.method([paralist])
- 調用父類的構造方法:super([paralist])
Java 繼承和介面