主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

Java 抽象类和抽象方法

在 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(),否则也必须被声明为抽象类。然后使用KaiczmySite对象访问该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(),否则也必须被声明为抽象类。然后使用KaiczmySite对象访问该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



评论区 0
发表评论