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
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
in Person und dann denken, p in main hat das auch übernommen.
So.