SlideShare uma empresa Scribd logo
CURSO JAVA E ORIENTAÇÃO A OBJETOS > APOSTILA > CAPITULO 10
CLASSES ABSTRATAS
"Dá-se importância aos antepassados quando já não temos
nenhum." -- François Chateaubriand
Ao término desse capítulo, você será capaz de utilizar classes
abstratas, quando necessário.
Repetindo mais código?
Vamos recordar em como pode estar nossa classe Funcionario:
public class Funcionario {
protected String nome;
protected String cpf;
protected double salario;
public double getBoni cacao() {
return this.salario * 1.2;
}
// outros métodos aqui
}
Considere o nosso ControleDeBoni cacao:
public class ControleDeBoni cacoes {
private double totalDeBoni cacoes = 0;
public void registra(Funcionario f) {
System.out.println("Adicionando boni cação do funcionario: " + f);
this.totalDeBoni cacoes += f.getBoni cacao();
}
public double getTotalDeBoni cacoes() {
return this.totalDeBoni cacoes;
}
}
Nosso método registra recebe qualquer referência do tipo
Funcionario, isto é, podem ser objetos do tipo Funcionario e
qualquer de seus subtipos: Gerente, Diretor e, eventualmente,
alguma nova subclasse que venha ser escrita, sem prévio
conhecimento do autor da ControleDeBoni cacao.
Estamos utilizando aqui a classe Funcionario para o
polimorfismo. Se não fosse ela, teríamos um grande prejuízo:
precisaríamos criar um método registra para receber cada um
dos tipos de Funcionario, um para Gerente, um para Diretor,
etc. Repare que perder esse poder é muito pior do que a pequena
vantagem que a herança traz em herdar código.
Porém, em alguns sistemas, como é o nosso caso, usamos uma
classe com apenas esses intuitos: de economizar um pouco
código e ganhar polimorfismo para criar métodos mais genéricos,
que se encaixem a diversos objetos.
Faz sentido ter uma referência do tipo Funcionario? Essa
pergunta é diferente de saber se faz sentido ter um objeto do tipo
Funcionario: nesse caso, faz sim e é muito útil.
Referenciando Funcionario temos o polimorfismo de referência,
já que podemos receber qualquer objeto que seja um
Funcionario. Porém, dar new em Funcionario pode não fazer
sentido, isto é, não queremos receber um objeto do tipo
Funcionario, mas sim que aquela referência seja ou um
Gerente, ou um Diretor, etc. Algo mais concreto que um
Funcionario.
ControleDeBoni cacoes cdb = new ControleDeBoni cacoes();
Funcionario f = new Funcionario();
cdb.adiciona(f); // faz sentido?
Vejamos um outro caso em que não faz sentido ter um objeto
daquele tipo, apesar da classe existir: imagine a classe Pessoa e
duas filhas, PessoaFisica e PessoaJuridica. Quando puxamos
um relatório de nossos clientes (uma array de Pessoa por
exemplo), queremos que cada um deles seja ou uma
PessoaFisica, ou uma PessoaJuridica. A classe Pessoa, nesse
caso, estaria sendo usada apenas para ganhar o polimorfismo e
herdar algumas coisas: não faz sentido permitir instanciá-la.
Para resolver esses problemas, temos as classes abstratas.
Classe abstrata
Classe abstrata
O que, exatamente, vem a ser a nossa classe Funcionario? Nossa
empresa tem apenas Diretores, Gerentes, Secretárias, etc. Ela
Ela
é uma classe que apenas idealiza um tipo, define apenas um
é uma classe que apenas idealiza um tipo, define apenas um
rascunho.
rascunho.
Para o nosso sistema, é inadmissível que um objeto seja apenas
Para o nosso sistema, é inadmissível que um objeto seja apenas
do tipo
do tipo Funcionario
Funcionario (pode existir um sistema em que faça
(pode existir um sistema em que faça
sentido ter objetos do tipo
sentido ter objetos do tipo Funcionario
Funcionario ou apenas
ou apenas Pessoa
Pessoa, mas,
, mas,
no nosso caso, não).
no nosso caso, não).
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 abstract class Funcionario {
protected double salario;
public double getBoni cacao() {
return this.salario * 1.2;
}
// outros atributos e métodos comuns a todos Funcionarios
}
E, no meio de um código:
Funcionario f = new Funcionario(); // 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? Serve para o polimorfismo e herança dos atributos e
métodos, que são recursos muito poderosos, como já vimos.
Vamos então herdar dessa classe, reescrevendo o método
getBoni cacao:
public class Gerente extends Funcionario {
public double getBoni cacao() {
return this.salario * 1.4 + 1000;
}
}
Mas qual é a real vantagem de uma classe abstrata? Poderíamos
ter feito isto com uma herança comum. Por enquanto, a única
diferença é que não podemos instanciar um objeto do tipo
Funcionario, que já é de grande valia, dando mais consistência
ao sistema.
Fique claro que a nossa decisão de transformar Funcionario em
uma classe abstrata dependeu do nosso domínio. Pode ser que,
em um sistema com classes similares, faça sentido que uma
classe análoga a Funcionario seja concreta.
SEUS LIVROS DE TECNOLOGIA PARECEM DO SÉCULO
PASSADO?
Conheça a Casa do Código, uma nova editora, com
autores de destaque no mercado, foco em ebooks
(PDF, epub, mobi), preços imbatíveis e assuntos
atuais.
Com a curadoria da Caelum e excelentes autores, é
uma abordagem diferente para livros de tecnologia no
Brasil. Conheça os títulos e a nova proposta, você vai
gostar.
Casa do Código, livros para o programador
Métodos abstratos
Se o método getBoni cacao não fosse reescrito, ele seria
herdado da classe mãe, fazendo com que devolvesse o salário
mais 20%.
Levando em consideração que cada funcionário em nosso sistema
tem uma regra totalmente diferente para ser bonificado, faz
algum sentido ter esse método na classe Funcionario? Será que
existe uma bonificação padrão para todo tipo de Funcionario?
Parece que não, cada classe filha terá um método diferente de
bonificação pois, de acordo com nosso sistema, não existe uma
regra geral: queremos que cada pessoa que escreve a classe de
um Funcionario diferente (subclasses de Funcionario)
reescreva o método getBoni cacao de acordo com as suas
regras.
Poderíamos, então, jogar fora esse método da classe
Funcionario? O problema é que, se ele não existisse, não
poderíamos chamar o método apenas com uma referência a um
Funcionario, pois ninguém garante que essa referência aponta
para um objeto que possui esse método. Será que então devemos
retornar um código, como um número negativo? Isso não resolve
o problema: se esquecermos de reescrever esse método, teremos
dados errados sendo utilizados como bônus.
Existe um recurso em Java que, em uma classe abstrata,
podemos escrever que determinado método será sempre escrito
pelas classes filhas. Isto é, um método abstrato.
Ele indica que todas as classes filhas (concretas, isto é, que não
forem abstratas) devem reescrever esse método ou não
compilarão. É como se você herdasse a responsabilidade de ter
aquele método.
Como declarar um método abstrato
Às vezes, não fica claro como declarar um método abstrato.
Basta escrever a palavra chave abstract na assinatura do
mesmo e colocar um ponto e vírgula em vez de abre e fecha
chaves!
public abstract class Funcionario {
public abstract double getBoni cacao();
// outros atributos e métodos
}
Repare que não colocamos o corpo do método e usamos a palavra
chave abstract para definir o mesmo. Por que não colocar corpo
algum? Porque esse método nunca vai ser chamado, sempre que
alguém chamar o método getBoni cacao, vai cair em uma das
suas filhas, que realmente escreveram o método.
Qualquer classe que estender a classe Funcionario será obrigada
a reescrever este método, tornando-o "concreto". Se não
reescreverem esse método, um erro de compilação ocorrerá.
O método do ControleDeBoni cacao estava assim:
public void registra(Funcionario f) {
System.out.println("Adicionando boni cação do funcionario: " + f);
this.totalDeBoni cacoes += f.getBoni cacao();
}
Como posso acessar o método getBoni cacao se ele não existe
na classe Funcionario?
Já que o método é abstrato, com certeza suas subclasses têm
esse método, o que garante que essa invocação de método não vai
falhar. Basta pensar que uma referência do tipo Funcionario
nunca aponta para um objeto que não tem o método
getBoni cacao, pois não é possível instanciar uma classe
abstrata, apenas as concretas. Um método abstrato obriga a
classe em que ele se encontra ser abstrata, o que garante a
coerência do código acima compilar.
Aumentando o exemplo
E se, no nosso exemplo de empresa, tivéssemos o seguinte
diagrama de classes com os seguintes métodos:
Ou seja, tenho a classe abstrata Funcionario, com o método
abstrato getBoni cacao; as classes Gerente e Presidente
estendendo Funcionario e implementando o método
getBoni cacao; e, por fim, a classe Diretor, que estende
Gerente, mas não implementa o método getBoni cacao.
Essas classes vão compilar? Vão rodar?
A resposta é sim. E, além de tudo, farão exatamente o que nós
queremos, pois, quando Gerente e Presidente possuem os
métodos perfeitamente implementados, a classe Diretor, que
não possui o método implementado, vai usar a implementação
herdada de Gerente.
E esse diagrama, no qual incluímos uma classe abstrata
Secretaria sem o método getBoni cacao, que é estendida por
mais duas classes (SecretariaAdministrativa,
SecretariaAgencia) que, por sua vez, implementam o método
getBoni cacao, vai compilar? Vai rodar?
De novo, a resposta é sim, pois Secretaria é uma classe abstrata
e, por isso, o Java tem certeza de que ninguém vai conseguir
instanciá-la e, muito menos, chamar o método getBoni cacao
dela. Lembrando que, nesse caso, não precisamos nem ao menos
escrever o método abstrato getBoni cacao na classe Secretaria.
Se eu não reescrever um método abstrato da minha classe mãe, o
código não compilará. Mas posso, em vez disso, declarar a classe
como abstrata!
java.io
Classes abstratas não possuem nenhum segredo no
aprendizado, mas quem está aprendendo orientação a
objetos pode ter uma enorme dificuldade para saber quando
utilizá-las, o que é muito normal.
Estudaremos o pacote java.io, que usa bastantes classes
abstratas, sendo um exemplo real de uso desse recurso, que
vai melhorar o entendimento delas. (classe InputStream e
suas filhas)
Para saber mais...
Uma classe que estende uma classe normal também pode ser
abstrata! Ela não poderá ser instanciada, mas sua classe pai sim!
Uma classe abstrata não precisa necessariamente ter um método
abstrato.
AGORA É A MELHOR HORA DE APRENDER ALGO NOVO
Se você gosta de estudar essa apostila aberta da Caelum,
certamente vai gostar dos cursos online que lançamos
na plataforma Alura. Você estuda a qualquer momento
com a qualidade Caelum.
Conheça a Alura
Exercícios: Classes Abstratas
Repare que a nossa classe Conta é uma excelente candidata para
uma classe abstrata. Por quê? Que métodos seriam interessantes
candidatos a serem abstratos?
Transforme a classe Conta em abstrata:
public abstract class Conta {
// ...
}
Como a classe Conta agora é abstrata, não conseguimos dar
new nela mais. Se não podemos dar new em Conta, qual é a
utilidade de ter um método que recebe uma referência a Conta
como argumento? Aliás, posso ter isso?
Apenas para entender melhor o abstract, comente o método
getTipo() da ContaPoupanca, dessa forma ele herdará o
método diretamente de Conta.
Transforme o método getTipo() da classe Conta em abstrato.
Repare que, ao colocar a palavra chave abstract ao lado do
método, o Eclipse rapidamente vai sugerir que você deve remover
o corpo (body) do método com um quick fix.
Sua classe Conta deve ficar parecida com:
public abstract class Conta {
// atributos e métodos que já existiam
public abstract String getTipo();
}
Qual é o problema com a classe ContaPoupanca?
Descomente o método getTipo na classe ContaPoupanca, e se
necessário altere-o para que a classe possa compilar
normalmente.
(opcional) Existe outra maneira de a classe ContaPoupanca
compilar se você não reescrever o método abstrato?
(opcional) Pra que ter o método getTipo na classe Conta se ele
não faz nada? O que acontece se simplesmente apagarmos esse
método da classe Conta e deixarmos o método getTipo nas
filhas?
(opcional) Posso chamar um método abstrato de dentro de um
outro método da própria classe abstrata? Por exemplo, imagine
que exista o seguinte método na classe Conta:
public String recuperaDadosParaImpressao() {
String dados = "Titular: " + this.titular;
dados += "nNúmero: " + this.numero;
dados += "nAgência: " + this.agencia;
dados += "nSaldo: R$" + this.saldo;
return dados;
}
Podemos invocar o getTipo dentro deste método? Algo como:
dados += "nTipo: " + this.getTipo();
CAPÍTULO ANTERIOR
Herança, reescrita e polimor smo
PRÓXIMO CAPITULO
Interfaces
CURSOS E TURMAS
CATÁLOGO DE CURSOS
APOSTILAS
PARA EMPRESAS
SOBRE NÓS
EQUIPE
CONTATO
RECEBA NOVIDADES
exemplo@email.com OK
Caelum. Escola de Tecnologia. Cursos online ao vivo.

