Warum so, was kann ich daraus verstehen?
public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
Von ihm gehen ja Klassen aus aber warum nicht einfach:
new A();
new B();
new C(); ohne vorher Aa und Bb etc?
4 Antworten
Also nehmen wir das mal auseinander:
A a = new A();
A ist eine Klasse, a ist eine Variable der Klasse (oder Typ) A. new A() ruft den (Standard)Konstructor der Klasse A auf und erhält ein Objekt vom Typ A zurück.
Es wird also ein Objekt der Klasse A einer variable mit dem Typ Klasse A zugewiesen.
Der Typ der Variable und die Klasse des Objektes das dem zugewiesen wird muss nicht identisch aber kompatibel sein. Dazu lernst du später mehr.
Warum braucht man eine Variable? Damit du etwas machen kannst mit dem erstellten Objekt ist es nötig dieses bzw die Referenz auf dieses zu speichern.
A a = new A();
B b = new B();
C c = new C();
Wird so geschrieben, um die Objekte
a, b und c
später wiederverwenden zu können. Ohne Variablennamen (new A();) würde das Objekt zwar erstellt, aber du könntest es nicht mehr ansprechen oder verwenden. Die Referenzen wie a sind nötig, um mit den Objekten im Code zu arbeiten.
New A(); erstellt zwar das Objekt, welches aber gleich bei der nächsten Garbage Collection entsorgt wird. Um darauf später zuzugreifen musst du eine Referenz auf das Objekt herstellen. Mit a=New A() weist du a die Adresse des erstellten Objekts zu. Dann kannst du wenn immer du auf das Objekt zugreifen möchtest a verwenden.
A oder Aa sind nur Bezeichnungen für Referenzen, Also egal.
Es ist nur ein Label den du selbst wählen kannst. Mann nimmt in der Regel selbstsprechende Bezeichnungen.
Wenn du nur new A(); schreibst, erzeugst du ein Objekt vom Typ A, auf das du im späteren Verlauf des Programms nicht mehr zugreifen kannst, weil du keine Referenz darauf hast. Das liegt dann einfach nutzlos im Speicher rum.
Vergleiche:
Mensch mensch = new Mensch();
mensch.Huepfen();
mensch.Laufen();
mensch.Schlafen();
mit:
new Mensch();
// und jetzt?
new Mensch();
kann man zwar machen, aber es gibt schönere Methoden dafür ;-)
(scnr)
Okay aber dein Beispiel verstehe ich nicht😔 das zweite macht für mich mehr Sinn
Fangen wir mal ganz klein an: Was macht "new Mensch();" überhaupt? Es erzeugt einen neuen Menschen. Analysieren wir jetzt den folgenden Code:
new Mensch();
new Mensch();
Dieser erzeugt einen neuen Menschen und erzeugt danach nochmal einen neuen Menschen.
Nehmen wir an, die Klasse Mensch hätte eine Methode, mit der man dem Menschen einen Namen geben kann, sagen wir setName.
Jetzt würde ich den ersten Menschen gerne "Markus" nennen, und den zweiten Menschen "Petra".
Wie kann ich das aber machen? Im Code habe ich jetzt überhaupt keine Möglichkeit mehr, zwischen den beiden erzeugten Objekten zu unterscheiden - ich hab zwar zwei Menschen angelegt, aber die liegen irgendwo im Speicher und ich hab keine Ahnung wo.
Deswegen verteilen wir bei der Erzeugung eines Objektes gleichzeitig eine Referenz auf das Objekt - das kannst du dir vorstellen wie die Wohnadresse des Objektes. Damit wissen wir, wo sich das Objekt im Speicher befindet und können daher mit dem Objekt weiterarbeiten:
Mensch mensch1 = new Mensch();
Mensch mensch2 = new Mensch();
Jetzt kann ich mit mensch1 auf das erste Mensch-Objekt zugreifen und mit mensch2 auf das zweite. Und nun kann ich den Menschen auch Namen geben:
Mensch mensch1 = new Mensch();
Mensch mensch2 = new Mensch();
mensch1.setName("Markus");
mensch2.setName("Petra");
Achso danke also soll man die auch eigentlich nummerieren? Und warum aber zweimal und nicht nur z.b beim ersten: mensch1 = new Mensch ( ) ; oder nur Mensch = new Mensch ( ) ;
Und mit klein Buchstabe oder groß das M?
Achso danke also soll man die auch eigentlich nummerieren?
Nicht unbedingt - wenn du mehrere Objekte anlegst, kann es sinnvoll sein, die zu nummerieren. Aber wie du die nennst, ist dir überlassen - nenn sie so, dass du auch in einer Woche noch weißt, was du damit gemeint hast ;) Folgender Code macht inhaltlich genau dasselbe, ich hab nur die Referenzen anders benannt:
Mensch markus = new Mensch();
Mensch petra = new Mensch();
markus.setName("Markus");
petra.setName("Petra");
Und warum aber zweimal und nicht nur z.b beim ersten: mensch1 = new Mensch ( ) ; oder nur Mensch = new Mensch ( ) ;
Wenn du eine Variable deklarierst (wie im obigen Beispiel die Variable markus), dann musst du (bei Java zumindest) dazu sagen, welchen Datentyp das zugehörige Objekt hat. In unserem Fall ist markus eine Referenz auf ein Mensch-Objekt, deswegen schreiben wir "Mensch markus".
Wäre Markus stattdessen ein Fisch, würden wir schreiben:
Fisch markus = new Fisch();
Mensch petra = new Mensch();
markus.setName("Markus");
petra.setName("Petra");
Sehr stark vereinfacht ausgedrückt: Der Compiler will von vornherein wissen, ob er an der Adresse markus einen Fisch vorfinden wird oder einen Menschen.
Danke und es ist egal ob großer Buchstabe oder kleiner? Und das ist der Test oder? Bei Klassen wäre es dann anders oder?
Bei deinen Variablen ist Groß-/Kleinschreibung egal. Beim Datentyp kommt es halt darauf an, wie die Klasse heißt. Wenn die Klasse "MeNsCh" heißt, dann muss es auch genau so geschrieben werden.
Das nennt Mama her alles den Test oder? Weil es gibt dann ja noch die Klassen die von ihm ausgehen, oder?
Ich weiß nicht, was du als "Test" bezeichnen willst - alles was ich oben geschrieben hab, ist einfach Code, der in einem Methodenkörper drinstehen würde. Den Namen "Test" sehe ich in dem Zusammenhang erst einmal nicht - "Tests" sind Dinge, die überprüfen ob der Code richtig funktioniert.
Wenn du Programmierübungen machst, könntest du das Hauptprogramm als "Test" sehen, ob du die Aufgabe richtig gelöst / die zugehörigen Klassen richtig gecodet hast. Aber im technischen Sinne ist das einfach nur das eigentliche Programm:
public static void main(String args[]){
Mensch markus = new Mensch();
markus.setName("Markus");
markus.greet();
}
Dieser Code basiert darauf, dass es eine Klasse namens "Mensch" gibt, die könnte dann so aussehen:
public class Mensch{
private String name;
public void setName(String input){
name = input;
}
public void greet(){
System.out.println("Hallo, ich bin " + name + "!");
}
}
Danke, wie verstehst du das alles aber so gut, mir fällt das schwer☹️ vorallem auch die mathematischen Sachen da wie boolesche Algebra z.b oder von Dezimal in binär umrechnen etc.
Gehört halt zum Job 😅
Wenn du anfängst, selbst ein paar eigene kleine Programme zu schreiben lernst du viel schneller dazu, als wenn du alles nur theoretisch lernst. Dann wird dir alles, was ich oben geschrieben habe, irgendwann komplett trivial vorkommen.
Such dir für den Anfang online Programmieraufgaben, an denen du dich probieren kannst, und fang - sobald du die Grundlagen drauf hast - dein eigenes (anfangs kleines) Projekt an.
Hi, könntest du vielleicht bei meiner neuesten Frage vorbei schauen und mir da vielleicht helfen?
Es muss eine Instanz der Klassen erstellt werden, wobei es sich um ein Objekt handelt.
Dieses Objekt muss im Arbeitsspeicher gespeichert werden.
Dabei wird jeweils der construktor der jeweiligen Klasse aufgerufen.
Aber warum nicht einfach so meine ich:
new A();
new B();
new C();
oder hast du verstanden was ich meinte?