当前位置: 首页 > java >正文

java进阶(二)+学习笔记

面向对象设计原则

1. 面向对象概念

        面向对象 是一种编程思想,面向过程是关注实现的步骤,每个步骤定义一个函数,调用函数执行即可。

        面向对象关注的是谁(对象)来执行,        把具有相同属性和行为的一类事物(对象)进行抽象成类,然后再通过类实例化出一个个具体的对象,使用的具体的对象。

类通常包含以下要素:

  • 成员变量(属性):描述对象特征的名词性数据(如nameage)。
  • 成员方法(行为):定义对象动作的动词性操作(如eat()run())。
  • 构造方法:用于初始化新创建对象的成员变量。

面向对象三大特征

封装

封装并非简单的代码包装,而是通过访问权限修饰符(如private)隐藏类中部分成员,仅通过特定公共方法(如getName()setName())访问私有成员,增强数据安全性和可控性。

示例代码:

private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }

继承

子类继承父类的成员和方法,提高代码复用性。子类可扩展父类功能或重写父类方法(方法覆盖)。例如:

class Animal { void eat() { System.out.println("Eating..."); } }
class Dog extends Animal { @Override void eat() { System.out.println("Dog eats bone"); } 
}

多态

同一对象在不同场景表现不同行为,通常通过父类引用指向子类对象实现。多态提升代码扩展性,符合开闭原则(对扩展开放,对修改关闭)。

示例代码:

public void feedAnimal(Animal animal) {animal.eat(); // 实际调用子类重写后的方法
}

抽象类与接口

抽象类

abstract修饰的类,通常位于类体系顶层。特点包括:

  • 不能直接实例化。
  • 可包含抽象方法(无具体实现)和具体方法。
  • 可定义成员变量和构造方法。

示例:

abstract class Shape {abstract void draw(); // 抽象方法void move() { System.out.println("Moving shape"); } // 具体方法
}

接口

特殊形式的抽象类,核心在于定义功能(抽象方法)。特点包括:

  • 仅能包含静态常量(public static final)和抽象方法(Java 8后允许默认方法)。
  • 需由子类实现所有抽象方法。

示例:

interface Flyable {void fly(); // 默认public abstract
}
class Bird implements Flyable {@Override public void fly() { System.out.println("Bird flying"); }
}

抽象类与接口的选择

  • 使用抽象类的场景:

    • 需要定义成员变量或构造方法。
    • 需提供部分具体方法实现。
    • 适用于类体系的共性抽象(如Animal作为基类)。
  • 使用接口的场景:

    • 仅需定义行为规范(如ComparableRunnable)。
    • 需要多继承能力(Java中类单继承,接口可多实现)。
    • 强调“契约”而非具体实现。

2. 学习面向对象设计原则好处

在复杂的程序设计时,如果没有好的设计,在后期扩展功能时就很麻烦.

