View Full Version : [FRAGE] - Zwei Fragen :)
Ich habe ne frage, zu
1. finalize()-Methode
2. this
Ich habe diese beiden Sachen nicht ganz verstanden, könnte mir jemand bisschen näher erklären wie sie funktionieren, und nicht auf links verweisen, weil das kann ich auch, aber irgendwie ist die finalize()-Methode überall so komplex geschrieben...
wäre super nett, danke mfg
lt. dem vor mir liegenden JAva Buch ist this ein Zeiger auf das aktuelle Objekt um die eigenen Variablen und Methoden ansprechen zu können.
Ein Bsp
public class Rechteck
{
private int laenge;
private int breite;
public Rechteck(int laenge, int breite)
{
this.laenge = laenge;
this.breite = breite;
}
}
Die Übergabevariable des Konstruktors ist gleich mit der Klassenvariable, damit du diese nun zuweisen kannst brauchst du den this Zeiger auf das aktuelle Objekt.
finalize() ... ist ein Dekonstruktor, der soweit ich mitbekommen habe in Java wenig Bedeutung hat, da der Speicher automatisch verwaltet wird.
In der Programmiersprache C++ mußt du für Variablen Speicherplatz selbst reservieren und nach der Verarbeitung wieder freigeben. Dieses freigeben erledigt man dann in einem Dekonstruktor.
Grüße
dankeschön, mit this, habe ichs jetzt verstanden, es wird nicht auf die variable im parameter gedeutet, dankeschön, finalize() ist also net so wichtig, weil ich habe ein beispiel, wo ein generator 1-100000 elemente erzeugt, und die finalize() methode halt irgendwann mal abbricht...
mfg thx a lot!:thumb:
die finalize() Methode wird vom Garbage Collector aufgerufen. Den Garbage Collector kannst du dir als "Prozess" vorstellen, der im Hintergrund läuft und den Speicher verwaltet.
Warum diese bei dir nun abbricht, keine Ahnung, aber vielleicht kannst du ja das Problem genauer erklären.
Übrigends heißt es Destruktor und nicht Dekonstruktor, wie ich oben geschrieben hab.
duracell
27-12-2004, 21:24
'this' hat nichts mit den eingangsparametern einer methode zu tun. es ist eine referenz auf das aktuelle objekt. wenn du dir nicht sicher bist, ob du weisst, was this ist.. dann schau in einem buch nach. das wäre einmal der anfang von objektorientierter programmierung.
was glaubst du mache ich? ich mache zur zeit ein ganzes java buch ;) nur ich habe es nicht ganz verstanden wie es da erklärt wird
Thema 'this':
Ich nehme den Code von oben her.
this.laenge = laenge;
bedeutet soviel wie
Datenfeld namens laenge = Parameter namens laenge;
Und das ganze hat den Zweck, um die Lesbarkeit des Quellcodes zu bewahren.
Manchmal gibt es Namen, die die Bedeutung einer Variablen perfekt beschreiben. Wenn der Name also so gut passt, dass man sich keinen anderen dafür ausdenken will/sollte.
Schönen Abend,
PiXeL
duracell
28-12-2004, 01:40
this ist eine Variable, die eine Referenz auf das aktuelle Objekt enthält. Nimm mal an, du hast in deinem Programm eine Methode, die einen Eingangsparameter hat, dessen Name ident ist mit einer Eigenschaft deiner Klasse...
public class Demonstrate
{
private int value; // Eigenschaft der Klasse Demonstrate
public Demonstrate(int value)
{
value = value / 2; // Hier wird der Eingangsparameter value verändert.
this.value = value; // Hier wird der Eigenschaft value der (veränderte) Parameter value zugewiesen
}
}
Damit der Compiler unterscheiden kann, welcher value gemeint ist, musst du bei der Zuweisung an die Eigenschaft value der Klasse Demonstrate den Zeiger auf das aktuelle Objekt voranstellen.
Wenn du also innerhalb deiner Methoden mit lokalen Variablen arbeitest deren Namen ident mit Eigenschaften deiner Klasse sind und du innerhalb der Methode auch auf Klassenvariablen zugreifen musst, dann musst du die Zugriffe (Lesen, Schreiben) auf Klassenvariablen durch den vorangestellten this-Pointer kennzeichnen.
Einige Ausdrücke waren hier schlecht gewählt: Mit "Klassenvariablen" meinte ich Variablen im Scope der Klasse. Das können sowohl Eigenschaften von Objekten (Instanzvariablen) als auch Eigenschaften der Klasse (static Klassenvariablen) sein.
besser kann mans nicht erklären ;) thx jungs:thumb:
und wie ist das mit super(); ? was hats damit so auf sich?
Paulchen
28-12-2004, 12:23
wenn du eine klasse schreibst, die sich von einer anderen klasse ableitet, dann wird von dieser basisklasse der konstruktor nicht übernommen. hast du beispielsweise diese Basisklasse
public class Basis {
private String Klassenvariable;
public Basis() {
Klassenvariable="";
}
}
und diese Erweiterung
public class Erweiterung extends Basis {
public Erweiterung() {
}
}
dann kannst du in der Klasse Erweiterung zwar die von Basis ererbte Variable Klassenvariable verwenden, doch sie wird nicht automatisch initialisiert, da der Konstruktor von Basis nicht automatisch aufgerufen wird. Dies soll mit super() geschehen:
public class Erweiterung extends Basis {
public Erweiterung() {
super();
}
}
Dieses Beispiel ist vielleicht trivial, man hätte
Klassenvariable = "";
auch in den Konstruktor von Erweiterung schreiben können; aber in vielen Fällen weiß man nicht, was im Konstruktor der Klasse steht, die man erweitert.
duracell
28-12-2004, 14:17
Genau! Aber da fällt mir auch noch ein gutes Beispiel für die Verwendung von super ein:
In Java erbt jede Klasse automatisch von der Klasse Object. Die Schnittstelle der Klasse Object (das ist die Menge jener Methoden, auf die von aussen zugegriffen werden kann - sie sind public) verfügt zB. über die Methode toString(). Sie liefert eine String-Repräsentation des aktuellen Objekts. Wenn man diese Methode implementiert, kann man die Referenz auf das Objekt zum Beispiel der Methode EprogIO.println() übergeben. Der Compiler checkt, dass toString() implementiert wurde und übergibt den Rückgabewert dieser Methode. Was genau die Methode zurückgibt, ist aber dem Programmierer überlassen.
Nimm mal an, wir haben eine Klasse Laptop die die Klasse Computer erweitert:
public class Computer
{
private int preis;
public Computer(int preis)
{
this.preis = preis;
}
public String toString()
{
return "Preis: " + preis;
}
}
public class Laptop extends Computer
{
private int displayGroesse;
public Laptop(int preis, int displayGroesse)
{
super(preis);
this.displayGroesse = displayGroesse;
}
public String toString()
{
return super.toString() + " DisplayGroesse: " + displayGroesse;
}
}
Okay.. wie man sieht, wird in der Methode toString() der von Computer abgeleiteten Klasse Laptop die Methode toString() der Superklasse (Computer) aufgerufen. Was kommt raus?
Computer computer = new Computer(100);
Laptop laptop = new Laptop(200, 15);
EprogIO.println(computer); // Ausgabe = Preis: 100
EprogIO.println(laptop); // Ausgabe = Preis: 200 DisplayGroesse: 15
Schon ein bischen anspruchsvoller, aber zeigt auch schön die Codewiederverwendung durch Objektorientierung.
vBulletin® v3.7.1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.