接口和抽象类 接口 接口的变量是默认是public static final 一个类可以实现多个接口 一个类实现接口必须实现接口的所有方法 可以多继承 抽象类 抽象可以有自己的变量 抽象类可以有自己
接口和抽象类
- 接口
- 接口的变量是默认是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算法会有冲突
泛型擦除
public class Foo {public void listMethod(List<String> stringList){
}
public void listMethod(List<Integer> intList) {
}
}
报方法签名重复错误
- List、List 擦除后的类型为 List。
- List、List[] 擦除后的类型为 List[]。
- List<? extends E>、List<? super E> 擦除后的类型为 List。
- List<T extends Serialzable & Cloneable> 擦除后类型为 List。
避免 JVM 的大换血。如果 JVM 将泛型类型延续到运行期,那么到运行期时 JVM 就需要进行大量的重构工作了,提高了运行期的效率。
版本兼容。 在编译期擦除可以更好地支持原生类型(Raw Type)。
明白了 Java 泛型是类型擦除的,下面的问题就很好理解了:
无法声明泛型数组
// 这种报错List<String>[] list = new List<String>[];
List<List<Integer>> list = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
list1.add(2);
list.add(list1);
泛型的理解
要理解泛型首先要立即泛型擦除,java字节码不包含泛型类型信息,使用泛型的时候会变编译器擦除,这个过程就叫泛型擦除。泛型的附加类型JVM是不可见的。它和C++的模板类型是有区别的
- 泛型是没有.class 对象
- 声明不同的泛型实例 泛型类只会被加载一次
ArrayList<Integer> list2 = new ArrayList<>();
//jvm 只会加载一次ArrayList
- 泛型的参数类型不能用在java 处理异常中