第三次blog作业
渐渐的,这个学期的面向对象课程走到了尾声,这门课,任务紧促,教学严谨,无论是线上下的课程,还是11次的pta作业,抑或是苦恼了我大半学期的各次实验,都充实了我的生活,也让我收获满满。
在 Java 面向对象课程的学习过程中,我系统地掌握了面向对象编程的核心概念与技术:
一、封装(Encapsulation) 概念 封装是把数据(属性)和操作数据的方法绑定在一起,并通过访问控制符对数据进行保护,从而实现信息隐藏。这样可以防止外部直接访问和修改对象的内部状态,增强了代码的安全性和可维护性。封装的优势 :
安全性:可以对数据进行验证,避免不合理的值。
可维护性:内部实现的修改不会影响外部调用。
灵活性:可以在 getter/setter 中添加业务逻辑。
二、继承(Inheritance) 概念 继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,从而实现代码复用和功能扩展。子类可以重写父类的方法,也可以添加新的方法和属性。
1.关键字:使用extends关键字实现继承。
2. 构造方法:子类构造方法默认会调用父类的无参构造方法,也可以通过super()显式调用父类的有参构造方法。
3. 方法重写:子类可以重写父类的方法,需满足方法签名相同(方法名、参数列表、返回类型)。
继承的规则
• 单继承:Java 中一个类只能继承一个父类,但可以实现多个接口。
• 访问权限:子类不能访问父类的私有成员,但可以通过公共方法间接访问。
• final 类:使用final修饰的类不能被继承。
三、多态(Polymorphism) 概念 多态是指父类引用可以指向子类对象,并且在运行时根据实际对象类型调用相应的方法。多态通过方法重写和接口实现,使得代码更加灵活和可扩展。
实现条件
- 继承关系:必须存在子类继承父类或实现接口的关系。
- 方法重写:子类重写父类的方法。
- 父类引用指向子类对象:通过父类类型的变量引用子类对象。
多态的应用场景
• 方法参数多态:方法可以接受父类类型的参数,实际传入子类对象。
• 接口回调:接口类型的变量引用实现类的对象。
• 集合存储多态对象:集合可以存储不同子类的对象。
面向对象七大原则:
一、单一职责原则(SRP) 核心概念:一个类只负责一项独立职责,即 “一个类只有一个变化的原因”。
• 示例场景:
◦ 违反:让User类同时处理用户数据验证和文件存储(职责混杂)。
◦ 遵守:拆分为User类(管理用户信息)和UserStorage类(处理数据存储)。
• 目的:降低类的复杂度,修改某一职责时不影响其他功能。
二、开闭原则(OCP) 核心概念:软件实体应 “对扩展开放,对修改关闭”,即通过新增代码(而非修改原有代码)实现功能扩展。
• 示例场景:
◦ 违反:计算图形面积的方法通过if-else判断图形类型,新增三角形时需修改方法逻辑。
◦ 遵守:定义AreaCalculator接口,新增图形时只需实现新接口类,无需修改原有计算逻辑。
• 目的:避免修改旧代码引发风险,便于功能扩展(如插件式架构)。
三、里氏替换原则(LSP) 核心概念:子类必须能完全替换父类,且不破坏程序原有逻辑(子类需满足父类的所有契约)。
• 示例场景:
◦ 违反:正方形类继承矩形类,但重写setWidth方法时同时修改height(破坏矩形 “宽高独立” 的契约)。
◦ 遵守:子类实现父类方法时,不改变输入输出的逻辑约束(如子类方法不能缩小父类方法的参数范围)。
• 目的:保证继承体系的可靠性,避免子类替换父类时程序出错。
四、接口隔离原则(ISP) 核心概念:客户端不应该依赖它不需要的接口,即 “接口应细化为多个特定功能的小接口,而非大而全的接口”。
• 示例场景:
◦ 违反:定义Animal接口包含fly()、swim()、run()方法,导致不会飞的动物(如猪)也必须实现fly()。
◦ 遵守:拆分为Flyable接口、Swimmable接口、Runnable接口,动物根据特性实现对应接口。
• 目的:减少接口冗余,避免类被迫实现无用方法(解耦接口与实现类)。
五、依赖倒置原则(DIP) 核心概念:高层模块不应该依赖低层模块,两者都应依赖于抽象(接口 / 抽象类);抽象不应该依赖细节,细节应该依赖抽象。
• 示例场景:
◦ 违反:高层业务类直接调用低层数据库操作类的具体实现(如new MySQLDatabase())。
◦ 遵守:定义Database接口,高层类依赖接口而非具体实现(通过依赖注入使用MySQLDatabase或OracleDatabase)。
• 目的:降低模块耦合度,便于替换底层实现(如切换数据库类型)。
六、迪米特原则(最少知识原则,LoD) 核心概念:一个对象应该对其他对象有最少的了解,即 “对象间交互应尽可能简单,不直接操作无关对象的内部细节”。
• 示例场景:
◦ 违反:A类直接访问B类中C类的实例(如b.getC().doSomething())。
◦ 遵守:B类提供方法封装对C类的操作(如b.doCThing()),A类只与B类交互。
• 目的:减少对象间的耦合,降低系统变更的影响范围(如修改C类不影响A类)。
七、合成复用原则(CRP) 核心概念:优先使用组合(Composite)或聚合(Aggregation)而非继承来复用代码。
• 示例场景:
◦ 继承滥用:鸟类继承飞行动物类,但飞行逻辑可能随鸟类变化而修改(如企鹅不会飞)。
◦ 组合优选:鸟类包含FlyBehavior接口的实例(如private FlyBehavior flyBehavior),通过组合不同飞行策略(正常飞行/不会飞行)实现复用。
• 目的:避免继承导致的 “类爆炸” 和紧耦合(组合关系比继承更灵活,且不破坏封装性)。
抽象类:
抽象类是一种特殊的类,它不能被实例化,主要用于定义公共接口和部分实现,为子类提供统一的模板。 - 核心特点
• 不能实例化:无法使用new创建抽象类的对象,只能作为引用类型指向子类实例。
• 抽象方法:必须使用abstract修饰,没有方法体,子类必须重写。
• 部分实现:可以包含普通方法、构造方法、成员变量等,为子类提供共享逻辑。
• 继承关系:子类必须通过extends继承抽象类,并实现所有抽象方法(除非子类也是抽象类)。
接口:
接口(Interface) 是一种抽象类型,用于定义行为规范(方法签名集合),实现类必须遵循这些规范。接口是 Java 实现多态和松耦合的核心机制之一。 - 核心特点
• 不能实例化:接口无法直接创建对象,必须通过实现类实现。
• 多实现:一个类可以实现多个接口,突破 Java 单继承的限制。
• 抽象方法:接口中的方法默认是public abstract(无需显式声明)。
• 常量属性:接口中的字段默认是public static final,必须显式初始化。
• 默认方法(Java 8+):提供方法默认实现,允许接口演化而不破坏实现类。
• 静态方法(Java 8+):接口自身的工具方法,通过接口名直接调用。
Comparable和Comparator:
Comparable 接口
• 让对象自身具备可比较性,实现Comparable接口并重写compareTo方法。
• 自然排序:例如String、Integer等类默认实现了Comparable。
Comparator 接口
• 定义一个外部比较器,实现Comparator接口并重写compare方法。
• 定制排序:适用于无法修改原类或需要多种排序规则的场景。
Javafx:
JavaFX 是用于构建富客户端应用程序的 Java 库,提供了图形界面组件、媒体处理、2D/3D 渲染等功能。
JavaFX 基础架构
核心组件
• 场景图(Scene Graph):所有 UI 元素的树形结构,根节点为Scene,包含Node的层级关系。
• 舞台(Stage):窗口的抽象表示,每个应用至少有一个主舞台。
• 控件(Controls):按钮、文本框、下拉列表等 UI 组件,继承自Control类。
• 布局(Layouts):VBox、HBox、GridPane等,用于管理控件的位置和大小。
总结与收获:
在学习和实践过程中,不可避免地遇到了各种问题,如编译错误、运行时异常、逻辑错误等。通过查阅资料、调试代码、与同学和老师交流等方式,我逐渐学会了如何快速定位和解决问题。这种问题解决能力的提升,有助于我在 Java 编程中克服困难。在编写代码时,虽然能够实现基本的功能,但在代码的性能优化和资源管理方面还有很大的提升空间。例如,在处理大量数据时,没有充分考虑算法的效率和内存的使用情况,导致程序运行效率低下。今后需要学习更多的代码优化技巧和算法知识,提高代码的性能。
浙公网安备 33010602011771号