Keyword this

Fugover

Mitglied
Ich lerne gerade java und da kommt bei der Objektorientierung das keyword "this". Was bedeutet es und wofür ist es gut?
 

Fugover

Mitglied
[CODE lang="java" title="Code"]

public class Auto
{ private double preis;
private String modell;
private int baujahr;
private int kilometerstand;
private String farbe;
public Auto (double wert1,
String wert2,
int wert3,
int wert4,
String wert5)
{ this.preis = wert1;
this.modell = wert2;
this.baujahr = wert3;
this.kilometerstand = wert4;
this.farbe = wert5; } }


[/CODE]
 
Zuletzt bearbeitet:

Jw456

Top Contributor
[CODE lang="java" title="Code"]

public class Auto
{ private double preis; private String modell; private int baujahr; private int kilometerstand; private String farbe; /**Konstruktor benötigt folgende Werte: Preis, Modell, Baujahr, Kilometerstand und Farbe.*/
public Auto (double wert1, String wert2, int wert3, int wert4, String wert5)
{ this.preis = wert1; this.modell = wert2; this.baujahr = wert3; this.kilometerstand = wert4; this.farbe = wert5; } }
[/CODE]
In diesem Fall brauchst du das "this" nicht.
preis = wert1;
Würde hier reichen.

Würdest du auch in der Methode der übergabe Variablen auch dem Bezeichner "preis" geben. Musst du this benutzen um auf die Instanz Variablen zuzugreifen.
This zeigt in diesem Fall auf die Kasse.

Schaue dir den unterschied zwischen lokalen und Instanz Variablen an.
 

fhoffmann

Top Contributor
Ich komme etwas zu spät nach der vorletzetn Nachricht. Dennoch sei ergänzend zu dieser Nachricht noch erwähnt:

In diesem Fall ist this nicht nötig, weil die Parameter wie wert1 nicht spechend sind.
Aber in folgendem Fall ist this notwendig:
Java:
public class Auto {
  private double preis;
  public Auto(double preis) {
    this.preis = preis;
  }
}
preis benutzt den Übergabeparameter;
this.preis benutzt das Member der Klasse.

Würdest du nur schreiben:
Java:
public class Auto {
  private double preis;
  public Auto(double preis) {
    preis = preis;
  }
}
würdest du dem Übergabeparameter den Übergabeparameter zuweisen - das wäre sinnlos.
 

mihe7

Top Contributor
this ist immer eine Referenz auf ein Objekt. Wird eine (Instanz-)Methode eines Objekts aufgerufen, referenziert this gerade dieses Objekt. Analog dazu referenziert this in einem Konstruktor das Objekt, das gerade erzeugt wird.
 

Neumi5694

Top Contributor
ETwas unübersichtlich wird's, wenn du mit inneren Klassen (auch Lambda) arbeitest. In den meisten Fällen erkennt der Compiler, welches "this" gemeint ist, aber hin und wieder muss man dann noch zusätzlich die Klasse mit angeben.
 

Fugover

Mitglied
Kann es sein, dass das keyword "this" bei einem Namenskonflikt verwendet wird? Wenn man zwischen Attributen und Objektparameter einer Methode unterscheiden will?
 

Neumi5694

Top Contributor
Kann es sein, dass das keyword "this" bei einem Namenskonflikt verwendet wird? Wenn man zwischen Attributen und Objektparameter einer Methode unterscheiden will?
Dann auf jeden Fall.
Wenn du einen Variablennamen verwendest, versucht der Compiler immer zuerst eine lokale Variable zu verwenden. Wird keine gefunden, so verwendet er automatisch this. Gibt es sowohl lokale Variable und Instanzvariable und du willst auf die Instanzvariable zugreifen, dann musst du this manuell angeben.
 

mihe7

Top Contributor
Kann es sein, dass das keyword "this" bei einem Namenskonflikt verwendet wird? Wenn man zwischen Attributen und Objektparameter einer Methode unterscheiden will?
Auch, ja (NB: manche verwenden grundsätzlich this, wenn sie auf Instanzvariablen zugreifen), this wird aber genauso als Parameter oder Rückgabewert verwendet.
 
G

Gelöschtes Mitglied 65838

Gast
this ist ein parameter der automatisch bei jedem methoden aufruf dabei ist, den parameter kannst ud auch nicht weg machen

this ist eine referenz ( speicher adresse + klassen name ) auf das aktuelle objekt wo du gerade drin bist
 

KonradN

