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

Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven DesignAndré Borgonovo
 
Apresentação Clean Code
Apresentação Clean CodeApresentação Clean Code
Apresentação Clean CodeAndré Leoni
 
Embracing DevOps through database migrations with Flyway
Embracing DevOps through database migrations with FlywayEmbracing DevOps through database migrations with Flyway
Embracing DevOps through database migrations with FlywayRed Gate Software
 
10 Java Script - Exemplos práticos
10 Java Script - Exemplos práticos10 Java Script - Exemplos práticos
10 Java Script - Exemplos práticosCentro Paula Souza
 
Clean architecture - Protecting the Domain
Clean architecture - Protecting the DomainClean architecture - Protecting the Domain
Clean architecture - Protecting the DomainVictor Rentea
 
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributosLoiane Groner
 
Clean Pragmatic Architecture - Avoiding a Monolith
Clean Pragmatic Architecture - Avoiding a MonolithClean Pragmatic Architecture - Avoiding a Monolith
Clean Pragmatic Architecture - Avoiding a MonolithVictor Rentea
 
design patterns - introdução
design patterns - introduçãodesign patterns - introdução
design patterns - introduçãoelliando dias
 
Apresentação Docker
Apresentação DockerApresentação Docker
Apresentação DockerAndré Justi
 
CQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architectureCQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architectureThomas Jaskula
 
Sistema de Gerenciamento de Locadora de Vídeo - Diagramas
Sistema de Gerenciamento de Locadora de Vídeo - DiagramasSistema de Gerenciamento de Locadora de Vídeo - Diagramas
Sistema de Gerenciamento de Locadora de Vídeo - DiagramasGleyciana Garrido
 

Mais procurados (20)

Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
 
Modelos de Banco de dados e SGBDS
Modelos de Banco de dados e SGBDSModelos de Banco de dados e SGBDS
Modelos de Banco de dados e SGBDS
 
Apresentação Clean Code
Apresentação Clean CodeApresentação Clean Code
Apresentação Clean Code
 
JAVA - Herança
JAVA - HerançaJAVA - Herança
JAVA - Herança
 
Greenfoot 9
Greenfoot 9Greenfoot 9
Greenfoot 9
 
Embracing DevOps through database migrations with Flyway
Embracing DevOps through database migrations with FlywayEmbracing DevOps through database migrations with Flyway
Embracing DevOps through database migrations with Flyway
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
10 Java Script - Exemplos práticos
10 Java Script - Exemplos práticos10 Java Script - Exemplos práticos
10 Java Script - Exemplos práticos
 
Clean architecture - Protecting the Domain
Clean architecture - Protecting the DomainClean architecture - Protecting the Domain
Clean architecture - Protecting the Domain
 
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
 
Node.js e Express
Node.js e ExpressNode.js e Express
Node.js e Express
 
Clean Pragmatic Architecture - Avoiding a Monolith
Clean Pragmatic Architecture - Avoiding a MonolithClean Pragmatic Architecture - Avoiding a Monolith
Clean Pragmatic Architecture - Avoiding a Monolith
 
Aula 9 banco de dados
Aula 9   banco de dadosAula 9   banco de dados
Aula 9 banco de dados
 
design patterns - introdução
design patterns - introduçãodesign patterns - introdução
design patterns - introdução
 
Apresentação Docker
Apresentação DockerApresentação Docker
Apresentação Docker
 
Comenzando con Arquitecturas sin servidores
Comenzando con Arquitecturas sin servidoresComenzando con Arquitecturas sin servidores
Comenzando con Arquitecturas sin servidores
 
CQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architectureCQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architecture
 
Greenfoot 6
Greenfoot 6Greenfoot 6
Greenfoot 6
 
Sistema de Gerenciamento de Locadora de Vídeo - Diagramas
Sistema de Gerenciamento de Locadora de Vídeo - DiagramasSistema de Gerenciamento de Locadora de Vídeo - Diagramas
Sistema de Gerenciamento de Locadora de Vídeo - Diagramas
 
Practica 1 alice
Practica 1 alicePractica 1 alice
Practica 1 alice
 

Semelhante a Classe abstrata garante implementação método

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
 
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, construtorRafael Pinheiro
 
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
 
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
 
Aprendendo C# do zero
Aprendendo C# do zeroAprendendo C# do zero
Aprendendo C# do zeroManawydan
 

