![](/img/trans.png)
[英]How can I instantiate a inner public static final class in java from a different package
[英]Why I can instantiate a static inner class?
如果我無法創建靜態類的實例,為什么我可以實例化靜態內部類?
在下面的代碼中,Counter是一個靜態內部類,但它可以實例化,就好像它不是:
public class Task {
static class Counter {
int counter = 0;
void increment() {counter++;}
}
public static void main(String[] args) {
Counter counter1 = new Task.Counter();
Counter counter2 = new Task.Counter();
counter1.increment();
counter2.increment();
counter2.increment();
counter2.increment();
System.out.println("counter1: " + counter1.counter);
System.out.println("counter2: " + counter2.counter);
}
}
如果Counter不是靜態類,則可以使用以下sintax實例化:
Counter counter1 = new Task().new Counter();
Counter counter2 = new Task().new Counter();
但我無法用實際手段弄清楚這些方法之間的區別。
在下面的代碼中,Counter是一個靜態內部類,但它可以實例化,就好像它不是:
內部類(無論是否為static
)可以實例化,就像普通類一樣。 使類static
只允許您訪問它而不創建封閉類的實例。 就像你在那段代碼中那樣:
Counter counter1 = new Task.Counter();
在這里,您將創建一個Counter
實例。 但由於Counter
是一個嵌套類(我們稱之為static inner
類),我們必須像這樣訪問它。 Task.Counter
是Counter
類的完全限定名稱(在那里添加包)。 實際上,由於您的main
方法僅在Task
類中,因此您可以直接使用:
Counter counter1 = new Counter();
現在,對於inner class
(非靜態),如果沒有任何封閉類的實例,則無法訪問該類。 因此,要創建Counter
的實例,首先需要一個Task
實例,如下所示:
Task task = new Task();
Counter counter = task.new Counter();
您可以將這些語句組合成如下所示:
Counter counter = new Task().new Counter();
簡單來說,不同之處在於, inner class
具有與其關聯的封閉實例的引用, nested class
沒有這樣的引用。
靜態嵌套類無法訪問嵌套它的類的非靜態字段和方法。 嵌套類的實例中存在非靜態嵌套類('內部類'),因此它可以訪問其非靜態字段和方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.