Java 抽象类和抽象方法
在 Java 面向对象编程中,抽象类与抽象方法是实现代码复用和构建可扩展系统的核心机制。抽象类定义了子类必须实现的共同行为,而抽象方法则强制子类实现特定功能,共同为系统架构提供清晰的规范与灵活的扩展基础。
本文将系统讲解抽象类与抽象方法的概念、抽象类继承、重写抽象方法以及访问抽象类构造函数,帮你更好地理解和应用这一重要特性。
Java 抽象类
在 Java 中,抽象类是一种使用abstract
关键字声明的、无法被实例化(即不能直接创建其对象)的类。
它存在的核心目的是作为其他类的蓝图或模板。抽象类通常包含一个或多个抽象方法(即只有方法声明而没有方法实现的方法)。如果一个类包含了一个抽象方法,那么该类必须被声明为抽象类。
✅ 下面是使用abstract
关键字定义抽象类的语法结构:
abstract class Website {
// 属性和方法
}
如果尝试创建抽象类的对象,则会出现编译错误。例如:
Website kaicz = new Website()
它将产生一个编译错误:
Website is abstract; cannot be instantiated
尽管无法直接实例化抽象类,但可以继承它并创建子类。通过实例化这些子类,我们便能访问和利用抽象类中定义的成员。
Java 抽象方法
我们也可以使用abstract
关键字来声明抽象方法。抽象方法只有方法声明,而没有方法体(即没有实现)。
抽象方法的主要目的是强制子类提供具体地实现,从而确保所有子类都遵循相同的接口或行为规范。
✅ 下面是使用abstract
关键字定义抽象方法的语法结构:
abstract void Kaicz();
在这里,Kaicz()
是一种抽象方法。
值得注意的是,只有抽象类才能声明抽象方法。如果一个非抽象类包含了抽象方法,将会导致编译错误。抽象类本身可以同时包含抽象方法(没有实现)和具体方法(有实现)。以下是一个示例:
abstract class Website {
public void showUrl() {
System.out.println("https://www.kaicz.com");
}
abstract void loadContent();
}
在上面的示例中,我们创建了一个抽象类 Website
。它包含一个抽象方法loadContent
和一个非抽象方法 showUrl()
。
抽象类的继承
由于抽象类无法被实例化,要访问其成员,我们必须通过继承来创建子类。例如:
abstract class Website {
public void showUrl() {
System.out.println("https://www.kaicz.com");
}
abstract void loadContent();
}
class Kaicz extends Website {
@Override
void loadContent() {
System.out.println("加载开创者教程内容...");
}
}
public class Main {
public static void main(String[] args) {
// 正确:通过子类实例化来访问
Kaicz mySite = new Kaicz();
mySite.showUrl(); // 调用从抽象类继承的具体方法
mySite.loadContent(); // 调用子类自己实现的抽象方法
// 错误:抽象类不能直接实例化
// Website site = new Website(); // 这行代码如果取消注释,会导致编译错误
}
}
执行上面的程序后,运行结果:
https://www.kaicz.com
加载开创者教程内容...
在上面的代码中,Kaicz
类继承了抽象类 Website
。它必须实现抽象类中的抽象方法 loadContent()
,否则也必须被声明为抽象类。然后使用Kaicz
的mySite
对象访问该loadContent()
方法。
重写抽象方法
在 Java 中,子类必须重写(Override)基类的抽象方法,因为继承而来的抽象方法在子类中尚未提供具体实现。例如:
abstract class Website {
abstract void loadContent();
}
class Kaicz extends Website {
@Override
void loadContent() {
System.out.println("加载开创者教程内容...");
}
}
class Main {
public static void main(String[] args) {
Kaicz mySite = new Kaicz();
mySite.loadContent(); // 调用子类自己实现的抽象方法
}
}
执行上面的程序后,运行结果:
加载开创者教程内容...
在上面的代码中,Kaicz
类继承了抽象类 Website
。它必须实现抽象类中的抽象方法 loadContent()
,否则也必须被声明为抽象类。然后使用Kaicz
的mySite
对象访问该loadContent()
方法。
访问抽象类的构造函数
与普通类相似,子类也可以通过 super 关键字调用抽象类的构造函数。例如,
abstract class Website {
String url;
Website(String url) {
this.url = url;
}
abstract void loadContent();
}
class Kaicz extends Website {
Kaicz(String url) {
super(url); // 调用抽象类的构造函数
}
@Override
void loadContent() {
System.out.println("加载 " + url + " 的内容...");
}
}
public class Main {
public static void main(String[] args) {
Kaicz mySite = new Kaicz("https://www.kaicz.com");
mySite.loadContent(); // 调用子类自己实现的抽象方法
}
}
执行上面的程序后,运行结果:
加载 https://www.kaicz.com 的内容...
在上面的代码中,抽象类Website
定义了一个带参数的构造函数。子类Kaicz
通过super(url)
调用该构造函数来初始化继承的属性 url
。
反馈提交成功
感谢您的反馈,我们将尽快处理您的反馈