异常 接口和抽象类
接口
接口的变量是默认是public static final
一个类可以实现多个接口
一个类实现接口必须实现接口的所有方法 可以多继承
抽象类
- 抽象可以有自己的变量
- 抽象类可以有自己的方法
- 可以包含静态方法 单继承
- 抽象的方法不需要全部实现 也就是适配器模式
异常
分为运行异常和检查异常
空指针异常 数组越界异常
IO异常 sql 异常
反射
解释:通过类名获得类的方法和属性,它的产生是满足动态编译。
反射有三种方式
forName
l类的class
对象的getClass
序列化
(1)Java序列化就是指把Java对象转换为字节序列的过程
Java反序列化就是指把字节序列恢复为Java对象的过程。
final finally finalize
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源
请解释hashCode()和equals()方法有什么联系?
相等的对象必须有相等的hashcode
有相同的hashcode 不一定相等 hash算法会有冲突
泛型擦除
1 | public class Foo { |
报方法签名重复错误
List
、List 擦除后的类型为 List。 List
、List [] 擦除后的类型为 List[]。 List<? extends E>、List<? super E> 擦除后的类型为 List
。 List<T extends Serialzable & Cloneable> 擦除后类型为 List
。 Java 为什么这么处理呢?有以下两个原因:
避免 JVM 的大换血。如果 JVM 将泛型类型延续到运行期,那么到运行期时 JVM 就需要进行大量的重构工作了,提高了运行期的效率。
版本兼容。 在编译期擦除可以更好地支持原生类型(Raw Type)。
明白了 Java 泛型是类型擦除的,下面的问题就很好理解了:
无法声明泛型数组
1 | // 这种报错 |
泛型的理解
要理解泛型首先要立即泛型擦除,java字节码不包含泛型类型信息,使用泛型的时候会变编译器擦除,这个过程就叫泛型擦除。泛型的附加类型JVM是不可见的。它和C++的模板类型是有区别的
泛型是没有.class 对象
声明不同的泛型实例 泛型类只会被加载一次
1
2
3
4ArrayList<String> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
//jvm 只会加载一次ArrayList
泛型的参数类型不能用在java 处理异常中
###