75年生人,程序员,在西安。

Java 方法重载的应用规则

见原文例子:http://stackoverflow.com/questions/11110631/java-overloading-and-inheritance-rules

第4行是个很奇怪的结果,不是一般程序员的一般想法,说明一般想法需要修正,如何修正呢?就要理解Java的运行时规则,原文中的解释似乎是说a2实际上在运行时的类型实际是A(是一个AX的实例),所以最终调用的方法是:AX.method(A)

目前我的理解就是:

如果调用一个 a2.method(ax)方法,

首先,会从上向下找相应的匹配的方法,最高层当然是Object,如果是调用类似toString()之类的方法,那就最先找到Object.toString(),同时,在同一级类中找方法时看是否有当前级别的重载(Overloading),在本例中,a2.method(ax),就是没匹配A.method(Object)而是匹配了A.method(A)这个方法。

其次,找到后再看有没有下面的子类覆写(Overriding),如果有就再用子类的。在本例中就是找到了AX.method(A)这个覆写的方法。

另外,如果在上层方法中没找到相应方法,再到下层子类中去找相应的方法。在本例中,虽然下层子类中有AX.method(AX)看起来更匹配的方法,但前面已经匹配到了相应的方法了,所以不再会再次匹配这个AX.method(AX)了。

这个规则,叫真儿的话,可能算是个缺陷Bug,也就是没有再继续下层子类中匹配更恰当的方法,也许是出于JVM性能的考虑(因为这样可能需要不断地向下判断所有子类),这种特殊的情况也比较少见,且肯定是不推荐这样写的,正常的程序员肯定是要避开这种同名的混乱重载的,宁可换个长名字也不能牺牲可读性。

看来继承、重载、覆写之类的坑还是很多的,还是好好学习函数式编程吧,慢慢改变编程思维,用更简洁明了可测试的代码来实现应用。

评论

© 世风十三 | Powered by LOFTER