为什么使用父类的引用来调用Java中的重写方法?

时间:2018-03-19 17:17:11

标签: java oop method-overriding

我正在学习Java中的方法覆盖。以下是方法覆盖的示例。

class ABC{
   public void myMethod(){
    System.out.println("Overridden Method");
   }
}
public class XYZ extends ABC{

   public void myMethod(){
    System.out.println("Overriding Method");
   }
   public static void main(String args[]){
    ABC obj = new XYZ();
    obj.myMethod();
   }
}

当通过父类的引用调用重写方法时,该对象的类型确定要执行哪个方法。现在考虑以下内容:

ABC obj = new ABC();
obj.myMethod();
// This would call the myMethod() of parent class ABC (1)

XYZ obj = new XYZ();
obj.myMethod();
// This would call the myMethod() of child class XYZ (2)

ABC obj = new XYZ();
obj.myMethod();
// This would call the myMethod() of child class XYZ (3)

如果(2)和(3)给出相同的输出:重写方法,那么为什么要使用(3)?我们可以使用(2)对吗?

我是Java的新手,所以我倾向于提出许多疑问!请帮忙!谢谢!

1 个答案:

答案 0 :(得分:0)

这样做的原因是遵循“编程到接口,而不是实现”的概念

在您的代码中,您总是通过父类引用来引用对象,因为您可以根据需要在运行时更改实现。

在您的示例中,XYZ只是ABC的一个实现。 如果在运行时(使用DI)您希望将实现更改为XYXTest类,该怎么办? 在您的代码中,如果您通过XYZ在任何地方引用,则需要将每个位置更改为XYZTest。 现在保持父ABC的引用,你只需在初始化的地方改变。(通过DI或构造函数)