因此,我正在练习面向对象的编程,并且试图制作一个Book类,该类可以有多个作者,但我不知道该怎么做。 这是练习的UML:
这是我的作者课程,效果很好:
//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类确实起作用了,但是现在我正试图对其进行更改,以便一本书可以有更多的作者)
任何帮助都将受到赞赏!
答案 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)