zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    mysql导入导出数据过大命令
    thinkphp条件查询
    php表单提交安全方法
    ubuntu软件(查看文件差异)
    thinkphp if标签
    thinkphp导出报表
    jquery.easing.js下载地址
    水平手风琴切换效果插件亲自试过很好用
    li ie6/7 3px bug
    placeholder兼容IE6-9代码
  • 原文地址:https://www.cnblogs.com/wyb666/p/10299451.html
Copyright © 2011-2022 走看看