2010-02-19 8 views
3

Pour l'enregistrement, je suis PAS un débutant Java, mais - plutôt - un gars de niveau intermédiaire qui a oublié un peu sur les fondamentaux de Java.Pourquoi l'objet spécifié est-il éligible pour la récupération de place?

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(){} 
}

À partir du code ci-dessus:

  • Pourquoi est-ce que, après la ligne 6, 2 objets de type C sont éligibles pour la collecte des ordures (GC)?

  • Pourquoi est-ce pas que, dans la ligne 4 et la ligne 10, un exemplairede c1 est passée dans le procédé m1(). Donc, éventuellement à la ligne 6, il y aura 1 objet (pas 2) qui sera admissible au GC. Après tout, n'est-ce pas java pass-by-value plutôt que pass-by-reference?

+2

Vous utilisez le code sympa obfuscator – Roman

+1

ce code ne devrait pas compiler: 'anothermethod' n'est pas statique mais être appelé dans un contexte statique –

Répondre

1

Ce que vous fait penser que deux objets de type C sont disponibles pour GC après la ligne 6? Je ne vois qu'un seul (c2). Quel outil utilisez-vous qui vous dit autrement? En ce qui concerne votre question sur le passage c1 dans votre méthode m1: Ce que vous passez (par la valeur) est une référence à l'objet - une poignée par laquelle vous pouvez saisir l'objet, si vous voulez - pas une copie de celui-ci . Le fait que vous transmettiez une référence en m1 est complètement hors de propos, en fait - vous n'utilisez jamais cette référence, vous l'écrasez immédiatement avec une référence à un nouvel objet, que vous retournez (ceci n'affecte pas le c1 qui est toujours référencé dans main).

+0

Référez-vous à la question 13 dans le lien suivant: http://www.examsguide.com/scjp/ freequestions2.html – Catfish

+0

@Catfish: Nous ne sommes pas les seuls à penser qu'ils ont tort: ​​http://www.coderanch.com/t/452512/Programmer-Certification-SCJP/certification/help-garbage-collection –

+0

@ Silure: En ce qui les concerne, ils ont tort. A partir de la ligne 6 dans votre code (et il ressemble à peu près au leur), le premier C créé (par main) est toujours référencé comme c1 dans main; le second C créé (par m1) n'est plus référencé (car la variable qui le référencait ne fait pas référence au troisième) et peut être GC'd; la troisième instance créée (par main) est toujours référencée à la fois par 'c2' et' c3' dans 'main'. Ainsi, le deuxième objet est le seul prêt pour GC. Au moins (le seul mentionné dans ce code). Toutes mes excuses si vous lisiez ma décomposition précédente, j'ai mélangé mes 'c2' et' c3'. :-) –

4

Il y a une différence entre les passe-références par valeur et passer des valeurs par référence :)

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

Vous pouvez consulter Jon L'article de Skeet sur la sémantique de passage de paramètres C#, vu qu'il s'agit de sa peeve préférée de «programmeur ignorance»:
What's your favorite 'programmer ignorance' pet peeve.

Donc, fondamentalement, je vois votre code procédez comme suit:

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