抽象类
- 一、父类方法的不确定性
- 二、抽象类介绍
- 三、抽象类细节
- 四、练习题
一、父类方法的不确定性
引入:对于一个动物,不知道它吃什么,比如猫吃鱼,兔子吃萝卜。动物类中的 eat 方法往往由它的子类去具体实现。
class Animal {
	public void eat() {
		System.out.println("我不是具体的动物,目前不知道吃什么。");
	}
}
父类方法的不确定性:
 当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。
=> 所谓抽象方法就是没有实现的方法
 => 所谓没有实现就是指,没有方法体
 => 当一个类中存在抽象方法时,需要将该类声明为abstract类
 => 一般来说,抽象类会被继承,有其子类来实现抽象方法
 
二、抽象类介绍
- 用abstract关键字来修饰一个类时,这个类就叫抽象类。
访问修饰符 abstract 类名{
}
- 用abstract关键字来修饰一个方法时,这个方法就是抽象方法。
 抽象方法没有方法体
访问修饰符 abstract 返回类型 方法名(参数列表);  
- 抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现抽象类。
- 抽象类,是考官比较爱问的知识点,在框架和设计模式使用较多。
三、抽象类细节
AbstractDetail01.java
- 抽象类不能被实例化。[举例a. 见后文]
- 抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract方法。[举例b. 见后文]
- 一旦类包含了abstract方法,则这个类必须声明为abstract。
- abstract 只能修饰类和方法,不能修饰属性和其它的。
- 抽象类可以有任意成员【因为抽象类还是类】,比如:非抽象方法、构造器、静态属性等等。[举例c.]
- 抽象方法不能有主体,即不能实现。
- 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。[举例d.]
- 抽象方法不能使用 private、final 和 static 来修饰,因为这些关键字都是和重写相违背的。
 说明:
 ①父类的属性&成员为private,子类无法访问。
 ②final本意就是不希望子类来继承。
 ③static修饰的方法是静态方法,可以直接被类调用。而abstract修饰的方法是抽象方法,即无方法体的方法,不能被直接调用,需要在子类或实现类中去编写完整的方法处理逻辑后才能使用。
- 举例
a.
 
 b.
abstract class A {
    //抽象类不一定要包含abstract方法。
    // 也就是说,抽象类可以没有abstract方法
    // 还可以有实现的方法。
    String name;
    public void hi() {
        System.out.println("hi");
    }
}
c.
 抽象类的本质还是类,所以可以有类的各种成员
abstract class C {
    public int num;
    public static String name = "haha";
    public void hi() {
        System.out.println("hi~");
    }
    public static void hello() {
        System.out.println("hello!");
    }
    public abstract void eat();
}
d.
 这里相等于Mama子类实现了父类GrandMa的抽象方法,所谓实现方法,就是有方法体(方法体内具体实现不关心)。
abstract class GrandMa {
    public abstract void hi();
    public abstract void hello();
}
class Mama extends GrandMa{
    public void hi() {
        System.out.println("hi");
    }
    public void hello() {
        System.out.println("hello");
    }
}
四、练习题
- 题1,思考: abstract final class A()能编译通过吗,why?
- 题2,思考: abstract public static void test2();能编译通过吗,why?
- 题3,思考: abstract private void test3(); 能编译通过吗, why?
我的回答:
 三个都不能
 正确。
- 编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salary。提供必要的构造器和抽象方法:work()。对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问,实现work(),提示"经理/普通员工名字工作中.……"
public class AbstractExercise01 {
    public static void main(String[] args) {
        Manager sb = new Manager("sb", 38, 6000.5,100.0);
        CommonEmployee poor = new CommonEmployee("poor", 66, 5000.1);
        sb.work();
        poor.work();
    }
}
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 String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    abstract public void work();
}
class Manager extends Employee {
    public double bonus;
    public Manager(String name, int id, double salary,double bonus) {
        super(name,id,salary);
        this.bonus = bonus;
    }
    public void work() {
        System.out.println("Manager "+ this.getName() +" is sleeping···");
    }
}
class CommonEmployee extends Employee {
    public CommonEmployee(String name, int id, double salary) {
        super(name,id,salary);
    }
    public void work() {
        System.out.println("CommonEmployee "+this.getName()+" is working···");
    }
}

 和韩老师视频中的代码核对之后,改进的点:
 CommonEmployee和Manager的work()方法上面写上 Override
 @Override
本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03
















二叉树的中序遍历](https://img-blog.csdnimg.cn/e5d3b577ed2c4a45a5150adbc8dd7a9e.png)


