【问题标题】:Calling a superclass constructor without a String?调用没有字符串的超类构造函数?
【发布时间】:2014-11-05 18:31:02
【问题描述】:

我目前正在尝试使用super(); 调用超类Album 的构造函数,但它不起作用。这个问题似乎源于我试图用 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>();
    }
}

【问题讨论】:

  • 您可以发布您在使用String 时遇到的错误吗?
  • Album 构造函数希望您为其提供专辑名称。所以你需要给它命名专辑的名字。这适用于您拨打super 时,就像您拨打new Album 时一样。你需要说super(name)
  • 你是否传递了错误的参数?

标签: java superclass


【解决方案1】:

Album 类没有无参数构造函数。看这里解释:Changing public data to private data in Java

【讨论】:

    【解决方案2】:

    看起来你应该打电话给super(name)。超类构造函数使用String 作为专辑名称,您的子类也这样做,但也使用Artist

    但即使我使用字符串,它仍然不起作用

    应该的。如果没有,那么你有一些错误的语法或其他东西。

    【讨论】:

    • 当我这样做时,它会调用这个方法:public String getArtist() { return artist; } 并因为艺术家而说“不兼容的类型”。这说明了什么?
    【解决方案3】:

    你把弦乐和艺术家搞混了。首先是更正后的代码:

    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 在其构造函数中需要一个字符串。 StudioAlbum 需要一个字符串(名称)和一个艺术家(艺术家)。使这项工作重做事物(这可能是适当的)的唯一方法是使用名称 String 调用 super()。如果你想超类来获取艺术家,你需要改变专辑类以使用艺术家类而不是字符串来存储名称。

    【讨论】:

    • 提示此类问题。我只是在 IDE 中复制了您的代码(Eclipse 是我方便的),并为缺少的(艺术家和曲目)生成了模型(空)类。然后只是语法高亮和类型检查器指出错误并在我尝试编译之前提供合理的更正。最好不要过分依赖 IDE 和工具,但有时这只会让事情变得微不足道。
    【解决方案4】:

    所以,如前所述,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 的所有字段(这通常是最佳做法)。

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多