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 --> [*]
结论
通过利用抽象类,我们成功地定义了一组共同的属性,并为不同类型的图书创建了具体的实现。这不仅提升了代码的可重用性,也使得系统结构更加清晰和易维护。
在实际开发过程中,合理利用抽象和继承,可以有效减少代码重复,提高开发效率。此外,良好的设计还能够简化后续的功能扩展,帮助团队快速适应变化。在图书管理系统的这个例子中,我们展示了如何将公共属性和行为提取到一个基本类中,并通过继承实现具体类的扩展。希望这一方案能够为您的项目设计提供一些启发和帮助。