泛型
泛型的本质是为了参数化类型。在泛型使用过程中,操作的数据类型被指定为一个参数,在调用的时候指明具体类型,适用于代码复用。常用的方式分为泛型类、泛型接口、泛型方法。
泛型上下限:为传入的泛型类型实参进行上下边界的限制
<? extends Number> <? super string>
类型擦除:java在编译阶段将泛型擦除,替换为具体的类型,就好像不存在泛型一样。擦除时不存在任何限制就转为Object,存在上界转为上界,存在下界转为object
通配符:?(不确定的java类型)T,KV,E
在实际项目中,定义通用返回结果CommonResult<T>动态指定结果类型
异常
- try、catch和finally都不能单独使用,只能是try-catch、try-finally或者try-catch-finally。
- try语句块监控代码,出现异常就停止执行下面的代码,然后将异常移交给catch语句块来处理。
- finally语句块中的代码一定会被执行,常用于回收资源 。
- throws:声明一个异常,告知方法调用者。
- throw :抛出一个异常,至于该异常被捕获还是继续抛出都与它无
反射
JAVA反射机制是在运行状态中,对于任意一个类或者对象,都能够知道或调用它的任意一个方法和属性;
Class类是类的一种,每个通过class关键字标识的类,在内存中有一个对应的Class对象描述其信息,反射就是获取Class对象及其内部信息以控制实例对象。
获取Class:
- 根据类名:类名.class
- 根据对象:对象.getClass()
- 根据全限定类名:Class.forName(全限定类名)
Class类对象有一系列的方法,可以获取类名、接口、成员变量,Constructor对象,Field对象,Method对象等可以实现对类或对象的操作
应用场景:注解机制
注解
注解本质是一个继承了Annotation
的特殊接口,用于修饰类、方法或者变量
注解声明为@interface,不能继承和实现其他接口,通过反射机制获取annotation对象。注解的参数成员都是public或者默认的
用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联
四种元注解(写自定义注解用到)
@document
@target作用域
@inherited子类是否使用该注解
@retention生命周期
@Target(ElementType.FIELD)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface FruitName {
//参数成员只能是public 和 默认
//成员参数不能是自定义的类型
String value() default "";
}
IO流
try with resoures处理需要关闭资源的异常
序列化和反序列化:需要将java对象存储在文件或者在网络中进行传输,需要将其序列化为二进制数据
objectwriteStream和ObjectReadStream实现
transient关键字修饰的变量不能被序列化,反序列化得到默认值
Stream字节操作 Reader/Writer字符操作 加上Buffer缓冲区 目标对象object,file
java的值传递
值传递:会创建副本,方法接受的是实参的拷贝
值得注意,java对引用类型传递的是地址(也是值传递),也会创建副本。指向同一对象
引用传递:传递的是实参的地址,不会创建副本,对形参修改影响实参
BigDecimal
优先使用字符串的构造方法,或者BigDecimal.valueof()
基本数据类型不用==比较,包装器不用.equals比较,而采用BigDecimal运算和.equals