网上偶然看到这道题,顿时惊为天人。出这道题的绝对是牛人。我也是花了三个小时才搞明白,不知道大家需要多长时间。
会了这个,基本上继承,多态,重载,重写都没啥大问题了。所以做这道题之前大家最好再温习一遍这四个知识点。若是能一眼算出结果,我也只能膝盖送上。
//爷类
public class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
//父类
public class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
//孙类
public class C extends B{
}
//孙类
public class D extends B{
}
//测试类。关于输出,希望大家最好一次只去掉一个注释,这才不会被搞晕。
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
//System.out.println(a1.show(b)); // ①
//System.out.println(a1.show(c)); // ②
// System.out.println(a1.show(d)); // ③
// System.out.println(a2.show(b)); // ④
// System.out.println(a2.show(c)); // ⑤
// System.out.println(a2.show(d)); // ⑥
//System.out.println(b.show(b)); // ⑦
// System.out.println(b.show(c)); // ⑧
// System.out.println(b.show(d)); //9
}
//最终结果:
A and A
A and A
A and D
B and A
B and A
A and D
B and B
B and B
A and D
//解释;
/*
- 下面关于测试类每一步输出的含义注释,这是我自己的理解, 大家最好先行自己理解再看我的,而且我也不确定我理解的就一定是对的。
- 方便起见,A为爷类。B为父类。CD为孙类。
1,调用爷类A的的方法且爷类作为多态,父类B作为实参,调用了A的第二个方法。 - 2.调用爷的方法A且爷类作为多态,孙类C作为实参,调用了A的第二个方法。多态不仅能作子类的多态,还能做跨越多重继承作为孙类的多态。
- 3.调用爷的方法A,孙类D作为实参符合A的第一个方法。所以直接调用第一个方法,如果没有第一个方法,则跟上面的一样化身多态,调用第二个方法。
- 4.这个最难理解。多态,自动向上转型 b作为参数符合A类型的多态。调用第二个方法。输出“A and
- A”,但是B重写了这个方法,随机输出重写的方法体将原来的而输出瞬间覆盖,成为"B and A"。
- 覆盖的意思可能不对,大家可以先吧B的重写方法注释掉,看前后的区别就明白了。
- 5.跟第四个一个意思,因为C类没有重写方法,无法覆盖,所以输出的而结果是B类的第二个方法结果。
- 多态,自动向上转型
- d作为参数符合D类型的。直接调用第一个方法。
7.这个大家都明白,可以算是最简单的,直接方法的调用。最怕的是被搞糊涂了而最基本的都忘了。
8. - b调用B类的方法,c符合B类型参数多态。就近原则,调用第一个方法。
9.B类还有一个没有重写的方法,因为已经继承,不能因为没重写就代表不存在。
public - String show(D obj){ return ("A and D"); }
*/
热门评论
第4个用原文评论里的解释较好
A a2 = new B();
栈中的引用变量是A,堆中的实例变量是B。
将子类的实例,赋值给父类的引用。就是向上转型。
向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法--重写。(方法名,参数都相同)
所以a2,可以调用的方法就是,A中有的,但是B中没有的方法,和B中的重写A的方法。
第4个用原文评论里的解释较好
A a2 = new B();
栈中的引用变量是A,堆中的实例变量是B。
将子类的实例,赋值给父类的引用。就是向上转型。
向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法--重写。(方法名,参数都相同)
所以a2,可以调用的方法就是,A中有的,但是B中没有的方法,和B中的重写A的方法。
看完一遍,感觉已经方了。不过还是要好好消化消化。