四.JAVA基础面试题:重要知识
1.为什么JAVA只有值传递
2.JAVA获取运行时类的四种方式
3.动态代理和静态代理的对比
4.unsafe是什么
5.泛型擦除机制出现的问题?
四.JAVA基础面试题:重要知识
1.为什么JAVA只有值传递
- 实参:传递给形参的实际参数。
形参:接受实参的参数。 - 值传递:方法接受实参并且形参生成拷贝。
引用传递:方法接受实参且形参是实参变量的地址,不生成拷贝,相当于是给实参的引用变量起别名 - JAVA只有值传递
引用类型传过去也为地址值,生成副本。
基本类型传过去为字面量,生成副本。
2.JAVA获取运行时类的四种方式
- 类.class
- class.ForName
- 实例.getClass
- 类加载器.loadClass
3.动态代理和静态代理的对比
- ①静态代理
定义接口,定义实现接口的被代理类,定义实现接口的代理类(内置被代理类) - ②动态代理
-
jdk动态代理(代理实现了接口的类)
Proxy.newProxyInstance(loader,interfaces,invocationhandler)
invocationhandler要重写invoke方法,参数proxy为代理类,method为被代理类的原生方法,args为传入的参数。动态代理调用方法实际调用invoke方法。 -
CGLIB动态代理(JDK只能代理实现接口的类,其可以通过继承实现代理,被代理类类不需要实现接口)
-
- ③对比静态代理和动态代理。
动态代理更加灵活,不需要写死代码。
动态代理是在运行时动态生成字节码文件并加载到JVM中,而静态代理编译时就将代理类编译为字节码文件。
4.unsafe是什么
- unsafe是不安全操作的方法
可以直接访问内存资源,自主管理内存资源等。
依赖本地方法(native)。
5.泛型擦除机制出现的问题?
- 泛型无法用在重载方法的参数中(擦除后参数会相同)
- 泛型无法用在catch中的异常中(擦除后两个异常会相同)
- 泛型类中存在静态变量(不同泛型参数公用一份静态变量)