【问题标题】:Why I can instantiate a static inner class?为什么我可以实例化一个静态内部类?
【发布时间】:2014-01-25 12:06:09
【问题描述】:

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

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

但我无法从实际意义上弄清楚这些方法之间的区别。

【问题讨论】:

  • 谢谢,但我不同意,因为引用的问题解释了内部类和嵌套类之间的区别。我在问为什么我可以实例化一个静态内部类,就好像它不是静态的一样。在我的拙见中,这不是一回事。但我尊重你的观点。
  • 和要调用thread.yield()或者Thread.yield()一样

标签: java


【解决方案1】:

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

【讨论】:

  • 谢谢,很好的解释。但是内部类和嵌套类不是同义词吗?
  • @rperson No. static inner 类通常被称为nested class。而non-static inner 类只是被称为inner class
  • 我明白了。这只是一个术语问题。谢谢。
  • @rperson 不客气 :) 如果你想对内部类进行更详细的分析,你可以通过this answer
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多