Java - Abstração
De acordo com o dicionário, abstração é a qualidade de lidar com ideias ao invés de eventos. Por exemplo, quando você considera o caso do e-mail, detalhes complexos como o que acontece assim que você envia um e-mail, o protocolo que seu servidor de e-mail usa ficam ocultos ao usuário. Portanto, para enviar um e-mail basta digitar o conteúdo, mencionar o endereço do destinatário e clicar em enviar.
Da mesma forma na programação orientada a objetos, a abstração é um processo de ocultar os detalhes da implementação do usuário, apenas a funcionalidade será fornecida ao usuário. Em outras palavras, o usuário terá a informação sobre o que o objeto faz ao invés de como ele faz.
Em Java, a abstração é obtida usando classes e interfaces abstratas.
Aula Abstrata
Uma classe que contém o abstrato palavra-chave em sua declaração é conhecida como classe abstrata.
-
Classes abstratas podem ou não conter métodos abstratos , ou seja, métodos sem corpo ( public void get(); )
-
Mas, se uma classe tem pelo menos um método abstrato, então a classe deve ser declarado abstrato.
-
Se uma classe for declarada abstrata, ela não poderá ser instanciada.
-
Para usar uma classe abstrata, você precisa herdá-la de outra classe, fornecer implementações para os métodos abstratos nela.
-
Se você herdar uma classe abstrata, precisará fornecer implementações para todos os métodos abstratos nela.
Exemplo
Esta seção fornece um exemplo da classe abstrata. Para criar uma classe abstrata, basta usar o abstract palavra-chave antes da palavra-chave class, na declaração de classe.
/* File name : Employee.java */ public abstract class Employee { private String name; private String address; private int number; public Employee(String name, String address, int number) { System.out.println("Constructing an Employee"); this.name = name; this.address = address; this.number = number; } public double computePay() { System.out.println("Inside Employee computePay"); return 0.0; } public void mailCheck() { System.out.println("Mailing a check to " + this.name + " " + this.address); } public String toString() { return name + " " + address + " " + number; } public String getName() { return name; } public String getAddress() { return address; } public void setAddress(String newAddress) { address = newAddress; } public int getNumber() { return number; } }
Você pode observar que, exceto os métodos abstratos, a classe Employee é a mesma que a classe normal em Java. A classe agora é abstrata, mas ainda possui três campos, sete métodos e um construtor.
Agora você pode tentar instanciar a classe Employee da seguinte maneira -
/* File name : AbstractDemo.java */ public class AbstractDemo { public static void main(String [] args) { /* Following is not allowed and would raise error */ Employee e = new Employee("George W.", "Houston, TX", 43); System.out.println("\n Call mailCheck using Employee reference--"); e.mailCheck(); } }
Quando você compila a classe acima, ela dá o seguinte erro -
Employee.java:46: Employee is abstract; cannot be instantiated Employee e = new Employee("George W.", "Houston, TX", 43); ^ 1 error
Herdar a classe abstrata
Podemos herdar as propriedades da classe Employee assim como a classe concreta da seguinte maneira -
Exemplo
/* File name : Salary.java */ public class Salary extends Employee { private double salary; // Annual salary public Salary(String name, String address, int number, double salary) { super(name, address, number); setSalary(salary); } public void mailCheck() { System.out.println("Within mailCheck of Salary class "); System.out.println("Mailing check to " + getName() + " with salary " + salary); } public double getSalary() { return salary; } public void setSalary(double newSalary) { if(newSalary >= 0.0) { salary = newSalary; } } public double computePay() { System.out.println("Computing salary pay for " + getName()); return salary/52; } }
Aqui, você não pode instanciar a classe Employee, mas pode instanciar a classe Salary, e usando esta instância você pode acessar todos os três campos e sete métodos da classe Employee conforme mostrado abaixo.
/* File name : AbstractDemo.java */ public class AbstractDemo { public static void main(String [] args) { Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00); Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00); System.out.println("Call mailCheck using Salary reference --"); s.mailCheck(); System.out.println("\n Call mailCheck using Employee reference--"); e.mailCheck(); } }
Isso produz o seguinte resultado -
Saída
Constructing an Employee Constructing an Employee Call mailCheck using Salary reference -- Within mailCheck of Salary class Mailing check to Mohd Mohtashim with salary 3600.0 Call mailCheck using Employee reference-- Within mailCheck of Salary class Mailing check to John Adams with salary 2400.0
Métodos abstratos
Se você deseja que uma classe contenha um método específico, mas deseja que a implementação real desse método seja determinada por classes filhas, você pode declarar o método na classe pai como abstrato.
-
resumo A palavra-chave é usada para declarar o método como abstrato.
-
Você tem que colocar o abstrato palavra-chave antes do nome do método na declaração do método.
-
Um método abstrato contém uma assinatura de método, mas nenhum corpo de método.
-
Em vez de chaves, um método abstrato terá um ponto e vírgula (;) no final.
A seguir está um exemplo do método abstrato.
Exemplo
public abstract class Employee { private String name; private String address; private int number; public abstract double computePay(); // Remainder of class definition }
Declarar um método como abstrato tem duas consequências –
-
A classe que o contém deve ser declarada como abstrata.
-
Qualquer classe que herda a classe atual deve substituir o método abstrato ou declarar-se como abstrata.
Observação − Eventualmente, uma classe descendente deve implementar o método abstrato; caso contrário, você teria uma hierarquia de classes abstratas que não podem ser instanciadas.
Suponha que a classe Salary herde a classe Employee, então ela deve implementar o computePay() método como mostrado abaixo -
/* File name : Salary.java */ public class Salary extends Employee { private double salary; // Annual salary public double computePay() { System.out.println("Computing salary pay for " + getName()); return salary/52; } // Remainder of class definition }
Java