64
CAPACITAÇÃO EM JAVA MÓDULO #3 MÓDULO #3 ORIENTAÇÃO A OBJETOS EM JAVA ORIENTAÇÃO A OBJETOS EM JAVA Carga Horária: 20h Carga Horária: 20h Departamento de Ciências Exatas e Naturais Projeto de Extensão Edital PROEC 019/2013 Atualizado em Janeiro de 2015

Aula02 - Herança

Embed Size (px)

DESCRIPTION

Aula de JAVA sobre herança

Citation preview

Page 1: Aula02 - Herança

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

Page 2: Aula02 - Herança

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

Page 3: Aula02 - Herança

Motivação

O QUE FAZER?

Vamos desenvolver uma aplicação para

uma empresa que possui uma equipe

de empregados, tais como, gerentes,

engenheiros, etc...

Page 4: Aula02 - Herança

Como modelar empregado?

Page 5: Aula02 - Herança

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;

}}

Page 6: Aula02 - Herança

Como modelar gerente?

Page 7: Aula02 - Herança

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;

}}

Page 8: Aula02 - Herança

Um gerente tem tudo o que um empregado tem!

Modelagem Inicial

Um gerente tem tudo o que um empregado tem!

Page 9: Aula02 - Herança

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

Page 10: Aula02 - Herança

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

Page 11: Aula02 - Herança

Como evitar essa repetição de código?

Page 12: Aula02 - Herança

Efetuando REFATORAMENTO!

Vamos limpar o código que representar um prato-cheio para os bugs

Page 13: Aula02 - Herança

Agora, um gerente pode ser visto como

um empregado!

Modelagem com HerançaRe

pres

enta

ndo

hera

nça

em U

ML

Page 14: Aula02 - Herança

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

Page 15: Aula02 - Herança

Herança

● Habilidade de definir novas classes baseadas em classes já existentes

Page 16: Aula02 - Herança

Sintaxe

[modificador] SubClasse extends SuperClasse{...

}

Page 17: Aula02 - Herança

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;

}}

Page 18: Aula02 - Herança

ExemploCodificação

public class Gerente extends Empregado {

private String departamento;

//construtor, getters e setters omitidos

public String toString(){return departamento;

}

}

Page 19: Aula02 - Herança

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

Page 20: Aula02 - Herança

Hierarquia de ClassesExemplo

Page 21: Aula02 - Herança

E, agora, como tratar o encapsulamento na

hierarquia de classes?

Page 22: Aula02 - Herança

Encapsulamento

Page 23: Aula02 - Herança

Encapsulamento

A LEI é não posso QUEBRARo que não posso ACESSAR

Page 24: Aula02 - Herança

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!

Page 25: Aula02 - Herança

Hierarquia de Classes e EncapsulamentoExemplo

Page 26: Aula02 - Herança

Hierarquia de Classes e EncapsulamentoExemplo

É possível acessar atributos nas subclasses diretamente, desde que

tenham visibilidade protected

Page 27: Aula02 - Herança

Mas, é bom considerar membros protected?

Page 28: Aula02 - Herança

Não! Causa um FORTEACOMPLAMENTO entre as classes

Você precisa de uma ÓTIMA JUSTIFICATIVA para permitir

atributos protected!!!

Page 29: Aula02 - Herança

Por que forte acomplamento é um

problema?

Page 30: Aula02 - Herança

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)

Page 31: Aula02 - Herança

Acomplamento

Minimizar o ACOPLAMENTO é uma das LEIS de ouro da OO

Page 32: Aula02 - Herança

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ê!!!

Page 33: Aula02 - Herança

Como podemos referenciar atributos e métodos da

superclasse de uma classe?

Page 34: Aula02 - Herança

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; }

}

Page 35: Aula02 - Herança

Entendi essa ideia de Herança! Mas, como instanciar as classes?

Page 36: Aula02 - Herança

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!

Page 37: Aula02 - Herança

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!

Page 38: Aula02 - Herança

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

Page 39: Aula02 - Herança

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;}

}

Page 40: Aula02 - Herança

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;}

}

Page 41: Aula02 - Herança

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();}

Page 42: Aula02 - Herança

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;}

}

Page 43: Aula02 - Herança

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;}

}

Page 44: Aula02 - Herança

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;}

}

Page 45: Aula02 - Herança

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

Page 46: Aula02 - Herança

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

Page 47: Aula02 - Herança

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) { }

Page 48: Aula02 - Herança

E se, em uma subclasse, precisarmos modificar o

comportamento herdado de sua superclasse?

Page 49: Aula02 - Herança

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

Page 50: Aula02 - Herança

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!

Page 51: Aula02 - Herança

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;

}

}

Page 52: Aula02 - Herança

Sobrescrita de MétodosExemplo

public class Gerente extends Empregado{ private String departamento; //construtor, getters e setters omitidos public String toString(){ return super.toString() + ” ” + departamento; }

}

Page 53: Aula02 - Herança

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

Page 54: Aula02 - Herança

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 {…}

Page 55: Aula02 - Herança

Métodos Herdados

● Toda classe em Java já possui implementados diversos métodos herdados da Object

● Os mais relevantes– equals()– hashCode()– toString()– finalize()

Page 56: Aula02 - Herança

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

Page 57: Aula02 - Herança

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));

Page 58: Aula02 - Herança

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);

Page 59: Aula02 - Herança

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!”);}

Page 60: Aula02 - Herança

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";}

Page 61: Aula02 - Herança

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;}

Page 62: Aula02 - Herança

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; }}

Page 63: Aula02 - Herança

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

Page 64: Aula02 - Herança

Referências

● Programação Orientada a Objetos, Livia Maria Rodrigues Sampaio Campos e Raquel Vigolvino Lopes, UFCG, acesso em Janeiro de 2015