快速业务通道

Java语言入门教程(十五):抽象类与抽象方法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

Java语言入门教程(十五):抽象类与抽象方法

时间:2011-06-13 csdn博客 taomoon719

在教程(十二)中,我们有这样的假设。假设有这样一个简单需求(其实谈 不上是需求,仅仅为了初学者容易理解而编造):某培训中心要开发一个内部员 工管理系统。该培训中心目前有两个部门,技术资源部和业务部。技术资源部的 员工负责讲课,称为讲师。业务部员工负责联系洽谈业务,称为销售。在管理系 统中,需要管理的是所有员工的姓名、薪水,以及讲师的技术方向,销售的任务 量。…..

基于这样的假设,我们设计了三个类:父类Employee、子类Sales和Trainer 。如果我们有如下语句:

Employee e=new Employee();

是完全符合语法的。但是,我们从面向对象编程的角度出发,系统中存在的 对象,一定在现实中可以找到对应的实体。但是在现实中,是没有Employee类的 对象的,只有Sales,或者Trainer。所以得出结论:Employee类不应该被实例化 。

如何保证一个类不被实例化哪?只要将这个类声明为抽象类即可。使用 abstract关键字即可,如下:

public abstract class Employee {
    private String name;
    private double salary;
    //TBC
}

Employee类声明为抽象后,将不能实例化,如果出现如下语句:Employee e=new Employee();将会出现编译错误。

但是抽象类依然可以作为类型使用,如:Employee e=new Sales();(后续文 章中将介绍该用法)。

初学者可以暂时把抽象类定义为:不能实例化的类,为抽象类。

接下来我们来考虑另外一个问题。

父类Employee中定义了一个方法:

public void setSalary(double salary,double rate) {
       this.salary = salary*(1+rate);
    }

但是如果子类Sales和Trainer虽然都需要实现这个业务逻辑,但是实现方式 却都不相同,如Sales如下:

public void setSalary(double salary, double rate) {
       this.salary = salary*(1+2*rate);
    }

Trainer类的如下:

public void setSalary(double salary, double rate) {
       this.salary = salary*(1+0.5*rate);
    }

那么,Employee类中的setSalary(double salary,double rate) 该如何处理?初学者往往会想,既然子类都不会使用父类的方法体,那么就直接 取消该方法的声明。这样是不可行的,父类是子类共同特别的体现,子类中确实 都需要实现setSalary(double salary,double rate)这个逻辑,只是实现方式不 同而已。也就是说,我们需要一个方案,既能够体现子类的共同特征,又不用写 出没用的方法体,这就是抽象方法。只要将父类的setSalary(double salary,double rate)方法声明为如下即可:

public abstract void setSalary(double salary,double rate) ;

需要注意的是,抽象方法是没有方法体的,声明后直接使用;结束。

抽象方法和抽象类之间的关系是:

1) 抽象类中不一定有抽象方法

2) 有抽象方法的类一定是抽象类

因此,如果一个类继承的父类中有抽象方法,那么子类必须实现其抽象方法 ,否则子类也必须声明为抽象类。

很多初学者会不太理解抽象类的作用,尤其抽象方法,觉得既然连实现逻辑 都没有,又何必声明?抽象类,抽象方法都是Java中非常重要的概念,抽象类是 多个子类共同特征的体现,抽象方法是子类共同行为的规范。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号