为什么我不能在Java中的函数中创建对象?

时间:2016-07-28 09:11:51

标签: java oop

代码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);
    }
}

2 个答案:

答案 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
相关问题