內部類,就是在類的內部定義的類......內部類訪問特點1,內部類可以直接訪問外部類的成員,包括私有...2,外部類要訪問內部類的成員,必須創建對象...外部類名.內部類名 對象名=外部類對象.內部類對象; class Test { public static void main(String[] ...
內部類,就是在類的內部定義的類......
內部類訪問特點
1,內部類可以直接訪問外部類的成員,包括私有...
2,外部類要訪問內部類的成員,必須創建對象...
外部類名.內部類名 對象名=外部類對象.內部類對象;
class Test {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner(); //創建內部類對象
oi.method();
}
}
class Outer {
private int num = 10;
class Inner {
public void method() {
System.out.println(num);
}
}
}
/*
* A:內部類概述
* B:內部類訪問特點
* a:內部類可以直接訪問外部類的成員,包括私有。
* b:外部類要訪問內部類的成員,必須創建對象。
* 外部類名.內部類名 對象名 = 外部類對象.內部類對象;
* C:案例演示
* 內部類極其訪問特點
*/
上面代碼,編譯後,在源文件所在目錄下生成Test.class Outer.class Outer$Inner.class三個位元組碼文件,這裡面,Inner作為Outer類的內部類,是嵌入在Outer類裡面的...
內部類的主要作用有
1.內部類提供了更好的封裝,就是更好的隱藏細節,更好的隱蔽性,把內部類隱藏在外部類之內,不允許同一個包中的其它類訪問該類
2.內部類成員可以直接訪問外部類的私有數據,因為內部類被當成外部類的成員,同一個類的成員之間可以互相訪問,但是外部類不能訪問內部類的實現細節,例如內部類的成員變數...(簡單地說就是:內部訪問外部,外部不能訪問內部)
3.匿名內部類適用於創建那些僅需要使用一次的類...
class Test {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner(); //創建內部類對象
oi.method();
}
}
class Outer {
private int num = 10;
class Inner {
public void method() {
System.out.println(num);
}
}
}
外部類Outer,內部類Inner,Inner這個類位於Outer類內部,不在Outer類的成員方法內部,如果在成員方法內部,就被稱為局部內部類,定義在類中並且不在成員方法中的內部類,叫做成員內部類,成員內部類是地位與成員變數,方法,構造方法和初始化代碼塊併列的成員,局部內部類和匿名內部類則不是類成員...上面的Inner類和num地位同等,都算是Outer類的成員...
成員內部類分為兩種:靜態內部類和非靜態內部類,內部類作為外部類的成員,可以像成員方法成員變數那樣,使用public protected 預設 private修飾符修飾,而外部類只能用預設和public修飾...也就是常見的public class 和 class
一個類內部的各個成員之間可以相互訪問...就相當於成員方法可以訪問成員變數,成員內部類可以訪問成員方法和成員變數,但是,一個成員方法不能訪問另一個成員方法的局部變數,也就是說,兩個成員方法的局部變數不能相互訪問,因為成員方法可以認為是類的成員,而成員方法的局部變數地位比成員低一等,兩者不同級,所以不能相互訪問,但是,一個成員方法肯定是可以訪問其自身定義的局部變數的,這是毋庸置疑的......
因此,成員內部類中的語句System.out.println(num);輸出的是外部類中的num,值為10,其實還有一個就近原則,但是,此處由於成員內部類並沒有num變數,所以只有輸出外部類的num變數...
在Test類中調用method方法,調用方法首先肯定要創建一個對象,Outer.Inner oi = new Outer().new Inner();是創建成員內部類的對象...
再看下麵的代碼
class Test {
public static void main(String[] args) {
Outer o = new Outer();
o.print();
}
}
class Outer {
private int num = 10;
private class Inner {
public void method() {
System.out.println(num);
}
}
public void print() {
Inner i = new Inner();
i.method();
}
}
該外部類包含成員變數num,成員內部類Inner,成員方法print,Outer o = new Outer();是創建一個Outer類的對象,o.print()是指利用該對象去調用Outer的成員方法print,在成員方法print中,執行的操作是創建Inner的對象,並且訪問其method方法...
再看靜態內部類...
class Test {
public static void main(String[] args) {
Outer.Inner oi = new Outer.Inner();
oi.method();
Outer.Inner2.print();
}
}
class Outer {
static class Inner {
public void method() {
System.out.println("method");
}
}
static class Inner2 {
public static void print() {
System.out.println("print");
}
}
}
這裡的兩個靜態成員內部類,先看Inner內部類,這個類的method方法是非靜態,所以,需要Inner的對象去調用,但是Inner作為Outer類的一個成員,我們把這個成員當成一個整體,這個成員是靜態的,所以,外部類調用這個成員,直接用類名調用,所以Outer.Inner oi = new Outer.Inner();
oi.method();就是調用method方法,但是對於print方法,直接類名調用...