Se métodos estáticos não podem ser substituídos, como está funcionando aqui (para Java)?
Meu entendimento era que variáveis estáticas e métodos estáticos são de uma classe, não dos objetos de classe. Então umOverride
de um método estático não funcionará em Java, pois, para substituir, precisamos que uma instância de uma classe seja criada. Mas eu estava tentando algo hoje que contradiz meu conhecimento de Java.
Por favor, siga este código:
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();
}
}
O resultado da implementação acima é:
D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Child
A partir desta saída, posso entender que, embora oChild
classe estende oParent
classe, odoit
métodos são individuais para cada classe, pois sãostatic
. Portanto, nenhuma substituição deles é permitida.
Agora, siga o código abaixo, onde@Override
é adicionado à criançadoIt
método:
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();
}
}
A saída do código acima fornece um erro de compilação da seguinte maneira:
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
Aqui diz claramente que a anotaçãoOverride
não pode ser aplicado emstatic
métodos, pois eles não estão sendo substituídos.
Agora, siga o código abaixo, ondeChild
não temdoIt
método:
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();
}
}
A saída é:
D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Parent
Por que o código acima compila e executa? Eu estava esperando um erro de compilação para o métododoit
para a classe Child, e eu estava esperando "Método não encontrado". Eu não entendo
Siga também o código abaixo. Aqui odoIt
método emParent
é agorafinal
.
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();
}
}
A saída após a execução do código acima é a seguinte:
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>
O que eu esperava era que o código acima funcionasse bem como odoit
métodos são estáticos em cada classe, portanto, mesmo umfinal
A palavra-chave não deve cometer nenhum erro de compilação, pois o método éstatic
.
Por favor, explique-me como a substituição de método funciona em classes estáticas em Java.
Métodos estáticos podem ser substituídos? Se sim, então como é possível fazer anotações@Override
falha?Se métodos estáticos não podem ser substituídos, como o meu terceiro bloco de código funciona bem?Se métodos estáticos não puderem ser substituídos, como é que osfinal
palavra-chave faz a diferença?