35
Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento) Prof. Gilberto Irajá Müller Prof. Gilberto Irajá Müller Última atualização 8/4/2009

Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

  • Upload
    erik

  • View
    66

  • Download
    1

Embed Size (px)

DESCRIPTION

Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento). Prof. Gilberto Irajá Müller. Última atualização 8/4/2009. Herança. A herança permite derivar uma nova classe mais especializada a partir de outra classe mais genérica existente A classe mais genérica é chamada de superclasse - PowerPoint PPT Presentation

Citation preview

Page 1: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Programação IAula 6

(Herança, Polimorfismo e Encapsulamento)

Prof. Gilberto Irajá MüllerProf. Gilberto Irajá Müller

Última atualização 8/4/2009

Page 2: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• A herança permite derivar uma nova classe mais

especializada a partir de outra classe mais genérica existente

• A classe mais genérica é chamada de superclasse

• A classe derivada é chamada de subclasse• Herda os atributos (desde que não sejam privates)• Permite adicionar novos atributos (que será visível somente

na subclasse)• Em relação aos métodos, a subclasse poderá

utilizá-los/herdá-los (superclasse), bem como criar novos métodos e alterá-los

• Métodos construtores não são herdados (porém podemos chamá-los dentro do construtor da subclasse)

Page 3: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• A representação de Herança

(generalização/especialização) utilizando a notação da UML é:

• Lembre-se: Cada objeto da classe B também é um objeto da classe A, podendo ter alguns membros diferentes da classe origem

Superclasseou classe-pai

Subclasseou classe filha

Classe A

Classe B

Page 4: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Exemplo

O que temos de diferente na subclasse

Gerente?

Page 5: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Exemplo anterior em JAVA

Super?

Extends Funcionario?

Page 6: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Sintaxe de herança em JAVA

modificadores class nomeSubClasse extends nomeSuperClasse {

atributos;métodos;

}

Page 7: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• A classe Object

Quando criamos uma classe qualquer em JAVA, na verdade, estamos herdando implicitamente da classe ObjectExemplo:public class Pessoa { ... }

Na verdade, o JAVA traduz como:public class Pessoa extends Object { ... }

Estamos herdando de forma indireta nossas classes!

Page 8: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• A classe Object

A classe em questão, possui alguns métodos que todas as demais classes irão herdar, como por exemplo:

String toString()boolean equals(Object outroObjeto)int hashCode()...

Contudo, para utilizá-los, é recomendável que seja sobrescrito, ou seja, OVERRIDING!

Page 9: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Exercício 6.1

Lembram da classe Pessoa? Pois bem, faça o diagrama de classes utilizando herança para a classe PessoaJuridica com um novo atributo chamado CNPJ (string) e um método exibeDados() considerando o atributo CNPJ

Como ficaria a classe PessoaJuridica em JAVA?

Page 10: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Membros da subclasse (métodos)

• Sobrescrever um método. Para sobrescrever um método na subclasse é necessário que o tipo de retorno, o nome e os parâmetros e seus tipos sejam exatamente iguais. Exemplo: PessoaJuridica.exibeDados();

• Herdar (utilizar) um método da superclasse. Todo método que não é sobrescrito na subclasse, ao ser chamado, será utilizado o método da superclasse. Exemplo:PessoaJuridica.getNome();

• Métodos criados apenas na subclasse, somente poderão ser utilizados na subclasse. Exemplo:funcionario.setNomeiaSecretario(“Pituca”);

Page 11: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Membros da subclasse (atributos)

• Atributos não podem ser sobrescritos, ou seja, não é permitido a alteração de um nome de método da superclasse a partir da subclasse!

• Herdar (utilizar) os atributos da superclasse. Porém, não se pode fazer o acesso direto ao atributo, apenas utilizando o seu método de acesso (get ou set). Isso quando o atributo da superclasse é “private”. Exemplo: nome, salario e numeroDeDependentes

• Pode-se criar novos atributos. Lembre-se: somente a subclasse poderá acessar o atributo diretamente, ou seja, sem utilização dos métodos de acesso. Usso quando o atributo é declarado como “private”. Exemplo:nomeSecretaria

Page 12: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Chamada de métodos da subclasse

• Quando um objeto chama um determinado método, temos as seguintes situações:

• Se é um método da subclasse que sobrescreve um método da superclasse, o da subclasse é acionado (ele esconde o da superclasse)

• Se o método chamado só existe na superclasse, ele será acionado (a subclasse herda métodos da superclasse que ela não sobrescreve)

• Se o método é exclusivo da subclasse, ele será acionado• Se o método chamado não existe na subclasse, nem na

superclasse, nem na superclasse da superclasse, e em nenhuma superclasse hierarquia acima, então acontece um erro.

