2015-03-13 74 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

相关问题