web-dev-qa-db-fra.com

Une méthode privée en super classe peut-elle être remplacée dans la sous-classe?

Les méthodes privées peuvent-elles être remplacées en Java? Si non, comment fonctionne le code suivant?

class Base{
      private void func(){
            System.out.println("In Base Class func method !!");         
      };
}

class Derived extends Base{
      public void func(){   //  Is this a Method Overriding..????        
            System.out.println("In Derived Class func method"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived();
            d.func(); 
      }
}
24
AnkitChhajed

Non, vous ne le préservez pas. Vous pouvez vérifier en essayant de le marquer avec @Override ou en essayant d'appeler super.func();. Les deux ne fonctionneront pas; ils jettent des erreurs de compilateur.

En outre, vérifiez ceci:

classe Base {
 private void func () {
 System.out.println ("méthode In base func"); 
 }; 
 public void func2 () {
 System.out.println ("func2"); 
 func (); 
 } 
} 

 classe dérivée étend la base {
 public void func () {// S'agit-il d'une méthode prioritaire? 
 System.out.println ("Méthode func de la classe dérivée"); 
 } 
} 

 class InheritDemo {
 public static void main (String [] args) {
 Dérivée D = new Dérivée (); 
 D.func2 (); 
 } 
} 

Il imprimera:

func2
In base func method

Lorsque vous remplacez func() dans Base par public, alors il s'agira d'un remplacement et le résultat affiché sera:

func2
In Derived Class func method
46
Polygnome

Non, une méthode privée ne peut pas être remplacée car elle n'est visible à partir d'aucune autre classe. Vous avez déclaré une nouvelle méthode pour votre sous-classe sans relation avec la méthode superclass. Une façon de voir les choses est de vous demander s'il serait légal d'écrire super.func() dans la classe Derived. Il est impossible d'empêcher une méthode dominante d'accéder à la méthode qu'elle substitue, mais ce serait précisément le cas ici.

19
Marko Topolnik

Non ce n'est pas. Vous pouvez marquer une substitution juste pour vous en assurer:

@Override
public void func(){
     System.out.println("In Derived Class func method"); 
}

Et dans ce cas, ce serait une erreur du compilateur.

3
Doorknob

Vous n'imposez pas. Vous ne pouvez pas remplacer les membres privés, vous définissez simplement une nouvelle méthode dans Derived. Derived n'a aucune implémentation de func() dans la base de connaissances depuis qu'il a été déclaré privé. Vous n'obtiendrez pas d'erreur de compilation lorsque vous définissez func() dans Derived, car c'est parce que Derived ne sait pas que Base a une implémentation de func(). Pour être clair: il serait inexact de dire que vous annulez l'implémentation de func() dans la base.

3
Ian Dallas

En plus de la réponse déjà correcte, considérez ceci:

public class Private {
    static class A {
        public void doStuff() {
            System.out.println(getStuff());
        }

        private String getStuff() {
            return "A";
        }
    }

    static class B extends A {
        public String getStuff() {
            return "B";
        }
    }

    public static void main(String[] args) {
        A a = new A();
        a.doStuff();
        a = new B();
        a.doStuff();
        B b = new B();
        b.doStuff();
    }
}

Cela va imprimer 

UNE

UNE

UNE

bien que B "remplace" getStuff(). As l'implémentation de doStuff() est fixée à l'appel de A#getStuff(), aucun polymorphisme ne sera déclenché.

2
daniu

Une méthode privée ne peut jamais être dépassée. C'est toujours caché. 

Dans votre exemple, la classe dérivée a une méthode privée de classe parente et a sa propre fonction func . Les deux sont différents, et le func n'est pas dépassé. C'est une fonction indépendante séparée.

Si vous créez une nouvelle fonction dans la classe parente appelant une fonction de classe parente, le parent func sera appelé, si la référence de la classe parente est utilisée comme opposé dans le cas de la méthode par extraction.

Note : Un objet définit les membres dont il dispose et une référence à laquelle il peut accéder. 

// Méthode de suppression du cas 

class Base{
      public void func(){
            System.out.println("Parent class");         
      };                                                                   
      public void func1(){                                                
            func();                                                             
       }                                                                        
 }

class Derived extends Base{
      public void func(){         
            System.out.println("Derived class"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived();                               
            d.func1(); // Prints Derived class                                          

            Base b = new Derived();                                    
            b.func1();                                                         // Prints Derived class - no matter parent reference is calling,as there as method is overridden - Check func1() is in parent class, but id doesn't call parent class func() as the compiler finds a func() method over ridden in derived class    

      }
}

// Method Hidding case - Private and static methods case  

class Base{
      private void func(){
            System.out.println("Parent class");         
      };                                                                   
      public void func1(){                                                
            func()                                                              
      }     
}

class Derived extends Base{
      public void func(){   //  Is this a Method Overriding..????        
            System.out.println("Derived class"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived(); 
            d.func1(); // Prints Derived class
            Base b = new Derived();
            b.func1(); 
// Prints Parent class - the reason is we are using the parent class reference, so compiler is looking for func() and it founds that there is one private class method which is available and is not over ridden, so it will call it. Caution - this won't happen if called using derived class reference.

            b.func();
// this prints the Derived class - the compiler is looking func(), as Derived class has only one func() that it is implementing, so it will call that function. 

      }
}
1
Jitindra Fartiyal

Nope car si vous faites quelque chose comme Base b = new Derived();, vous ne pourrez toujours pas appeler b.func (). Ce que vous faites s'appelle "se cacher".

1
crownjewel82

La méthode se cache va se passer ici au lieu de remplacer. comme ce qui se passe en cas de statique.

0
meghaM

En réalité, vous n’exprimez pas. Avant Java5 

le type de retour d'une méthode remplacée doit correspondre à la méthode de la classe parente.

Mais Java 5 a introduit une nouvelle fonctionnalité appelée type de retour covariant. Vous pouvez remplacer une méthode avec la même signature mais renvoyer une sous-classe de l’objet renvoyé. En d'autres termes, une méthode d'une sous-classe peut renvoyer un objet dont le type est une sous-classe du type renvoyé par la méthode avec la même signature dans la superclasse. vous pouvez suivre ce fil de discussion: Les méthodes remplacées peuvent-elles différer par le type de retour?

0
Praveen nani

Le membre privé de la classe de base ne peut être utilisé par personne en dehors de la classe et ne peut pas être remplacé. La fonction de la classe derive est une fonction indépendante à laquelle on peut accéder n'importe où.

Le code exécuterait la fonction dans la classe dérivée 

0
Long Mai

Comme la méthode est privée, elle n'est pas visible par les autres classes. Par conséquent, la classe dérivée n'hérite pas de cette méthode . Donc, c'est pas le cas du remplacement 

0
Rohit Goyal