CodeGym /Blogue Java /Random-PT /Sobreposição de método em Java
John Squirrels
Nível 41
San Francisco

Sobreposição de método em Java

Publicado no grupo Random-PT
Oi! Você já está usando métodos Java e sabe muito sobre eles. Você provavelmente já se deparou com a situação em que uma classe tem muitos métodos com o mesmo nome, mas com parâmetros diferentes. Você deve se lembrar que nesses casos usamos sobrecarga de método. Hoje estamos considerando outra situação. Imagine que temos um único método compartilhado, mas ele deve fazer coisas diferentes em classes diferentes. Como implementamos esse comportamento? Para entender, vamos considerar uma classe pai Animal , que representa os animais, e vamos criar nela um método speak :

public class Animal {

   public void speak() {

       System.out.println("Hello!");
   }
}
Embora tenhamos acabado de começar a escrever o programa, você provavelmente vê um problema em potencial: há muitos animais no mundo e todos eles 'falam' de maneira diferente: gatos miam, patos grasnam e cobras sibilam. Como funciona a sobreposição de métodos - 2Nosso objetivo é simples: evitar criar muitos métodos de fala. Em vez de criar um método catSpeak() para miar, um método snakeSpeak() para assobiar, etc., queremos chamar o método speak()método e faça a cobra sibilar, o gato miar e o cachorro latir. Podemos facilmente conseguir isso usando substituição de método. A Wikipédia fornece a seguinte explicação do termo 'substituir': A substituição de método, na programação orientada a objetos, é um recurso de linguagem que permite que uma subclasse ou classe filha forneça uma implementação específica de um método que já é fornecido por uma de suas superclasses ou classes pai Isso é essencialmente correto. A substituição de método permite que você pegue algum método da classe pai e escreva sua própria implementação em cada classe filha. A nova implementação 'substitui' a implementação do pai na classe filha. Vamos ver como isso fica em um exemplo. Crie 4 classes que herdam nossa classe Animal :

public class Bear extends Animal {
   @Override
   public void speak() {
       System.out.println("Growl!");
   }
}
public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}


public class Snake extends Animal {

   @Override
   public void speak() {
       System.out.println("Hiss!");
   }
}
"Aqui está um pequeno macete para o futuro: para substituir os métodos da classe pai, vá para o código da classe filha no IntelliJ IDE, clique em Ctrl+O e escolha "Substituir métodos..." no menu. Acostume-se a usar teclas de atalho desde o início — isso ajudará você a escrever programas mais rapidamente! Para especificar o comportamento de que precisamos, fizemos algumas coisas:
  1. Em cada classe filha, criamos um método com o mesmo nome do método da classe pai.

  2. Dissemos ao compilador que nomear o método da mesma forma que na classe pai não era casual: queremos substituir seu comportamento. Para comunicar isso ao compilador, definimos a anotação @Override acima do método.
    Quando colocada acima de um método, a anotação @Override informa ao compilador (assim como aos programadores que leem seu código): 'Está tudo bem. Isso não é um erro. Eu não estou sendo esquecido. Estou ciente de que esse método já existe e quero substituí-lo'.

  3. Escrevemos a implementação que precisamos para cada classe filha. Quando o método speak() é chamado, uma cobra deve assobiar, um urso deve rosnar, etc.
Vamos ver como isso funciona em um programa:

public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();

       animal1.speak();
       animal2.speak();
       animal3.speak();
       animal4.speak();
   }
}
Saída do console:
Woof!
Meow!
Growl!
Hiss!
Excelente! Tudo funciona como deveria! Criamos 4 variáveis ​​de referência que armazenam objetos da classe pai Animal e atribuímos instâncias de 4 classes filhas diferentes a elas. Como resultado, cada objeto exibe seu próprio comportamento. Para cada classe filha, o método speak() substituído substituiu o método speak() 'nativo' na classe Animal (que simplesmente exibe 'Hello!'). Como funciona a sobreposição de métodos - 3A substituição tem várias limitações:
  1. O método substituído deve ter os mesmos parâmetros do método pai.

    Se o método speak da classe pai tiver um parâmetro String , o método substituído na classe filha também deverá ter um parâmetro String . Caso contrário, o compilador irá gerar um erro:

    
    public class Animal {
    
       public void speak(String s) {
    
           System.out.println("Hello! " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override // Error!
       public void speak() {
           System.out.println("Meow!");
       }
    }
    

  2. O método substituído deve ter o mesmo tipo de retorno que o método pai.

    Caso contrário, obteremos um erro do compilador:

    
    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String speak() {         // Error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }
    

  3. O modificador de acesso no método substituído também deve ser o mesmo do método 'original':

    
    public class Animal {
    	
          public void speak() {
    	
                System.out.println("Hello!");
          }
    }
    
    public class Cat extends Animal {
    
           @Override
           private void speak() {      // Error!
               System.out.println("Meow!");
           }
    }
    
A substituição de método em Java é uma maneira de implementar o polimorfismo (o princípio da OOP que descrevemos na última lição). Isso significa que sua principal vantagem é a mesma flexibilidade que discutimos anteriormente. Podemos construir um sistema simples e lógico de classes, cada uma tendo um comportamento específico (cães latem, gatos miam), com uma interface comum — um único método speak() para todos eles, em vez de vários métodos, por exemplo, dogSpeak ( ) , speakCat () , etc
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION