【Java SE:抽象类】抽象类的引出与深入理解
抽象类的引出与深入理解
目录:
- 抽象类的引出与深入理解
- 1. 引出抽象类:
- 2. 抽象类细节:
- 2.1 抽象类的介绍:
- 2.2 抽象类注意事项和细节讨论:
- 3. 实现一个抽象类:
- 4. 抽象类作用:
1. 引出抽象类:
我们首先来看这样一段代码:Animal
是父类,我们需要一些子类来继承父类
package com.haut.iot.assassin;public class Animal {private String name; //名字private int age; //年龄public Animal(String name, int age) {//构造方法this.name = name;this.age = age;}//动物都有的eat行为//思考:这里eat是实现了,其实并没有什么意义//即:父类方法不确定性的问题//====> 考虑将该方法设计为抽象方法(abstract)//====> 所谓抽象方法就是没有实现的方法,所谓没有实现就是没有方法体,只有声明//====> 当一个类中存在抽象方法时,需要将该类声明成为抽象类public void eat() {System.out.println("这是一个动物,但是目前来说不知道吃什么~");}}
通过上述代码我们可以发现,父类方法存在不确定性
小结:当父类的某些方法需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类
like this:
package com.haut.iot.assassin;public abstract class Animal { //抽象类private String name; //名字private int age; //年龄public Animal(String name, int age) {//构造方法this.name = name;this.age = age;}//动物都有的eat行为
// public void eat() {// System.out.println("这是一个动物,但是目前来说不知道吃什么~");
// }public abstract void eat(); //抽象方法}
一般来说,抽象类会被继承,由其子类来实现抽象方法
2. 抽象类细节:
2.1 抽象类的介绍:
- 用
abstract
关键字来修饰一个类时,这个类就叫做抽象类,具体语法是:访问修饰符abstract
类名 {} - 用
abstract
关键字来修饰一个方法时,这个方法就是抽象方法,具体语法是:访问修饰符abstract
返回类型 方法名(参数列表); //没有方法体 - 抽象类的价值更多是体现在于设计,是设计者设计好后,让子类继承并实现抽象类
- 这里插一句,抽象类是面试时经常被问到的知识点,在框架和设计模式中使用较多
2.2 抽象类注意事项和细节讨论:
8个细节如下:
- 抽象类不能被实例化,这里待会儿会举例说明
- 抽象类不一定要包含
abstract
方法,也就是说,抽象类可以没有abstract
方法,下面也会举例说明 - 一旦类包含了
abstract
方法,则这个类必须声明为abstract
abstract
只能修饰类和方法,不能修饰属性和其他的,这里也会举例说明- 抽象类可以拥有任意成员(抽象类的本质还是一个类),比如:非抽象方法,构造方法,静态属性等
- 抽象方法不能拥有方法体,即不能实现
- 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为
abstract
类,下面会进行举例~ - 抽象方法不能用
private
,final
以及static
来修饰,因为这些关键字和重写是相违背的,这个很重要,下面会举例说明
抽象类不能被实例化:
抽象类可以没有abstract
方法:
可以看到 IDEA 并没有报错~
abstract
只能修饰类和方法,不能修饰属性和其他的:
如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract
类:
当子类不实现父类的抽象方法时,会报错~,如下图所示:
当子类也声明为abstract
类时,可以不实现父类的abstract
方法:
这里再深入探讨一哈,当再有一个C类继承了B类时,A类中的抽象方法还是需要被实现,出来混总是要还的[doge]~
抽象方法不能用private
,final
以及static
来修饰:
我们反推一哈:如果private
修饰abstract
语法上通过了,那子类也没有机会去重写或者实现此抽象方法,所以private
不能修饰抽象方法
final
的本意就是最终的,不想改变的意思,也就是说不希望子类来重写此方法,所以final
也不能修饰抽象方法
static
可以通过类名来调用,所以是需要有方法体的,而抽象方法没有方法体,自然也就不能使用static
修饰抽象方法
3. 实现一个抽象类:
题面如下:
编写一个Employee
类,声明为抽象类,包含如下三个属性:name
,id
,salary
。提供必要的构造方法和抽象方法:work()
。对于Manager
类来说,它既是员工,还具有奖金(bonus
)属性。请使用继承的思想,设计CommonEmployee
类和Manager
类,要求类中提供必要的方法进行属性访问,实现work()
,提示“经理/普通员工 名字 工作中…”
实现代码:
父类Employee
类:
//父类Employee类
package com.haut.iot.assassin;public abstract class Employee {private String name; //姓名private int id; //编号private double salary; //薪水public Employee(String name, int id, double salary) {this.name = name;this.id = id;this.salary = salary;}public abstract void work();//抽象方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}
}
子类Manager
类:
//子类Manager类
package com.haut.iot.assassin;public class Manager extends Employee {private double bonus; //奖金public Manager(String name, int id, double salary) {super(name, id, salary);}public double getBonus() {return bonus;}public void setBonus(double bonus) {this.bonus = bonus;}@Overridepublic void work() {System.out.println("经理 " + getName() + " 工作中...");}}
子类CommonEmployee
类:
//子类CommonEmployee类
package com.haut.iot.assassin;public class CommonEmployee extends Employee{public CommonEmployee(String name, int id, double salary) {super(name, id, salary);}@Overridepublic void work() {System.out.println("普通员工 " + getName() + " 工作中...");}
}
测试类AbstractExercise
类:
//测试类AbstractExercise类
package com.haut.iot.assassin;public class AbstractExercise {public static void main(String[] args) {//测试Manager assassin = new Manager("assassin", 1000, 20000);assassin.setBonus(8000);assassin.work();CommonEmployee ninghai = new CommonEmployee("ninghai", 999, 5000);ninghai.work();}
}
运行结果:
4. 抽象类作用:
抽象类存在的最大意义就是为了被继承。 抽象类本身不能被实例化, 要想使用,只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。
有些小伙伴可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?
确实如此,但是使用抽象类相当于多了一重编译器的校验。
使用抽象类的场景就如上面的代码,实际工作不应该由父类完成,而应由子类完成,那么此时如果不小心误用成父类了,使用普通类的话编译器是不会报错的。 但是父类是抽象类就会在实例化的时候提示错误,让我们尽早发现问题。
很多语法存在的意义都是为了 " 预防出错 " , 例如 final
也是类似的作用。创建的变量用户不去修改,不就相当于常量嘛? 但是加上 final
能够在不小心误修改的时候, 让编译器及时提醒我们,充分利用编译器的校验,在实际开发中是非常有意义的。
【Java SE:抽象类】抽象类的引出与深入理解相关推荐
- 【Java SE】抽象类和接口
作者:✿✿ xxxflower. ✿✿ 博客主页:xxxflower的博客 专栏:[JavaSE]篇 语录:⭐每一个不曾起舞的日子,都是对生命的辜负.⭐ 文章目录 1.抽象类 1.1抽象类的概念 1. ...
- 零基础入门 自学 JAVA SE 基础篇(九)instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface)
JAVA SE自学 基础篇 多态 instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface) 目标 父类型与子类型之间的转换及instanceo ...
- 【JAVA SE】第八章 异常处理与抽象类
第八章 异常处理与抽象类 文章目录 第八章 异常处理与抽象类 一.异常处理 1.概念 2.Exception类的层次 3.Java 内置异常类 3.异常方法 4.捕获异常 5.多重捕获块 6.thro ...
- 初始Java Java SE 包,继承,组合,多态,抽象类,接口
目录 包 1.静态导入 2.将类放到包中 3.包的访问权限控制 继承 基本语法: 注意事项: protected 关键字 final 关键字 组合 多态 向上转型: 动态绑定 方法重写 重写的规则 : ...
- java中的抽象类和抽象方法
知识点:java中的抽象类和抽象方法 关键字abstract意为抽象的,可以用来修饰类和方法,分别称作抽象类和抽象方法 抽象类一般在多态的场景中使用 一:抽象类(abstract class) 在类的 ...
- Java:抽象方法和抽象类,抽象类应用模板方法模式,接口及使用
一.抽象类概念和作用 抽象类 Java中可以定义没有方法体的方法,该方法由子类来具体实现. 该没有方法体的方法我们称之为抽象方法,含有抽 ...
- java笔记之抽象类和接口
前言 java笔记之抽象类和接口是开发人员的设计工具 正文 1.抽象类 客观存在的一类事物,当这类事物都是抽象的,无法具体的描述. 1)语法: 修饰符 abstract class 类名{ } 2)特 ...
- java编程一般类抽象类的定义,Java编程基础抽象类
本文主要是讲述Java编程基础-抽象类,更多Java技术知识,请登陆疯狂软件教育官网. 抽象类: 抽象:不具体,看不明白关键字abstract 抽象类的特点: 1.抽象方法只能定义在抽象类中,抽象类和 ...
- Java提高篇 —— 抽象类与接口
一.前言 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间 ...
最新文章
- 经常用得到的安卓数据库基类
- DateChooser控件发布ASP.NET 2.0新版(我的ASP.NET 2.0控件开发书的第二个阶段项目)[请大家一定注意版本的更新,下载最新版]...
- 如何不用重启在CentOS 7/ RHEL 7虚拟机中添加一块新硬盘
- ROS的工作模式和ESXI网卡工作模式的关系
- zoom怎么解除静音_ZOOM视频软件使用指南(学生端)
- idea创建springmvc项目
- C语言-数据结构-可变长顺序表的删除操作
- ssis组件_用于SSIS的Melissa Data Quality免费组件
- My SQL外键约束
- VS 2015 搭建Google Test
- -webkit-filter
- linux分段加载程序_Linux的分段机制
- 美丽杭州,魅力杭州:弘阳地产水城新时代
- AI算法可帮助因气候变化而流离失所的数百万难民找到新家了!
- qua数据统计缺失问题之终结
- Redis基本数据类型,redis官网
- URP SMAA 细品
- bcdedit添加linux引导,利用Bcdedit创建Linux系统引导
- 百问网7天物联网记录(二)
- ROS(1和2)机器人操作系统相关书籍、资料和学习路径