La mia comprensione era che le variabili statiche e i metodi statici sono di una classe, non degli oggetti di classe. Quindi un Override
di un metodo statico non funzionerà in Java, poiché per sovrascrivere abbiamo bisogno di creare un'istanza di una classe. Ma stavo provando qualcosa oggi che contraddiceva la mia conoscenza di Java.Se i metodi statici non possono essere sovrascritti, come funziona qui (per Java)?
Si prega di seguire questo codice:
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();
}
}
L'uscita di quanto sopra implementazione è:
D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Child
Da questa uscita posso capire che anche se la classe Child
estende la classe Parent
, i doit
metodi sono individuali per ogni classe in quanto sono static
. Quindi non è consentito ignorarli.
Ora si prega di seguire il codice qui sotto, in cui viene aggiunto il metodo del bambino doIt
@Override
:
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();
}
}
L'uscita del codice di cui sopra dà un errore di compilazione come segue:
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
Eccolo dice chiaramente che l'annotazione Override
non può essere applicata nei metodi static
in quanto non vengono sovrascritti.
Ora si prega di seguire il codice qui sotto, dove Child
non ha doIt
metodo:
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();
}
}
L'output è:
D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Parent
Perché il codice di compilazione e soprattutto correre? Mi aspettavo un errore di compilazione per il metodo doit
per la classe Child, e mi aspettavo "Metodo non trovato". Non capisco.
Inoltre si prega di seguire il codice qui sotto. Qui, il metodo doIt
in Parent
è ora 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();
}
}
L'uscita dopo l'esecuzione del codice di cui sopra è il seguente:
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>
quello che mi aspettavo era che il codice di cui sopra dovrebbe funzionare bene come i metodi doit
sono statici in ogni classe, quindi, anche un La parola chiave final
non dovrebbe generare errori di compilazione in quanto il metodo è static
.
Per favore spiegami come funziona il metodo di sovrascrittura nelle classi statiche in Java.
- È possibile sovrascrivere i metodi statici? Se sì, come mai l'annotazione di
@Override
fallisce? - Se i metodi statici non possono essere sovrascritti, come mai il mio terzo blocco di codice funziona correttamente?
- Se i metodi statici non possono essere ignorati, come mai la parola chiave
final
fa la differenza?
Ben scritta domanda del giorno finora :) –