gpt4 book ai didi

java - 为什么我可以实例化一个静态内部类?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:33 24 4
gpt4 key购买 nike

如果我不能创建一个静态类的实例,为什么我可以实例化一个静态内部类?

在下面的代码中,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 不是静态类,它可以使用以下语法实例化:

Counter counter1 = new Task().new Counter();
Counter counter2 = new Task().new Counter();

但我无法弄清楚这些方法在实际手段上的区别。

最佳答案

In the code bellow, Counter is a static inner class but it can be instantiated as if it was not:

内部类(无论是否为static)都可以像普通类一样被实例化。使类 static 只允许您访问它而无需创建封闭类的实例。就像您在该代码中所做的那样:

Counter counter1 = new Task.Counter();   

在这里你创建了一个Counter的实例。但是由于 Counter 是一个嵌套类(也就是我们所说的 static inner 类),我们必须这样访问它。 Task.CounterCounter 类的完全限定名称(在此处添加包)。事实上,由于您的 main 方法仅在 Task 类中,您可以直接使用:

Counter counter1 = new Counter();

现在,对于内部类(非静态),如果没有封闭类的任何实例,您将无法访问该类。因此,要创建 Counter 实例,您首先需要一个 Task 实例,如下所示:

Task task = new Task();
Counter counter = task.new Counter();

您可以像这样将这些语句组合成一个:

Counter counter = new Task().new Counter();

简单来说,不同之处在于,内部类 具有对其关联的封闭实例的引用,嵌套类 没有此类引用。

关于java - 为什么我可以实例化一个静态内部类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21350288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com