返回文章列表

Java核心基础

类与对象进阶(继承/多态/反射/异常/注解)

类与对象进阶(继承/多态/反射/异常/注解)

一、类继承

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 文件中,运行时不可获取​​:运行时保留,可通过反射获取
  • :主要是作用目标和保留策略不同