![](/img/trans.png)
[英]Valid For Loop - but why? for(;;System.out.println(“a”));
[英]Why is System.out.println(super) not permitted?
為什么System.out.println(super)
不允許?
System.out.println(this);
這沒關系,並且this.toString()
被自動調用和打印。 當然,實例變量可以代替this
。
但是, this
和super
可以以我所知道的相同方式使用。
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 應該按順序打印:
Derived
的toString()
的實現:“Derived”。Derived
中Description()
的實現:“派生描述”Base
的toString()
的實現:“Base”。Base
的Description()
的實現:它不存在。 我能想到的兩種解決方案會導致更大的問題:
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.