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?

questionAnswers(3)

yourAnswerToTheQuestion