Grundsätzliches Verständnisproblem des Aufbaus eines Programms

nonickatall

Mitglied
Ich habe da irgendwie gerade ein grundsätzliches tiefsitzendes Verständnisproblem, das über diese "Hello Word", "Was sind Klassen" Tutorials hinausgeht, ohne das jetzt abwertend zu meinen, vielleicht kann mir da jemand weiterhelfen.

Irgendwie schwirren mir nur noch Klassen, Objekte, Vererbung, Polymorphie, Interfaces, Event Handling Threading und alles mögliche durch den Kopf..

Also..
Wenn ich ein Java Programm schreibe, fange ich ja mit der Main Methode an und rufe eben irgendwelchen Code auf, lese Daten aus Dateien, übernehme Argumente von der Konsole, hole mir irgendwas aus einem SQL Server, wie auch immer.

Klassen verstehe ich momentan so, dass sie zum einen eine Auslagerung von Code sind, da ich ja Eigenschaften und Methoden nach Funktionalität sortiert in Klassen bringe. Dabei kann ich nutzen, das es von irgendwas mehrere Instanzen gibt, dann bilde ich Objekte. OK. Ich kann meine Klassen mit fremdem Code erweitern also erben, auch klar.

Klassen sind aber doch auch irgendwie Programme, die nicht notwendigerweise vom Hauptprogramm abhängen, sondern mit dem Hauptprogramm oder anderen Programmen desselben Systems nur zusammenarbeiten, indem sie autark Daten oder Funktion bereitstellen, sich autark um bestimmte Aufgaben kümmern usw.

Also beispielsweise habe ich vielleicht eine entkoppelte GUI, die mit meinem Hauptprogramm nur
kommuniziert, oder ich habe einen Nachrichtenserver der eigenständig auf eintreffende Nachrichten lauscht, diese verarbeitet und dann möglicherweise per Event, oder auf anderem Wege, mit anderen Teilen des Systems, oder dem Hauptprogramm kommuniziert. Oder ein Teilprogramm kümmert sich um umfangreiche Druckaufbereitungen und ich will da nicht drauf warten.

Natürlich kann ich eine Klasse, mit zum Beispiel einem Loop, oder Event Listerner versehen und irgend was bearbeiten.

Aber wie starte ich sowas autark, das stehe ich voll auf dem Schlauch.
Wenn ich eine Methode in einer anderen Klasse anspreche, egal ob statisch oder als Objekt, wartet mein Programm scheinbar auf Beendung, auch wenn es sich um eine Void Methode handelt.

Ich habe gelesen, dass in einem Paket mehrere Klassen mit Main Methoden sein dürfen. Aber wie starte ich die aus Java heraus? Ist das das Thema Threading?

Kann mich jemand erhellen? Ich finde da irgendwie nix gescheites dazu..

Vielleicht suche ich auch falsch..

Vielen Dank im Voraus
Ralf
 
Das sind viele Fragen; ich will nur auf eine antworten:
Ich habe gelesen, dass in einem Paket mehrere Klassen mit Main Methoden sein dürfen. Aber wie starte ich die aus Java heraus? Ist das das Thema Threading?
Ja, es ist richtig, dass jede Klasse ihre eigene main-Methode haben darf (und das hat nichts mit Threading zu tun). Das wird aber kaum benutzt. Früher hat man eine main-Methode gern benutzt, um die Klasse (manuell) testen zu können, um also zu überprüfen, ob alle Methoden der Klasse richtig funktionieren. Eine solche Überprüfung ist inzwischen ersetzt durch Test-Tools.
Dennoch ist es auch heute noch möglich, unterschiedliche main-Funktitionen zu haben (selbst, wenn du die Klassen in ein jar-File gepackt hast). Du kannst sie zum Beispiel aufrufen mit (ungetestet):
Code:
java -jar /pfad/zu/meiner/dingsbum.jar MeineKlasse
 
Danke, guter Hinweis. Und wenn ich dann sagen wir zwei Klassen in dem Jar habe und diese getrennt starte. Kann ich dann Methoden in der jeweils anderen Klasse aufrufen? Geht das?

Kann in einer Klasse beispielsweise ein Loop arbeiten, der bei irgendwelchen Ereignissen, einen Loop in der anderen Klasse beeinflusst oder Event Listener anstößt, diese Klassen dann aber wieder getrennt weiter arbeiten, ohne auf das Ende der Abarbeitung beim Partner zu warten?
 
Sagen wir mal ich habe eine Klasse "Loop", die von der Klasse mit der main Methode so gestartet werden soll, das da ein Loop läuft der irgendwas macht. Aber die Hauptklasse wartet da nicht drauf, sondern das wird sozusagen "geforkt" oder als eigener Task gestartet, oder wie das in Java konkret heiß. Danach startet die Hauptklasse eine Klasse "Event" in der Event Listener auf irgendwelche Events warten und macht dann weiter mit ihrer Arbeit, wartet zum Beispiel auf Events, die die Klasse Loop generiert, oder schickt der Klasse Event wiederum Events die diese abarbeitet.

