为什么我不能在这种情况下说变量.array?

时间:2013-12-10 16:15:28

标签: java loops for-loop compiler-errors

我不明白为什么我不能这样做,没有收到错误说“歌曲无法解决或不是一个字段”。顺便说一句,我是一个菜鸟,试着学习这些东西:)提前感谢您的时间,如果您需要更多信息,请告诉我。

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);
    }
 }

}

2 个答案:

答案 0 :(得分:0)

songsBand的一部分,而不是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的工作非常冗余,EclipseNetbeans IDE都具有允许您自动执行这些功能的功能。