编译时与运行时
2018-09-17 本文已影响33人
BestbpF
简述
编译时与运行时使我们在使用学习Java中经常会遇到的概念,那么什么是编译时,什么又是运行时呢?
- 编译时,就是将我们编写的.java文件编译为机器可以识别的.class字节码文件
- 运行时,就是将.class文件装载到JVM内存中并生成对应的Class类的过程
(这里描述的比较简略,如有错误,谢谢指出!)
举例
【方法重载】
方法重载发生在编译时,被称为编译器多态,编译器可以根据参数类型选择调用哪个方法
【方法覆盖(重写)】
方法覆盖发生在运行时,被称为运行时多态,如下列代码所示
public class A {
public void hello() {
System.out.println("Hello A!");
}
}
public class B extends A {
@Override
public void hello() {
System.out.println("Hello B!");
}
}
public void test(A ref){
ref.hello();
}
编译期无法知道test方法传入的参数是A还是B,因此无法决定调用哪个hello方法,只有传入ref进入运行时才能够决定调用哪个hello方法
【泛型(类型校验)】
泛型发生在编译期,编译期通过泛型判断程序中类型的正确性,如
List<String> list = new ArrayList<String>();
传入非String类型则会报错
进入运行时,泛型会被擦除,这种技术被称为【类型擦除】
【注解】
自定义注解时,可以设置编译时或者运行时,下面介绍几个常用的注解
【@Override】
@Override注解用于标注一个重写的方法,它是一个简单的编译时注解,目的也很简单,就是防止你写错方法名称,参数等,因为重写方法与原方法必须一致,你写错了就会提示报错信息
【@Test】
JUnit框架中使用该注解来在运行时反射调用测试类的方法
【异常】
Exception也有运行时异常(RuntimeException)和编译时异常(checked exception)之分