SCJP Chapter 3 Frage 10. Falsche Antwort?

H2SO3-

Bekanntes Mitglied
Hi,

im SCJP Buch im Chapter 3 ist die 3 Frage folgendes.

Java:
public class Dozens {
	int[] dz = {1,2,3,4,5,6};
}

public class Eggs {

	public static void main(String[] args){
		Dozens [] da = new Dozens[3];
		da[0] = new Dozens();
		Dozens d = new Dozens();
		da[1] = d;
		d = null;
		da[1] = null;
	}
}

Die Frage ist nun wie viele Objekte am ende für den garbage collector noch da sind.

Als Antwort steht da 2. Ich denke jedoch es sollten 3 sein. Zum einem das new Dozens in da[0] mit dem internen array (sind 2) und dann kommt ja noch das Dozens[] da hinzu. Also sind es zusammen 3 und nicht 2.

Ist die Antwort im Buch falsch oder habe ich einen denkfehler?
 
dass das object da[1] nicht mehr vorhanden ist ist mir klar. Es geht um das Object da[0] und um das array da[] ansich. die beiden sind ja noch da
 
nein eben nicht

Object 1: Dozens [] da
Object2: da[0] = new Dozens();
Object3: das int[] dz im da[0] = new Dozens(); Object

alles klar?
 
Abgesehen von der (soweit ich das bisher gesehen habe) Praxisferne ergibt sich aus dieser Frage ein weiterer Grund, warum man diesen *CJP-Fragen skeptisch gegenüber stehen sollte: An dieser Stelle ist nicht klar, was mit "Objekte" gemeint ist: Nur die Objekte, die von der main aus sichtbar sind, oder auch deren internen Objekte? (Und blöd-provokativ: Ist der main-Thread nicht auch ein Objekt?). Der Antwort nach sind nur die von der main erstellten gemeint.
 
ich gehe mal davon aus das auf Dozent[] als Object gesehen wird. eine andere Teilfrage war wie viele Objecte erzeugt werden. Da war die richtige Antwort 5. Dies kann aber nur hinhauen wenn Dozent[] auch als Object gesehen wird.

Klar main ist in gewisser weiße auch ein Objekt aber dies ist in den Fragen egal.
 
Wenn an anderer Stelle die Antwort war, dass dort 5 Objekte erstellt werden (d.h. der Dozens-Array, und zwei Dozens-Objekte mit jeweils einen int-Array drin) dann würde ich auch sagen, dass das im Widerspruch zu der Antwort steht, dass hier nur noch 2 Objekte übrig sein sollen: Wenn der int-Array im Dozens-Objekt mitgezählt wird, sind es 3.
 
Ich denke der Teufel liegt hier im Detail, bzw im Aufgabentext. Wie üblich bei solchen Test muss man jedes Wort auf die Waagschale legen. ???:L
 
Aus dem Buch:

Java:
public class Dozens {
    int[] dz = {1,2,3,4,5,6,7,8,9,10,11,12};
}
 
public class Eggs { 
    public static void main(String[] args){
        Dozens [] da = new Dozens[3];  // Objekt 1 erstellt (Array)
        da[0] = new Dozens();          // Objekt 2+3 erstellt (Dozens und Dozenz.dz)
        Dozens d = new Dozens();       // Objekt 4+5 erstellt (Dozens und Dozenz.dz)
        da[1] = d;                     // Referenz auf 4+5 'gesichert'
        d = null;                      // Original Referenz auf 4+5 gelöscht
        da[1] = null;                  // 'Sicherung' der Referenz auf 4+5 gelöscht
        // do stuff
    }
}
Which two are true about the objects created within main(), and eligible for garbage collection when line 14 is reached?

A Three objects were created
B Four objects were created
C Five objects were created
D Zero objects are eligible for GC
E One object is eligible for GC
F Two objects are eligible for GC
G Three objects are eligible for GC

Wenn ich mich recht entsinne, meinen die mit Objekt ein Element auf dem Heap, somit Objekte und auch Arrays.

Bei erreichen der 14. Zeile ("// do stuff") wurden 5 Objekte erstellt, Objekt 1 (Array) und die Objekte 2+3 (da[0]) sind auch noch referenziert. Objekte 4+5 sind allerdings verloren gegangen, da beide existierenden Referenzen gelöscht wurden 🙂

Also C und F

Zum Vergleich die Antwort aus dem Buch:

C and F are correct. da refers to an Object of type "Dozenz array", and each Dozenz object that is created comes with its own "int array" object. When line 14 is reached, only the second Dozenns object (and its "int array" object) are not reachable.
 
@TO
ich glaube du hast die frage falsch verstanden ...

es wird danach gefragt wie viele objekte nun durch fehlende referenzen überhaupt für den GC freigegeben sind ... und das sind nun mal 2 ... ein mal das Dozen objekt ... und dann das darin liegende array ...

das was du hier falsch übersetzt hast und desshalb deine annahme von "3" falsch ist war das du dachtest die frage würde meinen wie viele objekte noch da sind ... dann hättest du mit deinen "3" ja recht ... aber das wurde eben nicht gefragt .. sondern nach der anzahl die in zeile 14 vom GC weggeräumt werden KÖNNEN ...
 
Hmm, hab ich mir auch ueberlegt, aber dann muessten es ja 5 Objekte sein da die Methode sowie das Program beendet wird und dann gar keine Referenzen auf irgendwelche Objekte existieren...

Na ja, solche Spitzfindigkeiten haben in Test/Pruefungen nun wirklich nichts zu suchen und gehoeren verboten!
 
das Programm bzw. die Methode ist aber zum Zeitpunkt der Frage noch nicht beendet, sondern steckt in Zeile 14 fest. An Stelle von "do stuff" können noch 20 andere Zeilen stehen, die aber in dieser Frage total egal sein würden. 😉

Edit: Der Test im Buch ist übrigens (mit Ankündigung!) ein wenig schwerer/komplizierter aufgestellt, da man sich bei diesen Fragen wirklich den Kopf zerbrechen soll.

Im Examen gibt es dann allerdings auch Fragen wie zB.

Code:
class Fizz {
    int x = 5;
    public static void main(String[] args) {
        final Fizz f1 = new Fizz();
        Fizz f2 = new Fizz();
        Fizz f3 = FizzSwitch(f1,f2);
        if (f1==f3) f1 = f2;
        System.out.println(f2==f3 + " " + (f2.x == f3.x));
    }
    static Fizz FizzSwitch(Fizz x, Fizz y){
        final Fizz z = x;
        z.x = 6;
        return z;
    }
}

What is the result?
A true true
B false true
C true false
D false false
E Compilation fails
F An exception is thrown at runtime

Da muss man dann immer genau hinschauen 😉

PS: code- statt Java-Tag, sonst wäre das ja langweilig, im Test hat man auch Plain Text 😛
 
Zuletzt bearbeitet:
Die Frage ist nun wie viele Objekte am ende für den garbage collector noch da sind.

Which two are true about the objects created within main(), and eligible for garbage collection when line 14 is reached?

Vermutlich war der Unterschied zwischen "noch da" (d.h. noch nicht für den Garbage Collector einsammelbar) und "eligible" (d.h. DOCH einsammelbar) der Grund für die Verwirrung: Das bedeutet genau das Gegenteil, von daher ist das doch kein Fehler im Buch.
 

Zurück
Oben