1. 泛型

java的泛型是编译期间的而非运行期间

1.1 泛型和Object有什么区别?

泛型和Object在使用上区别不大,但是泛型在使用时不需要做强制类型转换,编译时更安全
如果使用Object类的话,你没法保证返回的类型一定是需要的类型,也许是其它类型
这时你就会在运行时得到一个类型转换异常(ClassCastException)

1.2 你做过的项目中,有没有用过泛型,怎么使用的?

  1. 首先泛型的意义就你不确定对象的具体类型,当我们遇到这种情况都可以使用泛型
  2. 比较经典的是场景有
    1. 在定义统一的返回对象的时候
    2. 分页对象
    3. 对象的序列化工具类

      2. 注解

      2.1 JDKk中自带的元注解

      1. // 代表一个类过时了,这个时候子类或者实现类可以不用重写,实例化对象调用会警告
      2. @Deprecated
      3. // 重写父类的或者接口的方法
      4. @Override
      5. // 忽略某个警告
      6. @SuppressWarnings("unchecked")
      7. public void demo(){}

      2.2 注解的分类

      按照运行机制:源码注解、编译时注解、运行时注解

      2.3 自定义注解

      ```java @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface demo { // @interface:定义一个注解 String desc(); String author(); int age() default 18; // 可以给一个默认值 }

/*

  • 1、成员类型是有限的:基本的数据类型 + string + Class + Annotation + Enumeration *
  • 2、如果注解只有一个成员,则成员必须取名为value(),使用的时候可以忽略成员名和赋值号(=) *
  • 3、注解类可以没有成员,没有成员的注解称为标识注解
  • 4、成员是以无参无异常的方式声明 *
  • target:标识注解的作用域,具体的类型直接点进去源码看,里面是一个数组可以同时填写多个作用域
  • retention:标识注解的生命周期/运行周期,参考上面的注解的分类
  • inherited:标识注解,标识允许子类继承
  • documented :生成Javadoc的时候会包含注解的信息 *
  • */ ```

    2.4 注解实战

    3. 反射


  1. 参考文献
    1. https://blog.csdn.net/sinat_38259539/article/details/71799078
    2. https://www.cnblogs.com/josiah/p/5611390.html

反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象都可以任意的调用它的方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

4. lambad & Stream

5. Java中的四大引用


  1. 参考文献

    1. https://coding.imooc.com/lesson/303.html#mid=21325

      5.1 引用的认知

  2. 不管是什么级别的引用,当对象被GC的标记算法,标记为垃圾都是要被回收的

    5.1 强引用

  3. 英文:strong reference

  4. 它是最常见,也是最普遍的引用:Object o = new Onject();
  5. 系统宁愿抛出内存溢出错误(out of memory error),终止程序也不会回收强引用对象
  6. 通过将对象设置为null,来弱化引用,使其被回收;或者超出它的生命周期被GC回收

    5.2 软引用

  7. 英文:soft reference

  8. 对象处在有用但是非必须的状态
  9. 只有当内存空间不足的时候,GC会回收该引用的对象的内存
  10. 作用:可以用来实现基于内存的高速缓存,如果内存不足,直接丢弃缓存信息即可
  11. image.png

    5.3 弱引用

  12. 英文:weak reference

  13. 比软引用更弱一些,非必须的对象
  14. 只要JVM进行GC操作,不管对象是否还被使用,都会被回收
    1. 被回收的概率也很低,因为垃圾回收线程是一个优先级很低的线程
  15. 适用于偶尔使用,且不影响垃圾搜集的对象
  16. image.png
  17. 实际应用

    1. ThreadLocal中的map就是

      5.4 虚引用

  18. 英文:phantom reference

  19. 不会决定对象的生命周期
  20. 任何时候都可能被垃圾收集器回收
  21. 跟踪对象被垃圾收集器回收的活动,启哨兵作用
  22. 必须和引用队列ReferenceQueue联合使用
  23. image.png

    5.5 引用队列

  24. 英文:reference queue

    抽象类和接口的区别

    相同点:
    1、都是抽象类型。
    2、都可以有实现方法;
    3、都可以不需要实现类或者继承者去实现所有方法。
    4、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
    5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。(以前是)

不同点:
1、抽象类不可以多重继承,接口可以(接口和抽象类相比,最大的区别就在于子类上,接口的子类可以同时实现多个接口,但抽象类的子类只能实现单根继)。
2、抽象类要被子类继承,接口要被类实现。
3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量
4、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
抽象类里可以没有抽象方法
如果一个类里有抽象方法,那么这个类只能是抽象类
抽象方法要被实现,所以不能是静态的,也不能是私有的。

特别是对于公用的实现代码,抽象类有它的优点。抽象类能够保证实现的层次关系,避免代码重复。然而,即使在使用抽 象类的场合,也不要忽视通过接口定义行为模型的原则。从实践的角度来看,如果依赖于抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为能够更有效地分离行为与实现,为代码的维护和修改带来方便。