java - Java多态的困惑

标签 java polymorphism

我正在阅读多态性,经过一番搜索后,我对编译时多态性和运行时多态性的区别感到困惑。

假设我有一个 ABC 类和另一个扩展 ABC 的类, 类 DEF 像这样:

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

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

public static void main(String args[]){
   ABC obj = new DEF();
   obj.myMethod();
   }
}

如果我们希望能够用另一个类替换一个类,该类执行相同的任务但以不同的方式无需重新编译调用它们的类, 是方法覆盖方式还是方法重载?

最佳答案

我猜你在问两件事

1) I was reading up on Polymorphism and after some searching I was confused about about the difference of compile-time and run-time polymorphism.

让我们把这里的水分开一点......

在编译时,编译器验证代码并将其转换为字节码。在此阶段解析静态方法调用,因此您知道每次调用静态方法时都会发生相同且唯一的实现。

运行时多态性 是在执行时发生的事情,用于决定要选择给定方法的实际实现。考虑到层次结构中的每个类都提供了这种“多态”方法的一种实现。在幕后,编译器使用称为后期绑定(bind)机制的东西做了大量工作来实现这一目标。

2) If we want to be able to replace a class with another class, which performs the same task but in a different way without having to recompile the class that calls them, Is method overriding the way or method overloading?

您实际上并没有说替换,而是谈论扩展,这就是您在类扩展另一个时所做的事情>。父类中方法的实现可以在子类中被覆盖Overload,与层级无关,是用不同的参数集编写相同的方法。

关于java - Java多态的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50547911/

相关文章:

java - 从给定的前序遍历构造 BST?

Java 向 PHP 服务器发送 POST 数据被 accessRules 方法阻止

java - 如何在TFS中构建java项目

java - 父类(super class)对象的子类引用

C++ 纯虚void

c# - 如何遵守 Liskov 替换原则 (LSP) 并仍然受益于多态性?

java - 尝试使用 Java High Level REST Client 查询 Long 类型时出现问题

java - 使用 Apache Camel 和 Spring,我可以使用属性构建 uri 吗?

c++ - 使用具有多态性的引用时无效的初始化

c++ - 需要关于多重继承和可选函数覆盖 C++ 的建议