Super-Moderator
Mitarbeiter
this ist ein parameter der automatisch bei jedem methoden aufruf dabei ist, den parameter kannst ud auch nicht weg machen
Woher kommt so eine Vorstellung? Bei Methoden ist das evtl. eine Vorstellung, die von den Extension Methoden (die es in Java nicht gibt aber z.B. in Kotlin oder C#) getrieben wird, denn da gibt es dieses "this" ja als Parameter? Oder weil das bei konkreten Implementationen in der Art und Weise auftaucht? Ich kann jetzt nicht beurteilen, ob so eine Sichtweise / Vereinfachung hilfreich sein kann am Anfang, aber ich wäre da eher vorsichtig bei so Aussagen.

Ich würde bei so Definitionen immer in der JLS schauen (Hinweis für @Joreyk und andere Interessierte, das ist weniger für den TE @Fugover):
"this" ist kein Parameter sondern ein schlichtes Keyword in Java, welches für sich ein Ausdruck ("Expression" - hier speziell "Primary Expression") ist. Daher findet es sich in der JLS im Bereich 15: Expressions, speziell in 15.8 (Primary Expressions) und ganz genau in 17.8.3 (this) und 15.8.4 (Qualified this).

Die Sichtweise, dass this ein Parameter ist, ist dann schnell ungünstig, denn es ist nicht auf Methoden beschränkt sondern kann in allen nicht statischen Kontexten verwendet werden. Parameter hat man lediglich in den Instanzmethoden und dem Konstruktor aber nicht in dem Instance Initializer oder bei Instanzvariablen-Initialisierungen. In einer einfachen Vorstellung kann man sich das aber auch als eine Art Methode vorstellen, die intern gebaut wird und die dann ausgeführt wird, so dass es da dann doch wieder Parameter geben würde .... (Und wenn man sich die internen Abläufe anschaut, dann wird man das vermutlich ebenso auf dem Stack haben wie z.B. auch die Parameter.)
 

X5-599

Top Contributor
Nicht unbedingt. Das hier ist durchaus erlaubt:

Code:
public class Test
{
  public void go(Test this)
  {
    System.out.println("no params");
  }

  public static void main(String[] args)
  {
    new Test().go();
  }
}
 
G

Gelöschtes Mitglied 65838

Gast
ohh dann hab ich mich vllt doch nicht geirrt

kannst du vllt irgendwo noch was dazu finden ? wie JLS oder ne website wo das ding erklärt ist ? ich finds nicht wirklich
 

X5-599

Top Contributor
Leider nein. Hab das auch nur mal irgendwo irgendwann gesehen und mir gedacht: "Das funktioniert doch nie..." Aber es geht doch und wahrscheinlich ist es mir deshalb in Erinnerung geblieben.
 
G

Gelöschtes Mitglied 65838

Gast
vllt findet @KonradN da was , muss ja irgendwo stehen

ich bin einfach nicht gut in der JLS sachen zu finden :D
 

X5-599

Top Contributor
Ich hab grad mal etwas rumprobiert. Der erzeugte Bytecode ist 1:1 identisch (Mit und ohne "Test this"). Also fast so als wenn der Compiler es einfach ignoriert. Die Methode ist immer im Bytecode parameterlos.

Das einzige wo der Compiler es nicht ignoriert ist sobald andere Parameter hinzu kommen. Da MUSS dann (wie üblich) mittels Komma "," getrennt werden.
public void go(Test this, int i)
 

KonradN

Super-Moderator
Mitarbeiter
Das ist einfach der optionale "receiver parameter". Findet sich in der JLS 8.4.1
The receiver parameter is an optional syntactic device for an instance method or an inner class's constructor. For an instance method, the receiver parameter represents the object for which the method is invoked. For an inner class's constructor, the receiver parameter represents the immediately enclosing instance of the newly constructed object. In both cases, the receiver parameter exists solely to allow the type of the represented object to be denoted in source code, so that the type may be annotated (§9.7.4). The receiver parameter is not a formal parameter; more precisely, it is not a declaration of any kind of variable (§4.12.3), it is never bound to any value passed as an argument in a method invocation expression or class instance creation expression, and it has no effect whatsoever at run time.

A receiver parameter may appear either in the MethodDeclarator of an instance method or in the ConstructorDeclarator of a constructor of an inner class where the inner class is not declared in a static context (§8.1.3). If a receiver parameter appears in any other kind of method or constructor, then a compile-time error occurs.

Der verändert prinzipiell erst einmal nichts, aber ermöglicht da z.B. Annotations (um mal überhaupt etwas zu finden, wo das ggf. Sinn ergeben könnte.)

Hier nur bei der Argumentation aufpassen:
Hier im Thread ging es generell um "this". Und this ist ein reserved Keyword (JLS 3.9) welches an vielen Stellen (In Instanzmethoden aber auch in Konstruktoren, Instanz-Initialisierungen und in Instanzvariable-Initialisierungen) verwendet werden kann.

Bei Instanzmethoden kann es - als receiver parameter - mit angegeben werden. Das ist eine spezielle Nutzung explizit bei Instanzmethoden. Damit ist dies - zumindest aus meiner Sicht - für das generelle Verständnis eher nicht zu verwenden. Hinzu kommt, dass diese Komplexität eher verwirrend ist für Anfänger. Man muss sich nur anschauen, was bei inneren Klassen da angegeben werden kann ... Beispiele finden sich in der JLS im benannten Kapitel 8.4.1
 
G

Gelöschtes Mitglied 65838

Gast
ich verstehs nicht...

wenn ich this als parameter übergeb dann ruf ich ja mit this.xyz() von dem übergeben objekt ( halt das Test this) die xyz() methode auf

ich überreiss es nicht
 

KonradN

Super-Moderator
Mitarbeiter
Das einzige wo der Compiler es nicht ignoriert ist sobald andere Parameter hinzu kommen. Da MUSS dann (wie üblich) mittels Komma "," getrennt werden.
public void go(Test this, int i)
Der Compiler ignoriert es nie. Es ist halt der Receiver Parameter. Und der wird so wie jeder Parameter mit angegeben (als erster Parameter!). Dein Beispiel ließe sich also anpassen, indem man der Method enoch einen zweiten Parameter verpasst und dann beim Aufruf nur einen angibt (Wenn man das so sehen will):
Java:
public class Test
{
  public void go(Test this, String msg)
  {
    System.out.println(msg);
  }

  public static void main(String[] args)
  {
    new Test().go("Hallo!");
  }
}

Ansonsten noch zur Einordnung: Das müsste mit Java 8 gekommen sein.
 

KonradN

Super-Moderator
Mitarbeiter
ich verstehs nicht...
Ich würde da einfach einmal empfehlen: Vergiss es einfach. Mir ist bisher nie eine Situation unter gekommen, bei der dies benötigt würde oder ich dies als sinnvoll erachten würde.

Die logische Erläuterung ist mehr oder weniger das, was ich schon angedeutet habe:
Und wenn man sich die internen Abläufe anschaut, dann wird man das vermutlich ebenso au f dem Stack haben wie z.B. auch die Parameter.

Ich habe mir hier aber NIE die Implementationsdetails angesehen. Aber es ist nur logisch: Die Methode ist ja nun einmal einfach nur ein Stück Code. Lokale variablen liegen auf dem Stack und werden über den Stack Pointer angesprochen (halt mit dem Versatz). Wenn da jetzt ein "this" auftaucht, das direkt (oder indirekt) verwendet werden soll, dann muss das ja auch da sein. Und da bietet sich diese Methodik natürlich an.

Das führt dann dazu, dass manche Sprachen das so auch als Extension Method anbieten, c# z.B.:
C#:
public static int WordCount(this string str)
{
    // str kann hier sogar null sein! Das wäre ok!
    // ...
}

(Kotlin macht es anders - falls ich zuvor Kotlin als Beispiel genannt habe, dann ist/war das falsch. Kotlin nutzt da eine Syntax, die nicht this angibt sondern man gibt die Klasse, die erweitert wird, mit an.)
 

Fugover

Mitglied
Habe eine zeitlang mit kindle so ein eBook über java gelesen. Jetzt bin ich wieder an einer Stelle angelangt, wo ich nichts mehr verstanden habe und habe mich entschieden nicht mehr weiter zu lesen und stattdessen Java Gailer Tutorial Interaktiv zu lesen. Irgendwie komme ich nicht mehr so richtig weiter mit dem Programmieren. In diesem eBook waren die Übungen so schwer, so dass ich sie gar nicht gemacht habe. Weiß nicht, wo ich Übungen finde, die ganz leicht gehen.
 

Neumi5694

Top Contributor
Anstatt hinzuschmeißen wäre vielleicht mal besser zu beleuchten, wo du eigentlich hängst.
Eigentlich sollten alle für Anfänger gedachten Übungen auch einfach sein. Es liegt wohl an einem allgemeinen Verständnisproblem. Manchmal braucht's den gewissen Kniff, damit der Knoten aufgeht.
 

Fugover

Mitglied
Ich schaffe es nicht, Übungen zu lösen, ohne im Internet die Befehle zu recherchieren. Ich frage mich, ob man die Syntax auswendig lernen muss. Leichtere Programme verstehe ich, aber wenn es kompliziert wird, dann verstehe ich es nicht. Für mich ist es vor allem schwer, Objektorientierung zu verstehen. Ist es eigentlich O.K., wenn man für Übungen im Internet nachsieht?
 

mihe7

Top Contributor
Ich schaffe es nicht, Übungen zu lösen, ohne im Internet die Befehle zu recherchieren. Ich frage mich, ob man die Syntax auswendig lernen muss.
Hier muss man strikt unterscheiden: die Sprache und ihre Syntax musst Du auswendig lernen. Das ist bis zu einem gewissen Grad kein größeres Problem, da die Sprache bis excl. Java 5 sehr einfach war. Die Grundlagen haben sich diesbezüglich kaum geändert.

Etwas anderes ist die Verwendung von vordefinierten Klassen, Schnittstellen und Methoden (die Java Standard-Klassenbibliothek). Die musst Du nachschauen und je häufiger Du bestimmte Klassen und Methoden verwendest, desto "auswendiger" geht es von der Hand.

Das Ganze ist aber schön strukturiert, so dass man relativ schnell weiß, wo man etwas findet.

Bevor Du Dich auf die OO-Programmierung stürzt, solltest Du vielleicht erst die Grundlagen der imperativen Programmierung lernen, d. h. insbesondere Kontrollstrukturen, Schleifen und Methoden ("Funktionen").

Und: Programmieren lernen dauert. Nicht zu viel auf einmal wollen, sonst gibts Frustration - zusätzlich zu der, die Du ab und zu sowieso bekommen wirst :) Da heißt es dann dranbleiben; irgendwann machts "aaaah".

