Seite 1 von 1

Übung 5

Verfasst: 17. Jul 2009 17:28
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

Re: Übung 5

Verfasst: 17. Jul 2009 17:52
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

Re: Übung 5

Verfasst: 17. Jul 2009 18:42
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

Re: Übung 5

Verfasst: 17. Jul 2009 19:53
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

Re: Übung 5

Verfasst: 18. Jul 2009 13:44
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());
}

Re: Übung 5

Verfasst: 18. Jul 2009 14:00
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

Re: Übung 5

Verfasst: 18. Jul 2009 14:16
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

Re: Übung 5

Verfasst: 18. Jul 2009 19:33
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.

Re: Übung 5

Verfasst: 20. Jul 2009 21:20
von elvire
Danke schön!! :mrgreen: