创建Java类

时间:2014-07-21 05:16:34

标签: java arrays class

我目前正在开发一个库存程序,涉及一维数组,2个类(Store和Book),以及其他几个方法,例如方法和构造函数。

作为主要类的Store类,我想你可以说应该包含main()方法,并且应该从文件中读取购买列表,使用适当的消息处理每次购买(ISBN号,金额,价格或问题(如缺货或没有)),存储最多15本书籍类型的书籍,读取库存文件的方法,处理购买的方法,打印方法关闭时的库存以及销售的书籍数量和收盘时的金额。

Book类包括,book对象(每个book对象包含ISBN字符串,price double和copy int),构造函数,getter和setter,以及打印信息的方法。

由于数组应该在Store类中创建,但是类型为Book并且由book对象组成(我假设?),我无法确定如何正确地执行此操作(分配)值为isbn,price,copy变量,正确设置构造函数等。)

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

这是我到目前为止提出的代码:

商店类:

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());
    }
}

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

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:2)

很高兴看到你在跳到这里之前已经努力尝试了一些事情。到目前为止,你所做的一切都很好。但是你现在真正需要的是class Book中的getter和setter方法。这些将允许您返回或设置对象的变量值。

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;
    }
}

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

答案 1 :(得分:1)

1.您不应该使用String Array。您应该声明Book Array。然后分配您的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;
}

答案 2 :(得分: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;
    }
}

图书课程:

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;
    }
}

另请注意,打印每本书的信息的更高级方法是在toString()类中生成Book方法,该方法会覆盖它继承的默认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);,这也意味着我们不必在每个我们想要打印书籍的地方重写所有这些代码。这是对象的一个​​重要原则 - 他们通常应该照顾好自己。