Java 抽象类 抽象方法 使用说明
知识点
什么是抽象类
抽象类与普通类主要两点不同:
1、在类的修饰符后面多了一个abstract关键字
2、抽象类是不允许通过new来实例化的
由于抽象类不能通过new来实例化,所以基本上是在继承中当做父类使用。什么是抽象方法
抽象方法的定义需要加上abstract关键字,不能有方法体,以封号结尾,比如:
public abstract void getOtherSalary();
抽象方法的具体实现,需要在子类中实现。注意:static、final的方法,不能被申明为抽象方法。抽象类与抽象方法
抽象类不一定包含抽象方法,但如果一个类包含了抽象方法,那这个类一定是抽象类,否则编译不通过。什么时候用抽象方法
抽象方法通常用于父类中。父类通常都是用于定义一些公共方法、公共属性等,但是实际项目可能会出现某些方法定义在父类中,父类却无法给出具体的实现,此时就是抽象方法出场的时候了。比如下文实例中,职员在公司中的收入都包含基本工资以及绩效奖金,基本工资大家都一样,但是绩效奖金就因岗位而异了,所以绩效奖金在职员类中只是个方法体,没有具体实现。抽象方法与设计模式
抽象方法在设计模式中有比较多的体现,特别是用于 模板方法设计模式,详见下文实例
实例
1.抽象方法的使用
需求描述:公司里的职员分为普通程序员和技术总监,所有职员的基本薪水都是10000元每个月,程序员的绩效奖金每个月3000元,技术总监的绩效奖金每个月20000元。
了解了需求后,我们先定义一个职员类Employee,如下:
/**
* 定义职工类,每个职工的薪水都由基本薪资跟绩效奖金组成
*/
public abstract class Employee {
/**
* 岗位名称
*/
private String jobName;
/**
* 所有职工的每月基本薪资都一样
* @return
*/
public int getBaseSalary(){
return 10000;
}
/**
* 所有职工都有绩效奖金,但是普通程序员跟技术总监的不一样,
* 所以这里无法给出具体实现,需要在子类中实现
* @return
*/
public abstract int getOtherSalary();
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
}
定义程序员类Coder,继承职员类,实现getOtherSalary() 方法,如下:
/**
* 程序员类,继承Employee类
*/
public class Coder extends Employee{
/**
* 由于继承了Employee类,所以必须实现Employee类中的抽象方法getOtherSalary()
* @return
*/
@Override
public int getOtherSalary() {
return 3000;
}
}
定义技术总监类Cto,继承职员类,实现getOtherSalary() 方法,如下:
/**
* 技术总监类,继承Employee类
*/
public class Cto extends Employee{
/**
* 由于继承了Employee类,所以必须实现Employee类中的抽象方法getOtherSalary()
* @return
*/
@Override
public int getOtherSalary() {
return 20000;
}
}
最后打印程序员与技术总监每个月的薪水:
public class AbstractMain {
public static void main(String[] args){
Coder coder = new Coder();
coder.setJobName("程序员");
System.out.println(coder.getJobName() + "每个月薪资为:");
System.out.println("基本薪资:" + coder.getBaseSalary() + "元");
System.out.println("绩效奖金:" + coder.getOtherSalary() + "元");
Cto cto = new Cto();
cto.setJobName("技术总监");
System.out.println(cto.getJobName() + "每个月薪资为:");
System.out.println("基本薪资:" + cto.getBaseSalary() + "元");
System.out.println("绩效奖金:" + cto.getOtherSalary() + "元");
}
}
执行以上程序后,输出:
程序员每个月薪资为:
基本薪资:10000元
绩效奖金:3000元
技术总监每个月薪资为:
基本薪资:10000元
绩效奖金:20000元
2.抽象方法与模板方法设计模式
在完成了以上需求后,此时又提出新需求,按照以下格式打印每个月的工资条,并且打印的顺序必须按以下格式打印出来:
XXX每个月薪资为:
基本薪资:XXX元
绩效奖金:XXX元
该月总工资为:XXX元
按照第一个例子的实现方式无法满足这个需求,第一个例子的打印顺序是由调用者决定的,无法统一控制。此时就是模板方法设计模式登场的时候了。基于第一个例子,改造一下职员类Employee,增加打印工资条的方法public final void printSalary()如下:
/**
* 定义职工类,每个职工的薪水都由基本薪资跟绩效奖金组成
*/
public abstract class Employee {
/**
* 岗位名称
*/
private String jobName;
/**
* 所有职工的每月基本薪资都一样
* @return
*/
public int getBaseSalary(){
return 10000;
}
/**
* 所有职工都有绩效奖金,但是普通程序员跟技术总监的不一样,
* 所以这里无法给出具体实现,需要在子类中实现
* @return
*/
public abstract int getOtherSalary();
/**
* 获取每个月工资总额
* @return
*/
public int getTotalSalary(){
return this.getBaseSalary() + this.getOtherSalary();
}
/**
* 定义执行顺序模板,模板中有些方法(抽象方法)是要在子类中实现
* 打印工资条,定义为final类,禁止被子类重写
*/
public final void printSalary(){
System.out.println(this.jobName + "每个月薪资为:");
System.out.println("基本薪资:" + this.getBaseSalary() + "元");
System.out.println("绩效奖金:" + this.getOtherSalary() + "元");
System.out.println("该月总工资为:" + getTotalSalary() + "元");
}
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
}
打印每个月工资条:
public class AbstractMain {
public static void main(String[] args){
Coder coder = new Coder();
coder.setJobName("程序员");
coder.printSalary();
Cto cto = new Cto();
cto.setJobName("技术总监");
cto.printSalary();
}
}
以上执行结果为:
程序员每个月薪资为:
基本薪资:10000元
绩效奖金:3000元
该月总工资为:13000元
技术总监每个月薪资为:
基本薪资:10000元
绩效奖金:20000元
该月总工资为:30000元
源码获取
Java 抽象类 抽象方法 使用说明的更多相关文章
- Java 抽象类 抽象方法 接口
#抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化 ...
- Java基础 -- Java 抽象类 抽象方法
总结: 1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过.只有抽象类的非抽象子类可以创建对象. 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类. ...
- Java 学习(13):抽象类& 抽象方法& 封装
目录 --- 抽象类 --- 封装 抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的 ...
- Java抽象类中的抽象方法的参数对应的子类的方法的参数必须一致吗?
同学你这个涉及了两个概念. 一个是抽象方法,一个是方法重载. 先说下概念: 抽象方法就是abstract描述的方法,它本身不含实现,必须由子类实现. 方法重载则是同一个方法名,但是参数类型或者参数个数 ...
- Java abstract关键字 抽象类 抽象方法
用 abstract 修饰的类是抽象类,它不能生成对象 含有抽象方法的类称为抽象类 抽象方法使用 abstract 修饰 抽象类不能直接实例化,只能由子类实例化 举例 abstract class T ...
- java抽象类
Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不 ...
- Java接口、Java抽象类、C++抽象类的区别
由于这三种数据类型都是为了创建类层次结构的顶层构架,且用法有些许相似之处,这里简单区分一下: 接口: 接口用interface关键字定义, 名字一般使用-able形式的形容词. 接口通常定义抽象方法和 ...
- Java 抽象类与接口总结
一.为什么要使用抽象类?有什么好处? 抽象类是通用接口.不同的子类可以用不同的方法表示此接口.通用接口建立起一种基本形式,以此表示所有子类的共同部分. 必须覆写父类abstract抽象的方法 含有抽 ...
- JAVA抽象类和接口的深入探讨
Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...
随机推荐
- [LC] 222. Count Complete Tree Nodes
Given a complete binary tree, count the number of nodes. Note: Definition of a complete binary tree ...
- http 3种web会话管理方式
http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的,但是对于我们的应用来说,我们是靠用户来管理,而不是靠客户端. ...
- OpenCV 霍夫线变换
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #i ...
- Django的乐观锁与悲观锁实现
1) 事务概念 一组mysql语句,要么执行,要么全不不执行. 2) mysql事务隔离级别 Read Committed(读取提交内容) 如果是Django2.0以下的版本,需要去修改到 ...
- 林轩田机器学习基石笔记2—Learning to Answer Yes/No
机器学习的整个过程:根据模型H,使用演算法A,在训练样本D上进行训练,得到最好的h,其对应的g就是我们最后需要的机器学习的模型函数,一般g接近于目标函数f.本节课将继续深入探讨机器学习问题,介绍感知机 ...
- 【GBK、UTF-8、ISO8859-1】三种编码方式总结及实例
感谢:https://blog.csdn.net/youngstar70/article/details/64117297 一.总结 在Java中,String的getBytes()方法是得到一个操作 ...
- MySQL性能优化最佳实践 - 02 MySQL数据库性能衡量
测试服务器(或虚拟机)的QPS峰值 利用sysbench压测工具模拟SELECT操作 # 已有test库的话先drop掉 drop database test; create database tes ...
- OS Summary 1
内容概述 什么是操作系统 操作系统的演变 操作系统结果的分类 什么是操作系统 操作系统可以是: 一个控制程序 一个资源管理器 一套标准库 操作系统通常有内核.命令行和 GUI 组成.我们研究的主要是内 ...
- 在腾讯云centos7.2上安装配置Node.js记录
应为爱好前端所以打算在腾讯云服务器上安装JavaScript引擎Node.js,下面是安装步骤: 安装准备: 下载node.js的.tar.xz安装包:https://nodejs.org/dist/ ...
- virtualenv 个人指南
virtualenv是解决一个机器上多个应用需要的Python版本不一致的问题,virtualenv就是用来为一个应用创建一套"隔离"的Python运行环境,解决了解决了不同应用间 ...