programação i aula 6 (herança, polimorfismo e encapsulamento) prof. gilberto irajá müller...
TRANSCRIPT
Programação IAula 6
(Herança, Polimorfismo e Encapsulamento)
Prof. Gilberto Irajá MüllerProf. 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
• 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)
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
Herança• Exemplo
O que temos de diferente na subclasse
Gerente?
Herança• Exemplo anterior em JAVA
Super?
Extends Funcionario?
Herança• Sintaxe de herança em JAVA
modificadores class nomeSubClasse extends nomeSuperClasse {
atributos;métodos;
}
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!
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!
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?
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”);
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
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.
Herança• Exercício 6.2
Filha f1 = new Filha();f1.m1(); ___________________f1.m2(); ___________________f1.m3(); ___________________f1.m4(); ___________________
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.
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;
}
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)
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);
}
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!
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
Herança• Uso da palavra-chave super
• Exemplo chamando um método construtor
• Exemplo chamando um método NÃO construtor
Herança• Exercício 6.5
O que é sobrecarga (OVERLOADING)?
O que é sobrescrita (OVERRIDING)?
Herança• Exercício 6.6
Indique o que cada método e construtor são: (i) sobrecarga ou (ii) sobrescrita
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)
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();
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.
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.
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();
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();}
Polimorfismo• Exemplo de conversão e seus erros:
Polimorfismo• Exemplo de Polimorfismo
Polimorfismo• Exemplo de Polimorfismo
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().
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.
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.
Métodos• Referências bibliográficas
• http://inf.unisinos.br/~anibal• http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos