SlideShare uma empresa Scribd logo
1 de 17
Baixar para ler offline
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

Polimorfismo
PolimorfismoPolimorfismo
Polimorfismokayth19
 
Java: Heranca e polimorfismo
Java: Heranca e polimorfismoJava: Heranca e polimorfismo
Java: Heranca e polimorfismoArthur Emanuel
 
Polimorfismo em java
Polimorfismo em javaPolimorfismo em java
Polimorfismo em javaManoel Afonso
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 
POO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosPOO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosLudimila Monjardim Casagrande
 
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 ClasseRegis Magalhães
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratosMaurício Linhares
 
Aula 5 encapsulamento, associação, polimorfismo, interfaces
Aula 5   encapsulamento, associação, polimorfismo, interfacesAula 5   encapsulamento, associação, polimorfismo, interfaces
Aula 5 encapsulamento, associação, polimorfismo, interfacesRafael Pinheiro
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
Polimorfismo java
Polimorfismo javaPolimorfismo java
Polimorfismo javaFAFICA
 
Programação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaProgramação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaDaniel Brandão
 

Mais procurados (20)

Polimorfismo
PolimorfismoPolimorfismo
Polimorfismo
 
POO - 10 - Herança
POO - 10 - HerançaPOO - 10 - Herança
POO - 10 - Herança
 
Aula orientação a objetos
Aula orientação a objetosAula orientação a objetos
Aula orientação a objetos
 
Java: Heranca e polimorfismo
Java: Heranca e polimorfismoJava: Heranca e polimorfismo
Java: Heranca e polimorfismo
 
Polimorfismo em java
Polimorfismo em javaPolimorfismo em java
Polimorfismo em java
 
Conceptos basicos POO
Conceptos basicos POOConceptos basicos POO
Conceptos basicos POO
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Polymorphism in java
Polymorphism in javaPolymorphism in java
Polymorphism in java
 
POO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosPOO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a Objetos
 
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
 
Estrutura de Dados em Java (Introdução)
Estrutura de Dados em Java (Introdução)Estrutura de Dados em Java (Introdução)
Estrutura de Dados em Java (Introdução)
 
JAVA - Matrizes
JAVA - MatrizesJAVA - Matrizes
JAVA - Matrizes
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratos
 
Kqml
KqmlKqml
Kqml
 
Diagrama de clases
Diagrama de clasesDiagrama de clases
Diagrama de clases
 
Php functions
Php functionsPhp functions
Php functions
 
Aula 5 encapsulamento, associação, polimorfismo, interfaces
Aula 5   encapsulamento, associação, polimorfismo, interfacesAula 5   encapsulamento, associação, polimorfismo, interfaces
Aula 5 encapsulamento, associação, polimorfismo, interfaces
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Polimorfismo java
Polimorfismo javaPolimorfismo java
Polimorfismo java
 
Programação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaProgramação Orientação a Objetos - Herança
Programação Orientação a Objetos - Herança
 

Semelhante a Classes abstratas

Heranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoHeranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoPedro Neto
 
Interfaces POO
Interfaces POOInterfaces POO
Interfaces POOPedro Neto
 
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 1Elaine 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 errosGabriel Schade Cardoso
 
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
 
Pacotes -organizando_suas_classes_e_bibliotecas
Pacotes  -organizando_suas_classes_e_bibliotecasPacotes  -organizando_suas_classes_e_bibliotecas
Pacotes -organizando_suas_classes_e_bibliotecasPedro Neto
 
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 objetoElaine Naomi
 
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
 
Aprendendo C# do zero
Aprendendo C# do zeroAprendendo C# do zero
Aprendendo C# do zeroManawydan
 
2009_2Sem.POOII.Ciencia Aula2 Revisao De Classes E Objetos
2009_2Sem.POOII.Ciencia Aula2   Revisao De Classes E Objetos2009_2Sem.POOII.Ciencia Aula2   Revisao De Classes E Objetos
2009_2Sem.POOII.Ciencia Aula2 Revisao De Classes E Objetosguest9b4c7f
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Thyago Maia
 

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 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
 
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
 
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...
 
Aula5
Aula5Aula5
Aula5
 
Aprendendo C# do zero
Aprendendo C# do zeroAprendendo C# do zero
Aprendendo C# do zero
 
2009_2Sem.POOII.Ciencia Aula2 Revisao De Classes E Objetos
2009_2Sem.POOII.Ciencia Aula2   Revisao De Classes E Objetos2009_2Sem.POOII.Ciencia Aula2   Revisao De Classes E Objetos
2009_2Sem.POOII.Ciencia Aula2 Revisao De Classes E Objetos
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3
 

