调用一个方法,传递一个引用类型数据,即对象进去,遵循下面规则:
(1)、如果该方法的参数,正好是这个对象的引用,那么就调用这个方法。
(2)、如果没有正好对这个对象的引用,那么就找参数是其父类引用的方法(如果是接口,就找相应的接口引用),如果父类也没有,就找父类的父类。。。直到找不到,报错。
那么,记住这一点,总和前面父类子类方法调用的问题,就无往而不利了。
看下面的一道题
答案和解释
1、第1行的结果为 A And A
因为传递进去的是一个B类对象,而A类中没有B类对象相应的show方法,那么就找B类对象的父类引用,所以为A And A
2、第2行的结果为 A And A
原因和1相同
3、第3行的结果为 A And D
因为传递的是一个D对象,因为有与D类对象相应的show方法,所以调用相应的show方法,输出 A And D
4、第4行的结果为 B And A
a2是父类引用子类的对象,虽然传递进来的参数是B类对象,而子类B中也有相应的show方法,但是父类引用不能调用它,因为它是子类独有的方法。所以只能在自己类里面的方法里面找,找到了这个方法
public String show(A obj) {
return ("A and A");
}
又因为子类重写了这个方法
public String show(A obj) {
return ("B and A");
}
所以调用子类重写的方法,所以是B And A;
5 、第5行的结果为 B And A
原因和4类似。
6、第6行的结果为 A And D
父类的引用,在父类中找到了与D类相应的show()方法,所以调用
public String show(D obj) {
return ("A and D");
}
输出结果为A And D;
7、第7行的结果为 B And B
这个就不解释了
8、第7行的结果为 B And B
不解释
9、第9行的结果为 A And D
因为B从A类那里继承了 public String show(D obj) {
return ("A and D");
}
所以调用这个方法,结果是A And D