Java多态中重载方法选择

学习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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值