Class scope und Instance scope und Getter nur selbstgeschrieben Methoden

Say

Aktives Mitglied
Class scope: die Variable ist unveränderlich und besitzt den gleichen Wert
Instance scope: die Variable ist veränderlich bei jeder Instanz?

Warum kann equals direkt auf radius (Zeile 8) zugreifen ohne einen Getter? Braucht es den Getter nur dann, wenn man eine Methode selbstgeschrieben hat und bei Java Methoden nicht?

Java:
class Disk
{
private int radius;
public Disque(int oneRadius) {
radius = oneRadius;
}
boolean equals(Disk o) {
return radius == o.radius;
}
}
class equals
{
public static void main(String[] args) {
Disk d1 = new Disk(3);
Disk d2 = new Disk(1+2);
System.out.println(d1.equals(d2));
System.out.println(d1.equals("A disk with radius 3"));
}
}
 
Also "brauchen" tut man Getter und Setter nicht. das Prinzip der Kapselung in der objektorientierten Programmierung verlangt diese aber. Mit der entsprechenden Sichtbarkeit könntest du von überall direkt auf die Variablen zugreifen. Nur ist das meistens keine gute Idee. Innerhalb einer Klasse ist es ganz üblich nicht unbedingt über die Getter und Setter zu arbeiten. Falls aber von außen jemand auf die Variable zugreift, dann soll evtl. verhindert werden das radius einen negativen Wert bekommt. Mit einem Setter der das überprüft und verhindert ist das ganz leicht durchzusetzen. Mit Gettern ist das ganz ähnlich. Stell dir vor deine Variable ist ein Array. Jetzt kann jeder von außen das Array verändern, also den internen Zustand deiner Instanz. Erzeugst du aber im Getter eine Kopie von dem Array und gibst diese zurück, dann kann man außerhalb der Klasse mit der Kopie tun was man will. Der interne Zustand der Instanz wird nicht verändert.
Es gibt immer wieder Diskussionen um Getter und Setter, in manchen Programmiersprachen werden diese ganz weggelassen oder man generiert sie automatisch usw.. Man hat sich aber, vereinfacht gesagt, auf das Prinzip der Kapselung geeinigt und wendet es deshalb an.
 
Also "brauchen" tut man Getter und Setter nicht. das Prinzip der Kapselung in der objektorientierten Programmierung verlangt diese aber. Mit der entsprechenden Sichtbarkeit könntest du von überall direkt auf die Variablen zugreifen. Nur ist das meistens keine gute Idee. Innerhalb einer Klasse ist es ganz üblich nicht unbedingt über die Getter und Setter zu arbeiten. Falls aber von außen jemand auf die Variable zugreift, dann soll evtl. verhindert werden das radius einen negativen Wert bekommt. Mit einem Setter der das überprüft und verhindert ist das ganz leicht durchzusetzen. Mit Gettern ist das ganz ähnlich. Stell dir vor deine Variable ist ein Array. Jetzt kann jeder von außen das Array verändern, also den internen Zustand deiner Instanz. Erzeugst du aber im Getter eine Kopie von dem Array und gibst diese zurück, dann kann man außerhalb der Klasse mit der Kopie tun was man will. Der interne Zustand der Instanz wird nicht verändert.
Es gibt immer wieder Diskussionen um Getter und Setter, in manchen Programmiersprachen werden diese ganz weggelassen oder man generiert sie automatisch usw.. Man hat sich aber, vereinfacht gesagt, auf das Prinzip der Kapselung geeinigt und wendet es deshalb an.
Vielen Dank für deine Nachricht. Warum kann in der Methode equals auf die Variable radius zugegriffen werden?
 
Weil equals() eine _Instanz_methode ist und wenn die Methode ausgeführt wird, wird sie ja im this-Kontext einer Instanz von Disk ausgeführt und sie ist in dieser Klasse deklariert, also kann sie auch auf das private Feld "radius" der this-Instanz (und jeder anderen Disk-Instanz) zugreifen.
 
Weil equals() eine _Instanz_methode ist und wenn die Methode ausgeführt wird, wird sie ja im this-Kontext einer Instanz von Disk ausgeführt und sie ist in dieser Klasse deklariert, also kann sie auch auf das private Feld "radius" der this-Instanz (und jeder anderen Disk-Instanz) zugreifen.
Hmm, wie weisst du das es sich um eine Instanz-Methode handelt. Sind alle Methoden Instanzen?
 
