CodeGym /Blogue Java /Random-PT /Método Abstrato Java e Classes
John Squirrels
Nível 41
San Francisco

Método Abstrato Java e Classes

Publicado no grupo Random-PT
Os métodos abstratos são uma ferramenta poderosa de Java e fornecem a essa linguagem orientada a objetos ainda mais recursos quando se trata de polimorfismo. Um método abstrato Java pode ser usado para criar uma estrutura básica para um programa inteiro e permitir que você ajuste conforme necessário.Método Abstrato Java e Você - 1

O que é um Método Abstrato?

Um método abstrato é um método que não tem implementação. Ou seja, ele só tem uma declaração, então você sabe o nome, o tipo de retorno e as variáveis ​​que ele vai aceitar. Aqui está um exemplo de um método abstrato básico:

public abstract int example(int a1, int a2);
Quando você olha para este método, você pode dizer que ele retorna um inteiro e aceita dois inteiros como seu argumento. O que você não pode dizer é como esse método é implementado. Isso porque, para implementá-lo, você precisa substituí-lo. Ao criar um método abstrato em java, você deve seguir algumas diretrizes ou seu programa não será compilado corretamente. Lembrar:
  • Os métodos abstratos Java não têm implementação. Ou seja, eles nunca devem ser seguidos por chaves e um corpo que diga como o método deve ser usado. É apenas terminado com um ponto e vírgula.

  • Se você criar um método abstrato, ele só poderá ser colocado em uma classe abstrata. Ou seja, você não pode ter uma classe concreta que tenha um método abstrato dentro dela.
    eu. Como observação, se você tiver uma classe abstrata, ela poderá conter construtores. No entanto, ele não precisa ter um método abstrato.

  • Quando uma classe concreta estende uma classe abstrata, ela também deve implementar todos os métodos abstratos da classe pai ou não pode ser concreta e deve ser declarada abstrata.

Esses dois últimos podem ser um pouco confusos, então vamos esclarecer isso imediatamente.

Estendendo classes Java abstratas

Digamos que queremos escrever um programa sobre formas básicas que retornará perímetro e área. Portanto, criamos uma classe abstrata pai. Mas como cada forma tem suas próprias regras, cada uma deve ser calculada de forma diferente, então escrevemos a classe abstrata Shape assim:

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
Agora, se quisermos realmente usar esses métodos abstratos, temos que estender a classe pai Java abstrata Shape e então instanciar os métodos. Portanto, cada classe concreta deve implementar os métodos abstratos de área e perímetro.

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
A saída do console fica assim:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Observe que a classe Quadrilateral não precisa instanciar o construtor Shape(String name) da classe pai Shape . Isso porque não é um método abstrato. No entanto, se você implementasse apenas uma área ou perímetro em uma classe, a nova classe teria que ser abstrata porque não incluía ambos. Você também pode usar métodos abstratos em Interfaces.

Métodos Java abstratos com interfaces

Vamos revisar rapidamente o que é uma interface e como ela difere de uma classe abstrata. Em uma interface, quaisquer variáveis ​​declaradas em uma interface são públicas, estáticas e finais. As classes abstratas, por outro lado, possuem apenas variáveis ​​não finais. Tudo em uma interface é público por padrão. Uma classe abstrata pode ter private, protected, public, etc. Finalmente, uma classe não estende uma interface, ela a implementa. Antes do JDK 8, uma interface não podia conter nada além de métodos abstratos. Agora, uma interface pode ter métodos padrão e estáticos. Por causa disso, as melhores práticas deixaram de usar métodos abstratos como modelos extensíveis e focaram em Interfaces e sua implementação. Portanto, se você criar Forma como uma Interface e implementá-la como Quadrilátero, como seria? Primeiro, você teria que acabar com o construtor Shape(String name) . Ficaria assim com apenas os dois métodos abstratos:

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
Por fim, usar o novo Quadrilateral conforme ele implementa a interface Shape seria praticamente o mesmo:

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
E a impressão do console ficaria assim:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Se quiser explorar mais sobre as diferenças entre interfaces e classes abstratas, você pode encontrar mais informações aqui.

Mas por que usar métodos Java abstratos?

Existem muitas razões pelas quais métodos abstratos em Java são usados ​​e por que você deve se sentir confortável em usá-los. Aqui estão três razões rápidas pelas quais você deve usá-los quando for apropriado.
  1. Evite a duplicação de esforços – Reveja nosso exemplo de codificação; imagine que você e sua equipe precisassem criar classes para formas diferentes de um retângulo. Quantas maneiras diferentes existem que você poderia criar para projetar essa classe? Dez? Quinze? E isso é um problema simples. Imagine algo muito mais complexo. Você e sua equipe podem inventar centenas de maneiras. Então você se depararia com a difícil tarefa de entrelaçá-los em um programa coerente. Isso nos leva ao nosso próximo ponto: definir a implementação.

  2. Métodos abstratos em Java permitem a definição de uso e implementação – Quando você usa uma classe ou interface abstrata e, por design, métodos abstratos, você está definindo como outras pessoas irão interagir com sua interface. Isso permite que eles saibam quais variáveis ​​devem usar e quais tipos de retorno podem esperar.
    Embora eles possam substituí-los e criar classes concretas que implementam sua interface de maneiras exclusivas, você ainda define o uso principal do seu código. Se alguém deseja implementar o Shape, ele deve substituir ou implementar o perímetro e a área.

  3. Legibilidade e depuração – Ter métodos abstratos aumentará a legibilidade do seu código. Ao escrever uma classe que implementa uma interface, você sabe o que procurar. Você sabe que todo método abstrato na interface estará na implementação, e isso facilita a leitura e o rastreamento de quaisquer bugs. Os métodos abstratos são apenas o começo para aprender como usar corretamente o polimorfismo em Java e outras linguagens orientadas a objetos. Quando você começar a entendê-los e usá-los, um capítulo totalmente novo de sua jornada de codificação começará.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION