Abstraktion, Assoziation, interface?

this sollte man immer dann verwenden, wenn man mit sog. Inner Classes arbeitet. Dabei wird eine Klasse innerhalb einer Klasse implementiert.

Bsp:

Java:
public class A
{
  int foo;
  public class B
  {
     int foo;

     public B()
     {
        foo = 0; // Welches foo ist denn jetzt gemeint, das von B oder doch das von A?
     }
  }
}
 
Ich hab hier ein Bsp zum generieren eine 7Segment-Anzeige.

Java:
	public LED_Anzeige(int stellen) {
		super(); // ruft den konstrukter der Oberklasse auf
		anz_stellen=stellen;
		anzeige = new Led_7Segment[stellen];
		this.setLayout(new FlowLayout());
		for(int i=stellen-1; i>=0; i--) {
			anzeige[i] = new Led_7Segment(0,2); // initial-Wert: 0 --> Größe: 2
			this.add(anzeige[i]);
		}

Was meint den jetzt diese 2 this?

Ich meine das add und setLayout kenn ich nur von z.B.:

Java:
JPanel panel = new JPanel();

panel.add(anzeige[i])
panel.setLayout(new FlowLayout());

Ich könnte da ein neuen Panel auch anlegen oder und das so machen?

Aber was macht dieses this in diesem Fall?

Zu deinem Bsp:

Wenn ich jetzt this.foo=1 im Konstruktor B mache, welcher wird dann verändert? Und was ist wenn ich this.foo=2 in der Klasse B mache?
 
Zuletzt bearbeitet:
Was meint den jetzt diese 2 this?

Ich meine das add und setLayout kenn ich nur von z.B.:

Aber was macht dieses this in diesem Fall?

Die Klasse (nennen wir sie mal "Fenster"), die diese Methode LED_Anzeige() implementiert, hat entweder auch die Methoden add() und setLayout() implementiert oder aber sie erbt die Methoden von seiner Elternklasse (z.B. JFrame). Auf jeden Fall müssen die beiden Methoden innerhalb der Klasse "Fenster" auf die eine oder andere Art vorhanden sein. Denn this zeigt immer auf das eigene Objekt (sich selbst).

Wenn ich jetzt this.foo=1 im Konstruktor B mache, welcher wird dann verändert? Und was ist wenn ich this.foo=2 in der Klasse B mache?

In beiden Fällen wird die Eigenschaft "foo" der Klasse B geändert.
 
Ok, danke das mit foo verstehe ich jetzt.

Ich seh grad das die klasse LED_Anzeige wirklich von JPanel ableitet, was ja heißt das LED_Anzeige setLayout und add von JPanel vererbt hat:

Java:
public class LED_Anzeige extends JPanel{
	private Led_7Segment anzeige[];
	private int anz_stellen;
	
	public LED_Anzeige(int stellen) {
		super(); // ruft den konstrukter der Oberklasse auf
		anz_stellen=stellen;
		anzeige = new Led_7Segment[stellen];
		this.setLayout(new FlowLayout());
		for(int i=stellen-1; i>=0; i--) {
			anzeige[i] = new Led_7Segment(8,2); // initial-Wert: 0 --> Größe: 2
			this.add(anzeige[i]);
		}	
	}
	
	public void setValue(long value) {
		for(int i=0; i<anz_stellen; i++){
			short rest = (short)(value % 10);
			value = (long)(value / 10);
			anzeige[i].setValue(rest);
		}
	}
}

Das eigene Objekt wäre jetzt ein Objekt von LED_Anzeige? Wird das jetzt hier bei "this" instanziert? Und in einer anderen java-datei rufe ich den Konstruktor der klasse LED_Anzeige auf:
Java:
LED_Anzeige anzeige = new LED_Anzeige(5);

"Methoden müssen auf eine anderen Art vorhanden sein" <--- Was ist damit gemeint?

Erklär mit bitte dieses this mit Hilfe das Programmcodes(oben), ich glaube ich brauch einen Code nebenbei und eine Erklärung und dann kann ich nachvollziehen wie das alles funktioniert. Bitte :).

