我目前正试图用super();
调用超类专辑的构造函数,但它不起作用。这个问题似乎源于我试图用类型为Artist的对象而不是String来调用它,但即使我使用String,它仍然无效。任何人都可以指出我出错的地方 - 以及是否有更好的方式来打电话:
public class StudioAlbum extends Album {
private Artist artist;
public StudioAlbum(String name, Artist artist) {
super(artist);
this.name = name;
this.artist = artist;
albumType = "Studio";
}
public void setArtist(Artist artist) {
this.artist = artist;
}
public String getArtist() {
return artist;
}
}
如果这很有用,Album类看起来像这样(没有方法):
public class Album {
protected String name;
private ArrayList<Track> trackList;
private int length;
private int fileSize;
private double averageRating;
protected String albumType;
public Album(String name){
this.name = name;
trackList = new ArrayList<Track>();
}
}
答案 0 :(得分:0)
类Album
没有无参数构造函数。在这里查看解释:Changing public data to private data in Java
答案 1 :(得分:0)
看起来你应该致电super(name)
。超类构造函数使用String
作为相册的名称,您的子类也是如此,但也需要Artist
。
但即使我使用字符串,它仍然无法正常工作
它应该。如果它没有,那么你会有一些错误的语法或其他东西。
答案 2 :(得分:0)
你让弦乐和艺术家混淆了。这里首先是更正后的代码:
public class StudioAlbum extends Album {
private Artist artist;
public StudioAlbum(String name, Artist artist) {
super(name);
this.name = name;
this.artist = artist;
albumType = "Studio";
}
public void setArtist(Artist artist) {
this.artist = artist;
}
public Artist getArtist() {
return artist;
}
}
public class Album {
protected String name;
private ArrayList<Track> trackList;
private int length;
private int fileSize;
private double averageRating;
protected String albumType;
public Album(String name){
this.name = name;
trackList = new ArrayList<Track>();
}
}
还需要Artist和Track类。
超类Album期望在其构造函数中使用String。 StudioAlbum采用String(名称)和Artist(艺术家)。使这项工作重做工作(可能是合适的)的唯一方法是使用名称String调用super()。如果要超类来获取Artist,则需要更改类Album以使用Artist Artist类来存储名称。
答案 3 :(得分:0)
因此,如前所述,Album
没有无参数构造函数,因此无法使用super();
。
此外,StudioAlbum
构造函数(this.name = name
)的第二行是无用的,因为已经在Album
的构造函数中完成了。
这是一种更常用的方式来做你想做的事情:
public Album(String name, String albumType) {
this.name = name;
this.albumType = albumType;
this.trackList = new ArrayList<>(); // diamond operator from java7
}
public StudioAlbum(String name, Artist artist){
super(name, "Studio");
this.artist = artist ;
}
有了这个,您可以设置private
Album
的所有字段(这通常是最佳做法)。