2016-07-28 2 views
0

코드 A가 제대로 작동하지만 코드 B가 올바르게 작동 할 수 있다고 생각하지만 사실 코드 B가 올바르게 작동하지 않습니다. 왜?Java의 함수에서 객체를 만들 수없는 이유는 무엇입니까?

기능에서 객체를 만들 수없는 이유는 무엇입니까? private void SetField(Context mContext,MAtt aField,String name)?

코드

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

'인터페이스는 out 매개 변수 같은 것을 원하는 경우


, 당신은 새로 생성 된 객체를 반환하여 해당 시뮬레이션 할 수 있습니다 ? –

+0

오류 메시지가 무엇입니까? – Shaishav

+0

"코드 B가 올바르게 작동하지 않습니다"라는 질문에 대해 명확하게 정의되지 않았습니다. 그러나 컴파일 오류가 아닙니다. 비즈니스 논리 오류 일 수 있습니다. – NangSaigon

답변

2

MURLPar 생성자 메소드 내 이름 aField을 가지고 SetFielddiskcount/diskindex에 대한 참조를 전달하는 것입니다.

그런 다음 aField을 새로 생성 된 개체에 대한 참조로 다시 할당 한 다음 해당 개체를 조작합니다. aField은 이제 완전히 별개의 개체를 가리키며, SetField을 입력했을 때 언급 된 것이 아닙니다.

당신이 C에 익숙하다면 당신은 당신이이 라인을 따라 뭔가 여기에 일을하는지 생각할 수 : SetField에 대한 호출 후 변경하는 다음

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

MAtt *diskcount; 
SetField(diskcount); 

그리고 diskcount을 기대 분명히하는 그것을 가지지 않을 것이다. 다음

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

당신이 diskcount의 결과 메모리 주소로 명령 aField=new MAtt();

를 사용할 때 aField 새로운 메모리 주소를 얻을 수 있기 때문에 diskindex은 초기화되지 않은 채로 있습니다. 여기 더 확인을 위해

: 코드 B에 무슨 일 https://stackoverflow.com/a/73021/3923800

관련 문제