Instanzmethode, ist es dann, wenn ein Objekt die Methode aufruft?
Eine Instanzmethode wird auf einem Objekt aufgerufen. Das Objekt ist dann die this Referenz innerhalb der Ausführung der Methode.
Deine equals(Disk) Methode von oben hätte man auch so (äquivalent) schreiben können:
Java:
boolean equals(Disk o) {
  return this.radius == o.radius;
}
 
Eine Instanzmethode wird auf einem Objekt aufgerufen. Das Objekt ist dann die this Referenz innerhalb der Ausführung der Methode.
Deine equals(Disk) Methode von oben hätte man auch so (äquivalent) schreiben können:
Java:
boolean equals(Disk o) {
  return this.radius == o.radius;
}
Eine Instanzmethode wird auf einem Objekt aufgerufen. Das Objekt ist dann die this Referenz innerhalb der Ausführung der Methode.
Deine equals(Disk) Methode von oben hätte man auch so (äquivalent) schreiben können:
Java:
boolean equals(Disk o) {
  return this.radius == o.radius;
}
Danke für die Erklärung!
 
Entscheidend ist hier, dass die Methode zur Klasse gehört, richtig eingerückt sieht man das auch:
Java:
class Disk {
    private int radius;
 
    public Disque(int oneRadius) {
        radius = oneRadius;
    }
 
    boolean equals(Disk o) {
        return radius == o.radius;
    }
}
Die Methoden der Klasse müssen ja auf ihre eigenen Daten zugreifen können, sonst wird das irgendwann sinnlos. Der Zugriffsmodifizierer bezieht sich auf den Zugriff von außerhalb der Klasse oder des Packages

Wobei ich grad sehe, dass der Klassenname nicht zum Namen des Konstruktors passt. Lustig. Ist das aus einem französischem Buch ins Deutsche übersetzt?
 
Zuletzt bearbeitet:
Java:
class Foo {

    static int classVariable = 1; // Klassenvariable
    int instanceVariable = 2; // Instanzvariable
 
    // Klassenmethode
    static int getClassVariable() {
        return classVariable;
    }
 
    // Instanzmethode
    int getInstanceVariable() {
        return instanceVariable;
    }
}

Aufrufe:

Foo.getClassVariable();

Foo foo = new Foo();
foo.getInstanceVariable();

Die Klassenmethode kann NICHT auf die Instanzvariable zugreifen, weil dazu erst eine Instanz existieren muss. Du erhältst dann einen Fehlermeldung "can not access from a static context" oder so ähnlich.

Wichtig. Egal wieviele Instanzen du auch erstellst, der Wert von "classVariable" ist über alle Instanzen identisch, es gibt ihn nur einmal für die Klasse. Jede Instanz hat allerdings einen Wert "instanceVariable" für sich. Würde es im Beispiel einen Setter geben, könnten diese unabhängig voneinander gesetzt werden.

Ein typisches Beispiel ist ein Zähler, wieviele Instanzen einer Klasse erzeugt wurden:
Java:
class CountsItself {
    
    private static int count = 0;
    
    public CountsItself() {
        count++;
    }
    
    public static getCounter() {
        return count;
    }
}
 
Zuletzt bearbeitet:
Entscheidend ist hier, dass die Methode zur Klasse gehört, richtig eingerückt sieht man das auch:
Java:
class Disk {
    private int radius;
 
    public Disque(int oneRadius) {
        radius = oneRadius;
    }
 
    boolean equals(Disk o) {
        return radius == o.radius;
    }
}
Die Methoden der Klasse müssen ja auf ihre eigenen Daten zugreifen können, sonst wird das irgendwann sinnlos. Der Zugriffsmodifizierer bezieht sich auf den Zugriff von außerhalb der Klasse oder des Packages

Wobei ich grad sehe, dass der Klassenname nicht zum Namen des Konstruktors passt. Lustig. Ist das aus einem französischem Buch ins Deutsche übersetzt?
Danke dir für die Antwort!
 

Zurück
Oben