天天看點

java 外部類通路内部類私有變量_java-内部類通路特點-私有成員内部類-靜态成員内部類-局部内部類通路局部變量...

1、内部類通路特點:

-  内部類可以直接通路外部類的成員,包括私有。

-  外部類要通路内部類的成員,必須建立對象。

-  外部類名.内部類名 對象名 = 外部類對象.内部類對象;

-  例:

1 classDemo {2 public static voidmain(String[] args) {3 //外部類名.内部類名 = 外部類對象.内部類對象

4 Outer.Inner oi = new Outer().new Inner(); //建立内部類對象

5 oi.method();6

7 }8 }9

10 classOuter {11 private int num = 10;12 classInner {13 public voidmethod() {14 System.out.println(num);15 }16 }17 }

2、私有成員内部類

-  通過本類中提供一個公共的方法來通路私有成員内部類。

-  例:

1 classDemo {2 public static voidmain(String[] args) {3 //Outer.Inner oi = new Outer().new Inner();4 //oi.method();//這種方法不可以通路,因為成員内部類已經私有了

5

6 Outer o = newOuter();7 o.print();8 }9 }10

11 classOuter {12 private int num = 10;13 private classInner {14 public voidmethod() {15 System.out.println(num);16 }17 }18

19 //本類中提供一個公共的通路方式,通過本類中的方法通路私有成員内部類

20 public voidprint() {21 Inner i = newInner();22 i.method();23 }24 }

3、靜态成員内部類

-  例:

1 classDemo {2 public static voidmain(String[] args) {3 //外部類名.内部類名 對象名 = 外部類名.内部類對象;4 //其實這句話中new的位置是在Inner()前,new是修飾Inner()的:Outer.new Inner();5 //但是一般将new提到最前面,否則編譯會報錯,是以就寫成下面這樣了

6 Outer.Inner oi = newOuter.Inner();7 oi.method();8 //内部類裡面靜态方法的通路特點:外部類.内部類.靜态方法名();

9 Outer.Inner2.print();10 }11 }12

13 classOuter {14 static classInner {15 public voidmethod() {16 System.out.println("method");17 }18 }19

20 static classInner2 {21 public static voidprint() {22 System.out.println("print");23 }24 }25 }

4、局部内部類通路局部變量

-  局部内部類通路局部變量,該局部變量必須用final修飾

-  局部内部類在通路他所在方法中的局部變量必須用final修飾,為什麼?

*  因為當調用這個方法時,局部變量如果沒有用final修飾,他的生命周期和方法的生命周期是一樣的,當方法彈棧,這個局部變量也會消失,那麼如果局部内部類對象還沒有馬上消失想用這個局部變量,就沒有了。如果用final修飾會在類加載的時候進入常量池,即使方法彈棧,常量池的常量還在,也可以繼續使用。

*  但是jdk 1.8取消了這個事情,是以我認為這是個bug。

-  例:

1 classDemo {2 public static voidmain(String[] args) {3 Outer o = newOuter();4 //o.run();//錯誤,因為Inner在method方法中,屬于局部成員。方法外無法通路

5 o.method();6 }7 }8

9 classOuter {10 public voidmethod() {11 //int num = 10;//錯誤: 從内部類中通路本地變量num; 需要被聲明為最終類型

12 final int num=10;13 classInner {14 public voidprint() {15 System.out.println(num);16 }17 }18

19 Inner i = newInner();20 i.print();21 }22

23

27 }

5、面試題

-  例:

1 classTest {2 public static voidmain(String[] args) {3 Outer.Inner oi = new Outer().newInner();4 oi.show();5 }6 }7 //要求:使用已知的變量,在控制台輸出30,20,10。8 //内部類之是以能擷取到外部類的成員,是因為他能擷取到外部類的引用。外部類名.this

9 classOuter {10 public int num = 10;11 classInner {12 public int num = 20;13 public voidshow() {14 int num = 30;15 System.out.println(num);16 System.out.println(this.num);17 //System.out.println(new Outer().num);//使用對象來通路成員變量

18 System.out.println(Outer.this.num);19 }20 }21 }

6、個人總結:

-  普通内部類可通過在别的類中直接執行個體化通路,或者将該内部類的執行個體化寫在該内部類所在的類中的一個方法裡,外部通過調用該方法通路内部類。

-  私有成員内部類是将内部類的執行個體化放在了該内部類所在的類中的一個方法裡,該方法提供了一個可供外部公共通路的方式,外部可通過該方法通路私有成員内部類。

-  靜态成員内部類與普通内部類相似,可在别的類中直接(執行個體化)通路或在該内部類所在的類中寫一個方法用來(執行個體化)通路該内部類。隻不過靜态成員内部類可通過類名調用來通路。

-  局部内部類是将該内部類的執行個體化直接寫在了該内部類所在的方法體中,因為它相當于一個局部變量,在方法體外是通路不到的。