Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

schnecke

Unregistered

1

Saturday, May 19th 2007, 8:42pm

JavaÜbung5

Ich hab da mal ein paar Fragen zu der neuen Java Übung.

Zu Aufgabe 1c)
"Schreiben Sie insgesamt 4 miteinander verkettete Konstruktoren, die entweder
keine, eine, zwei oder drei der Eigenschaften (beliebige Reihenfolge) als Parameter
übernehmen. Verwenden Sie die angegebenen Konstanten für die Standardwerte."

Wie ist das mit dem verkettet gemeint, soo der mit dem einen parameter den mit den zwei aufrufen und der dann den mit den dreien usw. oder reicht es, wenn ich von jedem den mit den 3 parametern aufrufe?


Dann gleich noch was, wie ist das mit der Reihenfolge gemeint? So das es egal ist ob ich z.b. "Treibstoff, Motor und Leistung" angebe oder "Motor, Leistung, Treibstoff"? Wenn dem so ist, wie prüfe ich denn welche Angabe was ist? Also ich wüsste schon wie ich das unterscheide, aber in einem Konstruktor kann ich ja z.b. keine if-Abfrage machen,....

hamena314

Zerschmetterling

  • "hamena314" is male

Posts: 2,032

Date of registration: Aug 31st 2003

Location: Hannover

Occupation: Informatikstudent (d'uh)

2

Saturday, May 19th 2007, 8:52pm

Einen verketteten Konstruktor kannst du mit "this()" erzeugen.
Sinn ist u.a. dass du Code sparst, da du relativ wenige Angaben in die verketteten Kontruktoren schreiben brauchst und dann z.b. im letzten die wichtigsten Dinge reinpackst.
Ich denke, die Aufgabenstellung ist nicht so eindeutig, dass man die Reihenfolge erst noch herausbekommen muss, sondern es geht einfach darum, in welcher Reihenfolge du die Parameter in deinen Konstruktor tust.
Und die ist egal.
Also Car(int ps, int zylinder, int treibstoff) oder Car(int zylinder, int treibstoff, int ps) spielt keine Rolle, du musst NICHT dafür sorgen, dass dein Programm auch alle Möglichkeiten, den Konstruktor anzusprechen korrekt erkennt, sondern kannst dir aussuchen, in welcher Reihenfolge du später deine Parameter eingibst. :)

hth!

HAVE PHUN!
Nicht der Wind bestimmt die Richtung, sondern das Segel! (Lao Xiang, China)

retr0virus

Trainee

  • "retr0virus" is male

Posts: 83

Date of registration: Oct 2nd 2006

Location: NRW -> Bad Oeynhausen

Occupation: B.Sc. Informatik, 8.Semester

3

Saturday, May 19th 2007, 9:04pm

Quoted

Original von hamena314
[...] du musst NICHT dafür sorgen, dass dein Programm auch alle Möglichkeiten, den Konstruktor anzusprechen korrekt erkennt, [...]

DAS ist ein Wort ;)
So sehe ich das auch. Es ist zwar möglich, da sich die Bereiche Treibstoff, Zylinder und PS nicht überschneiden, aber... eine mächtige Fummelarbeit.
Wenn keine starken Gegenstimmen kommen, interpretiere ich den Text ebenfalls so, dass man sich als Programmierer aussuchen kann, in welcher Reihenfolge man die Parameter übergibt und nicht eine variable Variable einführt.

Die Frage zu der Konstruktorenverkettung von schnecke war allerdings so gemeint, ob man tatsächlich von 0->1->2->3 Konstruktoren durchgehen muss, oder ob man auch direkt 0->3, 1->3, 2->3 machen darf.
Das steht meiner Meinung nach allerdings auch nicht so genau in der Aufgabenstellung (eben nur "Verkettung").
Ein Nichts im Nichts und ins Nichts vertrieben!
- Ren Dhark

hamena314

Zerschmetterling

  • "hamena314" is male

Posts: 2,032

Date of registration: Aug 31st 2003

Location: Hannover

