内容:
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 }