2017-11-08 15 views
0

私はOOPクラスとJavaクラスを初めて使用しています。オブジェクト指向プログラミングの問題、複数のインスタンスの作成

私は、具体的分野、私は書籍に関するデータを保存することができますクラスを作成しようとしています:そのクラスに続いてタイトル、著者、年が公開され、ページ数、ジャンル

、私はメインを持つことを望みます実行するプログラムでは、入力する書籍の数を尋ね、ユーザーが各書籍の情報を入力できるようにします。次に、各書籍の要約が印刷されます。

私は書籍情報の入力を許可するクラス "bookClass"をプログラミングしようとしましたが、bookClassを使用して配列を作成する "bookTest"クラスをプログラミングしようとしました。

これはbookClassです:

public class bookClass { 
    private String title; 
    private String author; 
    private String year; 
    private String pageCount; 
    private String genre; 
    private static int bookCount; 

    public bookClass(String title, String author, String year, String pageCount, String genre) { 
     this.setTitle(title); 
     this.setAuthor(author); 
     this.setYear(year); 
     this.setPageCount(pageCount); 
     this.setGenre(genre); 
     bookCount++; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 
    public void setAuthor(String author) { 
     this.author = author; 
    } 
    public void setYear(String year) { 
     this.year = year; 
    } 
    public void setPageCount(String pageCount) { 
     this.pageCount = pageCount; 
    } 
    public void setGenre(String genre) { 
     this.genre = genre; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public String getAuthor() { 
     return author; 
    } 

    public String getYear() { 
     return year; 
    } 

    public String getPageCount() { 
     return pageCount; 
    } 

    public String getGenre() { 
     return genre; 
    } 

    public int getBookCount() { 
     return bookCount 
    } 
} 

これは、メインクラスです:

import java.util.*; 

public class bookTest { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Scanner input = new Scanner(System.in); 
     System.out.print("How many books would you like to enter: "); 
     int bookAmount = input.nextInt(); input.nextLine(); 
     String[][] books2DArray = new String[bookAmount][5]; 
     for (String[] books1DArray: books2DArray) { 
      System.out.print("Please enter the title: "); 
      String title = input.nextLine(); 
      System.out.print("Please enter the author "); 
      String author = input.nextLine(); 
      System.out.print("Please enter the year: "); 
      String year = input.nextLine(); 
      System.out.print("Please enter the page count: "); 
      String pageCount = input.nextLine(); 
      System.out.print("Please enter the genre: "); 
      String genre = input.nextLine(); 
      bookClass book = new bookClass(title, author, year, pageCount, genre); 
      books1DArray[0] = book.getTitle(); 
      books1DArray[1] = book.getAuthor(); 
      books1DArray[2] = book.getYear(); 
      books1DArray[3] = book.getPageCount(); 
      books1DArray[4] = book.getGenre(); 

     } 
     for (String[] books1DArray: books2DArray) { 
      printSummary(books1DArray[0], books1DArray[1], books1DArray[2], books1DArray[3], books1DArray[4]); 
     } 
     System.out.println("There are" + book.getBookCount() + "books in the system"); 
    } 

    public static void printSummary(String title, String author, String year, String pageCount, String genre) { 
     System.out.format("%s written by %s was published in %s, has %s pages and is of the %s genre", title, author, year, pageCount, genre); 

    } 

} 

私は複数の問題/質問がある:

で配列を作成する方が良いだろうメインクラス?

コード内で繰り返し繰り返されているように私は非常に非効率的であるように感じます。冗長性の中には、ゲッターやセッターなどの良い習慣のために必要なものもありますが、それを誇張していますか?

メインクラスのforループでは、複数のオブジェクトを作成して配列に追加する必要がありますが、上書きされないように別の名前が必要なので、どのように行うかはわかりません。

また、メインクラスの最後にgetBookCountを呼び出すことはできません。これには理由がありますか?

Javaクラスの使用を根本的に誤解しているように感じるので、一般的なアドバイスやその他お気づきのことはありがたいです。

+0

文字列の2D配列を使用しないでください。 1Dの書籍の配列、または何らかの種類のリストを使用します。また、printSummaryはBookクラスの非静的メソッドになります。 –

答えて

2

あなたはJavaを学んでいるので、Java name conventionsを学ぶ必要があります。

私はあなたの本クラスpublic class BookClassを想定して、あなたは(入力チェックをスキップ)例えば、1つのBookClassの配列(またはArrayListまたはあなたが望む任意のコレクション型)を使用したテストクラスを書くことができます

public class BookTest { 

    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in); 
     System.out.print("How many books would you like to enter: "); 
     int bookAmount = input.nextInt(); input.nextLine(); 
     BookClass[] books = new BookClass[bookAmount]; 

     for (int i = 0; i < bookAmount; i++) { 
      System.out.print("Please enter the title: "); 
      String title = input.nextLine(); 
      System.out.print("Please enter the author "); 
      String author = input.nextLine(); 
      System.out.print("Please enter the year: "); 
      String year = input.nextLine(); 
      System.out.print("Please enter the page count: "); 
      String pageCount = input.nextLine(); 
      System.out.print("Please enter the genre: "); 
      String genre = input.nextLine(); 
      books[i] = new BookClass(title, author, year, pageCount, genre); 
     } 
     for (BookClass book : books) { 
      printSummary(book.getTitle(), book.getAuthor(), book.getYear(), book.getPageCount(), book.getGenre()); 
     } 
     System.out.println("There are" + books.length + "books in the system"); 
    } 

    public static void printSummary(String title, String author, String year, String pageCount, String genre) { 
     System.out.format("%s written by %s was published in %s, has %s pages and is of the %s genre", title, author, year, pageCount, genre); 
    } 

} 

あなたドン本の数を格納するためにBookClassに静的属性が必要な場合は、それを行うための多くの方法があります。

getBookCountは、forループで定義した未定義のパラメータbookを呼び出したために機能しません。必要に応じて、静的ゲッターメソッドpublic static int getBookCount()を定義し、BookClass.getBookCount()にアクセスする必要があります。しかし、私はあなたがオブジェクトを削除するときに複雑なプログラムで間違って行うことができますので、オブジェクトをカウントするためにそれを使用しないようにアドバイスをしてください...

関連する問題