我有以下几个类:
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);
,则会发生相同的错误。怎么办?
答案 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
是您的自定义参数