抽象类的作用:在抽象类中定义抽象方法,目的是为了给子类提供一个通用的模板,子类可以在模板的基础上进行开发,先重写父类的抽象方法,然后可以扩展子类自己的内容。抽象类设计避免了子类设计的随意性,通过抽象类,子类的设计变得更加严格,进行某些程度上的限制使子类更加的通用。

抽象类和抽象方法的关系:抽象类中可以定义0或任意多个抽象方法。

代码示例如下:

public abstract class Person {
    public void eat(){
        System.out.println("吃饭");
    }
    public abstract void say();
    public abstract void sleep();
}
class Student extends Person{
    @Override
    public void say() {
        System.out.println("说话");
    }
    @Override
    public void sleep() {
        System.out.println("睡觉");
    }
}
class Test{
    public static void main(String[] args) {
        Student s = new Student();
        s.sleep();
        s.say();
        Person p = new Student();
        p.say();
        p.sleep();
    }
}

注意事项如下:

  • 将一个方法的方法体去掉,然后用 abstract 修饰,那么这个方法就变成了一个抽象方法
  • 一个类中如果有方法是抽象方法,那么这个类也要变成一个抽象类
  • 一个抽象类中可以有0或多个抽象方法
  • 一个类继承一个抽象类,子类如果没有重写父类全部的抽象方法,那么子类也变成一个抽象类,需要用 abstract 修饰
  • 抽象类不可以创建对象

面试题1:抽象类不能创建对象,那么抽象类中是否有构造器?

Answer:抽象类中一定有构造器。因为当抽象类被子类继承时,子类在初始化对象的时候要先用 super() 调用父类的构造器。

面试题2:抽象类是否可以被 final 修饰?

Answer:不能被 final 修饰,因为抽象类设计的初衷就是给子类继承用的。要是被 final 修饰了,就不存在继承,就没有子类了。

  • 为什么 java.lang 包下的类不用导包可以直接使用?

    java.lang 包包含了 Java 编程语言的核心类,如 StringObjectSystem 等。这些类提供了最基本的功能,几乎每个 Java 程序都会用到。由于这些类非常基础且常用,为了提高开发效率和代码的可读性,Java 设计者决定自动导入这个包。编译器对于 java.lang 包中的类可以自动导入,无需显式导入。

  • 没有抽象方法的抽象类,其意义在哪?

    即使没有抽象方法,将一个类标记为 abstract 可以防止它被直接实例化,这种场景更多的出现在各种工具类中,如果它的所有方法都是静态的,那么把它定义为抽象的,会从机制上防止实例化。