2014-07-21 93 views
0

我目前正在研究一个库存程序,涉及一维数组,2个类(Store和Book)以及其他一些方法,如方法和构造函数。创建Java类

我猜你可以说是主类的Store类应该包含main()方法,应该从文件中读取购买清单,使用适当的消息处理每次购买(ISBN号码,数量,价格或问题(例如缺货或没有)),存储最多15本Book类型书籍的阵列,库存文件中读取的方法,处理购买的方法,以及在关闭时打印库存以及销售的书籍数量和结束时的金额。 Book类包括书对象(每个书对象包含ISBN String,price double和副本int),构造函数,getter和setter以及打印信息的方法。

由于数组应该是在Store类中创建的,但是是Book类型的,并且由书籍对象组成(我假设?),所以我很难找出如何正确执行此操作将价值分配给isbn,价格,复制变量,正确设置构造函数等)。

更新 我现在有的主要问题是能够从我的printInfo方法打印图书对象。我在该方法的打印语句中收到错误消息,指出“无法找到符号。符号:书”。我无法真正了解该程序是否真正在运行,因为在我开始添加其他一些方法来完成其他依赖于本书的事情之前,我需要在这一点上看到(打印出来的书目标)。对象是正确的。

这里是我想出了迄今为止代码:

的存储类:

import java.util.Scanner; 
import java.io.*; 

public class Store { 
    public static void main(String[] args) throws Exception { 
     Book[] books = readInventory(); 

     for (Book : books) { 
      System.out.printf("ISBN: %s, Price: %f, Copies: %d%n", 
      book.getISBN(), book.getPrice(), book.getCopies()); 
     } 
    } 

    public static Book[] readInventory() throws Exception { 
     Book[] books = new Book[15]; 
     java.io.File file = new java.io.File("../instr/prog4.dat"); 
     Scanner fin = new Scanner(file); 
     String isbn; 
     double price; 
     int copies; 

      while (fin.hasNext()) { 
       for(int i = 0; i < books.length; i++) { 
       isbn = fin.next(); 
       price = fin.nextDouble(); 
       copies = fin.nextInt(); 

       Book book = new Book(isbn, price, copies); 
       books[i] = book; 
       } 
      } 
      fin.close(); 
      return books; 
    } 

    public static void printInfo(Book[] books) { 
     System.out.println(book); 
    } 
} 

这里是我的图书类:

public class Book { 
    private String isbn; 
    private double price; 
    private int copies; 

    public Book(String isbnNum, double priceOfBook, int copiesInStock) { 
     isbn = isbnNum; 
     price = priceOfBook;  
     copies = copiesInStock; 
    } 

    public String getISBN() { 
     return isbn; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public int getCopies() { 
     return copies; 
    } 

    public void setISBN(String isbn) { 
     this.isbn = isbn; 
    } 

    public void setPrice(double price) { 
     this.price = price; 
    } 

    public void setCopies(int copies) { 
     this.copies = copies; 
    } 

    @Override 
    public String toString() { 
     return String.format("ISBN: %s, Price: %f, Copies: %d%n", 
       this.getISBN(), this.getPrice(), this.getCopies()); 
    } 
} 

这是我第一次使用类,或者至少在同一个程序中创建多个类,所以我仍然试图弄清楚它是如何工作的。我一直在阅读一个我在网上找到的教程,这有点帮助,但是我很难将它应用到这种特定类型的程序中。

任何建议将不胜感激。

+1

'String [] books = new String [15];'应该是'Book [] books = new Book [15];',那么当您加载文件时,您只需将每本书的新实例分配给一个元素数组'书籍[i] =新书(isbn,价格,副本);' – MadProgrammer

回答

2

嗨,很高兴看到你已经努力尝试一些东西,然后跳到这里。到目前为止,你所做的是非常好的。但是你现在真正需要的是你的class Book中的吸气和吸气方法。这些将允许您返回或设置对象的变量值。

public class Book { 
    private String isbn; 
    private double price; 
    private int copies; 

    public Book(String isbnNum, double priceOfBook, int copiesInStock) { // Constructor? 
     isbn = isbnNum; 
     price = priceOfBook; 
     copies = copiesInStock; 
    } 

    public String getISBN() { 
     return this.isbn; 
    } 

    public double getPrice() { 
     return this.price; 
    } 

    public int getCopies() { 
     return this.copies; 
    } 

    public void setISBN(String value) { 
     this.isbn = value; 
    } 

    public void setPrice(double value) { 
     this.price = value; 
    } 

