1.方法重载:发生在编译时。方法的重载也被称为编译时多态,因为编译器可以根据参数的类型来选择使用哪个方法。
public class{如果编译器在编译下面的语句:
public static void fun(String param1); //方法1
public static void fun(int param1); //方法2
}
fun("My Test");它会根据传入的参数是字符串常量,生成调用方法1的字节码
2.方法覆盖:这个是在运行时发生的。方法的覆盖被称为 运行时多态,因为编译期间编译器不知道并且没法知道该去调用哪个方法(因为是方法的重写,两个方法都一模一样,编译器无法分辨出该调用哪个方法)。JVM会在代码运行的时候做出决定。
public class A{
public int compute(int input){ //方法3
return 3*input;
}
}
public class B extends A{
@Override
public int compute(int input){ //方法4
return 4*input;
}
}
子类B中的compute(...)方法重写了父类的compute(...)方法。如果编译器遇到以下代码:
public int fun(A reference,int arg2){编译器是没办法知道传入的参数reference的类型是A还是B。因此,只能够在运行时,根据赋给输入变量“reference”的对象的类型(例如,是A的实例还是B的实例)来决定调用方法3还是方法4.
int result = reference.computer(arg2);
}
3.泛型(又称为类型检验):这个是发生在编译期间的。 编译期负责检查程序中类型的正确性,然后把使用了泛型的代码翻译或重写成可以执行在当前JVM上的非泛型代码。这个技术被称为“ 类型擦除”。换句话说,编译器会擦除所有尖括号里的类型信息,来保证更早版本的JRE的兼容性
List<String> mylist = new ArrayList<String>(10);编译后成为了:
List mylist = new ArrayLit(10);