Java 中的抽象类和抽象方法

🧐 为什么需要abstract

我们知道C++中有虚基类和虚函数的概念和语法,Java也提供了类似的机制,即抽象类抽象方法,关键词为abstract。很多时候我们希望自己写的代码更加的结构化,我们会定义一种基类,这种基类相当于一个模板,我们再用这个模板去产生具有实用功能的子类。这时候我们就会需要一种机制让我们能够清楚的明白这个类只是一个模板,不要直接拿模板来创建类,正确使用它的方法是继承并实现它要求的功能(暂时称作模板方法)。有一种“暴力法”可以实现这种机制,就是让模板的每个模板方法都抛出异常,但这样做一来繁琐,二来错误在程序运行时才会显现出来。而abstract就是实现这种机制的一种比较优雅的方法。

🤨 怎么使用?

抽象类:在class前面添加一个abstract即声明这个类是一个抽象类。

public abstract class Example{...}

抽象方法:在方法前面添加一个abstrac即声明这是一个抽象方法,不需要用{}提供方法的定义。

abstract void f();

使用注意事项:

  • 抽象类只能继承,不能创建对象,否则编译器会报错

    这一点刚好更关键词final相反,用final修饰类通常是说明这个类功能完整,不需要也不能被继承了,如StringInteger都是final类。

    另外,JVM会对使用final修饰的变量、方法和类进行优化,性能会有所提高。

  • 包含抽象方法的类是抽象类,必须要abstrac关键字修饰,否则编译器会报错。

  • 如果想实现一个抽象类的子类,然后用子类去创建对象的话,子类必须实现父类中的所有抽象方法,否则该子类也属于抽象类,需要用abstract修饰;

  • 没有抽象方法的类也可以声明为抽象类,这样做可以防止别人用这个类来创建对象,也是有实用价值的;

  • 抽象方法不能有主体({...}),否则编译器会报错:

Test.java:2: 错误: 抽象方法不能有主体
    abstract void haha(){
                  ^
1 个错误

总结:

使用抽象类和抽象方法可以使代码的结构和功能更加清晰,代码的可读性和复用性更高。