Java 一组对象如何抽象公共变量

在面向对象编程中,常常会遇到多个对象有一些共同的属性和行为。为了提高代码的复用性和可维护性,我们可以通过抽象类或接口来抽象这些公共变量。本文将通过一个具体的示例来探讨这个话题,并给出相应的代码示例。

具体问题:图书管理系统

考虑一个图书管理系统,我们需要管理多种类型的图书,如小说、教材和杂志。每种图书都有一些公共属性,例如书名、作者、出版年份等。此外,不同类型的图书可能还会有特定的属性,例如小说的体裁和教材的学科。

1. 定义公共属性

首先,我们创建一个抽象类 Book。这个类将包含所有图书的公共属性和方法。

abstract class Book {
    protected String title;
    protected String author;
    protected int publicationYear;

    public Book(String title, String author, int publicationYear) {
        this.title = title;
        this.author = author;
        this.publicationYear = publicationYear;
    }

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    public int getPublicationYear() {
        return publicationYear;
    }

    public abstract void displayInfo();
}

2. 封装子类

接下来,我们实现几个具体的图书类型。每个子类都继承自 Book 类,并实现其特有的属性和方法。

2.1 小说类
class Novel extends Book {
    private String genre;

    public Novel(String title, String author, int publicationYear, String genre) {
        super(title, author, publicationYear);
        this.genre = genre;
    }

    @Override
    public void displayInfo() {
        System.out.println("小说: " + title + ", 作者: " + author + ", 出版年份: " + publicationYear + ", 体裁: " + genre);
    }
}
2.2 教材类
class Textbook extends Book {
    private String subject;

    public Textbook(String title, String author, int publicationYear, String subject) {
        super(title, author, publicationYear);
        this.subject = subject;
    }

    @Override
    public void displayInfo() {
        System.out.println("教材: " + title + ", 作者: " + author + ", 出版年份: " + publicationYear + ", 学科: " + subject);
    }
}
2.3 杂志类
class Magazine extends Book {
    private int issueNumber;

    public Magazine(String title, String author, int publicationYear, int issueNumber) {
        super(title, author, publicationYear);
        this.issueNumber = issueNumber;
    }

    @Override
    public void displayInfo() {
        System.out.println("杂志: " + title + ", 作者: " + author + ", 出版年份: " + publicationYear + ", 期号: " + issueNumber);
    }
}

3. 使用示例

我们可以创建一些对象并调用他们的方法来验证我们的设计。

public class Library {
    public static void main(String[] args) {
        Book novel = new Novel("红楼梦", "曹雪芹", 1791, "古典");
        Book textbook = new Textbook("数学分析", "华罗庚", 1956, "数学");
        Book magazine = new Magazine("科学美国人", "多位", 2023, 1);

        novel.displayInfo();
        textbook.displayInfo();
        magazine.displayInfo();
    }
}

4. 状态图

在这个系统中,图书的状态可能涉及到已借出、已归还和丢失等。下面是描述这些状态的状态图。

stateDiagram
    [*] --> Available
    Available --> Borrowed
    Borrowed --> Returned
    Returned --> Available
    Returned --> Lost
    Lost --> [*]

结论

通过利用抽象类,我们成功地定义了一组共同的属性,并为不同类型的图书创建了具体的实现。这不仅提升了代码的可重用性,也使得系统结构更加清晰和易维护。

在实际开发过程中,合理利用抽象和继承,可以有效减少代码重复,提高开发效率。此外,良好的设计还能够简化后续的功能扩展,帮助团队快速适应变化。在图书管理系统的这个例子中,我们展示了如何将公共属性和行为提取到一个基本类中,并通过继承实现具体类的扩展。希望这一方案能够为您的项目设计提供一些启发和帮助。