Mais conteúdo relacionado

Mais procurados

Celery의 빛과 그림자
Celery의 빛과 그림자Celery의 빛과 그림자
Celery의 빛과 그림자
Minyoung Jeong
 
As vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projetoAs vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projeto
Gabriel Galdino
 
Command Pattern
Command PatternCommand Pattern
Command Pattern
Geoff Burns
 
Part 5 - Tipe Data-Variabel-Konstanta-Operator-di-VB-NET
Part 5 - Tipe Data-Variabel-Konstanta-Operator-di-VB-NETPart 5 - Tipe Data-Variabel-Konstanta-Operator-di-VB-NET
Part 5 - Tipe Data-Variabel-Konstanta-Operator-di-VB-NET
Rolly Yesputra
 
Classes abstratas e interfaces
Classes abstratas e interfacesClasses abstratas e interfaces
Classes abstratas e interfaces
Nécio de Lima Veras
 
[PBO] Pertemuan 3 - Pengenalan Pemrograman Berbasis Objek
[PBO] Pertemuan 3 - Pengenalan Pemrograman Berbasis Objek[PBO] Pertemuan 3 - Pengenalan Pemrograman Berbasis Objek
[PBO] Pertemuan 3 - Pengenalan Pemrograman Berbasis Objek
rizki adam kurniawan
 
