1.当父类引用指向子类引用时,调用一个覆盖了父类方法的引用,到底是调用子类里面的方法还是父类里面的方法呢?
继承关系:
public class Students extends user
父类里的方法
public int manyage(int age){
System.out.println("user function");
return this.age*2;
}
子类方法覆盖父类方法
public int manyage(int age) {
System.out.println("students function");
return this.age*3;
}
父类引用指向子类引用
user user=students;
调用方法:
System.out.println("which function used:"+user.manyage(students.age));
结果
结论:当我们调用一个指向了子类对象的父类对象的多态方法时,执行的是子类对象里的方法,也就是说:
付给调用哪个方法,和参数的引用类型无关,和引用的实际指向的类型有关
于此相反的是:
重载调用哪个方法,和参数的引用类型相关,和引用实际指向的类型无关,原因在于重载本身就是在参数所指对象下面操作。当然和当前类型相关。
甚至是个null也可以,但是要用强制类型转换,告诉Java这个类型是什么,否则找不到一个唯一的方法去调用
user user=null;
user=students;
System.out.println("which function used:"+user.manyage(students.age));
重载方法的调用就是只和参数类型类型,不管是基础类型还是自定义类型;如果调用的时候参数类型没有完全匹配,就按照继承关系往下撸:就是从继承往回找,
举例:
继承关系:
public 2 Students extends 1
public 3 Students extends 2
public 4 Students extends 3
若以4为参数被调用,但是重载方法里没有以4为参数的方法,那就会把3作为参数,如还是没有就以2为参数,依次往回;
总结:
多态分为:
静态多态:重载,以参数类型进行区别
动态多态:覆盖,以继承关系进行区别
重载的调用只与参数类型有关,与参数的引用实际指向的类型无关
覆盖的调用与引用实际指向的类型有关,与引用本身的类型无关