PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java]Fragen zu static und final


Gast
2007-04-16, 12:47:42
Hi Leute,

ich hab da mal ein paar Fragen zu Java. Zunächst zum Schlüsselwort static. Mir sind in letzter Zeit folgende Konstruktionen begegnet:

static class XY
{
//...
}

class SocketOutputStream extends FileOutputStream
{
static {
init();
}
//...
}

was soll die erste Konstruktion bedeuten? Eine statische Klasse? Was soll das sein?
Und was bedeutet das static mit den geschweiften Klammern, die die Methode init() umschließen? Ist das ein Codeblock der automatisch beim Programmstart ausgeführt wird, so als würde er am Anfang der main()-Routine stehen, oder wie?

Dann hätte ich noch eine Frage zu konstanten Referenzen. Stimmt es, daß es in Java keine Referenzen auf Objekte gibt, die nur lesenden Zugriff auf das Objekt erlauben (so wie in C++ ein const-Pointer)? Soweit ich gelesen habe, kann eine Referenz zwar als final deklariert werden, das bedeutet aber lediglich, daß die Referenz nicht mehr auf ein anderes Objekt gesetzt werden kann, Manipulationen des Objekts sind über die Referenz aber durchaus möglich. Und das Schlüsselwort const hat in Java eine ganz andere Bedeutung, richtig?

Monger
2007-04-16, 14:48:57
was soll die erste Konstruktion bedeuten? Eine statische Klasse? Was soll das sein?

Weiß ich auch nicht. Der Java Compiler schluckt das so auf jeden Fall nicht.


Und was bedeutet das static mit den geschweiften Klammern, die die Methode init() umschließen?

Das ist der Klassenkonstruktor. Also der Konstruktor, der aufgerufen wird wenn die Klasse (nicht das Objekt!!) instanziiert wird. Das passiert üblicherweise, wenn die Runtime die Klasse lädt.
Betrachte es als Initialisierungsblock beim Programmstart. Ist vorallem praktisch, wenn du statische Attribute vorbelegen willst.


Dann hätte ich noch eine Frage zu konstanten Referenzen. Stimmt es, daß es in Java keine Referenzen auf Objekte gibt, die nur lesenden Zugriff auf das Objekt erlauben (so wie in C++ ein const-Pointer)?

Ob ein Objekt lesenden Zugriff erlaubt oder nicht, liegt einzig und allein am Objekt. Es gibt selbstverständlich Objekte, die nach Instanziierung nur noch einen lesenden Zugriff zulassen, wie z.B. String.


Soweit ich gelesen habe, kann eine Referenz zwar als final deklariert werden, das bedeutet aber lediglich, daß die Referenz nicht mehr auf ein anderes Objekt gesetzt werden kann, Manipulationen des Objekts sind über die Referenz aber durchaus möglich.

"final" hat in Java eine ganze Menge Bedeutungen. Eine finale Klasse kann nicht vererbt werden, eine finale Methode kann nicht überschrieben werden. Ein finales Attribut muss in allen Konstruktoren deklariert werden und nirgendwo sonst, und eine finale Variable darf nur ein einziges mal eine Zuweisung erhalten.

Und das Schlüsselwort const hat in Java eine ganz andere Bedeutung, richtig?
const gibt es in Java gar nicht. Was du als Konstante kennst, sieht in Java üblicherweise so aus:


public static final int konstante = 42;

Shink
2007-04-16, 14:52:53
Statische Innere Klassen haben keine Referenz zur äusseren.

Also z.B:
class A {
A() {
}

foo() {
}

static class B {
B() {
}
}
}
macht es möglich, sich mit new A.B() eine Instanz der Klasse B zu erzeugen, ansonsten benötigt man eine funktionierende Instanz der Klasse A.
foo() kann man aus B nicht aufrufen, wenn B statisch ist; ansonsten schon.

Der static-Block wird zum ersten Mal aufgerufen, wenn irgendjemand irgendetwas mit der Klasse macht.
Soll heißen: Wenn man auf irgendetwas (statisches Feld, Methode etc.) einer Klasse zugreift, kann man sich sicher sein, dass deren static{}-Block schon ausgeführt wurde.
Mit final hast du recht; const ist glaub ich in Java kein wirkliches Schlüsselwort (es ist reserviert, macht aber nichts).


Hi Leute,

ich hab da mal ein paar Fragen zu Java. Zunächst zum Schlüsselwort static. Mir sind in letzter Zeit folgende Konstruktionen begegnet:

static class XY
{
//...
}

class SocketOutputStream extends FileOutputStream
{
static {
init();
}
//...
}

was soll die erste Konstruktion bedeuten? Eine statische Klasse? Was soll das sein?
Und was bedeutet das static mit den geschweiften Klammern, die die Methode init() umschließen? Ist das ein Codeblock der automatisch beim Programmstart ausgeführt wird, so als würde er am Anfang der main()-Routine stehen, oder wie?

Dann hätte ich noch eine Frage zu konstanten Referenzen. Stimmt es, daß es in Java keine Referenzen auf Objekte gibt, die nur lesenden Zugriff auf das Objekt erlauben (so wie in C++ ein const-Pointer)? Soweit ich gelesen habe, kann eine Referenz zwar als final deklariert werden, das bedeutet aber lediglich, daß die Referenz nicht mehr auf ein anderes Objekt gesetzt werden kann, Manipulationen des Objekts sind über die Referenz aber durchaus möglich. Und das Schlüsselwort const hat in Java eine ganz andere Bedeutung, richtig?