Grundsätzliches Verständnisproblem des Aufbaus eines Programms

nonickatall

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
 
F

fhoffmann

Top Contributor
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
 
nonickatall

nonickatall

Mitglied
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?
 
nonickatall

nonickatall

Mitglied
Ok, aber ein Programm ist doch auch eine Klasse, eine Klasse natürlich nicht unbedingt ein Programm.. Oder?
 
nonickatall

nonickatall

Mitglied
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.
 
temi

temi

Top Contributor
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.
 
M

M.L.

Top Contributor
B

Barista

Top Contributor
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.
 
kneitzel

kneitzel

Top Contributor
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 ...
 
T

Trjavnamen

Bekanntes Mitglied
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:
T

Trjavnamen

Bekanntes Mitglied
Oder anders eine Zeitangabe ab Start der beide Filme (oder aufgaben) gleichzeitig startet?
 
T

Trjavnamen

Bekanntes Mitglied
In beiden Fällen wird es doch hintereiander in millisekunden ausgeführt oder?
 
temi

temi

Top Contributor
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?
 
M

M.L.

Top Contributor
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
 
B

berndoa

Bekanntes Mitglied
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! :)
 
T

Trjavnamen

Bekanntes Mitglied
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.
 
nonickatall

nonickatall

Mitglied
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... :cool:

In diesem Sinne.

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

LG
Ralf



