Java 基础总结
JVM 层面看 .java 文件到最终执行流程
step1: 编译器把 .java 文件编译成 字节码(二进制)
step2: 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型
(加载-》验证-〉准备-》解析-〉初始化-》使用-〉拆卸)
step3: 虚拟机执行字节码
ClassLoader 中与加载类相关的方法
getParent()
返回该类加载器的父类加载器。
loadClass(String name)
加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。
findClass(String name)
查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。
findLoadedClass(String name)
查找名称为 name 的已经被加载过的类,返回的结果是 java.lang.Class 类的实例。
defineClass(String name, byte[] b, int off, int len)
把字节数组 b 中的内容转换成 Java 类,返回的结果是 java.lang.Class 类的实例。这个方法被声明为 final 的。
resolveClass(Class<?> c)
链接指定的 Java 类。
Java 反射提供哪几种功能
- 方法
- 执行方法
- 注解
- 数组
- 属性(字段)
- 构造器
Java static final
- static final 和 final static 没有区别,一般在 static 写在前面
final
- final 关键字可以用于成员变量,局部变量,方法以及类。
- final 成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会编译错误。
- 不能够对 final 变量再次赋值。
- 局部变量必须在声明时赋值。
- 在匿名类中所有的变量都必须是 final 变量
- final 方法不能被重写
- final 类不能被继承
接口和抽象类区别
接口
- 接口是对行为的抽象,他是抽象方法的集合 (所以说接口方法本来就是抽象方法)
- 接口实现使用implements关键字
- Java 8 之后,接口也可以通过关键字 default 有默认实现
- 接口的修饰符只能是 public
- 接口只能继承其他接口
- 接口可以多继承而类不能多继承
抽象类
- 抽象类不能被实例化
- 抽象类的实现是继承(extends)
- 抽象类除了不可以被实例化之外,跟类基本没什么区别
- 抽象方法的修饰符只能是 public protected
- 抽象方法可以继承和实现其他接口或者抽象类
实际应用中接口和抽象类的选择
- 如果一个类不需要实例化,可以优先使用抽象类。比如 Spring 的 BeanUtils 就是一个抽象类,里面的所有方法都是 static,而且提供默认实现(因为抽象类和类,除了能不能被实例化之外,其他没有什么区别);
- 如果,你想多重继承,那么必须使用接口来实现。
instanceof
判断左边对象是否是右边对象的实例,如果是的话,就返回 true。否的话就返回 false。