所以好的设计原则,可以提升程序设计的水平(可复用性,可维护性/可扩展性

3. 七个原则 

单一职责原则

单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。

对于单一职责原则,可以理解为一个类只负责一个功能领域中的相应职责, 即一个类不要负责太多“杂乱”的工作。 在软件系统中,如果一个类承担的职责过多,就等于把这些职责耦合在一起, 一个职责的变化可能会削弱或抑制这个类完成其他职责的能力。这种耦合会导致 脆弱的设计,当变化发生时设计或遭受到意想不到的破坏。

单一职责原则是实现高内聚、低耦合的指导方针.

以项目开发为例,如果项目组成员每个人的职责都很明确,可以专心开发自 己负责的模块,则项目成果的质量往往很高。相反,如果职责不清晰,分工就会 混乱


开闭原则

系统设计应对扩展开放,对修改关闭。新增功能时通过增加新类或模块实现,避免直接修改现有代码。例如,通过策略模式扩展支付方式,而非修改原有支付逻辑。


接口隔离原则

将庞大接口拆分为更细粒度的专用接口,避免强制实现类依赖不需要的方法。例如,将“用户操作”接口拆分为“登录接口”和“注册接口”,分别由不同类实现。


依赖倒置原则

高层模块不应依赖低层模块,双方应依赖抽象(如接口或抽象类)。例如,数据库访问层应依赖“数据仓库接口”,而非具体实现(如MySQL或Oracle)。


组合聚合复用原则

优先使用对象组合(has-a关系)而非继承(is-a关系)实现代码复用。例如,在汽车类中嵌入引擎对象,而非继承引擎类,避免继承链的复杂性。


里氏替换原则

子类必须能够替换父类且不影响程序正确性。若需重写父类方法,应将父类设计为抽象类。例如,鸟类中的“飞行”方法应抽象化,避免企鹅子类违背父类行为。


迪米特法则

减少对象间的直接交互,通过中间类(如“经纪人”)间接通信。例如,订单系统通过服务层调用库存模块,而非直接访问库存类的内部方法。

代码示例(依赖倒置原则):

// 抽象层
interface Repository {void saveData(String data);
}// 高层模块依赖抽象
class UserService {private Repository repository;UserService(Repository repository) { this.repository = repository; }void saveUser(String data) { repository.saveData(data); }
}// 低层实现
class MySQLRepository implements Repository {@Overridepublic void saveData(String data) { /* MySQL存储逻辑 */ }
}

 总结

        面向对象设计以类和对象为核心,通过封装隐藏细节、继承实现复用、多态增强扩展性,其七大设计原则包括:单一职责(一个类只做一件事)、开闭原则(扩展开放/修改关闭)、接口隔离(细化接口功能)、依赖倒置(面向抽象编程)、组合复用(优先组合而非继承)、里氏替换(子类可无缝替换父类)、迪米特法则(减少对象直接耦合),这些原则共同指导构建高内聚、低耦合、易维护的软件系统。

http://www.xdnf.cn/news/15271.html

相关文章:

  • 【算法】递归、搜索与回溯
  • Datawhale AI 夏令营2025科大讯飞AI大赛<夏令营:用AI做带货视频评论分析>
  • [Nagios Core] CGI接口 | 状态数据管理.dat | 性能优化
  • jenkins部署前端vue项目使用Docker+Jenkinsfile方式
  • 【星闪】Hi2821 | SDK开发入门,应用启动流程,创建自己的应用
  • 大模型聊天模板
  • 在人工智能自动化编程时代:AI驱动开发和传统软件开发的分析对比
  • AI 助力:如何批量提取 Word 表格字段并导出至 Excel
  • Infoblox NetMRI 远程命令执行漏洞复现(CVE-2025-32813)
  • C++值类别与移动语义
  • GraphRAG Docker化部署,接入本地Ollama完整技术指南:从零基础到生产部署的系统性知识体系
  • 动物世界一语乾坤韵芳华 人工智能应用大学毕业论文 -仙界AI——仙盟创梦IDE
  • 板凳-------Mysql cookbook学习 (十一--------9)
  • Typecho分类导航栏开发指南:从基础到高级实现
  • axios拦截器
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频摘要快速生成与检索优化(345)
  • Oracle SQL - 使用行转列PIVOT减少表重复扫描(实例)
  • 前端-CSS-day3
  • 【FreeRTOS】事件组
  • 决策树学习
  • OneCode3.0 VFS分布式文件管理API速查手册
  • 网络安全的基本练习
  • Autosar CanSM配置-Busoff参数-基于ETAS软件
  • 齿轮主要的几项精度指标及检测项目学习
  • houdini vat 学习笔记
  • 日志不再孤立!用 Jaeger + TraceId 实现链路级定位
  • 力扣刷题(第八十五天)
  • 【CMake】CMake构建项目入门
  • 【华为OD】MVP争夺战(C++、Java、Python)
  • 多表查询-4-外连接