Taschenrechner in java mit mehreren Ordnern?

2 Antworten

Du packst beides in denselben Ordner bzw. in dasselbe Package.

Du machst die entsprechenden Klassen und Methoden packetsichtbar (also alles außer "private" dürfte gehen).

Du Importierst die Klasse in deinem anderem File.

Und alles weitere ist dann trivial möglich.

Hi, in Java spricht man dabei von sogenannten packages. Ein package organisiert zusammengehörigen Code in einem gleichen Namespace und muss dabei der Ordnerstruktur entsprechen.

In deinem Beispiel haben wir folgende Ordnerstruktur:

src/
├── app/
│   └── App.java
├── calc/
│   └── Calculator.java
└── test/
    └── CalculatorTest.java

Für Java heißt das, dass du die drei packages app, calc und test hast.

In den java Dateien muss dann jeweils das zugehörige package angegeben werden, sonst gibt es Fehler:

package app;

public class App { }

Du siehst die erste Zeile? Damit zeigen wir, dass diese Klasse zum package app gehört.

Wenn wir jetzt das woanders nutzen möchten, dann müssen wir das importieren. Dabei geben wir an, welche Klasse wir importieren möchten und in welchem package diese zu finden ist:

package calc;

import app.App; // importiere Klasse App aus package app

public class Calculator { 
   public void method() {
      App a = new App();
   }
}

Und schon kannst du drauf zugreifen :)

Woher ich das weiß:Studium / Ausbildung – Informatik-Studium / Mathematik-Studium / ITK-Ausbildung
LunchKartoffel 
Fragesteller
 26.06.2022, 13:43

So? Wo brauch ich die Klammern? Verstehe die nicht, bin nur python gewohnt

package calc;
App myObject = new App();

import app.App {}

public class Calculator {
    public void method() {
        App a = new App();
    }
}

    switch(operator) {
        case '+':
            System.out.printf("%.2f + %.2f = %.2f", nummer1, nummer2,(nummer1 + nummer2));
            break;

        case '-':
            System.out.printf("%.2f - %.2f = %.2f", nummer1, nummer2,(nummer1 - nummer2));
            break;

        case '*':
            System.out.printf("%.2f * %.2f = %.2f", nummer1, nummer2,(nummer1 * nummer2));
            break;

        case '/':
            if(nummer2 !=0)
                System.out.printf("%.2f / %.2f = %.2f", nummer1, nummer2,(nummer1 / nummer2));
            else
                System.out.printf("Durch 0 kann nicht geteilt werden!");
            break;

        default:
            System.out.printf("%c ist ungültig", operator);
      }
}  
0
SirNik  26.06.2022, 14:06
@LunchKartoffel

In Java steht Programmcode immer innerhalb einer Methode und die immer innerhalb einer Klasse. Bis auf package und import steht also nie etwas außerhalb einer Klasse! und bis auf gewisse Variablen steht auch nie etwas außerhalb einer Methode!

Deine zweite Zeile darf so also nicht stehen.
Nach deinem import kommen auch keine "{", sondern ein ";".

Deine switch muss innerhalb einer Methode stehen. Aber ganz allgemein sieht es (entsprechend deiner eigenen Einschätzung :D) so aus, als hast du keine Ahnung, was du da tust.

geschweifte Klammern kommen (erstmal) immer nur nach Klassendefinition, nach Methodendefinition und nach Kontrollstrukturen. Statements sind immer mit einem ";" abzuschließen.

package calc;

import app.App;

public class Calculator {
   public void calculate() {
      switch() { ... };
   }
}

Aber so macht das Beispiel eigentlich gar keinen Sinn. Auf System hast du immer und überall Zugriff, auch ohne import. Das heißt Ausgabe kannst du auchg so verwenden. Eingabe hast du in App gemacht sagst du? Ich kenne jetzt nicht den gewünschten Workflow, aber folgendes wäre eigentlich sinniger zu tun:

App.java:

package App;

import calc.Calculator;

public class App {
   public static void main(String[] args) {
      // Eingabe musst du entsprechend wie auch immer du
      // das jetzt hast ersetzen
      int nummer1 = eingabe();
      char opeator = eingabe();
      int nummer2 = eingabe();

      // Wir erstellen neues Objekt von Calculator
      Calculator calculator = new Calculator();

      // Nehmen jetzt das Objekt calculator und
      // führen die calculate() Methode aus
      // übergeben dabei die nötigen Informationen
      // Sodass die switch das da drin abarbeiten kann
      calculator.calculate(nummer1, operator, nummer2);
   }
}

Calculator.java:

package calc;

public class Calculator {
   public void calculate(int nummer1, char operator, int nummer2) {
      switch (operator) {
         // die Berechnungen
      }
   }
}

So wäre es glaub ich ein sinnigerer Workflow, keine Ahnung, was du mit App in Calculator machen willst. Wenn das eine Aufgabe ist, die du machen sollst, dann musst du doch irgendwie unterlagen oder so haben, wo du die Grundlagen von Java lernen könntest oder nicht?

1
LunchKartoffel 
Fragesteller
 26.06.2022, 15:21
@SirNik

Danke erstmal.

Habe mir ein grundlegendes Tutorial angeguckt, damit auch folgendes programmieren können, was funktioniert:

package calc;
import java.util.Scanner;

public class calculator {
    public static void main(String[] args) {
        double zahl1, zahl2;
        char operator;
        Scanner input = new Scanner(System.in);


        System.out.println("Gib eine Zahl ein");
        zahl1 = input.nextDouble();
        System.out.println("Gib eine zweite Zahl ein");
        zahl2 = input.nextDouble();

        System.out.println("Gib einen Rechenoperator ein (+, -, *, /)");
        operator = input.next().charAt(0);

        input.close();

        switch(operator) {
            case '+':
                System.out.printf("%.2f + %.2f = %.2f", zahl1, zahl2,(zahl1 + zahl2));
                break;

            case '-':
                System.out.printf("%.2f - %.2f = %.2f", zahl1, zahl2,(zahl1 - zahl2));
                break;

            case '*':
                System.out.printf("%.2f * %.2f = %.2f", zahl1, zahl2,(zahl1 * zahl2));
                break;

            case '/':
                if(zahl2 !=0)
                    System.out.printf("%.2f / %.2f = %.2f", zahl1, zahl2,(zahl1 / zahl2));
                else
                    System.out.println("Durch 0 kann nicht geteilt werden!");
                break;

            default:
                System.out.printf("%c ist ungültig", operator);
        }
    }
}

aber das in drei verschiedene packages reinzupacken versteh ich nicht.

Er sagt mir dann immer "cannot find symbol", z.b bei "nummer1".

Und ja hab keine Ahnung was ich mache

0
SirNik  26.06.2022, 15:31
@LunchKartoffel

Ja genau. Die Aufgabe sieht halt vor, dass das was du da jetzt in einem gemacht hast eben aufgeteilt wird. Deine Methode macht halt jetzt ziemlich viel auf einmal: Einlesen, Verarbeitung und Ausgabe. Normalerweise tendiert man dazu, das in möglichst kleine Teile aufzuteilen, die Sinn ergeben. Sowas wie Ein- und Ausgabe hat ja schon vom Namen her nichts mit Calculater zu tun, verstehst du? Sondern der Calculater soll eben nur das tun, was der Name schon sagt und das möglichst gut.

Variablen müssen natürlich definiert werden, damit der Compiler die kennt. cannot find symbol heißt, dass du die nirgends oder zumindest nicht in dem Scope (in Java meistens alles was zwischen { und } ist) definiert hast.

0