Java如何判断存储Book父类对象的ArrayList中元素所属的子类
实现方案
以下是两种常用实现方式,按需选择即可:
方案1:使用instanceof直接判断类型(最小改动现有代码)
步骤1:修改bookSearch方法返回匹配的书籍对象
原方法仅返回布尔值,调整为找到匹配书籍就返回对应的Book实例,找不到返回null:
// 修改LibraryMain中的bookSearch方法 public Book bookSearch(String bookTittle) { for (int i = 0;i<LibBook.size();i++) { Book book = LibBook.get(i); if(book.getTittle().equalsIgnoreCase(bookTittle)){ return book; } } return null; }
步骤2:修改main方法的搜索逻辑,判断返回对象的类型
public static void main(String[] args) { LibraryMain mainLib = new LibraryMain(); Scanner in = new Scanner(System.in); System.out.println("--Search book--"); System.out.print("Book tittle: "); String tittle = in.nextLine(); Book result = mainLib.bookSearch(tittle); if(result != null){ String type = ""; if(result instanceof Science){ type = "science"; }else if(result instanceof Fiction){ type = "fiction"; } System.out.printf("Book Found! %s is a %s book%n", result.getTittle(), type); } else{ System.out.println("Not Found"); } }
方案2:父类新增类型方法(更符合面向对象设计,扩展性强)
如果后续会新增更多书籍子类,推荐用这种方式,避免不断新增instanceof判断分支。
步骤1:修改Book类,新增获取书籍类型的方法
public class Book { private String bookTittle; private String bookAuthor; public Book(String tittle, String author) { this.bookTittle = tittle; this.bookAuthor = author; } public String getTittle() { return bookTittle; } // 新增方法,子类重写即可返回对应分类 public String getBookType(){ return "unknown"; } // other getter and setter }
步骤2:分别在两个子类重写getBookType方法
Science类新增重写逻辑:
@Override public String getBookType() { return "science"; }
Fiction类新增重写逻辑:
@Override public String getBookType() { return "fiction"; }
步骤3:修改main方法逻辑直接调用方法即可
public static void main(String[] args) { LibraryMain mainLib = new LibraryMain(); Scanner in = new Scanner(System.in); System.out.println("--Search book--"); System.out.print("Book tittle: "); String tittle = in.nextLine(); Book result = mainLib.bookSearch(tittle); if(result != null){ System.out.printf("Book Found! %s is a %s book%n", result.getTittle(), result.getBookType()); } else{ System.out.println("Not Found"); } }
内容的提问来源于stack exchange,提问作者Deni
相关产品推荐
相关产品推荐

