Übung 5

elvire
Erstie
Erstie
Beiträge: 21
Registriert: 19. Okt 2008 07:15

Übung 5

Beitrag von elvire »

Hallo,

ich hätte eine Frage zur 5.Übung. Kann jemand mir bitte Schritt für Schritt erklären, was genau bei der ersten Aufgabe (mit den Klassen Statics und StaticsTest ) passiert?

Ich habe eher erwartet, dass sich die Variable magic bei jedem Aufruf der Methode magic() verdoppelt. Aber ich bekomme die folgenden Ergebnissen: 16, 16, 16, dann 128,128,128, danach 2048,2048,2048, und 16384, 16384,16384.

Warum denn??

Gruß

Elvire

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 5

Beitrag von Owyn »

Die Variable "magic" ist eine Klassen- und keine Objektvariable. Anfänglich hat sie den Wert 1 und wird bei jedem Aufruf des Konstruktors (also jedes Mal, wenn mit "new Statics()" ein Objekt erzeugt wird) verdoppelt. Wenn Sie also drei Statics-Objekte a, b und c erzeugen und dann die Methode magic() aufrufen, wird der Wert 8 (= 1*2*2*2) zurückgegeben, egal ob Sie a.magic(), b.magic() oder c.magic() aufrufen.

Wenn Sie anschließend noch mehr Statics-Objekte erzeugen oder die test()-Methode der Klasse StaticsTest noch mal aufrufen, sollte 3x 64 ausgegeben werden, dann 3x 512. Das liegt daran, dass Java im Hintergrund noch läuft, die Variable magic also nicht neu bei 1 beginnt. Sie können entweder die Klasse neu kompilieren oder mit der rechten Maustaste in BlueJ links unten auf das diagonal gestreifte Feld klicken und "Reset Machine" auswählen (oder Strg+Shift+R drücken), dann wird die Virtuelle Maschine, die den Java-Code ausführt, zurückgesetzt.

Gruß,
Christian Heinig
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

elvire
Erstie
Erstie
Beiträge: 21
Registriert: 19. Okt 2008 07:15

Re: Übung 5

Beitrag von elvire »

Alles klar

Danke

Ich habe noch eine Frage zur 2. Aufgabe der 5.Übung und zwar zur Methode public void info() . Warum können die Methoden radius(), durchMesser(), umfang() und flaeche() ohne Objekt aufgerufen werden, obwohl sie Objektmethoden sind?

Ich habe die Methode boolean gleichGross(Kreis k) so implementiert, aber bekomme eine Fehlermeldung (missing return statement). Wo soll denn return stehen?

public boolean gleichGross(Kreis k){

if (radius() == k.radius())

return true;

}

Vielen Dank

Elvire

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 5

Beitrag von Owyn »

elvire hat geschrieben:Warum können die Methoden radius(), durchMesser(), umfang() und flaeche() ohne Objekt aufgerufen werden, obwohl sie Objektmethoden sind?
Können sie nicht, wenn sie korrekt ohne "static" geschrieben sind. Die Klassenmethoden durchmesser(double radius) etc. natürlich schon.

Ich habe die Methode boolean gleichGross(Kreis k) so implementiert, aber bekomme eine Fehlermeldung (missing return statement). Wo soll denn return stehen?

Code: Alles auswählen

public boolean gleichGross(Kreis k){
    if (radius() == k.radius())
    return true;
}
Bei Ihnen wird nur dann return aufgerufen, wenn die beiden Kreise gleich groß sind. Es fehlt der Fall, dass false zurückgegeben wird, wenn die Kreise eben nicht gleich groß sind.

Gruß,
Christian Heinig
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

elvire
Erstie
Erstie
Beiträge: 21
Registriert: 19. Okt 2008 07:15

Re: Übung 5

Beitrag von elvire »

Danke schön, aber hier sind die Methoden radius(), durchmesser(), umfang und faeche() ohne Objekt aufgerufen. (loesung uebung 05 aufgabe 2). Oder habe ich was falsch verstanden?

public boolean isEqual(Kreis k) {
return radius() == k.radius();
}

public void info() {
System.out.println("Kreis mit Radius: " + radius());
System.out.println(".....Durchmesser: " + durchmesser());
System.out.println("..........Umfang: " + umfang());
System.out.println(".........Flaeche: " + flaeche());
}

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 5

Beitrag von Owyn »

Die Methode info() steht aber in der Klasse Kreis und ist selbst nicht statisch, also eine Objektmethode. Sie kann also nur auf einem Kreis-Objekt aufgerufen werden, daher gibt es auch ein Objekt, auf das sich die Aufrufe der Objektmethoden radius(), durchmesser() etc. beziehen.

Gruß,
Christian Heinig
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

elvire
Erstie
Erstie
Beiträge: 21
Registriert: 19. Okt 2008 07:15

Re: Übung 5

Beitrag von elvire »

Ic habe bei der dritten Aufgabe der 5.Übung die Methode Polynom add (Polynom p) so implementiert:

public Polynom add(Polynom p){

int w ;
int x ;
int y ;
int z ;

Polynom t = new Polynom (w,x,y,z);

w = a + p.a;
x = b + p.b;
y = c + p.c;
z = d + p.d;

return t;
}

aber ich bekomme eine Fehlermeldung: possible loss of precision.
Was heißt das?

Elvire

Daniel S.
Mausschubser
Mausschubser
Beiträge: 87
Registriert: 25. Sep 2007 12:28
Wohnort: Mörfelden

Re: Übung 5

Beitrag von Daniel S. »

Das heißt auf deutsch "möglicher Verlust an Genauigkeit" und kommt daher, weil in einem Polynom Fließkommazahlen gespeichert werden (float oder double) und deshalb das Ergebnis der Berechnung von a + p.a auch eine Fließkommazahl ist, die Sie aber einem Integer zuweisen.
Die Zahl 1.0 könnte zwar auch als 1 in einem Integer gespeichert werden, aber statt der Zahl 1.5 würde ebenfalls die Zahl 1 im Integer gespeichert werden. Das ist dann natürlich nicht mehr so genau, wenn man eine 1 nicht mehr von einer 1.5 unterscheiden kann.
Die Warnung sollte sich also damit beseitigen lassen, indem Sie w, x, y und z als Fließkommazahl deklarieren.

BTW: Ihre Implementierung scheint mir auch noch nicht ganz richtig zu sein.
Mit freundlichen Grüßen
Daniel

elvire
Erstie
Erstie
Beiträge: 21
Registriert: 19. Okt 2008 07:15

Re: Übung 5

Beitrag von elvire »

Danke schön!! :mrgreen:

Antworten

Zurück zu „Archiv“