java 內部類
內部類(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();InnerClasses*/ 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("我在聽"); } } }
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 內部類