#java #class #oop
Вопрос:
Я пишу код для библиотеки (книг) на Java. У меня есть класс книг с тремя атрибутами: Название, Автор и Жанр. Жанр хранится как an int
, потому что их не так много:
public class Book {
public String title;
public String author;
public int genre;
public Book() {
this.title = title;
this.author = author;
this.genre = genre;
}
public void setBookTitle(String newBookTitle) {
this.title = newBookTitle;
}
public void setBookAuthor(String newBookAuthor) {
this.author = newBookAuthor;
}
public void setBookGenre(int newBookGenre) {
this.genre = newBookGenre;
}
public String getBookTitle() {
return title;
}
public String getBookAuthor() {
return author;
}
public int getBookGenre() {
return genre;
}
public String toString() {
LibraryDatabase libraryDatabase = new LibraryDatabase();
return ("Title: " this.getBookTitle()
"Author: " this.getBookAuthor() "Genre: " this.getBookGenre() //edit this part to refer the integer to a String
);
}
}
У меня есть библиотечный класс базы данных для хранения массива книг:
import java.util.*;
public class LibraryDatabase extends Book {
ArrayList<Book> bookDatabase;
public LibraryDatabase() {
}
public void books() {
Book book1 = new Book();
book1.setBookTitle("Harry Potter");
book1.setBookAuthor("J.K. Rowling");
book1.setBookGenre(1);
}
public ArrayList<Book> getArrayList() {
return bookDatabase;
}
}
Наконец, у меня есть класс клиентов, который в основном просто организует все вышеперечисленное в удобный интерфейс:
import java.io.*;
import java.util.*;
public class Customer {
public Customer() {
}
public void run() {
System.out.print("Welcome to Generic Library Service. Please enter your name.");
Scanner kbEater = new Scanner(System.in);
String customerName = kbEater.nextLine();
System.out.println("Would you like to borrow, return, or donate a book?");
System.out.println(" 1. Borrow");
System.out.println(" 2. Return");
System.out.println(" 3. Donate");
Scanner kbNeeder = new Scanner(System.in);
int customerChoice = kbEater.nextInt();
switch (customerChoice) {
case 1: borrow();
break;
//case 2: returnBook();
//case 3: donate();
}
}
public void printGenres() {
System.out.println(" 1. Fantasy");
System.out.println(" 2. Science Fiction");
System.out.println(" 3. Dystopian");
System.out.println(" 4. Action amp; Adventure");
System.out.println(" 5. Mystery");
System.out.println(" 6. Horror");
System.out.println(" 7. Thriller amp; Suspense");
System.out.println(" 8. Historical Fiction");
System.out.println(" 9. Romance");
System.out.println(" 10. Graphic Novel");
System.out.println(" 11. Young Adult");
System.out.println(" 12. Children's");
System.out.println(" 13. Memoir amp; Biography");
System.out.println(" 14. Food");
System.out.println(" 15. Art amp; Photography");
System.out.println(" 16. Self-improvement");
System.out.println(" 17. History");
System.out.println(" 18. Travel");
System.out.println(" 19. Humor");
System.out.println(" 20. How-to");
System.out.println(" 21. Science amp; Tech");
}
public void borrow() {
System.out.println("What is the genre of the book you're looking for?");
printGenres();
Scanner kbMeter = new Scanner(System.in);
int genre = kbMeter.nextInt();
System.out.println("Do you want to see titles, or are you looking for a particular author?");
System.out.println(" 1. Titles now");
System.out.println(" 2. Search by author");
Scanner kbLeader = new Scanner(System.in);
int titleOrSearch = kbLeader.nextInt();
switch(titleOrSearch) {
case 1:
titlesNow();
break;
case 2:
//method for searching by author
}
}
public void titlesNow() {
LibraryDatabase libraryDatabase = new LibraryDatabase("1", "1", 2);
System.out.println(toString());
}
}
И это результат:
Welcome to Generic Library Service. Please enter your name. **Username**
Here are our books:
Title: nullAuthor: nullGenre: 0
Почему это происходит? Почему атрибуты возвращают значение null? Я хочу перечислить названия, авторов и жанры всех книг из списка книг. Поскольку в настоящее время существует только одна книга, она должна распечатать эту книгу («Гарри Поттер» Джоан Роулинг).
Комментарии:
1. В
books
, вы создаетеnew Book
, устанавливаете некоторые из его значений… затем функция заканчивается, и вы выбрасываете эту книгу.2. Сначала книгу нужно добавить в список массивов, прежде чем вы сможете просмотреть ее и получить доступ к полям.
Ответ №1:
Ваша проблема здесь, в конструкторе:
public Book() {
this.title = title;
this.author = author;
this.genre = genre;
}
Вы присваиваете title, author, genre
себе то, что есть все null
. Чтобы исправить это, просто передайте некоторые параметры конструктору:
public Book(String title, String author, int genre) {
this.title = title;
this.author = author;
this.genre = genre;
}
и все должно работать вместо того, чтобы использовать методы сеттера.
Неправильная печать происходит из-за того, что вы нигде не сохраняете свои book1
данные. В вашем конструкторе для LibraryDatabase
добавьте bookDatabase = new ArrayList<>();
и в конце books()
функции добавьте a bookDatabase.add(book1);
.
Кроме того, обратите внимание, что ваш LibraryDatabase
метод ничего не делает в вашем toString()
методе.
Комментарии:
1. Это приводит к ошибке в классе LibraryDatabase, запрашивающем параметры при вызове объекта Book.
2. Вы также должны добавить параметры в конструктор, а не только
new Book(title, author, genre);
. Таким образом, у вас будет правильный конструктор, соответствующий тому, который вы вызвали.3. Существует множество экземпляров базы данных книг и библиотек, вызываемых в программе как объекты. Нужно ли мне вставлять параметры во все это? И что именно я вставляю, просто фальшивые строки и вставки?
4. Ну, в вашем примере вы бы вставили «Гарри Поттера»… И т. Д. То, что предлагает @null_awe, заменяет использование ваших сеттеров, поэтому, когда вы создаете свою книгу, вы вводите название и т. Д. Вы могли бы просто избавиться от кода в своем конструкторе, но было бы гораздо разумнее сделать это там.
5. Ладно, я все это сделал. Это все еще печатается не так, как я хочу, возвращаясь:
Customer@214c265e
Ответ №2:
Измените базу данных библиотеки, как показано ниже
import java.util.*;
public class LibraryDatabase extends Book {
ArrayList<Book> bookDatabase;
public LibraryDatabase() {
}
public void books() {
Book book1 = new Book();
book1.setBookTitle("Harry Potter");
book1.setBookAuthor("J.K. Rowling");
book1.setBookGenre(1);
bookDatabase.add(book1);
}
public ArrayList<Book> getArrayList() {
return bookDatabase;
}
}
Добавьте это в свой список объектов. book1
Также добавьте код @null_awe. этого тебе тоже не хватает .
public Book(String title,String author,int genre) {
this.title = title;
this.author = author;
this.genre = genre;
}