java基础

异常 接口和抽象类

  • 接口

    • 接口的变量是默认是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
2
3
4
5
6
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

    Java 为什么这么处理呢?有以下两个原因:

避免 JVM 的大换血。如果 JVM 将泛型类型延续到运行期,那么到运行期时 JVM 就需要进行大量的重构工作了,提高了运行期的效率。
版本兼容。 在编译期擦除可以更好地支持原生类型(Raw Type)。

明白了 Java 泛型是类型擦除的,下面的问题就很好理解了:

无法声明泛型数组

1
2
3
4
5
6
7
// 这种报错
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 对象

  • 声明不同的泛型实例 泛型类只会被加载一次

    • 1
      2
      3
      4
      ArrayList<String> list1 = new ArrayList<>();

      ArrayList<Integer> list2 = new ArrayList<>();
      //jvm 只会加载一次ArrayList
  • 泛型的参数类型不能用在java 处理异常中

###

Donate comment here