Das kapiere ich nicht, wie das geht.
 
Ok, aber ein Programm ist doch auch eine Klasse, eine Klasse natürlich nicht unbedingt ein Programm.. Oder?
Eine Klasse ist eine Art von Bauplan für Objekte dieser Klasse. Normalerweise gibt es eine Klasse, die auch die main() Methode enthält über die das Programm gestartet wird. Dort werden i. d. R. Instanzen von Klassen erzeugt und deren Methoden aufgerufen.

Es gibt in Java natürlich die Möglichkeit mit mehreren Threads zu arbeiten, die dann sozusagen parallel ablaufen. Aber auch eine einfache Loop muss nicht zwingend das Programm blockieren ("die Hauptklasse wartet da nicht drauf"), du darfst eben keine Methoden aufrufen, die den Ablauf blockieren (wie z. B. Scanner, um von der Konsole zu lesen).

Ein EventListener wartet ja auch nicht auf irgend was. Das ist einfach nur eine Methode, die im Falle eines Events aufgerufen und abgearbeitet wird. Danach geht es wieder zum Aufrufer zurück. Du kannst dir das so vorstellen, dass eine Liste mit Telefonnummern nacheinander angerufen wird (jede Nummer ist ein Listener).

Meine Empfehlung an dich wäre das Buch "Entwurfsmuster von Kopf bis Fuß". Damit wirst du dein Verständnis auf ein neues Niveau heben und es wird dir einiges klarer werden.
 
Ok, aber ein Programm ist doch auch eine Klasse, eine Klasse natürlich nicht unbedingt ein Programm.. Oder?
Die main-Methode ist eine statische Methode, könnte man auch Funktion nennen.

Statische Methoden sitzen nur in der Klassen-Datei als umgebender Namensraum, sind aber keine Methoden der Klasse.
Methoden der Klasse haben nicht den modifier static.

Es ist für Anfänger verwirrend, dass die statischen Methoden in einer Klassen-Datei als umgebender Namensraum sitzen, es gibt JVM-Sprachen wie Groovy, die das nicht verlangen.
 
Statische Methoden sitzen nur in der Klassen-Datei als umgebender Namensraum, sind aber keine Methoden der Klasse.
Methoden der Klasse haben nicht den modifier static.

Es ist für Anfänger verwirrend, dass die statischen Methoden in einer Klassen-Datei als umgebender Namensraum sitzen, es gibt JVM-Sprachen wie Groovy, die das nicht verlangen.
Das ist extrem verwirrend. Denn man spricht bei statischen Methoden explizit ja von Klassenmethoden. Das sind also Methoden der Klasse. Hier wolltest Du evtl. Instanz sagen? Es sind keine Methoden der Instanz, aber sehr wohl Methoden der Klasse. Und die Klasse sehe ich nicht als Namensraum. Ich sehe das eher aus der Smalltalk Sicht: Die Klasse ist halt auch nur eine Instanz - halt vom Typ Class.

Und dass die Methode zur Klasse gehört wird doch auch bei Reflection deutlich. Über die Class kannst Du Dir die Methode geben lassen ...
 
Verständnisfrage. In einer klasse mach2 ist die void Methode public void machwas(){ tu es} und in der anderen klasse mach1 ist eine Methode public void tuwasanderes(){ mach es } und ich schreibe schreibe in einer neuen KLasse import application mach2; import application mach1 und schreibe eine Methode public void tu beides(){mach2 M2 = new mach2(); mach1 M1 =new mach1(); M2.tues(); M1.tuwasanderes();} wird das zeitgleich ausgeführt oder hintereinander?
 
Zuletzt bearbeitet:
Verständnisfrage. In einer klasse mach2 ist die void Methode public void machwas(){ tu es} und in der anderen klasse mach1 ist eine Methode public void tuwasanderes(){ mach es } und ich schreibe schreibe in einer neuen KLasse import application mach2; import application mach1 und schreibe eine Methode public void tu beides(){mach2 M2 = new mach2(); mach1 M1 =new mach1(); M2.tues(); M1.tuwasanderes();} wird das zeitgleich ausgeführt oder hintereinander?
Es wäre angebracht für eigene Fragen ein eigenes Thema zu beginnen und nicht andere Themen zu kapern.

Abgesehen davon, dass dein Erguss schwer zu lesen ist: Wieso sollte es zeitgleich ausgeführt werden?
 
