2013-05-27 2 views
0

void ref 메소드에서 sb 변수에 액세스하는 방법을 찾으려고합니다. 가능한가? 이 문제는 시험 준비로 나왔습니다.void ref 메소드의 자바 참조 변수

public class X{ 
    public void ref(String refStr, StringBuilder refSB){ 
    refStr = refStr + refSB.toString(); 
    refSB.append(refStr); 
    refStr = null; 
    refSB = null; 
    //how can I access main variable sb here? Not possible? 
    //sb.append(str); 
    } 
    public static void main(String[] args){ 
    String s = "myString"; 
    StringBuilder sb = new StringBuilder("-myStringBuilder-"); 
    new X().ref(s, sb); 
    System.out.println("s="+s+" sb="+sb); 
    } 
} 
+5

SB하지 마십시오

public void ref(String refStr, StringBuilder refSB){ refStr = refStr + refSB.toString(); refSB.append(refStr); refStr = null; //USe refSB variable here refSB.append(str); } 

new X().ref(s, sb); 그리고를 사용 ref()에 실제로 sb 참조를 전달하는 무효 ref() method.You에서 SB 참조를 사용하는 것이 가능하며 refSB 당신의 방법으로. –

+0

매개 변수로 전달되어야하며 (현재와 같이) 전역 변수가되어야합니다. – sashkello

+0

@sashkello 전역 변수? 제발, 거기 가지 마세요 ... – vikingsteve

답변

2

null을 참조 값에 할당하면 아무 것도 가리 키지 않습니다. 매개 변수를 전달하면 참조로 전달합니다 (메모리 포인터). 새 값 또는 null을 지정하면 참조가 변경되지만 참조하는 메모리 개체는 변경되지 않습니다.

따라서 메서드 내에서 StringBuilder으로 작업 할 수 있으며 메서드 외부에서 변경 내용이 유지되지만 포인터 자체는 메서드의 로컬이므로 포인터에 다른 것을 할당 할 수 없습니다.

public static void ref (StringBuilder refSB) { 
    refSB.append("addedWithinRefMethod"); // This works, you're using the object passed by ref 
    refSB = null; // This will not work because you're changing the pointer, not the actual object 
} 

public static void main(String[] args) { 
    StringBuilder sb = new StringBuilder(); 
    ref(sb); 
    System.out.println(sb.toString()); // Will print "addedWithinRefMethod". 
} 

당신이 배열을 사용하여 예를 들어, 한 번 더 derreference을 사용할 필요가 코드 당신이 원하는 것을 할 수 있도록하려면 : : 예를 들어

명심 그러나

public static void ref(StringBuilder[] refSB) { 
    refSB[0] = null; // This works, outside the method the value will still be null 
} 

public static void main(String[] args) { 
    StringBuilder[] sb = new StringBuilder[] { new StringBuilder() }; 
    ref(sb); 
    System.out.println(sb[0]); // Will print "null" 
} 

을 그 부작용 (외부에서 정의 된 개체를 변경하는 메서드)은 일반적으로 나쁜 습관으로 간주되며 가능한 경우 피합니다.

1

네,이 refSB = null;.

+0

@ ConstantineNovykov 죄송합니다 ... 편집 됨 :-) – Rohan

+0

그건 그냥 메모 :) +1 – user

관련 문제