2015-03-13 63 views
1

我不知道這裏發生了什麼。我做了一個具有成員類的簡單應用程序。瘋了:爲什麼數組在成員級別爲零

這是我的代碼,其行爲如預期。這裏沒什麼特別的。主類使用構造函數初始化成員類並調用成員方法。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    int array[] = null; 

    // Init member class 
    subClass = new SubClass(); 
    subClass.doSomething(); 
} 

和會員類的代碼:

package com.example.test; 

public class SubClass { 
    private int[] array; 

    public SubClass(){ 
    if(array==null){ 
     array = new int[10]; 
    } 
    } 

    public void doSomething(){ 
    if(array == null){ 
     // We don't get here, which is good. 
    } 
    } 
} 

但現在我想從一個savedInstanceState傳遞成員類的陣列,例如。爲了保持這個例子簡潔而整齊,我只傳遞一個null值的數組引用。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    int[] array = null; 

    subClass = new SubClass(array); 
    subClass.doSomething(); 
} 

和會員等級:

package com.example.test; 

public class SubClass { 
    private int[] array; 

    public SubClass(int[] array){ 
    this.array = array; 

    // Whatever was passed, I want to make sure we have an array to work with. 
    if(array==null){ 
    // Yes, it is null so init it. 
     array = new int[10]; 
    // FROM HERE IT SHOULD BE AN int[10] array AND NOT NULL IN THIS CLASS 
    // NO MATTER WHAT THE CALLING APPLICATION DOES WITH IT'S PRIVATE 
    // VARIABLE (no, not parts ;)) 
    } 
    } 

    public void doSomething(){ 
    // and now, array should be of 10 length but it isn't! 

    if(array == null){ 
     // We do get here, which is wrong! 
     System.out.println("array == null in doSomething"); 
    } 
    } 
} 

如果我傳遞一個有效的數組,像數組=新INT [1],並在構造函數中忽略了什麼傳遞,只是總是初始化爲數組= new int [10],在doSomething方法中它又是一個int [1]數組!

謝謝。

+0

問題v.1:我可能是錯的,但SubClass中的數組永遠不會在構造函數上初始化,因爲它不爲空,它是空的數組 – 2015-03-13 19:07:59

回答

4
if(array==null){ 
// Yes, it is null so init it. 
    array = new int[10]; 
// FROM HERE IT SHOULD BE AN int[10] array AND NOT NULL IN THIS CLASS 
// NO MATTER WHAT THE CALLING APPLICATION DOES WITH IT'S PRIVATE 
// VARIABLE (no, not parts ;)) 
} 

您正在分配array而不是this.array。在本例中是局部數組而不是類變量。

所以:

if(array==null){  
    array = new int[10]; 
    System.out.println(array); 
    System.out.println(this.array); 
} 

將打印

Array[..] 
null 

當您在DoSomething的隨後參考你引用this.array

+0

是的,謝謝!我現在覺得很愚蠢。我做了一個參考副本。 – Harmen 2015-03-13 19:12:05

+0

我的編程技巧有點生疏。我花了幾個小時。 – Harmen 2015-03-13 19:35:55

+0

:)我們都去過那裏 – 2015-03-13 19:41:00

1

您正在設置數組的值,而您需要設置this.array。如果僅設置數組,則舊值爲空,因此無法將其複製到類成員變量中。

空引用沒有任何作用,如果引用訪問相同的地址,則引用只在變量之間進行復制,在這種情況下,它們不是因爲在初始化數組之前都爲空。如果在將數組賦值給this.array之前初始化了數組,那麼它們將具有相同的引用,並且可以互換使用它們直到返回構造方法。

+0

編譯器將搜索第一個匹配的變量名稱(以最受限制的範圍開始)所以它在this.array之前找到數組。我發現__always__在引用變量時是明確的 – 2015-03-13 19:13:15

相關問題