2011-06-17 102 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); 
    

这两个选项,建议类中的一个贫穷的设计,但是有时你已经存在的你只能以有限的方式改变课程。