Java, programmieren

Hallo, ich habe eine Frage zu folgendem Programm.

public class Main {

static void meineMethode() {
int x = 5;

x = (int) Math.pow(x, 2);

System.out.println(„Der Wert von x“ + (char) 253 + „beträgt“ + x);
}

public static void main(String[] args) {

meineMethode();

}
}

Und zwar, wieso kann man den Teil, der unter static void meineMethode() steht, nicht in die main methode schreiben und dafür die andere weglassen?

Und zwar, wieso kann man den Teil, der unter static void
meineMethode() steht, nicht in die main methode schreiben und
dafür die andere weglassen?

Können kann man das. Vermutlich könnte man selbst größte Programme vollständig in der main Methode programmieren.

Allerdings macht man das nicht.

Warum? Struktur!

Struktur bedeutet:

  • Aufteilung eines Programms in sinnvolle Einheiten.
    Möglichst viele Einheiten (Methoden, Objekte) sind
    nicht immer die beste Wahl.
    Dafür gibt es leider keine goldene Regel, aber Hilfen:
    Wenn der selbe Programmcode mehr als 1 mal verwendet wird, darf/sollte/muss man daraus eine eigene Methode erstellen.
    Gleiches gilt für das Aufrufen von Methoden:
    Wenn die selbe Methode mehr als 1 mal redundant aufgerufen wird (System.out.println ist NICHT redundant, da es einen Unterschied macht), darf/sollte/muss man eine lokale Variable einführen.
    Ob man sich für „darf“, „sollte“ oder „muss“ entscheidet, ist eine Frage des Stils. Ich halt mich an „muss“, mit etwas „sollte“.
    Für neue Klassen ist das noch schwierieger. Man kann für alles neue Klassen definieren. Oft genügt aber doch ein String oder gar ein int, long usw.
    Bliebe noch Logging, Exception-Handling, Klassen, Kommentare, Dokumentation …
    Hier halte ich mich an die Regel: Mache nur das, was Du machen musst. Und man muss, wenn es einen Vorteil bringt.

  • Schafft Übersichtlichkeit.
    Je größer ein Programm wird, desto wichtiger wird die Aufteilung in sinnvolle Einheiten.

  • Kapselt Einheiten
    Hier schaut man sich am besten vorhandene Klassen an. Z.B. String. Diese Klasse kann man prima verwenden. Wie sie die Daten verwaltet ist gekapselt. Da kommt man nicht ran, um etwas zu manipulieren und das ist gut so.
    Gleiches wendet man an, wenn man Bibliotheken erstellt und diese anderen zur Verfügung stellt.

… aber zurück zur Frage.

Erweitere die Klasse doch um eine weitere Methode und noch eine usw…
Dann schaue Dir an, und frage Dich nochmals, ob Du den gesamten Code in main() haben möchtest.

Viel Erfolg

Ja gut, jetzt habe ich das verstanden :smile:
Jetzt gibt’s noch folgende Aufgabenstellung:
Ändern Sie die Methode so ab, dass Ihr ein beliebiger Zahlenwert vom Typ int übergeben werden kann und überprüfen Sie Ihre Änderung(en).

Ich habe das Programm soweit fertig und wollte fragen, ob ich damit die Aufgabenstellung erfüllt habe.

public class Main {

static void meineMethode() {
int x;
String eingabe;

eingabe = JOptionPane.showInputDialog(„Bitte geben Sie die zu quadrierende Zahl ein“);
x = Integer.parseInt(eingabe);
x = (int) Math.pow(x, 2);

System.out.println(„Der Wert von x“ + (char) 253 + „beträgt“ + x);
}

public static void main(String[] args) {

meineMethode();

}
}

Leider hast Du die Aufgabenstellung noch nicht erfüllt, die Methode verwendet keinen Parameter.

