Java: protégé l'accès à l'ensemble des packages

J'aimerais comprendre ce qui se passe dans l'exemple ci-dessous (où un membre protégé est accessible à partir de l'extérieur du colis par le biais d'une sous-classe).

Je sais que pour les cours à l'extérieur de l'emballage, de la sous-classe peut voir les membres protégés seulement par héritage.

Il y a deux packages: package1 et package2.

  1. package1: ProtectedClass.java
    package org.test.package1;
    
    public class ProtectedClass {
    
        protected void foo () {
            System.out.println("foo");
        }
    }
  2. package2: ExtendsprotectedClass.java
    package org.test.package2;
    
    import org.test.package1.ProtectedClass;
    
    public class ExtendsprotectedClass  extends ProtectedClass {
    
        public void boo() {
            foo(); //This works, 
                   //since protected method is visible through inheritance
        }
    
        public static void main(String[] args) {
            ExtendsprotectedClass epc = new ExtendsprotectedClass();
            epc.foo(); //Why is this working? 
                       //Since it is accessed through a reference,
                       //foo() should not be visible, right?
        }
    }
  3. package2: UsesExtendedClass.java
    package org.test.package2;
    
    public class UsesExtendedClass {
    
        public static void main(String[] args) {
            ExtendsprotectedClass epc = new ExtendsprotectedClass();
            epc.foo(); //CompilationError: 
                       //The method foo() from the type ProtectedClass
                       //is not visible
        }
    }

Il est entendu que la boo() méthode dans ExtendsprotectedClass pouvez accéder à foo(), puisque les membres protégés peuvent être accessibles par le biais de l'héritage.

Ma question est, pourquoi le foo() méthode fonctionne bien quand on y accède via une référence dans le main() méthode de ExtendsprotectedClass mais ne fonctionnera pas lors de l'accès par le biais de la epc de référence dans UsesExtendedClass?

OriginalL'auteur JWhiz | 2010-08-22