Seite 1 von 1

Frage zur 11. Übung

Verfasst: 13. Jul 2009 19:50
von Pibi
Hallo,

ich bin zwar etwas hinterher, hoffe aber, mir kann trotzdem jemand auf die Sprünge helfen.
Die 2. Aufgabe der 11. Übung verlangt einen Konstruktor ohne Parameter, der "das Attribut" initialisieren soll.....dabei soll es sich zunächst um ein Objekt der Klasse Hashset handeln.
Erwartet hätte ich sowas wie Golf(){ obengespeichertesobjekt=new Hashset() } oder so ähnlich, in der Musterlösung hab ich aber folgendes gefunden:
Golf() {
this(2);
}

Das verstehe ich nicht ganz. Was genau bedeutet es denn, wenn ich this etwas in Klammern übergebe? Dass es etwas mit den weiter unten benötigten Fällen auf sich hat, kann ich mir denken, aber das Prinzip ist mir völlig unklar. Könnte mir bitte jemand erklären, was das bedeutet? Was genau passiert denn in diesem Konstruktor, und was hat es mit dem this(2) auf sich? Und vor allem: wo sind die geforderten Generics in diesem Konstruktor?

Vielen lieben Dank im Vorraus und einen schönen Abend noch

PiBi

Re: Frage zur 11. Übung

Verfasst: 13. Jul 2009 20:27
von Daniel S.
Ich glaube das super ist falsch und müsste stattdessen this heißen. Mit super(...) wird normalerweise der Konstruktor der Super-Klasse aufgerufen. In diesem Fall soll aber der andere Konstruktor der eigenen Klasse aufgerufen werden, der darunter definiert ist und einen int als Parameter erwartet. Mit this(2); wird also der Wert 2 als Paramater an den anderen Konstruktor übergeben. Darin sind dann auch die genannten Generics zu finden.

Re: Frage zur 11. Übung

Verfasst: 13. Jul 2009 20:42
von Pibi
Danke für die schnelle Antwort......ein "super" hab ich zwar nirgendwo finden können, aber verstanden hab ichs hoffentlich trotzdem.
Bei der Klasse test() z.B., ist es richtig, dass mit this(2) die Testklasse mit dem Parameter 2 aufgerufen und abgearbeitet wird? Warum rufe ich aber nicht gleich eine Testklasse mit einem Parameter auf und gehe diesen Umweg über test()?

Zumindest soweit aber vielen Dank, das war mir wirklich unverständlich!

Eine letzte Frage habe ich noch bei folgender Methode:

public static void test(int typ) {
Golf golf = new Golf(typ);

// Schlagweiten erfassen
golf.neuerRekord(new GolfRekord("Emil Einself", 111.11));
......
}

Was bezweckt denn golfPUNKTneuerRekord? Ist das wieder eine verkürzte Schreibweise für irgendetwas? Sowas wie Rekord a=new Rekord.......aber in welcher "Variablen" wird denn dann das angelegte Objekt gespeichert? Was genau passiert denn in diesem Aufruf?

Re: Frage zur 11. Übung

Verfasst: 13. Jul 2009 21:43
von Daniel S.
Pibi hat geschrieben:Danke für die schnelle Antwort......ein "super" hab ich zwar nirgendwo finden können, aber verstanden hab ichs hoffentlich trotzdem.
Ups, wie bin ich denn auf super gekommen!? Da steht ja this. Sehr seltsam...
Bei der Klasse test() z.B., ist es richtig, dass mit this(2) die Testklasse mit dem Parameter 2 aufgerufen und abgearbeitet wird? Warum rufe ich aber nicht gleich eine Testklasse mit einem Parameter auf und gehe diesen Umweg über test()?
"test"? Welche Testklasse? Der Konstruktor Golf() verwendet einfach einen festgelegten Standardstyp (hier Typ 2) und erlaubt es die Klasse Golf zu verwenden, ohne dass man sich damit beschäftigen muss welcher Collection-Typ nun geeignet ist. Er ist somit eine Abkürzung für den (idealerweise) häufigsten Fall von Parametern für die Klasse.
Eine letzte Frage habe ich noch bei folgender Methode:

