簡體   English   中英

為什么我可以實例化靜態內部類?

[英]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.CounterCounter類的完全限定名稱(在那里添加包)。 實際上,由於您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM