为什么方法重载是编译时多态,为什么方法重写和向上转型是运行时多态
个人理解,仅供参考。如果有更好的说明,可以指导一下我:
首先搞清楚一点:编译,不是指我们在IDEA之类的工具上把代码写好就是编译了。——有点难受,我自己一直把这两个搞混,一直糊涂的以为写代码就是在编译。
编译:编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。
方法重载可以根据方法签名在编译时就判断出调用的是什么方法,方法签名:方法名,方法参数(参数个数,参数类型,参数次序)
而方法重写和向上转型在编译时是不能判断调用哪个方法的。向上转型中,对象调用的方法涉及到了方法重写(向上转型说明有继承,继承就可以重写父类的方法)。向上转型的方法调用的判断机制简单来说是,先根据调用的方法的方法签名到父类中找到这个方法,再看子类中是否重写了这个方法,如果子类重写了,就调用子类的,没有重写就还是调用父类的。
我刚开始认为:向上转型的调用方法当你代码完成的时候不是可以判断出到底调用的是哪个方法嘛?为什么说它是运行时才能判断,这个时候我自己都能判断出来,编译器会不知道?。
回答:那你是怎么知道的呢?是代码摆在你面前,你看都不看就知道了还是看了代码之后再在脑中想了一下才知道?看和想的这个过程就可以认为程序已经在你脑中运行过一次了——它会怎么运行,出现什么结果。
而编译器仅仅只是把你写的代码编程了电脑能识别的语言,这个时候电脑还没看代码呢。运行的时候,电脑才看代码(二进制),可以这么理解一下。
也或许我就只是说了一些废话,但是突然就来个点灵感才写的这篇博客,我以前也对这个很懵逼,可能没表达清楚吧,希望可以给到你们一点小帮助。
以下来自复制:
Java中实现多态的机制是什么?
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。