J'essaie de comprendre pourquoi il y a une différence entre l'accessibilité des membres de la classe et les constructeurs.
Prenons l'exemple suivant :
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
}
}
}
Membres privés de A
étant privés, ils ne devraient pas être accessibles à partir de l'Internet. B
. Pour les champs et les méthodes, c'est le cas, mais il semble que les constructeurs ne suivent pas la même règle.
Du JLS-8 ( 6.6.1. Détermination de l'accessibilité ), on peut lire :
[...]
Un membre (classe, interface, champ ou méthode) d'un type de référence, ou un constructeur d'un type de classe, n'est accessible que si le type est accessible et que le membre ou le constructeur est déclaré pour permettre l'accès :
[...]
Sinon, le membre ou le constructeur est déclaré
private
L'accès est autorisé si et seulement si il a lieu dans le corps de la classe de niveau supérieur (§7.6) qui contient la déclaration du membre ou du constructeur.
Quelqu'un peut-il m'expliquer pourquoi le constructeur est accessible à partir de C
même en étant déclaré private
?