Sie sind auf Seite 1von 64

CAPACITAO EM JAVA

MDULO #3
ORIENTAO A OBJETOS EM JAVA
Carga Horria: 20h

Departamento de Cincias Exatas e Naturais


Projeto de Extenso Edital PROEC 019/2013
Atualizado em Janeiro de 2015

Mdulo #3
Sumrio Geral

Encapsulamento

Herana

Motivao

Sobrecarga de Mtodos

Sobrescrita de Mtodos

java.lang.Object

Polimorfismo

Classes Abstratas

Interfaces

Motivao
O QUE FAZER?
Vamos desenvolver
uma aplicao para
uma empresa que
possui uma equipe
de empregados, tais
como, gerentes,
engenheiros, etc...

Como modelar
empregado?

Modelagem e Codificao
Empregado
public class Empregado{
private String nome;
private long cpf;
private double salario;
//construtor omitido
//getters e setters omitidos
public String toString(){
return nome + +
cpf + + salario;
}
}

Como modelar
gerente?

Modelagem e Codificao
Gerente
public class Gerente{
private String nome;
private long cpf;
private double salario;
private String departamento;
//construtor omitido
//getters e setters omitidos
public String toString(){
return nome + +
cpf + + salario
+ + departamento;
}
}

Modelagem Inicial
Um gerente tem tudo o que
um empregado tem!

Modelagem Inicial
Essa repetio dificulta a manuteno do
software, pois uma mudana pode implicar
alteraes em vrias partes do cdigo

Modelagem Inicial
Imagine a manuteno de todas as classes se
quisermos manter o estado civil de todos os
funcionrios...
PRATO-CHEIO para introduzir BUGS no sistema!

Como evitar essa


repetio de cdigo?

Efetuando REFATORAMENTO!
Vamos limpar o cdigo que representar
um prato-cheio para os bugs

Representando herana
em UML

Modelagem com Herana


Agora, um gerente
pode ser visto como
um empregado!

HERANA!

Relacionamento -um

Aplicada quando tipos diferentes de objetos


podem ter algo em comum, por exemplo:
Mensagem (genrica) e mensagem de udio,
mensagem de vdeo, mensagem multimdia, etc.
Avio (genrico) e avio supersnico, avio
caa, avio monomotor, etc.
Pessoa (genrica) e programador, funcionrio,
estudante, etc.

Classes podem herdar atributos e


mtodos de outras classes

Herana

Habilidade de definir novas classes


baseadas em classes j existentes

Sintaxe

[modificador] SubClasse extends SuperClasse{


...
}

Exemplo
Codificao
public class Empregado {
private String nome;
private long cpf;
private double salario;
//construtor, getters e setters omitidos
public String toString(){
return nome + + cpf + + salario;
}
}

Exemplo
Codificao

public class Gerente extends Empregado {


private String departamento;
//construtor, getters e setters omitidos
public String toString(){
return departamento;
}
}

Hierarquia de Classes
CLASSES MAIS
GENRICAS
estende ou herda
atributos e mtodos

SUPERCLASSE

CLASSES MAIS
ESPECFICAS
SUBCLASSE

SUBCLASSE

SUBCLASSE

Hierarquia de Classes
Exemplo

E, agora, como tratar o


encapsulamento na

hierarquia de classes?

Encapsulamento

Encapsulamento

A LEI no posso QUEBRAR


o que no posso ACESSAR

Entendendo os Modificadores
de Acesso
private
Modificador
private
default
protected
public

default
Mesma
classe

protected
Mesmo
pacote

public

Subclasse

Universal

O acesso protegido provido a subclasses


mesmo se residirem em pacotes diferentes!

Hierarquia de Classes e Encapsulamento


Exemplo

Hierarquia de Classes e Encapsulamento


Exemplo

possvel acessar
atributos nas subclasses
diretamente, desde que
tenham visibilidade
protected

Mas, bom considerar


membros protected?

No! Causa um FORTE


ACOMPLAMENTO entre as classes
Voc precisa de uma TIMA
JUSTIFICATIVA para permitir
atributos protected!!!

Por que forte


acomplamento um
problema?

ACOMPLAMENTO a medida de quo fortemente


uma classe est conectada, possui conhecimento
ou depende de outra classe

Resultado do forte acomplamento?


DIFICULDADE DE MANUTENO (alteraes
em cascata) e de REUSO (afinal, uma classe
depende da presena de outras classes)

Acomplamento

Minimizar o ACOPLAMENTO
uma das LEIS de ouro da OO

Em Java, Herana Simples!

Em Java, uma classe pode estender apenas


uma outra classe
Com interfaces, obtemos a maioria dos
benefcios da herana mltipla, sem a
necessidade de nos preocuparmos com seus
efeitos colaterais

Vamos estudar mais adiante o porqu!!!

Como podemos referenciar


atributos e mtodos da

superclasse de uma classe?

super

usado em uma classe para referenciar


atributos e/ou mtodos 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


Herana! Mas, como

instanciar as classes?

CONSTRUTORES NO SO HERDADOS
Afinal, no so mtodos nem atributos
Mas, 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

Necessrio para garantir que o objeto da


superclasse ser corretamente instanciado!

Herana, this e super

this uma referncia prpria classe, super uma


referncia superclasse
Usa-se

this() para invocar construtores da prpria classe

super() para invocar construtores da superclasse

this. para acessar os atributos e invocar mtodos da


prpria classe

super. para acessar os atributos e invocar mtodos da


