类
方以类聚 物以群分
定义
类是一组相似事物的统称
。
为什么是一组
单个事物无法抽象成类。
为什么是相似
由类具体到对应的对象各不相同。
为什么是统称
能概括多个事物。
如何划分类
- 有相似点的就是类
- 角度决定看法,根据不同的业务场景做出不同处理。
“我”和”猪”是一类吗?答案是的,因为都是”哺乳动物”。
“我”和”树”是一类吗?答案是的,因为都是”生物”。
面向对象的类
类是属性和方法的集合
属性
属性属于对象所具有的特征,大部分都是”名词”。属性设计应该符合”不可再分原则”。
方法
方法属于对象所具有的行为,大部分都是”动词”。方法设计应该符合”单一原则”。
对象
对象属于具体的类。
- 现实中的对象:能够看到的事物
- 现实中的类:由对象归纳总结出类
- 软件中的对象:软件运行过程中存在的对象
- 软件中的类:软件设计过程中抽象出的类
由现实中的对象归纳出现实中的类,由现实中的类抽象模拟成软件类实例化成对象与程序进行交互。
接口
什么是接口
一组具有相关交互功能点的集合
。
相关
功能是相关的。
交互
用于物体之间的交互。
功能
只涉及定义,不涉及实现。
集合
多个功能,而不是一个功能。
为什么要使用接口
有时候并不知道具体对象的类,只知道具体的功能。
抽象类
抽象类只能用于继承,不能用于实例化。
为什么需要抽象类
某些场景不够用。
为什么需要设计一种只能用于继承,不能用于实例化的类
- 普通类基于对象进行抽象,抽象类是基于类抽象出来的
- 抽象类具有抽象方法,子类必须实现抽象方法
抽象类和接口的区别
抽象类本质上还是类,强调一组事物的相似性,包括属性和方法的相似性。
接口只强调方法的相似性,并且只仅仅体现在方法定义上的相似性,而没有实现上的相似性。
为什么有了接口,还需要抽象类?
抽象类看起来是一个介于接口和类之间的概念,同时具备接口和类的部分特征。
抽象
- 抽取比较像的部分
- 抽取多个对象或者类比较像的部分
抽象的层次
将对象抽象成类
- 属性相识的对象抽象成类
- 属性类别一致而不是属性值一致
由类抽象成超类/父类
- 行为相似抽取成父类
抽象的层次是不限的,根据业务的需要或者观察的角度,可以抽取出很多层。
为什么需要抽象/抽象的作用?
- 隔离关注点,降低复杂度
核心特征
封装
我们要封装什么?
- 你的身家
- 漂亮MM的年龄
- 如何消磨时间
- ……
封装就是类的一个功能,我们可以封装类的属性(”你的身家”),也可以封装类的方法(”如何打磨时间”)
为什么要封装
- 数据保护。
- 通过封装,不会暴露内部属性,对属性的操作也是统一的。
- 隔离复杂度,每个类只需要关注自己负责的功能如何完成即可,如果需要其他类配合,只需要调用其他类的方法,而不需要了解其他类的具体实现。
需要get/set吗?
应对需求…
- 老实人说真实年龄
- 漂亮MM说-10岁
- 明星说永远25岁
- 隐私保护着说不告诉你
public interface IPerson {
int getAge();
}
public class HonestMan implements IPerson {
private int age;
public HonestMan(int age) {
this.age = age;
}
@Override
public int getAge() {
return age;
}
}
public class BeautyMM implements IPerson {
private int age;
public BeautyMM(int age) {
this.age = age;
}
@Override
public int getAge() {
int myAge = this.age - 10;
if (myAge < 18) {
myAge = 18;
}
return myAge;
}
}
public class Star implements IPerson {
private int age;
private final int FIX_AGE = 25;
public Star(int age) {
this.age = age;
}
@Override
public int getAge() {
return FIX_AGE;
}
}
public class PrivacyProtector implements IPerson {
private int age;
public PrivacyProtector(int age) {
this.age = age;
}
@Override
public int getAge() {
return -1;
}
}
继承
- 子类继承父类的属性和行为,但同时也会改变父类的行为。
- 先有抽象后有继承,通过继承表达抽象的关系。
多态
- 面向对象的多态:使用父类指针或引用,能够调用子类对象
- 多态屏蔽了对象的差异性,使得开发能够写出通用性的代码
- 当增加新的子类的时候,调用者无需改动就能适应新的子类
public abstract class Animal{
String talk();
}
public class Cat extends Animal{
@Override
public String talk(){
return "miao miao maio....";
}
}
public class Dog extends Animal{
@Override
public String talk(){
return "wang wang wang......";
}
}
public class Application{
public static void talk(Animal animal){
System.out.println(animal.talk());
}
public static void main(String[] args){
Animal dog = new Dog();
talk(dog);
}
}