Wie funktionieren Getters & Setters & this in java?

Nyndns - (Computer, PC, programmieren)

5 Antworten

Also das Keyword "this" ist einfach nur dazu dar, dass das was nach this. kommt auch in der Klasse gesucht wird, in der der Befehl aufgerufen wird.
In DIESER Klasse wird der Variable x ein neuer Wert zugewiesen.

Getter und Setter sind Konventionen/Schreibweisen die man benutzt, um zwischen Funktionen zu unterscheiden, die Variablen-Werte entweder einfach nur ausgeben (ich BEKOMME einen Wert (get)) oder einfach nur einen Wert zuweisen (ich SETZE einen Wert (set)).

Du könntest auch statt set und get was anderes hinschreiben. Entscheidend ist nur der Befehl "return" und ob die Funktion vom Typ void oder einem bestimmten ist (int, String, ...).

Falls du nicht weißt, warum this benutzt wird, wenn man doch auch einfach ohne es auskommt, dann lass dir gesagt sein, dass es in größeren Programmen so viele Variablen gibt, in verschiedenen Klassen, die du ansprechen musst, dass es essentiell ist, es zu verwenden, damit es nicht zu Exceptions kommt.

Programmiere einfach weiterhin so wie du das irgendwo lernst, oder siehst mit "this" und igendwann kommst du hinter diese Art des Denkens. Vor allem wenn du viel mit Objekten machst (OOP).

regex9  22.11.2017, 00:16

(...) dann lass dir gesagt sein, dass es in größeren Programmen so viele Variablen gibt, in verschiedenen Klassen, die du ansprechen musst, dass es essentiell ist, es zu verwenden (...)

Nein, essentiell ist es nicht, denn es ist abhängig von den Code Konventions, die man sich setzt. Die einen mögen es so, mit this, die anderen halten es für redundant und binden die Information, ob es sich um eine Instanzvariable handelt oder nicht, an den Bezeichner, bspw. mit einem führenden Unterstrich für nichtsichtbare Felder/Attribute.

0

this

Das Keyword "this" ist eine Referenz auf das aktuelle Objekt im Kontext. Das heißt wenn du so eine Klasse hast:

class Person {
    private String name;
    void setName(String name) {
        this.name = name;
    }
}

Und so mit einem Objekt der Klasse arbeitest:

Person foo = new Person();
foo.setName("foo");

Dann wird die Methode setName() ausgeführt. Dabei ist "this" einfach eine Referenz auf das Objekt "foo" (und nicht auf die Klasse Person, wie es Andere hier behaupten).

Das ganze muss man machen, da die Variable "name" im Kontext der Methode doppelt definiert ist. Dabei wird immer die innerhalb der Methode definierte Variable bei einem Aufruf bevorzugt. D.h. um auf die Objektvariable "name" zuzugreifen muss man das über "this" tun.

Getter und Setter

Getter und Setter sind einfach eine schönere Variante um mit Objektvariablen zu arbeiten, da sie jeder kennt, weiß auch jeder, was sie meinen. Außerdem kann man durch die Verwendung von Methoden auch etwas bei einem Aufruf etwas ausführen.

public int getX() {
    return x;
}

Also mit dieser Methode kann man einfach den Wert der Variable x aufrufen. So kann man zum Beispiel das hier schreiben:

System.out.println(objekt.getX());

"int" im Methodenkopf steht einfach für den Rückgabewert der Methode, also erhält man nach dem Ausführen der Methode einen "int" Wert zurück mit dem man weiterarbeiten kann. "return x;" beendet die Methode und gibt dabei den danach angegebenen Wert zurück.

public void setX(int x) {
    this.x = x;
}

"void" ist der Rückgabetyp nichts bzw. kein Rückgabetyp, was Sinn macht, das man einen Wert setzten und nicht erhalten will. "this.x = x;" setzt einfach die Objektvariable "x" zu der als Parameter übergebenen Variable "x". Warum man hier "this.x" verwendet habe ich schon oben erklärt.

Ich hoffe mal, dass dich die vielen Fachbegriffe nicht verwirren. Falls doch, kann ich sie noch erklären.

Getter geben einen bestimmten Wert zurück. Setter setzen eine bestimmte Eigenschaft auf einen neuen Wert. this bezieht sich auf die aktuelle Instanz bzw. das aktuelle Objekt. D.h. du kannst über this auf alle Eigenschaften des Objekts zugreifen.

