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();
}抽象类的注意事项
- 抽象类不能被实例化
- 抽象类中不一定包含抽象方法, 但是有抽象方法的类一定是抽象类
- 可以有构造方法, 供子类创建对象时, 初始化父类数据使用
- 抽象类的子类
- 要么重写抽象父类中的所有抽象方法
- 要么该子类也必须声明为抽象类(使用不多, 了解一下就行)
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 {
}