2016-09-16 149 views
0

我嘗試了getter方法(創建一個getter方法是這個類,並返回對象,所以你可以在另一個類中使用它),但是當我運行它只是一個空ArrayList在這個例子中,我讓用戶輸入代碼(1,2,3 ...)和隨機名然後將該值存儲在ArrayList列表中,但是當我創建該類的實例並使用getList()方法時,它會返回一個空的ArrayList。 這是代碼:Java如何從另一個類訪問另一個ArrayList?

SubTestSite1

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

SubTestSite2

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 謝謝!

+2

你是否在'sts2'上調用了'add'? –

+0

這意味着你尚未添加任何內容。調試幫助。 –

+0

但是我認爲我在返回列表後添加這些值的權利?所以從理論上講,我在Site3中得到的列表被假設爲當前具有值的列表。 – Henry

回答

0

我沒有看到你main方法,所以我猜你是從main創建SubTestSite2對象,並對其調用add()那裏。爲了清楚起見,我們稱這個對象爲mainsts。如果是這種情況,請將項目添加到主列表中,然後創建一個新的SubTestSite2對象sts2,並嘗試讀取sts2's列表,而不是mainsts's。既然你沒有聲明ArrayList爲靜態的,在這種情況下,每個對象mainsts和sts2都有它自己的列表,所以sts2的列表確實是空的,但是mainst不會。

當您將ArrayList聲明爲static時,您已將其變爲類變量而不是實例變量。作爲「靜態」,所有使用該類的對象都將使用該變量。換句話說,mainsts和sts2在這裏將共享相同的列表。如果你想要這個,我想直接通過類SubTestSite2.list來訪問列表

+0

哦,我忘了,但是它是完全像你說的我初始化SubTestSite2並調用add()方法,這就是它 – Henry

+0

如果我使用SubTestSite2.list那麼我必須聲明ArrayList爲「靜態」? – Henry

+0

當它不是靜態時直接通過類訪問變量是不穩定的。我猜測程序不會知道要使用哪個版本的變量,並會給你一個錯誤。 –