簡體   English   中英

為什么 System.out.println(super) 不允許?

[英]Why is System.out.println(super) not permitted?

為什么System.out.println(super)不允許?

System.out.println(this);

這沒關系,並且this.toString()被自動調用和打印。 當然,實例變量可以代替this

但是, thissuper可以以我所知道的相同方式使用。

System.out.println(super);

那么為什么會失敗呢? 我認為它應該隱式調用super.toString() 我已經閱讀了 Java 規范文檔,但我沒有找到原因。

檢查語法在http://java.sun.com/docs/books/jls/second_edition/html/syntax.doc.html

super關鍵字后面必須始終跟 SuperSuffix,不能為空。

所以super永遠不能單獨作為一種表達方式。

實現一個破壞虛擬方法分派的super的獨立變體將是一個非常糟糕的主意。

讓我們想一想。

abstract class Base {
    abstract String Description();
    String toString() { return "Base"; }
}
class Derived extends Base {
    String Description() { return "Derived description"; }
    String toString() { return "Derived"; }

    static void use(Base instance) {
        System.out.println(instance.toString());
        System.out.println(instance.Description());
    }
}

現在,讓我們接受您的建議,並假設super是有效的並且按照您的建議執行; 那么我們可以在Derived中寫:

class Derived extends Base {
    // Previous declarations omitted.
    void useSuper() { Derived.use(super); }
    void useThis() { Derived.use(this); }

    static void main() {
        Derived instance = new Derived();
        instance.useThis();
        instance.useSuper();
    }
}

現在,如果我理解你,你建議主要的 function 應該按順序打印:

  • 來自DerivedtoString()的實現:“Derived”。
  • DerivedDescription()的實現:“派生描述”
  • 來自BasetoString()的實現:“Base”。
  • 來自BaseDescription()的實現:它不存在。 我能想到的兩種解決方案會導致更大的問題:
    • 提出一個例外:恭喜,您現在可以破壞任何依賴於實際實現的抽象方法的程序,甚至無需考慮它。 (你怎么知道 function 會調用抽象方法?)
    • Derived返回實現:破壞一致性。

簡而言之, super這個詞的這種使用在概念上破壞了面向對象的編程。

this是指您當前的object super是指超級class , class 您當前的 object 直接繼承自(或者它可以是超級的構造函數)。 所以

System.out.println(this)

打印對象的 toString() 方法,但是

System.out.println(super)

失敗,因為 super 不是 object (因此沒有 toString() 方法)。

Super 僅與調用 static 方法有關。 如果您使用實際上引用您的 object 本身的 super 調用非靜態方法,即this 例如,您可以說System.out.println(super.toString()) 這將起作用並將運行實際 class 的toString()

我認為這就是禁止將super作為參數傳遞給其他方法的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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