1

我是 java 的初学者,我想知道是否有办法通过输入更改主类中对象的名称?例如我得到这个代码:

while(!answer.equals("stop"))
    {
    //Enters book's information  and stores it in the object book1  
    System.out.println("Book-" + count);    
    title = input.next();
    author = input.next();
    ISBN = input.next();
    copies = input.nextInt();
    Book book1 = new Book(title,author, ISBN, copies);
    printLn("");
    printLn("Do you wish stop adding books? N || stop");      
    answer = input.next();
    }

我想继续添加新书,直到出现提示时写停止,但当然不更改名称它将继续将数据添加到同一个对象。有可能还是我需要继续制作新书对象:书等=新书(标题,作者,ISBN,副本)

“更正我的代码” 就像 Kevin 提到的那样,数组是存储这些值的主要思想,但由于它的静态值,它可能是满的,但是当输入 n-books 并且数组已满时,我可以使用 expandcapacity 方法它以 x 大小扩展数组。谢谢!

4

1 回答 1

7

代码应将每本书存储在一个列表中,以便稍后在代码中访问它们。除了在代码中标识您的对象之外,名称实际上并不重要。即使您可以更改局部变量的名称,book您的问题仍然存在。

您遇到的问题与范围和对象实例更相关。当您调用时,new Book(..)您会创建一本书的新实例。这本书的范围实例仅限于{}while 循环执行的代码块。这意味着在循环之外无法访问 book 的实例。

为了在循环外访问 book 的实例,您可以在循环外创建一本书,如下所示:

Book book;

while(...){
   book = new Book(...);
}

这种方法的问题是您正在创建书籍的多个实例,因此对于循环的每次迭代,对书籍的引用将被最新的书籍覆盖。

这创造了容纳多本书的必要性。可能会立即想到一个数组,但是数组的大小是静态的,用户可以输入 1..n 本书。这并不能使数组成为存储书籍的好选择。

这就是ListandArrayList发挥作用的地方。AList是一个包含多个对象实例的数据结构。使用该add(Object)方法可以很容易地扩展它。List 和 ArrayList 的完整描述超出了此答案的范围,但我提供以下资源:http ://docs.oracle.com/javase/tutorial/collections/

最终解决方案

    List<Book> books = new ArrayList<Book>();
    while(!answer.equals("stop"))
        {
        //Enters book's information  and stores it in the object book1  
        System.out.println("Book-" + count);    

        title = input.next();
        author = input.next();
        ISBN = input.next();
        copies = input.nextInt();

        Book book1 = new Book(title,author, ISBN, copies);
        books.add(book1);

        printLn("");
        printLn("Do you wish stop adding books? N || stop");      
        answer = input.next();
     }

     //Iterating the book list outside the loop
     for(Book book:books){
       //this call may vary depending on the book implementation
       System.out.println(book.getTitle());
     }
于 2013-04-20T22:26:37.133 回答