Java Programm mit mehreren Klassen

  • Ich möchte ein Javaprogramm mit 2 Klassen schreiben. Dabei muss ichjede Klasse als eigene Datei speichern, Dateiname = Klassenname, oder?
    Wenn ich die Klasse mit der Main Methode kompiliere, müsste ja auch die andere Klasse mitkompiliert werden, oder? Muss ich dazu nur die beiden Klassen im gleichen Verzeichnis speichern oder muss ich sonst noch irgendwie in der Klasse mit Mainmethode den Pfad angeben, wo de zweite Klasse liegt?

  • Ja, 2 Dateien mit Dateiname = Klassenname.

    Wenn du die Klasse mit der main-Methode kompilierst wird die andere Klasse nicht automatisch mitkompiliert, es sei denn du verwendest eine IDE a' la Netbeans oder JBuilder.

    Sonst musst du beide Klassen "händisch" kompilieren.

    mfg

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • Zitat von AntiBit


    Ja, 2 Dateien mit Dateiname = Klassenname.

    also Dateiname=Klassenname hängt glaub ich vom Compiler ab,
    der JBuilder erwartet es aber so....

    -> normalerweise wirst du - wenn du ein projekt mit mehreren dateien machst - den projektmodus deiner IDE (=Oberfläche des Compilers) verwenden. dort musst du dann alles zu übersetzenden dateien angeben sowie die "main"-datei!

    mfg marX

  • Danke für die Antworten. Ich habe noch folgendes Problem: Wenn ich die Klasse Sum kompiliere, kommt eine Fehlermeldung, dass die Klasse LeseZahl nicht gefunden wird. Die Klasse LeseZahl lässt sich kompilieren. Wenn ich LeseZahl einfach als Methode in die Klasse Sum kopiere, funktioniert es auch.
    Die beiden Dateien liegen in einem Verzeichnis, wo sonst nix drinnen ist. Kann mir bitte wer sagen, wo der Fehler ist.

    Hier die 2 Klassen:


    import java.*;
    import java.io.*;

    public class Sum
    {
    public static void main (String args[]) throws java.io.IOException{

    int n=0;
    int zahl = LeseZahl.einlesen();

    System.out.println(zahl);
    }
    }


    import java.io.*;

    public class LeseZahl{

    static int einlesen() throws java.io.IOException{
    System.out.println("Zahl eingeben");
    BufferedReader din = new BufferedReader(new InputStreamReader(System.in));
    int x = Integer.parseInt(din.readLine());
    return(x);
    }

    }

  • Deklarier die Methode static int einlesen() mal public

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • Zitat von AntiBit

    Deklarier die Methode static int einlesen() mal public

    mm, das nützt leider auch nichts. Die genaue Fehlermeldung ist: Undefined variable or class name.

    Müsste prinzipiell die Klasse gefunden werden, wenn sie im gleichen Verzeichnis liegt?

  • Zitat von Sicka

    mm, das nützt leider auch nichts. Die genaue Fehlermeldung ist: Undefined variable or class name.

    Müsste prinzipiell die Klasse gefunden werden, wenn sie im gleichen Verzeichnis liegt?

    Ja, prinzipiell schon. Ich hab's auch ausprobiert, funktioniert einwandfrei. Du müsstest die genaue Fehlermeldung ganz kopieren.

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • Zitat von Sicka

    Ich möchte ein Javaprogramm mit 2 Klassen schreiben. Dabei muss ichjede Klasse als eigene Datei speichern, Dateiname = Klassenname, oder?


    Das ist nicht ganz richtig:

    Es darf nur eine einzige Klasse mit dem Schlüsselwort 'public' pro datei vorhanden sein, und die muss dann genauso heissen wie die datei.

    Du darfst aber beliebig viele weitere Klassen definieren, die nicht public sind:

  • Zitat von AntiBit

    Wenn du die Klasse mit der main-Methode kompilierst wird die andere Klasse nicht automatisch mitkompiliert, es sei denn du verwendest eine IDE a' la Netbeans oder JBuilder.

    Bei mir und Freunden unter Windows folgendes Phänomen:

    Beim Kompilieren über Command-Line werden alle Files übersetzt. Gibt's jedoch einen File schon, dann wird er's nicht. D.h. man kompliiert tatsächlich jeden File jedes mal einzeln oder man löscht immer die .class-Files, damit alles neu kompiliert wird. Blödes Verhalten.

  • Zitat von a9bejo

    Es darf nur eine einzige Klasse mit dem Schlüsselwort 'public' pro datei vorhanden sein, und die muss dann genauso heissen wie die datei.

    Du darfst aber beliebig viele weitere Klassen definieren, die nicht public sind:

    Unter anderem auch aus diesem Grund ist es wohl am besten jeder Klasse eine eigene Datei zu gönnen.

  • Zitat von AntiBit

    Ja, prinzipiell schon. Ich hab's auch ausprobiert, funktioniert einwandfrei. Du müsstest die genaue Fehlermeldung ganz kopieren.

    Bei dir funktionieren die Klassen, so wie sie sind?
    so lautet die genaue Fehlermeldung beim kompilieren:

    Sum.java: In class `Sum':
    Sum.java: In method `Sum.main(java.lang.String[])':
    Sum.java:9: Undefined variable or class name: `LeseZahl'.
    ................int zahl = LeseZahl.einlesen();
    ..............................^
    1 error

  • am code liegt das problem sicher nicht.Der ist (von der syntax her betrachtet) völlig korrekt.

    - compilierst du Sum.java auch sicher _nach_ LeseZahl.java?
    - hast du nicht vielleicht noch irgendwo eine 'package' anweisung in deiner klasse stehen?
    - Hast du vielleicht irgendwo bei den datei- oder klassennamen gross/kleinbuchstaben verwechselt?

    am besten nochmal Schritt für Schritt:

    Datei: 'Sum.java' :

    Datei: 'LeseZahl.java' :

    in der shell:

    Code
    E:\documents\labs\workspace\test\src>javac LeseZahl.java Sum.java
    
    
    E:\documents\labs\workspace\test\src>java Sum
    Zahl eingeben
    2
    2
  • Jetzt funktioniert es endlich.

    Ich habe die ganze Zeit die Klassen getrennt kompiliert, d.h. zuerst:
    javac LeseZahl.java

    und dann:
    javac Sum.java

    Das funktioniert nicht. Wenn ich in einem Befehl beide Klassen schreibe:
    javac LeseZahl.java Sum.java
    funktioniert es. Das war mein Fehler.
    Danke für alle Antworten.

  • Zitat von Sicka

    Jetzt funktioniert es endlich.

    Ich habe die ganze Zeit die Klassen getrennt kompiliert, d.h. zuerst:
    javac LeseZahl.java

    und dann:
    javac Sum.java

    Das funktioniert nicht. Wenn ich in einem Befehl beide Klassen schreibe:
    javac LeseZahl.java Sum.java
    funktioniert es. Das war mein Fehler.

    das ist seltsam! ob getrennt oder gemeinsam compiliert macht eigentlich keinen unterschied! Hauptsache bei 'javac Sum.java' findet der Compiler die 'LeseZahl.class' im classpath.
    :confused:

  • Also versteh das jetzt bitte nicht falsch, aber dieser code sieht nicht danach aus, als ob du java programmieren könntest!!
    als erstes brauchst du mal einen konstruktor für die klassen!
    2. brauchst du keine "main" routine zu erstellen....
    3. würde ich schon aus gründen der übersichtlichkeit jede klasse in eine eigene datei stecken....

    schau dir doch einfach mal ein paar beispiele an....müsste es ja im web genügend geben ;)

    mfg marX

  • Zitat von marX

    Also versteh das jetzt bitte nicht falsch, aber dieser code sieht nicht danach aus, als ob du java programmieren könntest!!


    Nein, Es sieht so aus, als würde er es gerade lernen.
    Er will uns seinen code nicht verkaufen, er stellt fragen darüber.

    Zitat von marX


    als erstes brauchst du mal einen konstruktor für die klassen!


    jeder der beiden klassen in seinem code _hat_ bereits einen konstruktor.
    wenn er nur einen leeren kontruktor ohne parameter benötigt, wieso sollte er ihn dann extra anschreiben?

    Zitat von marX


    2. brauchst du keine "main" routine zu erstellen....


    Wenn er Sum.class als Applikation starten will (das ist hier offensichtlich der fall), dann braucht er auch die main-methode.

    Zitat von marX


    3. würde ich schon aus gründen der übersichtlichkeit jede klasse in eine eigene datei stecken....


    das tut er doch!


    Sicka macht offensichtlich gerade seine ersten Schritte als Programmierer. Wenn er gerade lernt, wie er java-source compiliert, muss er noch nichts über OOP design wissen ( Sicka: 'LeseZahl' ist keine gültige bezeichnung für eine klasse).

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!