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

Java 为什么我可以实例化一个静态的内部类?,java,Java,如果我不能创建静态类的实例,为什么我可以实例化静态内部类 在下面的代码中,Counter是一个静态内部类,但可以将其实例化为: public class Task { static class Counter { int counter = 0; void increment() {counter++;} } public static void main(String[] args) { Counter counter

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

在下面的代码中,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);
    }
}
如果计数器不是静态类,则可以使用以下sintax对其进行实例化:

Counter counter1 = new Task().new Counter();
Counter counter2 = new Task().new Counter();
但我无法在实际手段中找出这些方法之间的区别

在下面的代码中,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 counter1 = new Task.Counter();   
这里您正在创建
计数器的实例。但是由于
计数器
是一个嵌套类(我们称之为
静态内部
类),因此我们必须这样访问它
Task.Counter
Counter
类的完全限定名(在此处添加包)。事实上,由于您的
main
方法仅在
Task
类中,因此您可以直接使用:

Counter counter1 = new Counter();
现在,对于
内部类
(非静态),如果没有封闭类的任何实例,就无法访问该类。因此,要创建
计数器
的实例,首先需要
任务
的实例,如下所示:

Task task = new Task();
Counter counter = task.new Counter();
Counter counter = new Task().new Counter();
您可以将这些语句组合成以下语句:

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

简单地说,区别在于,
内部类
有一个对与其关联的封闭实例的引用,
嵌套类
没有这样的引用。

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

可能重复感谢,但我不同意,因为引用的问题解释了内部类和嵌套类之间的区别。我在问为什么我可以实例化一个静态的内部类,就好像它不是静态的一样。依我拙见,这不是一回事。但我尊重你的观点。这与即将调用
thread.yield()
thread.yield()
是一样的。谢谢,很好的解释。但是内部类和嵌套类不是同义词?@rperson No.
静态内部类
通常只称为
嵌套类
。而
非静态内部
类只是称为
内部类
。这只是一个术语问题。谢谢。@rperson不客气:)如果您想对内部类进行更详细的分析,可以通过