调用没有String的超类构造函数?

时间:2014-11-05 18:31:02

标签: java superclass

我目前正试图用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>();
    }
}

4 个答案:

答案 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的所有字段(这通常是最佳做法)。