📅  最后修改于: 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中的多个抽象类继承?