Datentypen Wertebereich von <Klassenname> <Variable>

H

Huaj

Mitglied
Hallo,

kann mir jemand erklären was "Auto km" ist? Objekt, Variable ???
Java:
public class Auto {

private int ps; //Wertebereich ist hier int

private boolean kmStand; //Wertebereich ist hier boolean

private Auto km; //Wertebereich???

public boolean gefahren() {
return kmStand;
}
    
public void fahren (Auto km) {
this.km = km;
fahren = true;

}


Eine Variable oder ein Objekt kann es nicht sein, da Variable mit einem Datentyp deklariert werden (also int, boolean, double etc.). Objekte werde mit dem „new“ Operator erzeugt…
Nach meiner Recherche handelt es sich um Referenzen?

Danke im Voraus.

VG
 
J

Joreyk

Bekanntes Mitglied
Ja richtig es geht um Referenzen;

falls du
Auto km;
hast hast du einen "Platzhalter" geschaffen der hat im Moment keine Referenz bzw die Null referenz weil das new Fehlt das du richtig gesagt hast , du kannst aber woanders new Auto() machen und dann in dieses Objekt rein speichern
 
temi

temi

Top Contributor
Eine Variable oder ein Objekt kann es nicht sein, da Variable mit einem Datentyp deklariert werden
Es gibt ja nicht nur primitive Datentypen. Eine Klasse ist ja auch ein Datentyp. Damit ist es eine Variable, die eine Referenz auf ein Objekt enthält.

Wobei eine Variable vom Typ Auto mit dem Namen "km" irgendwie keinen Sinn ergibt.

Und außerdem:
Java:
private int ps; //Wertebereich ist hier int
Der Typ der Variablen "ps" ist int, der Wertebereich entspricht dem eines Integers.
 
H

Huaj

Mitglied
Ja richtig es geht um Referenzen;

falls du
Auto km;
hast hast du einen "Platzhalter" geschaffen der hat im Moment keine Referenz bzw die Null referenz weil das new Fehlt das du richtig gesagt hast , du kannst aber woanders new Auto() machen und dann in dieses Objekt rein speichern
Danke.

Aber ist ein new immer notwendig? Ich habe relativ viele Beispiele im Internet ohne new gesehen.
 
H

Huaj

Mitglied
Es gibt ja nicht nur primitive Datentypen. Eine Klasse ist ja auch ein Datentyp. Damit ist es eine Variable, die eine Referenz auf ein Objekt enthält.

Wobei eine Variable vom Typ Auto mit dem Namen "km" irgendwie keinen Sinn ergibt.

Und außerdem:
Java:
private int ps; //Wertebereich ist hier int
Der Typ der Variablen "ps" ist int, der Wertebereich entspricht dem eines Integers.
Vielen Dank. Das Beispiel finde ich auch ein bisschen verwirrend.😅

Wozu genau kann man die Referenzen verwenden? Und wie genau kann man die verwenden? Bzgl. den Referenzen stehe ich auf dem Schlauch.
 
J

Joreyk

Bekanntes Mitglied
Danke.

Aber ist ein new immer notwendig? Ich habe relativ viele Beispiele im Internet ohne new gesehen.
es gibt glaube ich soweit nur 1 Ausnahme wo man für ein Objekt kein new benötigt

String s = new String("sdsaf")
String s = "sdsaf"
das liegt aber daran dass String ein spezial kandidat ist...


und natürlich bei allen grund daten typen int, boolean, double....weil das keine Objekte sind

was du siehst ist eine Methode die aufgerufen wird und die Intern dann ein
return new MyObject hat
 
kneitzel

kneitzel

Top Contributor
es gibt glaube ich soweit nur 1 Ausnahme wo man für ein Objekt kein new benötigt
Ja das ist richtig, so man die Wrapper-Klassen (Autoboxing) nicht dazu zählt. Aber das hast Du ja auch im Blick gehabt auch wenn Du die nicht explizit erwähnt hast.

Wozu genau kann man die Referenzen verwenden? Und wie genau kann man die verwenden? Bzgl. den Referenzen stehe ich auf dem Schlauch.
Referenzen kannst Du nutzen, um auf die Instanz, auf die verwiesen wird, zuzugreifen.
Sprich: Du kannst da Methoden aufrufen oder Attribute auslesen / setzen (So die Zugriffsrechte dies zulassen).
 
kneitzel

kneitzel

Top Contributor
Java:
System.out.println("Hello world!");
System ist eine Klasse, die ein statisches Attribut hat (out). (Zugriff auf ein Attribut)
Auf dieser Instanz wird die Methode println aufgerufen.

Das geht prinzipiell immer genau so. Man kann sich teilweise auch neue Instanzen erzeugen und dann da Dinge aufrufen:
Java:
List<String> myList = new ArrayList<>(); // Neue Instanz erzeugen und in der Variable myList speichern.
myList.add("Hallo!"); // Aufrufen der Methode add auf der erzeugten Instanz.
 
temi

temi

Top Contributor
Aber ist ein new immer notwendig? Ich habe relativ viele Beispiele im Internet ohne new gesehen.
Zur Erzeugung eines neuen Objektes (= Instanz einer Klasse) ist "new" notwendig, aber es ist natürlich möglich bereits existierende Objekte einer Variablen zuzuweisen.

Nehmen wir deine Klasse Auto.
Java:
Auto auto = new Auto(); // erzeugt eine neue Instanz der Klasse Auto

Auto auchAuto = auto; // weist die Referenz auf auto der Variablen auchAuto zu

// beide Variablen "zeigen" jetzt auf das selbe Auto (das in der ersten Zeile erzeugt wurde)
 
mihe7

mihe7

Top Contributor
Irgendwie tue ich mich damit schwer. Evtl. wird das mit der Zeit verständlicher?
Im Prinzip ist das ganz einfach: bei primitiven Datentypen kommt man grundsätzlich ohne new aus, bei komplexen Datentypen braucht man in der Regel ein new, um eine Instanz zu erstellen.

Erklärung:

In Java unterscheiden wir zwischen sog. primitiven Datentypen (boolean, byte, short, int, char, long, float und double) und komplexen Datentypen (auch z. B. Referenztypen genannt) wie Arrays, Klassen, Aufzählungen etc.

Der Unterschied ist, dass bei primitiven Datentypen der Wertebereich und damit auch der Speicherbedarf von vornherein bekannt ist, was bei komplexen Typen nicht der Fall ist (denk z. B. einfach mal an eine Liste, die dynamisch wachsen kann).

Deine Variablen sind Behälter für Werte eines bestimmten Typs. Diese Behälter leben nicht im luftleeren Raum, sondern belegen Platz im Hauptspeicher. Da der Compiler den notwendigen Platzbedarf bei primitiven Typen kennt, kann die Größe des Behälters vom Compiler so gewählt werden, dass ein Wert darin abgelegt werden kann. D. h. eine Variable eines primitiven Typs spieichert unmittelbar den betreffenden Wert.

Bei komplexen Typen geht das nicht, weil Objekte erst während der Ausführung des Programms (sprich: zur Laufzeit) erzeugt werden. Die Größe einer Liste kennt man im Vorfeld eben nicht. Was der Compiler aber weiß ist, wie Groß der Adressraum ist. Er kann also z. B. 32-Bit für das Speichern einer Adresse zur Verfügung stellen und genau das passiert in einer 32-Bit-Umgebung auch: es werden nicht die Objekte selbst sondern nur deren Adressen in den Variablen gespeichert.

Der new-Operator sorgt letztlich dafür, dass ein Objekt zur Laufzeit erzeugt wird, d. h. Speicher für ein Objekt reserviert und dieses Objekt ordentlich initialisiert wird. Das Ergebnis ist dann eben die Adresse des erzeugten Objekts und diese wird dann in der Variablen gespeichert (was problemlos möglich ist, weil der Compiler den Behälter in passender Größe zur Verfügung gestellt hat).

Das ist im Wesentlich schon alles.

Daneben gibt es ein paar Feinheiten: ein String-Objekt kann als Literal angegeben werden, d. h. "X" ist ein String-Objekt, ohne dass man hierfür den new-Operator verwenden hätte müssen (dass das so ist, hat einen tieferen Sinn, den ich an der Stelle nicht näher beschreibe). Ebenso kann ein Array mit einem Objekt initialisiert werden, das ohne new-Operator auskommt. Auch die Werte von Aufzählungen sind Objekte, für die der Programmierer kein new benötigt. Das sind aber Details. Die Grundregel steht oben vor der Erklärung.
 

Ähnliche Java Themen


Oben