一、核心概念与特性
- 四大基本特性
· 封装:将数据和操作数据的方法绑定在一起
public class Student {
private String name; // 数据隐藏
// 对外提供访问接口
public String getName() {
return name;
}
}
· 继承:子类复用父类的属性和方法
class Animal {
void eat() { System.out.println("Eating"); }
}
class Dog extends Animal { // 继承
void bark() { System.out.println("Barking"); }
}
· 多态:同一接口,多种实现
// 编译时多态(重载)
void print(int i) { }
void print(String s) { }
// 运行时多态(重写)
Animal myDog = new Dog(); // 向上转型
myDog.eat(); // 动态绑定到Dog的eat方法
· 抽象:提取共性,隐藏细节
abstract class Shape {
abstract double area(); // 抽象方法
}
- 类与对象的关系
类(Class):蓝图、模板
↓ 实例化
对象(Object):具体的实例
二、高级概念与机制
- 构造与析构
· 构造函数链(构造函数调用顺序)
· 复制构造函数(深拷贝 vs 浅拷贝)
· 析构函数与资源管理(RAII原则)
- 访问控制
修饰符 类内 包内 子类 包外
private ✓ ✗ ✗ ✗
default ✓ ✓ ✗ ✗
protected ✓ ✓ ✓ ✗
public ✓ ✓ ✓ ✓
- 静态成员
· 类属性/类方法 vs 实例属性/实例方法
· 静态代码块与初始化顺序
- 接口与抽象类的对比
// 接口:完全抽象,多重继承
interface Flyable {
void fly(); // 默认public abstract
default void land() { } // Java8默认方法
}
// 抽象类:部分实现,单继承
abstract class Bird {
abstract void sing();
void eat() { } // 可以有具体方法
}
三、设计原则(SOLID)
- 单一职责原则(SRP)
· 一个类只负责一项职责
- 开闭原则(OCP)
· 对扩展开放,对修改关闭
// 使用策略模式实现OCP
interface Payment {
void pay();
}
class CreditCardPayment implements Payment { }
class PayPalPayment implements Payment { }
- 里氏替换原则(LSP)
· 子类必须能够替换父类
· 前置条件不能强化,后置条件不能弱化
- 接口隔离原则(ISP)
· 建立单一接口,避免臃肿接口
- 依赖倒置原则(DIP)
· 高层模块不依赖低层模块,二者都依赖抽象
// 依赖注入实现
class UserService {
private UserRepository repository; // 依赖抽象
public UserService(UserRepository repo) {
this.repository = repo;
}
}
四、关键设计模式
- 创建型模式
· 工厂模式:隐藏对象创建细节
· 单例模式:确保一个类只有一个实例
// 双重检查锁实现单例
class Singleton {
private static volatile Singleton instance;
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
- 结构型模式
· 适配器模式:接口转换
· 装饰器模式:动态添加功能
· 组合模式:树形结构处理
- 行为型模式
· 策略模式:算法族封装
· 观察者模式:发布-订阅机制
· 模板方法模式:定义算法骨架
五、高级特性
- 反射机制
// Java反射示例
Class<?> clazz = Class.forName("com.example.User");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("setName", String.class);
method.invoke(obj, "Alice");
- 泛型编程
· 类型参数化
· 类型擦除与通配符(<? extends T>, <? super T>)
- 注解与元编程
// 自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecution {
String value() default "";
}
- 内存管理与垃圾回收
· 对象生命周期
· 引用类型(强、软、弱、虚)
· GC算法(标记清除、复制、分代收集)
六、面向对象设计质量指标
- 内聚性与耦合度
· 高内聚:类内部元素关联紧密
· 低耦合:类之间依赖关系弱
- 设计度量
· 继承深度:避免过深继承树
· 方法复杂度:圈复杂度控制
· 类职责:LCOM(缺少内聚方法数)
- 设计坏味道
· 上帝类(God Class)
· 长方法(Long Method)
· 循环依赖(Circular Dependency)
· 霰弹式修改(Shotgun Surgery)
七、UML建模
- 核心图例
类图:类结构、关系
时序图:对象交互时序
状态图:对象状态转换
用例图:系统功能边界
- 关系类型
· 关联(Association)
· 依赖(Dependency)
· 聚合(Aggregation)◇
· 组合(Composition)◆
· 泛化(Generalization)△
· 实现(Realization)---▷
八、实践要点
- 对象设计最佳实践
// 1. 优先使用组合而非继承
class Car {
private Engine engine; // 组合
// 而非 extends Engine
}
// 2. 接口编程
List<String> list = new ArrayList<>(); // 面向接口
// 3. 不可变对象设计
public final class ImmutablePoint {
private final int x;
private final int y;
public ImmutablePoint(int x, int y) {
this.x = x;
this.y = y;
}
}
- 测试策略
· 单元测试:针对单个类
· 集成测试:类间交互
· Mock对象:依赖隔离
九、各语言特性对比
特性 Java C++ Python JavaScript
多重继承 接口实现 支持 Mixin Prototype链
访问控制 严格 严格 约定 无
垃圾回收 有 手动/智能指针 有 有
反射 强 有限 强 强
总结
面向对象思想不仅是编程技术,更是一种思维方式。掌握这些专项知识点需要:
-
理解原理:不止记住语法,要理解背后的设计思想
-
实践验证:通过项目实践加深理解
-
持续重构:运用设计原则改善代码质量
-
模式识别:识别场景并应用合适的设计模式
记住:面向对象的终极目标是创建高内聚、低耦合、易维护、可扩展的软件系统。