Was die Übungen betrifft, kann man schlecht was sagen, wir kennen sie ja nicht. Ein "Hello World!" solltest Du nach ein paar Tagen aus dem Kopf schreiben können.
 

Staarfightaar

Bekanntes Mitglied
du tippst ein hello world... und dann ein hello world mit ner schleife... und dann ein hello world mit ner shcleife in einer methode... und so weiter...
 

temi

Top Contributor
Was sollte man als Quelle verwenden, um es auswendig zu lernen?
Mach dir mal keinen Kopf. Übe einfach weiter. Mit der Zeit merkt man sich alles was wichtig ist. Anfangs muss man auch einfache Dinge öfter mal nachschlagen, aber das wird mit der Zeit immer weniger.

Aber vielleicht sollte mal jemand Java in Form von Reimen verfassen, damit man dass schön auswendig lernen kann :D
 

Fugover

Mitglied
Ich habe eine Frage: Soll man für Eingaben Buffered Reader verwenden oder lieber die Klasse Scan? Scan verstehe ich und es ist auch einfach. Buffered Reader scheint sehr kompliziert zu sein. Ich frage deshalb, weil ich ein Buch gelesen habe, in dem nur Buffered Reader verwendet wurde.
 

KonradN

Super-Moderator
Mitarbeiter
Erst einmal der allgemeine Hinweis: Neues Thema -> Neuer Thread. Also wenn möglich bei neuen Themen / Fragen einen neuen Thread starten.

Was die Frage angeht: Viele Wege führen zum Ziel und es hängt immer von den Anforderungen ab. Scanner ist z.B. gut, wenn man etwas einlesen will, dass Token (Wörtern) entspricht und du hier direkt diese Token im gewünschten Format haben willst (Also z.B. eine Zahl soll direkt als Zahl vorliegen).
 

Fugover

Mitglied
Ich habe so ein Programm geschrieben und ich weiß nicht, ob ich es mal hier posten sollte oder nicht. Ihr könntet mir dann sagen, ob ihr es gut findet. Was meint ihr dazu?
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe so ein Programm geschrieben und ich weiß nicht, ob ich es mal hier posten sollte oder nicht. Ihr könntet mir dann sagen, ob ihr es gut findet. Was meint ihr dazu?
Ja, wenn du das möchtest, dann mach einfach einen neuen Thread auf. Also bitte nicht hier als Antwort einhängen sondern ein neues Thema starten.
 

Ähnliche Java Themen

Neue Themen


Oben