继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

超级经典的多态例题(会了这个,继承,多态,重载,重写都没问题了)

玄鉴
关注TA
已关注
手记 96
粉丝 237
获赞 4217

网上偶然看到这道题,顿时惊为天人。出这道题的绝对是牛人。我也是花了三个小时才搞明白,不知道大家需要多长时间。

会了这个,基本上继承,多态,重载,重写都没啥大问题了。所以做这道题之前大家最好再温习一遍这四个知识点。若是能一眼算出结果,我也只能膝盖送上。

//爷类
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类的第二个方法结果。
    1. 多态,自动向上转型
  • d作为参数符合D类型的。直接调用第一个方法。
    7.这个大家都明白,可以算是最简单的,直接方法的调用。最怕的是被搞糊涂了而最基本的都忘了。
    8.
  • b调用B类的方法,c符合B类型参数多态。就近原则,调用第一个方法。
    9.B类还有一个没有重写的方法,因为已经继承,不能因为没重写就代表不存在。
    public
  • String show(D obj){ return ("A and D"); }
    */
打开App,阅读手记
16人推荐
发表评论
随时随地看视频慕课网APP

热门评论

第4个用原文评论里的解释较好

A a2 = new B(); 
栈中的引用变量是A,堆中的实例变量是B。
将子类的实例,赋值给父类的引用。就是向上转型。
向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法--重写。(方法名,参数都相同)
所以a2,可以调用的方法就是,A中有的,但是B中没有的方法,和B中的重写A的方法。

第4个用原文评论里的解释较好

A a2 = new B(); 
栈中的引用变量是A,堆中的实例变量是B。
将子类的实例,赋值给父类的引用。就是向上转型。
向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法--重写。(方法名,参数都相同)
所以a2,可以调用的方法就是,A中有的,但是B中没有的方法,和B中的重写A的方法。

看完一遍,感觉已经方了。不过还是要好好消化消化。

查看全部评论