为什么要用抽象类
- 在之前几篇中讲解了继承的相关知识。而在继承过程中,子类已经继承了父类的成员方法,但是子类又想访问自己的同名成员方法,所以引入了重写(override)的概念。
- 如果一个父类中的成员方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的成员方法实现的方法体就没有实际意义了,而只有声明还有意义。我们就可以把没有方法主体的方法称为抽象方法。而包含抽象方法的类就是抽象类。
总而言之,没有方法体的方法叫做抽象方法,包含这样的抽象方法的类就叫做抽象类。
了解了抽象的相关概念,接下来我们来学习抽象的用法。
抽象类的使用方法
还是先从抽象方法入手:
使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。
- 代码格式:
修饰符 abstract 返回值类型 方法名 (参数列表);
包含抽象方法的类就是抽象类。抽象类同样也需要abstract关键字进行修饰。
- 代码格式:
abstract class 类名字 { }
例如:
public abstract class Person {//父类
public abstract void study();
}
抽象父类的成员方法因为没有方法体,所以该方法必须被继承该抽象父类的子类重写。
public class Teacher extends Person { //子类1
@Override
public void study() {
System.out.println("老师要学习");
}
}
接下来创建子类对象来调用该方法:
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.study();
}
考点总结
- 抽象类不能创建对象。只能通过其非抽象的子类创建对象。因为,通过一个类创建的对象,其目的是要调用类中的方法,而抽象类的方法时抽象方法,抽象方法没有方法体,所以这样做毫无意义。
- 抽象类的子类必须重写抽象类的所有抽象方法。如果子类也是抽象类,则需要其子类的子类来重写抽象方法。总之,一个抽象类的抽象方法必须由其直接子类或间接子类重写。这是因为,如果这个抽象类没有被重写,这个类始终没有方法体,这样的方法没有任何意义。
- 一个抽象类不一定含有抽象方法,但是含有抽象方法的类一定是抽象类。同样地,没有抽象方法的抽象类也不能直接创建对象。
- 抽象类中是允许有构造方法的,因为子类对象调用子类的非抽象方法时,其构造方法的第一行会有默认的super(),可以实现对父类成员的初始化。