簡體   English   中英

如何調用內部類構造函數?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM