坚果:为什么成员类中的数组为零

时间:2015-03-13 19:05:42

标签: java android constructor

我不知道这里发生了什么。我做了一个有成员类的简单应用程序。

这是我的代码,其行为符合预期。没什么好看的。主类使用构造函数初始化成员类,并调用成员方法。

@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.
    }
  }
}

但是现在我想要将成员类传递给一个Array,例如来自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");
    }
  }
}

如果我确实传递了一个有效的数组,比如array = new int [1],并且在构造函数中忽略了传递的内容,并且总是将init作为array = new int [10],在doSomething方法中它是一个int [1]再次阵列!

感谢。

2 个答案:

答案 0 :(得分: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

在这种情况下,

array是方法局部数组而不是类变量。

所以:

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

会打印

Array[..]
null

稍后在doSomething中引用它时,您引用this.array

答案 1 :(得分:1)

您正在设置数组的值,而您需要设置this.array。如果只设置数组,则旧值为null,因此无法将其复制到类成员变量。

空引用无效,如果引用访问同一地址,则引用仅在变量之间复制,在这种情况下它们不是因为在初始化数组之前两者都为null。如果你在将数组分配给this.array之前已经初始化了数组,那么它们将具有相同的引用,你可以互换使用它们直到构造函数方法返回。