2011-07-20 42 views
0

我試圖覆蓋已定義的變量。Java Array從屬性加載

這裏是我的代碼:

package com.diesal11; 

import java.lang.reflect.Array; 

public class Test{ 

private class List { 
    public String[] words; 

    public List(String[] array) { 
     this.words = array; 
    } 
} 

public List[] all; 

public Test() { 
    this.all = new List[2]; 
    String[] array = new String[2]; 

    array[0] = "One"; 
    array[1] = "Two"; 
    this.all[0] = new List(array); 

    array[0] = "Three"; 
    array[1] = "Four"; 
    this.all[1] = new List(array); 

    System.out.println(this.all[0].words[0]); 
    System.out.println(this.all[0].words[1]); 
    System.out.println(this.all[1].words[0]); 
    System.out.println(this.all[1].words[1]); 
} 

public static void main(String[] args) { 
    Test test = new Test(); 
} 

}

的問題是在控制檯打印出:

Three 
Four 
Three 
Four 

我該如何解決這個問題?我需要的實際代碼是以這種方式設置的,所以它不會有太大的改變。

在此先感謝!

回答

2

問題是你正在存儲傳遞給List構造函數的數組的引用。
然後,您更改相同的數組並將其傳遞給第二個List對象。

相反,創建一個陣列,並通過在這樣的:

... 
String[] array = new String[2]; 

array[0] = "One"; 
array[1] = "Two"; 
this.all[0] = new List(array); 

array = new String[2]; // CREATE A NEW ARRAY 
array[0] = "Three"; 
array[1] = "Four"; 
this.all[1] = new List(array); 
... 

編輯 - 添加樣式相關反饋

更大問題是這樣的代碼有很多的風格問題:

  • 不要叫你上課List:您應該避免使用JDK中的類名,尤其是集合框架
  • 讓您MyListstatic類:它並不需要從含有類Test訪問任何領域 - 這是一個DTO
  • 從從設計的角度來看,你的代碼突出了保持對可變對象引用的問題 - 你無法控制調用代碼對你的對象(在這種情況下,作爲數組)的作用。

避免此問題的一個簡單的變化會是這樣:

static MyList { 
    String[] words; 

    public MyList(String... words) { 
     this.words = words; 
    } 
} 
... 
this.all[0] = new List("one", "two"); 

語法String... words被稱爲「可變參數」的參數 - 它創建上只有該方法具有與參考飛陣列(儘管數組也可以傳入,給你相同的問題)。 比較安全的方法是使陣列和存儲的副本是,或提供一種方法,可以讓你添加一個字(用列表來保存例如字)

  • 在一般,儘量避免陣列 - 更喜歡使用集合
+0

謝謝! 但是代碼是如何垃圾?我試圖學習正確的格式和所有。但不知道在哪裏看! – Diesal11

+0

好吧,我會解釋,因爲你問 - 見編輯問題 – Bohemian

+0

對不起,在哪裏?我看不到任何? – Diesal11

0

您需要在this.all中傳遞第二個元素的新數組。

String[] array = new String[2]; 

array[0] = "One"; 
array[1] = "Two"; 
this.all[0] = new List(array); 

array = new String[2]; 

array[0] = "Three"; 
array[1] = "Four"; 
this.all[1] = new List(array); 

每次你把它傳遞到List構造時間變量array指向相同的內存。

0

您應該爲第二個實例創建新的String [];通過重新使用第一個array,您只需更改all[0]all[1]都參考的同一陣列中的元素。換句話說,all[0]all[1]指的是內存中的相同位置。

String[] array = new String[2]; 
array[0] = "One"; 
array[1] = "Two"; 
this.all[0] = new List(array); 

String[] array = new String[2]; 
array[0] = "Three"; 
array[1] = "Four"; 
this.all[1] = new List(array); 

或保存行的代碼:

this.all[0] = new List(new String[] {"One", "Two"}); 
this.all[1] = new List(new String[] {"Two", "Three"}); 

而且這是一個不好的做法來命名類之一相同,常見的數據類型(java.util.List)。這將導致混亂。

+0

這是一個例子,所以沒關係,但謝謝! – Diesal11