如果我无法创建静态类的实例,为什么我可以实例化静态内部类?
在下面的代码中,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();
但我无法用实际手段弄清楚这些方法之间的区别。
答案 0 :(得分:4)
在下面的代码中,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
没有这样的引用。
答案 1 :(得分:0)
静态嵌套类无法访问嵌套它的类的非静态字段和方法。 嵌套类的实例中存在非静态嵌套类('内部类'),因此它可以访问其非静态字段和方法。