Warum so, was kann ich daraus verstehen?

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.

Woher ich das weiß:Studium / Ausbildung – Studienabschluss in Informatik

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.


Himbeere722 
Beitragsersteller
 16.01.2025, 22:06

Aber warum nicht einfach so meine ich:

new A();

new B();

new C();

oder hast du verstanden was ich meinte?

Neeuugiieerriig  16.01.2025, 22:15
@Himbeere722

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.

Neeuugiieerriig  16.01.2025, 23:07
@Himbeere722

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?

ralphdieter  16.01.2025, 23:16
new Mensch();

kann man zwar machen, aber es gibt schönere Methoden dafür ;-)

(scnr)

Himbeere722 
Beitragsersteller
 16.01.2025, 23:39

Okay aber dein Beispiel verstehe ich nicht😔 das zweite macht für mich mehr Sinn

MagicalGrill  17.01.2025, 09:19
@Himbeere722

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");
Himbeere722 
Beitragsersteller
 17.01.2025, 12:20
@MagicalGrill

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?

MagicalGrill  17.01.2025, 12:32
@Himbeere722
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.

Himbeere722 
Beitragsersteller
 17.01.2025, 17:14
@MagicalGrill

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?

MagicalGrill  17.01.2025, 18:51
@Himbeere722

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.

Himbeere722 
Beitragsersteller
 17.01.2025, 19:13
@MagicalGrill

Das nennt Mama her alles den Test oder? Weil es gibt dann ja noch die Klassen die von ihm ausgehen, oder?

MagicalGrill  18.01.2025, 07:01
@Himbeere722

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 + "!");
  }
}
Himbeere722 
Beitragsersteller
 18.01.2025, 11:56
@MagicalGrill

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.

MagicalGrill  18.01.2025, 12:24
@Himbeere722

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.

Himbeere722 
Beitragsersteller
 24.01.2025, 17:38
@MagicalGrill

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.

Woher ich das weiß:Hobby