Mais de Pedro Neto

Capitulo 14 -_componentes_gui_parte_3
Capitulo 14 -_componentes_gui_parte_3Capitulo 14 -_componentes_gui_parte_3
Capitulo 14 -_componentes_gui_parte_3Pedro Neto
 
Html 5 -_aula_2
Html 5 -_aula_2Html 5 -_aula_2
Html 5 -_aula_2Pedro Neto
 
Html 5 -_aula_1
Html 5 -_aula_1Html 5 -_aula_1
Html 5 -_aula_1Pedro Neto
 
Capitulo 14 -_componentes_gui_parte_1
Capitulo 14 -_componentes_gui_parte_1Capitulo 14 -_componentes_gui_parte_1
Capitulo 14 -_componentes_gui_parte_1Pedro Neto
 
Como a web funciona
Como a web funcionaComo a web funciona
Como a web funcionaPedro Neto
 
Como a internet funciona
Como a internet funcionaComo a internet funciona
Como a internet funcionaPedro 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 resultantesPedro 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 ObjetosPedro 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óveisPedro 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

LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...Francisco Márcio Bezerra Oliveira
 
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdfPROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdfHELENO FAVACHO
 
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptxResponde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptxAntonioVieira539017
 
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdfPROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdfHELENO FAVACHO
 
Projeto Nós propomos! Sertã, 2024 - Chupetas Eletrónicas.pptx
Projeto Nós propomos! Sertã, 2024 - Chupetas Eletrónicas.pptxProjeto Nós propomos! Sertã, 2024 - Chupetas Eletrónicas.pptx
Projeto Nós propomos! Sertã, 2024 - Chupetas Eletrónicas.pptxIlda Bicacro
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfLeloIurk1
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptssuser2b53fe
 
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfPROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfHELENO FAVACHO
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxLuizHenriquedeAlmeid6
 
migração e trabalho 2º ano.pptx fenomenos
migração e trabalho 2º ano.pptx fenomenosmigração e trabalho 2º ano.pptx fenomenos
migração e trabalho 2º ano.pptx fenomenosLucianoPrado15
 
Camadas da terra -Litosfera conteúdo 6º ano
Camadas da terra -Litosfera  conteúdo 6º anoCamadas da terra -Litosfera  conteúdo 6º ano
Camadas da terra -Litosfera conteúdo 6º anoRachel Facundo
 
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasJogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasSocorro Machado
 
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdfRecomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdfFrancisco Márcio Bezerra Oliveira
 
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfPROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfHELENO FAVACHO
 
Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Ilda Bicacro
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdfmarlene54545
 
P P P 2024 - *CIEJA Santana / Tucuruvi*
P P P 2024  - *CIEJA Santana / Tucuruvi*P P P 2024  - *CIEJA Santana / Tucuruvi*
P P P 2024 - *CIEJA Santana / Tucuruvi*Viviane Moreiras
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfTutor de matemática Ícaro
 
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...Ilda Bicacro
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfWagnerCamposCEA
 

Último (20)

LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
 
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdfPROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
 
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptxResponde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
 
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdfPROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
 
Projeto Nós propomos! Sertã, 2024 - Chupetas Eletrónicas.pptx
Projeto Nós propomos! Sertã, 2024 - Chupetas Eletrónicas.pptxProjeto Nós propomos! Sertã, 2024 - Chupetas Eletrónicas.pptx
Projeto Nós propomos! Sertã, 2024 - Chupetas Eletrónicas.pptx
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.ppt
 
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfPROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
 
migração e trabalho 2º ano.pptx fenomenos
migração e trabalho 2º ano.pptx fenomenosmigração e trabalho 2º ano.pptx fenomenos
migração e trabalho 2º ano.pptx fenomenos
 
Camadas da terra -Litosfera conteúdo 6º ano
Camadas da terra -Litosfera  conteúdo 6º anoCamadas da terra -Litosfera  conteúdo 6º ano
Camadas da terra -Litosfera conteúdo 6º ano
 
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasJogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
 
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdfRecomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
 
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfPROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
 
Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
 
P P P 2024 - *CIEJA Santana / Tucuruvi*
P P P 2024  - *CIEJA Santana / Tucuruvi*P P P 2024  - *CIEJA Santana / Tucuruvi*
P P P 2024 - *CIEJA Santana / Tucuruvi*
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
 
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.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.