從頭認識java-8.9 巢狀類(使用static的內部類)
阿新 • • 發佈:2018-12-26
這一章節我們來討論一下巢狀類。
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,我們只需要在釋出到時候把第二個檔案刪除,那麼這些測試的程式碼就刪掉了,這樣比較方便。
總結:這一章節討論了巢狀類的概念以及注意點。
這一章節就到這裡,謝謝。
-----------------------------------