Klasse-erstellen verständniss Problem..!
-
Hallo,
hätte mal ne Frage.Ist es möglich eine Klasse ohne "new" zu erstellen (instanzieren)..?
Eine Klasse sollte doch immer einen Standart Kontruktor haben oder nicht..?Zum Beispiel habe ich folgende Klasse http://developer.android.com/reference/android/graphics/Bitmap.html.
Wenn ich jetzt folgedes schreibe:
Bitmap myBit = new Bitmap();
bekomme ich einen Compiler fehler.
Wieso..?
Was ist bei dieser Klasse anders..?
-
Vielleciht, weil der keinen Standardkonstruktor hat
und ein paar Argumente braucht?
-
Objekte werden mit new erzeugt - nicht Klassen. Eine Klasse existiert bloss zur Compile-Time und beschreibt, wie ein Objekt aufgebaut wird.
Ein Objekt wird dann zur Laufzeit mit new erzeugt.Im Falle der Bitmap ist es von der Implementierung der Klasse so gemacht, dass man das Objekt nicht selber mit new erzeugt, sondern mit einer der create-Methoden, die du in der APi siehst.
Dann hast du sowas wieBitmap map = Bitmap.create(...)
Innerhlb der Bitmap.create(...) Methode wird fuer dich dann ein Objekt mit new erzeugt und es wird eine Referenz darauf zurueckgegeben.
-
rhom@uni schrieb:
Vielleciht, weil der keinen Standardkonstruktor hat
und ein paar Argumente braucht?Falsch. Der Konstruktor ist nicht oeffentlich.
-
icarus2 schrieb:
Objekte werden mit new erzeugt - nicht Klassen. Eine Klasse existiert bloss zur Compile-Time und beschreibt, wie ein Objekt aufgebaut wird.
Ein Objekt wird dann zur Laufzeit mit new erzeugt.Im Falle der Bitmap ist es von der Implementierung der Klasse so gemacht, dass man das Objekt nicht selber mit new erzeugt, sondern mit einer der create-Methoden, die du in der APi siehst.
Dann hast du sowas wieBitmap map = Bitmap.create(...)
Innerhlb der Bitmap.create(...) Methode wird fuer dich dann ein Objekt mit new erzeugt und es wird eine Referenz darauf zurueckgegeben.
Sorry wollte Objekt schreiben und danke für deine Antwort.
Leider verstehe ich das immer noch nicht so ganz. Es geht mir eigentlich garnicht um die Bitmap-Klasse, habe die nur als Beispiel genommen.Du meinst also, dass der Konstruktor, in dem fall der Standart konstruktor der ja implizit eingebaut wurde nicht öffentlich ist.
Ok aber wieso geht dann das ?class was { private was(){} public int x; } ... was w = new was(); // sollte doch nicht gehen oder..?
Oder anders, wie müsste meine was-Klasse aussehen, damit ich keinen Kosntruktor benutzen darf, also zumind. nicht mit dem new-Schlüsselwort..?
-
Derer schrieb:
class was { private was(){} public int x; } ... was w = new was(); // sollte doch nicht gehen oder..?
Nein das kompiliert nicht, denn der Konstruktor ist privat und deshalb von aussen her nicht sichtbar.
Hier ein Beispiel:
Nehmen wir an du hast folgende Klasse:class PrivateConstructor { private PrivateConstructor() { // Dieser Konstruktor ist private und kann von aussen nicht // direkt erreicht werden } // Diese statische Methode erzeugt ein Objekt der Klasse PrivateConstructor public static PrivateConstructor createInstance() { return new PrivateConstructor(); } }
Wie du siehst ist der Konstruktor private, das heisst du kannst nicht direkt new verwenden. Allerdings definiert die Klasse eine Methode createInstance(), mit der ein Objekt erstellt und zureckgegeben wird. Du siehst auch, dass dabei intern new verwendet wird.
Hier dann der Code zum ausfuehren:public class Main { public static void main(String[] args) { PrivateConstructor pc1 = new PrivateConstructor(); // Kompiliert nicht, da Konstruktor nicht sichtbar PrivateConstructor pc2 = PrivateConstructor.createInstance(); // Kompiliert } }
Ist es dir dadurch etwas klarer geworden?
-
Ja jetzt verstehe ich das schon besser, aber erklär mir mal wieso der Compiler keinen Fehler ausgibt. Zum Beispiel habe ich folgendes ausprobiert..:
package de.cm; public class class_1 { static class PrivateConstructor { private PrivateConstructor() { // Dieser Konstruktor ist private und kann von aussen nicht // direkt erreicht werden } // Diese statische Methode erzeugt ein Objekt der Klasse PrivateConstructor public static PrivateConstructor createInstance() { return new PrivateConstructor(); } private int x; public void setInt(int value) { x = value; } public int getInt() { return x; } } public static void main(String[] args) { PrivateConstructor pc1 = new PrivateConstructor(); // Kompiliert nicht, da Konstruktor nicht sichtbar PrivateConstructor pc2 = PrivateConstructor.createInstance(); // Kompiliert pc1.setInt(3); pc2.setInt(5); System.out.println("pc1 X..: "+pc1.getInt()); // 3 System.out.println("pc2 X..: "+pc2.getInt()); // 5 } }
Funktioniert das obige nur weil "PrivateConstructor" eine innere Klasse ist von class_1 ?
Wenn ich jetzt zum Beispiel eine zweite Klasse im gleichen package erstelle, also so..:
package de.cm; import de.cm.class_1.PrivateConstructor; public class exKlasse { private static void kop() { // funkrioniert NICHT PrivateConstructor Po = new PrivateConstructor(); // Funkrioniert PrivateConstructor p = PrivateConstructor.createInstance(); } }
kommt gleich ein Fehler von eclipse, dass PrivateConstructor nicht visible ist, wie auch gewollt.
-
Ja, bei inneren Klassen funktioniert die Instanzierung mit new auch wenn der Konstruktor private ist.
Wenn die Klasse allerdings ausserhalb liegt, dann ist ein privater Konstruktor nicht mehr sichtbar.
-
OK DANKE nochmals für deine Hilfe..!
-
Derer schrieb:
package de.cm; public class class_1 { static class PrivateConstructor { private PrivateConstructor() { // Dieser Konstruktor ist private und kann von aussen nicht // direkt erreicht werden } // Diese statische Methode erzeugt ein Objekt der Klasse PrivateConstructor public static PrivateConstructor createInstance() { return new PrivateConstructor(); } private int x; public void setInt(int value) { x = value; } public int getInt() { return x; } } public static void main(String[] args) { PrivateConstructor pc1 = new PrivateConstructor(); // Kompiliert nicht, da Konstruktor nicht sichtbar PrivateConstructor pc2 = PrivateConstructor.createInstance(); // Kompiliert pc1.setInt(3); pc2.setInt(5); System.out.println("pc1 X..: "+pc1.getInt()); // 3 System.out.println("pc2 X..: "+pc2.getInt()); // 5 } }
Benutze doch bitte Java als Codetag und nicht Code!
Das Codetag für Java findest du als Button in der 3. Zeile unter den Smilies, wenn du einen Beitrag erstellst.Das ganze sieht dann am Ende so aus:
package de.cm; public class class_1 { static class PrivateConstructor { private PrivateConstructor() { // Dieser Konstruktor ist private und kann von aussen nicht // direkt erreicht werden } // Diese statische Methode erzeugt ein Objekt der Klasse PrivateConstructor public static PrivateConstructor createInstance() { return new PrivateConstructor(); } private int x; public void setInt(int value) { x = value; } public int getInt() { return x; } } public static void main(String[] args) { PrivateConstructor pc1 = new PrivateConstructor(); // Kompiliert nicht, da Konstruktor nicht sichtbar PrivateConstructor pc2 = PrivateConstructor.createInstance(); // Kompiliert pc1.setInt(3); pc2.setInt(5); System.out.println("pc1 X..: "+pc1.getInt()); // 3 System.out.println("pc2 X..: "+pc2.getInt()); // 5 } }