利森,v1.0.0,2023.03.26
JAVA-编程基础-07-面向对象思想
文章目录
1. 三大功能包
使用抽象数据类型来封装数据和基于数据的操作,使它们形成一个不可分割的独立实体。 数据被保护在抽象数据类型内部,尽可能隐藏内部细节,只保留一些外部接口使其与外部进行通信。 用户不需要关心对象内部的细节,但是可以通过对象提供的接口来访问对象。
优势:
下面的类封装了姓名、年龄等属性,外界只能通过get()方法获取对象的姓名属性和属性,而无法获取年龄属性,但是年龄属性可以被对象使用工作()方法。
请注意,属性是使用 int 数据类型存储的,封装使得此实现细节对用户不可见。 并且当需要修改属性使用的数据类型时,也可以在不影响客户端代码的情况下完成。
public class Person {
private String name;
private int gender;
private int age;
public String getName() {
return name;
}
public String getGender() {
return gender == 0 ? "man" : "woman";
}
public void work() {
if (18 <= age && age <= 50) {
System.out.println(name + " is working very hard!");
} else {
System.out.println(name + " can't work any more!");
}
}
}
继承
继承实现了 IS-A 关系。 例如,Cat和是IS-A关系,所以Cat可以继承,从而获得Not的属性和方法。
继承应该遵循里氏替换原则,子类对象必须能够替换所有父类对象。
Cat可以用作,也就是说可以用来引用Cat对象。 指向子类对象的父类引用称为向上转型。
Animal animal = new Cat();
多态性
多态分为编译时多态和运行时多态:
运行时多态具有三个条件:
在下面的代码中,乐器类 () 有两个子类:Wind 和 ,它们都重写了父类的 play() 方法,并在 main() 方法中使用父类引用 Wind 和对象。 通过引用调用play()方法时,会执行实际引用的对象所在类的play()方法,而不是该类的方法。
public class Instrument {
public void play() {
System.out.println("Instument is playing...");
}
}
public class Wind extends Instrument {
public void play() {
System.out.println("Wind is playing...");
}
}
public class Percussion extends Instrument {
public void play() {
System.out.println("Percussion is playing...");
}
}
public class Music {
public static void main(String[] args) {
List<Instrument> instruments = new ArrayList<>();
instruments.add(new Wind());
instruments.add(new Percussion());
for(Instrument instrument : instruments) {
instrument.play();
}
}
}
Wind is playing...
Percussion is playing...
二、类图
以下类图用于绘制,更多语法和用法请参考:。
泛化关系()
用于描述继承关系,在Java中使用关键字。
@startuml
title Generalization
class Vihical
class Car
class Trunck
Vihical <|-- Car
Vihical <|-- Trunck
@enduml
实现关系()
要实现接口,请使用 Java 中的关键字。
@startuml
title Realization
interface MoveBehavior
class Fly
class Run
MoveBehavior <|.. Fly
MoveBehavior <|.. Run
@enduml
聚合关系()
表示整体是由部分组成的,但整体与部分并不强依赖,整体不存在,部分仍然存在。
@startuml
title Aggregation
class Computer
class Keyboard
class Mouse
class Screen
Computer o-- Keyboard
Computer o-- Mouse
Computer o-- Screen
@enduml
组成关系()
与聚合不同的是,组合中的整体和部分是强依赖的,如果整体不存在,那么部分也不存在。 比如公司和部门,没有部门就没有公司。 但公司和员工属于聚合关系,因为公司还没有员工。
@startuml
title Composition
class Company
class DepartmentA
class DepartmentB
Company *-- DepartmentA
Company *-- DepartmentB
@enduml
连接关系()
表明不同类型的对象之间存在关联。 这是一种静态关系,与运行进程的状态无关,一开始就可以确定。 因此,也可以用一对一、多对一、多对多关系来表示。 例如,学生和学校是关联关系。 一所学校可以有很多学生,但一个学生只能属于一所学校。 因此,这是一个多对一的关系,在操作开始之前就可以确定。
@startuml
title Association
class School
class Student
School "1" - "n" Student
@enduml
依赖关系()
与关联不同,依赖关系在运行时起作用。 A类和B类是三种主要形式的依赖关系:
@startuml
title Dependency
class Vihicle {
move(MoveBehavior)
}
interface MoveBehavior {
move()
}
note "MoveBehavior.move()" as N
Vihicle ..> MoveBehavior
Vihicle .. N
@enduml
3.设计原则SOLID缩写和全拼中文翻译
建议零售价
这
单一责任原则
OCP
公开赛
开闭原则
LSP
这
里氏替换原则
互联网服务供应商
这
接口分离原则
蘸
这
依赖倒置原则
1. 单一职责原则
修改一个类应该只有一个原因。
换句话说,让一个类只负责一件事。 当这个类需要做的事情太多的时候,就需要分解这个类。
如果一个类承担了太多的职责,就相当于将这些职责耦合在一起,而一个职责的改变可能会削弱这个类完成其他职责的能力。
2、开放与封闭原则
类应该对扩展开放,对修改关闭。
扩展意味着增加新的功能,所以这个原则要求增加新功能时不需要修改代码。
最典型的符合开闭原则的设计模式是装饰器模式,它可以动态地将职责附加到对象上,而无需修改类的代码。
3.里氏替换原理
子类对象必须能够替换所有超类对象。
继承是一种IS-A关系,子类需要能够像父类一样使用,并且需要比父类更特殊。
如果不满足这个原则,每个子类的行为就会有很大差异,增加继承系统的复杂性。
4. 接口分离原则
不应强迫客户依赖他们不使用的方法。
因此,使用多个专用接口比使用单个通用接口更好。
5. 依赖倒置原则
高层模块不应该依赖于低层模块,两者都应该依赖于抽象; 抽象不应该依赖于细节,细节应该依赖于抽象。
高层模块包含应用程序中重要的策略选择和业务模块。 如果高层模块依赖于低层模块,那么低层模块的改变会直接影响高层模块,从而迫使高层模块也需要改变。
对抽象的依赖意味着:
其他共同原则
除了上述经典原则外,实际开发中还有以下常见的设计原则。
速记全拼中文翻译
细节层次
法则
德墨忒耳定律
反应蛋白
重用
合成再利用原则
中共
这
共同封闭原则
树液
这
稳定的抽象原则
社会发展计划
这
稳定依赖原则
1. 德墨忒耳定律
迪米特定律也称为最少知识原则(Least,缩写为LKP),意思是一个对象应该对其他对象了解尽可能少,并且不应该与陌生人交谈。
2. 合成与复用原则
尝试使用对象组合而不是继承来达到重用的目的。
3. 共同封闭原则
一起修改的类应该分组在一起(在同一个包中)。 如果应用程序中的代码必须更改,我们希望所有更改都发生在一个包中(修改关闭),而不是分布在多个包中。
4.稳定的抽象原则
最稳定的包应该是最抽象的包,不稳定的包应该是具体的包,即一个包的抽象程度与其稳定性成正比。
5、稳定依赖原则
包之间的依赖关系应该是稳定的、依赖的,并且包所依赖的包应该比它本身更稳定。
参考