Nous savons tous que si nous ne définissons pas spécifiquement un constructeur, le compilateur insère un constructeur à paramètres zéro invisible. Je pensais que son modificateur d'accès était public, mais dans le traitement d'une question de classe intérieure, j'ai constaté peut-être que j'avais tort. Voici mon code:
public class Outer {
protected class ProtectedInner {
// adding a public constructor will solve the error in SubOuterInAnotherPackage class
//public ProtectedInner() {}
}
}
Et il y a une sous-classe de Outer
dans un autre paquet:
public class SubOuterInAnotherPackage extends Outer {
public static void main(String[] args) {
SubOuterInAnotherPackage.ProtectedInner protectedInner
= new SubOuterInAnotherPackage().new ProtectedInner(); // Error!! Can't access the default constructor
}
}
Vous obtiendrez une erreur dans la méthode main()
, mais si vous ajoutez un constructeur public à la classe ProtectedInner
, cette erreur est résolue. C'est pourquoi je pense que le modificateur du constructeur par défaut n'est pas public! Alors, quelqu'un pourrait-il me dire quel est le modificateur d'accès du constructeur par défaut?
Je pensais que son modificateur d'accès est public, mais quand je traite avec une question de classe intérieure, j'ai constaté peut-être que j'avais tort.
Ouais. En effet, je me suis retrouvé dans la même situation il y a quelques années. J'ai été surpris par une erreur (à travers une injection de Guice, qui l'a rendu légèrement plus difficile à trouver).
La clé est de vérifier la spécification, dans ce cas section 8.8.9 :
Dans un type de classe, si la classe est déclarée publique, le constructeur par défaut est implicitement donné le public de modificateur d'accès (§6.6); Si la classe est déclarée protégée, le constructeur par défaut est implicitement donné le modificateur d'accès protégé (§6.6); Si la classe est déclarée privée, le constructeur par défaut est implicitement donné le modificateur d'accès privé (§6.6); Sinon, le constructeur par défaut a l'accès par défaut impliqué par aucun modificateur d'accès.
Donc, dans ce cas, votre constructeur est implicitement protected
.
En plus de ce que Jon est assez bien indiqué, voici un exemple d'image, pour les gars visuels.
S'il n'y a pas de constructeur dans une classe, Compiler crée automatiquement un constructeur par défaut.
Voici un exemple qui décrit avec succès la règle ci-dessus:
Pour plus de référence, veuillez vous reporter ICI .
Je voudrais souligner une autre chose que j'ai récemment eue. Si vous définissez un constructeur par défaut pour votre classe, le spécificateur ACESS sera ce que vous attribuez. Par exemple,
public class A{
A(){
// do some stuff
}
}
Ici, le spécificateur d'accès du constructeur par défaut est l'accès au paquet et non l'accès public (celui de la classe). toutefois
public class A{
// no constructor is defined
}
Ici, le compilateur sympathisera avec vous et vous donnera un constructeur par défaut dont le spécificateur d'accès sera identique à celui de la classe, qui est public.