Zusätzlich: man kann es ja ausprobieren, aber je nach Menge des auszuführenden Codes wird das zeitlich wohl kaum ins Gewicht fallen. Ansonsten könnte man den Einsatz von Threads erwägen: https://howtodoinjava.com/java/multi-threading/java-runnable-vs-thread/ . Im folgenden (Spass-)Beispiel wird eine Reihenfolge forciert:
Java:
package com.testproject_mehrere_klassen;
public class mach1 {
    public void tuwasanderes(){ System.out.println("Hallo, hier ist mach1"); }
}
Java:
package com.testproject_mehrere_klassen;
public class mach2 {
    public void machwas(){ System.out.println("Hallo von mach2"); }
}
Java:
package com.testproject_mehrere_klassen;
import com.testproject_mehrere_klassen.mach1;
import com.testproject_mehrere_klassen.mach2;

 * @author M.L
 
public class tue_was{
  //  public void tu beides(){mach2 M2 = new mach2(); mach1 M1 =new mach1(); M2.tues(); M1.tuwasanderes();}
    public void tu_beides()
    {
        mach2 M2 = new mach2();
        mach1 M1 =new mach1();
       for (int i= 0; i<=3; i++ ) { M2.machwas(); } 
        M1.tuwasanderes();
    }
    public static void main (String[] args) {
        tue_was t_w = new tue_was(); 
        t_w.tu_beides();
    }
}
Output:
Hallo von mach2
Hallo von mach2
Hallo von mach2
Hallo von mach2
Hallo, hier ist mach1
 
Eigentlich eine Interessante Frage.
Denn einerseits sind Klassen ja etwas, mit dem man zugehörige Objekte erzeugen kann (während der Erzeugung wird der betreffende Konstruktor der Klasse aufgerufen, Main Methode wird hier ignoriert).

Andererseits kann man Klassen aber auch "ausführen".
Also sowas wie "java Klassenname" in die Konsole hauen und dann wird wiederum die Main Methode der Klasse verwendet (konstruktor kommt in dem Fall nicht zum Einsatz, vermute ich)

Was hat es mit dieser Dualität auf sich, einerseits "Muster" für baubare Objekte, andererseits Beinhalter ausführbaren Codes in der Main methode?

Je nachdme wie man die Kalsse "benutzt", kommt entweder der Konstruktor oder die main methode zum Einsatz aber irgendwie nie Beides.

Erinnert mich irgendwie an den welle-Teilchen-Dualismus, gneauso komsicher Kram! 🙂
 
Nun auf dieser Seite: https://www.guru99.com/multithreading-java.html Heist es ja das eigendlich jedes Programm ein singeltread darstellt.
Und die erste Verständnisfrage praktisch ein Mutitread in einfachster Form ist. Aber bei dem echten Multitread kommt wohl das sogenannte Mutitasking zum einsatz. Wie bei dem letzten Beispiel wo dann sowas wie ein Lebenszyklus abläuft . Aber selbst habe ich es noch nicht ausprobiert. Aber stelle es mir vor wie ein Sequencer. jedes Tread ist eine Spur die man stoppen und starten kann in dem man auf eine Taste drückt.
 
Hallo und vielen Dank an Alle die geantwortet haben.

Bin leider nicht früher dazu gekommen, mich da groß einzubringen, da leider die Arbeit und die Familie, mich nicht so an Java sitzen lassen, wie ich es gerne würde.

Ich habe aber, auch durch die Anregungen aus dem Thread, mir das Ganze nochmal versucht anzuschauen und meine schon wieder etwas Verständnis gewonnen zu haben, denn offenbar ist es eben so, dass Java die Dinge der Reihe nach abarbeitet und, man berichtige mich, man dann meist eher durch Event Handler interaktiv ins Geschehen einreift und dann im Programm die gewünschten Dinge abarbeitet.

Also wenn ich beispielsweise eine Android App programmiere, mit der ich Rechnen kann, passiert ja programmtechnisch nicht viel, außer der User drückt einen Button oder gibt einen Wert ein. Dann rechnet das Programm oder ändert GUI Elemente.

Bei mir ist es aber so, das die Anwendung im Hintergrund viele komplexe Dinge tun soll. Und dafür muss ich mit eben mit Threads arbeiten, damit ich dann beispielsweise eine Klasse alleine "im Loop auf einem SQL Server" laufen lassen kann, die dann ihrerseits per Events andere Klassen zum Handeln aufruft. Und das auch noch auf mehreren Maschinen.

Ich habe allerdings meinen ersten größeren Thread nun mal auf einem Raspberry laufen lassen, während parallel ein anderer, die Hardware bedient, was schon ganz gut funktioniert.

Allerdings stürzt das Ganze nach 3 Stunden Laufzeit wegen einen OutOfMemoryError ab... Also habe ich jetzt das nächste Problem und habe mich erstmal mit dem Speichermanagment versucht zu beschäftigen, kann allerdings gerade noch nicht erkennen, warum das passiert..

Aber ich weiß aus anderen Projekten. Nur der, der ein Problem nach dem anderen wegkämpft, hat eine Chance programmieren zu lernen wenn er nicht gerade Naturtalent ist... 😎

In diesem Sinne.

Ich wünsche einen schönen Muttertag an alle..

LG
Ralf



als das man da so Loops verwenndet.
 

Zurück
Oben