1. 泛型
1.1 泛型和Object有什么区别?
泛型和Object在使用上区别不大,但是泛型在使用时不需要做强制类型转换,编译时更安全
如果使用Object类的话,你没法保证返回的类型一定是需要的类型,也许是其它类型
这时你就会在运行时得到一个类型转换异常(ClassCastException)
1.2 你做过的项目中,有没有用过泛型,怎么使用的?
- 首先泛型的意义就你不确定对象的具体类型,当我们遇到这种情况都可以使用泛型
- 比较经典的是场景有
- 在定义统一的返回对象的时候
- 分页对象
- 对象的序列化工具类
2. 注解
2.1 JDKk中自带的元注解
// 代表一个类过时了,这个时候子类或者实现类可以不用重写,实例化对象调用会警告
@Deprecated
// 重写父类的或者接口的方法
@Override
// 忽略某个警告
@SuppressWarnings("unchecked")
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. 反射
- 参考文献
反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象都可以任意的调用它的方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
4. lambad & Stream
5. Java中的四大引用
参考文献
不管是什么级别的引用,当对象被
GC
的标记算法,标记为垃圾都是要被回收的5.1 强引用
英文:
strong reference
- 它是最常见,也是最普遍的引用:
Object o = new Onject();
- 系统宁愿抛出内存溢出错误
(out of memory error)
,终止程序也不会回收强引用对象 通过将对象设置为
null
,来弱化引用,使其被回收;或者超出它的生命周期被GC
回收5.2 软引用
英文:
soft reference
- 对象处在有用但是非必须的状态
- 只有当内存空间不足的时候,GC会回收该引用的对象的内存
- 作用:可以用来实现基于内存的高速缓存,如果内存不足,直接丢弃缓存信息即可
-
5.3 弱引用
英文:weak reference
- 比软引用更弱一些,非必须的对象
- 只要JVM进行GC操作,不管对象是否还被使用,都会被回收
- 被回收的概率也很低,因为垃圾回收线程是一个优先级很低的线程
- 适用于偶尔使用,且不影响垃圾搜集的对象
实际应用
英文:
phantom reference
- 不会决定对象的生命周期
- 任何时候都可能被垃圾收集器回收
- 跟踪对象被垃圾收集器回收的活动,启哨兵作用
- 必须和引用队列
ReferenceQueue
联合使用 -
5.5 引用队列
-
抽象类和接口的区别
相同点:
1、都是抽象类型。
2、都可以有实现方法;
3、都可以不需要实现类或者继承者去实现所有方法。
4、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。(以前是)
不同点:
1、抽象类不可以多重继承,接口可以(接口和抽象类相比,最大的区别就在于子类上,接口的子类可以同时实现多个接口,但抽象类的子类只能实现单根继)。
2、抽象类要被子类继承,接口要被类实现。
3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量
4、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
抽象类里可以没有抽象方法
如果一个类里有抽象方法,那么这个类只能是抽象类
抽象方法要被实现,所以不能是静态的,也不能是私有的。
特别是对于公用的实现代码,抽象类有它的优点。抽象类能够保证实现的层次关系,避免代码重复。然而,即使在使用抽 象类的场合,也不要忽视通过接口定义行为模型的原则。从实践的角度来看,如果依赖于抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为能够更有效地分离行为与实现,为代码的维护和修改带来方便。