English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Por que o método estático da classe pai está escondido na classe filha no Java?

Quando temos duas classes, uma que estende a outra, se essas duas classes tiverem métodos idênticos, incluindo os parâmetros e o tipo de retorno (por exemplo, sample), o método na subclasse substituirá o método na superclasse.

isto é devido à herança. Se instanciarmos a subclasse, uma cópia dos membros da superclasse será criada no objeto da subclasse, então essas duas maneiras podem ser usadas para objetos da subclasse.

mas, se chamar o método(sample)então será executado o método sample da subclasse para sobrescrever o método da superclasse.

Exemplo

class Super{
   public static void sample(){
      System.out.println("Método da superclasse");
   }
}
public class OverridingExample extends Super {
   public static void sample(){
      System.out.println("Método da subclasse");
   }
   public static void main(String args[]){
      Super obj1 = (Super) new OverridingExample();
      OverridingExample obj2 = new OverridingExample();
      obj1.sample();
      obj2.sample();
   }
}

Resultados de saída

Método da superclasse
Método da subclasse

Sobrescrever método estático

Quando a superclasse e a subclasse contêm métodos idênticos (inclusive os parâmetros) e se eles são estáticos, o método da superclasse será ocultado pelo método da subclasse.

Este mecanismo é conhecido como "ocultação de métodos", apesar de a superclasse e a subclasse terem métodos com a mesma assinatura estática, eles não são considerados como sobrescrita.

Exemplo

class Super{
   public static void demo() {
      System.out.println("This is the main method of the superclass");
   }
}
class Sub extends Super{
   public static void demo() {
      System.out.println("Este é o método principal da subclasse");
   }
}
public class MethodHiding{
   public static void main(String args[]) {
      MethodHiding obj = new MethodHiding();
      Sub.demo();
   }
}

Resultados de saída

Este é o método principal da subclasse

Razão para ocultar métodos

A chave da sobrecarga de métodos é que, se a superclasse e a subclasse possuem métodos com a mesma assinatura, ambos estão disponíveis para objetos da subclasse. De acordo com o tipo de objeto (referência) usado para armazenar o objeto, será executado o método correspondente.

SuperClass obj1 = (Super) new SubClass();
obj1.demo() // invoca o método demo da superclasse
SubClass obj2 = new SubClass();
obj2.demo() //invoca o método demo da subclasse

Mas, no caso de métodos estáticos, pois eles não pertencem a nenhum instância, você precisa usar o nome da classe para acessá-los.

SuperClass.demo();
SubClass.Demo();

Portanto, se a superclasse e a subclasse possuem métodos estáticos com a mesma assinatura, o objeto da subclasse pode usar a cópia do método da superclasse. Como são estáticos, a chamada do método é resolvida automaticamente na compilação, portanto, os métodos estáticos não podem ser sobrepostos.

Mas, devido à capacidade de usar cópias de métodos estáticos, se você chamar um método da subclasse, ele será redefinido/Método de ocultar a superclasse.

Você também pode gostar