標籤:java bst 分類 一個 system 執行個體 splay his 通過
內部類(innerclasses)
一般情況,我們把類定義成獨立的單元。有些情況下,我們把一個類放在另一個類的內部定義,稱為內部類。
內部類的作用:
1. 內部類提供了更好的封裝。只能讓外部類直接存取,不允許同一個包中的其他類直接存取。
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()
/** * 內部類 * @author OU * */public class InnerClasses { public static void main(String[] args) { /*Face face=new Face(); Face.Nose nose=face.new Nose(); nose.breath(); */ Face.Ear ear=new Face.Ear(); ear.listen(); } }class Face{ int type; String face="瓜子臉"; /** * 非靜態內部類 for example * @author OU * */ class Nose{ int type; void breath(){ //調用的是外部的type System.out.println(Face.this.type); //如果內部類沒有外部類的屬性可以直接調用 System.out.println(face); } } /** * 靜態內部類 for example */static class Ear{ void listen(){ System.out.println("我在聽"); }} }InnerClasses
b) 靜態內部類
i. 定義方式:
static class ClassName {
//類體
}
ii. 使用要點:
1. 當一個靜態內部類對象存在,並不一定存在對應的外部類對象。 因此,靜態內部類的執行個體方法不能直接存取外部類的執行個體方法。
2. 靜態內部類看做外部類的一個靜態成員。 因此,外部類的方法中可以通過:靜態內部類.名字 訪問靜態內部類的靜態成員。通過 new 靜態內部類()訪問靜態內部類的執行個體。
3. 在外部類的外面建立靜態內部類:
Face.TestStaticInner aInner = new Face.TestStaticInner();
2. 匿名內部類
適合那種只需要使用一次的類。比如:鍵盤監聽操作等等。文法:
new 父類構造器(實參類表) 實現介面 () {
//匿名內部類類體!
}
abstract class Person { public abstract void eat();} public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); }}運行結果:eat somethingPerson 匿名內部類
局部內部類
定義在方法內部。範圍只限於本方法。用的非常少。
java 內部類