代码A运行良好,我认为代码B可以正确工作,但实际上,代码B不能正确工作。为什么?
为什么我不能在函数- private void SetField(Context mContext,MAtt aField,String name)中创建一个对象?
码A
public class MURLPar {
public MAtt diskcount=new MAtt();
public MAtt diskindex=new MAtt();
public MURLPar(Context mContext){
SetField(mContext,diskcount,"Pardiskcount");
SetField(mContext,diskindex,"Pardiskindex");
}
public class MAtt {
public String name;
public String value;
}
private void SetField(Context mContext,MAtt aField,String name){
int id = mContext.getResources().getIdentifier(name, "string", mContext.getPackageName());
aField.name=mContext.getString(id);
}
}码B
public class MURLPar {
public MAtt diskcount;
public MAtt diskindex;
public MURLPar(Context mContext){
SetField(mContext,diskcount,"Pardiskcount");
SetField(mContext,diskindex,"Pardiskindex");
}
public class MAtt {
public String name;
public String value;
}
private void SetField(Context mContext,MAtt aField,String name){
aField=new MAtt(); //Create object
int id = mContext.getResources().getIdentifier(name, "string", mContext.getPackageName());
aField.name=mContext.getString(id);
}
}发布于 2016-07-28 09:27:07
代码B中发生的情况是,MURLPar构造函数将对diskcount/diskindex的引用传递给SetField,该方法中的SetField名为aField。
然后,通过引用新创建的对象重新分配aField,然后操作该对象。请注意,aField现在指的是一个完全独立的对象,而不是输入SetField时所指的任何对象。
如果您熟悉C,您可以将您在这里所做的事情看作是这样的:
void SetField(MAtt *aField) {
aField = (MAtt*) calloc(1, sizeof(MAtt));
}
MAtt *diskcount;
SetField(diskcount);然后期望diskcount在对SetField的调用之后发生更改,这显然是它所没有的。
如果您想要一个out参数,可以通过返回一个新创建的对象来模拟:
private MAtt SetField(Context mContext, String name){
MAtt aField = new MAtt(); //Create object
int id = mContext.getResources().getIdentifier(name, "string", mContext.getPackageName());
aField.name=mContext.getString(id);
return aField;
}然后:
diskcount = SetField(mContext, "Pardiskcount");发布于 2016-07-28 09:22:09
因为aField在使用aField=new MAtt();命令时会获得新的内存地址。
因此,diskcount和diskindex的内存地址仍未初始化。
有关更多信息,请在这里查看:https://stackoverflow.com/a/73021/3923800
https://stackoverflow.com/questions/38631939
复制相似问题