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