3 回答
![?](http://img1.sycdn.imooc.com/545865da00012e6402200220-100-100.jpg)
TA贡献1843条经验 获得超7个赞
您的问题有一个简单的答案。在解决方案之后,我将说明每种情况下的输出。在此之前,有关您的代码段的一些注意事项:
随着类的B扩展A,并且具有methodOne具有不同类型的parameter(Integer)的相同方法,它具有method的两个重载版本methodOne。
A a = new B();这里a是B和类型的实例A。
理由:
a.methodOne(10):参数的类型10为int。这样void methodOne(int i)的类A被调用。
a.methodOne(new Integer(10)):参数的类型new Integer(10)为,Integer但methodOne(Integer i)子类中的方法对者B不可见a。因此new Integer(10)取消装箱int 10并再次调用void methodOne(int i)class A。
b.methodOne(20):作为b的实例B,它具有method的两个版本methodOne。但是参数的类型10是int,因此又调用void methodOne(int i)了类A(其父类)。
解决方案:
B b = new B();
b.methodOne(new Integer(20));
此处,参数的类型20为Integer。因此void methodOne(Integer i),B将调用class的。
这是一个小实验,可以帮助您了解父类中子类方法的不可见性。在类B中放置一个伪方法,并尝试使用类型为的对象A但类型为的实例B进行访问。以下是修改后的代码。
// Place this method in Class B
void test(){
}
//In the main method
A a = new B();
// a.test();
// The test method will not be available in class `A`, though the instantation of `a` is of type `B`.
![?](http://img1.sycdn.imooc.com/545866c40001561502200220-100-100.jpg)
TA贡献1883条经验 获得超3个赞
该行为与自动装箱和自动拆箱有关。有了这个线常见的两种情况下,请注意,这个例子是不相关的方法覆盖。
A a = new B();
a.methodOne(10); /* line 1 */
a.methodOne(new Integer(10)); /* line 2 */
B b = new B();
b.methodOne(20); /* line 3 */
b.methodOne(new Integer(20)); /* line 4 */
方案1:
class A {
void methodOne(Integer i) {
System.out.println("Integer " + i);
}
}
class B extends A {
void methodOne(int i) {
System.out.println("int " + i);
}
}
输出
Integer 10 /* line 1, [AutoBoxing] */
Integer 10 /* line 2 */
int 20 /* line 3, B has method(int) */
Integer 20 /* line 4, B has method(Integer) */
方案2
class A {
void methodOne(int i) {
System.out.println("int " + i);
}
}
class B extends A {
void methodOne(Integer i) {
System.out.println("Integer " + i);
}
}
输出
int 10 /* line 1 */
int 10 /* line 2, [auto unboxing] */
int 20 /* line 3 */
Integer 20 /* line 4 */
![?](http://img1.sycdn.imooc.com/533e4c5600017c5b02010200-100-100.jpg)
TA贡献1812条经验 获得超5个赞
class A {
void methodOne(Integer i) {
System.out.println("Integer " + i);
}
}
class B extends A {
void methodOne(int i) {
System.out.println("int " + i);
}
}
public class Solution {
public static void main(String[] args) {
A a = new B();
a.methodOne(10);
a.methodOne(10);
B b = new B();
b.methodOne(20);
}
}
添加回答
举报