2017-06-14 2 views
2

J'apprends sur le remplacement au moment et je lis qu'une méthode privée ne peut pas être surchargée hereJava remplaçant privé vs publique

Je lis aussi que le niveau d'accès ne peut être plus restrictive que le niveau d'accès aux superclasses here

Donc, ce que je veux savoir, est-ce que cela signifie que vous pouvez seulement remplacer les méthodes publiques? Et votre nouvelle méthode doit aussi être publique?

Scénario

class A { 
    private void method1(){ 
     .... 
    } 
} 

class B extends A { 
    private void method1(){ 
     .... 
    } 
} 

Ai-je raison de dire que ce sera une erreur de compilation parce que les méthodes privées ne peuvent pas être remplacées?

Scénario 2

class A { 
    public void method1(){ 
     .... 
    } 
} 

class B extends A { 
    private void method1(){ 
     .... 
    } 
} 

Ai-je raison en disant cela produira également une erreur de compilation parce que vous le niveau d'accès des method1() dans B est plus restrictive que method1() dans A

Scenario3

class A { 
    public void method1(){ 
     .... 
    } 
} 

class B extends A { 
    public void method1(){ 
     .... 
    } 
} 

Question finale, est-ce le seul scénario qui peut être dépassé? en? (les deux niveaux d'accès sont publics)

+1

protégé aussi ... et ceux-ci auront la même visibilité –

+2

Pourquoi ne pas les tester avant de poster? – shmosel

Répondre

1

Oui, vous pouvez remplacer les méthodes publiques ou protégées. Vous ne pouvez pas remplacer les méthodes privées. Cela dit, votre premier extrait ne produira pas d'erreur de compilation. Les deux A et B auront un method1(), mais la méthode B ne remplacera pas la méthode A.

Le deuxième extrait échouera en effet à passer la compilation, car vous ne pouvez pas réduire la visibilité d'une méthode héritée.

Le troisième extrait est le seul cas de substitution de méthode dans le code que vous avez publié.

3

supposez que la classe:

class A { 
    public void method1() {   } 

    protected void method2() {   } 

    private void method3() {   } 

    void method4() {   } 
} 

puis

class B extends A { 
    @Override 
    public void method1() { 
     // this method DOES override the Method1 
    } 

    @Override 
    protected void method2() { 
     // this method DOES override the Method2 
     super.method2(); 
    } 

    private void method3() { 
     // this method DOES NOT override the Method3 
    } 

    @Override 
    void method4() { 
     // this method DOES override the Method4 
     super.method4(); 
    } 
} 

et dans tous les cas, votre méthode surchargée ne peut pas être moins visible que la méthode de la super classe.

+1

'method4' écrase seulement la super implémentation si les deux classes sont dans le même paquet –

+0

oui, cela n'est valide que parce qu'elles supposent être dans le même paquet ... –