Java如何制作可以有一个或多个作者的书类

时间:2018-12-02 10:48:20

标签: java arrays class oop object

因此,我正在练习面向对象的编程,并且试图制作一个Book类,该类可以有多个作者,但我不知道该怎么做。 这是练习的UML: enter image description here

这是我的作者课程,效果很好:

//author class @ Ferran Tombal
public class Author {

    //attributen van de class auteur
    private String name;
    private String email;
    private char gender;

    //constructor
    public Author (String name, String email, char gender){
        this.name = name;
        this.email = email;
        this.gender= gender;
    }

    //methodes
    public String getName(){
        return name;
    }

    public String getEmail(){
        return email;
    }

    public void setEmail(String email){
        this.email = email;
    }

    public char getGender(){
        return gender;
    }

    //methode om gegevens van autheur opbject op te halen
    public String toString(){
        return "Author[name = " + name + ", email = " + email + ", gender = " + gender + "]";
    }
}

这是我尝试制作的Book类:

public class Book {

    //attributes
    private String name;
    private Author authors [] = new Author[2];
    private double price;
    private int qty = 0;


    public Book(String name, Author authors[], double price, int qty) {
        this.name = name;
        authors[0] = new Author("Tan Ah Teck", "AhTeck@somewhere.com", 'm');
        authors[1] = new Author("Paul Tan", "Paul@nowhere.com", 'm');
        this.price = price;
        this.qty = qty;
    }


    public String getName() {
        return name;
    }

    public Author getAuthors() {
        return authors[authors.length];

    }

    public double getPrice() {
        return price;
    }

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

    public int getQty() {
        return qty;
    }

    public void setQty(int qty) {
        this.qty = qty;
    }

    public String toString() {
        return "Book [name = " + name + " authors = " + authors[0] + " email = " + authors[0].getEmail() + " price = " + price + " qty = " + qty + "]";
    }

    //methodes om gegevens van de autheur op te halen
    public String getAuthorNames() {
        return authors[].getName();
}

    public String getAuthorEmails() {
        return authors[].getEmail();
    }

    public char getAuthorGenders() {
        return authors[].getGender();
    }
}

因此,当我尝试在main.java中创建一本书的对象时,book类的构造函数不起作用。 同样使用此功能:public Author getAuthors() { 它说:数组索引超出范围。 在获取作者姓名,电子邮件和性别的方法中,它还说:未知的类authors []。

如何修改此图书类,以便一本书可以有一个或多个作者? (当一本书只能有一位作者时,Book类确实起作用了,但是现在我正试图对其进行更改,以便一本书可以有更多的作者)

任何帮助都将受到赞赏!

2 个答案:

答案 0 :(得分:0)

  

它说:数组索引超出范围

首先,它不能使用给定的代码来说明这一点,因为它无法使用后三种方法进行编译。

好吧,authors.length == 2,并且您的数组只有索引0和1

如果您想真正地“找作者”,则想返回数组,而不是特定的数组。

public Author[] getAuthors() {
    return authors;
}

如果您确实想获得一个,则添加索引。

添加边界检查也是个好习惯

public Author getAuthor(int index) {
    return (index < 0 || index >= authors.length) ? null : authors[index];
}

但是,有了这些修复程序,您现在可能会看到null,因为您实际上有 两个 列表;您将传递给new Book()的那个,以及该对象实例中的字段。

相反,您将要做

private Authors[] authors;

public Book(String name, Author authors[], double price, int qty) {
    this.name = name;
    this.authors = authors;

然后在主要方法中 创建作者

Author[] authors = new Author[] {
    new Author("Tan Ah Teck", "AhTeck@somewhere.com", 'm'),
    new Author("Paul Tan", "Paul@nowhere.com", 'm')
};
Book b = new Book("name", authors, ...);
System.out.println(Arrays.toString(b.getAuthors()));
  

在获取作者姓名,电子邮件和性别的方法中,它还说:未知的类作者[]

因为authors[].blah无效的语法。您需要遍历每个数组值以获取相应的字段。

我建议使用Arrays.stream方法和StringJoiner处理此问题

答案 1 :(得分:0)

当您不为构造函数中的作者提供 this 关键字时,代码将与构造函数参数一起使用,而不与类变量一起使用,因此会遇到此问题。

尝试像这样从构造函数中删除作者:

public Book(String name, double price, int qty)