2011-06-17 100 views
6

existantial問題如何調用超級方法(即:的toString())從派生類外

,如果我有一個類層次結構,如:

public class TestSuper { 
    public static class A { 
     @Override 
     public String toString() { return "I am A"; } 
    } 
    public static class B extends A { 
     @Override 
     public String toString() { return "I am B"; } 
    } 
    public static void main(String[] args) { 
     Object o = new B(); 
     System.out.println(o); // --> I am B 
     // ?????? // --> I am A 
    } 
}  

從主要方法,是有可能在實例類型爲B時調用A的toString?

當然,像o.super.toString()不編譯...

+1

很確定這已被問過。 – RMT 2011-06-17 13:22:03

+2

在你的例子中,A不是B的超類,所以即使試圖去超級的方法也不會工作 – 2011-06-17 13:22:07

+1

我假設你打算B擴展A? – 2011-06-17 13:23:01

回答

19

你不能,也很故意如此:它會破壞封裝。

假設您有一個類使用一種方法來驗證某些業務規則的輸入,然後調用超類方法。如果調用者可以忽略這個覆蓋,它會讓這個類變得毫無意義。

如果您發現自己需要這樣做,請重新訪問您的設計。

0

這是不可能的,因爲A的toString()被B覆蓋(我猜你的意思是「B類延伸A」)。

2

您可以添加另一個方法來調用超級字符串。喜歡的東西:

public string getSuperString(){ 
    return super.toString(); 
} 
-1

在你的代碼是不可能的,在情況B延伸的

public class TestSuper { 
    public static class A { 
     @Override 
     public String toString() { return "I am A"; } 
    } 
    public static class B { 
     @Override 
     public String toString() { return "I am B"; } 
    } 
    public static void main(String[] args) { 
     B b = new B(); 
     System.out.println(b); // --> I am B 
     A a = (A)b; 
     System.out.println(a); 
    } 
} 
3

您可以

  • 添加到一個方法或B,你打電話代替。

    // to A 
    public String AtoString() { 
        return toString(); 
    } 
    // OR to B 
    public String AtoString() { 
        return super.toString(); 
    } 
    
  • 在線A.toString()的代碼,在那裏「稱」

    // inlined A.toString() 
    String ret = "I am A"; 
    System.out.println(ret); 
    

這兩個選項,建議類中的一個貧窮的設計,但是有時你已經存在的你只能以有限的方式改變課程。