POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)
Upcoming SlideShare
Loading in...5
×
 

POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)

on

  • 613 views

Material utilizado na disciplina de Programação Orientada a Objetos (animações e outros efeitos foram perdidos no carregamento). Ciência da Computação (3o período). Universidade do Vale do ...

Material utilizado na disciplina de Programação Orientada a Objetos (animações e outros efeitos foram perdidos no carregamento). Ciência da Computação (3o período). Universidade do Vale do Itajaí - Campos Kobrasol.

Statistics

Views

Total Views
613
Views on SlideShare
613
Embed Views
0

Actions

Likes
1
Downloads
28
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4) POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4) Presentation Transcript

  • Prof. Marcello Thiry <marcello.thiry@gmail.com> PROGRAMAÇÃO ORIENTADA A OBJETOS Unidade 1 (parte 2) 3º período
  • marcello.thiry@gmail.com 2
  • marcello.thiry@gmail.com Legenda usada nos slides 3 Conceito-chave: definição fundamental no contexto da Orientação a Objetos (OO). Importante: informações complementares, mas relevantes para o entendimento da OO. Atenção: você deve ficar atento para não cair em armadilhas ou falhas de entendimento.
  • marcello.thiry@gmail.com Você lembra... 4
  • marcello.thiry@gmail.com E se criarmos outro objeto... 5 umaPessoa e outraPessoa apontam para o mesmo objeto? umaPessoa e outraPessoa têm o mesmo estado? O que isso significa?
  • marcello.thiry@gmail.com O que você pensou? 6 E se fizermos
  • marcello.thiry@gmail.com Revisando... 7  umaPessoa e outraPessoa são objetos diferentes  Apontam para áreas de memória diferentes  umaPessoa e outraPessoa podem ter o mesmo estado num determinado momento  Duas variáveis com o mesmo valor não são a mesma variável
  • marcello.thiry@gmail.com Como funciona... 8 Endereço Valor 100 ?? 101 ?? 102 ?? 103 ?? 104 ?? 105 ?? 106 ?? ... ... umaPessoa
  • marcello.thiry@gmail.com Como funciona... 9 Endereço Valor 100 ?? 101 ?? 102 ?? 103 ?? 104 ?? 105 ?? 106 ?? ... ... umaPessoa
  • marcello.thiry@gmail.com Como funciona... 10 Endereço Valor 100 ?? 101 ?? 102 nome = “” ... ... 103 ... 200 ?? 201 ?? ... ... umaPessoa novo objeto Pessoa 102
  • marcello.thiry@gmail.com Como funciona... 11 Endereço Valor 100 102 101 ?? 102 nome = “” ... ... 103 ... 200 ?? 201 ?? ... ... umaPessoa novo objeto Pessoa “Marcello”
  • marcello.thiry@gmail.com Como funciona... 12 Endereço Valor 100 102 101 201 102 nome = “Marcello” ... ... 103 ... 200 ?? 201 nome = “João” ... ... ... ... umaPessoa outraPessoa
  • marcello.thiry@gmail.com E se... 13 O que você acha que irá acontecer? Experimente imprimir o nome de umaPessoa e outraPessoa e analisar o resultado...
  • marcello.thiry@gmail.com Vamos colocar a mão na massa!!! 14  A partir das atividades anteriores, exercite o que acabamos de discutir e tente explicar o resultado  Depois, altere o nome de umaPessoa e imprima novamente: o que aconteceu?
  • marcello.thiry@gmail.com E se tivéssemos algo como... 15 Alguma ideia para implementar esta operação?
  • marcello.thiry@gmail.com Aguarde um pouco mais, chegaremos lá... 16
  • marcello.thiry@gmail.com Antes, vamos voltar a alguns conceitos-chave... 17  O que você entende por reutilização?  Copiar e colar?  Faz sentido?  Qual o risco?  Duplicar código é reutilizar?
  • marcello.thiry@gmail.com Como você trabalha reutilização? 18  Como você trabalha com sub-rotinas?  Procedimentos  Funções  Parâmetros  E agora, classes e objetos!!! Lembra da abstração?
  • marcello.thiry@gmail.com Vamos analisar... 19
  • marcello.thiry@gmail.com Vamos analisar... 20 Você sentiu também!?
  • marcello.thiry@gmail.com Duplicação de código... 21
  • marcello.thiry@gmail.com Ficou melhor? 22 Mas, falta alguma coisa?
  • marcello.thiry@gmail.com Voltando a análise.... 23  Como um Aluno saberá fazer o que uma Pessoa já faz?  Você já parou para pensar que faz sentido dizer:  Um Aluno é uma Pessoa  Legal, mas como iremos fazer isso acontecer?
  • marcello.thiry@gmail.com Generalização 24  Relacionamento que indica Herança  O sentido do relacionamento é da classe mais especializada (subclasse) para a mais genérica (superclasse)  Aluno é a subclasse (mais especializada)  Pessoa é a superclasse (mais genérica)
  • marcello.thiry@gmail.com Generalização 25  A subclasse herda todos os atributos e operações da superclasse  Cada objeto (instância) da subclasse é também uma instância indireta da superclasse  A superclasse tem um nível de abstração maior do que a subclasse
  • marcello.thiry@gmail.com Generalização / Especialização 26 Sentido da generalização Sentido da especialização
  • marcello.thiry@gmail.com Níveis de abstração 27 Abstração mais alta Abstração mais baixa
  • marcello.thiry@gmail.com Abstração e reusabilidade 28 Maior reusabilidade Menor reusabilidade
  • marcello.thiry@gmail.com Generalização em Java 29
  • marcello.thiry@gmail.com Generalização em Java 30
  • marcello.thiry@gmail.com Hora de reutilizar... 31 Caiu a ficha?
  • marcello.thiry@gmail.com O que essa figura tem a ver com herança? 32
  • marcello.thiry@gmail.com Revendo os tipos de herança 33  Herança simples  A subclasse herda suas características e comportamento de uma única superclasse  Herança múltipla  A subclasse herda suas características e comportamento de duas ou mais superclasses
  • marcello.thiry@gmail.com 34 A subclasse (CarroSubmarino) herda de duas superclasses (Carro e Submarino)
  • marcello.thiry@gmail.com Herança múltipla em Java 35  A linguagem Java implementa somente herança simples  É possível utilizar Interfaces e Composição para simular parcialmente aspectos da herança múltipla  Voltaremos a discutir Interfaces e Composição em aulas futuras  Algumas linguagens OO, como C++ e Common Lisp (CLOS) implementam herança múltipla
  • marcello.thiry@gmail.com Considerações sobre herança múltipla 36  A subclasse precisa ter uma relação “é um” com todas as suas superclasses  Deve-se utilizar com cuidado para evitar que o modelo fique confuso e de difícil manutenção
  • marcello.thiry@gmail.com 37 “Problema do diamante” Você percebe a ambiguidade?
  • marcello.thiry@gmail.com 38Linguagens OO que implementam herança múltipla devem fornecer soluções para mitigar este problema
  • marcello.thiry@gmail.com Você já perguntou sobre... 39  ... o significado dos modificadores de visibilidade “–” e “+” nas classes modeladas com UML?  ... a utilidade dos modificadores de acesso “private” e “public” em Java?
  • marcello.thiry@gmail.com Visibilidade e modificadores de acesso 40 Notação visual Modificador de acesso A parte é visível... + public dentro da própria classe e para qualquer outra classe – private somente dentro da própria classe # protected somente dentro do próprio pacote e das subclasses em outros pacotes ~ package somente dentro da própria classe e das classes dentro do mesmo pacote
  • marcello.thiry@gmail.com Visibilidade “package” em Java 41  Para representar a visibilidade “package”, você não deve especificar um modificador de acesso  Quando não é especificado um modificador de acesso, o Java assume que a visibilidade é do tipo “package”
  • marcello.thiry@gmail.com Visibilidade “package” em Java 42  Para cada arquivo “.java” deve haver, pelo menos, uma classe “public” com o mesmo nome do arquivo  As demais classes declaradas no mesmo arquivo devem ser “package”  Ou seja, não devem especificar um modificador de acesso
  • marcello.thiry@gmail.com Visibilidade de atributos e operações 43 Modificador na ClasseAlfa ClasseAlfa ClasseBeta SubAlfa Gama public S S S S protected S S S N sem modificador S S N N private S N N N
  • marcello.thiry@gmail.com Na prática, adotaremos... 44  As classes serão públicas  Uma única classe em cada arquivo “.java”  Logo, o nome da classe e do arquivo deve ser o mesmo  Atributos serão sempre privados  Operações podem ser “públicas”, “privadas” ou “protegidas”  Exceções devem ser tratadas com parcimônia!!
  • marcello.thiry@gmail.com Continuando com a análise... 45  Imagine que você foi contratado para desenvolver um sistema acadêmico (matrícula, notas, diários, planos de ensino) para uma universidade  Quais as principais entidades envolvidas?
  • marcello.thiry@gmail.com Continuando com a análise... 46  Você pensou primeiro em Pessoa ou em Aluno, Professor, Funcionário, Turma, Disciplina, etc.?  Aluno, Professor e Funcionário são entidades do mundo real que são percebidas pelos usuários  Não parece fazer sentido criar um objeto Pessoa. Ele seria genérico demais e sem muita utilidade...  Você concorda?
  • marcello.thiry@gmail.com Continuando com a análise... 47  Tipicamente, ao analisar os requisitos para desenvolver um sistema, percebemos primeiro entidades do domínio de negócio  Entretanto, muitas vezes, estas entidades possuem similaridades entre si...  Lembra do conceito de classe?
  • marcello.thiry@gmail.com 48  As similaridades entre as entidades podem ser abstraídas numa superclasse comum  Por exemplo, as classes Aluno, Professor e Funcionário poderiam compartilhar a superclasse Pessoa  Tente modelar estas classes antes de prosseguir... Continuando com a análise...
  • marcello.thiry@gmail.com 49 O que você acha? Faz sentido, criamos objetos Pessoa? Qual a utilidade?
  • marcello.thiry@gmail.com Classes Concretas e Abstratas 50  Classe Concreta é uma classe que pode ser instanciada diretamente  Classe Abstrata é uma classe que NÃO pode ser instanciada diretamente  No nosso exemplo anterior, como você definiria cada classe?
  • marcello.thiry@gmail.com Classe Abstrata em UML 51 Reparou que o nome da classe ficou em itálico?
  • marcello.thiry@gmail.com Classe Abstrata em Java 52 A partir de agora, você não poderá instanciar objetos Pessoa diretamente!
  • marcello.thiry@gmail.com Revisando a classe abstrata 53  Classe que não terá objetos instanciados  Quando não faz sentido criar objetos (ex: “Pessoa”)  Pode ser uma classe completa, incluindo atributos, operações e métodos  Oferece a base para uma hierarquia de classes  Oferece um conjunto de operações e métodos comuns a todas as subclasses (base para reutilização!!)
  • marcello.thiry@gmail.com E se adicionarmos Professor... 54  Podemos dizer que um Professor é uma Pessoa?  Claro, mas podemos afirmar também que:  Um Professor é um Funcionário
  • marcello.thiry@gmail.com Professor na hierarquia de herança 55
  • marcello.thiry@gmail.com Vamos analisar um pouco mais... 56 Veja o que você não entendeu e pergunte...
  • marcello.thiry@gmail.com Valor inicial 57
  • marcello.thiry@gmail.com ?!?!?!?! 58 Não tínhamos herdado isso de Funcionario?
  • marcello.thiry@gmail.com Redefinição de operações (override) 59 Considere o seguinte:  Funcionários ganham 3% sobre o valor do salário bruto a cada triênio  Professores com Doutorado ganham 10% a mais sobre o valor calculado do triênio
  • marcello.thiry@gmail.com Redefinição de operações (override) 60 Na classe Professor... e...
  • marcello.thiry@gmail.com Redefinição de operações (override) 61 Permite chamar a implementação (método) da superclasse
  • marcello.thiry@gmail.com A classe Funcionario 62 ... ...
  • marcello.thiry@gmail.com A classe Funcionario 63 ... ... Alguma ideia para implementar? Lembra do getIdade()?
  • marcello.thiry@gmail.com 64 Mas, você não pensou em simplesmente copiar o código, certo? Certo!?
  • marcello.thiry@gmail.com A classe Professor 65 ... ...
  • marcello.thiry@gmail.com Redefinição de operações (override) 66  Uma subclasse pode:  Adicionar atributos, operações e relacionamentos  Redefinir operações herdadas (com cuidado!)  A redefinição (ou overriding) ocorre quando um operação cuja assinatura já tenha sido especificada recebe um novo método (ou seja, uma nova implementação) em uma classe derivada (subclasse)
  • marcello.thiry@gmail.com Redefinição de operações (override) 67  A redefinição deve manter a mesma assinatura da operação original
  • marcello.thiry@gmail.com Abre o olho!!! 68  Entrar no ambiente Sophia  Baixar atividade 04  Ler (antes de perguntar!!) com atenção as orientações e segui-las passo a passo  Depois, vocês irão apresentar os resultados e discutir suas dúvidas!
  • marcello.thiry@gmail.com Restringindo a redefinição em Java 69  Por default, qualquer operação de uma classe X pode ser redefinida em quaisquer subclasses de X  Entretanto, a redefinição de uma operação pode ser evitada com o uso do modificador “final”
  • marcello.thiry@gmail.com Restringindo a redefinição em Java 70  No nosso exemplo, se a operação getTrienio() da superclasse Funcionario for declarada como final, você não poderá redefini-la na subclasse Professor
  • marcello.thiry@gmail.com Modificador “final” 71  Resumindo, quando você utiliza o modificador “final”, a operação não poderá ser redefinida pelas subclasses  Mas, este modificador também se aplica a atributos
  • marcello.thiry@gmail.com Modificador “final” 72  O modificador “final” também se aplica a atributos  Nossa política estabelece que todos os atributos sejam privados, lembra?
  • marcello.thiry@gmail.com Modificador “final” 73  Mas, quando utilizado em atributos, o modificador “final” permite a definição de constantes  Tipicamente, constantes em Java são descritas em caixa alta
  • marcello.thiry@gmail.com Constantes em Java 74  O modificador “final” pode ser usado para definir constantes em Java  Mas, Iremos dar preferência para definir constantes com o tipo enum  Tipo especial de classe que permite definir uma variável ou atributo como um conjunto de constantes predefinidas
  • marcello.thiry@gmail.com Tipo “enum” 75  A variável ou atributo deve ser igual a um dos valores que foram predefinidos para ela  Uma vez que elas são constantes, os nomes dos atributos de um enum devem estar em CAIXA ALTA
  • marcello.thiry@gmail.com Declarando um tipo “enum” 76  Você deve utilizar enum sempre que você precisar representar um conjunto fixo de constantes
  • marcello.thiry@gmail.com Como utilizar o tipo “enum” 77 ... ...
  • marcello.thiry@gmail.com Construtor para o tipo “enum” 78  O construtor para um tipo enum deve ser privado ou package  Este construtor cria automaticamente as constantes que são definidas no início do corpo enum  Você não pode invocar diretamente um construtor enum
  • marcello.thiry@gmail.com Tipo “enum” 79 ...
  • marcello.thiry@gmail.com Tipo “enum” 80 ...
  • marcello.thiry@gmail.com Como utilizar o tipo “enum” 81 ... ...
  • marcello.thiry@gmail.com 82Rapidinha! Revise a implementação anterior, utilizando o tipo “enum”
  • marcello.thiry@gmail.com Operações abstratas 83  Nós já vimos o conceito de classe abstrata  Não é possível instanciar objetos de uma classe abstrata  Mas, e operações abstratas...  Alguma ideia?
  • marcello.thiry@gmail.com Uma operação abstrata é ... 84  uma operação que não possui um método  A implementação da operação (método) é delegada para as subclasses  Mas, qual é a vantagem de ter uma operação sem método?
  • marcello.thiry@gmail.com 85 Como você implementaria a operação “desenhar()”  Note que a classe Figura é abstrata (representada em itálico na UML)  Da mesma forma, uma operação abstrata também é representada em itálico na UML
  • marcello.thiry@gmail.com 86 O que deve ser desenhado? Tudo bem, eu não sei o que desenhar. Mas, ainda não entendi por que eu preciso desta classe?
  • marcello.thiry@gmail.com A ideia aqui é garantir que todas as subclasses de “Figura” sejam obrigadas a fornecer um método para “desenhar()”
  • marcello.thiry@gmail.com
  • marcello.thiry@gmail.com Classes e operações abstratas 89  Nem toda classe abstrata precisa ter uma operação abstrata  Ex: classe “Pessoa”  Toda classe que tem, pelo menos, uma operação abstrata, deve ser abstrata
  • marcello.thiry@gmail.com Operações abstratas são tipicamente utilizadas com o princípio de polimorfismo!
  • marcello.thiry@gmail.com 91 Poli... o quê????
  • marcello.thiry@gmail.com 92 Poli=Muitas Morfhos=Formas
  • marcello.thiry@gmail.com Polimorfismo 93  Princípio pelo qual entidades de tipos diferentes podem ser acessadas através de uma única interface1 1. http://www.stroustrup.com/glossary.html#Gpolymorphism
  • marcello.thiry@gmail.com Polimorfismo 94  Diferente objetos “Retangulo” e “Circulo” podem ser acessados através da interface da classe “Figura” r2 c2 r3 r1 desenhar() Figura Programa usuário Executa “desenhar()” Executa “desenhar()” c1
  • marcello.thiry@gmail.com 95 “fig” aponta para um objeto “Retangulo” “fig” agora aponta para um objeto “Circulo” Note que o objeto “fig” assumiu mais de um tipo ao longo da execução do programa
  • marcello.thiry@gmail.com 96 Este tipo de polimorfismo é conhecido como “polimorfismo de inclusão” O “Polimorfismo de Inclusão” é obtido a partir do relacionamento de generalização/especialização (herança). Uma variável declarada como sendo do tipo da superclasse pode então assumir (referenciar) qualquer objeto que tenha sido criado a partir de suas subclasses.
  • marcello.thiry@gmail.com A variável “fig” está limitada pela interface da classe “Figura”. Logo, você só poderá acessar as operações disponíveis em “Figura”!!
  • marcello.thiry@gmail.com Você entendeu porque a operação “setAltura” não foi reconhecida pelo compilador? ERRO!
  • marcello.thiry@gmail.com E agora... Compila? Typecasting (conversão de tipo) O compilador reconhece a operação porque ela existe em “Retangulo”
  • marcello.thiry@gmail.com Você saberia explicar o motivo do erro de compilação?
  • marcello.thiry@gmail.com Pronto! Agora compila, mas... O erro agora será em tempo de execução!! Você entende o porquê?
  • marcello.thiry@gmail.com E se... Agora compila e não há erro na execução! Mas, perdemos a transparência do polimorfismo de inclusão!
  • marcello.thiry@gmail.com Ligação1 (biding) 103  Ligação prematura (early binding) ou ligação estática (static binding)  Quando o método a ser invocado é definido durante a compilação do programa  Ligação tardia (late binding) ou ligação dinâmica (dynamic binding)  Quando o método a ser invocado é definido somente em tempo de execução do programa 1. Existem autores que utilizam o termo “acomplamento” como tradução de “biding”
  • marcello.thiry@gmail.com Ligação tardia 104  O polimorfismo só pode ser aplicado se a linguagem de programação orientada a objetos suportar este mecanismo  Além de conhecida também como ligação dinâmica, pode ser ainda denominada ligação em tempo de execução (runtime biding)
  • marcello.thiry@gmail.com Ligação tardia em Java 105  Em Java, a ligação tardia é o comportamento padrão  Exceções:  Métodos “final” não podem ser redefinidos e o polimorfismo não se aplica  Métodos “private” são implicitamente declarados como “final”
  • marcello.thiry@gmail.com Vamos trabalhar um pouco... 106  Entrar no ambiente Sophia  Baixar atividade 05  Ler (você já conhece as regras!!) com atenção as orientações e segui-las passo a passo  Depois, vocês irão apresentar os resultados e discutir suas dúvidas!
  • marcello.thiry@gmail.com Existem diferentes tipos de polimorfismo 107 Inclusão Polimorfismo Ad-hoc (aparente) Coerção Paramétrico Sobrecarga (overload) Universal (verdadeiro) (Cardelli e Wegner, 1985) http://lucacardelli.name/papers/onunderstanding.a4.pdf
  • marcello.thiry@gmail.com Tipos de polimorfismo 108  Polimorfismo universal ou verdadeiro  Quando uma operação ou tipo trabalha uniformemente para uma gama de tipos definidos na linguagem  Polimorfismo ad-hoc ou aparente  Quando uma operação ou tipo parece trabalhar para alguns tipos diferentes e pode se comportar de formas diferentes para cada tipo (ex: printf do C)
  • marcello.thiry@gmail.com Polimorfismo paramétrico 109  Classes paramétricas  Permitem que operações e classes operem sobre dados de diferentes tipos, sem que elas precisem ser reescritas para cada um dos tipos desejados  Uma operação polimórfica tem um parâmetro de tipo implícito ou explícito, o qual determina o tipo de argumento para cada aplicação daquela operação
  • marcello.thiry@gmail.com 110 Template de classe na UML Objetos desta classe podem ser declarados para diferentes tipos (TipoItem) de modo uniforme: o comportamento será sempre o mesmo Parâmetro “Tipo” passado no momento da declaração de variáveis “Pilha”
  • marcello.thiry@gmail.com 111 Template de classe na UML Parâmetro “Tipo” passado no momento da declaração de variáveis “Pilha”
  • marcello.thiry@gmail.com ... Em Java, templates são denominados tipos genéricos: Generics
  • marcello.thiry@gmail.com ... <TipoItem> pode assumir qualquer tipo, mas o comportamento será sempre o de uma Pilha!
  • marcello.thiry@gmail.com ... Construtores Você pode implementar vários construtores, mas eles precisam ter assinaturas diferentes!
  • marcello.thiry@gmail.com Chama o construtor que aceita um “int” como parâmetro
  • marcello.thiry@gmail.com Operador ternário (condicional)
  • marcello.thiry@gmail.com O que é isso?
  • marcello.thiry@gmail.com A superclasse java.lang.Object 118  Base da hierarquia de classes do Java  Qualquer classe Java é uma subclasse (direta ou indireta) da classe Object  Portanto, qualquer classe que você utiliza ou implementa, herda atributos e operações da classe Object http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html
  • marcello.thiry@gmail.com A superclasse java.lang.Object 119  Você pode redefinir (override) os métodos das operações de Object  Lembre-se então que qualquer objeto instanciado será também um objeto Object Voltaremos a discutir a classe Object em aulas futuras
  • marcello.thiry@gmail.com Criamos um vetor de objetos genéricos (qualquer objeto criado a partir de qualquer classe pode ser colocado neste vetor)
  • marcello.thiry@gmail.com Forçamos então uma conversão (typecasting) para o tipo passado como parâmetro
  • marcello.thiry@gmail.com Tiro curto! Complete a implementação da classe Pilha, usando Generics Teste com uma pilha de Figuras...
  • marcello.thiry@gmail.com A classe java.util.ArrayList 123
  • marcello.thiry@gmail.com Outras classes paramétricas em Java 124  java.util.Vector<E>  http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html  java.util.HashMap<K,V>  http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html  java.util.Stack<E>  http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html  ...
  • marcello.thiry@gmail.com Sobrecarga (overload) 125  Permite diferentes versões de uma mesma operação que aparenta funcionar com diferentes tipos  Os tipos não precisam possuir estrutura comum  A assinatura de cada versão da operação deve ser diferente  As versões das operações não têm relacionamento entre si  Classificada como polimorfismo ad-hoc (aparente) ou não verdadeiro
  • marcello.thiry@gmail.com Sobrecarga (overload) 126  Bastante utilizado para construtores  Permite instanciar um objeto de várias formas  Oportunidade para diferentes inicializações  Mas, pode ser utilizado com qualquer operação  Pode reduzir a legibilidade do código  Você lembra dos dois construtores que implementamos para a classe Pilha?
  • marcello.thiry@gmail.com 127 Outro exemplo...
  • marcello.thiry@gmail.com Coerção 128  Conversão entre tipos diferentes, realizada automaticamente pelo compilador
  • marcello.thiry@gmail.com Coerção 129  Conversões implícitas do Java:  byte para short, int, long ou double  short para int, long, float ou double  char para int, long, float ou double  int para long, float ou double  long para float ou double  float para double
  • marcello.thiry@gmail.com Coerção e Typecasting 130  Coerção  Conversão implícita realizada pelo compilador  Typecasting  Conversão explícita realizada pelo programador  (tipo) variável
  • marcello.thiry@gmail.com Revendo o conceito de Interface  Nós já vimos um conceito de Interface  A interface define o conjunto de operações visíveis (públicas) de uma classe  Define quais operações podem ser invocadas nos objetos de uma determinada classe  Este conceito também é chamado de “protocolo” 131
  • marcello.thiry@gmail.com Revendo o conceito de Interface 132  Até agora, a interface estava definida na própria classe  Porém, passaremos a considerar Interface como um mecanismo a parte  Uma Interface é uma especificação de comportamento (ou contrato) que implementadores concordam em implementar
  • marcello.thiry@gmail.com Revendo o conceito de Interface 133  Uma Interface é similar a uma classe abstrata, onde todas as operações são também abstratas:  Não pode ser instanciada, pois não possui implementação própria  Funciona como um contrato  A classe que implementa a Interface deve garantir que todas as operações da Interface tenham um método (o contrato deve ser respeitado)
  • marcello.thiry@gmail.com 134 Transformando Figura em uma Interface Nos exemplos anteriores, a classe Figura havia sido definida como uma classe abstrata que tinha apenas a operação abstrata “desenhar()”
  • marcello.thiry@gmail.com Revendo a implementação de “Retangulo” Contrato aceito Note que você não “herda” uma Interface, mas você a “implementa”
  • marcello.thiry@gmail.com Não seria necessário, pois não há herança Mas, a partir do Java 6, @Override passou a ser utilizado para indicar também implementação
  • marcello.thiry@gmail.com Notação UML Circular (lollipop) Relacionamento “Realization”
  • marcello.thiry@gmail.com Notação UML Circular (lollipop) Tradução para “Realization”: a Interface é implementada pela Classe
  • marcello.thiry@gmail.com Note que as classes “Retangulo” e “Circulo” não compartilham uma estrutura comum (elas são independentes uma da outra)
  • marcello.thiry@gmail.com E você pode ainda aplicar o polimorfismo de inclusão!!!
  • marcello.thiry@gmail.com Notação UML para mostrar que a classe “Desenho” utiliza a interface “Figura”
  • marcello.thiry@gmail.com Considerações sobre Interfaces 142  Não têm construtores, uma vez que não podem ser instanciadas  Uma mesma interface pode estender uma ou mais interfaces  Uma mesma classe pode realizar (implementar) várias interfaces
  • marcello.thiry@gmail.com Considerações sobre Interfaces 143  Classes que realizam (implementam) uma mesma interface não precisam compartilhar uma estrutura comum  Uma interface especifica, usualmente, uma parte limitada do comportamento de uma classe  A realização (implementação) de uma ou mais classes não exclui a possibilidade de generalização (herança)
  • marcello.thiry@gmail.com Considerações sobre Interfaces 144  Reduz a dependência (acoplamento) entre classes, aumentando sua reusabilidade  Oferece uma alternativa simplificada para a implementação de herança múltipla
  • marcello.thiry@gmail.com Exceção (Exception) 145  É um evento que ocorre durante a execução de um programa e que interrompe o fluxo normal de instruções  Divisão por zero  Operação matemática inválida  Tentativa de acesso a uma posição inválida em um vetor  Tentativa de acesso a um objeto que não foi criado  etc.
  • marcello.thiry@gmail.com Exceções em Java 146  Quando um erro ocorre dentro de um método, o próprio método cria um objeto e o entrega para o ambiente de execução  Este comportamento é denominado disparar (“throwing”) uma exceção  O objeto criado é chamado de objeto de exceção e contem informação sobre o erro, incluindo seu tipo e o estado do programa quando o erro ocorreu http://docs.oracle.com/javase/tutorial/essential/exceptions/
  • marcello.thiry@gmail.com Exceções em Java  Depois que um método dispara (throws) uma exceção, o ambiente de execução tenta encontrar algum tratamento para tratá-la  A sequência de possíveis tratamentos para manipular a exceção é a pilha dos métodos que foram chamados para chegar até o método onde o erro ocorreu 147
  • marcello.thiry@gmail.com 148 main Método com tratamento de exceção Método sem tratamento de exceção Método onde o erro ocorreu Chama método Chama método Chama método http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
  • marcello.thiry@gmail.com 149 main Método com tratamento de exceção Método sem tratamento de exceção Método onde o erro ocorreu Dispara (throws) exceção Propaga exceção Trata (catches) a exceção Procura por tratamento implementado Procura por tratamento implementado http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
  • marcello.thiry@gmail.com 150 Java define 3 tipos de exceção Checked Unchecked Checked Exception Error RuntimeException
  • marcello.thiry@gmail.com Checked exception  Condições excepcionais que uma aplicação bem escrita deveria antecipar  A aplicação deve implementar ações para se recuperar destas condições (ex: usuário solicita a abertura de um arquivo inexistente)  Portanto, o tratamento de exceções é obrigatório para este tipo de exceção 151
  • marcello.thiry@gmail.com Error (unchecked exception)  Condições excepcionais que são "externas" a uma aplicação que não podem ser antecipadas  Tipicamente, a aplicação não tem como se recuperar destas condições (ex: uma falha de hardware)  É possível implementar um tratamento para a exceção 152
  • marcello.thiry@gmail.com Runtime exception (unchecked exception)  Condições excepcionais que são "internas" a uma aplicação que não podem ser antecipadas  Tipicamente, a aplicação não tem como se recuperar destas condições (ex: defeitos de programação)  É possível implementar um tratamento para a exceção, mas o correto seria eliminar o defeito que causou a exceção 153
  • marcello.thiry@gmail.com Tratamento de exceções 154  Permite que a execução do programa continue mesmo após a ocorrência de um erro  Aumenta a robustez do programa  Separa o código que define comportamento "normal" (esperado) do código que realiza tratamento de exceções
  • marcello.thiry@gmail.com try...catch 155 1. O código controlado pela cláusula try é executado 2. Se ocorrer uma exceção, o controle é desviado para o código dentro da cláusula catch 3. Se a exceção ocorrida estiver sendo considerada pela cláusula catch, o código de tratamento da exceção é executado (caso contrário, a exceção é repassada ao ambiente de execução) 4. Se não ocorrer uma exceção, o tratamento da exceção (catch) não é executado
  • marcello.thiry@gmail.com try...catch 156  Você pode adicionar quantas cláusulas catch forem necessárias  Permite tratamento específico para cada tipo de exceção considerado  objExcecao é o objeto de exceção criado quando a exceção ocorre  Ele possui várias informações sobre a exceção
  • marcello.thiry@gmail.com try...catch 157 Você pode considerar mais de uma exceção em uma mesma cláusula catch
  • marcello.thiry@gmail.com try...finally 1. O código controlado pela cláusula try é executado 2. Se ocorrer uma exceção, o controle é desviado para o código dentro da cláusula finally que é executado 3. Se não ocorrer uma exceção, após o último comando dentro da cláusula try, o código dentro da cláusula finally é executado (ou seja, o código dentro da cláusula finally é sempre executado) 158
  • marcello.thiry@gmail.com Combinando try...catch...finally 159 Este bloco é executado mesmo quando uma exceção ocorrer!!
  • marcello.thiry@gmail.com Capturando todos os 3 tipos de exceção 160
  • marcello.thiry@gmail.com Capturando todos os 3 tipos de exceção 161 Operação disponibilizada pelas classes de Exceção
  • marcello.thiry@gmail.com Conhecendo as classes de exceção 162  Classe Throwable  http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html  Classe Exception  http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html  Classe RuntimeException  http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html  Classe Error  http://docs.oracle.com/javase/7/docs/api/java/lang/Error.html
  • marcello.thiry@gmail.com Experimente... 163
  • marcello.thiry@gmail.com A cláusula throws 164  Permite especificar exceções que podem ser disparadas ou propagadas dentro de um determinado método  Você pode forçar (disparar) uma exceção dentro de um método, usando a cláusula throw  Você pode não desejar tratar a exceção no método atual e apenas propagá-la para o próximo método  O próximo método pode tratar a exceção ou continuar propagando
  • marcello.thiry@gmail.com 165 Forçando uma Exceção
  • marcello.thiry@gmail.com Forçando uma Exceção Informa ao compilador que o método da operação “geraExcecao()” deve, obrigatoriamente:  capturar (catch) a exceção Exception; ou  disparar (throw) uma exceção Exception
  • marcello.thiry@gmail.com 167 No exemplo anterior, devemos chamar a operação de modo seguro...
  • marcello.thiry@gmail.com 168 Outra opção seria capturarmos a exceção no próprio método da operação...
  • marcello.thiry@gmail.com 169 Ou ainda, simplesmente capturar e propagar a exceção para o próximo método...
  • marcello.thiry@gmail.com try-com-recursos (try-with-resources) 170  Cláusula try (Java 7+) que declara um ou mais recursos  Um recurso é um objeto que deve ser fechado depois que o programa não precisar mais dele  Garante que cada recurso é fechado ao final da cláusula
  • marcello.thiry@gmail.com Criando sua própria classe de exceção  Você pode ainda criar suas próprias exceções  Verifique se a plataforma Java já não oferece uma exceção que atenda às suas necessidades  ... ou alguma exceção já criada por outros programadores e fornecedores  Verifique se a nova exceção será realmente útil  Utilize a palavra Exception ao final do nome da classe criada (boas práticas de codificação Java) 171
  • marcello.thiry@gmail.com 172
  • marcello.thiry@gmail.com 173 Dos “clones”, você acha que eu tinha esquecido?
  • marcello.thiry@gmail.com Vamos aprender a clonar objetos! Se você não entendeu este slide, procure pela ovelha Dolly na web
  • marcello.thiry@gmail.com Formas para copiar objetos... Shallow Copy Deep Copy Lazy Copy Precisa ser agora?!
  • marcello.thiry@gmail.com Shallow copy  Para copiar o objeto A, o objeto B irá copiar todos os atributos de A  Se o valor do atributo é um objeto, B copiará o endereço de memória deste objeto (A e B apontarão para o mesmo objeto)  Se o valor do atributo é um tipo primitivo, B copiará o valor do tipo primitivo
  • marcello.thiry@gmail.com Deep copy  Para copiar o objeto A, o objeto B irá copiar todos os atributos de A  Se o valor do atributo é um objeto, B copiará os dados deste objeto (A e B não compartilharão objetos)  A contrapartida em relação a uma shallow copy é o desempenho inferior  Se o valor do atributo é um tipo primitivo, B copiará o valor do tipo primitivo
  • marcello.thiry@gmail.com Lazy copy  Combinação das estratégias Shallow e Deep copy  Inicialmente, objetos são copiados via shallow copy  Um contador é mantido para conhecer a quantidade de objetos copiados  Quando o programa tiver que modificar um objeto, ele verifica antes se aquele objeto compartilha dados  Se for o caso, uma deep copy é realizada e um novo objeto é criado antes dele ser modificado
  • marcello.thiry@gmail.com ... ...
  • marcello.thiry@gmail.com ... ... Implementar a interface “Cloneable” Suportar a exceção “CloneNotSupportedException”
  • marcello.thiry@gmail.com ... ... Não esquecer de chamar o clone() da superclasse: garantir o efeito cascata
  • marcello.thiry@gmail.com ... ... Deep copy
  • marcello.thiry@gmail.com ... ...
  • marcello.thiry@gmail.com ... ...
  • marcello.thiry@gmail.com Usando a operação “clone”
  • marcello.thiry@gmail.com Referências 186  Grady Booch; Robert A. Maksimchuck; Michael W. Engle; Bobbi J. Young; Jim Conallen; Kelli A. Houston. Object-oriented analysis and design with applications. 3rd ed. Addison-Wesley, 2007.  Ricardo Pereira e Silva. UML 2 em Modelagem Orientada a Objetos. Visual Books, 2007.  Paul J. Deitel; Harvey M. Deitel. Java - Como Programar. 8ª ed., Prentice Hall, 2010.  OMG (Object Management Group), OMG Unified Modeling Language v2.5, 2012.  http://www.omg.org/spec/UML/2.5/Beta1/PDF/
  • marcello.thiry@gmail.com Referências 187  Luca Cardelli; Peter Wegner. On understanding types, data abstraction and polymorphism. Computing Surveys, 17(4):471-522, December 1985.
  • marcello.thiry@gmail.com marcello.thiry@gmail.com