superclasse

Exemplo
Codificao
public class
private
private
private

Empregado {
String nome;
long cpf;
double salario;

public Empregado(String nome, long cpf,


double salario){
this.nome = nome;
this.cpf = cpf
this.salario = salario;
}
//getters e setters omitidos
public String toString(){
return nome + + cpf + + salario;
}
}

Exemplo
Codificao
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 omitidos
public String toString(){
return super.toString() + departamento;
}
}

Construtores e Herana
public Gerente() {
}
igual a
public Gerente() {
super();
}
Caso o construtor no 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

Exemplo
Codificao
public class
private
private
private

Empregado {
String nome;
long cpf;
double salario;

//construtor no declarado
//getters e setters omitidos
public String toString(){
return nome + + cpf + + salario;
}
}

Exemplo
Codificao
public class Gerente extends Empregado {
private String departamento;
public Gerente(String departamento){
super();
this.departamento = departamento;
}
//getters e setters omitidos
public String toString(){
return super.toString() + departamento;
}
}

Exemplo
Codificao
public class Gerente extends Empregado {
private String departamento;
public Gerente(String departamento){
this.departamento = departamento;
}
//getters e setters omitidos
public String toString(){
return super.toString() + departamento;
}
}

Mdulo #3
Sumrio Geral

Encapsulamento

Herana

Motivao

Sobrecarga de Mtodos

Sobrescrita de Mtodos

java.lang.Object

Polimorfismo

Classes Abstratas

Interfaces

Sobrecarga de Mtodos

Sobrecarregamos um mtodo quando


desejamos que o mesmo mtodo tambm
seja implementado favorecendo entradas
diferentes
Foco: em tempo de execuo, no tipo de
retorno e nome do mtodo e na sequncia
exata dos tipos de seus argumentos

Sobrecarga de Mtodos
Exemplos
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?

Mdulo #3
Sumrio Geral

Encapsulamento

Herana

Motivao

Sobrecarga de Mtodos

Sobrescrita de Mtodos

java.lang.Object

Polimorfismo

Classes Abstratas

Interfaces

Sobrescrita de Mtodos

Ocorre quando desejamos que um mtodo


herdado seja implementado de modo
diferente na subclasse

A assinatura do mtodo no muda, apenas a


implementao/funcionalidade

Regras de sobreposio
private

default

protected

public

Um mtodo no pode ser menos acessvel


que um mtodo que ele sobrescreve!

Sobrescrita de Mtodos
Exemplo
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 Mtodos
Exemplo

public class Gerente extends Empregado{

private String departamento;


//construtor, getters e setters omitidos
public String toString(){
return super.toString() + + departamento;
}

Mdulo #3
Sumrio Geral

Encapsulamento

Herana

Motivao

Sobrecarga de Mtodos

Sobrescrita de Mtodos

java.lang.Object

Polimorfismo

Classes Abstratas

Interfaces

java.lang.Object

Em Java, todas as classes so subclasses de


Object
As declaraes da classe Exemplo so
equivalentes
public class Exemplo{}
public class Exemplo extends Object
{}

Mtodos Herdados

Toda classe em Java j possui implementados


diversos mtodos herdados da Object
Os mais relevantes

equals()

hashCode()

toString()

finalize()

public String toString()

Ao exibir um objeto, apresentada a string


retornada pelo mtodo

Pessoa p = new Pessoa ("Jos", 21);


System.out.println(p);

Se esse mtodo no for sobrescrito, exibido o


nome qualificado da classe @ hashcode

pessoas.Pessoa@29841f

Se sobrescrito, pode retornar o que desejar

Jos tem 21 anos

public boolean equals(Object o)

Compara 2 objetos

Pessoa p1 = new Pessoa (Jos, 21);


Pessoa p2 = new Pessoa (Jos, 21);
System.out.println(p1.equals(p2));

Se o mtodo no for sobrescrito, ele verifica se ambos


os objetos ocupam a mesma posio na memria
Se sobrescrito, para comparar os valores de seus
atributos, o resultado pode ser distinto

public int hashCode()


Pessoa p = new Pessoa (Jos, 21);
System.out.println(p.hashcode);

Retorna o cdigo hash de um objeto, que pode ser um


nmero inteiro positivo ou negativo
Objetos iguais retornam cdigos hash idnticos
Observao. Se o mtodo equals() for sobrescrito, o
mtodo hash tambm deve ser!

protected void finalize() throws


Throwable
@Override
protected void finalize() throws Throwable {
System.out.println(Adeus mundo cruel!);
}

Executado no momento em que o GC vai liberar a


memria ocupada pelo objeto
A implementao padro (em Object) vazia

Se sobreposto, pode fazer o que desejar

Por exemplo, fechar uma conexo, etc...

Exemplo
Usando 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
@Override
public String toString(){
return this.nome + " tem "
+ this.idade + " anos";
}

Exemplo
Usando java.lang.Object
@Override
public void finalize(){
System.out.println("Bye: " +
this); //this.toString()
}
@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + idade;
result = prime * result +
((nome == null) ?
0 : nome.hashCode());
return result;
}

Exemplo
Usando 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. Programao Orientada a Objetos
com Java. Janeiro de 2014

Referncias

Programao Orientada a Objetos, Livia


Maria Rodrigues Sampaio Campos e Raquel
Vigolvino Lopes, UFCG, acesso em Janeiro de
2015

Das könnte Ihnen auch gefallen