非靜態內部類
/*
>
> 記錄:肖佳嘉
> 寫完本文以後,我發現非靜態內部類寫的篇幅有點長。
> 所以我打算將靜態內部類放到下一篇文章寫。
>
*/
其實普通內部類與普通類的使用沒什麼不一樣。
舉例說明一下:
先創建一個外部類和內部類,他們分別有自己的成員變量和成員方法
package com.InnerOuter;
public class Outer {
public int number;
public Outer() {
super();
}
public Outer(int number) {
this.number = number;
}
public void PrintMethodOuter() {
System.out.println("outer類打印方法");
}
public class Inner_1{
public int number ;
public Inner_1() {
super();
}
public Inner_1(int number) {
super();
this.number = number;
}
public void PrintMethodInner_1() {
System.out.println("Inner_1類打印方法");
}
}
}
創建一個運行類
package com.InnerOuter;
import com.InnerOuter.Outer.Inner_1;
import com.InnerOuter.Outer.Inner_2;
public class OuterInnerRun {
public static void main(String[] args) {
Outer o_1 = new Outer(11);
o_1.PrintMethodOuter();
System.out.println("=========非靜態內部類=========");
Inner_1 i1 = o_1.new Inner_1(22);
i1.PrintMethodInner_1();
System.out.println("========靜態內部類========");
//Inner_2 i2 = new Inner_2(33);
//調用類方法,創建和不創建對象都可以,可以通過對象調用,也可以通過類型調用
//Inner_2.PrintMethodInner_2();
}
}
測試結果
outer類打印方法
=========非靜態內部類=========
Inner_1類打印方法
從上面我們可以看到,只是使用非靜態內部類用法與我們平時使用的類並沒有太大的區別。
但也有需要注意的地方:
- 內部類作爲外部類的成員,可以使用任何一種訪問控制符:public private protect ,如果省略默認是包訪問。
public class Outter_2 {
protected class inner_2{
}
}
- 對於同名的變量,當變量被調用的時候,編譯器尋找的順序依次是:(類該方法內的局部變量——內部類的成員變量——外部類中尋找該成員變量)。如果都沒有找到,那麼編譯錯誤。建議是使用this訪問非靜態內部類的成員變量,使用外部類名.this.變量名訪問外部類成員變量。。如果是在其他類裏面使用對象訪問的話,直接使用對應的對象訪問他的成員變量即可。
//建立內部類
package com.InnerOuter;
public class Outter_2 {
public String s = "外部類成員變量";
public void print() {
String s = "外部類方法局部變量";
System.out.println(s);
}
public class inner_2{
public String s = "內部類成員變量";
public void print() {
String s = "內部類方法局部變量";
System.out.println(s);
System.out.println(this.s);
System.out.println(Outter_2.this.s);
}
}
}
//建立運行類
package com.InnerOuter;
import com.InnerOuter.Outter_2.inner_2;
public class Outter_2Run {
public static void main(String[] args) {
Outter_2 o2 = new Outter_2();
inner_2 i2 = o2.new inner_2();
i2.print();
}
}
//測試結果:
內部類方法局部變量
內部類成員變量
外部類成員變量
//如果是在其他類裏面使用對象訪問,直接訪問即可
package com.InnerOuter;
import com.InnerOuter.Outter_3.inner_3;
public class Outter_3Run {
public static void main(String[] args) {
Outter_3 o3 = new Outter_3();
inner_3 i3 = o3.new inner_3();
System.out.println(o3.s);
System.out.println(i3.s);
}
}
- 非靜態內部類的成員變量只在非靜態內部類範圍內是可用的,不能直接被外部類使用,如果外部類需要使用,那麼要顯式創建內部類對象來訪問。反而,非靜態內部類成員可以直接訪問外部類的所有變量。
//創建外部類和內部類
package com.InnerOuter;
public class Outter_3 {
String s = "外部類成員變量" ;
public void print() {
System.out.println("外部類成員變量:" + this.s);
//此處必須顯式聲明,外部類是無法直接訪問內部類的。
System.out.println("內部類成員變量:" + new inner_3().s);
}
//內部類
public class inner_3{
String s = "內部類成員變量" ;
}
}
//創建運行類
package com.InnerOuter;
import com.InnerOuter.Outter_3.inner_3;
public class Outter_3Run {
public static void main(String[] args) {
Outter_3 o3 = new Outter_3();
o3.print();
}
}
//測試結果:
外部類成員變量:外部類成員變量
內部類成員變量:內部類成員變量
- 外部類的靜態成員(包括main()等方法)不能直接使用非靜態內部類
//建立一個空類
package com.InnerOuter;
public class Outter_4 {
public class inner_4{
}
}
//建立一個運行類
package com.InnerOuter;
public class Outter_4Run {
public static void main(String[] args) {
//將發生編譯錯誤,因爲main方法是靜態方法
new inner_4();
}
}
- 非靜態內部類不允許添加靜態成員,包括靜態代碼塊,靜態成員變量,靜態初始化塊.
·
·
·
·
·
·