如何调用内部类构造函数?

时间:2014-11-03 15:48:47

标签: java constructor

我有以下几个类:

package org.gradle;

public class Supcl {

    public class Inner extends Supsupcl {
        public Inner(int a) {
            System.out.println(a);
        }
    }
}

package org.gradle;

public class Subcl extends Supcl.Inner {

    public Subcl() {
        Supcl.Inner.super(34); //error: No enclosing instance of type Supcl is 
                               //available due to some 
                               //intermediate constructor invocation

    }
}

班级Supsupcl

package org.gradle;

public class Supsupcl {}

如果我尝试将Supcl.Inner.super(34);替换为super(34);,则会发生相同的错误。怎么办?

4 个答案:

答案 0 :(得分:5)

您正在引用嵌套到Supcl实例的内部类,因此初始化内部类的正确习惯是:

new Supcl().new Inner(int i)
(assuming Supcl has a 0-argument constructor or the default constructor)

您无法在构造函数外部调用super,因此您必须将其作为Inner(int i)构造函数代码的第一行调用。

答案 1 :(得分:2)

■从外部类实例代码中,使用内部类名 正常的方式:

MyInner mi = new MyInner();

■从外部类实例代码外部(包括静态方法代码) 在外部类中),内部类名现在必须包含外部类 班级名称:

   MyOuter.MyInner

要实例化它,必须使用对外部类的引用:

  new MyOuter().new MyInner(); or outerObjRef.new MyInner();

如果您已经拥有外部类的实例。

答案 2 :(得分:1)

由于非静态内部类与其外部类具有特殊关系,因此总是需要外部类的实例来创建内部类的实例。

在你的情况下,非内部类扩展内部类,你需要创建外部类的实例或传递它:

public class Subcl extends Supcl.Inner {
  public Subcl() {
    //assuming there is a no-argument constructor Supcl()
    //this only works in one statement so the call to super is still 
    //part of the first statment in this constructor
    new Supcl().super(34); //will call Inner(34)
  }

  public Subcl( Supcl sup) {
    sup.super(34);  //will call Inner(34)
  }
}

请注意,即使Inner具有无参数构造函数,您也必须执行此操作,因为您需要以某种方式获取Supcl的实例,并且编译器无法推断此。< / p>

最后一句建议(虽然这主要是我的意见):正如你所看到的,内部类的语法并不总是直截了当,可能很难理解在某些情况下发生了什么,因此我建议仅在简单的情况下使用内部类,并且仅在您真正需要它们时使用。它会让你的生活更轻松:)

答案 3 :(得分:1)

制作内部static

public static class InnerClass {

} 

并像访问它

ParentClass.InnerClass innerClass = new ParentClass.InnerClass(args); 

其中args是您的自定义参数