Módulo 06 Desenho de Classes



Documentos relacionados
Técnicas de Programação II

Programação por Objectos. Java

Programação por Objectos. Java

Programação de Computadores - I. Profª Beatriz Profº Israel

3 Classes e instanciação de objectos (em Java)

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Java 2 Standard Edition Como criar classes e objetos

Orientação a Objetos

Noções sobre Objetos e Classes

A Linguagem Java. Alberto Costa Neto DComp - UFS

Reuso com Herança a e Composiçã

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Análise de Programação

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Módulo 07 Características Avançadas de Classes

Slide 1 Deitel/Deitel, 8e. Java Como programar Copyright 2010 Pearson Education

JSP - ORIENTADO A OBJETOS

Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Lição 9 Trabalhando com bibliotecas de classes

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Algoritmia e Programação APROG. Linguagem JAVA. Básico. Nelson Freire (ISEP DEI-APROG 2012/13) 1/31

Programação Orientada a Objetos em Java. Herança

Java. Marcio de Carvalho Victorino

Capítulo 5 Reuso de Classes

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br)

2 Orientação a objetos na prática

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Introdução a Java. Hélder Nunes

Programação por Objectos. Java

Linguagem de Programação III

Programação Orientada a Objetos em java. Polimorfismo

Orientação a Objetos

insfcanceof new public switch transient while byte continue extends for int null

Herança. Alberto Costa Neto DComp - UFS

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

Programação Orientada a Objetos em Java

A Introdução à Programação Orientada a Objetos. Programação e Sistemas de Informação

Encapsulamento de Dados

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

POO Programação Orientada a Objetos. Classes em Java

Programação Orientada a Objetos C++

BCC221 Programação Orientada a Objetos. Prof. Marco Antonio M. Carvalho 2014/2

Programação Orientada a Objetos (DPADF 0063)

Guia de Fatores de Qualidade de OO e Java

Unidade IV: Ponteiros, Referências e Arrays

Algoritmos e Programação II. Sobrecarga

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Criar a classe Aula.java com o seguinte código: Compilar e Executar

Programação Orientada a Objetos. Encapsulamento

Capítulo 3. Programação por objectos em Java

Aula 09 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

Exercícios de Revisão Java Básico

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

Classes, Superclasses e Subclasses

Revisão OO Básico. Orientação a Objetos em Java

Programação Orientada a Objetos (DPADF 0063)

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento NetBeans Introdução à Linguagem de Programação JAVA

Projeto de Software Orientado a Objeto

Análise e Projeto Orientados por Objetos

Orientação a Objetos com Java

Profº. Enrique Pimentel Leite de Oliveira

Sintaxe Básica de Java Parte 1

Computação II Orientação a Objetos

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

Aula 3 Objeto atual com referencia THIS e Classes com Herança

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

JavaScript 2.0X X

Visual Basic e Java. À primeira vista o Java é completamente diferente do Visual Basic. Realmente as duas linguagens pertencem a mundos distintos.

Desenvolvimento OO com Java Orientação a objetos básica

Programação WEB I Estruturas de controle e repetição

AULA Uma linguagem de programação orientada a objetos

1. Herança. Sobrescrevem métodos - redefinem métodos herdados. Subclasse herda de uma superclasse

Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido

5 Caso de estudo O cartão fidelidade

DEFINIÇÃO DE MÉTODOS

Padrão Básico de Projeto: Interfaces e Polimorfismo

8 Classes Internas. Desenvolvimento OO com Java. Vítor E. Silva Souza

ÇÃO COM OBJECTOS PROGRAMAÇÃ. Programação com Objectos. Programação com Objectos TUDO É UM OBJECTO TUDO É UM OBJECTO ÍNDICE.

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento Eclipse Introdução à Linguagem de Programação JAVA

Algoritmos e Programação Estruturada

BC0501 Linguagens de Programação

HERANÇA. Prog. Orientada a Objetos em Java

BSI UFRPE Prof. Gustavo Callou

Unidade Acadêmica: Faculdade de Computação FACOM Disciplina: Programação Orientada a Objetos I Professor: Fabiano Azevedo Dorça Prática 01

Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos

Para desenvolver a atividade a atividade desta aula utilizaremos o ambiente de desenvolvimento integrado NetBeans.

Herança. Algoritmos e Programação II. Aula 5 Herança

Transcrição:

Módulo 06 Desenho de Classes Última Atualização: 13/06/2010 1

Objetivos Definir os conceitos de herança, polimorfismo, sobrecarga (overloading), sobreescrita(overriding) e invocação virtual de métodos. Utilizar os modificadores de acesso protected e packagefriendly. Descrever os conceitos de sobrecarga de construtores e métodos. 2

Objetivos (Cont.) Descrever a operação de construção e iniciação de um objeto. Discutir o conceito de AutoBoxing introduzido no Java 5 3

Herança A classe Empregado: public class Empregado { private Data datanascimento; private String primeironome; private String ultimonome; } public String getdetalhes ( ) {...} 4

A classe Gerente: Herança(Cont.) public class Gerente { private Data datanascimento; private String departamento; private String primeironome; private String ultimonome; public String getdetalhes (){...} } 5

Herança(Cont.) public class Empregado { private Data datanascimento; private String primeironome; private String ultimonome; } public String getdetalhes ( ) {...} public class Gerente extends Empregado { } private String departamento; 6

Herança Simples Quando uma classe herda apenas de uma outra classe, obtemos uma herança simples. Herança Múltipla é realizada através do conceito de Interfaces (próximo módulo). Sintaxe de uma classe Java: <modificador de acesso> class <nome> [extends <superclasse>]{ <declarações>* } 7

Herança Simples(Cont.) 8

Controle de Acesso Modificador Classe Pacote Subclasse Aplicação private Sim default Sim Sim protected Sim Sim Sim* public Sim Sim Sim Sim * Para uma subclasse fora do pacote, o membro protected somente pode ser acessado via herança. Se tentarmos acessar o membro via uma referência da superclasse, teremos um erro de compilação!!! 9

Sobreescrita de Métodos Uma subclasse pode modificar o comportamento herdado da super classe. Uma subclasse pode criar um método com uma funcionalidade diferente da super classe, entretanto, com o mesmo: Nome Tipo de Retorno Lista de Argumentos 10

Sobreescrita de Métodos public class Empregado { protected String primeironome; protected double salario; protected Data datanascimento; } public String getdetalhes() { return Primeiro Nome..: + primeironome\n + Salario..: + salario + \n ) public class Gerente extends Empregado { private String departamento; public String getdetalhes() { return Primeiro Nome..: + primeironome\n + Salario..: + salario + \n + Departamento..: + departamento; }} 11

A Palavra Reservada super super é utilizada em uma classe para referenciar a superclasse. super é utilizada para referenciar membros da superclasse, mais especificamente, atributos, construtores e métodos. O comportamento (método) invocado não necessariamente necessita estar na superclasse; ele pode estar em outro local dentro da hierarquia. 12

