Claude Opus 5.5(High)#
面向对象的术语可以分成几组:基本单元、核心特性、继承相关、类之间的关系、设计原则。最后是重构,它其实不属于面向对象,后面单独讲。下面用一个例子贯穿始终。
abstract class Animal { // 抽象类
private String name; // 字段(属性),private = 封装
public Animal(String name) { // 构造函数
this.name = name;
}
public String getName() { return name; }
public abstract String speak(); // 抽象方法:只声明,不实现
}
class Dog extends Animal implements Pet { // 继承 Animal,实现 Pet 接口
public Dog(String name) { super(name); } // super 调用父类构造
@Override
public String speak() { return "汪"; } // 重写
public void eat() { } // 重载:同名不同参
public void eat(String food) { }
}
interface Pet { } // 接口
Animal a = new Dog("旺财"); // 对象 / 实例
a.speak(); // 多态:运行时调用 Dog 的版本一、基本单元#
- 类(Class):模板,相当于图纸。
Animal、Dog都是类。 - 对象 / 实例(Object / Instance):按图纸造出来的具体东西。
new Dog("旺财")就是一个实例。"实例化"指从类创建对象的过程。 - 属性 / 字段(Field / Attribute):对象持有的数据,比如
name。 - 方法(Method):对象能做的事,比如
speak()。 - 构造函数(Constructor):创建对象时自动执行,负责初始化。
- 静态成员(static):属于类本身,不属于某个具体对象。所有实例共享一份,不用
new就能调用。 - this / self:指"当前这个对象自己"。
二、四大特性(面试最常问)#
- 封装(Encapsulation):把数据藏起来(
private),只通过方法对外开放(getName())。目的是外部不能乱改内部状态。- 配套的是访问修饰符:
public谁都能用,protected自己和子类能用,private只有自己能用。
- 配套的是访问修饰符:
- 继承(Inheritance):子类自动获得父类的属性和方法,再加上自己的。
Dog extends Animal,表达的是"狗是一种动物"(is-a 关系)。- 父类也叫基类、超类;子类也叫派生类。
- 多态(Polymorphism):同一个调用,作用在不同对象上,表现不同。变量类型写的是
Animal,a.speak()实际执行哪个版本,看运行时它到底是 Dog 还是 Cat。- 子类对象当父类用叫向上转型;反过来强转回子类叫向下转型。
- 抽象(Abstraction):只暴露"做什么",隐藏"怎么做"。抽象类和接口就是它的工具。
三、继承相关(最容易混的一组)#
- 重写 / 覆盖(Override):子类重新实现父类已有的方法,方法名、参数完全一样。
Dog的speak()就是。它是多态的基础。 - 重载(Overload):同一个类里有多个同名方法,参数不同。两个
eat就是。它和继承无关,编译时就能确定调用哪个。 - super:在子类里调用父类的东西。
- 抽象类(Abstract Class):不能直接
new,可以有部分实现,留一些抽象方法给子类补全。 - 接口(Interface):纯粹的"能力契约",规定必须有哪些方法。一个类只能继承一个父类,但可以实现多个接口。
- 多重继承:一个类同时继承多个父类。C++ 支持,Java/C# 不支持(用接口代替),因为会引出"菱形继承"问题:两个父类有同名方法,不知道该用哪个。
四、类与类之间的关系#
由弱到强:
- 依赖(Dependency):临时用一下,比如方法参数里出现了另一个类。
- 关联(Association):长期持有对方的引用,比如学生和老师。
- 聚合(Aggregation):整体和部分,但部分可以独立存在,比如班级和学生。
- 组合(Composition):整体和部分,部分随整体一起生灭,比如人和心脏。
- 继承:is-a,耦合最强。
有句常听到的话叫"组合优于继承":能用"有一个"(has-a)解决的,就别用"是一个"(is-a),因为继承把父子类绑得太死。
五、设计层面#
- 耦合(Coupling):类之间互相依赖的程度,越低越好。
- 内聚(Cohesion):一个类内部的东西是否都围绕同一件事,越高越好。
- SOLID 原则:
- 单一职责:一个类只干一件事。
- 开闭原则:对扩展开放,对修改关闭。
- 里氏替换:子类必须能无缝替代父类。
- 接口隔离:接口要小而专。
- 依赖倒置:依赖抽象,不依赖具体实现。
- 设计模式(Design Pattern):前人总结的常见问题的标准解法,比如单例、工厂、观察者、策略。
六、重构(Refactoring)#
严格说它不是面向对象的术语,而是一种开发实践:不改变代码的外部行为,只改善内部结构。常见手法有提取方法、重命名、拆分大类、用多态替代一长串 if/else。判断标准很简单:重构前后,所有测试结果必须完全一样。
最容易混的三个#
| 重写 Override | 重载 Overload | 重构 Refactor | |
|---|---|---|---|
| 发生在哪 | 父类与子类之间 | 同一个类内 | 整个代码库 |
| 方法签名 | 完全相同 | 同名,参数不同 | 不相关 |
| 目的 | 实现多态 | 方便调用 | 改善结构 |
| 何时确定 | 运行时 | 编译时 | 不涉及 |
检验一下:如果 Dog 里再写一个 public String speak(int times),它算重写还是重载?为什么?