允許一個類的定義出現在另一個類中,將處于另一個類中的“寄生類”稱為“內部類”(inner class),也稱為“類屬類”
這樣的一組類在邏輯上是一個整體,內部類和外層封裝它的類之間存在邏輯上的從屬關系
內部類對其封裝類的內部成員有訪問權限
舉例1:
public class Outer1 {
private int size;
/* 定義一個內部類,名為 "Inner" */
public class Inner {
public void doStuff() {
// 內部類可以訪問外部類的私有屬性
size++;
}
}
public void testTheInner() {
Inner i = new Inner();
i.doStuff();
}
}
實例化內部類的兩種方法:
---法一:
Outer.Inner in=new Outer().new Inner();
---法二:
Outer o=new Outer();
Outer.Inner I=o.new Inner();
如果內部類是static的,也可以用下面方法:
Outer.Inner in=new Outer.Inner();
舉例2:內部類中的變量訪問形式
class Out {
private int age = 12;
class In {
private int age = 13;
public void print() {
int age = 14;
System.out.println("局部變量:" + age);
System.out.println("內部類變量:" + this.age);
System.out.println("外部類變量:" + Out.this.age);
}
}
} public class Demo {
public static void main(String[] args) {
Out.In in = new Out().new In();
in.print();
}
}
運行結果:
局部變量:14
內部類變量:13
外部類變量:12
舉例3:靜態內部類
class Out {
private static int age = 12;
static class In {
public void print() {
System.out.println(age);
}
}
} public class Demo {
public static void main(String[] args) {
Out.In in = new Out.In();
in.print();
}
}
可以看到,如果用static 將內部內靜態化,那么內部類就只能訪問外部類的靜態成員變量,具有局限性
其次,因為內部類被靜態化,因此Out.In可以當做一個整體看,可以直接new 出內部類的對象(通過類名訪問static,生不生成外部類對象都沒關系)
實例4:私有內部類
class Out {
private int age = 12;
private class In {
public void print() {
System.out.println(age);
}
}
public void outPrint() {
new In().print();
}
}
public class Demo {
public static void main(String[] args) {
//此方法無效
/*
Out.In in = new Out().new In();
in.print();
*/
Out out = new Out();
out.outPrint();
}
}
如果一個內部類只希望被外部類中的方法操作,那么可以使用private聲明內部類
上面的代碼中,我們必須在Out類里面生成In類的對象進行操作,而無法再使用Out.In in = new Out().new In() 生成內部類的對象
也就是說,此時的內部類只有外部類可控制。