Occupation: Informatikstudent (d'uh)

4

Saturday, May 19th 2007, 9:39pm

Quoted

Original von retr0virus
... und nicht eine variable Variable einführt.


Mhm, redundantly redundant. :D

Ich denke, bei den Konstruktoren ist es beinahe egal, ob man sie per 0->1->2->3 durchschleift, oder per 0->3, 1->3, 2->3, denn letztendlich landen alle bei 3.
Vielleicht hat man bei 0->1->2->3 eine durchschaubarere Logik und Code-Struktur, aber ich denke, darum gehts eh nicht bei der Aufgabe.

Aber jetzt habe ich glatt selbst eine Frage:
Man soll ja ein Car-Objekt erzeugen, das eine Methode toString besitzt (naja, eigentlich überschreibt :rolleyes:) und dazu ein Engine-Objekt, das ebenfalls eine toString-Methode hat.
Wie schaffe ich es denn jetzt, in der toString-Methode von Car mir die Motordaten von der toString-Methode von Engine anzeigen zu lassen?
Ich habe das nur geschafft, weil ich der Car-toString Methode noch das Engine-Objekt als Parameter mitgeben. In der Aufgabenstellung steht jedoch nichts davon, ausserdem kann man nur direkt bei der Erzeugung des Car-Objektes darauf zugreifen.
Reicht das und ist damit korrekt, oder wie kann ich auf die toString Methode aus der anderen toString-Methode zugreifen? ?(

HAVE PHUN!

P.S.: Versteht mich überhaupt irgendwer? :D
Nicht der Wind bestimmt die Richtung, sondern das Segel! (Lao Xiang, China)

Marco

Zuhörer

Posts: 1

Date of registration: May 19th 2007

Occupation: Informatik

5

Saturday, May 19th 2007, 9:47pm

Mir fehlt leider die funktionierende Klasse Car aus der Übung 4 zur vollständigen Bearbeitung dieser Übung und bislang sind wohl keine Musterlösungen zugänglich.

Wäre wirklich sehr nett, wenn mir jemand diese zusenden könnte. ( marco@lepkenet.de )

Danke schon einmal. :)

This post has been edited 2 times, last edit by "Marco" (May 19th 2007, 9:51pm)


Warui

Turner, Serveradmin & Workaholic

  • "Warui" is male

Posts: 717

Date of registration: Apr 25th 2006

Location: Südstadt

Occupation: (iter (B.Sc. Inf, 8)) \n (be-a-slave ("SRA", "Bachelor Thesis")) \n (be-a-programmer-slave ("Freelancer", "Programming"))

6

Saturday, May 19th 2007, 9:53pm

Quoted

Original von hamena314
Ich denke, bei den Konstruktoren ist es beinahe egal, ob man sie per 0->1->2->3 durchschleift, oder per 0->3, 1->3, 2->3, denn letztendlich landen alle bei 3.
Vielleicht hat man bei 0->1->2->3 eine durchschaubarere Logik und Code-Struktur, aber ich denke, darum gehts eh nicht bei der Aufgabe.

Ich denke mal, linear macht am meisten Sinn. So kann man am besten das Programm erweitern, strikt nach dem DRY-Prinzip
Dont repeat yourself ;)
Also in der Folge, 0->1, 1->2, 2->3, ....

Quoted

Original von hamena314
Aber jetzt habe ich glatt selbst eine Frage:
Man soll ja ein Car-Objekt erzeugen, das eine Methode toString besitzt (naja, eigentlich überschreibt :rolleyes:) und dazu ein Engine-Objekt, das ebenfalls eine toString-Methode hat.
Wie schaffe ich es denn jetzt, in der toString-Methode von Car mir die Motordaten von der toString-Methode von Engine anzeigen zu lassen?
Ich habe das nur geschafft, weil ich der Car-toString Methode noch das Engine-Objekt als Parameter mitgeben. In der Aufgabenstellung steht jedoch nichts davon, ausserdem kann man nur direkt bei der Erzeugung des Car-Objektes darauf zugreifen.
Reicht das und ist damit korrekt, oder wie kann ich auf die toString Methode aus der anderen toString-Methode zugreifen? ?

