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

释放双眼,带上耳机,听听看~!

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

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

//爷类
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”); }
    */

【转自慕课】https://www.imooc.com

JAVA

分布式监控CAT服务端的本地部署

2022-3-3 17:53:24

JAVA

聊一个不常见的面试题:为什么数据库连接池不采用 IO 多路复用?

2022-3-3 17:56:17

搜索