为什么我可以实例化静态内部类?

时间:2014-01-25 12:06:09

标签: java

如果我无法创建静态类的实例,为什么我可以实例化静态内部类?

在下面的代码中,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();

但我无法用实际手段弄清楚这些方法之间的区别。

2 个答案:

答案 0 :(得分:4)

  

在下面的代码中,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没有这样的引用。

答案 1 :(得分:0)

静态嵌套类无法访问嵌套它的类的非静态字段和方法。 嵌套类的实例中存在非静态嵌套类('内部类'),因此它可以访问其非静态字段和方法。