Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
hallo miteinander
habe eine frage zu Klassen
so bildet man doch ein Instanz oder Objekt
Code:
Klassentyp obj = new Klassentyp()
Meine Frage, ist obj ein Objekt oder Objektvariable? new Klassentyp() ist doch ein Objekt nicht? Ich bin mega verwirrt mit diesen Begriffen... Könnte jemand mir bitte es erklären..
ist ein Referenzvariable vom Typ "Klassenobj" , die einen Verweis auf das Objekt speichert und über diese Referenzvariable kannst du dann auf Methoden und sonstiges zugreifen.
Beispielklasse x;
// x ist ein benannter Speicherplatz für
// eine Referenz auf ein Objekt vom
// Typ Beispielklasse.
x = new Beispielklasse();
// Hier sind zwei Schritte beteiligt:
// 1. new erzeugt unter Verwendung des
// Konstruktors Beispielklasse() ein neues
// Objekt des Typs Beispielklasse und
// gibt die Referenz auf dieses neu
// erzeugte Objekt zurück.
// 2. x bekommt die Referenz, die new
// zurückgegeben hat, zugewiesen
// (Kopie der Referenz).
// Da x vom gleichen Typ ist, ist diese
// Zuweisung gültig.
Beispielklasse y = x;
// y bekommt die Referenz zugewiesen,
// die x auch schon hat. Sowohl x als auch
// y referenzieren dasselbe Objekt.
x = null;
// x referenziert jetzt nichts mehr.
// y referenziert nach wie vor das oben
// erstellte Objekt.
y = null;
// Jetzt referenziert auch y nichts mehr.
// Alle Referenzen auf das Objekt sind
// verloren, also wird der GC dieses
// Objekt demnächst beseitigen.
Objekte sind wie Fernseher, und Objekt-Variablen wie Fernbedienungen. Du hast niemals einen Fernseher in der Hand, immer nur eine Fernbedienung. Und ein Fernsehr kann sogar mit mehreren Fernbedienungen ähm... bedient werden. Auch an Methoden wird nur die Fernbedienung weitergegeben, wenn man dann innerhalb der Methode das Programm umschaltet, siehst du die Änderung über die anderen Variablen auch.
Objekte erzeugen geht über
- new (der "Konstruktor")
- die clone-Methode (falls Cloneable)
- Deserialisierung
- Reflection (Class.newInstance usw.)
aber niemals über
- Variablen zuweisen
Genauer müsste man sagen, dass die Referenzen immer nur kopiert(!) werden, also baugleiche Fernbedienungskopien an die Methoden gegeben werden. Deswegen ändert sich im folgenden Beispiel der StringBuffer beim Aufrufer nicht:
Code:
public void eineMethode(StringBuffer blubb){
blubb = new StringBuffer(10);
// Die alte Fernbedienung wird zu Gunsten der neuen fallen
// gelassen, aber der Aufrufer merkt davon nichts, weil er
// noch seine Kopie der alten Fernbedienung hat.
}
@kostonstyle: Keine Ahnung; sagen wir: das ist einfach so?! xD Deswegen heißt der Konstruktor ja auch Konstruktor, er konstruiert ein Objekt der gewünschten Art.
objekte werden nicht im konstruktor erzeugt. wenn der konstruktor gerufen wird, ist das objekt bereits vollständig erzeugt. im konstruktor hat man nur die möglichkeit, das objekt unmittelbar nach der erzeugung noch zu initialisieren. objekt erzeugen und konstruktor rufen ist eine atomare operation.
noch eine frage zu objekten. also wenn man eine statische klasse erzeugt, kann man es in der Konstruktor verhindern, dass Instanzbildung erzeugt wird, also glaube ca. so
Code:
class Demo
{
private Demo() {
}
}
Nach meiner Vorstellung, wird das Objekt doch in Konstruktur erzeugt. Ich verstehe überhaupt nichts mehr, es ist so verwirrend das ganze Konzept.
Ein Objekt wird erzeugt, wenn der Konstruktor aufgerufen wird. Dadurch, dass man alle Konstruktoren einer Klasse X als "private" deklariert, wird verhindert, dass aus irgendeiner anderen Klasse heraus ein Konstruktor der Klasse X aufgerufen werden kann. Und so können - außerhalb der Klasse X selbst - nirgends Instanzen der Klasse X erzeugt werden.