泛型

泛型的本质是为了参数化类型。在泛型使用过程中,操作的数据类型被指定为一个参数,在调用的时候指明具体类型,适用于代码复用。常用的方式分为泛型类、泛型接口、泛型方法。

泛型上下限:为传入的泛型类型实参进行上下边界的限制

<? 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