异常
Error与Exception的区别
一个是错误, 一个是异常
异常可以在处理区域处理, 错误直接停止运行
异常不处理也会停止运行
Try-catch-finally的执行问题
finally中的代码不一定执行
- 程序所在的线程死亡。
- 关闭 CPU。
泛型
传入不定数据类型进行方法计算
ArrayList<E>extendsAbstractList<E>
这里面的 E 可以是任何一种基本数据类型或者包装类型
使用方式:泛型类, 泛型接口, 泛型方法
泛型类
实例化时需要指定泛型数据的具体类型
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{
private T key;
public Generic(T key) {
this.key = key;
}
public T getKey(){
return key;
}
}
// 实例化
Generic<Integer> genericInteger = new Generic<Integer>(123456);
泛型接口
接口可以在实现时不指定泛型数据类型
public interface Generator<T> {
public T method();
}
// 不指定类型
class GeneratorImpl<T> implements Generator<T>{
@Override
public T method() {
return null;
}
}
// 指定类型
class GeneratorImpl<T> implements Generator<String>{
@Override
public String method() {
return "hello";
}
}
泛型方法
常用, 可以更普及的方法
public static < E > void printArray( E[] inputArray )
{
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
//使用
// 创建不同类型数组:Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3 };
String[] stringArray = { "Hello", "World" };
printArray( intArray );
printArray( stringArray );
注意静态泛型方法不能使用类上声明的泛型
就是在泛型类中的静态泛型方法需要重新写一个E 而不是 T
*反射
是什么
在 Java 中,反射是指在运行时检查、获取和操作类的信息的能力。
就在运行时获取类的属性、方法和构造函数等信息,以及动态调用类的方法、创建类的实例等操作,而不需要在编译时就确定这些信息
人话: 就是把java类中的各种成分映射成Java对象
在运行期间可以获取一个对象的全部信息
是java实现底层逻辑的一部分
它允许程序在运行时检查类的信息、实例化对象、调用方法、获取或设置字段的值等
反射与反编译
两个不同概念, 反射是实现底层逻辑
反编译是把调用库中的方法反推出来
将已编译的程序(通常是机器码或者字节码)转换回其源代码的过程。在Java中,通常情况下,将.class文件(包含Java字节码)反编译为Java源代码
SPI与API
spi接口由调用方定义
API接口由定义方定义
序列化与反序列化
- 序列化: 将数据结构或对象转换成二进制字节流的过程
- 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程
序列化不是针对String, 而是针对对象! [ 但是 String.getbyte() 是转换字符串为字节码 ]
序列化在应用层完成, 实际上是在osi七层模型中的表示层
需要序列化的情况
- 持久化存储, 需要转换为字节码才能把对象存储在文件或者数据库中
- 网络传输, 在网络上传输必须转化为字节码才能进行传输
- 深拷贝, 拷贝分为深拷贝和浅拷贝, 需要反序列化
- 浅拷贝:浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存
- 深拷贝:深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。
I/O流
是什么?
- 输入输出流, Input和output
- 分为字节流和字符流
- 最常用的类就是
- inputstream 和 outputstream [ 输入输出字节流 ]
- Reader 和 writer [ 输入输出字符流 ]