Wieso brauchst du die Instanz des Motors noch als Parameter? Sollte doch laut Aufgabenstellung eine Instanzvariable des Autos sein, was auch in der Realität Sinn macht ....
und in der toString()-Methode des Autos hast du halt nen String mit 3 Zeilen und an der einen Stelle steht halt
retval = retval + "Motordaten: " + this.meinMotor + "\n";
Erwachsenwerden? Ich mach ja viel Scheiß mit, aber nicht jeden!

hamena314

Zerschmetterling

  • "hamena314" is male

Posts: 2,032

Date of registration: Aug 31st 2003

Location: Hannover

Occupation: Informatikstudent (d'uh)

7

Sunday, May 20th 2007, 12:11am

Hm, ich denke, man soll in der toString-Methode von Car die toString-Methode von Engine aufrufen?
Denn sonst verstehe ich nicht, wie das mit der Instanzvariablen gemeint sein soll.
Ich möchte halt folgendes machen:

- Car-Objekt erzeugen: createLuxuryCar();
- in der Methode createLuxuryCar() wird Car() aufgerufen und damit das Car-Objekt erzeugt:
createLuxuryCar(){
Car audi = new Car();
}
- durch Car() wird automatisch ein Engine-Objekt erzeugt:
Engine v8 = new Engine();
- Jetzt möchte ich die Methode toString von audi aufrufen, damit ich die Daten ausgegeben bekomme:
System.out.println(audi.toString());
Status: 1
Tankgrösse: 60.0 Liter
Motordaten: -> toString() Methode von Engine ->
Typ X, 177 PS (10 Zylinder)

So wie ich die Aufgabenstellung verstehe, soll man hier X mit einem int-Wert angeben (die Instanzvariable in Car).
Wie kann ich also in Car die Car-toString Methode aufrufen für die Engine-toString Methode, wenn das Engine-Objekt erst später erzeugt wird?

Vielleicht habe ich gerade nur ein Brett vor dem Kopf, aber ich weiss einfach nicht, wie ich die Engine-toString Methode in der Car-toString Methode aufrufen kann...

HAVE PHUN!
Nicht der Wind bestimmt die Richtung, sondern das Segel! (Lao Xiang, China)

This post has been edited 1 times, last edit by "hamena314" (May 20th 2007, 12:12am)


Warui

Turner, Serveradmin & Workaholic

  • "Warui" is male

Posts: 717

Date of registration: Apr 25th 2006

Location: Südstadt

Occupation: (iter (B.Sc. Inf, 8)) \n (be-a-slave ("SRA", "Bachelor Thesis")) \n (be-a-programmer-slave ("Freelancer", "Programming"))

8

Sunday, May 20th 2007, 2:05am

Quoted

Original von hamena314
Hm, ich denke, man soll in der toString-Methode von Car die toString-Methode von Engine aufrufen?

Genau das wird doch gemacht .... wenn du ein printf(this.engine); machst, wird dessen toString()-Methode aufgerufen

Quoted

Original von hamena314
Denn sonst verstehe ich nicht, wie das mit der Instanzvariablen gemeint sein soll.
Ich möchte halt folgendes machen:

- Car-Objekt erzeugen: createLuxuryCar();
- in der Methode createLuxuryCar() wird Car() aufgerufen und damit das Car-Objekt erzeugt:
createLuxuryCar(){
Car audi = new Car();
}
- durch Car() wird automatisch ein Engine-Objekt erzeugt:
Engine v8 = new Engine();

eben nicht .... this.meinMotor = new Engine("V8-Motor",177,10);

Quoted

Original von hamena314
- Jetzt möchte ich die Methode toString von audi aufrufen, damit ich die Daten ausgegeben bekomme:
System.out.println(audi.toString());
Status: 1
Tankgrösse: 60.0 Liter
Motordaten: -> toString() Methode von Engine ->
Typ X, 177 PS (10 Zylinder)

So wie ich die Aufgabenstellung verstehe, soll man hier X mit einem int-Wert angeben (die Instanzvariable in Car).
Wie kann ich also in Car die Car-toString Methode aufrufen für die Engine-toString Methode, wenn das Engine-Objekt erst später erzeugt wird?

Vielleicht habe ich gerade nur ein Brett vor dem Kopf, aber ich weiss einfach nicht, wie ich die Engine-toString Methode in der Car-toString Methode aufrufen kann...

Also wenn du in deinem Hauptprogramm ein printf(audi); machen würdest, was gleichbedeutend ist mit println(audi.toString());, dann würde zB rauskommen
Status: 1 \n Tankgröße: 60.0 Liter \n Motordaten: Typ V8-Motor, 177 PS (10 Zylinder)
ob du in der toString-Methode des Autos this.meinMotor oder this.meinMotor.toString() schreibst, sollte theoretisch letzten Endes auf das Selbe hinauslaufen ... nur ist letzterer Fall wohl sauberer, weil du genau angibst, was du willst ....
Also ist nicht dein X das, was in der Instanzvariable gespeichert ist, sondern der ganze Motor .... ist ja in der Realität genauso.
Ein technischer Laie fragt, wieviel PS das Auto hat und kriegt dieselbe Antwort, wie der, der fragt, wieviel PS der Motor hat. Denn dies ist eine Eigenschaft/Instanzvariable des Motors, nicht des Autos .... das Auto reicht diese Kenndaten nur weiter und weiß selbst nichts davon .... Stichwort Kapselung

Wenn du deinem Auto später vielleicht nen neuen Motor verpasst ( void setNewEngine(Engine newEngine); ), dann musst du deine Car.toString()-Implementation nicht ändern ....

Ich hoffe, ich hab niemanden noch mehr verwirrt ... ich weiß nur nicht, wie ichs deutlicher machen kann, ohne die Lösung hinzuschreiben ^_^
Erwachsenwerden? Ich mach ja viel Scheiß mit, aber nicht jeden!

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

9

Sunday, May 20th 2007, 11:11am

RE: JavaÜbung5

Ohne die Aufgabenstellung zu kennen mal meine Gedanken beim durchforsten dieses Threads

Quoted

Original von schnecke
Dann gleich noch was, wie ist das mit der Reihenfolge gemeint? So das es egal ist ob ich z.b. "Treibstoff, Motor und Leistung" angebe oder "Motor, Leistung, Treibstoff"? Wenn dem so ist, wie prüfe ich denn welche Angabe was ist? Also ich wüsste schon wie ich das unterscheide, aber in einem Konstruktor kann ich ja z.b. keine if-Abfrage machen,....
Bei den Parametern des Konstruktors kannst du i.d.R. davon ausgehen, dass diese von außen richtig angegeben werden. Normalerweise dokumentiert man dann nach außen sichtlich, was für Paramter der Konstruktor erwartet (ein Schritt wäre dafür z.B. den Parametern sinnvolle Namen zu geben).
Btw.: "in einem Konstruktor kann ich ja z.b. keine if-Abfrage machen" - wieso nicht? (:


Quoted

Ich denke mal, linear macht am meisten Sinn. So kann man am besten das Programm erweitern, strikt nach dem DRY-Prinzip
Dont repeat yourself
Also in der Folge, 0->1, 1->2, 2->3, ....
Ich würde mir eher ein Konstruktor schreiben, der alles macht, und dann von den anderen Konstruktoren diesen Konstruktor aufrufen. Das macht vor allem Sinn, wenn man den Konstruktor ändern muss, da man dann nur wirklich einen Konstruktor ändern muss.
Außerdem ist es IMHO besser lesbarer (man muss sich nicht erst von oben nach unten durchsuchen).
Darüber hinaus könnte ich mir vorstellen (weiß es also nicht), dass man sich dadurch noch ein wenig Rechenzeit spart, weil nicht sämtliche Konstruktoren sondern nur zwei aufgerufen werden müssen.
(Übernehme aber keine Garantie für Richtigkeit ;) )

Nur so meine Gedanken (:
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

hamena314

Zerschmetterling

  • "hamena314" is male

Posts: 2,032

Date of registration: Aug 31st 2003

Location: Hannover

Occupation: Informatikstudent (d'uh)

10

Sunday, May 20th 2007, 2:35pm

Hi warui!
Hab' heute morgen noch lange rumüberlegt und hab's jetzt kapiert. Nun funktioniert alles, besten Dank.
Ich glaube, da war das Brett vor'm Kopf aber ganz schön fest angenagelt bei mir. :D

HAVE PHUN!
Nicht der Wind bestimmt die Richtung, sondern das Segel! (Lao Xiang, China)

sommla

Junior Schreiberling

  • "sommla" is male

Posts: 169

Date of registration: Oct 27th 2005

11

Sunday, May 20th 2007, 4:16pm

..hm, hab folgendes Problem.

Also oben habe ich die ganzen Sachen kodiert, auch die Standardwerte, die er laden soll, wenn keine mitgegeben werden.

Jetzt hab ich den leeren Konstruktor

Source code

1
2
3
public Engine(){
this(std_hp, std_cyl, std_fuel);
	}


Beim Kompilieren kommt immer der Fehler
"cannot reference std_hp (oder std_cyl, etc.) before supertype constructor has been called"

Hab jetzt schon bei google mehrfach gesucht, aber die Hilfen lassen mich nicht meinen Fehler verstehen.
Lieber ein Haus im Grünen als 'nen Grünen im Haus.

Brainbug

Alter Hase

  • "Brainbug" is male

Posts: 150

Date of registration: Oct 6th 2002

Location: Hannover (Nordstadt)

Occupation: Hausmann

12

Sunday, May 20th 2007, 4:21pm

Statisches Rauschen...

std_hp usw. sind vermutlich Konstanten, die Du in der Klasse definiert hast (sollten dann übrigens STD_HP usw. heissen). Du kannst natürlich nicht auf Eigenschaften eines Objekts zugreifen, dass Du noch nicht instanziiert hast - es sei denn, Du definierst diese Eigenschaften als statisch (also "static"), d.h. sie gelten für die gesamte Klasse, nicht nur für einzelne Instanzen.

Lars

This post has been edited 1 times, last edit by "Brainbug" (May 20th 2007, 4:27pm)


sommla

Junior Schreiberling

  • "sommla" is male

Posts: 169

Date of registration: Oct 27th 2005

13

Sunday, May 20th 2007, 4:39pm

ups.. :D

Klasse, gleich noch nen Fehler gefunden.
Dankeschön!
Lieber ein Haus im Grünen als 'nen Grünen im Haus.

Neo

Erfahrener Schreiberling

  • "Neo" is male

Posts: 322

Date of registration: Jul 24th 2005

Location: Hannover

Occupation: Informatik

14

Sunday, May 20th 2007, 6:19pm

Re: Konstruktorverkettung

Würde man nach dem Schema <---------- Schema 1
1->4
2->4
3->4

verketten, dann müsste man, wenn man den Konstruktor mit 4 Paramterrn verändert,
die anderen 3 Konstruktoren auch verändern.

Wenn man aber folgendes Schema verwendet:
1->2
2->3
3->4

Dann braucht man nur den Konstruktor 3 anpassen.

Schema 1:
MyTest()
this(0,0,0,0,0,0);

MyTest(int a)
this(a,0,0,0,0,0);

MyTest(int a, int b)
this(a,b,0,0,0,0);

MyTest(int a, int b, int c)
this(a,b,c,0,0,0);

MyTest(int a, int b, int c, int d)
this(a,b,c,d,0,0);

MyTest(int a, int b, int c, int d, int e)
this(a,b,c,d,e,0);

MyTest(int a, int b, int c, int d, int e, int f) <--------- Zeile 20
this.a=a;
this.b=b;
this.c=c;
this.d=d;
this.e=e;
thisf=f;


So. Und jetzt verändere man den Konstruktor in Zeile 20 folgendermaßen:
MyTest(String a, ....)

This post has been edited 3 times, last edit by "Neo" (May 20th 2007, 6:30pm)


Warui

Turner, Serveradmin & Workaholic

  • "Warui" is male

Posts: 717

Date of registration: Apr 25th 2006

Location: Südstadt

Occupation: (iter (B.Sc. Inf, 8)) \n (be-a-slave ("SRA", "Bachelor Thesis")) \n (be-a-programmer-slave ("Freelancer", "Programming"))

15

Sunday, May 20th 2007, 6:20pm

das war, was ich meinte ^^
Erwachsenwerden? Ich mach ja viel Scheiß mit, aber nicht jeden!

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

16

Sunday, May 20th 2007, 8:14pm

RE: Konstruktorverkettung

Quoted

Wenn man aber folgendes Schema verwendet:
1->2
2->3
3->4

Dann braucht man nur den Konstruktor 3 anpassen.

Nicht zwangläufig, denn:

Schema 1:
MyTest()
this(0);

MyTest(int a)
this(a,0);

MyTest(int a, int b)
this(a,b,0);

MyTest(int a, int b, int c)
this(a,b,c,0);

usw.

So. Und jetzt verändere man den letzten Konstruktor folgendermaßen:
MyTest(String a, ....)

Und da hast du den gleichen Salat.
Ich meinte allerdings auch keine Änderung an den Paramtern selbst, sondern im Konstruktor. Was letztendlich allerdings auch keine Änderungen spart, wie ich zugeben muss (:

@sommla

Quoted

public Engine(){
this(std_hp, std_cyl, std_fuel);
}

Ich gehe davon aus, dass std_* Objektvariablen sind, richtig? Dann geht das nicht, da die an der Stelle des this()-Aufrufes noch nicht initialisiert sind. Das erste, was ein Konstruktor leisten muss, ist das Objekt erzeugen. Erst dann (nach dem this [Anmerkung: Falsch! Siehe unten]) werden die Variablen initialisiert. Folglich funktioniert auch der Aufruf von Objektvariablen nicht mit this()

Edit: Die Instanzvariablen werden nicht nach dem this(), sondern wohl, wie es auch logisch ist, direkt nach der Erzeugung des Objektes instanziiert. Also nach dem super()-aufruf (kam [glaube ich] noch nicht in der Vorlesung dran ;)) (Diskussionsthread)
Danke Schokoholic ;)
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

Neo

Erfahrener Schreiberling

  • "Neo" is male

Posts: 322

Date of registration: Jul 24th 2005

Location: Hannover

Occupation: Informatik

17

Sunday, May 20th 2007, 11:18pm

RE: Konstruktorverkettung

Dann ist es eigentlich egal, nach welchem Schema man die Konstruktoren verkettet.
Oder wie siehst du das?

This post has been edited 1 times, last edit by "Neo" (May 20th 2007, 11:18pm)


Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

18

Monday, May 21st 2007, 3:45pm

Wie oben gesagt, ich bin für die
1->4
2->4
3->4
Variante.

Quoted

Original von Markus:
Ich würde mir eher ein Konstruktor schreiben, der alles macht, und dann von den anderen Konstruktoren diesen Konstruktor aufrufen. [...] Außerdem ist es IMHO besser lesbarer (man muss sich nicht erst von oben nach unten durchsuchen).
Darüber hinaus könnte ich mir vorstellen (weiß es also nicht), dass man sich dadurch noch ein wenig Rechenzeit spart, weil nicht sämtliche Konstruktoren sondern nur zwei aufgerufen werden müssen.
(Übernehme aber keine Garantie für Richtigkeit )

Was nun letzlich wirklich besser ist, oder ob etwas davon besser ist habe ich bislang noch nicht herausgefunden.
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

sommla

Junior Schreiberling

  • "sommla" is male

Posts: 169

Date of registration: Oct 27th 2005

19

Monday, May 21st 2007, 5:27pm

..bei der toString() Ausgabe steht ja als Beispiel "Status: 1"

Was soll dieser Status ausgeben?!
Kann mir jemand helfen?
Lieber ein Haus im Grünen als 'nen Grünen im Haus.

GentleGiant

Hamster Inside(R)

  • "GentleGiant" is male

Posts: 283

Date of registration: Oct 3rd 2006

Location: Bad Oeynhausen

Occupation: Software-Entwickler bei Diamant Software

20

Monday, May 21st 2007, 5:54pm

Dieser Status gibt den Fahrtstatus aus:
Autobahn, Überland, Stadtverkehr