J'avais compris que les variables statiques et les méthodes statiques appartiennent à une classe, et non aux objets de la classe. Ainsi, une Override
d'une méthode statique ne fonctionnera pas en Java, car pour remplacer une méthode statique, il faut créer une instance d'une classe. Mais j'ai essayé quelque chose aujourd'hui qui contredisait mes connaissances de Java.
Veuillez suivre ce code :
class Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Parent ");
}
}
class Child extends Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Child ");
}
}
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
La sortie de l'implémentation ci-dessus est :
D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Child
À partir de ce résultat, je peux comprendre que, bien que le Child
étend la classe Parent
la classe doit
Les méthodes sont individuelles à chaque classe car elles sont static
. Il n'est donc pas possible de les remplacer.
Maintenant, veuillez suivre le code ci-dessous, où @Override
est ajouté à l'image de l'enfant doIt
méthode :
class Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Parent ");
}
}
class Child extends Parent{
@Override // Adding this annotation here
public static void doIt(){
System.out.println("In static method 'doit' of class Child ");
}
}
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
La sortie du code ci-dessus donne une erreur de compilation comme suit :
D:\Rahul Shivsharan\MyPractise\JAVA>javac StaticPractise.java
StaticPractise.java:31: error: method does not override or implement a method from a supertype
@Override
^
1 error
Ici, il est clairement dit que l'annotation Override
ne peut pas être appliqué dans static
car elles ne sont pas remplacées.
Maintenant, veuillez suivre le code ci-dessous, où Child
n'a pas doIt
méthode :
class Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Parent ");
}
}
class Child extends Parent{ /* no doIt method */ }
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
La sortie est :
D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Parent
Pourquoi le code ci-dessus compile-t-il et s'exécute-t-il ? Je m'attendais à une erreur de compilation pour la méthode doit
pour la classe Child, et je m'attendais à "Method not found". Je ne comprends pas.
Veuillez également suivre le code ci-dessous. Ici, le doIt
méthode dans Parent
est maintenant final
.
class Parent{
public static final void doIt(){ // now final
System.out.println("In static method 'doit' of class Parent ");
}
}
class Child extends Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Parent ");
}
}
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
Le résultat après l'exécution du code ci-dessus est le suivant :
D:\Rahul Shivsharan\MyPractise\JAVA>javac StaticPractise.java
StaticPractise.java:30: error: doIt() in Child cannot override doIt() in Parent
public static void doIt(){
^
overridden method is static,final
1 error
D:\Rahul Shivsharan\MyPractise\JAVA>
Ce à quoi je m'attendais, c'est que le code ci-dessus fonctionne parfaitement comme le code d'accès à l'Internet. doit
sont statiques dans chaque classe, de sorte que même une classe final
ne devrait pas provoquer d'erreur de compilation car la méthode est static
.
Veuillez m'expliquer comment le remplacement des méthodes fonctionne dans les classes statiques en Java.
- Les méthodes statiques peuvent-elles être surchargées ? Si oui, alors comment se fait-il que l'annotation
@Override
échoue ? - Si les méthodes statiques ne peuvent pas être surchargées, alors comment se fait-il que mon troisième bloc de code fonctionne bien ?
- Si les méthodes statiques ne peuvent pas être surchargées, alors comment se fait-il que l'option
final
mot-clé fait une différence ?
3 votes
Question du jour bien écrite jusqu'à présent :)