From 4fb6b7a4f2a28ee6db4969f85c7a2dc05eb75814 Mon Sep 17 00:00:00 2001 From: sjsdfg <736777445@qq.com> Date: Sat, 9 Mar 2019 13:59:52 +0800 Subject: [PATCH] =?UTF-8?q?52.=20=E6=98=8E=E6=99=BA=E5=AE=A1=E6=85=8E?= =?UTF-8?q?=E5=9C=B0=E4=BD=BF=E7=94=A8=E9=87=8D=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 52. 明智审慎地使用重载.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/52. 明智审慎地使用重载.md b/52. 明智审慎地使用重载.md index cd6cb11..0803336 100644 --- a/52. 明智审慎地使用重载.md +++ b/52. 明智审慎地使用重载.md @@ -33,7 +33,7 @@ public class CollectionClassifier {   您可能希望此程序打印 Set,然后是 List 和 Unknown Collection 字符串,实际上并没有。 而是打印了三次 Unknown Collection 字符串。 为什么会这样? 因为`classify`方法被重载了,**在编译时选择要调用哪个重载方法**。 对于循环的所有三次迭代,参数的编译时类型是相同的:`Collection`。 运行时类型在每次迭代中都不同,但这不会影响对重载方法的选择。 因为参数的编译时类型是`Collection,`,所以唯一适用的重载是第三个`classify(Collection c)`方法,并且在循环的每次迭代中调用这个重载。 -  此程序的行为是违反直觉的,因为**重载(overridden)方法之间的选择是静态的,而重写(overridden)方法之间的选择是动态的**。 根据调用方法的对象的运行时类型,在运行时选择正确版本的重写方法。 作为提醒,当子类包含与父类中具有相同签名的方法声明时,会重写此方法。 如果在子类中重写实例方法并且在子类的实例上调用,则无论子类实例的编译时类型如何,都会执行子类的重写方法。 为了具体说明,请考虑以下程序: +  此程序的行为是违反直觉的,因为**重载(overloaded)方法之间的选择是静态的,而重写(overridden)方法之间的选择是动态的**。 根据调用方法的对象的运行时类型,在运行时选择正确版本的重写方法。 作为提醒,当子类包含与父类中具有相同签名的方法声明时,会重写此方法。 如果在子类中重写实例方法并且在子类的实例上调用,则无论子类实例的编译时类型如何,都会执行子类的重写方法。 为了具体说明,请考虑以下程序: ```java class Wine {