学习JavaWeb的时候看到老师重载方法的参数分别为子类和父类,想测试下哪个优先级高,虚拟机究竟如何选择
首先写好父类
public class father {
public void test(father f) {
System.out.println("父类父类");
}
public void test(Son s) {
System.out.println("父类子类");
}
}
然后写一个子类用来测试重载
public class Son extends father {
public static void main(String[] args) {
father f = new Son();
Son s =(Son) f;
f.test(f);
f.test(s);
}
}
可以看到输出如下:
父类父类
父类子类
把父类的参数为Son s的方法注释掉,输出如下:
父类父类
父类父类
把父类的参数为Father f的方法注释掉,当编译时f.test(f)发生错误
这说明Java重载函数的选择只关注引用类型,不关注在内存里面具体的类型,没有多态的产生。
当没有符合引用类型的参数时,会自动向父类转换
Java重载是在编译过程中进行的,区别于在运行过程中的重写
向父类转换又想到了很有意思的问题,如果同时拥有两个同一级别的父类,那JVM会帮我们选择哪个。由于JAVA是单继承,多实现,所以只能让子类实现两个接口,此时代码如下
public class father {
public void test(AA a) {
System.out.println("AA接口");
}
public void test(BB b) {
System.out.println("BB接口");
}
}
//AA,BB是两个空接口
public class Son extends father implements AA,BB{
public static void main(String[] args) {
father f = new Son();
Son s =(Son) f;
f.test(s);
}
}
程序报错
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method test(AA) is ambiguous for the type father