public class Empregado { } A Palavra Reservada super private String nome; private double salario; private String datanascimento; public String getdetalhes() { return "Nome: " + nome + "\n Salário: " + salario; } public class Gerente extends Empregado { private String departamento; public String getdetails() { // chama o método getdetalhes( ) presente na superclasse return super.getdetalhes() + "\n Departamento:" + departamento; }} 13

Polimorfismo Polimorfismo é a capacidade de se ter várias formas distintas; por exemplo, a classe Gerente tem acesso a métodos da classe Empregado. Um objeto possui apenas uma forma. Uma variável de referência pode referenciar objetos que possuem formas totalmente distintas. 14

Polimorfismo(Cont.) Empregado empregado = new Gerente(); // OK /* Tentativa ilegal de atribuir um atributo de gerente. A variável é declarada como sendo do tipo Empregado, embora o objeto Gerente possua este atributo. */ empregado.departamento = Vendas ; 15

Invocação Virtual de Método Invocação Virtual de Método: Empregado e = new Gerente(); e.getdetalhes(); Tipo em tempo de Compilação e tipo em tempo de execução (Late Binding) 16

Regras sobre Métodos Sobreescritos Deve ter um tipo de retorno que seja idêntico ou subclasse do tipo definido no método que está sendo sobreescrito (Retorno co-variante, introduzido no Java 5). Não pode ser menos acessível que o método que ele sobrescreve. 17

Regras sobre Sobrescrita de public class Pai { public void fazalgo() { } } public class Filha extends Pai { private void fazalgo() { } } public class UsaAmbas { public void fazoutracoisa() { Pai p1 = new Pai(); Pai p2 = new Filha(); p1.fazalgo(); p2.fazalgo(); //Erro!! }} Métodos(Cont.) 18

Coleções Heterogêneas Coleções de objetos com o mesmo tipo são chamadas de coleções homogêneas. Data[] datas = new Data[2]; datas[0] = new Data(22, 12, 1964); datas[1] = new Data(22, 7, 1964); Coleções de objetos de tipos diferentes são conhecidas como coleções heterogêneas. Empregado [] funcionarios = new Empregado[1024]; funcionarios[0] = new Gerente(); funcionarios[1] = new Empregado(); funcionarios[2] = new Engenheiro(); 19

Argumentos Polimórficos Devido ao fato de Gerente ser um Empregado: // Na classe Empregado public TaxaJuros encontrataxajuros(empregado e) {} // Enquanto isso, em algum ponto da aplicação Gerente m = new Gerente();...... TaxaJuros t = encontrataxajuros(m); 20

O Operador instanceof public class Empregado extends Object public class Gerente extends Empregado public class Engenheiro extends Empregado --------------------------------------- - public void fazalgo(empregado e) { if (e instanceof Gerente) { // Processamento de Gerente } else if (e instanceof Engenheiro) { // Processamento de Engenheiro } else { // Processamento de outro tipo de Empregado } } 21

Conversão (Casting) de Objetos Use instanceof para testar o tipo de um objeto. Restaure toda a funcionalidade de um objeto através de um casting (conversão de tipos). Confira o casting utilizando as seguintes recomendações: Conversões para cima na hierarquia são feitas implicitamente. Conversões para baixo devem ser feitas para uma subclasse e sua checagem é feita pelo compilador. O tipo do objeto é conferido em tempo de execução. 22

Sobrecarga de Métodos Utilizado da seguinte maneira: public void println(int i) public void println(float f) public void println(string s) A lista de argumentos deve ser diferente. O tipo de retorno pode ser diferente 23

Sobrecarga de Construtores Semelhante a métodos, podemos fazer a sobrecarga de construtores. Exemplo: public Empregado(String nome, double salario, String data) public Empregado(String nome, double salario) public Empregado(String nome, String data) A lista de argumentos deve ser diferente. Você pode usar a referência this na primeira linha de um construtor para chamar outro construtor. 24

Sobrecarga de Construtores 1 public class Empregado { 2 3 private String nome; 4 private double salario; 5 private String datanascimento; 6 7 public Empregado(String nome, double salario, String datanascimento) { 8 this.nome = nome; 9 this.salario = salario; 10 this.datanascimento = datanascimento; 11 } 12 public Empregado(String nome, double salario) { 13 this(nome, salario, null); 14 } 15 public Empregado(String nome, String datanascimento) { 16 this(nome, 0.0, datanascimento); 17 } 18 public Empregado(String nome) { 19 this(nome, salario); 20 } 21 } 25

Construtores Não São Herdados Uma subclasse herda todos os métodos e variáveis public ou protected da superclasse. Uma subclasse NÃO herda o construtor da superclasse. Existem duas maneiras de se incluir um construtor: Utilizando o construtor default, Escrever explicitamente um ou mais construtores. 26

Chamando Construtores da Superclasse Para se chamar um construtor da superclasse, devemos inserir uma chamada super na primeira linha do construtor. Você pode chamar um construtor específico da superclasse através dos argumentos utilizados na chamada super 27

Chamando Construtores da Superclasse (Cont.) Se não houver uma chamada explícita this ou super no construtor, então o compilador adiciona uma chamada implícita para super(), que por sua vez, chama o construtor da superclasse sem argumentos (que pode ser o construtor default). Se a superclasse definir construtores, mas não fornecer um construtor sem argumentos, então uma mensagem de erro é gerada. 28

Chamando Construtores da Superclasse 1 public class Empregado { 2 3 private String nome; 4 private double salario; 5 private String datanascimento; 6 7 public Empregado(String nome, double salario, String datanascimento) { 8 this.nome = nome; 9 this.salario = salario; 10 this.datanascimento = datanascimento; 11 } 12 public Empregado(String nome, double salario) { 13 this(nome, salario, null); 14 } 15 public Empregado(String nome, String datanascimento) { 16 this(nome, 0.0, datanascimento); 17 } 18 public Empregado(String nome) { 19 this(nome, 0.0); 20 } } 29

Chamando Construtores da Superclasse(Cont.) 1 public class Gerente extends Empregado { 2 private String departamento; 3 4 public Gerente(String nome,double salario, String dept) { 5 super(nome, salario); 6 departamento = dept; 7 } 8 public Gerente(String n, String dept) { 9 super(nome); 10 departamento = dept; 11 } 12 public Gerente(String dept) { // erro: ausência de super() explícito 13 departamento = dept; 14 } 15 } 30

Programação Orientada a Objetos e Linguagem de Programação Java Construindo e Iniciando Objetos: Breve Revisão A memória é alocada e iniciação default ocorre. A iniciação das variáveis de instância utiliza estes passos recursivamente: 1. casa os parâmetros do construtor. 2. Se houver um this(), chama recursivamente, e vá para o passo 5. 3. Chama super recursivamente, de forma implícita ou explícita, exceto para Object. 4. Executa iniciadores explícitos das variáveis de instância. 5. Executa o bloco do construtor. 31

Programação Orientada a Objetos e Linguagem de Programação Java Exemplo de Construtor e Iniciação public class Object { public Object() {} } public class Empregado extends Object { private String nome; private double salario = 1500.00; private String datanascimento; } public Empregado(String n, String datanascimento) { // super() implícito nome = n; this.datanascimento = datanascimento; } public Empregado(String n) { this(n, null); } public class Gerente extends Empregado { private String departamento; public Gerente(String n, String d) { super(n); departamento = d; }} 32

Programação Orientada a Objetos e Linguagem de Programação Java Exemplo de Construtor e Iniciação Exemplo supondo a construção new Gerente( Joe Smith, Vendas ) 0 Iniciação básica 0.1 Alocação de memória para o objeto Gerente 0.2 Inicia todas as variáveis de instância com seus valores default (0 ou null) 1 Chama o construtor: Gerente("Joe Smith", "Vendas") 1.1 Casa os parâmetros do construtor: n="joe Smith", d="vendas" 1.2 Não há uma chamada explícita para this() 1.3 Chama super(n) para Empregado(String n) 1.3.1 Casa os parâmetros do construtor: n="joe Smith" 1.3.2 Chama this(n, null) para Empregado(String n, String datanascimento) 1.3.2.1 Casa parâmetros do construtor: n="joe Smith", datanascimento=null 1.3.2.2 Não há uma chamada explícita para this() 1.3.2.3 Chama super() para Object() 1.3.2.3.1 Nenhum casamento necessário 1.3.2.3.2 Não há chamada this() 1.3.2.3.3 Não há chamada super() (Object é a raiz) 1.3.2.3.4 Não existe iniciação explícita de variáveis para Object 1.3.2.3.5 Não há chamada de método 1.3.2.4 Inicia explicitamente variáveis de Empregado: salario=1500.00; 1.3.2.5 Executa o corpo do construtor: nome="joe Smith"; datanascimento=null; 1.3.3-1.3.4 passos não necessários 1.3.5 Executa o corpo do construtor: Não há instruções em Empregado(String) 1.4 Não há iniciadores explícitos para Gerente 1.5 Executa o corpo do construtor: departamento="vendas". 33

A Classe Object A classe Object é a super classe de todas as classes em Java. Uma declaração de classe sem a cláusula extends utiliza, implicitamente, a instrução extends Object public class Empregado {... } é equivalente a: public class Empregado extends Object {... } 34

O Operador == Comparado com o Método equals O operador == determina se duas referências são idênticas (ou seja, referem ao mesmo objeto). O método equals determina se objetos são iguais em conteúdo, mas não necessariamente idênticos. A implementação do método equals em Object utiliza o operador ==. 35

O Operador == Comparado com o Método equals(cont.) Classes definidas pelo programador podem fazer a sobreescrita do método equals(object o) para implementar um teste de igualdade-domínio. Nota: Devemos fazer a sobreescrita do método hashcode() se fizermos a sobreescrita do método equals(object o). Maiores detalhes no módulo sobre Coleções Java 36

Exemplo: equals 1 public class Data{ 2 private int dia; 3 private int mes; 4 private int ano; 5 6 public Data(int dia, int mes, int ano) { 7 this.dia = dia; 8 this.mes = mes; 9 this.ano = ano; 10 } 11 12 public boolean equals(object o) { 13 boolean resultado = false; 14 if ( (o!= null) && (o instanceof Data) ) { 15 Data d = (Data) o; 16 if ((dia == d.dia) && (mes == d.mes) 17 && (ano == d.ano) ) { 18 resultado = true; 19 } 20 } 21 return resultado; 22 } 23 24 public int hashcode() { 25 return (dia ^ mes ^ ano); 26 } 27 } 37

Exemplo: equals 1 class TesteEquals { 2 public static void main(string[] args) { 3 Data data1 = new Data(14, 3, 1976); 4 Data data2 = new Data(14, 3, 1976); 5 6 if (data1 == data2 ) { 7 System.out.println("data1 idêntica a data2"); 8 } else { 9 System.out.println("data1 não é identica a data2"); 10 } 11 12 if (data1.equals(data2) ) { 13 System.out.println("data1 é igual a data2"); 14 } else { 15 System.out.println("data1 não é igual a data2"); 16 } 17 18 System.out.println("atribui data2 = data1;"); 19 data2 = data1; 20 21 if (data1 == data2 ) { 22 System.out.println("data1 é idêntica a data2"); 23 } else { 24 System.out.println("data1 não é identica a data2"); 25 } 26 } 27 } Gera a saída: data1 não é idêntica a data2 data1 é igual a data2 Atribui data2 = data1; data1 é idêntica a data2. 38

O Método tostring() Converte um objeto em uma String. Usado durante concatenação de strings. Fazemos a sobreescrita deste método para fornecer informação sobre um objeto definido pelo programador em um formato legível. Tipos primitivos são convertidos em String utilizando o método estático tostring() da classe empacotadora (wrapper class). 39

Classes Empacotadoras Wrapper Tratam elementos de tipos primitivos como objetos: Tipo Primitivo Classe Empacotadora boolean byte short int long float double char Boolean Byte Short Integer Long Float Double Character 40

Pré Java 5 // Definindo um tipo primitivo int primitivoint = 500; Classes Empacotadoras // Empacotando o tipo primitivo definido acima Integer empacotandoint = new Integer(primitivoInt); // Convertendo novamente para primitivo int primitivo2 = empacotandoint.intvalue(); Pós Java 5 Autoboxing Elimina o trabalho do programador de ter que fazer o encapulamento/desencapsulamento de um tipo primitivo com sua respectiva classe empacotadora. 41

Autoboxing e Unboxing 42

AutoBoxing e UnBoxing - Agenda Convertendo Tipos Primitivos para Classes Empacotadoras Wrapper Classes Convertendo Classes Empacotadoras para Tipos Primitivos Incrementando e Decrementando Classes Empacotadoras Valores Boolean versus boolean Estruturas Condicionais e UnBoxing Instruções de Controle e Unboxing Resolução na Sobrecarga de Métodos 43

Autoboxing/Unboxing de tipos Primitivos Problema: (pré-java 5): 1. Conversão entre tipos primitivos e tipos wrapper (e vice-versa) 2. Você precisa converter manualmente um tipo primitivo para um tipo wrapper antes de adicioná-lo na coleção int i = 22; Integer[] b = new Integer[1]; b[0] = new Integer(i); 44

Autoboxing/Unboxing de tipos Primitivos Solução: Deixe o compilador fazer isto Byte byteobj = 22; // Conversão Autoboxing int i = byteobj // Conversão Unboxing Integer[] lista = new Integer[1]; lista[0] = 22; // Conversão Autoboxing 45

Incrementando e Decrementando Classes Empacotadoras Podemos utilizar as operações ++ e - - com classes empacotadoras Integer contador = 1; while (true) { System.out.println( Iteração..: + contador++); if (contador > 1000) { break; } } A variável contador é tratada com um tipo primitivo int neste código 46

Incrementando e Decrementando Classes Empacotadoras (cont.) Pontos importantes neste código: contador++ lembre-se que contador é um Integer. Nessa linha foi feito um Unboxing para o tipo int que é o tipo necessário ao operador ++ (o operador ++ não foi alterado para funcionar com Unboxing) Após unboxing do valor, o incremento é feito e o novo valor é armazenado novamente em contador através de uma operação Boxing. O processo de unboxing também é demonstrado na linha contador > 1000 47

Valores Boolean versus boolean Operadores booleanos como!,, && são úteis para valores Boolean. Sempre que tivermos uma expressão que usa!,, ou && qualquer valor Boolean é convertido em tipo primitivo e avaliado adequadamente Boolean caso1 = true; Boolean caso2 = true; boolean caso3 = false; Boolean resultado = (caso1 caso2) && caso3; Neste código o resultado da expressão, é encapsulado dentro da variável resultado (AutoBoxing) 48

Estruturas Condicionais e UnBoxing O conceito de boxing/unboxing afeta, tornando mais flexível, a utilização do operador ternário expressao? expressao1 : expressao2; Em versões anteriores ao Tiger o operador ternário necessitava que seus operandos fossem de tipos compatíveis ou que um pudesse ser associado a outro (ex: int e float). No tiger, os operandos do operador ternário podem ser praticamente de qualquer tipo. 49

Estruturas Condicionais e UnBoxing Exemplo: Boolean estachegando = false; Boolean estaatrasado = true; System.out.println(estaChegando? chegou no horário : Você está atrasado ); O operador ternário no tiger permite o casting automático de referência para a superclasse comum aos dois operandos. Exemplo (Funciona somente a partir do JavaSE 5, Tiger) : String s = olá; StringBuffer sb = new StringBuffer( mundo ); boolean emutavel = true; CharSequence c = emutavel? sb : s; // CharSequence é superclasse de // StringBuffer e String 50

Estruturas Condicionais e UnBoxing (Cont.) O código no slide anterior gera um erro em versão anteriores ao Java 5 já que String e StringBuffer não podem ser associadas uma a outra. Este código poderá funcionar em versões anteriores ao Java 5 se o programador fizer algumas conversões: String s = olá; StringBuffer bf = new StringBuffer( mundo ); boolean emutavel = true; CharSequence c = emutavel? (CharSequence)sb : (CharSequence)s; Repare que poderíamos utilizar Object em vez de CharSequence no exemplo acima. 51

Estruturas de Controle e UnBoxing As estruturas de controle if/else, while, do são afetadas pelo conceito de boxing/unboxing Integer pessoasnasala = 0; int capacidademaxima = 100; boolean horadepartir = false; Boolean chegando = true; while (pessoasnasala < capacidademaxima) { if (chegando) { System.out.println("Bom ver você."); pessoasnasala++; } else { pessoasnasala--; } if (horadepartir) { do { System.out.printf("Número de pessoas na sala + pessoasnasala); pessoasnasala--; } while (pessoasnasala > 0); } } 52

Estruturas de Controle e UnBoxing (Cont.) Outra estrutura de controle beneficiada é o switch Em Tiger a instrução switch funciona com: byte, short, int, char, Byte, Short, Integer, Character e enum 53

Resolução na Sobrecarga de Métodos Resolução de métodos é o processo pelo qual o compilador Java determina qual método é invocado. Boxing e Unboxing afetam este processo. Exemplo: public void fazalgo(double num) public void fazalgo(integer num) Invocando fazalgo() :... int foo = 1; fazalgo(foo); // Qual método é chamado???... 54

Resolução na Sobrecarga de Métodos (Cont.) Antes do Tiger isso era fácil: O tipo int era convertido em double e o método fazalgo(double num) era invocado A primeira vista pode parecer que, com o Tiger, o tipo int é encapsulado em um Integer e faz Algo(Integer num) é invocado ISSO NÃO ACONTECE!!!! Resolução de métodos em Tiger sempre selecionará o mesmo método que seria invocado utilizando Java 4 (Compatibilidade retroativa) 55

Perguntas? 56