CSS Layouting #5 : Position
CSS Layouting #5 : PositionCSS Layouting #5 : Position
CSS Layouting #5 : Position
Sandhika Galih
 
Android Fragment
Android FragmentAndroid Fragment
Android Fragment
Kan-Han (John) Lu
 
[PBO] Pertemuan 13 - Membuat Aplikasi Desktop dengan JDBC DAO MVC
[PBO] Pertemuan 13 - Membuat Aplikasi Desktop dengan JDBC DAO MVC[PBO] Pertemuan 13 - Membuat Aplikasi Desktop dengan JDBC DAO MVC
[PBO] Pertemuan 13 - Membuat Aplikasi Desktop dengan JDBC DAO MVC
rizki adam kurniawan
 
Java script aula 06 - dom
Java script   aula 06 - domJava script   aula 06 - dom
Java script aula 06 - dom
Cristiano Pires Martins
 
Java: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acessoJava: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acesso
Arthur Emanuel
 
Aps caso uso
Aps caso usoAps caso uso
Uml diagrama de sequencia
Uml diagrama de sequenciaUml diagrama de sequencia
Uml diagrama de sequencia
Italo Costa
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
Luciano Ramalho
 
[RPL2] Activity Diagram
[RPL2] Activity Diagram[RPL2] Activity Diagram
[RPL2] Activity Diagram
rizki adam kurniawan
 
Proxy Pattern
Proxy PatternProxy Pattern
Proxy Pattern
Hüseyin Ergin
 
옥트리의 구축
옥트리의 구축옥트리의 구축
옥트리의 구축sj k
 
Banco de Dados II: Aspectos de Segurança em Banco de Dados (aula 13)
Banco de Dados II: Aspectos de Segurança em Banco de Dados (aula 13)Banco de Dados II: Aspectos de Segurança em Banco de Dados (aula 13)
Banco de Dados II: Aspectos de Segurança em Banco de Dados (aula 13)
Gustavo Zimmermann
 
Aula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de AtividadeAula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de Atividade
Alberto Simões
 
Kelompok 8 - Demo implementasi Role & Privilege pada Database Oracle & my SQL
Kelompok 8 - Demo implementasi Role & Privilege pada Database Oracle & my SQLKelompok 8 - Demo implementasi Role & Privilege pada Database Oracle & my SQL
Kelompok 8 - Demo implementasi Role & Privilege pada Database Oracle & my SQL
Dejiko Chaem
 

Mais procurados (20)

Celery의 빛과 그림자
Celery의 빛과 그림자Celery의 빛과 그림자
Celery의 빛과 그림자
 
As vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projetoAs vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projeto
 
Command Pattern
Command PatternCommand Pattern
Command Pattern
 
Part 5 - Tipe Data-Variabel-Konstanta-Operator-di-VB-NET
Part 5 - Tipe Data-Variabel-Konstanta-Operator-di-VB-NETPart 5 - Tipe Data-Variabel-Konstanta-Operator-di-VB-NET
Part 5 - Tipe Data-Variabel-Konstanta-Operator-di-VB-NET
 
Classes abstratas e interfaces
Classes abstratas e interfacesClasses abstratas e interfaces
Classes abstratas e interfaces
 
[PBO] Pertemuan 3 - Pengenalan Pemrograman Berbasis Objek
[PBO] Pertemuan 3 - Pengenalan Pemrograman Berbasis Objek[PBO] Pertemuan 3 - Pengenalan Pemrograman Berbasis Objek
[PBO] Pertemuan 3 - Pengenalan Pemrograman Berbasis Objek
 
CSS Layouting #5 : Position
CSS Layouting #5 : PositionCSS Layouting #5 : Position
CSS Layouting #5 : Position
 
Android Fragment
Android FragmentAndroid Fragment
Android Fragment
 
[PBO] Pertemuan 13 - Membuat Aplikasi Desktop dengan JDBC DAO MVC
[PBO] Pertemuan 13 - Membuat Aplikasi Desktop dengan JDBC DAO MVC[PBO] Pertemuan 13 - Membuat Aplikasi Desktop dengan JDBC DAO MVC
[PBO] Pertemuan 13 - Membuat Aplikasi Desktop dengan JDBC DAO MVC
 
Java script aula 06 - dom
Java script   aula 06 - domJava script   aula 06 - dom
Java script aula 06 - dom
 
Java: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acessoJava: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acesso
 
Aps caso uso
Aps caso usoAps caso uso
Aps caso uso
 
