CAPACITAÇÃO EM JAVA
MÓDULO #3MÓDULO #3ORIENTAÇÃO A OBJETOS EM JAVAORIENTAÇÃO A OBJETOS EM JAVA
Carga Horária: 20hCarga Horária: 20h
Departamento de Ciências Exatas e NaturaisProjeto de Extensão Edital PROEC 019/2013
Atualizado em Janeiro de 2015
Módulo #3Sumário Geral● Encapsulamento● Herança
– Motivação
– Sobrecarga de Métodos
– Sobrescrita de Métodos
– java.lang.Object
● Polimorfismo● Classes Abstratas● Interfaces
Motivação
O QUE FAZER?
Vamos desenvolver uma aplicação para
uma empresa que possui uma equipe
de empregados, tais como, gerentes,
engenheiros, etc...
Como modelar empregado?
Modelagem e Codificação Empregado
public class Empregado{private String nome;private long cpf;private double salario;//construtor omitido//getters e setters omitidospublic String toString(){
return nome + ” ” + cpf + ” ” + salario;
}}
Como modelar gerente?
Modelagem e Codificação Gerente
public class Gerente{private String nome;private long cpf;private double salario;private String departamento;//construtor omitido//getters e setters omitidospublic String toString(){
return nome + ” ” + cpf + ” ” + salario+ ” ” + departamento;
}}
Um gerente tem tudo o que um empregado tem!
Modelagem Inicial
Um gerente tem tudo o que um empregado tem!
Essa repetição dificulta a manutenção do software, pois uma mudança pode implicar
alterações em várias partes do código
Modelagem Inicial
Imagine a manutenção de todas as classes se quisermos manter o estado civil de todos os
funcionários...PRATO-CHEIO para introduzir BUGS no sistema!
Modelagem Inicial
Como evitar essa repetição de código?
Efetuando REFATORAMENTO!
Vamos limpar o código que representar um prato-cheio para os bugs
Agora, um gerente pode ser visto como
um empregado!
Modelagem com HerançaRe
pres
enta
ndo
hera
nça
em U
ML
HERANÇA!Relacionamento ”é-um”
Aplicada quando tipos diferentes de objetos podem ter algo em comum, por exemplo:
Mensagem (genérica) e mensagem de áudio,mensagem de vídeo, mensagem multimídia, etc.
Avião (genérico) e avião supersônico, aviãocaça, avião monomotor, etc.
Pessoa (genérica) e programador, funcionário,estudante, etc.
Classes podem herdar atributos e métodos de outras classes
Herança
● Habilidade de definir novas classes baseadas em classes já existentes
Sintaxe
[modificador] SubClasse extends SuperClasse{...
}
ExemploCodificação
public class Empregado {
private String nome;private long cpf;private double salario;
//construtor, getters e setters omitidos
public String toString(){return nome + ” ” + cpf + ” ” + salario;
}}
ExemploCodificação
public class Gerente extends Empregado {
private String departamento;
//construtor, getters e setters omitidos
public String toString(){return departamento;
}
}
Hierarquia de Classes
SUPERCLASSE
SUBCLASSE SUBCLASSE SUBCLASSE
CLASSES MAIS GENÉRICAS
CLASSES MAIS ESPECÍFICAS
este
nde
ou h
erda
at
ribut
os e
mét
odos
Hierarquia de ClassesExemplo
E, agora, como tratar o encapsulamento na
hierarquia de classes?
Encapsulamento
Encapsulamento
A LEI é não posso QUEBRARo que não posso ACESSAR
Entendendo os Modificadores de Acesso
private default protected public
ModificadorMesma classe
Mesmo pacote
Subclasse Universal
private √default √ √
protected √ √ √public √ √ √ √
O acesso protegido é provido a subclasses mesmo se residirem em pacotes diferentes!
Hierarquia de Classes e EncapsulamentoExemplo
Hierarquia de Classes e EncapsulamentoExemplo
É possível acessar atributos nas subclasses diretamente, desde que
tenham visibilidade protected
Mas, é bom considerar membros protected?
Não! Causa um FORTEACOMPLAMENTO entre as classes
Você precisa de uma ÓTIMA JUSTIFICATIVA para permitir
atributos protected!!!
Por que forte acomplamento é um
problema?
ACOMPLAMENTO é a medida de quão fortemente uma classe está conectada, possui conhecimento
ou depende de outra classe
Resultado do forte acomplamento?DIFICULDADE DE MANUTENÇÃO (alterações em cascata) e de REUSO (afinal, uma classe
depende da presença de outras classes)
Acomplamento
Minimizar o ACOPLAMENTO é uma das LEIS de ouro da OO
Em Java, Herança Simples!
● Em Java, uma classe pode estender apenas uma outra classe
● Com interfaces, obtemos a maioria dos benefícios da herança múltipla, sem a necessidade de nos preocuparmos com seus efeitos colaterais– Vamos estudar mais adiante o porquê!!!
Como podemos referenciar atributos e métodos da
superclasse de uma classe?
super
● É usado em uma classe para referenciar atributos e/ou métodos de sua superclasse
public class Gerente extends Empregado{ private String departamento; //construtor, getters e setters omitidos
public String toString(){ return super.toString() + ” ” + departamento; }
}
Entendi essa ideia de Herança! Mas, como instanciar as classes?
CONSTRUTORES NÃO SÃO HERDADOS
Afinal, não são métodos nem atributosMas, existe um modo simples de invocar
o construtor da superclasse!
super, de novo!
● No construtor de uma subclasse, usamos super para invocar o construtor da superclasse– Necessário para garantir que o objeto da
superclasse será corretamente instanciado!
Herança, this e super● this é uma referência à própria classe, super é uma
referência à superclasse● Usa-se
– this() para invocar construtores da própria classe– super() para invocar construtores da superclasse– this. para acessar os atributos e invocar métodos da
própria classe– super. para acessar os atributos e invocar métodos da
superclasse
ExemploCodificação
public class Empregado {private String nome;private long cpf;private double salario;
public Empregado(String nome, long cpf, double salario){
this.nome = nome;this.cpf = cpfthis.salario = salario;
} //getters e setters omitidospublic String toString(){
return nome + ” ” + cpf + ” ” + salario;}
}
ExemploCodificação
public class Gerente extends Empregado {private String departamento;
public Gerente(String nome, long cpf, double salario, String departamento){
super(nome, cpf, salario); this.departamento = departamento; }
//getters e setters omitidospublic String toString(){
return super.toString() + departamento;}
}
Construtores e Herança
é igual a
● Caso o construtor não seja invocado explicitamente, Java insere uma chamada super() que, na verdade, invoca o construtor default da superclasse imediata
● Em uma hierarquia, só podemos deixar de invocar o construtor da superclasse, se e somente se, a superclasse tiver um construtor default
public Gerente() {}
public Gerente() { super();}
ExemploCodificação
public class Empregado {private String nome;private long cpf;private double salario;
//construtor não declarado
//getters e setters omitidospublic String toString(){
return nome + ” ” + cpf + ” ” + salario;}
}
ExemploCodificação
public class Gerente extends Empregado {private String departamento;
public Gerente(String departamento){ super(); this.departamento = departamento; }
//getters e setters omitidospublic String toString(){
return super.toString() + departamento;}
}
ExemploCodificação
public class Gerente extends Empregado {private String departamento;
public Gerente(String departamento){ this.departamento = departamento; }
//getters e setters omitidospublic String toString(){
return super.toString() + departamento;}
}
Módulo #3Sumário Geral● Encapsulamento● Herança
– Motivação
– Sobrecarga de Métodos
– Sobrescrita de Métodos
– java.lang.Object
● Polimorfismo● Classes Abstratas● Interfaces
Sobrecarga de Métodos
● Sobrecarregamos um método quando desejamos que o mesmo método também seja implementado favorecendo entradas diferentes
● Foco: em tempo de execução, no tipo de retorno e nome do método e na sequência exata dos tipos de seus argumentos
Sobrecarga de MétodosExemplos
public void metodo(String s) { }
public void metodo() { }
public void metodo(int i, String s) { }
public int metodo (String s, int i) { }
public void metodo(String s, int i) { }
E se, em uma subclasse, precisarmos modificar o
comportamento herdado de sua superclasse?
Módulo #3Sumário Geral● Encapsulamento● Herança
– Motivação
– Sobrecarga de Métodos
– Sobrescrita de Métodos
– java.lang.Object
● Polimorfismo● Classes Abstratas● Interfaces
Sobrescrita de Métodos
● Ocorre quando desejamos que um método herdado seja implementado de modo diferente na subclasse– A assinatura do método não muda, apenas a
implementação/funcionalidade● Regras de sobreposição
private default protected public
Um método não pode ser menos acessível que um método que ele sobrescreve!
Sobrescrita de MétodosExemplo
public class Empregado {
private String nome;private long cpf;private double salario;
//construtor, getters e setters omitidos
public String toString(){return nome + ” ” + cpf + ” ” + salario;
}
}
Sobrescrita de MétodosExemplo
public class Gerente extends Empregado{ private String departamento; //construtor, getters e setters omitidos public String toString(){ return super.toString() + ” ” + departamento; }
}
Módulo #3Sumário Geral● Encapsulamento● Herança
– Motivação
– Sobrecarga de Métodos
– Sobrescrita de Métodos
– java.lang.Object
● Polimorfismo● Classes Abstratas● Interfaces
java.lang.Object
● Em Java, todas as classes são subclasses de Object
● As declarações da classe Exemplo são equivalentespublic class Exemplo{…}
public class Exemplo extends Object {…}
Métodos Herdados
● Toda classe em Java já possui implementados diversos métodos herdados da Object
● Os mais relevantes– equals()– hashCode()– toString()– finalize()
public String toString()
● Ao exibir um objeto, é apresentada a string retornada pelo método
● Se esse método não for sobrescrito, é exibido o nome qualificado da classe @ hashcode
● Se sobrescrito, pode retornar o que desejar
Pessoa p = new Pessoa ("José", 21);System.out.println(p);
pessoas.Pessoa@29841f
José tem 21 anos
public boolean equals(Object o)
● Compara 2 objetos
● Se o método não for sobrescrito, ele verifica se ambos os objetos ocupam a mesma posição na memória
● Se sobrescrito, para comparar os valores de seus atributos, o resultado pode ser distinto
Pessoa p1 = new Pessoa (”José”, 21);Pessoa p2 = new Pessoa (”José”, 21);System.out.println(p1.equals(p2));
public int hashCode()
● Retorna o código hash de um objeto, que pode ser um número inteiro positivo ou negativo
● Objetos iguais retornam códigos hash idênticos● Observação. Se o método equals() for sobrescrito, o
método hash também deve ser!
Pessoa p = new Pessoa (”José”, 21);System.out.println(p.hashcode);
protected void finalize() throws Throwable
● Executado no momento em que o GC vai liberar a memória ocupada pelo objeto
● A implementação padrão (em Object) é vazia– Se sobreposto, pode fazer o que desejar
● Por exemplo, fechar uma conexão, etc...
@Overrideprotected void finalize() throws Throwable { System.out.println(”Adeus mundo cruel!”);}
ExemploUsando java.lang.Object
public class Pessoa { private String nome; private int idade; public Pessoa(String nome, int idade){ this.nome = nome; this.idade = idade; }//getters e setters omitidos
@Overridepublic String toString(){ return this.nome + " tem " + this.idade + " anos";}
ExemploUsando java.lang.Object
@Overridepublic void finalize(){ System.out.println("Bye: " + this); //this.toString()}@Overridepublic int hashCode(){ final int prime = 31; int result = 1; result = prime * result + idade; result = prime * result + ((nome == null) ? 0 : nome.hashCode()); return result;}
ExemploUsando java.lang.Object
@Override public boolean equals( Object o ){ if ( o != null && o instanceof Pessoa ){ Pessoa p = (Pessoa) o; return p.nome.equals( this.nome ) && p.idade == this.idade; } return false; }}
Leitura Recomendada
● Java Tutorial, available on http://docs.oracle.com/javase/tutorial/java, August 2014
● K. Sierra, B. Bates. OCA/OCP Java SE 7 Programmer I & II Study Guide. Oracle Press, September 2013
● R. Terra. Programação Orientada a Objetos com Java. Janeiro de 2014
Referências
● Programação Orientada a Objetos, Livia Maria Rodrigues Sampaio Campos e Raquel Vigolvino Lopes, UFCG, acesso em Janeiro de 2015