1. 程式人生 > >從頭認識java-8.9 巢狀類(使用static的內部類)

從頭認識java-8.9 巢狀類(使用static的內部類)

這一章節我們來討論一下巢狀類。

1.概念

內部類使用static的時候就是巢狀類。

package com.ray.ch07;

public class Test {
	private static class MyTest3{}
	
}

MyTest3就是巢狀類

2.注意點

(1)只能跟外部類的static部分進行通訊

(2)不在持有外部類物件的引用,可以直接使用static特性

package com.ray.ch07;

public class Test {
	private int id = 1;
	private static String name = "aaa";

	private static class MyTest1 {
		public void say() {
			// System.out.println(id);//error
			System.out.println(name);
		}
	}

	private class MyTest2 {
		public void say() {
			System.out.println(id);
			System.out.println(name);
		}
	}

	public static void main(String[] args) {
		// new Test().new MyTest1();//error.
		new Test.MyTest1().say();
		new Test().new MyTest2();
	}
}

從上面的程式碼可以看見,MyTest1是不能夠訪問id,而MyTest2可以。

還有,在new的時候,我們可以看見,MyTest1具備了static的特性,不需要new,但是還是需要多加一個括號,而MyTest2則需要new才能呼叫裡面的方法。

(3)巢狀類沒有this這引用

因為巢狀類使用了static,因此不能使用this來引用外部類。

(4)使用場景

一個比較常見的使用場景就是跟main函式結合。

因為在釋出專案的時候通過只是釋出有用的程式碼,像測試等程式碼都不釋出的,那麼現在這個就比較有用了。

我們來對比一下下面的這兩組程式碼:

package com.ray.ch08;

public class Test {
	
	public static void main(String[] args) {
		
	}

}
package com.ray.ch08;

public class Test {
	private void say() {
		System.out.println("abc");
	}

	public static class Tester {
		public static void main(String[] args) {
			Test test = new Test();
			test.say();
		}
	}

}


上面兩組程式碼的功能是一樣的,但是生成的檔案卻有區別。

第一個程式碼只會生成一個Test.class

但是第二個會生成兩個檔案Test.class和Test$Tester.class,我們只需要在釋出到時候把第二個檔案刪除,那麼這些測試的程式碼就刪掉了,這樣比較方便。

總結:這一章節討論了巢狀類的概念以及注意點。

這一章節就到這裡,謝謝。

-----------------------------------

目錄