1、抽象類
包含抽象方法的類,必須設計成抽象類!
1.1 抽象方法
只聲明瞭方法,同時使用了abstract修飾,沒有方法體!必須要子類來重寫!
1.2 抽象類的使用要點
1. 通過抽象類,可以避免子類設計的隨意性。
2. 有抽象方法的類只能定義能抽象類
3. 抽象類不能實例化,及不能用new來實例化抽象類。
4. 抽象類可以包含屬性、方法、構造方法。但是構造方法不能用來new實例,只能用來被子類調用。
5. 抽象類只能用來繼承。
6. 抽象方法必須被子類實現。
普通類:只有具體實現!
抽象類:具體實現和規範(抽象方法) 都有!
接口:只有規範!
2、接口
2.1 爲什麼需要接口?接口和抽象類的區別?
接口就是比“抽象類”還“抽象”的“抽象類”,可以更加規範的對子類進行約束。全面地專業地實現了:規範和具體實現的分離。
抽象類還提供某些具體實現,接口不提供任何實現,接口中所有方法都是抽象方法。接口是完全面向規範的,規定了一批類具有的公共方法規範。
從接口的實現者角度看,接口定義了可以向外部提供的服務。
從接口的調用者角度看,接口定義了實現者能提供那些服務。
接口是兩個模塊之間通信的標準,通信的規範。如果能把你要設計的系統之間模塊之間的接口定義好,就相當於完成了系統的設計大綱,剩下的就是添磚加瓦的具體實現了。大家在工作以後,做系統時往往就是使用“面向接口”的思想來設計系統。
2.2 接口的定義
2.2.1 格式
[訪問修飾符] interface 接口名 [extends 父接口1,父接口2…] {
常量定義
方法定義
}
2.2.2 接口的特性
訪問修飾符:只能是public或默認。
接口名:和類名採用相同命名機制
extends:接口可以多繼承
常量:接口中的屬性只能是常量,總是:public static final 修飾。不寫也是。
方法:接口中的方法只能是:public abstract。 省略的話,也是public abstract。
2.3 接口的使用要點
1. 子類通過implements來實現接口中的規範
2. 接口不能創建實例,但是可用於聲明引用變量類型。
3. 一個類實現了接口,必須實現接口中所有的方法,並且這些方法只能是public的。
4. 接口中只能包含靜態常量、抽象方法,不能有普通屬性、構造方法、普通方法。
5. 常量必然是:public static final。 我們不加這些修飾符,也是這樣。
6. 方法必然是:public abstract。 我們不加這些修飾符,也是這樣。
7. 接口完全支持多繼承。和類的繼承類似,子接口擴展某個父接口,將會獲得父接口中所定義的一切。
3、內部類
一般情況,我們把類定義成獨立的單元。有些情況下,我們把一個類放在另一個類的內部定義,稱爲內部類。
3.1 內部類的作用
1. 內部類提供了更好的封裝。只能讓外部類直接訪問,不允許同一個包中的其他類直接訪問。
2. 內部類可以直接訪問外部類的私有屬性,內部類被當成其外部類的成員。 但外部類不能訪問內部類的內部屬性。
內部類的使用場合:
由於內部類提供了更好的封裝特性,並且可以很方便的訪問外部類的屬性。所以,通常內部類在只爲所在外部類提供服務的情況下優先使用。
3.2 內部類的分類
3.2.1 成員內部類
(可以使用private、proteted、public任意進行修飾。 類文件:外部類$內部類.class)
a) 非靜態內部類(外部類裏使用非靜態內部類和平時使用其他類沒什麼不同)
i. 非靜態內部類必須寄存在一個外部類對象裏。因此,如果有一個非靜態內部類對象那麼一定存在對應的外部類對象。 非靜態內部類對象單獨屬於外部類的某個對象。
ii. 非靜態內部類可以使用外部類的成員,但是外部類不能直接訪問非靜態內部類成員。
iii. 非靜態內部類不能有靜態方法、靜態屬性、靜態初始化塊。
iv. 靜態成員不能訪問非靜態成員:外部類的靜態方法、靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變量、創建實例。
v. 成員變量訪問要點:
1. 內部類裏方法的局部變量:變量名
2. 內部類屬性:this.變量名
3. 外部類屬性:外部類名.this.變量名
vi. 內部類的訪問:
1. 外部類中定義內部類: new InnerClass()
2. 外部類以外的地方使用非靜態內部類:
Outer.inner varname = OuterObject.new Inner()
Face.Nose nose = new Face().new Nose();
Face f2 = new Face();
Face.Nose nose2 = f2.new Nose();
b) 靜態內部類
i. 定義方式:
static class ClassName {
//類體
}
ii. 使用要點:
1. 當一個靜態內部類對象存在,並不一定存在對應的外部類對象。 因此,靜態內部類的實例方法不能直接訪問外部類的實例方法。
2. 靜態內部類看做外部類的一個靜態成員。 因此,外部類的方法中可以通過:靜態內部類.名字 訪問靜態內部類的靜態成員。通過 new 靜態內部類()訪問靜態內部類的實例。
3. 在外部類的外面創建靜態內部類:
Face.TestStaticInner aInner = new Face.TestStaticInner();
3.2.2 匿名內部類
適合那種只需要使用一次的類。比如:鍵盤監聽操作等等。語法:
new 父類構造器(實參類表) 實現接口 () {
//匿名內部類類體!
}
3.2.3 局部內部類
定義在方法內部。作用域只限於本方法。用的非常少。