als das man da so Loops verwenndet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrankR2 Grundsätzliches Verständnisproblem: Java 32/64-bit; Windows 7/8, 32/64-bit-System Java Basics - Anfänger-Themen 5
O Grundsätzliches: Besser extend oder instanziieren? Java Basics - Anfänger-Themen 4
P Grundsätzliches zur String-Initialisierung Java Basics - Anfänger-Themen 2
X Verständnisproblem Call-By-Reference Java Basics - Anfänger-Themen 5
P JavaFX: Verständnisproblem bei ComboBox/ChoiceBox etc. Java Basics - Anfänger-Themen 9
T Verständnisproblem mit Assoziationen Java Basics - Anfänger-Themen 7
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
A Erste Schritte Verständnisproblem Java Basics - Anfänger-Themen 5
S Verständnisproblem Aufgabe Java Basics - Anfänger-Themen 9
S Model View Controller: Verständnisproblem Java Basics - Anfänger-Themen 13
temi Verständnisproblem Class.forName() Java Basics - Anfänger-Themen 3
2 Verständnisproblem bei Anwendung von Lower Bounded Wildcards Java Basics - Anfänger-Themen 5
V Verständnisproblem Java Basics - Anfänger-Themen 22
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
A Verständnisproblem Ausgabe Do-While-Schleife Java Basics - Anfänger-Themen 3
J Verständnisproblem einer Methode Java Basics - Anfänger-Themen 20
M Konstruktur - Verständnisproblem Java Basics - Anfänger-Themen 4
C Postinkrement und println - Verständnisproblem Java Basics - Anfänger-Themen 8
T Verständnisproblem beim Vigenere-Verfahren Java Basics - Anfänger-Themen 2
Q MVC Verständnisproblem: Controller vs model.modelChanged() Java Basics - Anfänger-Themen 0
N Verständnisproblem InsertionSort. Java Basics - Anfänger-Themen 2
D Verständnisproblem Java Basics - Anfänger-Themen 2
B VerständnisProblem mit Beispielaufgabe aus Buch Java Basics - Anfänger-Themen 1
H Polymorphie Verständnisproblem Vererbung/Polymorphie Java Basics - Anfänger-Themen 4
S Verständnisproblem bei Interfaces Java Basics - Anfänger-Themen 6
V Verständnisproblem Java Basics - Anfänger-Themen 5
V Arrays-verständnisproblem Java Basics - Anfänger-Themen 4
M Collections HashSet verständnisproblem Java Basics - Anfänger-Themen 9
S Verständnisproblem einer Übungsaufgabe Java Basics - Anfänger-Themen 6
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Verständnisproblem mit swing Java Basics - Anfänger-Themen 6
F Methoden Cannot refer to a non-final variable.. verständnisproblem. Java Basics - Anfänger-Themen 7
P Verständnisproblem main Methode Java Basics - Anfänger-Themen 9
S Klassen Verständnisproblem Konstruktor Java Basics - Anfänger-Themen 7
I e.getMessage(); - Verständnisproblem Java Basics - Anfänger-Themen 6
lesni Vererbung Vererbung - Verständnisproblem Java Basics - Anfänger-Themen 2
M OOP Polymorphie/Vererbung Verständnisproblem Java Basics - Anfänger-Themen 2
J Verständnisproblem Methoden-Kettung Java Basics - Anfänger-Themen 3
A Vererbung Verständnisproblem bei Übung Java Basics - Anfänger-Themen 5
E Verständnisproblem Typkonvertierung Java Basics - Anfänger-Themen 4
S OOP Verständnisproblem Umsteiger Java Basics - Anfänger-Themen 22
C Array Verständnisproblem Java Basics - Anfänger-Themen 3
P White-Box-Test Verständnisproblem Java Basics - Anfänger-Themen 11
D : ? Operator -Verständnisproblem Java Basics - Anfänger-Themen 24
G Verständnisproblem: Exceptions Java Basics - Anfänger-Themen 17
L Eclipse verlangt "{" nach ";"... Verständnisproblem Java Basics - Anfänger-Themen 5
D charAt(i) verständnisproblem Java Basics - Anfänger-Themen 4
D Verständnisproblem Marken und Schleifen Java Basics - Anfänger-Themen 19
M Verständnisproblem bei Ternären Operanten bzw. Bedingungsoperator Java Basics - Anfänger-Themen 8
T Datentypen Verständnisproblem mit main Methode Java Basics - Anfänger-Themen 3
M Verständnisproblem Threads Java Basics - Anfänger-Themen 7
X Threads und synchronized - Verständnisproblem Java Basics - Anfänger-Themen 3
W ArrayLists: Verständnisproblem bei remove() Java Basics - Anfänger-Themen 2
B Verständnisproblem zu Swing und Methoden Java Basics - Anfänger-Themen 8
A Postinkrement-Verständnisproblem Java Basics - Anfänger-Themen 12
R Iterator Liste, Verständnisproblem Java Basics - Anfänger-Themen 4
1 Verständnisproblem mit Foreach Java Basics - Anfänger-Themen 4
B Verständnisproblem bei Vererbung Java Basics - Anfänger-Themen 3
W generisches Programmieren - Verständnisproblem Java Basics - Anfänger-Themen 4
A Verständnisproblem Nr 2 Java Basics - Anfänger-Themen 14
A Verständnisproblem Java Basics - Anfänger-Themen 6
A Array Verständnisproblem Java Basics - Anfänger-Themen 8
G Verständnisproblem --> JTree Java Basics - Anfänger-Themen 6
M Verständnisproblem mit der Klasse Thread Java Basics - Anfänger-Themen 10
N BufferedReader Verständnisproblem Java Basics - Anfänger-Themen 12
G Verständnisproblem: Code kompelieren und interpretieren Java Basics - Anfänger-Themen 3
S Polymorphie Verständnisproblem Java Basics - Anfänger-Themen 4
G Verständnisproblem Türme von Hanoi Java Basics - Anfänger-Themen 4
G Verständnisproblem Serverinput einlesen. Java Basics - Anfänger-Themen 4
J Array und Schleifen Verständnisproblem Java Basics - Anfänger-Themen 25
G Verständnisproblem Java Basics - Anfänger-Themen 4
N Verständnisproblem: Mehrere Objekte einer Klasse erstellen Java Basics - Anfänger-Themen 2
S SelectionListener + repaint().Verständnisproblem ;) Java Basics - Anfänger-Themen 7
V Verständnisproblem mit Abstrakten zu Konkreten Klassen Java Basics - Anfänger-Themen 7
A Problem mit der Stringgrösse, bzw Verständnisproblem? Java Basics - Anfänger-Themen 14
A Verständnisproblem mit ScrollPanel Java Basics - Anfänger-Themen 3
R Verständnisproblem mit Hibernate Java Basics - Anfänger-Themen 2
T Verständnisproblem mit equals() Java Basics - Anfänger-Themen 4
N datei byte für byte auslesen (verständnisproblem) Java Basics - Anfänger-Themen 2
T Verständnisproblem packages/import Java Basics - Anfänger-Themen 9
Chucky Lineare Listen Programm Verständnisproblem Java Basics - Anfänger-Themen 38
D Verständnisproblem Java Basics - Anfänger-Themen 6
S for Schleifen: Verständnisproblem Java Basics - Anfänger-Themen 15
T Vererbung von Attributen und Methoden, Verständnisproblem Java Basics - Anfänger-Themen 4
bernd while-Schleife: Verständnisproblem Java Basics - Anfänger-Themen 7
S verständnisproblem drucken Java Basics - Anfänger-Themen 11
G GridBagLayout: Verständnisproblem Java Basics - Anfänger-Themen 5

Ähnliche Java Themen


Oben