[英]How to invoke inner-class 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);
同样的错误将会发生。 怎么做?
您正在引用嵌套到Supcl
实例的内部类,因此初始化内部类的正确习惯是:
new Supcl().new Inner(int i)
您不能在构造函数之外调用super
,因此您必须在Inner(int i)
构造函数代码的第一行中调用它。
■从外部类实例代码内部,以常规方式使用内部类名称:
MyInner mi = new MyInner();
■从外部类实例代码外部(包括外部类内部的静态方法代码)开始,内部类名称现在必须包括外部类的名称:
MyOuter.MyInner
要实例化它,必须使用对外部类的引用:
new MyOuter().new MyInner(); or outerObjRef.new MyInner();
如果您已经有外部类的实例。
由于非静态内部类与其外部类具有特殊关系,因此您始终需要外部类的实例来创建内部类的实例。
对于非内部类扩展内部类的情况,您将需要创建外部类的实例或将其传递:
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
的实例,并且编译器无法推断出这一点。
最后,提个建议(尽管这主要是我的意见):正如您所看到的,内部类的语法并不总是直截了当的,在某些情况下可能很难理解所发生的事情,因此我建议使用内部类仅在简单情况下,并且仅在您确实需要它们时。 它将使您的生活更加轻松:)
使内部static
public static class InnerClass {
}
并像访问
ParentClass.InnerClass innerClass = new ParentClass.InnerClass(args);
args
是您的自定义参数(如果有)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.