我正在学习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的新手,所以我倾向于提出许多疑问!请帮忙!谢谢!
答案 0 :(得分:0)
这样做的原因是遵循“编程到接口,而不是实现”的概念
在您的代码中,您总是通过父类引用来引用对象,因为您可以根据需要在运行时更改实现。
在您的示例中,XYZ只是ABC的一个实现。 如果在运行时(使用DI)您希望将实现更改为XYXTest类,该怎么办? 在您的代码中,如果您通过XYZ在任何地方引用,则需要将每个位置更改为XYZTest。 现在保持父ABC的引用,你只需在初始化的地方改变。(通过DI或构造函数)