Java基础
- 什么是字节码?
jvm可以理解的代码(.class文件)
Java代码从源代码到运行过程:
java代码 -> javac编译器->.class字节码文件 -> 解释器&JIT(运行时编译器)->机器码
JIT编译器会将热点代码的机器码保存下来 - 什么是AOT编译模式
直接将字节码编译成机器码,避免了JIT预热的时间,为什么不全部使用AOT,和Java语言的动态特性有关,有些技术需要修改.class文件 - Java执行过程
- 成员变量和局部变量
成员变量如果没有赋初始值会自动赋默认值,局部变量如果没有赋初始值则不会自动赋值 - 重载和重写的区别
- 重载同一个类(或者子类和父类之间),方法名相同,参数类型不同,个数不同,顺序不同,放回值和修饰符可以不同
- 重写发生在运行期,是子类对父类允许访问的方法的实现过程重写,方法名、参数列表必须相同。返回值比重写前的更小或相同,异常范围更小或相同,访问修饰符更大或相同
- private/final/static方法不能被重写
- 构造方法不能被重写
- 面向对象三大特征
封装、继承、多态
- 多态的具体表现为父类的引用指向子类的实例
- 接口和抽象类有什么共同点和区别?
共同点:
- 都不能被实例化
- 都可以包含抽象方法
区别:
接口主要是对类的行为进行约束,提供一种规范。抽象类主要用于代码复用,强调所属关系。
一个类只能继承一个抽象类,但可以实现多个接口
Java中只有值传递
- 如果参数是基本类型的话,传递基本类型字面量值的拷贝
- 如果参数是引用类型,传递的是实参引用对象在堆地址之中的拷贝
Java序列化和反序列化
序列化协议对应于应用层
Java代理模式
使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
动态代理机制
jdk动态代理机制:invocationHandler接口和proxy类是核心
invocationHandler接口定义jdk动态代理类,重写invoke调用原生方法,自定义处理逻辑
proxy获取代理对象的工厂类
缺点:只能代理实现了接口的类
CGLIB动态代理机制:MethodInterceptor 接口和 Enhancer 类是核心。
自定义 MethodInterceptor 并重写 intercept 方法,
通过 Enhancer 类的 create()创建代理类