Uml diagrama de sequencia
Uml diagrama de sequenciaUml diagrama de sequencia
Uml diagrama de sequencia
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
[RPL2] Activity Diagram
[RPL2] Activity Diagram[RPL2] Activity Diagram
[RPL2] Activity Diagram
 
Proxy Pattern
Proxy PatternProxy Pattern
Proxy Pattern
 
옥트리의 구축
옥트리의 구축옥트리의 구축
옥트리의 구축
 
Banco de Dados II: Aspectos de Segurança em Banco de Dados (aula 13)
Banco de Dados II: Aspectos de Segurança em Banco de Dados (aula 13)Banco de Dados II: Aspectos de Segurança em Banco de Dados (aula 13)
Banco de Dados II: Aspectos de Segurança em Banco de Dados (aula 13)
 
Aula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de AtividadeAula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de Atividade
 
Kelompok 8 - Demo implementasi Role & Privilege pada Database Oracle & my SQL
Kelompok 8 - Demo implementasi Role & Privilege pada Database Oracle & my SQLKelompok 8 - Demo implementasi Role & Privilege pada Database Oracle & my SQL
Kelompok 8 - Demo implementasi Role & Privilege pada Database Oracle & my SQL
 

Semelhante a Classes abstratas

Heranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoHeranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismo
Pedro Neto
 
Interfaces POO
Interfaces POOInterfaces POO
Interfaces POO
Pedro Neto
 
Tutorial Java: Polimorfismo
Tutorial Java: PolimorfismoTutorial Java: Polimorfismo
Tutorial Java: Polimorfismo
Elaine Cecília Gatto
 
Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1
Elaine Cecília Gatto
 
Uma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosUma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de erros
Gabriel Schade Cardoso
 
Tutorial Java: Herança
Tutorial Java: HerançaTutorial Java: Herança
Tutorial Java: Herança
Elaine Cecília Gatto
 
Tutorial Java: Interface
Tutorial Java: InterfaceTutorial Java: Interface
Tutorial Java: Interface
Elaine Cecília Gatto
 
10 heranca
10   heranca10   heranca
10 heranca
Artur Todeschini
 
Refactoring
RefactoringRefactoring
Refactoring
Bruno Lui
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
Manuel Menezes de Sequeira
 
ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#
biandamakengo08
 
Aula 4 herança, sobrescrita de métodos, construtor
Aula 4   herança, sobrescrita de métodos, construtorAula 4   herança, sobrescrita de métodos, construtor
Aula 4 herança, sobrescrita de métodos, construtor
Rafael Pinheiro
 
Aula 3.ppt
Aula 3.pptAula 3.ppt
Modelo de desenvolvimento de software em 3 camadas para Wordpress
Modelo de desenvolvimento de software em 3 camadas para WordpressModelo de desenvolvimento de software em 3 camadas para Wordpress
Modelo de desenvolvimento de software em 3 camadas para Wordpress
Laboratório de Políticas Públicas Participativas
 
Pacotes -organizando_suas_classes_e_bibliotecas
Pacotes  -organizando_suas_classes_e_bibliotecasPacotes  -organizando_suas_classes_e_bibliotecas
Pacotes -organizando_suas_classes_e_bibliotecas
Pedro Neto
 
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
tdc-globalcode
 
Design de aplicações orientadas a objeto
Design de aplicações orientadas a objetoDesign de aplicações orientadas a objeto
Design de aplicações orientadas a objeto
Elaine Naomi
 
Aula5
Aula5Aula5
Aula5
fkimura
 
Java 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseJava 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De Classe
Regis Magalhães
 
Aprendendo C# do zero
Aprendendo C# do zeroAprendendo C# do zero
Aprendendo C# do zero
Manawydan
 

Semelhante a Classes abstratas (20)

Heranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoHeranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismo
 
Interfaces POO
Interfaces POOInterfaces POO
Interfaces POO
 
Tutorial Java: Polimorfismo
Tutorial Java: PolimorfismoTutorial Java: Polimorfismo
Tutorial Java: Polimorfismo
 
Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1
 
Uma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosUma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de erros
 
Tutorial Java: Herança
Tutorial Java: HerançaTutorial Java: Herança
Tutorial Java: Herança
 
Tutorial Java: Interface
Tutorial Java: InterfaceTutorial Java: Interface
Tutorial Java: Interface
 
10 heranca
10   heranca10   heranca
10 heranca
 
Refactoring
RefactoringRefactoring
Refactoring
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
 
ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#
 
Aula 4 herança, sobrescrita de métodos, construtor
Aula 4   herança, sobrescrita de métodos, construtorAula 4   herança, sobrescrita de métodos, construtor
Aula 4 herança, sobrescrita de métodos, construtor
 
Aula 3.ppt
Aula 3.pptAula 3.ppt
Aula 3.ppt
 
Modelo de desenvolvimento de software em 3 camadas para Wordpress
Modelo de desenvolvimento de software em 3 camadas para WordpressModelo de desenvolvimento de software em 3 camadas para Wordpress
Modelo de desenvolvimento de software em 3 camadas para Wordpress
 
Pacotes -organizando_suas_classes_e_bibliotecas
Pacotes  -organizando_suas_classes_e_bibliotecasPacotes  -organizando_suas_classes_e_bibliotecas
Pacotes -organizando_suas_classes_e_bibliotecas
 
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
 
Design de aplicações orientadas a objeto
Design de aplicações orientadas a objetoDesign de aplicações orientadas a objeto
Design de aplicações orientadas a objeto
 
Aula5
Aula5Aula5
Aula5
 
Java 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseJava 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De Classe
 
Aprendendo C# do zero
Aprendendo C# do zeroAprendendo C# do zero
Aprendendo C# do zero
 

Mais de Pedro Neto

Slides Css3
Slides Css3 Slides Css3
Slides Css3
Pedro Neto
 
Css 3
Css 3Css 3
Css 3
Pedro Neto
 
Capitulo 14 -_componentes_gui_parte_3
Capitulo 14 -_componentes_gui_parte_3Capitulo 14 -_componentes_gui_parte_3
Capitulo 14 -_componentes_gui_parte_3
Pedro Neto
 
Html 5 -_aula_2
Html 5 -_aula_2Html 5 -_aula_2
Html 5 -_aula_2
Pedro Neto
 
Html 5 -_aula_1
Html 5 -_aula_1Html 5 -_aula_1
Html 5 -_aula_1
Pedro Neto
 
