文章目录
抽象类
1. 什么是抽象类 ?
- 抽象类也是一个类,设计上更简洁,体现的是一种 模板思想!
- 并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
- 有方法名没有方法体。
- 抽象类表达针对,是对一系列看上去不同,但是本质上相同的具体概念 的抽象。
- 举个栗子: 动物的叫声这件事!
//1 . 还记得继承时怎么回事么?
class Animal{
}
class Tiger{
}
class Sheep{
}
2. 语法定义
-
被 关键字
abstract
修饰的类,叫做抽象类。 -
被 关键字
abstract
修饰的方法 叫做抽象方法。- 这种方法 只有相同功能声明,没有方法主体。
-
具有抽象方法的类一定为抽象类。
权限修饰符 abstract 返回值类型 方法名(参数列表.. );
- 语法示例:
abstract class Animal{ //类需要被关键字 abstract 修饰 abstract public void call(); // 权限修饰符和抽象关键字位置可以任意! }
2.1. 抽象类的特点
- 关键字
abstract
可以修饰的方法和类。 - 抽象类,不能被实例化,即,不能被创建对象。
- 抽象类只有方法声明,没有方法体。
- 抽象类里 可以没有 抽象方法(可以有普通方法)。
- 子类(如果不是抽象类)继承抽象类之后,必须把所有方法重写!
- 如果不想重写,那么需要 成为一个抽象子类。
3. 入门案例
-
抽象类,是其父类无法确定全部实现,而是由其子类提供,具体实现对象的类。
-
当方法名相同,方法体不同的时候,就可以 设计成 抽象类,提取抽象方法
-
例如: 一个系统必须有两种角色,一个是管理岗位,一个是用户。
- 但是这两种角色都是属于 公司员工。
- 提示:先定义管理员,使用者,然后抽取共同体。定义抽象类 角色
public class Abstract_Test { public static void main(String[] args) { // 根据抽象类特点,new Role(); 抽象类不能创建实例对象 Role role= new Java(); //多态,编译看左边,执行看右边 role.systeminfo(); //自己实现方法 role.salary(); //调用父类方法 } } /* 根据设计定义抽象类角色 */ abstract class Role{ //这个类里有抽象方法时,该类就必须是抽象类。 //1.当方法名称相同,方法体不同时,可以使用抽象类。 //并提取抽象方法 abstract public void systeminfo(); //方法体让子类自己实现 /*2. 抽象类中也可以有非抽象方法 */ public void salary(){ System.out.println("发薪水..."); } } /* 定义管理员 */ class Manger extends Role{ //管理岗位对于系统来说是维护 public void systeminfo(){ System.out.println("维护系统... "); } } /* 定义用户 */ class User extends Role{ //用户对于系统来说,属于操作者 public void systeminfo(){ System.out.println("使用系统... "); } } /* 新增,开发人员 */ class Java extends Role{ @Override public void systeminfo() { System.out.println("开发系统... "); } }
-
输出结果:
开发系统... 发薪水...
4. 抽象类的用法
4.1 构造函数用法
- 思考一个问题,为啥? 既然抽象类无法实例化,为什么还有构造方法!?
- 思考二个问题,为啥? 抽象类虽然有构造器,但是抽象类不能创建对象!?
public class Abstract_Test2 {
public static void main(String[] args) {
new User2();
}
}
abstract class Role2{
//构造方法
public Role2() {
System.out.println("Role2 抽象类构造方法");
}
}
class User2 extends Role2{
//继承,空参构造方法第一行就是调用父类的构造方法super
}
-
结果输出:
Role2 抽象类构造方法
4.2 普通方法 和 属性的使用
- 抽象类 和 抽象方法 可以用关键字
final
一起使用么!?
public class Abstract_Test2 {
public static void main(String[] args) {
Role2 role2 = new User2();
System.out.println(role2.name);//多态的成员变量调用使用的是父类的。
System.out.println(role2.TIME_VALUE);
role2.salary(); // 可以使用父类的final方法,就是子类不能重写了。
role2.eat();
}
}
abstract class Role2{
String name; //名称
final String TIME_VALUE="1949-10-1";
//1.就是一个普通方法
final public void salary(){
System.out.println("发薪水... ");
}
abstract public void eat();
}
class User2 extends Role2{
@Override
public void eat() {
System.out.println("吃员工餐");
}
}
-
输出结果:
null 1949-10-1 发薪水... 吃员工餐
5. 小结:
5.1 面向抽象类编程案例–师生
- 具体分类:学生,老师。
- 共性特点: 学习
/**
* 测试类
*/
public class Abstract_Demo {
public static void main(String[] args) {
/*
创建对象
*/
Teacher t = new Teacher();
Student s = new Student();
t.study();
s.study();
t.setName("琼哥儿");
t.setNum(10086);
System.out.println(t.toString()); //输出结果
}
}
//相同的属性和方法可以抽取共同的类
abstract class School_Person{
//将学员和老师的共同属性方法抽取出来!
//私有方法需要对外提供访问
private String name;
private int num;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "School_Person{" +
"name='" + name + '\'' +
", num=" + num +
'}';
}
abstract public void study();
}
//老师类
class Teacher extends School_Person{
@Override
public void study() {
System.out.println("备课,写教案");
}
}
// 学生类
class Student extends School_Person{
@Override
public void study() {
System.out.println("温故而知新");
}
}
-
输出结果:
备课,写教案 温故而知新 School_Person{name='琼哥儿', num=10086}
5.2 面试题:什么时候使用抽象类?
- 当一个类需要继承 或者多态时,这个时候就会出现设计层面的思考,实例化本身是否有意义 ?
- 啥意思 ?在我们之前说过的案例,
- 针对于系统来说, 角色有很多, 用户,管理,领导,组长, 都有对系统上操作权限的不同范围, 如: 查看,审核, 添加等操作,这时就需要定义一个父类 Role 。
- 但是在父类中去实现 查看,审核,添加的具体实现没有意义,这些都需要交给不同的子类实现。所以父类只需要定义方法即可无需实现,即,让子类去重写方法,写具体内容,实例化它的子类才有意义,根据不同的操作权限去实例化不同的子类对象,这就是抽象类设计所在。