1. 什么叫对象序列化,什么是反序列化,啥情况要实行序列化
- 对象序列化,将对象中的数据编码为字节序列的过程。
- 反序列化:将对象的编码字节重新反向解码为对象的过程。
- 当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。
2. 什么是反射机制?
反射简单来说,就是动态加载对象,并对对象进行剖析。在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
3. this和super关键字的区别
- .属性的区别:
(1)this访问本类中的属性,如果本类没有这个属性则访问父类中的属性。
(2)super访问父类中的属性。 - .方法的区别:
(1)this访问本类中的方法,如果本类没有这个方法则访问父类中的方法。
(2)super访问父类中的方法。 - 构造的区别:
(1)this调用本类构造构造,必须放在构造方法的首行。
(2)super调用父类构造,必须放在子类构造方法首行。
4. 反射机制的优缺点?
优点: 反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。
缺点:性能问题,使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。
5. 动态代理是什么,有什么应用
当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。具有解耦意义,灵活,扩展性强。
Spring的 AOP 功能模块就是采用动态代理的机制来实现切面编程,日志输出,事务
6. throw 和 throws 的区别?
throws是用来声明一个方法可能抛出的所有异常信息。
throw则是指抛出的一个具体的异常类型。
7. 常见异常?
- 算术异常类:ArithmeticExecption
- 空指针异常类:NullPointerException
- 类型强制转换异常:ClassCastException
- 操作数据库异常:SQLException
- 数组下标越界异常:ArrayIndexOutOfBoundsException
8. try-catch-finally 中哪个部分可以省略?
catch 可以省略
原因
更为严格的说法其实是:try只适合处理运行时异常,try+catch适合处理运行时异常+普通异常。也就是说,如果你只用try去处理普通异常却不加以catch处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必须用catch显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以catch可以省略,你加上catch编译器也觉得无可厚非。
理论上,编译器看任何代码都不顺眼,都觉得可能有潜在的问题,所以你即使对所有代码加上try,代码在运行期时也只不过是在正常运行的基础上加一层皮。但是你一旦对一段代码加上try,就等于显示地承诺编译器,对这段代码可能抛出的异常进行捕获而非向上抛出处理。如果是普通异常,编译器要求必须用catch捕获以便进一步处理;如果运行时异常,捕获然后丢弃并且+finally扫尾处理,或者加上catch捕获以便进一步处理。
至于加上finally,则是在不管有没捕获异常,都要进行的“扫尾”处理。
9. 常见异常处理方式
- 直接抛出异常
- 封装异常再抛出
- 捕获异常
- 自定义异常
- try-catch-finally
10. jvm如何捕获异常
在编译生成的字节码中,每个方法都会有一个异常表。异常表的每一条都代表一个异常处理器。有from指针,to指针、target指针和锁捕获的异常类型构成。这下指针的值是字节码索引bci,用来定位字节码。from和to指针标示了异常处理器要监控的范围,即try代码块的内容。target指针则是catch代码块的起始位置。当发生异常时,jvm会从上至下遍历所有的数据,当触发异常的字节码索引在某个from-to范围内,jvm就会判断抛出异常的类型和该条要捕获的异常的类型匹配的时候,jvm的控制流就会转向该catch块的字节码。如果遍历完之后还没找到对应的类型,jvm就会沿着调用栈向上执行同样的操作。在最坏的情况下,jvm会遍历这个调用栈的每一个调用者。