📜  Java中的抽象类

📅  最后修改于: 2020-04-05 12:06:07             🧑  作者: Mango

在C++中,如果一个类至少具有一个virtual函数,则该类将变为抽象。与C++不同,在Java中,单独的关键字abstract用于使类抽象。

// Java的抽象类例子
abstract class Shape {
    int color;
    // 抽象函数
    abstract void draw();
}

以下是有关Java抽象类的一些重要事项。
1)和C++一样,在Java中,无法创建抽象类的实例,但是我们可以引用抽象类类型。

abstract class Base {
    abstract void fun();
}
class Derived extends Base {
    void fun() { System.out.println("派生fun()被调用"); }
}
class Main {
    public static void main(String args[]) {
        // 解注释如下行,将会产生编译错误,因为如下尝试创建一个抽象类的对象
        // Base b = new Base();
        // 我们可以有基类的引用
        Base b = new Derived();
        b.fun();
    }
}

输出:

派生fun()被调用

2)像C++一样,抽象类可以包含Java中的构造函数。创建继承类的实例时,将调用抽象类的构造函数。例如,以下是有效的Java程序。

// 一个抽象类和构造函数
abstract class Base {
    Base() { System.out.println("基类构造函数被调用"); }
    abstract void fun();
}
class Derived extends Base {
    Derived() { System.out.println("派生类构造函数被调用"); }
    void fun() { System.out.println("派生类fun()被调用"); }
}
class Main {
    public static void main(String args[]) {
       Derived d = new Derived();
    }
}

输出:

基类构造函数被调用
派生类fun()被调用

3)在Java中,我们可以有一个没有任何抽象方法的抽象类。这使我们能够创建无法实例化但只能继承的类。

// 没有任何抽象方法的抽象类
abstract class Base {
    void fun() { System.out.println("基类fun()被调用"); }
}
class Derived extends Base { }
class Main {
    public static void main(String args[]) {
        Derived d = new Derived();
        d.fun();
    }
}

输出:

基类fun()被调用

4)抽象类也可以具有最终方法(无法重写的方法)。例如,以下程序可以编译并正常运行。

// 抽象类也可以具有最终方法
abstract class Base {
    final void fun() { System.out.println("基类fun()被调用"); }
}
class Derived extends Base {}
class Main {
    public static void main(String args[]) {
       Base b = new Derived();
       b.fun();
    }
}

输出:

基类fun()被调用

练习:
1.是否可以用Java创建抽象类和最终类?
2.是否可以在最终课程中使用抽象方法?
3.是否可以从Java中的多个抽象类继承?