Java面向对象之抽象类
内容:
1、抽象类的产生
2、抽象类和抽象方法的定义与使用
3、抽象类和抽象方法的注意事项
4、实例分析
1、抽象类的产生
当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体
但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。
比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?
再比如:动物应该有吃饭的方法,猫,狗,猪.... 那么在他们的父类中 这个吃方法应该怎么定义?
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。
那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。如:
- 描述讲师的行为:工作。
- 描述助教的行为:工作。
- 描述班主任的行为:工作。
讲师、助教、班主任之间有共性,可以进行向上抽取。抽取它们的所属共性类型:员工。
由于讲师、助教、班主任都具有工作功能,但是他们具体工作内容却不一样。这时在描述员工时,发现了有些
功能不能够具体描述,那么,这些不具体的功能,需要在类中标识出来,通过java中的关键字abstract(抽象)修饰,
这些功能就叫做抽象方法,当定义了抽象方法的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类
2、抽象类和抽象方法的定义和使用
抽象类:用abstract修饰的类是抽象类,抽象方法和抽象类没有必然联系
抽象方法:用abstract修饰的方法是抽象方法(只有声明没有实现即没有方法体)
抽象类和抽象方法的格式:
// 抽象方法定义的格式:
public abstract 返回值类型 方法名(参数);
// 抽象类定义的格式:
abstract class 类名 {
}
抽象类使用实例:
abstract class Employee {
public abstract void work();// 抽象函数。需要abstract修饰,并分号;结束
}
// 讲师
class Teacher extends Employee {
public void work() {
System.out.println("正在讲解Java");
}
}
// 助教
class Assistant extends Employee {
public void work() {
System.out.println("正在辅导学生");
}
}
// 班主任
class Manager extends Employee {
public void work() {
System.out.println("正在管理班级");
}
}
// 抽象类的使用
public class AbstractDemo {
public static void main(String[] args) {
Employee e = new Teacher();
e.work(); // 正在讲解Java
e = new Assistant();
e.work(); // 正在辅导学生
e = new Manager();
e.work(); // 正在管理班级
}
}
3、抽象类和抽象方法的注意事项
(1)抽象类无法实例化
抽象类无法直接创建对象,只能被子类继承后,创建子类对象。
(2)抽象类的方法重写
子类需要继承抽象父类并完成最终的方法实现细节(即重写方法,完成方法体)。而此时,方法重写不再是
加强父类方法功能,而是父类没有具体实现,子类完成了具体实现,我们将这种方法重写也叫做实现方法
(3)抽象类的构造方法
抽象类是可以拥有构造方法的,其存在的意义在于对自身进行初始化,供其子类使用
(4)抽象类常见疑惑
- 抽象类一定可以是个父类,因为抽象类是不断抽取共性需求而来的
- 抽象类中是可以不定义抽象方法的,此时仅仅是不让该类创建对象,用于某些特殊的设计需要
- 设计时由具体类抽取出抽象类,而开发阶段应该先定义抽象父类,再根据不同需求由父类定义子类
4、实例分析
问题描述:
某IT公司有多名员工,按照员工负责的工作不同,进行了部门的划分(研发部员工、维护部员工)
研发部根据所需研发的内容不同,又分为JavaEE工程师、Android工程师;
维护部根据所需维护的内容不同,又分为网络维护工程师、硬件维护工程师.
公司的每名员工都有他们自己的员工编号、姓名,并要做它们所负责的工作。
工作内容:
- JavaEE工程师:员工号为xxx的 xxx员工,正在研发淘宝网站
- Android工程师:员工号为xxx的 xxx员工,正在研发淘宝手机客户端软件
- 网络维护工程师:员工号为xxx的 xxx员工,正在检查网络是否畅通
- 硬件维护工程师:员工号为xxx的 xxx员工,正在修复打印机
请根据描述,完成员工体系中所有类的定义,并指定类之间的继承关系。进行XX工程师类的对象创建,完成工作方法的调用
分析如下:

