Supposons que nous avons deux paquets p1
et p2
et des classes p1.M1
étendues par p2.M12
comme suit:Pourquoi la méthode protégée par package n'est-elle pas visible dans le même package?
package p1;
public class M1 {
void method1() {
System.out.println("Method 1 called");
}
}
package p2;
import p1.M1;
public class M12 extends M1 {
void method2() {
System.out.println("Method 2 called");
}
}
étendons M12
avec p2.B
:
package p2;
public class B extends M12 {
public void doSomething() {
method1();
method2();
}
}
Cela donne une erreur de compilation comme method1
, étant package- protégé dans p1
n'est pas visible dans p2
. method2
est visible sans problèmes.
Maintenant, nous allons étendre p2.M12
avec p1.A
:
package p1;
import p2.M12;
public class A extends M12 {
public void doSomething() {
method1();
method2();
}
}
Ici, je reçois une erreur de compilation pour les deux method2()
(ce qui est compréhensible) etmethod1()
:
Ma question est: pourquoi est le method1
qui est protégé par un paquet dans le paquet p1
n'est pas visible dans la classe A
du même paquet p1
?
Cela signifierait qu'une classe enfant verrait plus que son parent. Ça a l'air un peu bizarre. – luk2302
@ luk2302 Cette méthode protégée par un paquet n'est pas dans le paquet, c'est aussi bizarre. – lexicore
Voici la partie la plus pertinente de la JLS que j'ai réussi à trouver: https://docs.oracle.com/javase/specs/jls/se9/html/jls-15.html#jls-15.12.4.3 –