Kreistabelle

luckyluke9

Mitglied
Kann mir jemand erklären, wie im folgenden Programm setRadius() deklariert werden muss, damit es funkioniert? Es soll eine Tabelle erstellt werden, die den Radius, Umfang und Fläche eines Kreises tabellarisch darstellt. Stammt aus dem Buch von Hans Peter Habelitz. Bei mir wird leider der Radius nicht erhöht.

Java:
package uebung05;
import javax.swing.JOptionPane;

public class Kreistabellemuster {
    public static void main(String[] args) {
   String kreisradius, erhoehung;
   double r, dr;
   kreisradius = JOptionPane
       .showInputDialog("Geben Sie einen Kreisradius ein:");
   erhoehung = JOptionPane
       .showInputDialog("Geben Sie die Erhöhung ein:");
   r = Double.parseDouble(kreisradius);
   Kreis k = new Kreis(r);
   dr = Double.parseDouble(erhoehung);
   System.out.println("Radius\t\tUmfang\t\t\t\tFläche");
   for (int i = 0; i < 30; i++) {
       k.setRadius(r + i * dr);
       System.out.println(k.getRadius() + "\t\t" + k.getUmfang() + "\t\t"
           + k.getFlaeche());
   }
    }
}
 

luckyluke9

Mitglied
Java:
package uebung05;

class Kreis {
    double radius;
    
    Kreis() {
        radius = 0;
    }
    Kreis(double r) {
        radius = r;
    }
    void setRadius(double r) {
        r = radius;
    }

    double getUmfang() {
        double umfang = radius * 2.0 * 3.1415926;
        return umfang;
    }
    double getFlaeche() {
        double flaeche = radius * radius * 3.1415926;
        return flaeche;
    }
    double getRadius() {
        return radius;
    }
    void setUmfang(double u) {
        radius = u / (2.0 * Math.PI);
    }
    void setFlaeche(double f) {
        radius = Math.sqrt(f / Math.PI);
    }
}
 

kneitzel

Top Contributor
Java:
    void setRadius(double r) {
        r = radius;
    }

Was macht denn diese Methode? Was passiert in der Zuweisung?

Tipp: Behandle Argument einer Methode immer als reine Eingabe. Dann kannst Du den Parameter final machen und auf gewisse Fehler macht dich dann der Compiler aufmerksam. Du kannst ja mal den Parameter der Methode final machen:

Java:
    void setRadius(final double r) {
        r = radius;
    }

Was für eine Fehlermeldung bekommst Du nun angezeigt? Dann wird auch schnell klar, was da der Fehler ist.
 

luckyluke9

Mitglied
Das scheint nicht zu gehen. Jetzt gibt es in der Klasse am Rand die Bemerkung:
The final local variable r cannot be assigned. It must be blank and not using a compound assignment.
 

luckyluke9

Mitglied
Oh mein Gott, ich habe in der Methode setRadius() einfach 'radius' und 'r' getauscht und jetzt geht's...
Man kann also auch als Parameter Berechnungen eingeben, die Variablen enthalten, auch wenn diese nicht an die Methode übergeben werden? Wie in diesem Beispiel mit int i, welche ja nicht an setRadius() übergeben wird.
 

kneitzel

Top Contributor
Genau - Du hattest dem Parameter r den Wert der Instanzvariable radius zugewiesen. Das machte so keinen Sinn. Und durch das final hat Dir der Compiler (oder direkt die Entwicklungsumgebung) dann auch gesagt: Der Variablen r kannst Du nichts zuweisen. Aber das wolltest Du ja auch nicht. Daher dieser Tipp mit dem final. Es ist ein Best Practice, den man übernehmen könnte.

Man kann also auch als Parameter Berechnungen eingeben, die Variablen enthalten, auch wenn diese nicht an die Methode übergeben werden? Wie in diesem Beispiel mit int i, welche ja nicht an setRadius() übergeben wird.
Hier weiss ich nicht sicher, was Du meinst. Aber evtl. hilft diese Erläuterung etwas: Generell werden bei Methodenaufrufen keine Variablen übergeben sondern Werte. Java kennt nur ein "Call by Value" - es werden also immer nur Werte übergeben.

Bei Aufrufen wie:
k.setRadius(r + i * dr);
bedeutet dies also, dass erst r + i * dr ausgerechnet wird. Der Wert, der da raus kommt, wird dann an den Parameter übergeben.

Streng genommen ist das also zwei Befehle:
Java:
double temp = r + i * dr;
k.setRadius(temp);
Auch wenn das zusammen geschrieben wurde, so findet unter dem Strich genau dies statt: Erst wird die Berechnung gemacht und dann der Wert übergeben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Methoden Kreistabelle Java Basics - Anfänger-Themen 5

Ähnliche Java Themen


Oben