Java中的非靜態內部類詳解

非靜態內部類

/*
> 
> 記錄:肖佳嘉
> 寫完本文以後,我發現非靜態內部類寫的篇幅有點長。
> 所以我打算將靜態內部類放到下一篇文章寫。
> 
*/

其實普通內部類與普通類的使用沒什麼不一樣。
舉例說明一下:

先創建一個外部類和內部類,他們分別有自己的成員變量和成員方法

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類打印方法

從上面我們可以看到,只是使用非靜態內部類用法與我們平時使用的類並沒有太大的區別。

但也有需要注意的地方:
  1. 內部類作爲外部類的成員,可以使用任何一種訪問控制符:public private protect ,如果省略默認是包訪問。
public class Outter_2 {
	protected class inner_2{
		
	}
}
  1. 對於同名的變量,當變量被調用的時候,編譯器尋找的順序依次是:(類該方法內的局部變量——內部類的成員變量——外部類中尋找該成員變量)。如果都沒有找到,那麼編譯錯誤。建議是使用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);
	}

}

  1. 非靜態內部類的成員變量只在非靜態內部類範圍內是可用的,不能直接被外部類使用,如果外部類需要使用,那麼要顯式創建內部類對象來訪問。反而,非靜態內部類成員可以直接訪問外部類的所有變量。
//創建外部類和內部類
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();
	}
}
//測試結果:
外部類成員變量:外部類成員變量
內部類成員變量:內部類成員變量
  1. 外部類的靜態成員(包括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();
	}
}

  1. 非靜態內部類不允許添加靜態成員,包括靜態代碼塊,靜態成員變量,靜態初始化塊.

·
·
·
·
·
·

本文完
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章