désolé pour le titre, mais j'ai essayé de poser cette question ici et là (dont stackoverflow), et à chaque fois soit on part du principe que la question est simple et on y répond à côté de la vrai question, soit on me troll etc..
Voici ce que je sais
les modificateurs d'accès membre, peuvent être public, privé, protégé, ou non spécifié.
J'ai 2 packages A et B
dans A j'ai une classe Maman, et une classe Fille qui hérite de Maman
dans B j'ai une classe Cousin qui hérite aussi de maman.
Dans A.Maman j'ai une variable d'instance i, j et k. Etant respectivement privé, protégé et publique.
Ce que je sais et qui est évident c'est qu'un code
c'est d'accès privé
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.out.print(i)
fonctionnera dans maman mais pas ailleurs : car les membres d'accès privés ne sont accessible que via la classe qui les déclare.
c'est d'accès protégé
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.out.print(j)
il sera accessible partout car toutes les classes héritent de maman
c'est d'accès public
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.out.print(k)
il sera accessible partout
Ma question maintenant est la suivante. Quelles sont les règles de fonctionnement lorsqu'on appelle un membre via
ca ne répond pas du tout aux même règles et ce n'est pas documenté ni dans les tutorial java oracle, ni dans la javadoc (ou vraiment très brièvement)
Code : Sélectionner tout - Visualiser dans une fenêtre à part objet.variable
Voici donc un code d'exemple que je ne comprends pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package app.a; import app.b.Cousin; public class Maman { private int i; protected int j; public int k; public Maman(){ i=8; j=9; k=10; } public void testHeritage(Maman m, Fille f, Cousin c){ System.out.println(" "+m.i+m.j+m.k); System.out.println(" "+f.i+f.j+f.k); // f.i ne compile pas System.out.println(" "+c.i+c.j+c.k); //c.i ne compile pas } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package app.a; import app.b.Cousin; public class Fille extends Maman{ public Fille(){ } public void testHeritage(Maman m, Fille f, Cousin c){ System.out.println(" "+m.i+m.j+m.k); // m.i ne compile pas System.out.println(" "+f.i+f.j+f.k); // f.i ne compile pas pourquoi? on est a l'intérieur de fille ! System.out.println(" "+c.i+c.j+c.k); // c.i ne compile pas. Pourquoi c.j compile? fille n'est pas une sous classe de cousin! } }Comment ca marche?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package app.b; import app.a.*; public class Cousin extends Maman{ public Cousin(){ } public void testHeritage(Maman m, Fille f, Cousin c){ System.out.println(" "+m.i+m.j+m.k); //m.i ne compile pas ni m.j, pourquoi m.j ne compile pas? System.out.println(" "+f.i+f.j+f.k); //f.i ne compile pas ni f.j System.out.println(" "+c.i+c.j+c.k); // c.i ne compile pas et pourtant on est à l'intérieur de cousin } }
Partager