首先要知道继承是多态的基础
我将会使用一个测试类来讲解可能会遇到的问题
首先定义一个父类B,里面定义f和g方法(g方法重载)
class B {
public B() {
System.out.print("B!\t");
}
public void f(double d) {
g(d);
}
public void g(int i) {
System.out.println("g(int " + i + ") in B!");
}
public void g(double d) {
System.out.println("g(double " + d + ") in B!");
}
}
接着定义一个C类继承B类(C中有自己的方法f和重写后的g(double)方法)
class C extends B {
public C(int i) {
System.out.println("Constructor: " + i);
}
public void f(int i) {
g(i);
}
public void g(double d) {
System.out.println("g(double " + d + ") in C!");
}
}
测试类
public class Duotai {
public static void main(String[] args) {
// 因为C是B的子类,所以C构造方法的第一行含有B类的构造方法不要忘记运行
B obj1 = new C(1);
// 父类中有f(double d)方法,但是需要把参数转化成double类型,再去执行g(2.0),此方法被子类重写,则执行子类中的g方法
obj1.f(2);
// 未被子类重写执行父类中的g方法
obj1.g(3);
// 被重写,执行子类中的
obj1.g(4.0);
// 此时的obj2单纯是B类的子类(也有super引用父类构造方法)
C obj2 = new C(5);
// 此时子类的虚方法表中有自己和父类的所有方法,重写的方法执行子类的,其他方法择优执行
obj2.f(6);
// g(7)执行的是子类继承于父类的方法
obj2.g(7);
obj2.g(8.0);
}
}
总结如下:
多态创建的对象,调用时会去父类中寻找方法,如果父类中没有此方法就会报错
如果父类中有这个方法,就去看看子类中是否重写此方法,若重写,执行重写后的方法
如果父类中有这个方法但是参数类型不同,就对参数进行自动类型转换,转换顺序如下 byte,short,char->int->long->float->double从左到右等级依次升高,低等级到高等级可以自动类型转换,从高等级到低等级则需要强制类型转换
如果还有别的疑问可以评论出来哦~