1. 程式人生 > >java 內部類

java 內部類

所在 on() 定義變量 實現接口 特性 for sed prot ring

內部類(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 something
Person 匿名內部類

局部內部類

定義在方法內部。作用域只限於本方法。用的非常少。

java 內部類