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
相关产品推荐
相关产品推荐

