我正在阅读多态性,经过一些搜索后,我对编译时和运行时多态的区别感到困惑。
假设我有一个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();
}
}
如果我们希望能够将一个类替换为另一个类,该类执行相同的任务,但以不同的方式执行而过于重新编译调用它们的类,方法是否重载方式或方法重载?
答案 0 :(得分:3)
我想你要问两件事
1)我正在阅读关于多态性的信息,经过一些搜索后,我就读到了 关于编译时和运行时的差异感到困惑 多态性。
让我们把水分开一点......
在编译时,编译器验证并将代码转换为字节码。静态方法调用在此阶段被解析,因此您每次调用静态方法时都会知道相同的唯一实现。
运行时多态性是执行时发生的事情,用于决定给定方法的实际实现。考虑到hierchary中的每个类提供了这种“多态”方法的一种实现。在幕后,编译器做了大量的工作来实现这一点,使用了一种称为后期绑定机制的东西。
2)如果我们希望能够用另一个类替换一个类,那么 执行相同的任务,但不必以不同的方式执行 重新编译调用它们的类,是方法覆盖的方式或 方法重载?
你实际上并没有说取代,inteads谈论 extends ,这是你在类扩展另一个。父类中a方法的实现可以在子类中覆盖。 重载,与层次结构无关,是使用不同的参数集编写相同的方法。
答案 1 :(得分:1)
重载是指您创建具有相同方法名称但具有不同参数的多个类。如果一个子类具有完全相同的方法名称和params,它实际上最终会被覆盖,无论你是否将@overwrite置于顶部。它实际上是完全相同的,无论你改变方法的结果,即使你使用base / super-class作为一个类型。
这可能会有所帮助When do you use Java's @Override annotation and why?
如果您错误地输入其中一个并且没有任何内容被覆盖,您的编译器会抱怨您实际上没有覆盖函数,并且您的代码将更易于阅读。它不会影响结果,但你仍然应该出于这些原因使用它。