You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java构造方法问题:添加书籍到书架后重复输出同一本书信息

重复输出同一本书信息的原因与解决办法

问题根源

你代码里的核心问题是Book类的成员变量被声明为static。static修饰的变量属于类本身,而非类的实例——所有Book对象都会共享这一组static变量的值。当你创建第二个Book对象b2时,会覆盖掉第一个对象b1初始化时给name、author、year赋的值,所以最后调用getName方法时,不管传入b1还是b2,返回的都是最后一次赋值的static变量值。

修正步骤

1. 修改Book类,移除变量的static修饰符

让每个Book实例拥有自己独立的属性:

public class Book {
    // 去掉static,每个实例独享这些属性
    String name;
    String author;
    int year;

    public Book(String bn, String ba, int be) {
        name = bn;
        author = ba;
        year = be;
    }
}

2. 修改Bookshelf的get方法,访问实例属性

不要访问类的static变量,而是访问传入对象的实例成员:

public class Bookshelf {
    public static void main(String[] args) {
        registerBooks();
    }

    public static void registerBooks() {
        Book b1 = new Book("Ikigai", "Ken Mogi", 2018);
        Book b2 = new Book("The Alchemist", "Paulo Coelho", 1988);
        
        // 打印完整书籍信息
        System.out.println("书名:" + getName(b1) + ",作者:" + getAuthor(b1) + ",出版年份:" + getYear(b1));
        System.out.println("书名:" + getName(b2) + ",作者:" + getAuthor(b2) + ",出版年份:" + getYear(b2));
    }
    
    static String getName(Book b) {
        // 返回传入实例的name属性
        return b.name;
    }

    static String getAuthor(Book b) {
        return b.author;
    }

    static int getYear(Book b) {
        return b.year;
    }
}

进阶优化:给Book类添加toString方法

重写toString方法可以让打印对象更简洁:

public class Book {
    String name;
    String author;
    int year;

    public Book(String bn, String ba, int be) {
        name = bn;
        author = ba;
        year = be;
    }

    // 重写toString,直接返回格式化后的书籍信息
    @Override
    public String toString() {
        return "书名:" + name + ",作者:" + author + ",出版年份:" + year;
    }
}

此时Bookshelf的registerBooks方法可以简化为:

public static void registerBooks() {
    Book b1 = new Book("Ikigai", "Ken Mogi", 2018);
    Book b2 = new Book("The Alchemist", "Paulo Coelho", 1988);
    
    // 直接打印对象,会自动调用toString方法
    System.out.println(b1);
    System.out.println(b2);
}

内容的提问来源于stack exchange,提问作者cordesjan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:21:13