Capitulo 14 -_componentes_gui_parte_1
Capitulo 14 -_componentes_gui_parte_1Capitulo 14 -_componentes_gui_parte_1
Capitulo 14 -_componentes_gui_parte_1
Pedro Neto
 
Como a web funciona
Como a web funcionaComo a web funciona
Como a web funciona
Pedro Neto
 
Como a internet funciona
Como a internet funcionaComo a internet funciona
Como a internet funciona
Pedro Neto
 
Arrays
ArraysArrays
Arrays
Pedro Neto
 
Daw slide 08
Daw slide 08Daw slide 08
Daw slide 08
Pedro Neto
 
Daw slide 07
Daw slide 07Daw slide 07
Daw slide 07
Pedro Neto
 
Daw slide 06
Daw slide 06Daw slide 06
Daw slide 06
Pedro Neto
 
Daw slide 01
Daw slide 01Daw slide 01
Daw slide 01
Pedro Neto
 
Sig parte 6
Sig parte 6Sig parte 6
Sig parte 6
Pedro Neto
 
Oficina de Computação Gráfica - Peças resultantes
Oficina de Computação Gráfica - Peças resultantesOficina de Computação Gráfica - Peças resultantes
Oficina de Computação Gráfica - Peças resultantes
Pedro Neto
 
Minicurso App Inventor
Minicurso App Inventor Minicurso App Inventor
Minicurso App Inventor
Pedro Neto
 
Programação Orientada a Objetos
Programação Orientada a ObjetosProgramação Orientada a Objetos
Programação Orientada a Objetos
Pedro Neto
 
Avaliação do servidor Web em um Computador Singleboard Raspberry Pi com a Fer...
Avaliação do servidor Web em um Computador Singleboard Raspberry Pi com a Fer...Avaliação do servidor Web em um Computador Singleboard Raspberry Pi com a Fer...
Avaliação do servidor Web em um Computador Singleboard Raspberry Pi com a Fer...
Pedro Neto
 
IF MOBILE – DESENVOLVIMENTO DE SOFTWARES PARA DISPOSITIVOS MÓVEIS: APLICATIVO...
IF MOBILE – DESENVOLVIMENTO DE SOFTWARES PARA DISPOSITIVOS MÓVEIS: APLICATIVO...IF MOBILE – DESENVOLVIMENTO DE SOFTWARES PARA DISPOSITIVOS MÓVEIS: APLICATIVO...
IF MOBILE – DESENVOLVIMENTO DE SOFTWARES PARA DISPOSITIVOS MÓVEIS: APLICATIVO...
Pedro Neto
 
Desenvolvimento de Aplicativos Móveis
Desenvolvimento de Aplicativos MóveisDesenvolvimento de Aplicativos Móveis
Desenvolvimento de Aplicativos Móveis
Pedro Neto
 

Mais de Pedro Neto (20)

Slides Css3
Slides Css3 Slides Css3
Slides Css3
 
Css 3
Css 3Css 3
Css 3
 
Capitulo 14 -_componentes_gui_parte_3
Capitulo 14 -_componentes_gui_parte_3Capitulo 14 -_componentes_gui_parte_3
Capitulo 14 -_componentes_gui_parte_3
 
Html 5 -_aula_2
Html 5 -_aula_2Html 5 -_aula_2
Html 5 -_aula_2
 
Html 5 -_aula_1
Html 5 -_aula_1Html 5 -_aula_1
Html 5 -_aula_1
 
Capitulo 14 -_componentes_gui_parte_1
Capitulo 14 -_componentes_gui_parte_1Capitulo 14 -_componentes_gui_parte_1
Capitulo 14 -_componentes_gui_parte_1
 
Como a web funciona
Como a web funcionaComo a web funciona
Como a web funciona
 
Como a internet funciona
Como a internet funcionaComo a internet funciona
Como a internet funciona
 
Arrays
ArraysArrays
Arrays
 
Daw slide 08
Daw slide 08Daw slide 08
Daw slide 08
 
Daw slide 07
Daw slide 07Daw slide 07
Daw slide 07
 
Daw slide 06
Daw slide 06Daw slide 06
Daw slide 06
 
Daw slide 01
Daw slide 01Daw slide 01
Daw slide 01
 
Sig parte 6
Sig parte 6Sig parte 6
Sig parte 6
 
Oficina de Computação Gráfica - Peças resultantes
Oficina de Computação Gráfica - Peças resultantesOficina de Computação Gráfica - Peças resultantes
Oficina de Computação Gráfica - Peças resultantes
 
Minicurso App Inventor
Minicurso App Inventor Minicurso App Inventor
Minicurso App Inventor
 
Programação Orientada a Objetos
Programação Orientada a ObjetosProgramação Orientada a Objetos
Programação Orientada a Objetos
 
Avaliação do servidor Web em um Computador Singleboard Raspberry Pi com a Fer...
Avaliação do servidor Web em um Computador Singleboard Raspberry Pi com a Fer...Avaliação do servidor Web em um Computador Singleboard Raspberry Pi com a Fer...
Avaliação do servidor Web em um Computador Singleboard Raspberry Pi com a Fer...
 
IF MOBILE – DESENVOLVIMENTO DE SOFTWARES PARA DISPOSITIVOS MÓVEIS: APLICATIVO...
IF MOBILE – DESENVOLVIMENTO DE SOFTWARES PARA DISPOSITIVOS MÓVEIS: APLICATIVO...IF MOBILE – DESENVOLVIMENTO DE SOFTWARES PARA DISPOSITIVOS MÓVEIS: APLICATIVO...
IF MOBILE – DESENVOLVIMENTO DE SOFTWARES PARA DISPOSITIVOS MÓVEIS: APLICATIVO...
 
Desenvolvimento de Aplicativos Móveis
Desenvolvimento de Aplicativos MóveisDesenvolvimento de Aplicativos Móveis
Desenvolvimento de Aplicativos Móveis
 

Último

Caça-palavras - ortografia S, SS, X, C e Z
Caça-palavras - ortografia  S, SS, X, C e ZCaça-palavras - ortografia  S, SS, X, C e Z
Caça-palavras - ortografia S, SS, X, C e Z
Mary Alvarenga
 
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdfCaderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
carlaslr1
 
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
AdrianoMontagna1
 
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdfAPOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
RenanSilva991968
 
