乱用重载所引发的不符合预期的执行结果

重载

  • 重载:方法名相同,方法的参数列表不同
  • Java在选择调用哪一个重载的方法是在编译的时候决定的,虽然它们的运行时类型不同,但是编译时类型是相同的,所以调用了同一个重载。
  • 例如:

foreach循环中,temp变量的类型在编译时期就已经确定下来了,是Collection类型,所以在调用重载方法的时候只会去调用方法3

public class OverloadDemo {
	public static void main(String[] args) {
            Collection<?>[] arr = {new ArrayList<String>(), new HashSet<String>()};
            for (Collection<?> temp : arr) {
                System.out.println(clssify(temp));
            }
	}
	
	// 方法1
	public static String clssify(List list) {
            return "我是List类型";
	}
	// 方法2
	public static String clssify(Set set) {
            return "我是Set类型";
	}
	// 方法3
	public static String clssify(Collection collection) {
            return "我是Collection类型";
	}
}
  • 所以说,对于重载方法的选择是“静态的”(这里的静态的是指的是固定的,对应的是动态的,和static没有任何联系),而对于覆盖方法的选择是动态的

覆盖

  • 覆盖:在子类中重写父类的方法
  • Java在调用覆盖方法的时候,是在运行时决定的,依据的是对象运行时的类型。因为运行时是子类的类型,所以调用的是子类中的覆盖后的方法
  • 例如:

foreach循环中,temp变量的类型在运行时期才能被确定下来,它们在运行时的类型分别是各个子类的类型,所以在调用重载方法的时候会去调用子类中覆盖以后的方法

public class OverrideDemo {
	public static void main(String[] args) {
		Liquid[] arr = {new Liquid(), new Water(), new SodaWater()};
		for (Liquid temp : arr) {
			temp.f();
		}
	
	}
	
}

class Liquid{
	public void f() {
		System.out.println("我是液体");
	}
}


class Water extends Liquid{
	@Override
	public void f() {
		
		System.out.println("我是水");
	}
}


class SodaWater extends Water{
	@Override
	public void f() {
		
		System.out.println("我是苏打水");
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值