Andere Frage:

ohne this.setLayout(new FlowLayout()); funktioniert das Programm auch, kannst du dir vorstellen warum?

Wie würde das ohne den ganzen this aussehn bzw. wie würde der Code aussehn ohne this und das Programm funktioniert, also am Ende hat man die 7Segment-Anzeigen.

Gruß
 
ohne this.setLayout(new FlowLayout()); funktioniert das Programm auch, kannst du dir vorstellen warum?
Die ganzen Layouts haben nur eine Auswirkung darauf,
wo am Panel und wie groß Buttons/Textfelder etc. sind, wenn man sie einfach so add´et.
Wenn sonst nichts mit dem Flowlayout passiert (außer dieser Zeile)
wird das Programm auch weiterhin problemlos funktionieren,
nur die Sachen am Fenster könnten durcheinander sein.
Buttons unter einem Textfeld statt daneben usw.

Wie würde das ohne den ganzen this aussehn bzw. wie würde der Code aussehn ohne this und das Programm funktioniert, also am Ende hat man die 7Segment-Anzeigen.
...
this tut nichts sichtbares, das hat keine Auswirkung auf die Programmausführung.

Ich versuch mal selbst eine Erklärung, ohne auf die ganzen verstreuten Beispiele und Hinweise
einzugehen (@Saftmeister&Co: Das soll nicht heißen, dass eure Erklärungen schlecht wären).


Beispielfall:
Eine Klasse Person
Java:
class Person
{
    public String name;

    public void printName() {
        System.out.println(name);
    }

    public void tuIrgendwas() {
    }
}
(Die public-Variable name statt getName/setName ist nur zur Beispielverkürzung).
Irgendwo anders (zB.im main) wird ein Objekt von Person gemacht:
Java:
Person p;
p = new Person();
p.name = "sheel";
Wenn es jetzt irgendeine Methode in irgendeiner Klasse gibt,
der man eine Person übergeben muss
Java:
class AndereKlasse {
    public void tuWasMitPerson(Peron x) {
        x.printName();
    }
}
könnte man im main sowas anlegen und dann die Person daran übergeben:
Java:
Person p;
p = new Person();
p.name = "sheel";

AndereKlasse anderes = new AndereKlasse();
anderes.tuWasMitPerson(p);
Alles kein Problem.

Aber was, wenn eine Person sich selbst irgendwohin übergeben will?
zB. die Person p vom main, wenn Person sowas wäre (tuIrgendwas ist anders)
Java:
class Person
{
    public String name;

    public void printName() {
        System.out.println(name);
    }

    public void tuIrgendwas() {
        AndereKlasse a = new AndereKlasse();
        a.tuWasMitPerson(?);
    }
}
Was übergibt man beim Fragezeichen?
Die Person hat keine Ahnung, wie "ihre" Variable im main draußen heißt (p in dem Fall).
Die Person weiß auch überhaupt nicht, ob ihre Variable im main oder sonst irgendwo ist.
->Sie kommt an ihre Variable einfach nicht dran.

Natürlich kann man einzelne Variablen übergeben, zB. name, indem man einfach name hinschreibt. Aber das komplette Personenobjekt?

Dafür gibt es jetzt this. Das ist eben das komplette Objekt,
ohne dass man den Namen/Ort der Variablen draußen kennen muss.

Java:
class Person
{
    public String name;

    public void printName() {
        System.out.println(name);
    }

    public void tuIrgendwas() {
        AndereKlasse a = new AndereKlasse();
        a.tuWasMitPerson(this);
    }
}
this ist innerhalb der Klasse komplett gleich zu verwenden wie p draußen im main.
zB. könnte man im main ein
Java:
System.out.println(p.name);
machen, das kann dann innerhalb der Klasse so ausschauen:
Java:
System.out.println(this.name);
Wenn man einfach nur schreibt:
Java:
System.out.println(name);
ist das in dem Fall das Selbe wie mit this.name (wann es nicht das Selbe ist siehe unten).

