重载
- 重载:方法名相同,方法的参数列表不同
- 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("我是苏打水");
}
}