Semelhante a Classe abstrata garante implementação método (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
 
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
 
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

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

PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdfPROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdfMarianaMoraesMathias
 
Manual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManuais Formação
 
Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?AnabelaGuerreiro7
 
VARIEDADES LINGUÍSTICAS - 1. pptx
VARIEDADES        LINGUÍSTICAS - 1. pptxVARIEDADES        LINGUÍSTICAS - 1. pptx
VARIEDADES LINGUÍSTICAS - 1. pptxMarlene Cunhada
 
o ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdfo ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdfCamillaBrito19
 
Rotas Transaarianas como o desrto prouz riqueza
Rotas Transaarianas como o desrto prouz riquezaRotas Transaarianas como o desrto prouz riqueza
Rotas Transaarianas como o desrto prouz riquezaronaldojacademico
 
Dicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelDicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelGilber Rubim Rangel
 
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
 
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptxSlides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptxLuizHenriquedeAlmeid6
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números Mary Alvarenga
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 
Atividade - Letra da música Esperando na Janela.
Atividade -  Letra da música Esperando na Janela.Atividade -  Letra da música Esperando na Janela.
Atividade - Letra da música Esperando na Janela.Mary Alvarenga
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
Portfolio_Trilha_Meio_Ambiente_e_Sociedade.pdf
Portfolio_Trilha_Meio_Ambiente_e_Sociedade.pdfPortfolio_Trilha_Meio_Ambiente_e_Sociedade.pdf
Portfolio_Trilha_Meio_Ambiente_e_Sociedade.pdfjanainadfsilva
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxferreirapriscilla84
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...Rosalina Simão Nunes
 
Aula de História Ensino Médio Mesopotâmia.pdf
Aula de História Ensino Médio Mesopotâmia.pdfAula de História Ensino Médio Mesopotâmia.pdf
Aula de História Ensino Médio Mesopotâmia.pdfFernandaMota99
 
CIÊNCIAS HUMANAS - ENSINO MÉDIO. 2024 2 bimestre
CIÊNCIAS HUMANAS - ENSINO MÉDIO. 2024 2 bimestreCIÊNCIAS HUMANAS - ENSINO MÉDIO. 2024 2 bimestre
CIÊNCIAS HUMANAS - ENSINO MÉDIO. 2024 2 bimestreElianeElika
 
Bullying - Texto e cruzadinha
Bullying        -     Texto e cruzadinhaBullying        -     Texto e cruzadinha
Bullying - Texto e cruzadinhaMary Alvarenga
 

Último (20)

PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdfPROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
 
Manual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envio
 
Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?
 
VARIEDADES LINGUÍSTICAS - 1. pptx
VARIEDADES        LINGUÍSTICAS - 1. pptxVARIEDADES        LINGUÍSTICAS - 1. pptx
VARIEDADES LINGUÍSTICAS - 1. pptx
 
o ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdfo ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdf
 
Rotas Transaarianas como o desrto prouz riqueza
Rotas Transaarianas como o desrto prouz riquezaRotas Transaarianas como o desrto prouz riqueza
Rotas Transaarianas como o desrto prouz riqueza
 
Dicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelDicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim Rangel
 
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!
 
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptxSlides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
Atividade - Letra da música Esperando na Janela.
Atividade -  Letra da música Esperando na Janela.Atividade -  Letra da música Esperando na Janela.
Atividade - Letra da música Esperando na Janela.
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
Portfolio_Trilha_Meio_Ambiente_e_Sociedade.pdf
Portfolio_Trilha_Meio_Ambiente_e_Sociedade.pdfPortfolio_Trilha_Meio_Ambiente_e_Sociedade.pdf
Portfolio_Trilha_Meio_Ambiente_e_Sociedade.pdf
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptx
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
 
Aula de História Ensino Médio Mesopotâmia.pdf
Aula de História Ensino Médio Mesopotâmia.pdfAula de História Ensino Médio Mesopotâmia.pdf
Aula de História Ensino Médio Mesopotâmia.pdf
 
CINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULACINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULA
 
CIÊNCIAS HUMANAS - ENSINO MÉDIO. 2024 2 bimestre
CIÊNCIAS HUMANAS - ENSINO MÉDIO. 2024 2 bimestreCIÊNCIAS HUMANAS - ENSINO MÉDIO. 2024 2 bimestre
CIÊNCIAS HUMANAS - ENSINO MÉDIO. 2024 2 bimestre
 
Bullying - Texto e cruzadinha
Bullying        -     Texto e cruzadinhaBullying        -     Texto e cruzadinha
Bullying - Texto e cruzadinha
 

Classe abstrata garante implementação método

  • 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.