Also, das wäre Anwendungsfall 1: Sich als Komplettobjekt selbst verwenden,
ohne die echte Variable außen zu kennen.


Anwendungsfall 2:
Wenn die Person jetzt ein setName hat (hetName von mir aus auch, ist unwichtig)
(und tuIrgendwas ist jetzt auch unwichtig, weg damit)
Java:
class Person
{
    public String name;

    public void setName(String neuerName) {
       name = neuerName;
    }

    public void printName() {
        System.out.println(name);
    }
}
Kein Problem.
Man könnte auch schreiben
Java:
this.name = neuerName;
wäre auch kein Problem. Vorerst aber mal ohne this.

Würde man den Parameter von setName auch name nennen
Java:
public void setName(String name) {
    name = name;
}
gibts ein Problem.
In Java ist es so, das bei der {}-Klammerung alles weiter innen
wichtiger ist als die äußeren Sachen. Betreffend setName
hat das String name direkt bei der Methode also Vorrang
zum String name der ganzen Klasse.
Jedes name bei setName meint also die selbe Variable, den Parameter.

name=name ist damit ziemlich sinnlos und das Klassen-name bekommt den Wert nicht.
Jetzt kann man mit this sagen, dass man das Klassen-name meint.
Java:
public void setName(String name) {
    this.name = name;
}
That´s all, mehr ist da nicht dahinter.

Diese Variablenüberschneidungen können, wie von den Vorpostern schon gesagt,
auch bei ineinander verschachtelten Klassen vorkommen, statt Methode-in-Klasse.


Etwas noch, wieder bezogen auf das Person p im main:
Man könnte ja die angelegte Person wegschmeißen/überschreiben mit einer neuen Person:
Java:
Person p;
p = new Person();
p.name = "sheel";

p = new Person();
p.name = "saftmeister";
Das geht mit this innerhalb der Klasse nicht, die kann sich nciht selbst wegschmeißen.
Also kein
Java:
this = new Person();
in Person und dann denken, p in main hat das auch übernommen.

So.
 
Mh danke, klingt logisch^^.

Schau mal bitte in Zeile 12 bei meinem letzten geposteten Code, da steht ja: "this.add(anzeige[i]);".

In diesem Fall handelt es sich, wegen "this" um die Klasse "LED_Anzeige", die in einem anderen File instanziert wurde(ein Objekt davon wurde erschaffen) und wie verwenden jetzt "this", weil dies Klasse dias Objekt vom anderen File nicht kennt bzw. darauf einfach nicht zugreifen kann.

Richtig?

Wir adden eine 7segmentanzeige auf die Klasse LED_Anzeige, das bedeutet für mich diese Zeile.

Normalerweise kenne ich:

Java:
panel1 = new JPannel();
panel1.add(anzeige); // also das wir die anzeige, button oder was für ein Element auch immer auf das Panel(Fenster...) adden, ich verstehe nicht ganz warum Zeile 12 oben funktioniert.
 
Zum Code:
Das ist ja, wenn es außerhalb von der Klasse gemacht wird.

Innerhalb der Klasse wäre es eben
this.add(anzeige);
oder, falls nur diese Methode add existiert, kann man auch einfach schreiben
add(anzeige);

Das eine Klasse ihr Objekt draußen nicht kennt ist ja eigentlich der Regelfall.
 
Mh ja ok, aber ich verstehe einfach nicht, wo die 7Segment-Anzeige geaddet wird. Wenn ich in den Code schaue sehe ich nirgends, das diese 7Segment-Anzeige auf das Panel bzw. Fenster geadded wurde.

Wenn jetzt z.B. folgendes stehen würde dann kenn ich mich aus: panel.add(button);

Hier weiß ich, dass der Button auf dem Panel drauf ist.

Und bei this.add(anzeige[ i ]), kann ich nirgends erkennen, das die ledanzeige auf ein Panel geadded wird.

Sieht man das irgendwo, oder wie soll man das erklären?
 
Zurück