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();
}
}
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
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.
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.
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.
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()
. A
s l'implémentation de doStuff()
est fixée à l'appel de A#getStuff()
, aucun polymorphisme ne sera déclenché.
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.
}
}
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".
La méthode se cache va se passer ici au lieu de remplacer. comme ce qui se passe en cas de statique.
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?
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
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