Page 13: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Exercício 6.2

Filha f1 = new Filha();f1.m1(); ___________________f1.m2(); ___________________f1.m3(); ___________________f1.m4(); ___________________

Page 14: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Construtores da subclasse

• Os construtores da superclasse não são herdados pela subclasse, portanto, esta deverá ter seus próprios construtores

• Contudo, ao criar um construtor de uma subclasse, precisaremos inicializar os atributos herdados pela superclasse, então, utilizamos a chamada (palavra reservada) super(...)Exemplo:

• Obs.: Se o construtor da subclasse não chama um construtor da superclasse, então, o construtor padrão da superclasse é chamado automaticamente. Se a superclasse não tem um construtor padrão, dá erro de compilação.

Page 15: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Exercício 6.3

Qual o efeito do seguinte construtor na subclasse Gerente quando um objeto é instanciado?

public Gerente(String nomeSecretaria) {this.nomeSecretaria = nomeSecretaria;

}

Page 16: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Exercício 6.4

Escreva um outro construtor para a subclasse Gerente que inicialize todos os seus atributos (inclusive o nome da sua secretária)

Page 17: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Visibilidade

• Uma subclasse não possui acesso aos atributos privados da superclasse, ou seja, o único acesso ao atributo se dá através dos métodos de acesso (get e set)

• O atributo definido como private é acessível somente pela classe que o declarou

• O exemplo a seguir da subclasse gerente ocorrerá erro porque e aonde?public void exibeDados(){

System.out.println(“Nome: “ + nome); System.out.println(“Salário: “ + salario); System.out.println(“Dependentes: “ + numeroDeDependentes); System.out.println("Secretária: " + nomeSecretaria);

}

Page 18: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Visibilidade

• A alternativa seria:public void exibeDados(){

super.exibeDados();System.out.println ("Secretária: " +

nomeSecretaria);}

• Ou:Declarar os atributos na superclasse (nome, salário e numeroDeDependentes) com a visibilidade protected

