对多态性java的困惑

时间:2018-05-26 23:51:42

标签: 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();
   }
}

如果我们希望能够将一个类替换为另一个类,该类执行相同的任务,但以不同的方式执行过于重新编译调用它们的类,方法是否重载方式或方法重载?

2 个答案:

答案 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?

如果您错误地输入其中一个并且没有任何内容被覆盖,您的编译器会抱怨您实际上没有覆盖函数,并且您的代码将更易于阅读。它不会影响结果,但你仍然应该出于这些原因使用它。