Protégé constructeur et de l'accessibilité
Pourquoi ne pouvons-nous pas instancier une classe protégée constructeur si son enfant est dans un package différent? Si les variables et les méthodes peuvent être consultés, pourquoi n'a pas la même règle s'applique également pour un protégé constructeur?
pack1:
package pack1;
public class A {
private int a;
protected int b;
public int c;
protected A() {
a = 10;
b = 20;
c = 30;
}
}
pack2:
package pack2;
import pack1.A;
class B extends A {
public void test() {
A obj = new A(); //gives compilation error; why?
//System.out.println("print private not possible :" + a);
System.out.println("print protected possible :" + b);
System.out.println("print public possible :" + c);
}
}
class C {
public static void main(String args[]) {
A a = new A(); //gives compilation error; why?
B b = new B();
b.test();
}
}
- Merci de faire un effort pour construire votre question clairement, la mettre en forme correctement, et la balise de manière appropriée. Vous n'avez pas fait un de ces.
- son clair.. parent d'Un enfant et B sont deux paquets différents(pack 1 et pack 2 respectivement).. pourquoi erreurs du compilateur lors de la création d'un objet d'une classe(maison mère) dont le constructeur est-il protégé ?
- Je crois qu'au lieu d'accéder
b
de l'instance elle-même, si cela avaitobj.b
(en supposant obj a été créé ou transmis avec succès), il serait également donner une erreur de compilation
Vous devez vous connecter pour publier un commentaire.
Selon la Java Spec (https://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.6.2.2)
Dans votre cas, l'accès à l'protégé constructeur de
A
deB
serait possible de le faire à partir d'un constructeur deB
par une invocation desuper()
. Toutefois, l'accès à l'aidenew
n'est pas légal.JLS 6.6.7 répond à votre question. Une sous-classe n'ont accès qu'à des membres protégés de la classe parente, si elle implique la mise en œuvre de son parent. Par conséquent , vous ne peut pas instancier un objet parent à un enfant de la classe, si le constructeur parent est protégé et il est dans le paquet différent...
Je suis d'accord avec les précédentes affiches, je ne sais pas pourquoi vous voulez le faire (instancier parent de cette façon dans l'extension de la classe), mais vous pourriez même faire quelque chose comme ceci:
A
, il est une instance d'un anonyme sous-classe deA
Pourquoi avez-vous besoin
A obj=new A();
dans la classe, alors que l'objet de la classe b est lui-même un objet declass A
Et dans la classe c, il est de donner à l'erreur, car, vous êtes accédant à la propriété protégée de catégorie A qui est constructeur.
Pour obtenir un objet de la classe A dans ce cas, vous devez utiliser cette fonction dans la classe Un