【问题标题】:Why can't main function instantiate inner class? [duplicate]为什么主函数不能实例化内部类? [复制]
【发布时间】:2018-02-22 07:30:22
【问题描述】:
class Outer{
    int i = 60;

    class Inner{
        void display(){
            System.out.println(i);
        }
    }

    public static void main(String args[]){
        Inner o = new Inner();
        o.display();
    }
}

Main 函数确实实例化了它的非静态类,而在实例化内部类(非静态)时,java 编译器会出现错误(如上面的代码)。为什么?

编辑:我不是在问如何实例化内部类。我只是想要一个合乎逻辑的原因,为什么main() 没有实例化它的内部类,而下面的函数却这样做了。

class Outer{
    int i = 60;
    void show(){
        Inner k = new Inner();
        k.display();    
    }

    class Inner{
        void display(){
            System.out.println(i);
        }
    }
    public static void main(String args[]){
        Outer o = new Outer();
        o.show();
    }
}

【问题讨论】:

  • 你应该有一个 Outer 实例的引用以在其上创建一个 Innernew Outer().new Inner()
  • 编辑:我不是在问如何实例化内部类...答案与您的编辑完全一样:它创建了Outer 类的实例跨度>
  • 您可以将嵌套类视为类似于方法的东西。如果没有包含该方法的类对象,则不能使用非静态方法。与内部类相同。要创建内部类的实例,您需要外部类的实例,例如Outer ou = new Outer(); Inner in = ou.new Inner();。这样做的原因是内部类可以访问其外部实例的所有成员(甚至是私有成员),因此它必须知道它应该能够访问哪个外部实例。当您调用ou.new Inner() 时会发生这种情况,对Outer 实例的引用保存在创建的Inner 实例中。
  • 问题是在static 上下文中没有this。这也在重复问题中进行了解释。您可能只阅读了已接受的答案,您还应该查看stackoverflow.com/a/12691179 之类的答案

标签: java


【解决方案1】:

Outer 类也必须实例化:

Inner o = new Outer().new Inner();

【讨论】:

    【解决方案2】:

    你需要有父类的引用。

    public static void main(String args[]){
        Inner o = new Outer().new Inner();
        o.display();
    }
    

    【讨论】:

      【解决方案3】:

      您需要一个父类的(封闭)实例,因为子类实例不能单独存在,例如:

      Outer outer = new Outer();
      Inner o = outer.new Inner();
      o.display();
      

      【讨论】:

        【解决方案4】:

        来自Java Tutorials

        静态嵌套类

        与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用在其封闭类中定义的实例变量或方法:它只能通过对象引用来使用它们。

        内部类

        与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。此外,由于内部类与实例相关联,它本身不能定义任何静态成员。

        所以如果你想能够实例化一个内部类,你需要有一个外部类的实例。在实例方法中你不需要它,因为你总是指的是 'this'

        【讨论】:

        • 请看编辑和解释。谢谢你
        • 您可以将内部类视为普通的非静态字段。它们不能从静态上下文中引用,因为它们绑定到类的一个特定实例,因此当您实例化它们时,它们仅对您用来创建它们的外部类的特定实例可见。相反,嵌套类就像静态字段,它们与类对象相关联,因此可以始终创建它们,因为类始终存在,并且任何人都可以访问它们
        • 内部类不能在静态上下文中实例化的另一个原因是因为它们可以访问包含类的非静态字段,因此使它们可从静态上下文中使用可能会导致不一致(即NullPointerExceptions, ...)
        【解决方案5】:

        Java docs 说:

        InnerClass 的实例只能存在于 OuterClass 并可以直接访问其方法和字段 封闭实例。

        要实例化一个内部类,必须先实例化外部类 班级。然后,用这个在外部对象中创建内部对象 语法:

        OuterClass.InnerClass innerObject = outerObject.new InnerClass();

        所以你可以试试:

        Inner o = new Outer().new Inner();
        

        【讨论】:

          【解决方案6】:

          因为一个类的静态方法和属性属于该类而不是该类的实例。因此只能与 Class 的其他静态方法和属性交互。

          【讨论】:

            猜你喜欢
            • 2014-08-31
            • 2013-05-02
            • 2017-12-08
            • 1970-01-01
            • 2013-06-08
            • 1970-01-01
            • 2017-03-03
            • 1970-01-01
            • 2020-06-23
            相关资源
            最近更新 更多