Nach dem Zugriffsmodifikator (public, private) folgt der Datentyp der Rückgabe. int steht dabei für Ganzzahlen, denn der Getter liefert x zurück, welches eine Ganzzahl ist. void bedeutet, die Methode gibt nichts zurück, denn ein Setter setzt lediglich einen Wert, aber liefert keinen zurück.

Das this innerhalb des Setters ist erforderlich, da der Parameter bereits x genannt wurde. Um somit die Eigenschaft x des Objekts anzusprechen, muss this verwendet werden.

"this" ist ein impliziter Parameter, das der Compiler (Übersetzer in Maschinensprache oder Zwischensprache) in der Parameterliste ergänzt, wenn es sich um eine Methode handelt, die als "Instanzmember" erscheinen soll.

Aus Sicht des Compilers ist jede Methode eine Klassenmethode, allerdings erwarten einige von ihnen einen Parameter vom Typ der Klasse, und zwar diejenige Instanz, mit der die Methode aufgerufen werden soll.

Zum besseren Verständnis ein Beispiel:

class A {
private int x;
public void method() {
this.x = 4;
}
}

class B{

public void tuWas() {
private A a = new A();
a.method();
}
}

ist gleichbedeutend zu

class A {
private int x;
public static void method(A thisInstance) {
thisInstance.x = 4;
}
}

class B{

public void tuWas() {
private A a = new A();
A.method(a);
}
}

-----

zu Gettern und Settern siehe http://openbook.rheinwerk-verlag.de/javainsel/javainsel_05_002.html#dodtpce543411-d512-43fb-9f6f-dcead5cfb3c7

Die bequeme Schreibweise von "Properties" ("Eigenschaften") einer Klasse scheint es in Java nicht zu geben; in anderen Sprachen (C#) kann man auf eine Eigenschaft wie auf ein Feld zugreifen, und der Compiler macht daraus einen Getter und/oder einen Setter.

  private int thisPropertyValue;
  public int thisProperty {
get {
return thisPropertyValue;
}
set { // verwendet implizit definierte Variable value vom Typ der Eigenschaft, hier int
// hier Gültigkeitsprüfungen für value und ggf. Ausnahmen
thisPropertyValue = value;
}
}

Der Compiler macht hieraus implizit

  private int thisPropertyValue;
public int get_thisProperty() {
return thisPropertyValue;
}
void set_thisProperty(int value) {
// hier Gültigkeitsprüfungen für value und ggf. Ausnahmen
thisPropertyValue = value;
}

wie man u. a. daran merkt, dass man keine Methoden mit den Signaturen get_thisProperty() und set_thisProperty(int) mehr deklarieren kann.

Bei Java muss der Programmierer diese Prozeduren anscheinend noch von Hand erzeugen.

Hieran erkennt man auch, warum der Setter keinen Rückgabewert hat: er übernimmt ja den Sollwert, und alles, was er macht, hat ja keine Auswirkungen nach außen (abgesehen von Ausnahmen bei ungültigen Werten, aber das sind ja auch keine Rückgabewerte).

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Hey,

„This“ steht normalerweise für den aktuellen Klassennamen, wenn du dich zB innerhalb der Klasse class1 befindest, wäre class1.x = this.x
Get/Set sind praktisch zum Einstellen der Zugriffsrechte auf eine Methode zuständig. Wenn nur Get gesetzt ist, kann die Methode lediglich einen Rückgabewert ausgeben ohne das ein dynamischer Wert mit „Set“ eingelesen wird. Set mach genau das Gegenteil, dadurch werden also nur Werte in die Methode eingelesen, es gibt also keinen Rückgabewert, daher auch das „void“ (bedeutet ja nichts anderes als „kein Rückgabewert“)

Hoffe das ist so grob zusammengefasst verständlich ;)

FireEraser  22.11.2017, 00:06

NEIN! "this" ist eine Referenz auf das aktuelle Objekt im Kontext, nicht auf die Klasse. Über die Klasse hat man lediglich Zugriff auf statische Variablen und Methoden.

0
Tringlp  22.11.2017, 00:13

Danke fürs erneute korrigieren, da habe ich mich offensichtlich vertan, ist ja schon etwas später...

0