我不明白为什么我不能这样做,没有收到错误说“歌曲无法解决或不是一个字段”。顺便说一句,我是一个菜鸟,试着学习这些东西:)提前感谢您的时间,如果您需要更多信息,请告诉我。
import java.util.ArrayList;
public class Band {
public String bandName;
public ArrayList<String> musician = new ArrayList<String>();
public ArrayList<String> songs = new ArrayList<String>();
// Constructor
public Band(String bandName) {
this.bandName = bandName;
}
public void getBandSongs(String bandName){
for (String s : bandName.songs) { <<<<<<<<<<<ERROR HERE
String rating = s.substring(0,1);
s = s.substring(1);
System.out.println("Rating: " + rating + " - Song name: " + s);
}
}
}
答案 0 :(得分:0)
songs
是Band
的一部分,而不是bandName
。
改为使用this.songs
(或只使用songs
)。
应该注意的是,公共字段是反对封装(因而是OOP)。这真的是你想要的吗?
封装的主要好处(为实例成员提供getter和setter)是一种统一的方式来访问类中的字段。例如,这允许您为数据添加验证逻辑。
private List<String> songs = new ArrayList<>();
public List<String> getSongs(){
return songs;
}
public List<String> setSongs(List<String> songlist) {
this.songs = songlist;
}
现在您可以为这些方法添加验证。例如,如果你想确保你只能设置歌曲列表,如果它至少有5首歌曲:
public List<String> setSongs(List<String> songlist) {
if(songlist.size() > 5) {
this.songs = songlist;
}
}
答案 1 :(得分:0)
有时IDE给你的错误会产生误导,但这一点很清楚。 那么,让我们来分析一下:
“歌曲无法解析或不是字段”
所以应该响起警报。你应该做的第一件事是看看你的变量bandName的类型。
public void getBandSongs(String bandName){
for (String s : bandName.songs) ...
这是 String !当然,您将无法访问String类型的字段“歌曲”。
也许在你的方法签名中你想要有以下内容:
public void getBandSongs(Band band)
在这种情况下,您应该可以正常访问band.songs
。
或者你可能意味着以下内容:
for (String s : this.songs)
这意味着您将访问Band类的对象实例化的“songs”变量。
总结:
您在班级中定义的属性:
public String bandName;
public ArrayList<String> musician = new ArrayList<String>();
public ArrayList<String> songs = new ArrayList<String>();
可以通过该类型的变量(在本例中为Band)访问。
希望这有点清楚。您是否特别关注任何书籍?我推荐O'Reilly系列。祝你好运!
ps:自从你开始以来我不想添加太多。但我建议你阅读“封装”。这意味着,除非绝对必要,否则默认情况下,您应该使您的班级参数私有,并让其他班级通过“getters”和“setters”访问它们。这样:
public class Band {
private String bandName;
private ArrayList<String> musician = new ArrayList<String>();
private ArrayList<String> songs = new ArrayList<String>();
public String getBandName(){
return this.bandName;
}
public void setBandName(String bandName){
this.bandName = bandName;
}
//And like that for the other two attributes. That way the classes that need access
// to these will either use a "get" method or a "set" method without directly
// accessing the attributes.
}
创建getter和setter的工作非常冗余,Eclipse和Netbeans IDE都具有允许您自动执行这些功能的功能。