2016-07-28 20 views
0

コードAは正常に動作しますが、コードBは正しく動作すると思いますが、コードBは正しく動作しません。どうして?Javaの関数でオブジェクトを作成できないのはなぜですか?

機能でオブジェクトを作成できないのはなぜですか?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

'マット・'インターフェースは何ですか? –

+0

エラーには何が表示されますか? – Shaishav

+0

この質問では、「コードBが正しく動作しない」ということについて明確に定義されていませんでした。しかし、それはコンパイルエラーではありません。それはビジネスロジックエラーかもしれません。 – NangSaigon

答えて

2

コードBで何が起こっているがMURLParコンストラクタがそのメソッド内の名前aFieldを持ってSetFieldからdiskcount/diskindexへの参照を渡していることです。

aFieldを新しく作成したオブジェクトへの参照に再割り当てし、そのオブジェクトを操作します。 aFieldは、完全に別個のオブジェクトを参照していて、SetFieldを入力したときに参照していたものではありません。

あなたがCに精通している場合、あなたはこれらの線に沿って何かのように、ここで何をやっていると考えることができます:

void SetField(MAtt *aField) { 
    aField = (MAtt*) calloc(1, sizeof(MAtt)); 
} 

MAtt *diskcount; 
SetField(diskcount); 

そして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"); 
4

あなたがdiskcountの結果メモリアドレスとしてコマンドaField=new MAtt();

を使用する場合aFieldは、新しいメモリアドレスを取得するため、およびdiskindexは未初期化のままです。ここでは複数のチェックのために

https://stackoverflow.com/a/73021/3923800

関連する問題