Java - 从类中调用私有数组列表[重复]

Posted

技术标签:

【中文标题】Java - 从类中调用私有数组列表[重复]【英文标题】:Java - Calling private arraylist from class [duplicate] 【发布时间】:2016-06-06 05:10:30 【问题描述】:

我的模板打开一个选项菜单,用户输入 1-3 之间的内容来选择三个选项之一。

当用户选择选项 1 时,它要求他们输入一个数字teamNumber。必须实例化类Team,然后将其写入数组列表。

如果numberList 中至少有一个数字,用户可以选择选项 2。它要求他们输入数组列表中的任何数字并搜索它。如果找到他们输入的数字,则输入一个字符串teamMemberFirstName 和一个字符firstInitialLastName。然后它将输入写入位于另一个类 TeamMember 中的私有数组列表中。

一旦他们在选项 1 和 2 中输入了信息,他们就可以选择选项 3。它允许您根据输入的团队编号打印输入的名称列表。

我不确定如何在选项 3 中从 TeamMemberteamList 调用私有数组列表。有关如何进行此步骤的任何指导?我的代码如下。

主类:

public class Main 
    public static void main(String[] args) 
                        int choosing;
    Scanner scan = new Scanner(System.in);
String input;
int teamNumber;
boolean stayInLoop;
ArrayList<Team> numberList = new ArrayList<Team>();
do 
stayInLoop = true;
System.out.println("1. Add a new team");
System.out.println("2. Add a new team member");
System.out.println("3. View teams");
input = scan.nextLine();

if (input.equals("1")) 
  System.out.println("Enter a team number:");
  teamNumber = scan.nextInt();
  scan.nextLine();
  Team addTeam = new Team(teamNumber);    
  numberList.add(addTeam);


if (input.equals("2"))
boolean foundIt = false;
boolean valid = true;
System.out.println("Team number:");
teamNumber = scan.nextInt();
scan.nextLine();
  for (int a = 0; a < numberList.size() && foundIt == false; a++)
  Team addTeam = numberList.get(a);
    if (addTeam.findTeam() == teamNumber) 
    foundIt = true;
    System.out.println("Enter first name of team member:");
    String teamMemberFirstName = scan.nextLine();
    System.out.println("Enter first initial of last name:");
    char firstInitialLastName = scan.nextLine().charAt(0);
    TeamMember inputTeamMember = new TeamMember(teamMemberFirstName, firstInitialLastName);
    inputTeamMember.addMember(inputTeamMember, valid = true);
    System.out.println("Success!");
    
  
  if (foundIt == false) 
  System.out.println("Try again.");
  


if (input.equals("3"))
  for (int a = 0; a < numberList.size(); a++) 
  Team addTeam = numberList.get(a);
  //Not sure what to put where there are ????'s - I tried a few ideas and stuff I found online, but nothing worked    
  //I assume I call the method/class here????
  System.out.println("Team: " + addTeam.findTeam() + " Members: " + 
  "I will put the member called from the arraylist here????"); 
  

while (stayInLoop == true;)

团队成员类:

public class TeamMember 

private final String teamMemberFirstName;
private final char firstInitialLastName;
private ArrayList<TeamMember> teamList = new ArrayList<>();

public TeamMember(String teamMemberFirstName, char firstInitialLastName) 
  this.teamMemberFirstName = teamMemberFirstName;
  this.firstInitialLastName = firstInitialLastName;

public int addMember(TeamMember member, boolean valid) 
  valid = teamList.add(member);
  return teamList.size();


【问题讨论】:

从逻辑上讲,您的团队成员列表应该在您的Team 类中,而不是TeamMember 类中。然后只需定义一个 getter 来从 Team 类中获取私有列表。 【参考方案1】:

您不能直接访问其他类的私有字段。将您的列表移动到 Team 类或创建一个 getter 来检索列表。

【讨论】:

从我解释分配的方式来看,列表似乎必须是私有的(至少在提供的小代码中是这样),所以你的第二个选项可能是我的米找。我尝试在 TeamMember 类中创建一个 getter 来检索列表,但不确定如何在主类中设置它。有什么想法,或者我对此有什么想法吗? 好吧,我在你的代码中看到的是,每次你创建一个团队成员时,你都是在创建一个新的team list,这不会按照你想要的方式工作。我会将您的 teamList 移到主类中,这样您就只有一个副本【参考方案2】:

在公共类中,您可以在公共方法中返回private 对象。这似乎是这个项目中最简单的方法。向您的 TeamMember 类添加一个新方法,并让它返回 teamList

//在您的 TeamMember 类中,分配私有变量后的任何位置

public static ArrayList show() 
//the static keyword, in short, will make the method callable without a class instance.
    return teamList;

由于 TeamMember 方法 show() 现在是静态的,您应该可以简单地调用 TeamMember.show() 并获取 ArrayList。

重要提示:为了让它工作,你也必须将私有数组列表设为静态。静态对象不能调用非静态对象。

这将把它变成private static ArrayList&lt;TeamMember&gt; teamList = new ArrayList&lt;&gt;();

在 Main 类中,就像我上面所说的,只需调用 TeamMember.show()。您不需要创建实例。

【讨论】:

teamList 已针对该作业设置为私有,因此我不确定是否可以更改它。 哦。在这种情况下,安全总比后悔好。我会编辑答案。 新方法有效,我知道你要去哪里了。我不确定如何在不创建类的新实例的情况下将 TeamMember.show() 分配给变量/调用方法。这似乎是我首先陷入困境的地方 - 无论我尝试什么都会返回错误:非静态方法 show() 不能从静态上下文中引用 好的,我再编辑一下。【参考方案3】:

如果您将 teamList 更改为 public 而不是 private 您的 Main 类将能够访问该变量。当您在 Java 中创建 private 时,您基本上使该实例变量只能通过实例化它的类访问。如果您希望该变量对其他类可见以供参考,您应该将其设为 public

由于分配调用它,您将需要为您的“teamList”变量定义一个 getter 和 setter。

public void setArray(ArrayList newTeamList)
    teamList = newTeamList;


public ArrayList getArray()
    return teamList;

这将允许您通过方法访问私有变量

【讨论】:

赋值似乎要求它是私有的,因为 TeamMember 中声明数组列表的代码行已提供给我们,并且它被设置为私有。 这很愚蠢,因为在这种情况下实际上不需要调用私有声明。如果是这种情况,那么您需要为“teamList”编写 getter 和 setter 方法,这样您就可以从类外部访问私有实例变量。

以上是关于Java - 从类中调用私有数组列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在导入的类中调用私有方法[重复]

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

调用函数从类返回私有变量不起作用

访问类中的私有字段[重复]

C# + Unity - 从类列表中的变量中获取最小值[重复]

如何从类变量中调用函数方法[重复]