类与对象进阶(继承/多态/反射/异常/注解)
一、类继承
Java 类是 ,C++ 类可以多继承,但两者都可以多派生(多层继承)。 接口可以 (一个类实现多个接口)。
重写(Override)
- 重写是指覆盖继承的父类方法
- 在重写的前提下,子类重写自己继承的父类方法,如果还想调用父类同名方法,需要加
- 示例:
构造器
- 如果父类构造方法需要参数,创建子类对象时需要给子类构造方法传参,然后子类构造方法需要在调用父类构造方法并传参()
- 创建子类对象时,父类对象一定优先创建
二、多态(Polymorphism)
- ,降低耦合度
- 工厂模式的核心:
- 通过内存图可知:方法的调用是被拷贝一份压入线程栈中 属于类,只有一份 在每个对象中都有一份非静态方法的调用一定依赖对象,必须先指定对象
- 的最终目的是符合多态, 就是做这个判定的
三、抽象类 vs 接口类
| 特性 | 抽象类 | 接口类 |
| 关键字 | | |
| 多继承 | 不支持 | 支持多实现 |
| 构造方法 | 可以有 | 不可以有 |
| 成员变量 | 可以有各种类型 | 只能是 常量 |
| 方法实现 | 可以有实现方法 | Java 8+ 可以有 default/static 方法 |
共同点
- 都不可以直接 对象,不可以产生自己类型对象,只能用于多态
- 无法通过第五章知识点获取抽象类和接口类的对象
- 只能通过获取他们子孙后代类的对象
接口多实现的冲突问题
- 如果实现的多个接口中有同名但不同返回类型的方法,会产生冲突
四、Object 类
Object 类是所有类的超类。面试常问全部方法及功能:
- 比较地址(引用是否指向同一对象)
- 怎么生成的?—— 根据内存地址或哈希算法生成
- 不同的对象有没有可能 hashCode 相同?—— (哈希碰撞)
- 不同的 hashCode,对象
- 默认返回:
- 通常需要重写
五、自动装箱/拆箱 & 128陷阱
- :(基本类型 → 包装类)
- :(包装类 → 基本类型)
- : 范围内,数字类型的包装类值相同指向相同对象(缓存池);超出范围,值相同也指向不同对象
Integer a = 100, b = 100; // a == b → true
Integer c = 200, d = 200; // c == d → false
六、枚举与单例
- 是面试重点(线程安全、双重检查锁等)
七、反射(Reflection)
可以获取类的一切信息
类名、全部属性、属性名字、属性类型、属性修饰、方法名、参数名、参数类型、返回类型、构造方法的一切信息、类注解、属性注解、方法注解、参数注解等能看到的一切信息
获取类的三种方式
-
-
- —
invoke 代理
- 反射出来的类型对象和方法对象,借助 完成调用
- 即可调用
Arrays.sort()
- 可以对任意类型的数组进行排序
- 如果对象类型属性较多,需要指定按照某种属性排序,需要类实现 接口
- 内部使用
八、动态代理(第六章)
- 动态代理的一部分,还有 CGLIB
- ——这两者不能有自己的对象
- 与第五章节(正常可以有自己对象的类)不同,两边的 所属类也不一样
- MyBatis、微服务的消费者内部实现都是用第六章的代理
九、异常(Exception)
- 异常可以用于
- 可以通过 把消息在线程内传出
- 异常信息可以在(同线程内可以跨方法传递)
- Spring 里面可以是哪一种?—— 也是面试点(RuntimeException 默认触发回滚)
throw vs throws
- :在方法体内抛出异常(实际抛出)
- :在方法声明上声明异常类型(声明可能抛出)
finally
- 的作用:无论是否发生异常,都会执行(资源释放)
- 和 的执行顺序:try → catch(如果有异常)→ finally
十、注解(Annotation)
- :修饰注解的注解(、、、)
- ()::源码阶段,编译时丢弃:编译到 class 文件中,运行时不可获取:运行时保留,可通过反射获取
- :主要是作用目标和保留策略不同