我是 ABin-阿斌:写一生代码,创一世佳话。 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦。
一、 抽象类的定义
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。
二、关键字 abstract 的具体使用
可以用来修饰: 类、方法
三、abstract 修饰类的具体介绍
abstract 修饰类: 抽象类
-
此类不能实例化
-
抽象类中一定有构造器,便于子类实例化时调用
-
在我们实际开发当中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作。
注意:抽象的使用前提:继承性
四、抽象类举例
abstract class A {
abstract void m1();
public void m2() {
System.out.println("A类中定义的m2方法");
}
}
class B extends A {
void m1() {
System.out.println("B类中定义的m1方法");
}
}
public class Test {
public static void main(String args[]) {
A a = new B();
a.m1();
a.m2();
}
}
五、abstract 修饰方法的具体介绍
-
抽象方法只方法的声明,没方法体。
-
包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
-
若子类重写了父类中的所的抽象方法后,此子类方可实例化。
-
若子类没重写父类中的所的抽象方法,则此子类也是一个抽象类,需要使用 abstract 修饰
六、使用抽象类(abstract)的注意事项
-
abstract不能用来修饰: 属性、构造器等结构
-
abstract不能用来修饰: 私方法、静态方法、final 的方法、final 的类
七、为什么不能修饰的原因:
-
属性: 如果属性被抽象画了,那么就没法赋值了,这个属性也就没意义了。
-
构造器: 如何构造器被抽象画了,那么当子类重写的时候就构造器也会被重写。显然,这是错误的。我们 知道构造器只能重载。
-
私有方法: 假设一个父类方法是抽象类型的那么它的子类想要使用父类的东西那么必然是要从写这个父类 的方法的,但是如果这个方法的修饰符是私有化的那么子类就无法去从写父类的方法了。
-
静态方法: 这一点可以在方法的重写规则中参考:子类和父类中的同名同参数的方法要么都声明为非 static的(考虑重写),要么都声明为static的(不是重写)。
-
final 的方法: 这个就很明确了,final 在方法上就不能被重写了,在类上就不能被继承了。那 么,很显然这两点都违背了(abstract)抽象的概念了。
八、练习题
需求:
- 编写一个 Employee 类,声明为抽象类,包含如下三个属性:name,id,salary,提供必要的构造器和抽象方法:work()
- 对于 Manager 类来说,他既是员工,还具有奖金(bonus)的属性。
- 请使用继承的思想,设计 CommonEmployee 类和 Manager 类,要求类中提供必要的方法进行属性访问。
代码实现:
package com.abin;
/**
* @author ABin-阿斌
* @version 1.0
* @description: 抽象类的测试
* @date 2020/10/19 0:13
*/
public abstract class Employee {
/*
* 编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salary。提供必要的构造器和 抽象方法:work()。
*/
private String name;
private int id;
private double salary;
public Employee() {
super();
}
public Employee(String name, int id, double salary) {
super();
this.name = name;
this.id = id;
this.salary = salary;
}
public abstract void work();
}
package com.abin;
/**
* @author ABin-阿斌
* @version 1.0
* @description: 抽象类的测试
* @date 2020/10/19 0:14
*/
public class Manager extends Employee{
/*
* 对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。
*/
private double bonus; // 奖金
public Manager(double bonus) {
super();
this.bonus = bonus;
}
public Manager(String name, int id, double salary, double bonus) {
super(name, id, salary);
this.bonus = bonus;
}
@Override
public void work() {
System.out.println("管理员工,提供公司运行的效率");
}
}
package com.abin;
/**
* @author ABin-阿斌
* @version 1.0
* @description: 抽象类的测试
* @date 2020/10/19 0:16
*/
public class CommonEmployee extends Employee {
@Override
public void work() {
System.out.println("员工在一线车间生产产品");
}
}
package com.abin;
/**
* @author ABin-阿斌
* @version 1.0
* @description: 抽象类的测试
* @date 2020/10/19 0:20
*/
public class EmployeeTest {
/*
* 请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问。
*/
public static void main(String[] args) {
// 多态
Employee manager = new Manager("小明", 1001, 5000, 50000);
manager.work();
CommonEmployee commonEmployee = new CommonEmployee();
commonEmployee.work();
}
}