Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Song类,使用抽象类和接口_Java_Inheritance_Interface_Abstract_Implements - Fatal编程技术网

Java Song类,使用抽象类和接口

Java Song类,使用抽象类和接口,java,inheritance,interface,abstract,implements,Java,Inheritance,Interface,Abstract,Implements,我想用这个程序做的是使用toString on song类输出歌曲的信息。当我输出它时,除了歌曲类型/流派之外,一切都很好。它仍在输出未确定的数据 abstract class Song implements ISong //SONG CLASS { private String name; private String rating; private int id; private SongType genre; public Song() { name = " ";

我想用这个程序做的是使用toString on song类输出歌曲的信息。当我输出它时,除了歌曲类型/流派之外,一切都很好。它仍在输出未确定的数据

 abstract class Song implements ISong //SONG CLASS
 {
private String name; 
private String rating;
private int id;
private SongType genre;

public Song()
{
    name = " ";
    rating = " ";
    id = 0;
    genre = SongType.UNDETERMINED;
}
public Song(String name, String rating, int id)
{
    this.name = name;
    this.rating = rating;
    this.id = id;
    this.genre =Song.UNDETERMINED;
}
public void setName(String name)
{
    this.name = name;
}
public void setRating(String rating)
{
    this.rating = rating;
}
public void setID(int id)
{
    this.id = id;
}
public String getName()
{
    return(this.name);
}
public String getRating()
{
    return(this.rating);
}
public int getID()
{
    return(this.id);
}


@Override
public String toString()
{
    return("Song: " + this.name +
           "\nID: " + this.id +
           "\nRating: " + this.rating +
           "\nGenre: " + this.genre);
}
}

class Pop extends Song //POP CLASS
{   

public Pop(String name, String rating, int id)
{
    super(name, rating, id);
}
}

interface ISong //INTERFACE
{
public enum SongType {POP, COUNTRY, HIPHOP, SOUL, UNDETERMINED;}

}

public class test{
public static void main(String [] args)
{
    Song one = new Pop("Pop Song", "Five", 123); 
    System.out.println(one);
}

}
当我输出它时,除了歌曲类型/流派之外,一切都很好。它仍在输出未确定的数据

但是,您实际上在哪里将您的类型字段设置为除歌曲类型以外的任何内容。未确定的

我建议您为Song类和ISong接口提供一个返回当前流派的
public SongType getGenre()
方法,以及一个适当的setter方法,
public void setGenre(SongType genre)
和在需要时接受SongType genre参数的构造函数。
toString()
方法应该调用
getgreen()
方法来获取当前的流派状态


最重要的是,您需要将具体类中的类型设置为除<代码>歌曲类型以外的其他类型。在尝试打印之前,未确定<代码>

请注意,这是您使用此代码遇到的最小问题。为什么
Pop
扩展
歌曲
?为什么
ISong
界面包含
MovieType
?我做了一部电影,现在我正在尝试一部歌曲。好的捕手Pop中的构造器是否可以将流派更改为Pop,或者我需要一个getter和setter?@edwardlavaire:试试看。:)但不管怎样,你绝对需要一个能手。只有当您希望字段是可变的,并且不在构造函数中设置它时,才需要setter。我尝试过,但由于类型是私有的,所以它不允许我更改it@edwardlavaire:因此抽象类实际上需要setter方法,并确保它是一个
final
方法,这样它就不会被重写,从而可以在需要时安全地在子类构造函数中使用。。或者让这片土地受到保护。