java多态性的困惑

java多态性的困惑,java,polymorphism,Java,Polymorphism,我正在阅读多态性方面的文章,经过一些搜索之后,我对编译时多态性和运行时多态性的区别感到困惑 假设我有一个ABC类和另一个扩展ABC的类, 类别定义如下: class ABC{ public void myMethod(){ System.out.println("Overridden Method"); } } public class DEF extends ABC{ public void myMethod(){ System.out.println(

我正在阅读多态性方面的文章,经过一些搜索之后,我对编译时多态性和运行时多态性的区别感到困惑

假设我有一个ABC类和另一个扩展ABC的类, 类别定义如下:

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

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

重载是指使用相同的方法名创建多个类,但参数不同。如果一个子类有完全相同的方法名和参数,不管你是否把@overwrite放在上面,它最终都会被覆盖。从字面上看,这是完全相同的事情,无论采用哪种方式,您都可以更改方法的结果,即使您使用基类/超类作为类型

这可能会有帮助


如果您在两个函数中键入了一个错误,那么编译器会抱怨您实际上没有覆盖函数,结果什么都没有被覆盖,这样您的代码就更容易阅读了。它不会影响结果,但出于这些原因,你仍然应该使用它。

我想你在问两件事

1) 我正在阅读多态性,经过一些搜索,我发现 对编译时和运行时的区别感到困惑吗 多态性

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

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

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

2) 如果我们想用另一个类替换一个类,那么 以不同的方式执行相同的任务,而不必 重新编译调用它们的类,方法是否重写了 方法重载


实际上,你并不是说取代了,而是说扩展了,这是你在类扩展另一个时所做的事情。父类中方法的实现可以在子类中被覆盖。
重载与层次结构无关,就是用不同的参数集编写相同的方法。

“重载是指创建多个类”是指方法吗?根据它的方法,但我想知道是否有两个类执行相同的任务,但方式不同。你能在不重新编译调用它们的类的情况下在它们之间切换吗?是的,我的意思是方法,对此很抱歉。在您的示例代码中,DEF中的方法将被调用,而不是ABC中的方法,因为您重写了它。如果你想调用ABC的对象,你必须从ABC创建一个对象。是的,我同意!父类中方法的实现在子类中可能会被过度使用!我明白了,投你一票:)!没什么要感谢的,很高兴能帮忙!,就像我们大家一样分享!别忘了把这个标记为正确答案:D