it-swarm.com.de

Kann eine private Methode in der Superklasse in der Unterklasse überschrieben werden?

Können private Methoden in Java überschrieben werden? Wenn nein, wie funktioniert der folgende Code?

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

Nein, Sie überschreiben es nicht. Sie können dies überprüfen, indem Sie versuchen, es mit @Override zu markieren, oder indem Sie versuchen, super.func(); anzurufen. Beide funktionieren nicht. Sie werfen Compiler-Fehler.

Überprüfen Sie außerdem Folgendes:

klasse Basis {
 private void func () {
 System.out.println ("In base func method"); 
 }; 
 public void func2 () {
 System.out.println ("func2"); 
 func (); 
 } 
} 

 Klasse Abgeleitet erweitert Base {
 public void func () {// Ist dies eine überschreibende Methode? 
 System.out.println ("Methode der abgeleiteten Klasse"); 
 } 
} 

 Klasse InheritDemo {
 public static void main (String [] args) {
 Abgeleitete D = neue Abgeleitete (); 
 D.f2 (); 
 } 
} 

Es wird gedruckt:

func2
In base func method

Wenn Sie func() in Base in public ändern, wird dann eine Überschreibung, und die Ausgabe ändert sich in:

func2
In Derived Class func method
46
Polygnome

Nein, eine private Methode kann nicht überschrieben werden, da sie von keiner anderen Klasse sichtbar ist. Sie haben eine neue Methode für Ihre Unterklasse deklariert, die keinen Bezug zur Superklassenmethode hat. Eine Möglichkeit, es zu betrachten, ist die Frage, ob es legal ist, super.func() in der abgeleiteten Klasse zu schreiben. Es gibt keine Möglichkeit, dass eine übergeordnete Methode vom Zugriff auf die Methode, die sie überschreibt, verboten wird. Dies wäre jedoch genau hier der Fall.

19
Marko Topolnik

Nein ist es nicht. Sie können eine Außerkraftsetzung markieren, um Folgendes sicherzustellen:

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

In diesem Fall wäre es ein Compiler-Fehler.

3
Doorknob

Du überschreibst nicht. Sie können private Mitglieder nicht überschreiben, Sie definieren lediglich eine neue Methode in Derived. Abgeleitet hat keine Kenntnis der Implementierung von func() durch Base, da diese als privat deklariert wurde. Sie erhalten keinen Compiler-Fehler, wenn Sie func() in Derived definieren. Dies ist jedoch darauf zurückzuführen, dass Derived nicht weiß, dass Base eine Implementierung von func() hat. Um es klar zu sagen: Es wäre falsch zu sagen, dass Sie die Implementierung von func() durch Base überschreiben.

3
Ian Dallas

Beachten Sie neben der bereits richtigen Antwort Folgendes:

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();
    }
}

Dies wird gedruckt 

EIN

EIN

EIN

obwohl B "überschreibt" getStuff(). Die As-Implementierung von doStuff() ist auf den Aufruf von A#getStuff() festgelegt.

2
daniu

Eine private Methode kann niemals überfahren werden. Es ist immer versteckt. 

In Ihrem Beispiel hat die abgeleitete Klasse eine private übergeordnete Klassenmethode und ihre eigene Funktion func . Beide sind unterschiedlich und die Funktion ist nicht überfahren. Es ist eine separate unabhängige Funktion.

Wenn Sie eine neue Funktion in übergeordneter Klasse erstellen, die die übergeordnete Klassenfunktion aufruft, wird das übergeordnete func aufgerufen, wenn die übergeordnete Klassenreferenz im Gegensatz zur Methode über Ridding verwendet wird

Hinweis : Ein Objekt definiert die Mitglieder, die es hat, und eine Referenz definiert, auf welche es zugreifen kann 

// Methode Überschreibungsfall 

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

Nein, denn wenn Sie etwas wie Base b = new Derived(); tun, können Sie b.func () immer noch nicht aufrufen. Was Sie tun, wird "Verstecken" genannt.

1
crownjewel82

Das Verstecken von Methoden wird hier statt überschreiben. wie bei statischen.

0
meghaM

Eigentlich überschreiben Sie nicht. Vor Java5 

der Rückgabetyp einer überschriebenen Methode muss mit der Methode der übergeordneten Klasse übereinstimmen.

Java 5 hat jedoch eine neue Funktion namens covariant return type eingeführt. Sie können eine Methode mit derselben Signatur überschreiben, gibt jedoch eine Unterklasse des zurückgegebenen Objekts zurück. Mit anderen Worten, eine Methode in einer Unterklasse kann ein Objekt zurückgeben, dessen Typ eine Unterklasse des Typs ist, der von der Methode mit der gleichen Signatur in der Oberklasse zurückgegeben wird. Sie können diesem Thread folgen: Können sich überschriebene Methoden im Rückgabetyp unterscheiden?

0
Praveen nani

Das private Mitglied der Basisklasse kann nicht von Personen außerhalb der Klasse aufgerufen und nicht überschrieben werden. Die Funktion in der abgeleiteten Klasse ist eine unabhängige Funktion, auf die von überall her zugegriffen werden kann.

Der Code würde die Funktion in der abgeleiteten Klasse ausführen 

0
Long Mai

Da die Methode privat ist, ist sie für die anderen Klassen nicht sichtbar. In diesem Fall erbt die abgeleitete Klasse diese Methode nicht. Dies ist nicht der Fall des Überschreibens 

0
Rohit Goyal