我不知道这里发生了什么。我做了一个有成员类的简单应用程序。
这是我的代码,其行为符合预期。没什么好看的。主类使用构造函数初始化成员类,并调用成员方法。
@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]再次阵列!
感谢。
答案 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之前已经初始化了数组,那么它们将具有相同的引用,你可以互换使用它们直到构造函数方法返回。