代码之家  ›  专栏  ›  技术社区  ›  EliiTryToLearn

多态性的困惑

  •  3
  • EliiTryToLearn  · 技术社区  · 6 年前

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

    假设我有一个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();
       }
    }
    

    如果我们想用另一个类替换一个类,这个类执行相同的任务,但方式不同 没有 也有 重新编译 调用它们的类,方法是否重写方法或方法重载?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Victor pozs    6 年前

    我想你问了两件事

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

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

    在编译时 编译器验证代码并将其转换为字节码。静态方法调用在这个阶段得到解决,所以您知道每次调用静态方法时,都会发生相同的、唯一的实现。

    运行时多态性 是在执行时发生的事情,以决定给定方法对Chosse的实际实现。考虑到层次结构中的每个类都提供了这个“多态”方法的一个实现。在窗帘后面,编译器做了大量的工作来归档这个,使用的是 后期装订 机制。

    2)如果我们想用另一个类替换一个类,那么 重新编译调用它们的类,方法重写方法或 方法重载?

    你不是真的这么说的 替换 ,inteads谈到 延伸 ,这就是你在做的事情 类扩展另一个 . 父类中方法的实现可以是 覆盖 在子类中。 超载 ,与层次结构无关,是用一组不同的参数编写相同的方法。

        2
  •  1
  •   Max    6 年前

    重载是指使用相同的方法名创建多个类,但参数不同。如果一个子类具有完全相同的方法名和参数,那么不管您是否将@overwrite放在顶部,它最终都会被覆盖。它实际上是相同的,无论您如何改变方法的结果,即使您使用基类/超类作为类型。

    这可能会有帮助 When do you use Java's @Override annotation and why?

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