![]() |
1
1
只有当你重写时,多态性才起作用。这里您重载了不同的方法,因此当您声明时:
记住,父类不知道子类的方法,但子类知道父类的方法。所以这里你可以用D代替A,但你不能调用D的方法。对不起,如果我的英语很糟糕,但TLDR:A只知道1个方法calc(double-num),因为double-num也可以接受int和long,这就是函数工作的原因。否则就行不通了。 假设在第一个例子中,您在CityBike类中有一个方法introducteYourSelf(String name),您可以这样做:
|
![]() |
2
0
实际上,这不是最合适的。 考虑 Widening primitive conversions 这将用于选择最合适的方法。 可能的转换为:
您希望选择将浮点作为参数的方法。然而,正如你在上面的列表中看到的,double永远不可能适合另一种类型…double。 JLS 15.12.2.5 结束询问:
因此,由于float可以传递给double,而double不能传递给float,所以选择A中的方法是最合适的。
在自行车示例中,您正在重写方法,而在第二个示例中您正在重载。重载最合适的方法时(根据JLS 15.12.2.5),重写时将调用运行时对象的“最近”方法。 |
![]() |
3
0
B、C、D中的calc方法不会覆盖A中的calc-mehtod,因此当您通过a1(它是A)调用calc时,它实际上调用了A中的方法define(public int calc(double num)),因此结果是11。(也就是说,a1被视为A,而不是D。请注意,A中只有一个方法define) 但当您通过d1调用calc时,它定义了4个版本的calc,结果取决于参数的类型和参数。 |
![]() |
Mario Zelic · 更改子类方法签名时使用@重写注释 2 年前 |
![]() |
Bissi singh · Java静态方法与重写[重复] 7 年前 |
![]() |
Christallkeks · 子零部件中未使用替代的角管 7 年前 |
![]() |
Renan Araújo · 重写dll类属性集 7 年前 |
![]() |
peco · 将返回可选值的计算属性重写为返回非可选值的计算属性 7 年前 |
![]() |
Maxim Volkomorov · django重写身份验证登录方法 7 年前 |
![]() |
Amro Abdalla · ruby中细化和重定义类的区别 7 年前 |