首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能在Java函数中创建一个对象?

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

Stack Overflow用户
提问于 2016-07-28 09:11:51
回答 2查看 111关注 0票数 0

代码A运行良好,我认为代码B可以正确工作,但实际上,代码B不能正确工作。为什么?

为什么我不能在函数- private void SetField(Context mContext,MAtt aField,String name)中创建一个对象?

码A

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-28 09:27:07

代码B中发生的情况是,MURLPar构造函数将对diskcount/diskindex的引用传递给SetField,该方法中的SetField名为aField

然后,通过引用新创建的对象重新分配aField,然后操作该对象。请注意,aField现在指的是一个完全独立的对象,而不是输入SetField时所指的任何对象。

如果您熟悉C,您可以将您在这里所做的事情看作是这样的:

代码语言:javascript
复制
void SetField(MAtt *aField) {
    aField = (MAtt*) calloc(1, sizeof(MAtt));
}

MAtt *diskcount;
SetField(diskcount);

然后期望diskcount在对SetField的调用之后发生更改,这显然是它所没有的。

如果您想要一个out参数,可以通过返回一个新创建的对象来模拟:

代码语言:javascript
复制
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;
}

然后:

代码语言:javascript
复制
diskcount = SetField(mContext, "Pardiskcount");
票数 2
EN

Stack Overflow用户

发布于 2016-07-28 09:22:09

因为aField在使用aField=new MAtt();命令时会获得新的内存地址。

因此,diskcountdiskindex的内存地址仍未初始化。

有关更多信息,请在这里查看:https://stackoverflow.com/a/73021/3923800

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38631939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档