    public void setCopies(int value) { 
     this.copies = value; 
    } 
} 

这应该有助于您走上正确的轨道。取决于你希望信息的出现取决于你是否在每个get函数中增加System.out.println("ISBN: " + this.isbn);等,或者你可以声明一个单独的函数getInfo,它可以简单地打印每个函数。或者,如果您将其退回到商店,您可以随时打印。还有一点需要注意的是,您已经声明booksBook[] books = new Book[15],因为您正在创建一个Book对象数组而不是字符串。如果您需要更多帮助,请告诉我。

+0

真棒,这真的很有帮助。在setter方法上,是从文件中获取的String值,double值和int值实际值,还是只是名为value的变量?对不起,我确定这个愚蠢的问题,但就像我说的,我还在学习。如果它们是实际值,我很难弄清楚如何设置这些值。 –

+0

听说我至少在正确的轨道上感到非常欣慰我担心这将会是错误的我会被这个网站哈哈哈哈。 –

+0

另外,由于数组的索引从0开始,数组的声明不会是Book [] books = new Book [14]吗? –

1

1.你不应该使用字符串数组。您应该声明Book Array。那么分配您的Book对象将会更容易。

例如 Book [] books = new Book [15]; books [i] =新书(isbnNum,priceOfBook,copiesInStock);

2.因为Book类中的变量声明为私有类型。你应该在你的Book类中创建get方法来获取任何对象中的变量。

例如

public String getbnNum() 
{ 
return isbn; 
} 

public double getprice(){ 
return price; 
} 

public int getcopies(){ 
return copies; 
} 
+0

你的例子中有一本“书”缺失(新书(isbn ...)) – Soana

+0

哦,我错过了它。谢谢你:)) – zelda

1

我帮你把代码写的注释。我必须假设你的文件阅读代码是正确的,因为我没有这个文件。

import java.util.Scanner; 

public class Store { 

    /* 
    * This is the main method. It is where the code that starts off the 
    * application should go. 
    */ 
    public static void main(String[] args) throws Exception { 
     // Here, we take the array returned by the method and set it to a local variable. 
     Book[] books = readInventory(); 

     // This is an alternative notation than a normal for-loop. 
     for (Book book : books) { 
      System.out.printf("ISBN: %s, Price: %f, Copies: %d%n", 
        book.getISBN(), book.getPrice(), book.getCopies()); 
     } 

    /* Alternative to above. 
     for (int i = 0; i < books.length; i++) { 
      Book book = books[i]; 
      System.out.printf("ISBN: %s, Price: %f, Copies: %d%n", 
        book.getISBN(), book.getPrice(), book.getCopies()); 
     } 
    */ 
    } 

    // We add the return type of Book[] so we can get a reference to our array. 
    public static Book[] readInventory() throws Exception { 
     Book[] books = new Book[15]; 
     java.io.File file = new java.io.File("../instr/prog4.dat"); 
     Scanner fin = new Scanner(file); 

     // These variables don't need to be initialized yet. 
     String isbn; 
     double price; 
     int copies; 

     while (fin.hasNext()) { 

      // Fill the books array with Book objects it creates from the file. 
      for (int i = 0; i < books.length; i++) { 
       isbn = fin.next(); 
       price = fin.nextDouble(); 
       copies = fin.nextInt(); 

       Book book = new Book(isbn, price, copies); 
       books[i] = book; 
      } 
     } 
     fin.close(); 
     return books; 
    } 
} 

Book类:

public class Book { 
    private String isbn; 

    /* 
    * Careful using double as your type for variables that hold money values. 
    * If you do any division, you can end up getting answers different than 
    * what you might expect due to the way Java handles remainders. For that, 
    * make price a Currency type, which you can import from Java.util 
    */ 
    private double price; 

    private int copies; 

    public Book(String isbnNum, double priceOfBook, int copiesInStock) { 
     isbn = isbnNum; 
     price = priceOfBook; 
     copies = copiesInStock; 
    } 

    // This is an example of a getter method, which we need since our isbn is 
    // declared as private. Now, other methods can still read what isbn is. 
    public String getISBN() { 
     return isbn; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public int getCopies() { 
     return copies; 
    } 

    /* 
    * We can use the "this" keyword to refer to this instance's isbn variable, 
    * instead of the local variable isbn that was passed to the method. 
    * Therefore, in this tricky notation we are setting the object's isbn 
    * variable to the isbn variable passed to the method. 
    */ 
    public void setISBN(String isbn) { 
     this.isbn = isbn; 
    } 

    public void setPrice(Double price) { 
     this.price = price; 
    } 

    public void setCopies(int copies) { 
     this.copies = copies; 
    } 
} 

还要注意的是打印每本书的信息将是一个更先进的方式,使在Book类重写它继承默认toString方法toString()方法来自通用Object类。您应该使用称为覆盖注释的特殊约定来执行此操作,因为当我们从超类中重新定义方法时,这被认为是很好的做法(Object是所有对象的超类,包括Book)。

@Override 
public String toString() { 
    return String.format("ISBN: %s, Price: %f, Copies: %d%n", 
      this.getISBN(), this.getPrice(), this.getCopies()); 
} 

这将使我们能够简单地调用System.out.println(book);,例如,也意味着我们不必重写所有的代码,我们想打印一本书的每一个地方。这是一个重要的原则与对象 - 他们通常应该照顾自己。

+0

非常感谢你!虽然我收到了一些编译错误。在:(书籍:书籍){线我得到4个错误,(不是一个声明 为(书:书){与^指向书和另一个不是一个声明错误,箭头指向:,两个';'预期的错误,一个是在Book之后的^,另一个是在书本之前指向的)。 –

+0

而在代码的Override部分的末尾,我有两个错误(它们都是类,接口或枚举期望的错误,其中一个箭头指向字符串toString的S(){另一个在关闭@Override段的括号)。任何想法我做错了,我也会更新我的代码在原来的问题,所以你可以看看。 –

+0

没关系第二个评论,我在@Override部分之前意外关闭了这个类,现在没有得到这两个错误。 –