如何通过对象显式调用父类被重写的方法?(期望输出"hello B")
嘿,这个问题在面向对象编程里太常见啦!当子类重写了父类的方法后,默认调用的确实是子类的实现,但要显式调用父类被重写的方法,其实有几种简单的方式,我用Java来给你举例子说明,毕竟这是这类问题最典型的场景:
核心方案:使用super关键字(子类内部调用)
在子类的方法中,你可以直接用super.被重写的方法名()来调用父类的原始实现。比如我们先定义父类B和子类A:
// 父类B class B { public void sayHello() { System.out.println("hello B"); // 你期望的输出 } } // 子类A,重写了sayHello方法 class A extends B { @Override public void sayHello() { System.out.println("hello A"); // 默认调用的子类实现 } // 封装一个方法,专门调用父类的sayHello public void callParentSayHello() { super.sayHello(); // 这里就是关键!用super调用父类被重写的方法 } }
然后在主程序中调用:
public class Main { public static void main(String[] args) { A a = new A(); a.callParentSayHello(); // 执行后会输出 "hello B" } }
额外场景:子类重写方法中同时调用父类逻辑
如果你的需求是在子类的重写方法里,先执行父类的逻辑再添加自己的逻辑,也可以直接用super:
@Override public void sayHello() { super.sayHello(); // 先输出"hello B" System.out.println("hello A"); // 再输出子类自己的内容 }
进阶方式:反射(不推荐日常使用)
如果实在需要在子类外部直接调用父类的被重写方法(不通过子类封装的方法),可以用反射,但这种方式会破坏封装性,一般只在特殊场景下使用:
import java.lang.reflect.Method; public class Main { public static void main(String[] args) { A a = new A(); try { // 获取父类B的sayHello方法 Method parentMethod = B.class.getDeclaredMethod("sayHello"); parentMethod.invoke(a); // 调用该方法,输出"hello B" } catch (Exception e) { e.printStackTrace(); } } }
总结一下,日常开发里最推荐的就是用super关键字的方式,既规范又易维护,完全能满足你输出"hello B"的需求~
内容的提问来源于stack exchange,提问作者Abhijeet Ohol
相关产品推荐
相关产品推荐

