Почему указанный объект имеет право на сборку мусора? - PullRequest
3 голосов
/ 19 февраля 2010

Для справки, я НЕ новичок в Java, а скорее - парень среднего уровня, который немного забыл об основах Java.

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

Из вышеприведенного кода:

  • Почему после строки 6 2 объекта типа C имеют право на сборку мусора (GC)?

  • Почему в строке 4 и строке 10 в m1() передается копия из c1. Итак, в конце концов в строке 6 будет 1 объект (а не 2), которые будут иметь право на GC. В конце концов, не является ли передача Java по значению, а не передача по ссылке?

Ответы [ 2 ]

4 голосов
/ 19 февраля 2010

Существует разница между проходными ссылками по значению и проходными значениями по ссылке:)

Передается ли Java по ссылке
Java никогда не передается по ссылке, верно
Передать по ссылке или передать по значению

Возможно, вы захотите проверить статью Джона Скита о семантике передачи параметров в 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
1 голос
/ 19 февраля 2010

Что заставляет вас думать, что два объекта типа C доступны для GC после строки 6? Я вижу только один (c2). Какой инструмент вы используете, который говорит вам иначе?

Что касается вашего вопроса о передаче c1 в ваш m1 метод: то, что вы передаете (по значению), является ссылкой на объект - дескриптором, с помощью которого вы можете захватить объект, если хотите, - не копия этого. Факт, что вы передаете ссылку в m1, абсолютно не имеет значения, фактически - вы никогда не используете эту ссылку, вы сразу же перезаписываете ее ссылкой на новый объект, который затем возвращаете (это не влияет на c1, который все еще упоминается в main).

...