【问题标题】:Java how to access another ArrayList from another class?Java如何从另一个类访问另一个ArrayList?
【发布时间】:2016-09-16 02:21:28
【问题描述】:

我尝试了getter方法(创建一个getter方法是这个类并返回对象,以便您可以在另一个类中使用它)但是当我运行它时它只是一个空的ArrayList

在这个例子中,我让用户输入代码 (1, 2 ,3, ...) 和一个随机名称,然后将该值存储在 ArrayList 列表中,但是当我创建该类的实例并使用 getList () 方法它返回一个空的 ArrayList。 这是代码:

子测试站点1

package testsite;

public class SubTestSite1 {

private int id;
private String name;

@Override
public String toString() {
    return this.getId() + "   " + this.getName()+"    ";
}

public SubTestSite1() {
}

public SubTestSite1(int id, String name) {
    this.id = id;
    this.name = name;
}

public int getId() {
    return id;
}

public String getName() {
    return name;
}

public void setId(int id) {
    this.id = id;
}

public void setName(String name) {
    this.name = name;
}
}

子测试站点2

package testsite;

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Hashtable;

public class SubTestSite2 {
Hashtable hash = new Hashtable(100);
ArrayList list = new ArrayList(100);
Scanner sc = new Scanner(System.in);    

public ArrayList getList() {
    return list;
}

public void add() {
    int id;
    String name, choice = null, customer;
    do {
        System.out.print("enter id: ");
        id = Integer.parseInt(sc.nextLine());
        System.out.print("enter name: ");
        name = sc.nextLine().trim().toUpperCase();
        SubTestSite1 sts1 = new SubTestSite1(id, name);
        list.add(sts1);
        System.out.println("Continue? Y/N");
        choice = sc.nextLine();
    } while (choice.equalsIgnoreCase("y"));
    System.out.print("Customer name: ");
    customer = sc.nextLine();
    hash.put(customer, list);
    SubTestSite3 sts3 = new SubTestSite3();
    sts3.displayOrder(this.hash, customer);
}
}

SubTestSite3

package testsite;

import java.util.Hashtable;
import java.util.ArrayList;
import java.util.Scanner;


public class SubTestSite3 {

public void displayOrder(Hashtable hash, String name) {
    SubTestSite2 sts2 = new SubTestSite2();
    System.out.println(sts2.getList());

}
}

主要

package testsite;

public class TestSite {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    SubTestSite2 sts2 = new SubTestSite2();
    sts2.add();
}
}

不过,不要介意 Hashtable,我只是想玩弄它:P 谢谢!

【问题讨论】:

  • 你在sts2上打过add吗?
  • 表示你没有添加任何东西。调试有帮助。
  • 但我想我是在添加这些值之后返回列表,对吗?所以理论上我在 Site3 中得到的列表应该是当前包含值的列表。
  • 根据您显示的代码,似乎从未调用过 SubTestSite2.add 并且从未更改过 SubTestSite2.list。
  • 我在初始化 ArrayList 之前添加了 static 关键字,它可以工作....虽然我仍然很困惑;_;

标签: java arraylist


【解决方案1】:

我没有看到你的main 方法,所以我猜你是从main 创建一个SubTestSite2 对象并在那里调用add()。为清楚起见,我们称该对象为mainsts。如果是这种情况,请将项目添加到 mainsts 的列表中,然后创建一个新的 SubTestSite2 对象 sts2,并尝试读取 sts2's 列表,而不是 mainsts's。由于您没有将 ArrayList 声明为静态,因此在这种情况下,每个对象 mainsts 和 sts2 都有自己的列表,因此 sts2 的列表确实为空,但 mainsts 的列表不会。

当您将ArrayList 声明为static 时,您将其设置为类变量而不是实例变量。作为“静态”,所有使用该类的对象都将使用该变量。换句话说,这里的 mainsts 和 sts2 将共享同一个列表。如果你想要这个,我会说直接通过带有 SubTestSite2.list 的类访问列表

【讨论】:

  • 哦,我忘记了,但是就像你说的那样,我初始化了 SubTestSite2 并调用了 add() 方法,就是这样
  • 如果我使用 SubTestSite2.list 那么我必须将 ArrayList 声明为 static 吗?
  • 当变量不是静态时直接通过类访问变量是不稳定的。我猜程序不知道要使用哪个版本的变量,并且会给你一个错误。
猜你喜欢
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多