Classe Abstrata A abstração está associada ao grau de detalhe ou de especificação do projeto de uma classe. Superclasses estão em um nível de abstração mais alto do que as subclasses. O que, exatamente, vem a ser uma classe Funcionário? Uma empresa tem Diretores, Gerentes, Secretárias, etc. Ela é uma classe(funcionario) que apenas idealiza um tipo, define apenas um rascunho. abstract class Funcionario { protected double salario; protected String nome; public Funcionario(String nome){ this.nome = nome; salario= 1000; } public double getBonificacao() { return this.salario * 1.2; } public String toString(){ return "Funcionário: "+nome+"\nSalário: "+salario+"\n"; } } Usamos a palavra chave abstract para impedir que ela possa ser instanciada. Esse é o efeito direto de se usar o modificador abstract na declaração de uma classe: public static void main(String[] args) { Funcionario func; func = new Funcionario("João"); //ERRO – não compila!! } O código acima não compila. O problema é instanciar a classe - criar referência, você pode. Se ela não pode ser instanciada, para que serve? Somente para o polimorfismo e herança dos atributos e métodos. Vamos então herdar da superclasse Funcionario, reescrevendo o método getBonificacao() na subclasse Gerente: Subclasse: Gerente.java public class Gerente extends Funcionario{ public Gerente(String nome) { super(nome); } public double getBonificacao() { return this.salario * 1.2; } } Métodos Abstratos Obriga a sua implementação na subclasse(observe a subclasse Gerente). Superclasse: Funcionario.java abstract class Funcionario { protected double salario; protected String nome; public Funcionario(String nome){ this.nome = nome; salario= 1000; } public abstract double getBonificacao(); public String toString(){ return "Funcionário: "+nome+"\nSalário: "+salario+"\n"; } } Observações: • Uma classe abstrata não pode ser instanciada; • A subclasse deve implementar todos os métodos abstratos; • Uma classe abstrata pode conter métodos não abstratos; • Caso a subclasse não implemente todos os métodos abstratos então ela também será considerada abstrata. Crie a superclasse Funcionario, sublcasse Gerente e a classe TestaAbstract definida abaixo: Classe: TestaAbstract.java public class TestaAbstract { public static void main(String[] args) { Funcionario func; Gerente g; //func = new Funcionario("João"); //ERRO – não compila!! g = new Gerente("João"); System.out.print(g.toString()); System.out.println(g.getBonificacao()); } }