抽象类的作用:在抽象类中定义抽象方法,目的是为了给子类提供一个通用的模板,子类可以在模板的基础上进行开发,先重写父类的抽象方法,然后可以扩展子类自己的内容。抽象类设计避免了子类设计的随意性,通过抽象类,子类的设计变得更加严格,进行某些程度上的限制使子类更加的通用。
抽象类和抽象方法的关系:抽象类中可以定义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 编程语言的核心类,如String
、Object
、System
等。这些类提供了最基本的功能,几乎每个 Java 程序都会用到。由于这些类非常基础且常用,为了提高开发效率和代码的可读性,Java 设计者决定自动导入这个包。编译器对于java.lang
包中的类可以自动导入,无需显式导入。没有抽象方法的抽象类,其意义在哪?
即使没有抽象方法,将一个类标记为
abstract
可以防止它被直接实例化,这种场景更多的出现在各种工具类中,如果它的所有方法都是静态的,那么把它定义为抽象的,会从机制上防止实例化。