代码实现:
// 抽象类
public abstract class Employee {
private String id;// 员工编号
private String name; // 员工姓名 public String getId() {
returnid;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
returnname;
}
public void setName(String name) {
this.name = name;
} // 工作方法(抽象方法)
public abstract void work();
} // 定义研发部员工类Developer 继承 员工类Employee
public abstract class Developer extends Employee {
} // 定义维护部员工类Maintainer 继承 员工类Employee
public abstract class Maintainer extends Employee {
} // 定义JavaEE工程师 继承 研发部员工类,重写工作方法
public class JavaEE extends Developer {
@Override
public void work() {
System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在研发淘宝网站");
}
} // 定义Android工程师 继承 研发部员工类,重写工作方法
public class Android extends Developer {
@Override
public void work() {
System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在研发淘宝手机客户端软件");
}
} // 定义Network网络维护工程师 继承 维护部员工类,重写工作方法
public class Network extends Maintainer {
@Override
public void work() {
System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在检查网络是否畅通");
}
} // 定义Hardware硬件维护工程师 继承 维护部员工类,重写工作方法
public class Hardware extends Maintainer {
@Override
public void work() {
System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在修复打印机");
}
} // 在测试类中,创建JavaEE工程师对象,完成工作方法的调用
public class Test {
public static void main(String[] args) {
// 创建JavaEE工程师员工对象
JavaEE ee = new JavaEE();
// 设置该员工的编号
ee.setId("000015");
// 设置该员工的姓名
ee.setName("小明");
// 调用该员工的工作方法
ee.work();
}
}
Java面向对象之抽象类的更多相关文章
- Java面向对象之抽象类,接口
抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中的所有抽象方法 抽象方法: 声明而未被实现的 ...
- Java面向对象_抽象类、接口
一.抽象类 概 念:很多具有相同特征和行为的对象可以抽象为一个类:很多具有相同特征和行为的类可以抽象为一个抽象类 关键字:abstract 规 则:1.抽象类可以没有抽象方法,有抽象方法的类必 ...
- Java 面向对象编程 抽象类 抽象方法 abstract
抽象类 通过abstract定义的方法是抽象方法,它只有定义,没有实现.抽象方法定义了子类必须实现的接口规范: 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法: 如果 ...
- java面向对象(下)-抽象类
抽象类和抽象方法 抽象类和抽象方法必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法 抽象类和抽象方法的规则如下 1.抽象类和抽象方法必须要用abstra ...
- Java面向对象13——抽象类
抽象类 package oop.demon01.demon08; //abstract 抽象类: 类 extends: 类---单继承 (接口可以多继承) public abstract c ...
- 浅谈Java面向对象之抽象类(abstract)
java语言,声明类时格式为: abstract class Db{} 说明Db类为抽象类.抽象方法是说没有方法的实现(方法体)此方法为抽象方法,只有抽象类和接口中才可以有抽象方法.简而言之,含有抽象 ...
- java面向对象_抽象类和接口
一.抽象类 1.抽象方法:由abstract修饰.只有定义没有方法体.用一个分号结尾. 2.抽象类: 1)包含抽象方法的类必须是抽象类 2)由abstract修饰 3)不能被实例化 4)抽象类如果不被 ...
- Java面向对象之抽象类abstract 入门实例
一.基础概念 抽象事物,是若没有具体的信息可以描述这个事物,这个事物可以称为抽象事物. 抽象类,是不断的向上抽取而来.抽取方法声明而不确定具体的方法内容.由不同的子类来完成具体的方法内容. (一)抽象 ...
- Java面向对象_抽象类应用——模板方法模式
概念:定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤. 去个例子分析一下这个概念: public cla ...
随机推荐
- ubuntu16.04 中文输入法
https://blog.csdn.net/qq_21792169/article/details/53152700 在主文件夹目录即home目录,按快捷键Ctrl+H(显示隐藏文件),看到的.bas ...
- 【MVC】知识笔记
MVC代表:模型-视图-控制器. Models:标识该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类 Views :应用程序动态生成HTML所使用的模版文件 Controllers:处理浏览 ...
- kettle--window开发环境和linux运行环境的迁移
首先要做的是将kettle在linux下搭建好. 一.搭建linux的kettle环境 1.1解压 (my_python_env)[root@hadoop26 ~]# .zip -d /usr/loc ...
- priority_queue
priority_queue<int> p;//最大值优先,是大顶堆一种简写方式 priority_queue<int,vector<int>,greater<in ...
- 【转】每天一个linux命令(29):chgrp命令
原文网址:http://www.cnblogs.com/peida/archive/2012/12/03/2799003.html 在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理. ...
- Centos7安装killall,fuser, killall,pstree和pstree.x11
centos7精简安装后,使用中发现没有killall命令. 经查找,可以通过以下命令解决: yum -y install psmisc 简单介绍一下 psmisc : Psmisc软件包包含三个帮助 ...
- 简单的爬虫例子——爬取豆瓣Top250的电影的排名、名字、评分、评论数
爬取思路: url从网页上把代码搞下来bytes decode ---> utf-8 网页内容就是我的待匹配的字符串ret = re.findall(正则,待匹配的字符串), ret 是所有匹配 ...
- AI(四): 微信与luis结合(下)
LUIS(Language Understanding Intelligent Services)是微软新近推出了的的语义理解服务,可以方便用户进行API调用,创建自己场景的语义理解服务,网址为 ht ...
- 两种获取MySql数据库中所有表的主键和外键约束信息的Sql语句
最近在写Rafy底层的一些东西,在数据库方面把MySql数据库集成到里面去,里面有一个需求,需要获取非系统数据库,也就是我们自己建立的数据库中所有表的主键和外键元数据列表. 第一种方法:是网上的方法, ...
- MFC的组合框(ComboBox)控件切换下拉样式
由于课题的需求需要做MFC串口程序,看了百度下载的串口助手的界面风格,发现这个设计很好 波特率的组合框只给出了5个可选数值,然后第6个选项是Custom,即手动输入. 实际上DCB结构的BaudRat ...