天天看点

Java千百问_05面向对象(003)_java中抽象概念如何体现的

<a href="http://blog.csdn.net/ooppookid/article/category/6134850">点击进入_更多_java千百问</a>

抽象,和具体对立,定义了事物的性质,事物的性质会随着抽象概念的改变而改变。

抽象类和普通类一样,是一个模版。相比普通类,抽象类不具备实例化对象的能力。抽象类也可以定义属性和方法,比之普通类,它还可以定义没有实现的方法,即抽象方法。 

通常会用一个具体类(子类)继承抽象类(父类),实现抽象类中的抽象方法。父类包含子类的集合的通用功能,但父类本身过于抽象而无法被单独使用。

例如:将脊椎动物定义为一个抽象类,它具有头、躯干、尾等属性,具有吃、繁殖等具体行为,还有一个抽象行为:吠叫,吠叫这个行为并不具体,因为不同种类的脊椎动物吠叫行为并不相同。狗类继承脊椎动物类,实现狗的吠叫行为。

java中使用abstract关键字来声明一个类的抽象。abstract需要写在class关键字前面。

实例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

请注意,这个employee类与具体类没有什么不同。现在这个类是抽象的,但它仍然有三个字段,七种方法,和一个构造函数。

但现在如果想实例化这个类,如下:

编译后,会得到以下错误: 

employee.java:46: employee is abstract; cannot be instantiated 

employee e = new employee(“george w.”, “houston, tx”, 43); 

1 error

我们可以继承employee类,如下所示:

这里,我们可以实例化一个salary对象,这个对象将继承employee类的三个字段,七种方法。

运行后产生以下结果: 

constructing an employee 

call mailcheck using salary reference – 

within mailcheck of salary class 

mailing check to mohd mohtashim with salary 3600.0

call mailcheck using employee reference– 

mailing check to john adams with salary 2400.

如果你想在抽象类中定义一个方法,但是希望该方法由子类来决定实际的执行情况,可以在父类中定义抽象方法。 

声明一个抽象方法也需要abstract关键字。抽象方法只是一个方法签名,没有方法实现,故不需要使用花括号。 

如下所示:

声明一个抽象方法有两个规则:

这个类也必须是抽象类。

所有子类要么重写抽象方法,要么声明本身也为抽象。

如果salary类是employee类的子类,那么它必须实现computepay() 方法,如下:

下一篇: about porting