代码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);
}
}
答案 0 :(得分:4)
因为CREATE TABLE lists (
id INT NOT NULL AUTO_INCREMENT,
desc varchar(30),
owner varchar(20),
visibility boolean,
PRIMARY KEY (id)
);
在使用命令aField
因此,aField=new MAtt();
和diskcount
的内存地址仍然未初始化。
有关详情,请点击此处:https://stackoverflow.com/a/73021/3923800
答案 1 :(得分:2)
代码B中发生的事情是MURLPar
构造函数将对diskcount
/ diskindex
的引用传递给SetField
,该方法中的aField
名称为aField
}。
然后,您使用对新创建的对象的引用重新分配aField
,然后操作该对象。请注意,SetField
现在指的是一个完全独立的对象,而不是您输入void SetField(MAtt *aField) {
aField = (MAtt*) calloc(1, sizeof(MAtt));
}
MAtt *diskcount;
SetField(diskcount);
时指的是什么。
如果你熟悉C,你可以把这里所做的事情想象成以下几点:
diskcount
然后期望SetField
在调用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;
}
后发生变化,这显然不会发生变化。
如果你想要一个out参数,你可以通过返回一个新创建的对象来模拟它:
diskcount = SetField(mContext, "Pardiskcount");
然后:
getElementById