2010-02-19 2 views
3

기록을 위해 저는 이 아닙니다. 자바 초심자인데, 오히려 자바에 관한 기본 지식에 대해 조금 잊어 버린 중급 수준의 사람입니다.지정한 개체가 가비지 수집 대상이되는 이유는 무엇입니까?

  • 왜 6 행 후, 형 C의 두 객체가 가비지 컬렉션 (GC)을받을 수 있습니다 것이 그 것이다 : 위의 코드에서

    class C{ 
        public static void main(String a[]){ 
         C c1=new C(); 
         C c2=m1(c1);  //line 4 
         C c3=new C(); 
         c2=c3;    // line 6 
         anothermethod(); 
        } 
        static C m1(C ob1){ 
         ob1 =new C();  // line 10 
         return ob1; 
        } 
        void anothermethod(){} 
    }

    ?

  • 이유는 라인 (4) 및 라인 (10), 복사본 c1m1() 메소드로 전달되는 것이 아니다. 그래서 결국 6 번 라인에서 GC를받을 자격이 될 1 Object (2가 아닌)가 될 것입니다. 결국, 참조로 전달하는 것이 아니라 자바 전달이 아닌가? 패스에 의해 값-참조 및 패스 값 참조에 의한 :)의 차이

    Is Java Pass By Reference가있다

+2

좋은 코드 obfuscator를 사용합니다 – Roman

+1

이 코드는 컴파일해서는 안됩니다 :'anothermethod'는 정적이 아니고 정적 컨텍스트에서 호출됩니다 –

답변

1

라인 6 후 GC 사용할 수 있습니다 : 그러니까 기본적으로

, 난 당신의 코드는 다음과 같이 표시? 나는 단지 하나만 본다 (c2). 달리 사용하는 도구는 무엇입니까?

m1 방법으로 전달하는 것에 관한 질문에 대해 : 전달하는 값 (값으로)은 객체에 대한 참조입니다. 객체에 대한 참조입니다. 객체를 가져올 수있는 핸들입니다. . m1에 대한 참조를 전달한다는 사실은 완전히 관련성이 없습니다. 실제로는 참조를 사용하지 않고 새로운 객체에 대한 참조로 즉시 덮어 씁니다. 반환하면 반환됩니다. (여전히 참조되는 c1에는 영향을주지 않습니다. main).

+0

다음 링크의 질문 13을 참조하십시오 : http://www.examsguide.com/scjp/ freequestions2.html – Catfish

+0

@ 캐쉬 피쉬 : 우리는 그들이 틀렸다고 생각하는 유일한 사람이 아닙니다 : http://www.coderanch.com/t/452512/Programmer-Certification-SCJP/certification/help-garbage-collection –

+0

@ 메기 : 그들과 관련해서 그들은 틀렸다. 코드에서 Line 6부터 (그것들과 거의 같은 것처럼 보입니다.) 생성 된 첫 번째 C는 여전히 main에서 c1로 참조됩니다. 생성 된 두 번째 C (m1에 의해)는 더 이상 참조되지 않습니다 (참조하는 변수가 세 번째를 참조하지 않기 때문에) GC 될 수 있습니다. (main에 의해) 생성 된 세 번째 인스턴스는 여전히'main'에서'c2'와'c3'에 의해 참조됩니다. 따라서 두 번째 객체 만 GC 준비가됩니다. 최소한 (해당 코드에서 언급 된 유일한 것). 죄송합니다. 이전에 읽은 내역을 읽으면 제 'c2'와 'c3'이 섞였습니다. :-) –

4


Java is never pass by reference right right
Pass By Reference Or Pass By Value

당신은 존을 확인 할 수 있습니다

C# 매개 변수 전달 구문에 대한 Skeet의 기사 또한 자신이 가장 좋아하는 '프로그래머의 무지'인 것처럼 보입니다.
What's your favorite 'programmer ignorance' pet peeve. 당신이 유형 C의 두 개체를 생각하게 무엇

c1 = new C("Alice"); 
    // m1(C obj1) {  -- c1 gets passed to m1, a copy of the reference is made. 
    //     -- there are now two references to Alice (c1, obj1) 
    // obj1 = new C("Bob"); -- there is now one reference to Alice 
           // and one reference to Bob 
    // return obj1; -- returns a reference to Bob(c1 still reference Alice) 
    // }    -- when m1 returns, one of the references to Alice disappears. 
c2 = m1(c1); // c2 points to Bob 
c3 = new C("Charlie"); 
c2 = c3;  // <-- Bob is eligible for collection. 
       // There are now two references to Charlie