Sistema de Bibliotecas UCS - Chronica do emperador Clarimundo, donde os reis ...
Sistema de Bibliotecas UCS - Chronica do emperador Clarimundo, donde os reis ...Sistema de Bibliotecas UCS - Chronica do emperador Clarimundo, donde os reis ...
Sistema de Bibliotecas UCS - Chronica do emperador Clarimundo, donde os reis ...
Biblioteca UCS
 
Pintura Romana .pptx
Pintura Romana                     .pptxPintura Romana                     .pptx
Pintura Romana .pptx
TomasSousa7
 
the_story_garden_5_SB_with_activities.pdf
the_story_garden_5_SB_with_activities.pdfthe_story_garden_5_SB_with_activities.pdf
the_story_garden_5_SB_with_activities.pdf
CarinaSoto12
 
.Template .padrao .slides .TCC .2024 ppt
.Template .padrao .slides .TCC .2024 ppt.Template .padrao .slides .TCC .2024 ppt
.Template .padrao .slides .TCC .2024 ppt
IslanderAndrade
 
Aula 1 do livro de Ciências do aluno - sons
Aula 1 do livro de Ciências do aluno - sonsAula 1 do livro de Ciências do aluno - sons
Aula 1 do livro de Ciências do aluno - sons
Érika Rufo
 
Redação e Leitura_7º ano_58_Produção de cordel .pptx
Redação e Leitura_7º ano_58_Produção de cordel .pptxRedação e Leitura_7º ano_58_Produção de cordel .pptx
Redação e Leitura_7º ano_58_Produção de cordel .pptx
DECIOMAURINARAMOS
 
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxSlides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
LuizHenriquedeAlmeid6
 
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdfiNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
andressacastro36
 
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdfPowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
1000a
 
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptxTreinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
MarcosPaulo777883
 
Vogais Ilustrados para alfabetização infantil
Vogais Ilustrados para alfabetização infantilVogais Ilustrados para alfabetização infantil
Vogais Ilustrados para alfabetização infantil
mamaeieby
 
Fernão Lopes. pptx
Fernão Lopes.                       pptxFernão Lopes.                       pptx
Fernão Lopes. pptx
TomasSousa7
 
Livro: Pedagogia do Oprimido - Paulo Freire
Livro: Pedagogia do Oprimido - Paulo FreireLivro: Pedagogia do Oprimido - Paulo Freire
Livro: Pedagogia do Oprimido - Paulo Freire
WelberMerlinCardoso
 
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptxSlides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
LuizHenriquedeAlmeid6
 
Atividade letra da música - Espalhe Amor, Anavitória.
Atividade letra da música - Espalhe  Amor, Anavitória.Atividade letra da música - Espalhe  Amor, Anavitória.
Atividade letra da música - Espalhe Amor, Anavitória.
Mary Alvarenga
 
CADERNO DE CONCEITOS E ORIENTAÇÕES DO CENSO ESCOLAR 2024.pdf
CADERNO DE CONCEITOS E ORIENTAÇÕES DO CENSO ESCOLAR 2024.pdfCADERNO DE CONCEITOS E ORIENTAÇÕES DO CENSO ESCOLAR 2024.pdf
CADERNO DE CONCEITOS E ORIENTAÇÕES DO CENSO ESCOLAR 2024.pdf
NatySousa3
 

Último (20)

Caça-palavras - ortografia S, SS, X, C e Z
Caça-palavras - ortografia  S, SS, X, C e ZCaça-palavras - ortografia  S, SS, X, C e Z
Caça-palavras - ortografia S, SS, X, C e Z
 
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdfCaderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
 
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
 
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdfAPOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
 
Sistema de Bibliotecas UCS - Chronica do emperador Clarimundo, donde os reis ...
Sistema de Bibliotecas UCS - Chronica do emperador Clarimundo, donde os reis ...Sistema de Bibliotecas UCS - Chronica do emperador Clarimundo, donde os reis ...
Sistema de Bibliotecas UCS - Chronica do emperador Clarimundo, donde os reis ...
 
Pintura Romana .pptx
Pintura Romana                     .pptxPintura Romana                     .pptx
Pintura Romana .pptx
 
the_story_garden_5_SB_with_activities.pdf
the_story_garden_5_SB_with_activities.pdfthe_story_garden_5_SB_with_activities.pdf
the_story_garden_5_SB_with_activities.pdf
 
.Template .padrao .slides .TCC .2024 ppt
.Template .padrao .slides .TCC .2024 ppt.Template .padrao .slides .TCC .2024 ppt
.Template .padrao .slides .TCC .2024 ppt
 
Aula 1 do livro de Ciências do aluno - sons
Aula 1 do livro de Ciências do aluno - sonsAula 1 do livro de Ciências do aluno - sons
Aula 1 do livro de Ciências do aluno - sons
 
Redação e Leitura_7º ano_58_Produção de cordel .pptx
Redação e Leitura_7º ano_58_Produção de cordel .pptxRedação e Leitura_7º ano_58_Produção de cordel .pptx
Redação e Leitura_7º ano_58_Produção de cordel .pptx
 
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxSlides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
 
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdfiNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
 
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdfPowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
 
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptxTreinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
 
Vogais Ilustrados para alfabetização infantil
Vogais Ilustrados para alfabetização infantilVogais Ilustrados para alfabetização infantil
Vogais Ilustrados para alfabetização infantil
 
Fernão Lopes. pptx
Fernão Lopes.                       pptxFernão Lopes.                       pptx
Fernão Lopes. pptx
 
Livro: Pedagogia do Oprimido - Paulo Freire
Livro: Pedagogia do Oprimido - Paulo FreireLivro: Pedagogia do Oprimido - Paulo Freire
Livro: Pedagogia do Oprimido - Paulo Freire
 
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptxSlides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
 
Atividade letra da música - Espalhe Amor, Anavitória.
Atividade letra da música - Espalhe  Amor, Anavitória.Atividade letra da música - Espalhe  Amor, Anavitória.
Atividade letra da música - Espalhe Amor, Anavitória.
 
CADERNO DE CONCEITOS E ORIENTAÇÕES DO CENSO ESCOLAR 2024.pdf
CADERNO DE CONCEITOS E ORIENTAÇÕES DO CENSO ESCOLAR 2024.pdfCADERNO DE CONCEITOS E ORIENTAÇÕES DO CENSO ESCOLAR 2024.pdf
CADERNO DE CONCEITOS E ORIENTAÇÕES DO CENSO ESCOLAR 2024.pdf
 

