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

Java 为什么在这种情况下我不能说variable.array?,java,loops,for-loop,compiler-errors,Java,Loops,For Loop,Compiler Errors,我不明白为什么我不能做到这一点,因为我会得到一个错误,说“歌曲无法解决或不是一个领域”。顺便说一句,我是个书呆子,想学点东西:)提前谢谢你的时间,如果你需要更多信息,请告诉我 import java.util.ArrayList; public class Band { public String bandName; public ArrayList<String> musician = new ArrayList<String>(); public ArrayLis

我不明白为什么我不能做到这一点,因为我会得到一个错误,说“歌曲无法解决或不是一个领域”。顺便说一句,我是个书呆子,想学点东西:)提前谢谢你的时间,如果你需要更多信息,请告诉我

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

}
import java.util.ArrayList;
公营乐队{
公共字符串bandName;
公共ArrayList音乐家=新ArrayList();
public ArrayList songs=new ArrayList();
//建造师
公共波段(字符串波段名称){
this.bandName=bandName;
}
public void getBandSongs(字符串bandName){

对于(字符串s:bandName.songs){
歌曲
乐队
的一部分,而不是
乐队名

改用
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;
}
private List songs=new ArrayList();
公共列表getSongs(){
返回歌曲;
}
公共列表集歌曲(列表歌曲列表){
this.songs=歌曲列表;
}
现在,您可以将验证添加到这些方法中。例如,如果您想确保只有在歌曲列表中至少包含5首歌曲时才能设置歌曲列表:

public List<String> setSongs(List<String> songlist) {
    if(songlist.size() > 5) {
        this.songs = songlist;
    }
}
公共列表歌曲集(列表歌曲集){
如果(songlist.size()>5){
this.songs=歌曲列表;
}
}

有时IDE给您的错误是误导性的,但这一点很清楚。 那么,让我们来分析一下:

“歌曲无法解析或不是字段”

因此,这应该会发出警报。您应该做的第一件事是查看变量bandName的类型

public void getBandSongs(String bandName){
      for (String s : bandName.songs) ...
这是一个字符串!当然,您将无法访问字符串类型的“歌曲”字段

也许在您的方法签名中,您希望具有以下内容:

public void getBandSongs(Band band)
for (String s : this.songs)
在这种情况下,您应该能够访问
band.songs
就可以了

或者你可能是指以下内容:

public void getBandSongs(Band band)
for (String s : this.songs)
这意味着您将访问类Band的对象实例化的“songs”变量

总之:

在类中定义的属性:

public String bandName;
public ArrayList<String> musician = new ArrayList<String>();
public ArrayList<String> songs = new ArrayList<String>();
公共字符串bandName;
公共ArrayList音乐家=新ArrayList();
public ArrayList songs=new ArrayList();
可以通过该类类型的变量(在本例中为Band)访问

希望这能让你明白一点。你有什么特别的书吗?我推荐O'Reilly系列。祝你好运

ps:从你开始,我不想添加太多。但我建议你仔细阅读“封装”。这意味着,除非严格必要,否则默认情况下,你应该将你的类的参数设置为私有,并让其他类通过“getter”和“setter”访问它们。例如:

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. 

}
公共类频带{
私有字符串bandName;
私有ArrayList音乐家=新ArrayList();
私有ArrayList歌曲=新建ArrayList();
公共字符串getBandName(){
返回此.bandName;
}
public void setBandName(字符串bandName){
this.bandName=bandName;
}
//和其他两个属性一样,这样需要访问的类
//对于这些问题,将使用“get”方法或“set”方法,而不直接使用
//访问属性。
}

创建getter和setter的工作是如此的冗余,以至于IDE和IDE都有一个允许您自动执行这些操作的功能。

我建议您进行一次检查。请对代码、输入/输出和结构化文档(如HTML或XML)使用代码格式。要执行此操作,请选择示例并单击
{}
按钮位于消息发布/编辑表单上方。
bandName
是一个
String
变量。
String
变量没有
songs
成员。谢谢。这对理解有很大帮助。我刚开始学习一门编程入门课程,我正在学习《大Java早期对象》一书。谢谢你帮助:)你说公共字段是重新封装是什么意思?我应该改为使用私有字段吗?如果我这样做,我的程序就不工作了。这是我明天必须完成的任务,所以我已经非常感谢你的快速帮助。谢谢。是的,你应该将它们设置为私有字段。然后你可以通过一个只设置/获取字段的方法访问它们。我将编辑它们我的帖子有一个简单的例子。