今天碰到了一道题让我对多态产生了一些疑问,花了点时间重新了解了一下所以在这里做个笔记:
d
首先来解释一个知识点:
A是父类,B是子类,a2是父类A的引用,b是子类B的引用。
相当于:
A a2=new B();//这就为向上转型
a2.function() 这时候a2可以调用A的所有未改写的方法和B改写了的方法。但是不可以用a2自己添加上去的方法
也就是说现在的a2可以调用黄色和绿色的部分(绿色的部分是指被B继承之后并改写了的方法) 蓝色的是指B在继承之后自己添加上去的方法。
输出:
第一步,因为创建a1对象,a1对象只是类A的一个普通实例对象,所以a1只能调用类A中的两个方法。a1.show(b),因为没有以类B作为参数的方法,但是B是A的子类,所以执行public String show (A obj),所以输出A and A ;
第二步,a1调用方法,同第一步,没有以类C作为参数的方法,但是C是A的子类,所以执行public String show (A obj),输入 A and A ;
第三步,a1调用方法,同第一步,此时参数类型为D,类A中存在以D类型为参数的方法,所以调用public String show (D obj),输出 A and D ;
第四步,A a2 = new B(); 此语句为父类引用指向子类对象,此时a2只能调用A中的方法或者A的子类重写的A的方法。a2.show(b),类A中没有以类型B作为参数的方法(只看A中有的和B改写的。但是 public string show (B obj)是自己添加的所以不能采用),按照前三个来看是要执行public String show (A obj) 但此时的 A的这个方法被B改写所以是B and A (B是A的子类)
第五步,a2.show(c);即同第四步,a2只能调用A中的方法或者A的子类重写的A的方法。A中没有以C类型为参数的方法,C也为A的子类,所以执行public String show (A obj),此方法在A的子类B中被重写,所以执行B类的public String show (A obj),即输出 B and A ;
第六步,a2.show(d);类A中存在以类型D为参数的方法,所以此时可以调用A类的方法:直接执行public String show (D obj),输出 A and D ;
第七步,b.show(b);B b= new B() 声明类型B的对象b。b可以调用B类中的方法和B的父类A的方法,也需要注意B的子类对B中方法的重写。此时B类中共包含三个对A B D 三个参数的方法:
A类中的public String show (D obj) B类继承A改写的public String show (A obj) B类自己添加的
public String show (B obj),b.show(b)调用以类型B为参数的方法,所以执行public String show (B obj),输出为B and B ;
第八步,b.show(c);与第七步一样,此时参数为C类型,因为没有以类型C为参数的方法,但C直接继承了B,为B的子类,所以执行public String show (B obj)。
最后,b.show(d);以类型D作为参数,B类中共包含三个方法,分别是以类型D、类型A、类型B作为参数的方法,这个以类型D作为参数的方法是从B的父类A中继承过来的,所以直接执行public String show (D obj),输出为 A and D ;