2016-10-19 2 views
1
class A { //1st code starts here 
    private void display() { 
     System.out.println("A class"); 
    } 
} 

class B extends A { 

    protected void display() { 
     System.out.println("B class"); 
    } 
} 

class Test { 

    public static void main(String args[]) { 
     A obj = new B(); 
     obj.display(); 
    } 
} 

sortie: Test.java:22: error: display() dispose d'un accès privé dans un obj.display();primordiaux de méthode Java et concepts classe interne

class Outer{  //2nd Code starts here 

    class Inner1{ 
     private void m2() { 
      System.out.println("Inner1 class"); 
     } 
    } 

    class Inner2 extends Inner1{ 
     protected void m2() { 
      System.out.println("Inner2 class"); 
     } 
    } 

    public static void main(String args[]) { 
     Outer o=new Outer(); 
     Outer.Inner1 i=o.new Inner2(); 
     i.m2(); 
    } 
} 

Sortie: Inner1 classe

Pourquoi erreur de compilation de temps en 1er code tandis que la classe de sortie Inner1 en 2ème Code ???

+4

Vous ne pouvez pas remplacer les méthodes privées –

+3

La visibilité de la classe interne ne peut pas être supérieure à celle de la superclasse. –

+0

Parce qu'une classe englobante a accès aux membres 'private' de ses classes internes; donc la classe 'Outer' dans votre deuxième exemple est autorisée à accéder à la méthode' private' 'm2' dans la classe' Inner1'. – Jesper

Répondre

3

Le code de la classe Outer peut accéder à n'importe quel membre ou méthode déclaré dans la classe Outer, quel que soit le niveau d'accès. Toutefois, la méthode m2 appelée est la méthode de la classe de base Inner1, car vous ne pouvez pas remplacer une méthode private. D'autre part, le code de la classe Test ne peut pas accéder à une méthode private d'une classe différente, ce qui explique pourquoi ce code ne passe pas la compilation.

+0

Vous ne pouvez pas remplacer une méthode privée d'une classe parente. Donc, le code affiché initialement est faux et le message d'erreur est incriminé – Blip

+4

@Blip Non, désolé, vous avez tort. Vous pouvez * avoir * une méthode privée 'm' dans une superclasse et aussi une méthode' m' dans une sous-classe. La méthode de la sous-classe ne remplace pas la méthode de la super-classe; ils sont juste deux méthodes distinctes qui ont le même nom. Essaye le. – Jesper

+0

@Jesper Je comprends, vous avez raison. Il n'est pas prioritaire mais est déclaré comme une nouvelle méthode. Merci de me corriger. – Blip

1

Parce que les membres privés sont accessibles uniquement en classe. lorsque la classe B s'étend A Les membres privés sont inaccessibles Pour B. Dans le cas des classes internes, une classe interne est un membre de classe et a accès à tous les membres de la classe englobante.