携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情
1. 抽象
如果一个类有了一个抽象的方法,这个类就必须声明为抽象类。如果父类是抽象类,那么子类必须覆盖所有在父类中的抽象方法,否则子类也成为一个抽象类。一个抽象类可以没有任何抽象方法,所有的方法都有方法体,但是整个类是抽象的。设计这样的抽象类主要是为了防止制造它的对象出来。
在第一周就有一个Shape
类的例子。这个类有很多的子类,每个子类也都实现了父类的方法。实际上父类Shape
只是一个抽象的概念而并没有实际的意义。如果请你画一个圆,你知道该怎么画;如果请你画一个矩形,你也知道该怎么画。但是如果我说:“请画一个形状,句号”。你该怎么画?同样,我们可以定义Circle
类和Rectangle
类的draw()
,但是Shape
类的draw()
呢?
Shape
类表达的是一种概念,一种共同属性的抽象集合,我们并不希望任何Shape
类的对象会被创建出来。那么,我们就应该把这个Shape
类定义为抽象的。我们用abstract
关键字来定义抽象类。抽象类的作用仅仅是表达接口,而不是具体的实现细节。抽象类中可以存在抽象方法。抽象方法也是使用abstract
关键字来修饰。抽象的方法是不完全的,它只是一个方法签名而完全没有方法体。
抽象函数|抽象类
-
抽象函数:表达概念而无法实现具体代码的函数
-
抽象类:表达概念而无法构造出实体的类
-
带有abstract修饰符的函数
-
有抽象函数的类一定是抽象类
-
抽象类不能制造对象
-
但是可以定义变量
- 任何继承了抽象类的非抽象类的对象可以付给这个变量
-
2.两种抽象
- 与具体相对:表示一种概念而非实体
- 与细节相对:表示在一定程度上忽略细节而着眼大局
数据与表现分离(细胞自动机的例子)
- Field、View、Cell 的关系
- View只管根据Field画出图形
- Field只管保存数据
- 一旦数据更新之后,通知View重新画出整个画面
- 不去精心设计哪个局部需要更新、简化了程序逻辑、在计算机运算速度提高的基础上实现的
程序的业务逻辑与表现无关
- 表现可以是图形的也可以是文本的
- 表现可以是当地的也可以是远程的
责任驱动的设计
将程序中要实现的功能分配到合适的类、对象中去是设计中非常重要的一环
3.接口(interface)
接口是纯抽象类
所有的成员函数都是抽象函数
所有的成员变量都是public static final
实现接口
- 类用extends、接口用implements
- 类可以实现很多接口
- 接口可以继承接口,但不能继承类
- 接口不能实现接口
面向接口的编程方式
- 设计程序时先定义接口,再实现类
- 任何需要在函数间传入传出的一定是接口而不是具体的类
- 是Java成功的关键之一,因为极适合多人同时写一个大程序