[英]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.