Java面向对象之抽象类

内容:

1、抽象类的产生

2、抽象类和抽象方法的定义与使用

3、抽象类和抽象方法的注意事项

4、实例分析

 

 

 

1、抽象类的产生

当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体

但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。

比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?

再比如:动物应该有吃饭的方法,猫,狗,猪.... 那么在他们的父类中 这个吃方法应该怎么定义?

分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。

那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。如:

  • 描述讲师的行为:工作。
  • 描述助教的行为:工作。
  • 描述班主任的行为:工作。

讲师、助教、班主任之间有共性,可以进行向上抽取。抽取它们的所属共性类型:员工。

由于讲师、助教、班主任都具有工作功能,但是他们具体工作内容却不一样。这时在描述员工时,发现了有些

功能不能够具体描述,那么,这些不具体的功能,需要在类中标识出来,通过java中的关键字abstract(抽象)修饰,

这些功能就叫做抽象方法,当定义了抽象方法的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类

 

 

2、抽象类和抽象方法的定义和使用

抽象类:用abstract修饰的类是抽象类,抽象方法和抽象类没有必然联系

抽象方法:用abstract修饰的方法是抽象方法(只有声明没有实现即没有方法体)

 

抽象类和抽象方法的格式:

1 // 抽象方法定义的格式:
2 public abstract 返回值类型 方法名(参数);
3 // 抽象类定义的格式:
4 abstract class 类名 {
5 }

 

抽象类使用实例:

 1 abstract class Employee {
 2     public abstract void work();// 抽象函数。需要abstract修饰,并分号;结束
 3 }
 4 
 5 // 讲师
 6 class Teacher extends Employee {
 7     public void work() {
 8         System.out.println("正在讲解Java");
 9     }
10 }
11 
12 // 助教
13 class Assistant extends Employee {
14     public void work() {
15         System.out.println("正在辅导学生");
16     }
17 }
18 
19 // 班主任
20 class Manager extends Employee {
21     public void work() {
22         System.out.println("正在管理班级");
23     }
24 }
25 
26 // 抽象类的使用
27 public class AbstractDemo {
28     public static void main(String[] args) {
29         Employee e = new Teacher();
30         e.work();    // 正在讲解Java
31         e = new Assistant();
32         e.work();    // 正在辅导学生
33         e = new Manager();
34         e.work();    // 正在管理班级
35     }
36 }

 

 

3、抽象类和抽象方法的注意事项

(1)抽象类无法实例化

抽象类无法直接创建对象,只能被子类继承后,创建子类对象。

 

(2)抽象类的方法重写

子类需要继承抽象父类并完成最终的方法实现细节(即重写方法,完成方法体)。而此时,方法重写不再是

加强父类方法功能,而是父类没有具体实现,子类完成了具体实现,我们将这种方法重写也叫做实现方法

 

(3)抽象类的构造方法

抽象类是可以拥有构造方法的,其存在的意义在于对自身进行初始化,供其子类使用

 

(4)抽象类常见疑惑

  • 抽象类一定可以是个父类,因为抽象类是不断抽取共性需求而来的
  • 抽象类中是可以不定义抽象方法的,此时仅仅是不让该类创建对象,用于某些特殊的设计需要
  • 设计时由具体类抽取出抽象类,而开发阶段应该先定义抽象父类,再根据不同需求由父类定义子类

 

 

4、实例分析

问题描述:

某IT公司有多名员工,按照员工负责的工作不同,进行了部门的划分(研发部员工、维护部员工)

研发部根据所需研发的内容不同,又分为JavaEE工程师、Android工程师;

维护部根据所需维护的内容不同,又分为网络维护工程师、硬件维护工程师.

公司的每名员工都有他们自己的员工编号、姓名,并要做它们所负责的工作。

工作内容:

  • JavaEE工程师:员工号为xxx的 xxx员工,正在研发淘宝网站
  • Android工程师:员工号为xxx的 xxx员工,正在研发淘宝手机客户端软件
  • 网络维护工程师:员工号为xxx的 xxx员工,正在检查网络是否畅通
  • 硬件维护工程师:员工号为xxx的 xxx员工,正在修复打印机

请根据描述,完成员工体系中所有类的定义,并指定类之间的继承关系。进行XX工程师类的对象创建,完成工作方法的调用

 

分析如下:

 

代码实现:

 1 // 抽象类
 2 public abstract class Employee {
 3     private String id;// 员工编号
 4     private String name; // 员工姓名
 5 
 6     public String getId() {
 7         returnid;
 8     }
 9     public void setId(String id) {
10         this.id = id;
11     }
12     public String getName() {
13         returnname;
14     }
15     public void setName(String name) {
16         this.name = name;
17     }
18     
19     // 工作方法(抽象方法)
20     public abstract void work(); 
21 }
22 
23 // 定义研发部员工类Developer 继承 员工类Employee
24 public abstract class Developer extends Employee {
25 }
26 
27 // 定义维护部员工类Maintainer 继承 员工类Employee
28 public abstract class Maintainer extends Employee {
29 }
30 
31 // 定义JavaEE工程师 继承 研发部员工类,重写工作方法
32 public class JavaEE extends Developer {
33     @Override
34     public void work() {
35         System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在研发淘宝网站");
36     }
37 }
38 
39 // 定义Android工程师 继承 研发部员工类,重写工作方法
40 public class Android extends Developer {
41     @Override
42     public void work() {
43         System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在研发淘宝手机客户端软件");
44     }
45 }
46 
47 // 定义Network网络维护工程师 继承 维护部员工类,重写工作方法
48 public class Network extends Maintainer {
49     @Override
50     public void work() {
51         System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在检查网络是否畅通");
52     }
53 }
54 
55 // 定义Hardware硬件维护工程师 继承 维护部员工类,重写工作方法
56 public class Hardware extends Maintainer {
57     @Override
58     public void work() {
59         System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在修复打印机");
60     }
61 }
62 
63 // 在测试类中,创建JavaEE工程师对象,完成工作方法的调用
64 public class Test {
65     public static void main(String[] args) {
66         // 创建JavaEE工程师员工对象
67         JavaEE ee = new JavaEE();
68         // 设置该员工的编号
69         ee.setId("000015");
70         // 设置该员工的姓名
71         ee.setName("小明");
72         // 调用该员工的工作方法
73         ee.work();
74     }
75 }

 

posted @ 2019-01-21 16:27  woz333333  阅读(154)  评论(0编辑  收藏  举报