Java e Orientação a Objetos
Uso de Herança de Classes
Prof. Giuliano Prado de Morais Giglio, M.Sc.
A Plataforma Java
Programação Orientada a Objetos em Java
Herança de Classes
Herança de Classes
conta1 numero = “1020-7”
agencia = “025-2”
saldo = 1500,00 valorTaxa = 23,00 limiteCheque = 500,00
emitirExtrato() emitirSaldo() aplicarTaxa() alterarLimite()
Herança de Classes
Representando as
contas Poupança
Herança de Classes
conta1 numero = “1020-7”
agencia = “025-2”
saldo = 1500,00 valorTaxa = 23,00 limiteCheque = 500,00 taxaRendimento = 0
emitirExtrato() emitirSaldo() aplicarTaxa() alterarLimite() aplicarRendimento()
conta2 numero = “2140-8”
agencia = “353-0”
saldo = 2000,00 valorTaxa = 0 limiteCheque = 0 taxaRendimento = 1,5%
emitirExtrato() emitirSaldo() aplicarTaxa() alterarLimite() aplicarRendimento()
Herança de Classes
Herança de Classes
conta1 numero = “1020-7”
agencia = “025-2”
saldo = 1500,00 valorTaxa = 23,00 limiteCheque = 500,00
emitirExtrato() emitirSaldo() aplicarTaxa() alterarLimite()
conta2 numero = “2140-8”
agencia = “353-0”
saldo = 2000,00
taxaRendimento = 1,5%
emitirExtrato() emitirSaldo() aplicarRendimento()
Herança de Classes
? ? ???
Definindo a Herança
Definindo a Herança
Definindo a Herança
? ?
Definindo a Herança
O QUE É HERANÇA?
O QUE É HERANÇA?
n Herança é um mecanismo que permite a uma classe herdar todo o
comportamento e os atributos de outra classe.
n Uma classe que herda de outra classe é chamada subclasse e a classe que fornece a herança é chamada
superclasse.
O QUE É HERANÇA?
n A classe A é a superclasse de B
n A classe B é uma subclasse de A
n A classe B é a superclasse de C, D e E
n As classes C, D e E são subclasses de B
HERANÇA
n As superclasses definem atributos e métodos genéricos que são herdados pelas classes derivadas.
n Um método herdado de uma superclasse pode ser redefinido pela classe derivada, mantendo o mesmo nome mas agindo de forma diferente.
n Normalmente os atributos de um objeto só
podem ser consultados ou modificados através
dos seus métodos ( accessor methods).
HERANÇA EM JAVA
n Java adota o modelo de árvore
n A classe Object é a raiz da hierarquia de classes à qual todas as classes existentes pertencem;
n Quando não declaramos que uma classe estende outra, ela, implicitamente, estende Object
HERANÇA EM JAVA
n Uma classe Java estende apenas uma outra classe (herança simples ou única)
n Para criar uma sub-classe, usamos a
palavra reservada extends
HERANÇA EM JAVA
class ContaCorrente extends ContaBancaria {
....
}
class ContaPoupanca extends ContaBancaria {
....
}
Exemplo do uso de herança
Vamos fazer o exercício
Aula_Herança.pdf disponível no site, o qual terá todos os detalhes
da implementação da herança de
classes em java.
HERANÇA EM JAVA
n Como os métodos são organizados em uma hierarquia de classes:
HERANÇA EM JAVA
Anulação - Sobreposição – Sobrescrita ou “overriding”
n Funcionamento quando uma subclasse
define um método que possui o mesmo
nome, tipo de retorno e argumentos que
um método definido em uma superclasse.
HERANÇA EM JAVA
EXEMPLO DE HERANÇA
EM JAVA
SOBRECARGA E ANULAÇÃO
n Sobrecarga de Métodos (overloading)
• Definir mais de um método com mesmo nome mas com assinaturas (parâmetros) diferentes.
n Anulação de Métodos (overriding)
• Definir um novo método com mesmo nome e assinatura de outro de uma superclasse.
n Métodos final não podem ser sobrepostos.
EXEMPLO DE SOBRECARGA E
ANULAÇÃO
THIS e SUPER
n Usados quando for necessário referenciar explicitamente a instância (this) ou a
superclasse (super).
CONTROLE DE ACESSO:
‘PROTECTED’
n Java permite declararmos um membro
(método ou atributo) que, embora não seja acessível por outras classes, é herdado por suas sub-classes
n Para isso usamos o modificador de
controle de acesso protected
RESUMO DE VISIBILIDADE
n Resumindo:
• private: membros que são vistos só pela própria classe e não são herdados por nenhuma outra
• public: membros são vistos e herdados por qualquer classe
• protected: membros que são vistos pelas classes do pacote e herdados por qualquer outra classe
• package: membros que são vistos e herdados pelas classes do pacote
ESPECIALIZAÇÃO X EXTENSÃO
n Uma classe pode herdar de outra para especializá-la redefinindo métodos, sem ampliar sua interface.
n Uma classe pode herdar de outra para estendê-la declarando novos métodos e, dessa forma, ampliando sua interface.
n As duas coisas podem acontecer
simultaneamente
Java e Orientação a Objetos
Herança
método toString()
Prof. Giuliano Prado de Morais Giglio, M.Sc.
A Plataforma Java
Programação Orientada a Objetos em Java
A classe Object
n O Java possui uma hierarquia de classes a qual toda sua API (biblioteca de classes) está estruturada, em uma grande herança.
n A classe “pai de todas”, de onde, por
default, todas as demais classes herdam dela chama-se Object.
n Ela possui alguns métodos “prontos” que
podem ser então utilizados pelas demais
classes, ou serem sobreescritos.
A classe Object
n boolean equals (Object X): compara dois objetos se são iguais, ou seja, se o objeto que está chamando o método é igual ao objeto X passado por parâmetro;
n Class getClass(): retorna a classe do objeto chamador do método;
n String toString(): retorna uma string representando o objeto que o chama.
O método toString()
n Particularmente, estamos interessados no método toString() no qual podemos formatar uma saída dos dados de um determinado objeto, ou seja, formatar um objeto da forma como desejarmos, para por exemplo, mostra-lo na tela.
n Como o próprio nome do método diz, essa saída necessariamente será uma string!
n Como mencionamos que há uma herança de nossa classe com a classe Object, não precisamos, nesse caso, usarmos o comando extends, pois ela já existe!
n Logo, é só começar a usar!
Exemplo do uso de toString()
class Produto {
int
codigo;String
nome;String
fornecedor;float
preco;public String toString() //temos que respeitar a
{ assinatura do método
String
str=""; //criamos uma string auxiliar vazia;//seguimos montando a string, concatenando os dados desejados.
str
=
str+ "Nome: " +
nome;str
=
str+ " Codigo: " +
codigo;str
=
str+ " Preço: " +
preco;return
str; //ao final, devemos retornar a string }Exemplo do uso de toString()
class Produto {
int
codigo;String
nome;String
fornecedor;float
preco;public String toString() {
String
str="";str
=
str+ "Nome: " +
nome;str
=
str+ " Código: " +
codigo;str
=
str+ " Preço: " +
preco;return
str;}
A saída será:
Nome: Farinha Código: 10 Preço: 7.80
Não usamos o fornecedor, por escolha.
Você não é obrigado a utilizar todos os atributos
Exemplo do uso de toString()
class Produto {
int
codigo;String
nome;String
fornecedor;float
preco;public String toString() {
String
str="";str
=
str+ "Nome: " +
nome;str
=
str+ "\nCódigo: " +
codigo;str
=
str+ "\nPreço: " +
preco;return
str;}
Podemos colocar o \n para termos uma saída melhor:
Nome: Farinha Código: 10 Preço: 7.80
O método toString()
n Para usarmos o método na hora que desejarmos os dados do objeto, como por exemplo, mostra-lo na tela, fica ainda mais fácil!
Produto prod1 = new Produto(10, “Farinha”, 7.80);
System.out.println(“Dados do objeto\n: ” + prod1);
n Repare que só estamos utilizando o objeto direto, sem
invocar o método toString(). O que ocorre é que o
método toString() é invocado automaticamente e vai
produzir aquela saída que formatamos dentro dele.
O método toString()
n Toda vez que você precisar mostrar os dados de um objeto numa classe, USE O MÉTODO toString()
n É a maneira mais correta e profissional de se fazer a saída de um objeto!
Java e Orientação a Objetos
Polimorfismo
Prof. Giuliano Prado de Morais Giglio, M.Sc.
A Plataforma Java
Programação Orientada a
Objetos em Java
POLIMORFISMO
n Polimorfismo – as definições clássicas (e confusas) de polimorfismo são:
A - “Capacidade que uma operação [método]
assumir mais de uma implementação em classes diferentes”
e
B - “Capacidade de um determinado atributo referenciar objetos de diferentes tipos,
assumindo assim várias formas”
POLIMORFISMO
n A situação “A” significa que se
considerarmos uma hierarquia de classes, as diferentes subclasses podem redefinir um determinado método da classe pai (ou base).
n A situação “B” significa que podemos ter
um atributo (ou variável) definido como do
tipo base, mas referenciando objetos das
subclasses.
POLIMORFISMO
n A importância do polimorfismo está no fato de que, em determinadas circunstâncias, podemos ter um atributo (ou variável) do tipo base referenciando objetos das
classes derivadas [B] e executaremos um método definido na classe base porém redefinido nas subclasses [A].
POLIMORFISMO
n É a capacidade de um objeto tomar várias formas
n A capacidade polimórfica decorre
diretamente do mecanismo de herança
n Ao estendermos ou especializarmos uma
classe, não perdemos compatibilidade
com a superclasse
POLIMORFISMO
n Exemplo
• Veículo é uma superclasse
n Automóvel é subclasse de veículo
• class Veiculo{...}
• class Automovel extends Veiculo {...}
n Sempre que precisarmos de um Veículo, podemos usar um Automóvel, ou um
Caminhão, ou Ônibus em seu lugar
Exemplo de Polimorfismo
Sobreescritos
(override)
Exemplo de Polimorfismo
n Atendente, Gerente e Estoquista herdam de Funcionario.
n O método calcularSalarioLiquido () será sobrescrito, ou seja, cada tipo de Funcionário possui o seu próprio método de calcular o seu salário liquido (para cada tipo tem sua regra diferente)
POLIMORFISMO
classe Gerente extends Funcionario { ... }
classe Atendente extends Funcionario { ... }
classe Estoquista extends Funcionario
{ ... }
Exemplo de Polimorfismo
Quem define qual instância teremos é o CONSTRUTOR!
“devolve um Atendente” = new Atendente();
“devolve um Gerente” = new Gerente();
“devolve um Estoquista” = new Estoquista();
Exemplo de Polimorfismo
Logo, para mantermos a coerência computacional e das regras de tipos de dados:
Atendente a1 = new Atendente();
Gerente g1 = new Gerente();
Estoquista e1 = new Estoquista();
Exemplo de Polimorfismo
n Observe que teríamos que criar uma
variável para cada “tipo” de objeto, para cada classe derivada;
n O conceito de polimorfismo modifica (e facilita) a implementação, possibilitando declararmos uma variável da classe base e esta poderá receber um
objeto de qualquer uma de suas classes derivadas;
Exemplo de Polimorfismo
Funcionario func;
func = new Atendente();
// a partir de agora, func tem um Atendente e funciona como tal
func = new Gerente();
// a partir de agora, func tem um Gerente e funciona como tal
func = new Estoquista();
// a partir de agora, func tem um Estoquista e funciona como tal
POLIMORFISMO
n Exemplo:
public class Funcionario { }
public class Gerente extends Funcionario {
String departamento;
}
Funcionario f = new Gerente(); (OK)
f.departamento = “Financeiro”; (ERRADO)
POLIMORFISMO
n Polimorfismo é o nome formal para o fato de que, quando precisamos de um objeto de determinado tipo, podemos usar uma versão mais especializada dele.
n Esse fato pode ser bem entendido
analisando-se a árvore de hierarquia de
classes.
Exemplo de Polimorfismo
O polimorfismo garante a sobreescrita dos métodos:
Funcionario func;
func = new Atendente();
func.calcularSalarioLiquido();
// como o método foi sobreposto, apesar de func ser Funcionario, é o cálculo de Atendente que será executado >>é a instância que manda!
func = new Gerente();
func.calcularSalarioLiquido();
// aqui é o cálculo doGerente que é disparado;
func = new Estoquista();
func.calcularSalarioLiquido();
//
o mesmo ocorre aqui comEstoquista.Acesso a membros específicos
n Porém, quando o método é específico da subclasse (e não sobreescrito), o
polimorfismo não garante o acesso:
n
Exemplo:
public class Funcionario { }
public class Gerente extends Funcionario {
String departamento;
public void aplicarLucros(int percentual){
...
} //específico de gerente }
Acesso a membros específicos
Funcionario func = new Gerente();
func.calcularSalarioLiquido(); (OK, pois foi sobreescrito )
func.mostrarDados(); (OK, pois tem na superclasse e foi herdado ) func.aplicarLucros(20); (ERRADO, não há na superclasse!)
O polimorfismo não acessa, apesar de termos uma instância de Gerente
O processo de Casting
n Como resolvermos esse impasse?
n Devemos fazer o “casting” de objetos!
n DEFINIÇÃO:
Casting é a transformação de uma determinada
variável com valor / referência de tipo menos
específico (subclasse) para uma variável de tipo
mais específico (superclasse) e vice-versa.
O processo de casting
String departamento;
calcularSalarioLiquido() aplicarLucros()
func .
Funcionario func = new Gerente();
calcularSalarioLiquido()
mostrarDados()
Interface de Funcionario
Interface de Gerente
Com o casting, precisamos acessar a instância de Gerente presente na variável func.
O processo de casting
String departamento;
calcularSalarioLiquido()
mostrarDados()
aplicarLucros()
func .
Funcionario func = new Gerente();
func.calcularSalarioLiquido(); //Ok!
func.aplicarLucros(20); //NÃO!
((Gerente) func).aplicarLucros(20);
// APLICOU O CASTING!
Interface de Gerente
O OPERADOR instanceof
String departamento;
calcularSalarioLiquido() contarAtendimentos()
func .
calcularSalarioLiquido()
mostrarDados()
Interface de Funcionario
Interface de Atendente
Mas e se a instância em func não for Gerente e sim outra, como Atendente?
Funcionario func = new Atendente();
...
((Gerente) func).aplicarLucros(20);
// ERRADO, pois não há instância de Gerente em func
OPERADOR ‘instanceof’
n Utilizado para saber o real tipo do objeto usado.
Funcionario func = new Gerente();
if (func instanceof Gerente) //ok!
((Gerente) func).aplicarLucros(20);
Funcionario func = new Atendente();
if (func instanceof Gerente) // Não entra!
((Gerente) func).aplicarLucros(20);
// Evita o acesso indevido!Java e Orientação a Objetos
Classes Abstratas
Prof. Giuliano Prado de Morais Giglio, M.Sc.
A Plataforma Java
Programação Orientada a Objetos em Java
CLASSES ABSTRATAS
n Ao criarmos uma classe para ser estendida, às vezes, codificamos alguns métodos para os quais não sabemos dar uma implementação, ou seja, um método que só subclasses saberão implementar.
n Uma classe deste tipo não pode ser
instanciada pois sua funcionalidade está
incompleta. Tal classe é dita abstrata.
CLASSES ABSTRATAS EM JAVA
n Java suporta o conceito de classes abstratas: podemos declarar uma classe abstrata usando o modificador abstract.
n Métodos podem ser declarados abstratos para que suas implementações sejam adiadas para as subclasses. Da mesma forma, usamos o modificador abstract e omitimos a implementação desse método.
CLASSES ABSTRATAS
EM JAVA
CLASSES ABSTRATAS EM JAVA
n Observe que o método
calcularSalarioLiquido() não deverá (ou não terá) implementação na classe Funcionário;
n A regra depende de cada tipo, ou seja, somente quando tivermos Gerente, Atendente ou Estoquista é que implementaremos o cálculo para cada um.
CLASSES ABSTRATAS EM JAVA
n Se deixarmos o método
calcularSalarioLiquido() sem
implementação (sem corpo) na classe
Funcionário, dará erro de compilação (não pode haver método “incompleto”);
n Esse é um dos motivos de usarmos a
classe Abstrata!
CLASSES ABSTRATAS EM JAVA
public abstract class Funcionario {
public abstract float calcularSalarioLiquido();
}
public class Gerente extends Funcionario {
public calcularSalarioLiquido() {
...
} }
Método sem corpo
Um método abstrato é obrigado a ser implementado na
subclasse
Interfaces
Prof. Giuliano Prado de Morais Giglio, M.Sc.