public static void test(int typ) {
Golf golf = new Golf(typ);

// Schlagweiten erfassen
golf.neuerRekord(new GolfRekord("Emil Einself", 111.11));
......
}

Was bezweckt denn golfPUNKTneuerRekord?
Es wird einfach die Methode neuerRekord der Klasse Golf aufgerufen, als Parameter wird eine Instanz der Klasse GolfRekord übergeben.
Was genau passiert denn in diesem Aufruf?
Das steht in der Klasse Golf:

Code: Alles auswählen

/**
	 * Fügt einen Spieler mit seiner Schlagweite hinzu.
	 * 
	 * @param name Name des Spielers
	 * @param distance Schlagweite des Spielers
	 */
	public void neuerRekord(GolfRekord r) {
		highscore.add(r);
	}
Die Parameter im JavaDoc scheinen aber nicht ganz zu stimmen :roll:

Re: Frage zur 11. Übung

Verfasst: 13. Jul 2009 23:19
von Owyn
So, ich melde mich dann auch mal...

Der Konstruktor Golf() { this(2); } ruft wie schon gesagt den anderen Konstruktor mit dem Parameter 2 auf, das steht dann für die Verwendung eines TreeSet mit absteigender Sortierung.

Die Musterlösung ist zugegebenermaßen etwas komplexer, bietet aber dafür die Möglichkeit, die verschiedenen Stadien der Aufgabenstellung (HashSet, TreeSet, TreeSet mit Comparator...) zu testen, ohne etwas im Code zu ändern. Einfach den Konstruktor Golf(int) verwenden, um ein Objekt der Testklasse zu erzeugen. Der Konstruktor ohne Parameter ist nur der Einfachkeit halber da, falls man sich nicht mit den unterschiedlichen Parametern beschäftigen will.

Ein kleiner Fehler, den ich zusätzlich zum bereits erwähnten falschen neuerRekord-Kommentar gerade in der Musterlösung gefunden habe: In den Kommentaren zum Konstruktor ist teilweise von TreeMap statt TreeSet die Rede. Ich habe gerade eine korrigierte Musterlösung auf die Seite gestellt.

Gruß,
Christian Heinig

Re: Frage zur 11. Übung

Verfasst: 15. Jul 2009 17:38
von Pibi
Vielen Dank für die Hilfe, ich denke, das ist jetzt klargeworden =)

Re: Frage zur 11. Übung

Verfasst: 13. Aug 2009 15:19
von elvire
Hallo,
ich verstehe immer nicht genau, was mit diesem "this(2)" gemeint ist.

a-nickol hat geschrieben:
"Mit this(2); wird also der Wert 2 als Paramater an den anderen Konstruktor übergeben"

Was ist dieser Konstruktor ?
Ihre Erkärungen verstehe ich auch nicht :(
Kann mir jemand das bitte noch Mal erklären?

Danke

Elvire

Re: Frage zur 11. Übung

Verfasst: 14. Aug 2009 07:25
von a_nickol
ein beispel sollte helfen:

Code: Alles auswählen

public class Test {
public Test ()
{
System.out.println("A");
this(2);
System.out.println("D");
}
public Test (int x)
{
System.out.println("B");
System.out.println("Wert " + x);
System.out.println("C");
}
new Test();

würde ausgeben:

A
B
Wert 2
C
D

das ganze geht weider nicht, da der this aufruf, der erste sein muss (im konstruktor)!

deswegen geht nur sowas wie

Code: Alles auswählen

public class Test {
public Test ()
{
this(2);
System.out.println("D");
}
public Test (int x)
{
System.out.println("B");
System.out.println("Wert " + x);
System.out.println("C");
}
B
Wert 2
C
D

Re: Frage zur 11. Übung

Verfasst: 24. Aug 2009 12:53
von elvire
Alles klar. Vielen Dank :mrgreen: