一、繼承
1.class:編程語言中的基本單位。將數據和功能封裝到了一起。使用類來對同一類型的對象建模。
2.父類(superclass)包含其所有子類(subclass)共享的數據域和方法。即子類繼承了父類的數據域和方法。同時子類也可以添加新的數據域和方法。
3.可以創建一個父類來表示系統中某些對象的核心概念,從父類中導出其他類型,來表示此核心可以被實現的各種不同方式。
4.父類的private成員子類不可訪問。私有數據域可以通過父類的公共的訪問器(getName())/修改器(setName())來訪問和修改它們。
5.子類復制了父類的接口,所以所有可以發送給父類對象的消息同時也可以發送給子類對象。子類與父類具有相同的類型。
6.兩種方法可以讓父類與子類產生差異:
1)直接在子類中添加新方法;
2)改變現有父類的方法的行為--覆蓋(overiding)基類的方法。
7.is-a與is-like-a:
1)is-a:子類與父類具有完全相同的接口,即子類與父類是完全相同的類型。如:一個圓 is a 幾何圖形。判斷是否是繼承,就要確定是否可以用is-a來描述類之間的關系,並使之具有實際意義。
2)is-like-a:子類中添加了新的接口元素,即擴展了接口,父類無法訪問新添加的方法。此時導出類is like a 基類。
8.Java不允許多重繼承。一個java類只可能直接繼承自一個父類--單一繼承(single inheritance)。多重繼承可以通過接口實現。
二、super的作用
1.調用父類的構造方法
super()/super(parameters) 必須出現在子類構造方法的第一行,這是顯式調用父類構造方法的唯一方式。因為在子類中調用父類構造方法的名字會引起一個語法錯誤。構造方法可以用來構造一個類的實例,不像屬性和方法,父類的構造方法是不被子類繼承的,它們只能從子類的構造方法中用super調用。
注:構造方法鏈(constructor chaining):在任何情況下,構造一個類的實例時,將會調用沿着繼承鏈的所有父類的構造方法。當構造一個子類的對象時,子類構造方法會在完成自己的任務之前,首先調用它的父類的構造方法。如果父類繼承自其他類,那么父類構造方法又會在完成自己的任務之前,調用它的父類的構造方法。這個過程持續到沿着這個繼承體系機構的最后一個構造方法被調用為止。
public class Apple extends Fruit{}
class Fruit{
public Fruit(String name){
........
}
}
Apple中沒有顯式定義的構造方法,因此Apple的默認無參構造方法被隱式調用。又Apple是Fruit的子類,是所以Apple的默認構造方法會自動調用Fruit的無參構造方法。而Fruit沒有無參構造方法,因為Fruit顯式地定義了構造方法。因此程序不能編譯。最好能為每個類提供一個無參構造方法(如果需要),以便於對該類進行擴展同時避免錯誤。
2.調用父類的方法
super.方法名(參數)
(父類方法被覆蓋的情況下需用super調用父類方法,未被覆蓋的情況下不需要加super因為父類的方法已經被子類繼承了)
三、覆蓋方法(method overriding)
1.子類從父類中繼承方法,有時,子類需用修改父類中定義的方法的實現,這稱作方法覆蓋。
2.super.super.....方法名()是一個語法錯誤,只能super.方法名()
3.僅當實例方法是可訪問時,它才能被覆蓋。父類的私有方法不能被覆蓋。如果子類中定義的方法和父類中的私有方法同名,那么這兩個方法完全沒關系。
4.靜態方法可以被繼承但是不可以被覆蓋。如果父類中的靜態方法被子類重寫定義,那么定義在父類中的靜態方法將被隱藏,可用父類名.靜態方法調用隱藏的靜態方法。
四、對象類Object
1.Java中的每個類都源於java.lang.Object類。熟悉Object類提供的方法很重要。這樣就可以在自己的類中使用它們。
2.toString()方法:返回所屬類名@該對象十六進制形式的內存地址
3.equals()方法:使用==檢測兩個引用變量是否指向同一個對象。覆蓋equals方法的格式固定為equals(Object obj)
五、多態(polymorphism)
1.使用父類對象的地方都可以使用子類的對象,這就是多態。多態意味着父類型的變量可以引用子類型的對象。
六、動態綁定
1.動態綁定工作機制:假設對象o是類C1,C2,...,Cn-1,Cn的實例。其中C1是C2的子類,...Cn-1是Cn的子類。如果o調用一個方法p,那么java虛擬機會依次在類C1,C2...Cn中查找方法p的實現,知道找到為止。一旦找到一個實現就停止查找然后調用這個第一次找到的實現。
七、final
使用final修飾符表明一個類是終極的,是不能作為父類的。使用final修飾的方法是不能被子類覆蓋的。使用final修飾的方法內的變量就是常量。