Classes abstratas

  • 1. CURSO JAVA E ORIENTAÇÃO A OBJETOS > APOSTILA > CAPITULO 10 CLASSES ABSTRATAS "Dá-se importância aos antepassados quando já não temos nenhum." -- François Chateaubriand Ao término desse capítulo, você será capaz de utilizar classes abstratas, quando necessário. Repetindo mais código? Vamos recordar em como pode estar nossa classe Funcionario: public class Funcionario { protected String nome; protected String cpf; protected double salario; public double getBoni cacao() { return this.salario * 1.2; } // outros métodos aqui } Considere o nosso ControleDeBoni cacao:
  • 2. public class ControleDeBoni cacoes { private double totalDeBoni cacoes = 0; public void registra(Funcionario f) { System.out.println("Adicionando boni cação do funcionario: " + f); this.totalDeBoni cacoes += f.getBoni cacao(); } public double getTotalDeBoni cacoes() { return this.totalDeBoni cacoes; } } Nosso método registra recebe qualquer referência do tipo Funcionario, isto é, podem ser objetos do tipo Funcionario e qualquer de seus subtipos: Gerente, Diretor e, eventualmente, alguma nova subclasse que venha ser escrita, sem prévio conhecimento do autor da ControleDeBoni cacao. Estamos utilizando aqui a classe Funcionario para o polimorfismo. Se não fosse ela, teríamos um grande prejuízo: precisaríamos criar um método registra para receber cada um dos tipos de Funcionario, um para Gerente, um para Diretor, etc. Repare que perder esse poder é muito pior do que a pequena vantagem que a herança traz em herdar código. Porém, em alguns sistemas, como é o nosso caso, usamos uma classe com apenas esses intuitos: de economizar um pouco código e ganhar polimorfismo para criar métodos mais genéricos, que se encaixem a diversos objetos.
  • 3. Faz sentido ter uma referência do tipo Funcionario? Essa pergunta é diferente de saber se faz sentido ter um objeto do tipo Funcionario: nesse caso, faz sim e é muito útil. Referenciando Funcionario temos o polimorfismo de referência, já que podemos receber qualquer objeto que seja um Funcionario. Porém, dar new em Funcionario pode não fazer sentido, isto é, não queremos receber um objeto do tipo Funcionario, mas sim que aquela referência seja ou um Gerente, ou um Diretor, etc. Algo mais concreto que um Funcionario. ControleDeBoni cacoes cdb = new ControleDeBoni cacoes(); Funcionario f = new Funcionario(); cdb.adiciona(f); // faz sentido? Vejamos um outro caso em que não faz sentido ter um objeto daquele tipo, apesar da classe existir: imagine a classe Pessoa e duas filhas, PessoaFisica e PessoaJuridica. Quando puxamos um relatório de nossos clientes (uma array de Pessoa por exemplo), queremos que cada um deles seja ou uma PessoaFisica, ou uma PessoaJuridica. A classe Pessoa, nesse caso, estaria sendo usada apenas para ganhar o polimorfismo e herdar algumas coisas: não faz sentido permitir instanciá-la. Para resolver esses problemas, temos as classes abstratas. Classe abstrata Classe abstrata
  • 4. O que, exatamente, vem a ser a nossa classe Funcionario? Nossa empresa tem apenas Diretores, Gerentes, Secretárias, etc. Ela Ela é uma classe que apenas idealiza um tipo, define apenas um é uma classe que apenas idealiza um tipo, define apenas um rascunho. rascunho. Para o nosso sistema, é inadmissível que um objeto seja apenas Para o nosso sistema, é inadmissível que um objeto seja apenas do tipo do tipo Funcionario Funcionario (pode existir um sistema em que faça (pode existir um sistema em que faça sentido ter objetos do tipo sentido ter objetos do tipo Funcionario Funcionario ou apenas ou apenas Pessoa Pessoa, mas, , mas, no nosso caso, não). no nosso caso, não). 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 abstract class Funcionario { protected double salario; public double getBoni cacao() { return this.salario * 1.2; } // outros atributos e métodos comuns a todos Funcionarios } E, no meio de um código: Funcionario f = new Funcionario(); // não compila!!!
  • 5. 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? Serve para o polimorfismo e herança dos atributos e métodos, que são recursos muito poderosos, como já vimos. Vamos então herdar dessa classe, reescrevendo o método getBoni cacao: public class Gerente extends Funcionario { public double getBoni cacao() { return this.salario * 1.4 + 1000; } }
  • 6.
  • 7. Mas qual é a real vantagem de uma classe abstrata? Poderíamos ter feito isto com uma herança comum. Por enquanto, a única diferença é que não podemos instanciar um objeto do tipo Funcionario, que já é de grande valia, dando mais consistência ao sistema. Fique claro que a nossa decisão de transformar Funcionario em uma classe abstrata dependeu do nosso domínio. Pode ser que, em um sistema com classes similares, faça sentido que uma classe análoga a Funcionario seja concreta. SEUS LIVROS DE TECNOLOGIA PARECEM DO SÉCULO PASSADO? Conheça a Casa do Código, uma nova editora, com autores de destaque no mercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntos atuais. Com a curadoria da Caelum e excelentes autores, é uma abordagem diferente para livros de tecnologia no Brasil. Conheça os títulos e a nova proposta, você vai gostar.
  • 8. Casa do Código, livros para o programador Métodos abstratos Se o método getBoni cacao não fosse reescrito, ele seria herdado da classe mãe, fazendo com que devolvesse o salário mais 20%. Levando em consideração que cada funcionário em nosso sistema tem uma regra totalmente diferente para ser bonificado, faz algum sentido ter esse método na classe Funcionario? Será que existe uma bonificação padrão para todo tipo de Funcionario? Parece que não, cada classe filha terá um método diferente de bonificação pois, de acordo com nosso sistema, não existe uma regra geral: queremos que cada pessoa que escreve a classe de um Funcionario diferente (subclasses de Funcionario) reescreva o método getBoni cacao de acordo com as suas regras. Poderíamos, então, jogar fora esse método da classe Funcionario? O problema é que, se ele não existisse, não poderíamos chamar o método apenas com uma referência a um Funcionario, pois ninguém garante que essa referência aponta para um objeto que possui esse método. Será que então devemos retornar um código, como um número negativo? Isso não resolve o problema: se esquecermos de reescrever esse método, teremos dados errados sendo utilizados como bônus.
  • 9. Existe um recurso em Java que, em uma classe abstrata, podemos escrever que determinado método será sempre escrito pelas classes filhas. Isto é, um método abstrato. Ele indica que todas as classes filhas (concretas, isto é, que não forem abstratas) devem reescrever esse método ou não compilarão. É como se você herdasse a responsabilidade de ter aquele método. Como declarar um método abstrato Às vezes, não fica claro como declarar um método abstrato. Basta escrever a palavra chave abstract na assinatura do mesmo e colocar um ponto e vírgula em vez de abre e fecha chaves! public abstract class Funcionario { public abstract double getBoni cacao(); // outros atributos e métodos } Repare que não colocamos o corpo do método e usamos a palavra chave abstract para definir o mesmo. Por que não colocar corpo algum? Porque esse método nunca vai ser chamado, sempre que alguém chamar o método getBoni cacao, vai cair em uma das suas filhas, que realmente escreveram o método.
  • 10. Qualquer classe que estender a classe Funcionario será obrigada a reescrever este método, tornando-o "concreto". Se não reescreverem esse método, um erro de compilação ocorrerá. O método do ControleDeBoni cacao estava assim: public void registra(Funcionario f) { System.out.println("Adicionando boni cação do funcionario: " + f); this.totalDeBoni cacoes += f.getBoni cacao(); } Como posso acessar o método getBoni cacao se ele não existe na classe Funcionario? Já que o método é abstrato, com certeza suas subclasses têm esse método, o que garante que essa invocação de método não vai falhar. Basta pensar que uma referência do tipo Funcionario nunca aponta para um objeto que não tem o método getBoni cacao, pois não é possível instanciar uma classe abstrata, apenas as concretas. Um método abstrato obriga a classe em que ele se encontra ser abstrata, o que garante a coerência do código acima compilar. Aumentando o exemplo E se, no nosso exemplo de empresa, tivéssemos o seguinte diagrama de classes com os seguintes métodos:
  • 11. Ou seja, tenho a classe abstrata Funcionario, com o método abstrato getBoni cacao; as classes Gerente e Presidente estendendo Funcionario e implementando o método getBoni cacao; e, por fim, a classe Diretor, que estende Gerente, mas não implementa o método getBoni cacao. Essas classes vão compilar? Vão rodar?
  • 12. A resposta é sim. E, além de tudo, farão exatamente o que nós queremos, pois, quando Gerente e Presidente possuem os métodos perfeitamente implementados, a classe Diretor, que não possui o método implementado, vai usar a implementação herdada de Gerente. E esse diagrama, no qual incluímos uma classe abstrata Secretaria sem o método getBoni cacao, que é estendida por mais duas classes (SecretariaAdministrativa, SecretariaAgencia) que, por sua vez, implementam o método getBoni cacao, vai compilar? Vai rodar? De novo, a resposta é sim, pois Secretaria é uma classe abstrata e, por isso, o Java tem certeza de que ninguém vai conseguir instanciá-la e, muito menos, chamar o método getBoni cacao dela. Lembrando que, nesse caso, não precisamos nem ao menos escrever o método abstrato getBoni cacao na classe Secretaria.
  • 13. Se eu não reescrever um método abstrato da minha classe mãe, o código não compilará. Mas posso, em vez disso, declarar a classe como abstrata! java.io Classes abstratas não possuem nenhum segredo no aprendizado, mas quem está aprendendo orientação a objetos pode ter uma enorme dificuldade para saber quando utilizá-las, o que é muito normal. Estudaremos o pacote java.io, que usa bastantes classes abstratas, sendo um exemplo real de uso desse recurso, que vai melhorar o entendimento delas. (classe InputStream e suas filhas) Para saber mais... Uma classe que estende uma classe normal também pode ser abstrata! Ela não poderá ser instanciada, mas sua classe pai sim! Uma classe abstrata não precisa necessariamente ter um método abstrato. AGORA É A MELHOR HORA DE APRENDER ALGO NOVO Se você gosta de estudar essa apostila aberta da Caelum, certamente vai gostar dos cursos online que lançamos
  • 14. na plataforma Alura. Você estuda a qualquer momento com a qualidade Caelum. Conheça a Alura Exercícios: Classes Abstratas Repare que a nossa classe Conta é uma excelente candidata para uma classe abstrata. Por quê? Que métodos seriam interessantes candidatos a serem abstratos? Transforme a classe Conta em abstrata: public abstract class Conta { // ... } Como a classe Conta agora é abstrata, não conseguimos dar new nela mais. Se não podemos dar new em Conta, qual é a utilidade de ter um método que recebe uma referência a Conta como argumento? Aliás, posso ter isso? Apenas para entender melhor o abstract, comente o método getTipo() da ContaPoupanca, dessa forma ele herdará o método diretamente de Conta. Transforme o método getTipo() da classe Conta em abstrato. Repare que, ao colocar a palavra chave abstract ao lado do método, o Eclipse rapidamente vai sugerir que você deve remover o corpo (body) do método com um quick fix.
  • 15. Sua classe Conta deve ficar parecida com: public abstract class Conta { // atributos e métodos que já existiam public abstract String getTipo(); } Qual é o problema com a classe ContaPoupanca? Descomente o método getTipo na classe ContaPoupanca, e se necessário altere-o para que a classe possa compilar normalmente. (opcional) Existe outra maneira de a classe ContaPoupanca compilar se você não reescrever o método abstrato? (opcional) Pra que ter o método getTipo na classe Conta se ele não faz nada? O que acontece se simplesmente apagarmos esse método da classe Conta e deixarmos o método getTipo nas filhas? (opcional) Posso chamar um método abstrato de dentro de um outro método da própria classe abstrata? Por exemplo, imagine que exista o seguinte método na classe Conta: public String recuperaDadosParaImpressao() { String dados = "Titular: " + this.titular; dados += "nNúmero: " + this.numero; dados += "nAgência: " + this.agencia; dados += "nSaldo: R$" + this.saldo; return dados; }
  • 16. Podemos invocar o getTipo dentro deste método? Algo como: dados += "nTipo: " + this.getTipo(); CAPÍTULO ANTERIOR Herança, reescrita e polimor smo PRÓXIMO CAPITULO Interfaces CURSOS E TURMAS CATÁLOGO DE CURSOS APOSTILAS PARA EMPRESAS SOBRE NÓS EQUIPE CONTATO RECEBA NOVIDADES exemplo@email.com OK
  • 17. Caelum. Escola de Tecnologia. Cursos online ao vivo.