A visibilidade protected (#), permite acessar diretamente um atributo na subclasse, ou seja, não há necessidade de acesso via método!

Page 19: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Uso da palavra-chave super

• É usada, quando necessária, na subclasse, para chamar construtor ou método da superclasse

• Para chamar um método construtor:• A palavra super seguida imediatamente de parênteses

chama o construtor da superclasse de mesma assinatura• Neste caso, deve ser a primeira instrução dentro de um

construtor da subclasse

• Para chamar um método NÃO construtor:• A palavra super seguida de ponto e nome de um método

da superclasse, chama o método correspondente da superclasse

• Este tipo de chamada pode aparecer em qualquer lugar de qualquer método ou construtor da subclasse

Page 20: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Uso da palavra-chave super

• Exemplo chamando um método construtor

• Exemplo chamando um método NÃO construtor

Page 21: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Exercício 6.5

O que é sobrecarga (OVERLOADING)?

O que é sobrescrita (OVERRIDING)?

Page 22: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Herança• Exercício 6.6

Indique o que cada método e construtor são: (i) sobrecarga ou (ii) sobrescrita

Page 23: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Polimorfismo• É a realização de uma tarefa de formas

diferentes (poli – muitas; morphos – formas). Uma utilização importante do polimorfismo em Java ocorre na herança, quando dois objetos, sendo um da superclasse e outro da subclasse, respondem diferentemente à mesma chamada de um método

• Primeiramente, vamos entender a conversão de um tipo de objeto para outro (upcasting)

Page 24: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Polimorfismo• Exemplo:

Pai p;• Declara p como uma referência da

superclasse Pai – isto define a vocação de p: referenciar qualquer objeto do tipo Pai.

• Em Java, podemos atribuir um objeto da subclasse a uma referência de sua superclasse. (Esta operação é chamada upcasting, de up type casting)

• A regra anterior é razoável, pois todo objeto da subclasse É UM objeto da sua superclasse. Então, podemos atribuir a p um objeto Filha:

p = new Filha();

Page 25: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Polimorfismo• Exemplo:

Observe, a seguir, p acionando métodos:• p.m1(); ________________________• p.m2(); ________________________• p.m3(); ________________________

Uma referência de superclasse só reconhece membros disponíveis na superclasse, mesmo que esteja

apontando para um objeto de subclasse.

Page 26: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Polimorfismo• Resumindo, o upcasting é a conversão de um

objeto de tipo mais específico para um tipo mais genérico, feita implicitamente através de atribuição, mas a partir da conversão só os membros do tipo mais genérico podem ser acessados sem artifícios.

Page 27: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Polimorfismo• Para o nosso exemplo: como acessar o método m3? A resposta está

no downcasting (down type casting)

• Em Java, a atribuição de um objeto de superclasse a uma referência de subclasse, sem uma coerção explícita, não é permitida. Exemplo: Filha f = p;

• O downcasting é realizado utilizando o operador de casting de classes. Exemplo: Filha f = (Filha) p; f.m3();

Page 28: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Polimorfismo• Esta realidade, citada na frase anterior, é algo verificado por Java apenas em

tempo de execução. Se o objeto for do tipo da subclasse, a coerção será válida, mas se não for, ocorrerá uma ClassCastException

• Para proteger nosso código dessa incerteza, convém usar o operador especial instanceof com a seguinte sintaxe: VariávelObjeto instanceof NomeClasseExemplo:if (p instanceof Filha){Filha f = (Filha) p;f.m3();}

Page 29: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Polimorfismo• Exemplo de conversão e seus erros:

Page 30: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Polimorfismo• Exemplo de Polimorfismo

Page 31: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Polimorfismo• Exemplo de Polimorfismo

Page 32: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

HOT TOPIC• Classe: representa um conjunto de objetos com características afins. Uma classe define o

comportamento dos objetos, através de métodos, e quais estados ele é capaz de manter, através de atributos. Exemplo de classe: Os seres humanos.

• Objeto é uma instância de uma classe. Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Exemplo de objetos da classe Humanos: João, José, Maria.

• Atributos são características de um objeto. Basicamente a estrutura de dados que vai representar a classe. Exemplos: Funcionário: nome, endereço,telefone, CPF, ....; Carro: nome, marca, ano, cor, ...; Livro: autor, editora, ano. Por sua vez, os atributos possuem valores. Por exemplo, o atributo cor pode conter o valor azul. O conjunto de valores dos atributos de um determinado objeto é chamado de estado.

• Métodos definem as habilidades dos objetos. Bidu é uma instância da classe Cachorro, portanto tem habilidade para latir, implementada através do método deUmLatido(). Um método em uma classe é apenas uma definição. A ação só ocorre quando o método é invocado através do objeto, no caso Bidu. Dentro do programa, a utilização de um método deve afetar apenas um objeto em particular; Todos os cachorros podem latir, mas você quer que apenas Bidu dê o latido. Normalmente, uma classe possui diversos métodos, que no caso da classe Cachorro poderiam ser sente(), coma() e morda().

Page 33: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

HOT TOPIC• Mensagem é uma chamada a um objeto para invocar um de seus métodos, ativando um

comportamento descrito por sua classe. Também pode ser direcionada diretamente a uma classe (através de uma invocação a um método estático).

• Sobrecarga (OVERLOADING) é a utilização do mesmo nome para símbolos ou métodos com operações ou funcionalidades distintas. Geralmente diferencia-se os métodos pela sua assinatura. Exemplo: Um método Carro que recebe como parâmetro dois atributos (cor, placa), e outro método Carro que recebe como parâmetro (cor, placa, modelo).

• Sobrescrita (OVERRIDING) é o mecanismo que permite sobrescrever um método por completo em uma subclasse. Está relacionado com o conceito de polimorfismo.

• Herança (ou generalização) é o mecanismo pelo qual uma classe (subclasse) pode estender outra classe (superclasse), aproveitando seus comportamentos (métodos) e variáveis possíveis (atributos). Há Herança Múltipla quando uma subclasse possui mais de uma superclasse. Essa relação é normalmente chamada de relação "é um". Um exemplo de herança: Mamífero é superclasse de Humano. Ou seja, um Humano é um mamífero.

• Associação é o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode tratar-se de uma associação simples "usa um" ou de um acoplamento "parte de". Por exemplo: Um humano usa um telefone. A tecla "1" é parte de um telefone.

Page 34: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

HOT TOPIC• Encapsulamento consiste na separação de aspectos internos e externos de um objeto. Este

mecanismo é utilizado amplamente para impedir o acesso direto ao estado de um objeto (seus atributos), disponibilizando externamente apenas os métodos que alteram estes estados. Exemplo: você não precisa conhecer os detalhes dos circuitos de um telefone para utilizá-lo. A carcaça do telefone encapsula esses detalhes, provendo a você uma interface mais amigável (os botões, o monofone e os sinais de tom).

• Abstração é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando características menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe é uma abstração de entidades existentes no domínio do sistema de software.

• Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma assinatura (lista de parâmetros e retorno) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse.

• Interface é um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela está comprometida a fornecer o comportamento publicado pela interface.

Page 35: Programação I Aula 6 (Herança, Polimorfismo e Encapsulamento)

Métodos• Referências bibliográficas

• http://inf.unisinos.br/~anibal• http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos