Ich versuche zu verstehen, warum es einen Unterschied zwischen Zugänglichkeit von Klassenmitgliedern gibt, wenn man über Konstruktoren spricht.Java private Konstruktoren Sichtbarkeit
Betrachten Sie das folgende Beispiel:
class A {
static class B {
private B(String s) {}
private void foo() {}
}
static class C extends B {
public C(String s) {
super(s); // call B(String), which is private, and obviously accessible
}
void bar() {
foo(); // compilation error (symbol unknown), as B.foo() is private
}
}
}
Privat Mitglieder A
, als privat zu sein, sollte von B
nicht zugänglich sein. Für Felder und Methoden ist dies der Fall, aber es scheint, dass Konstruktoren nicht der gleichen Regel folgen.
Vom JLS-8 (6.6.1. Determining Accessibility), können wir lesen:
[...]
Element (Klasse, Schnittstelle, Feld, oder das Verfahren) eines Referenztyp oder ein Konstruktor eines Klasse-Typ ist, nur zugänglich, wenn die Art zugänglich ist und das Element oder Konstruktor deklariert Zugang zu ermöglichen:
[...]
Andernfalls wird das Element oder der Konstruktor als
private
deklariert, und der Zugriff ist nur dann zulässig, wenn er im Rumpf der obersten Klasse (§7.6) erfolgt, der die Deklaration des Elements oder Konstruktors einschließt.
Kann mir jemand erklären, warum der Konstruktor von C
zugänglich ist, auch während private
erklärt werden?
Nur weil Sie super aufrufen können, heißt das nicht, dass der Konstruktor zugänglich ist – michaelsnowden
Kann mir jemand erklären, warum der Konstruktor von C aus zugänglich ist, auch wenn er als privat deklariert wird? -> Weil B und C innere Klassen von A sind. Funktioniert nicht mehr, wenn Sie B und C nach A bewegen. –
@ JörnBuitink: Wenn das der Fall ist, warum ist 'foo()' * nicht * zugänglich? Es scheint hier eine Inkonsistenz zu geben. –