Skip to content

Java

为什么需要抽象类?

java
public class Person {
    private String name;
    private int age;
    public Person() {
    }
    //作用: 当创建子类对象时, 给属性进行赋值的
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void work() {
        System.out.println("工作");
    };

    public void touchFish() {
        System.out.println("摸鱼");
    }
}
java
public class Student extends Person {
    public Student() {
    }

    public Student(String name, int age) {
        super(name, age);
    }
    //不选择重写, 会出现学生在工作, 按理来说, 应该对学生有着更具体的描述, 学习.
    // @Override
    // public void work() {
    //     System.out.println("学习");
    // }
}

提示

子类对于父类的方法进行重写是可选的, 可有些时候子类可能不是自己写的. 如果我们需要别人强制重写这个方法就需要使用抽象类. 再者, 父类的方法无法满足每一个子类的需求, 这时也需要抽象类.


抽象方法

  • 抽象方法: 将共性的行为(方法)抽取到父类之后. 由于每一个子类执行的内容不一样, 所以在父类中不能确定具体的方法体.
  • 抽象类: 如果有一个类中存在抽象方法, 那么该类就必须声明为抽象类

抽象类和抽象方法的定义格式

  • 抽象方法: public abstract 返回值类型 方法名(参数列表)
  • 抽象类: public abstract class 类名 {}
java
public abstract class Animal {

    //使用抽象方法, 强制让子类重写此方法
    public abstract void eat();
}

抽象类的注意事项

  1. 抽象类不能被实例化
  2. 抽象类中不一定包含抽象方法, 但是有抽象方法的类一定是抽象类
  3. 可以有构造方法, 供子类创建对象时, 初始化父类数据使用
  4. 抽象类的子类
  • 要么重写抽象父类中的所有抽象方法
  • 要么该子类也必须声明为抽象类(使用不多, 了解一下就行)
java
public class Test {
    public static void main(String[] args) {
        //1. 抽象类不能实例化
       Person person = new Person();
    }
}

abstract class Animal {
    //使用抽象方法, 强制让子类重写此方法
    public abstract void eat();
}
java
//abstract不写会报错
public abstract class Animal {
    //有抽象方法的类一定是抽象类
    public abstract void eat();
    //2. 抽象类中不一定包含抽象方法
    public void drink() {
        System.out.println("喝水");
    };
}
java
public abstract class Animal {
    private String name;
    private int age;
    //3. 抽象类中可以有构造方法
    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public abstract void eat();

    public void drink() {
        System.out.println("喝水");
    };
}

class Dog extends Animal {
    public Dog() {
    }

    public Dog(String name, int age) {
        //3. 通过super调用父类构造方法
        super(name, age);
    }
    //4.1 子类重写抽象父类(抽象类)中的所有抽象方法
    @Override
    public void eat() {
        System.out.println("吃骨头");
    }
}
java
public abstract class Person {

    public abstract void work();

}
//不会报错, 但之后的子类继承还是需要冲洗
abstract class Teacher extends Person {

}

Released under the MIT License.