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é
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é
il sera accessible partout car toutes les classes héritent de maman

c'est d'accès public
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)

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!
    }
}
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
    }
}
Comment ca marche?