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 ...
随机推荐
- iOS-----推送机制(下)
推 送 机 制(下) 单击”从证书颁发机构请求证书”后,将会显示下图所示的对话框 输入电子邮件地址和常用名称,并选中“存储到磁盘”单选钮,然后单击“继续”按钮,该程序将会创建一个“Certificat ...
- I.MX6 make menuconfig OTG to slave only mode
/****************************************************************************** * I.MX6 make menucon ...
- leetcode-3-LongestSubstringWithoutRepeatingCharacters
problem:Longest Substring Without Repeating Characters to be continue
- uva1482:Playing With Stones (SG函数)
题意:有N堆石子,每次可以取一堆的不超过半数的石子,没有可取的为输. 思路:假设只有一堆,手推出来,数量x可以表示为2^p-1形式的必输. 但是没什么用,因为最后要的不是0和1,而是SG函数:所以必输 ...
- 对象Date的方法
Date()对象是js提供给我们的日期对象,可以利用它获取关于时间的量. var myDate = new Date() //首先构造一个时间对象,然后用对象的方法获取时间: 1.获取年份: var ...
- Microsoft - Union Two Sorted List with Distinct Value
Union Two Sorted List with Distinct Value Given X = { 10, 12, 16, 20 } & Y = {12, 18, 20, 22} W ...
- hive 创建orc表
orc表 创建具备ACID及Transactions的表 这里的表需要具备下面几个条件: 1. 必须以 ORC 格式存储 2. 必须分 bucket,且不能 sort 3. 必须显式声明tran ...
- sql 语句执行顺序
一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图 ...
- struts中指定编码(使用Filter后仍然乱码)
https://www.cnblogs.com/oldinaction/p/5167481.html 概述: Tomcat默认是 ISO编码,不支持中文.尝试过自己写 Filter,在web.xml中 ...
- ORACLE11g 安装中xhost: unable to open display 问题解决纪实 (go)
http://blog.csdn.net/mchdba/article/details/62235761 1,Xhosts报错 安装好vncserver,本地pc笔记本能通过vnc viewer远程连 ...