关于抽象类 (水果举例)(DoWork)

抽象类是不能够实例化的类: 
它的作用就是产生子类的同时给于子类一些特定的属性和方法. 
来个简单的例子... 
如果你的程序里面需要用到苹果和梨这2个类..那么你可以分别给出这2个类 
但是你会发现这2个类里面有共同的属性和方法(属性: 都有核.. 方法: 都需要削皮吃...)那么你可以建立抽象类 '水果' 把这些共同的东西都定义在那里. 那么你的2个子类就只需要实其他必要的东东了(味道, 价格...)

优点: 当你需要对苹果和梨做新的,共同的修改或者添加的时候. 你现在就可以直接对他们的超类 水果 做就可以了.

----------------------------------

可以确定某个类型一定会有一种操作,但是这个类型上还不能确定这个操作具体应该如何执行,而要延伸到它的子类才可以确定

比如说在一个模型中,有一个 Employee 类,可以肯定的是 Employee 都应该会有一个 doWork 方法,也就是企业员工都要工作
但是,这个工作具体应该如何做,则需要到更精确的类型才可以确定。比如“清洁工”是公司里的一个员工,他们的 doWork 方法就可以确定是打扫卫生;Sales 的 doWork 则是和客户谈生意等。
而在很多时候,我们要关注的是对象更加“泛”的类型,而不是更精确的类型。比如公司老板在招集员工开了一个短会之后,宣布散会,然后大家回去继续工作,也就是将用全体员工对象的 doWork 方法调用一次。在这里,老板在调用 doWork 方法时关注的是它的父类型,而不是子类类型,他没兴趣也没有必要去判断每个员工的子类型是什么。

这种思想在 jdk 的类库中多有体现。
比如 java.io.InputStream 类是一个抽象类,它的 read() 方法是一个抽象方法,它用于从输入流中读取一个字节的数据。
然而在 java 中,无论从网络还是从文件中读取数据都是用 Stream 类,显然文件和网络数据流的读取操作是不一样的。但是无论是网络还是文件,可以确定的是InputStream 一定会有一个 read() 方法用于从流中读取一个字节的操作。所以 InputStream 被定义成抽象类,read 方法被定义为抽象方法。read 方法是由它们的子类来完成的,文件的read方法由FileInputStream 类实现,网络输入流则是由 Socket.getInputStream 方法得到的 InputStream 的一个子类来对象来实现的。

(0)

相关推荐