基于面向对象的专项 知识点

一、核心概念与特性

  1. 四大基本特性

· 封装:将数据和操作数据的方法绑定在一起

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(); // 抽象方法

}

  1. 类与对象的关系

类(Class):蓝图、模板

↓ 实例化

对象(Object):具体的实例

二、高级概念与机制

  1. 构造与析构

· 构造函数链(构造函数调用顺序)

· 复制构造函数(深拷贝 vs 浅拷贝)

· 析构函数与资源管理(RAII原则)

  1. 访问控制

修饰符 类内 包内 子类 包外

private ✓ ✗ ✗ ✗

default ✓ ✓ ✗ ✗

protected ✓ ✓ ✓ ✗

public ✓ ✓ ✓ ✓

  1. 静态成员

· 类属性/类方法 vs 实例属性/实例方法

· 静态代码块与初始化顺序

  1. 接口与抽象类的对比

// 接口:完全抽象,多重继承

interface Flyable {

void fly(); // 默认public abstract

default void land() { } // Java8默认方法

}

// 抽象类:部分实现,单继承

abstract class Bird {

abstract void sing();

void eat() { } // 可以有具体方法

}

三、设计原则(SOLID)

  1. 单一职责原则(SRP)

· 一个类只负责一项职责

  1. 开闭原则(OCP)

· 对扩展开放,对修改关闭

// 使用策略模式实现OCP

interface Payment {

void pay();

}

class CreditCardPayment implements Payment { }

class PayPalPayment implements Payment { }

  1. 里氏替换原则(LSP)

· 子类必须能够替换父类

· 前置条件不能强化,后置条件不能弱化

  1. 接口隔离原则(ISP)

· 建立单一接口,避免臃肿接口

  1. 依赖倒置原则(DIP)

· 高层模块不依赖低层模块,二者都依赖抽象

// 依赖注入实现

class UserService {

private UserRepository repository; // 依赖抽象

public UserService(UserRepository repo) {

this.repository = repo;

}

}

四、关键设计模式

  1. 创建型模式

· 工厂模式:隐藏对象创建细节

· 单例模式:确保一个类只有一个实例

// 双重检查锁实现单例

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;

}

}

  1. 结构型模式

· 适配器模式:接口转换

· 装饰器模式:动态添加功能

· 组合模式:树形结构处理

  1. 行为型模式

· 策略模式:算法族封装

· 观察者模式:发布-订阅机制

· 模板方法模式:定义算法骨架

五、高级特性

  1. 反射机制

// Java反射示例

Class<?> clazz = Class.forName("com.example.User");

Object obj = clazz.newInstance();

Method method = clazz.getMethod("setName", String.class);

method.invoke(obj, "Alice");

  1. 泛型编程

· 类型参数化

· 类型擦除与通配符(<? extends T>, <? super T>)

  1. 注解与元编程

// 自定义注解

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface LogExecution {

String value() default "";

}

  1. 内存管理与垃圾回收

· 对象生命周期

· 引用类型(强、软、弱、虚)

· GC算法(标记清除、复制、分代收集)

六、面向对象设计质量指标

  1. 内聚性与耦合度

· 高内聚:类内部元素关联紧密

· 低耦合:类之间依赖关系弱

  1. 设计度量

· 继承深度:避免过深继承树

· 方法复杂度:圈复杂度控制

· 类职责:LCOM(缺少内聚方法数)

  1. 设计坏味道

· 上帝类(God Class)

· 长方法(Long Method)

· 循环依赖(Circular Dependency)

· 霰弹式修改(Shotgun Surgery)

七、UML建模

  1. 核心图例

类图:类结构、关系

时序图:对象交互时序

状态图:对象状态转换

用例图:系统功能边界

  1. 关系类型

· 关联(Association)

· 依赖(Dependency)

· 聚合(Aggregation)◇

· 组合(Composition)◆

· 泛化(Generalization)△

· 实现(Realization)---▷

八、实践要点

  1. 对象设计最佳实践

// 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;

}

}

  1. 测试策略

· 单元测试:针对单个类

· 集成测试:类间交互

· Mock对象:依赖隔离

九、各语言特性对比

特性 Java C++ Python JavaScript

多重继承 接口实现 支持 Mixin Prototype链

访问控制 严格 严格 约定 无

垃圾回收 有 手动/智能指针 有 有

反射 强 有限 强 强

总结

面向对象思想不仅是编程技术,更是一种思维方式。掌握这些专项知识点需要:

  1. 理解原理:不止记住语法,要理解背后的设计思想

  2. 实践验证:通过项目实践加深理解

  3. 持续重构:运用设计原则改善代码质量

  4. 模式识别:识别场景并应用合适的设计模式

记住:面向对象的终极目标是创建高内聚、低耦合、易维护、可扩展的软件系统。

相关推荐
芒克芒克3 小时前
深入浅出Java线程池(一)
java·开发语言
wuqingshun3141594 小时前
红黑树有哪些特征
java·开发语言·jvm
ValhallaCoder4 小时前
hot100-贪心
数据结构·python·算法·贪心算法
追风少年ii4 小时前
顶刊分享--由细菌-癌细胞相互作用决定的差异性肿瘤免疫
人工智能·算法·数据分析·空间·单细胞
pp起床4 小时前
动态规划 | part04
算法·动态规划
fchampion4 小时前
最终一致性
java·spring·rabbitmq·github·mvc
随意起个昵称4 小时前
Floyd算法做题笔记
笔记·算法
sww_10264 小时前
SAA ReactAgent工作原理
开发语言·前端·javascript
wuqingshun3141594 小时前
说一下什么是fail-fast
java·开发语言·jvm
wuqingshun3141594 小时前
知道java NIO吗?和java IO有什么区别?
java·开发语言·jvm