当我尝试以这种方式将enum变量作为参数传递给类时:
MyClass newObjectMyClass = new MyClass(EnumArgument.AAA);
然后我尝试将此参数值设置为新变量或将其传递给下一个类:
public class MyClass {
EnumArgument xarg;
public MyClass(EnumArgument qarg) {
xarg = qarg;
}
EnumArgument new = xarg;
NextClass nextClassObject = new NextClassObject(xarg);
public void move(Canvas can) {
Log.i("info", "xarg = " + xarg + " nextClassObject.doSomething = " + nextClassObject.doSomething + " new = " + new);
nextClassObject.doSomething(can);
}
}
Logcat向我展示了类似的内容:
I / info :: xarg = AAA nextClassObject.doSomething = null new = null threadid = 1:线程退出未捕获的异常
如你所见,logcat向我显示我的“xarg”值,但“new”变量为null ...“new”应该与xarg具有相同的值,我是对的吗?
(我只是写这段代码来告诉你我的意思,如果有任何错误,那可能就是我的错误。)
我认为存在一些逻辑错误。 当我把这一行:
NextClass nextClassObject = new NextClassObject(xarg);
我的move
方法效果很好。
答案 0 :(得分:1)
在Java中,初始值设定项在构造函数之前调用。
因此,当您致电new Myclass(EnumArgument.AAA)
时,会分配内存。首先,所有字段都获得默认值。所以就好像执行了这些指示一样:
xarg = null;
new = null; // The name "new" is actually illegal
nextClassObject = null;
那是因为参考变量的默认值是null
。
下一步是计算和分配初始化器。你有两个初始化器:
EnumArgument new = xarg;
NextClass nextClassObject = new NextClassObject(xarg);
因此,您将xarg
的值指定给new
。但是从上一阶段开始,xarg
为null
,因此new
现在也是null
。 nextClassObject
收到一个新的非null对象引用 - 但NextClassObject
的构造函数的参数是null
!
然后调用构造函数。
public MyClass(EnumArgument qarg) {
xarg = qarg;
}
所以现在你把你的论点的价值 - EnumArgument.AAA
- 放在xarg
中。因此,xarg
的值为AAA
,但new
的值为 null
,因为它是在前一阶段设置的,之前是构造函数将值赋给xarg
。
如果希望new
包含参数中的值,则不应该使用初始化程序对其进行初始化,而是在构造函数中为其赋值:
public MyClass(EnumArgument qarg) {
xarg = qarg;
new = xarg;
}
如果在构造函数和方法之前严格保留所有字段声明会更好。这样你就不会对执行的顺序感到困惑。