static void meineMethode() {

Diese musst Du in

static void meineMethode(int parameter) {

ändern. Und dann den Code in der Methode so ändern, dass diesen den parameter verwendet.

Das Einlesen eines Wertes verschiebst Du nach main() und rufst mit dem eingelesenen Werte die Methode auf.

Ja ich habe jetzt herausgefunden, dass das so richtig ist:
public class Main
{
public static void meineMethode(int xKonstante)
{
int x = xKonstante;

x = (int) Math.pow(x, 2);

System.out.println(„Der Wert von x“ + (char) 253 + „beträgt“ + x);
}

public static void main(String[] args)
{
meineMethode(5);
}
}

Ein paar Anmerkungen:

  • der Parameter ist bereist eine Variable. x = xKonstante ist nicht nötig
  • xKonstante finde ich als Namen etwas irreführend
  • statt Math.pow(x, 2) kann man das schnellere x * x verwenden.
  • da Java Unicode kann, sollte es funktionieren das ² direkt in den String zu schreiben.

Das ergibt dann

public class Main
{
public static void meineMethode(int x)
{
int result = x * x;

System.out.println("Der Wert von x² beträgt " + x);
}

public static void main(String[] args)
{
meineMethode(5);
}
}

Und wenn Du nun noch die Verarbeitung von der Ausgabe trennen willst, könnte das so aussehen:

public class Main
{
public static int square(int x)
{
return x * x;
}

public static void main(String[] args)
{
int x = 5;
int result = square(x);
System.out.println("Der Wert von " + x + ² beträgt " + result);
}
}

Nun kannst Du noch den Wert x von der Console (oder so) einlesen…

… usw.

Okay, danke für die Hilfe.
Ich bin jetzt grade bei folgender Aufgabenstellung und wollte fragen, ob das in meinem Programm soweit richtig umgesetzt wurde:

Entfernen Sie die Anweisung System.out.println(…); und ändern Sie die Methode anschließend so ab, dass das Ergebnis der Berechnung als Wert vom Typ double zurückgegeben wird.
Welche Änderungen müssen nun in der main-Methode vorgenommen werden, damit das Programm das Ergebnis der Berechnung wieder ausgeben kann? Nehmen Sie diese Änderungen vor und geben das Ergebnis auf dem
Bildschirm aus.

public class Main {

public static void meineMethode(double Konstante) {
double x = Konstante;

x = (int) Math.pow(x, 2);

System.out.println(„Der Wert von x“ + (char) 178 + „beträgt“ + x);
}

public static void main(String[] args) {
meineMethode(5.0);
}
}

Hallo Mathematikus

Der folgende Code sollte kompilieren:

public class Main {
  public static void main(String[] args) {

    int x = 5;
    x = (int) Math.pow(x, 2);

    System.out.println(„Der Wert von x“ + (char) 253 + „beträgt“ + x);

  }
}

Kompiliert dein Compiler den obigen Codes ohne zu klagen? Wundert dich eventuell, wieso die Methode

static

sein muss?

Grüsse

Martin

… das steht in Re^5 schon drinnen. Allerdings mit int statt double.

Viel Erfolg!

Hallo Mathematikus,

so ganz kann ich das von Dir beschriebene Problem nicht nachvollziehen. Ich habe testweise eine Klasse erstellt und den Code der Methode „meineMethode()“ in die main()-Methode kopiert:

public class Main {

public static void main(String[] args) {
int x = 5;
x = (int) Math.pow(x, 2);
System.out.println(„Der Wert von x“ + (char) 253 + „beträgt“ + x);
}

}

Das führte dann zur gleichen Ausgabe wie der von dir gepostete Code:

„Der Wert von xýbeträgt25“

Vielleicht kannst Du deine Fehlermeldung etwas präzisieren und die Ausgabe vom Compliler (StackTrace) posten.

Grüße,
René

Habe ich bereits, jetzt klappt’s
Nun muss ich noch folgende Aufgabenstellung bearbeiten:

Entfernen Sie die Anweisung System.out.println(…); und ändern Sie die Methode anschließend so ab, dass das Ergebnis der Berechnung als Wert vom Typ double zurückgegeben wird.
Welche Änderungen müssen nun in der main-Methode vorgenommen werden, damit das Programm das Ergebnis der Berechnung wieder ausgeben kann? Nehmen Sie diese Änderungen vor und geben das Ergebnis auf dem
Bildschirm aus.

Ist das so richtig?

public class Main {

public static void meineMethode(double xKonstante) {
double x = xKonstante;

x = (int) Math.pow(x, 2);

System.out.println(„Der Wert von x“ + (char) 178 + „beträgt“ + x);
}

public static void main(String[] args) {
meineMethode(5.0);
}
}

Es ist möglich den code in die main Methode zu schreiben und die andere wegzulassen.

Hallo Mathematikus,

tut mir leid für meine Verspätung. Bin gerade ein wenig im Stress und habe vergessen Dir zu antworten.

Die Änderungen könnten so aussehen:

public static double meineMethode(double xKonstante){
return (int) Math.pow(x, 2);
}

public static void main(String[] args) {
System.out.println(meineMethode(2));
}

Ich habe das Schlüsselwort void in der Methodendeklaration von meineMethode durch double ersetzt. Das ist der Rückgabetyp. Wichtig ist noch dass die Methode nun ein Ergebnis berechnet und dieses sofort mittels „return“ an die aufrufende Methode zurückliefefert. Das ist in diesem Fall die Methode main(). Diese benutzt die Rückgabe um sie auf der Console anzuzeigen.

Ich hoffe ich konnte Dir trotz Verspätung noch rechtzeitig helfen. Sorry nochmal wegen der Verspätung.

Grüße,
René

Ach macht doch nichts :smile: Hatte zwar schon die Lösung, aber trotzdem vielen Dank für deine Hilfe.
lg