Você está na página 1de 161

Apostila

Linguagem Java

Java OO

www.3way.com.br
Linguagem
Linguagem de
de Programação
Programação Java
Java

Sumário//atribuindo valor a variável referência


Carro carro1 = new Carro();
1 Introdução à Linguagem Java 67
carro1.ano = "2001";
1.1 O que é a Tecnologia Java ? 67
carro1.modelo= "fusca";
1.1.1 JSE - Java Standard=Edition
carro1.cor "prata"; 67
1.1.2 JEE - Java Enterprise Edition 67
1.1.3 JME - Java Micro Edition 67
1.1.4 Java Card 78
1.2 Quanto tempo é necessário para aprender Java ? 78
1.3 O curso 10
8
1.3.1 Convenções de Código 10
8
1.3.2 Sobre os exercícios 10
8
1.4 Fazer Laboratório 0 10
8
2 Bases da Programação em Java 11
9
2.1 Classes 11
9
2.1.1 Declarando Membros: Variáveis e Métodos 12
10
2.2 Objetos 12
10
2.2.1 Instância de Classes Figura 2.4 – Layout Memória após inicialização 12
10
2.2.2 Referência de novo
//criando Objetosalias 14
11
2.3 Membros
Carro de Instância
carro2 = carro1; 15
12
2.3.1 Invocação de Métodos 15
12
2.3.1.1 Chamando Métodos de Objeto 16
13
2.3.2 Envio de Argumentos para Métodos 16
13
2.3.2.1 Passagem de Parâmetros por valor 16
13
2.3.2.2 Passagem de Parâmetros por referência 18
14
2.4 Membros Estáticos 19
15
2.5 Herança - Relacionamentos do tipo "é-um" 20
16
2.6 Agregação - Relacionamentos do tipo "tem-um" 22
17
2.7 Princípios de Programação Com Java 23
18
2.8 Estrutura de Arquivos Fontes em Java 23
18
2.9 O método main() 24
19
2.10 Fazer Laboratório 1 24
19
2.11 Exercícios 24
19
3 Identificadores, Palavras-chave e Tipos 19
24
3.1 Comentários Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto 19
24
3.2 Ponto-e-Vírgula, Blocos e Espaço 20
23
3.3 Identificadores 20
23
3.4 Palavras Reservadas
2.3 Membros de Instância 20
23
3.5 Variáveis, Declarações e Atribuição 21
26
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis21
3.5.1 Declarando e inicializando Variáveis 26
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
3.5.2 Exibindo o valor de uma Variável 22
28
objeto. Isto
3.5.3 é importante,
Variáveis pois edenota
de Referência de Valorque um método pertence a cada objeto da o seu estado. 22
28
classe. Porém não devemos confundir isto com a implementação do método, que
3.6 Tipos Básicos em Java Dois objetos distintos têm
23
29
é compartilhada
3.6.1 por todas as instâncias da classe.
Literais Java o mesmo estado se suas2329
3.6.2 Tipos Dados Primitivos 23
29
2.3.1 Invocação
3.6.2.1 de Métodos
Lógico – boolean
variáveis membro têm os23
29
3.6.2.2 Textual – char and String pela troca de mensagens, isto significa que um
Objetos se comunicam mesmos valores. 23 29
3.6.2.3
objeto pode ter queshort,
Inteiro – byte, int e long
mostrar um comportamento particular invocando uma 24
30
3.6.2.4
operação apropriada que foie double
Ponto Flutuante – float definida no objeto. Em Java, isto é feito pela 24
30
3.6.2.5
chamadaExemplos de declarações
de um método em um e atribuições
objeto usando o operador binário "." (ponto), 25
31
3.7 Conversões 26
32
devendo especificar a mensagem completa: o objeto que é o recebedor da
3.7.1 Casting de Tipos Primitivos 26
32
mensagem,
3.7.2 o método
Literais numéricosa ser invocado Numérica
e Promoção e os argumentos para o método (se houver). 26
32
O
3.8método Classes Wrapper (Empacotadoras) também enviar informações de volta ao
invocado no recebedor pode 27
33
objeto
3.8.1 chamador
Construtores através
Wrapperde um valor de retorno. O método chamado deve ser 28
34
um que esteja
3.8.2 Método definido
valueOfpelo objeto. 28
34
3.8.3 Conversões 28
34
Todos os direitos reservados a 3Way Networks
Seja
Seja um
um Profissional
Profissional Aprendendo
Aprendendo com
www.3way.com.br
com Profissionais
Profissionais 2121
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

3.9 AutoBoxing 35
29
3.9.1 Boxing e Unboxing Automático para Tipos Primitivos 29
35
//atribuindo valor a variável referência
3.9.2 Ocorrência de Boxing e Unboxing automático 29
35
Carro carro1 = new Carro();
3.10 Fazer Laboratório 2 30
36
carro1.ano = "2001";
3.11 Exercícios 30
36
carro1.modelo= "fusca";
4 Operadores
carro1.cor = "prata"; 30
36
4.1 Operadores Aritméticos 30
36
4.2 Operadores de Incremento e Decremento 31
37
4.3 Operadores Relacionais 32
38
4.4 Operadores Lógicos 33
39
4.4.1 && (e lógico) e & (e binário) 34
40
4.4.2 || ( ou lógico) e | ( ou binário) 35
42
4.4.3 ^ (ou exclusivo binário) 43
36
4.4.4 ! (negação) 43
36
4.4.5 Operador Condicional ( ?: ) 44
37
4.5 Precedência de Operadores 44
37
4.6 Exercícios 45
38
5 Estruturas de controle 45
38
5.1 Estruturas de decisão if - else 45
38
Figura 2.4 – Layout Memória após inicialização
5.2 Declaração switch 47
40
5.3 //criando
Iterações (Laços) novo alias 48
41
5.3.1 Carro
while carro2 = carro1; 48
41
5.3.2 do-while 49
42
5.3.3 Declaração for 50
43
5.4 Declarações de Interrupção e Desvio 51
44
5.4.1 Declaração break 51
44
5.4.1.1 Declaração unlabeled break 44
51
5.4.1.2 Declaração labeled break 44
51
5.4.2 Declaração continue 45
52
5.4.2.1 Declaração unlabeled continue 45
52
5.4.2.2 Declaração labeled continue 45
52
5.4.3 Declaração return 46
54
5.5 Fazer Laboratório 3 46
54
5.6 Exercícios 46
54
6 Array 46
54
6.1 Declarando Array 46
54
6.2 Acessando um elemento do Array
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto 47
55
6.3 Tamanho de Array 48
56
6.4 Arrays Multidimensionais 49
57
6.5 Copiando Arrays 50
2.3 Membros
6.6
de Instância
Percorrendo Arrays com Enhaced-for
58
50
58
6.7 Cada objeto
Manipulando criado
Arrays deverá ter sua própria instância de variáveis
com java.util.Arrays Os valores das variáveis
51
59
(atributos)
6.8 Fazerdefinidas
Laboratóriopela
4 classe. Os métodos definem o comportamento de um em um objeto constituem
52
60
objeto. Isto
6.9 é importante, pois denota que um método pertence a cada objeto da
Exercícios o seu estado. 5260
7classe. Porém
Programação Orientadaconfundir
não devemos a Objetos isto com a implementação do método, que 52
60têm
7.1 Classes e Objetos Dois objetos distintos52
é compartilhada por todas as instâncias da classe. 60
7.1.1 Definindo Classes o mesmo estado se 52 suas
60
7.1.2 Definindo Métodos
2.3.1 Invocação de Métodos variáveis membro têm 61 os
53
7.1.2.1 Definindo Métodos na Classe mesmos valores.6254
7.1.3 ObjetosdeseInstância
Métodos comunicam pela troca
e a Referência this de mensagens, isto significa que um 55
63
objeto pode
7.1.4 ter de
Sobrecarga que mostrar
Métodos um comportamento particular invocando uma
(Overloading) 56
64
operaçãoConstrutores
7.1.5 apropriada que foi definida no objeto. Em Java, isto é feito pela 57
65
chamadaConstrutor
7.1.6 de um método em um objeto usando o operador binário "." (ponto),
Padrão (default) 57
65
7.1.7 Overloading de Construtores
devendo especificar a mensagem completa: o objeto que é o recebedor da 58
66
7.1.8
mensagem,Usando Construtores
o método a ser invocado e os argumentos para o método (se houver). 58
66
7.1.9 Utilizando o Construtor this( ) 59
67
O
7.2
método invocado no
Fazer Laboratório 5
recebedor pode também enviar informações de volta ao 60
objeto chamador através de um valor de retorno. O método chamado deve ser 69
7.3 Herança 60
69
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 2
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 312
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

7.3.1 Definindo Superclasses e Subclasses 69


60
7.3.2 Chamando Construtor super() e Referência super 63
72
//atribuindo valor a variável referência
7.3.3 Modificador de Classe final 63
72
Carro carro1 = new Carro();
7.4 Polimorfismo 64
73
carro1.ano = "2001";
7.4.1 Coleções Heterogêneas de Objetos 65
74
carro1.modelo= "fusca";
7.4.2 Determinando a Classe
carro1.cor de um Objeto
= "prata"; 65
74
7.4.3 Casting de Referências de Objetos 66
75
7.4.4 Operações Polimórficas por Sobreposição de Métodos 68
77
7.4.4.1 Invocando Métodos Sobrepostos 69
78
7.4.4.2 Regras sobre Sobreposição de Métodos 70
79
7.4.5 Modificador de Método final 71
80
7.5 Encapsulamento 71
80
7.5.1 Pacotes 71
80
7.5.1.1 Criando pacotes 71
80
7.5.1.2 Importando Pacotes 72
81
7.5.1.3 Localização de Classes e CLASSPATH 73
83
7.5.1.4 Importação Estática 74
84
7.5.2 Modificadores de Acesso 75
85
7.5.2.1 Público - public Figura 2.4 – Layout Memória após inicialização 75
85
7.5.2.2 Protegido – protected 86
76
7.5.2.3 //criando
Padrão ou Pacotenovo alias 87
77
7.5.2.4 Privado - private = carro1;
Carro carro2 88
78
7.6 Métodos de Configuração e Captura 88
78
7.6.1 Métodos Getter 88
78
7.6.2 Métodos Setter 89
79
7.6.3 Aplicando Encapsulando no Exemplo Funcionario/Gerente 89
79
7.7 Fazer Laboratório 6 91
81
7.8 O operador == comparado ao Método equals 91
81
7.9 Classses Abstratas 93
83
7.10 Interfaces 97
86
7.10.1 Porque utilizar Interfaces? 86
97
7.10.2 Interface vs. Classe Abstrata 87
98
7.10.3 Criando Interfaces 87
98
7.10.4 Relacionamento de uma Interface para uma Classe 89
100
7.10.5 Herança entre Interfaces 89
100
7.10.6 Interface vs. Classe 90
101
7.11 Classes Aninhadas Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto 90
101
7.11.1 Classe Aninhada 91
102
7.11.2 Classes aninhadas estáticas 91
102
7.11.3 Classes internas locais 92
103
2.3 Membros
7.11.4
de Instância
Classes internas anônimas 93
104
7.11.5 Cada objetode criado
Modificadores acesso deverá ter sua própria instância de variáveis Os valores das variáveis
93
104
(atributos)
7.12 Tiposdefinidas pela classe. Os métodos definem o comportamento de um
Enumerados em um objeto constituem
95
106
objeto. Isto
7.13 FazeréLaboratório
importante,7 pois denota que um método pertence a cada objeto da o seu estado. 97
108
7.14 Exercícios
classe. Porém não devemos confundir isto com a implementação do método, que 97
108
8é compartilhada
Exceções por todas as instâncias da classe. Dois objetos distintos
97têm
108
8.1 Manipulando Exceções o mesmo estado se108suas
97
8.2 Categorias de Exceções
2.3.1 Invocação de Métodos variáveis membro têm 99 os
111
8.2.1 Exceções Verificadas e Não-verificadas mesmos valores. 100
112
8.3 Objetos Exceções
Lançando se comunicam pela troca de mensagens, isto significa que um 100
112
objeto pode
8.3.1 ter quethrow
A palavra-chave mostrar um comportamento particular invocando uma 100
112
operaçãoDesviando
8.3.2 apropriada que foi definida no objeto. Em Java, isto é feito pela
Exceções 101
113
chamadaCriando
8.4 de um método em um objeto usando o operador binário "." (ponto),
Exceções 102
114
8.5 Sobrescrita
devendo especificar de Métodos e Exceções
a mensagem completa: o objeto que é o recebedor da 103
115
8.6 Fazer Laboratório 8
mensagem, o método a ser invocado e os argumentos para o método (se houver). 105
117
8.7 Exercício 105
117
9
O método invocado no recebedor pode também enviar informações de volta ao
Tipos Genéricos 105
117
objeto
9.1 chamador através de um valor de retorno. O método chamado deve ser
Por que Generics? 105
117
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 3
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 412
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

9.2 Declarando uma Classe Utilizando Generics 118


106
9.2.1 Limitação "Primitiva" 107
119
//atribuindo valor a variável referência
9.2.2 Limitando Genéricos 107
119
Carro carro1 = new Carro();
9.3 Declarando Métodos Genéricos 108
120
carro1.ano = "2001";
9.4 Subtipagem 109
121
carro1.modelo= "fusca";
9.5 Usando o Coringa <?>
carro1.cor = "prata"; 111
123
9.6 Fazer Laboratório 9 113
125
9.7 Exercício 113
125
10 Java Collections 113
125
10.1 Hierarquia Das Interfaces 113
125
10.2 Generics e Coleções Java 114
126
10.3 Percorrendo Collections 116
129
10.3.1 Laço for-each 116
129
10.3.2 Interface Iterator 116
129
10.4 Usando Listas – Interface List 117
130
10.4.1 LinkedList 117
130
10.5 ArrayList 118
131
10.5.1 Teste de Desempenho 119
132
10.6 Usando Conjuntos – Interface Set Figura 2.4 – Layout Memória após inicialização 120
133
10.6.1 HashSet 120
133
10.6.2 //criando
TreeSet novo alias 120
133
10.7 Carro carro2 = carro1;
Usando Mapas – Interface Map 120
133
10.7.1 HashMap 121
134
10.8 Classificando Coleções: Collections.sort 121
134
10.9 Fazer Laboratório 10 123
136
10.10 Exercício 123
136
11 Construindo Interfaces Graficas com AWT/Swing 136
123
11.1 AWT (Abstract Window Toolkit) vs. Swing 136
123
11.2 Componentes GUI AWT 137
124
11.2.1 Fundamental Window Classes 137
124
11.2.2 Graphics 138
125
11.2.3 Mais Componentes AWT 127
140
11.3 Gerenciadores de Layout 128
141
11.3.1 O Gerenciador FlowLayout 128
141
11.3.2 O Gerenciador BorderLayout 129
142
11.3.3 O gerenciador GridLayout 130
143
11.3.4 Painéis e Layouts Complexos Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto 131
144
11.4 Componentes GUI Swing 132
147
11.4.1 Configurando Containers JFrame e JApplet 133
147
11.5 Manipulação de Eventos 148
134
2.3 Membros
11.5.1
de Instância
Registrando Classes Ouvintes (Listeners) 149
135
11.5.2 Cada Event
Classes objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
149
135
(atributos)
11.5.3 definidas
Listeners pela classe. Os métodos definem o comportamento de um
de Evento 150
em um objeto constituem
136
objeto. Isto
11.5.3.1 Métodoé importante, pois denota que um método pertence a cada objeto da
de ActionListener 150
136
o seu estado.150
11.5.3.2 Métodos
classe. Porém nãode devemos
MouseListener
confundir isto com a implementação do método, que 136
11.5.3.3 Métodos de MouseMotionListener Dois objetos distintos
151têm
137
é compartilhada por todas as instâncias da classe.
11.5.3.4 Métodos WindowListener o mesmo estado se137suas
151
11.5.3.5 Roteiro para criação de Aplicações Gráficas com tratamento de eventos
2.3.1 Invocação de Métodos variáveis membro têm151 os
137
11.5.4 Implementando Manipuladores de Eventos com Anonymous inner class mesmos valores. 139
153
11.6 Objetos
Classes se comunicam pela troca de mensagens, isto significa que um
Adaptadoras 140
154
objeto pode
11.7 ter que mostrar
Fazer Laboratório 11 um comportamento particular invocando uma 143
157
operaçãoExercício
11.8 apropriada que foi definida no objeto. Em Java, isto é feito pela 143
157
chamadaInternacionalização
12 de um métododo em um objeto usando o operador binário "." (ponto),
código 143
157
12.1 Formatação
devendo especificar a mensagem completa: o objeto que é o recebedor da 143
157
12.2
mensagem,ResourceBoundle
o método a ser invocado e os argumentos para o método (se houver). 144
158
12.3 Menssages Formatadas 144
158
O
12.4
método invocado no recebedor pode também enviar informações de volta ao
Fazer Laboratório 12 145
159
objeto
12.5 chamador
Exercícios através de um valor de retorno. O método chamado deve ser 145
159
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 4
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 512
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

13 Exportação de Aplicação 159


145
13.1 Jar executável 145
159
//atribuindo valor a variável referência
13.2 Java Web Start 145
159
Carro carro1 = new Carro();
13.3 Fazer Laboratório 13 146
160
carro1.ano = "2001";
13.4 Exercícios 146
160
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 5
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 612
www.3way.com.br
Linguagem
Linguagem de
de Programação
Programação Java
Java

1 Introdução à Linguagem Java


1.1 //atribuindo valor a variável referência
O que é a Tecnologia Java?
Carro carro1 = new Carro();
Talvez não
carro1.ano seja = "2001";vez que você ouve falar em Java, Java 5, Java 6, JRE, Máquina Virtual, J2SE,
a primeira
J2EE, JSP, EJB
carro1.modelo= a"fusca";
e etc. Bom, resposta é muito longa e pouco proveitosa neste momento. Você não vai encontrar
neste material todas as explicações para tantas siglas e nomes que estão relacionados com a tecnologia Java.
carro1.cor = "prata";
De forma bastante simplificada podemos dizer que a tecnologia Java
é composta por uma gama de produtos pensados para utilizar o melhor das
redes de computadores e capaz de serem executados (rodar) em diferentes
máquinas, sistemas operacionais e dispositivos. Por diferentes dispositivos Os programas feitos em Java
entendemos: PCs, servidores, notebooks, handhelds, PDAs (Palm), celulares, rodam em diferentes
TV, geladeiras e tudo que for possível instalar e executar uma JVM. ambientes graças a JVM (Java
Os programas feitos em Java rodam em diferentes ambientes graças Virtual Machine).
a um componente da plataforma chamado JVM (Java Virtual Machine) – que
é um tipo de tradutor de código Java para instruções específicas de cada
sistema operacional e/ou dispositivo.
A tecnologia Java foi lançada em 1995 e desde então tem crescido
Figura 2.4 – Layout Memória após inicialização
em popularidade e se tornado uma plataforma muito estável e madura.
//criando novo alias
A Plataforma Java pode ser subdividida nos seguintes grupos:
Carro carro2 = carro1;

- JSE (Java Standard Edition)


- JEE (Java Enterprise Edition)
- JME (Java Micro Edition)
- Java Card

1.1.1 JSE - Java Standard Edition


A JSE é uma rica plataforma que oferece um completo ambiente para o desenvolvimento de aplicações
para clientes e servidores. A JSE é também a base da tecnologia JEE e está dividida em dois grupos conceituais:
Core Java e Desktop Java.
Empresas como Sun, IBM, BEA, entre outras, distribuem a JSE na forma de um SDK (Software
Development Kit), em conjunto com uma JRE (Java Runtime Environment).
O pacote do SDK da JSE vem com ferramentas para: compilação, debugging, geração de documentação
(javadoc), empacotador de componentes (jar)
Figura 2.5 – Layout e a JRE,
Memória que contém
duas variáveis JVM
referênciaapara e outros
o mesmo objetocomponentes necessários para
rodar aplicações Java.
O JDK (SDK Java) é usado para compilar e depurar programas, sendo utilizados pelos desenvolvedores de
2.3 Membros de Instância
sistemas.
A JRE éobjeto
Cada o ambiente
criadodedeverá
execução, tersendo
sua utilizado
própria por qualquer
instância de um que deseje executar
variáveis umdas
Os valores programa que
variáveis
tenha sido compilado
(atributos) como
definidas pela byte code
classe. Java. definem o comportamento de um
Os métodos em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
1.1.2 Porém
classe. JEE - Java
nãoEnterprise Edition isto com a implementação do método, que
devemos confundir
Dois objetos distintos têm
A tecnologia
é compartilhada JEE não
por todas é um produto,
as instâncias mas sim uma especificação definida por grandes empresas, através do
da classe.
JCP (Java Community Process). Simplifica o desenvolvimento de aplicações empresariais e multi-camadas. É
o mesmo estado se suas
baseado nos componentes
2.3.1 Invocação de Métodos padronizados, modulares e reusáveis, como os EJB (Enterprise variáveis membro
JavaBeans). têm um
Oferece os
conjuntoObjetos
completose de serviços para
comunicam pela estes
trocacomponentes.
de mensagens, Define muitos comportamentos
isto significa que um mesmos
da valores.
aplicação. Você não
precisa reaprender a programar pois você vai utilizar os
objeto pode ter que mostrar um comportamento particular invocando uma mesmo recursos do Java SE . Necessita de servidores de
aplicaçõesapropriada
operação JEE. A tecnologia JEE definida
que foi não está no noescopo
objeto.deste
Em curso.
Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
1.1.3 JME
devendo - Java Micro
especificar Edition completa: o objeto que é o recebedor da
a mensagem
A tecnologia JME
mensagem, o método a seréinvocado voltada para aplicações que
e os argumentos pararodam
o métodoem pequenos
(se houver).dispositivos como celulares, PDAs,
Osmart cards
método e etc. Ela
invocado no possui umapode
recebedor API bastante
também completa para o desenvolvimento
enviar informações de volta ao de aplicações de dispositivos
móveis.chamador
objeto A tecnologia J2MEde
através nãoum está no escopo
valor desteOcurso.
de retorno. método chamado deve ser
um que esteja definido pelo objeto.

SejaTodos os direitos reservados


um Profissional Aprendendoa 3Way
comNetworks
Profissionais 6
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br 712
www.3way.com.br
Linguagem
Linguagemde
deProgramação
ProgramaçãoJava
Java

1.1.4 Java Card


Java Card é umavalor
//atribuindo tecnologia que permite
a variável pequenos aplicativos (applets)
referência
baseadosCarro
em plataforma
carro1 Java
= newsejam executados com segurança em smart cards e
Carro();
Não se preocupe com o
dispositivos similares com=limitações
carro1.ano "2001";de processamento e armazenamento, como
carro1.modelo= "fusca";
o Java Ring. É muito utilizado em cartões SIM (usados em celulares GSM) e em quanto tempo, mas com o
carro1.cor
caixas eletrônicos.
= "prata"; que devo aprender para
Os produtos Java Card são baseados nas especificações da plataforma programar em Java.
Java Card desenvolvida pela Sun Microsystems, e suas principais características Mais importante que
são portabilidade e segurança. aprender a linguagem
Java é aprender a
1.2 Quanto tempo é necessário para aprender Java? programar no paradigma
Podemos dizer que muito tempo, basicamente o que será apresentado de orientação a objetos.
neste material. Como já dissemos e você vai perceber, Java é muito mais que uma
linguagem de programação, é um conjunto de ferramentas e bibliotecas de apoio
ao desenvolvimento de sistemas em diversas áreas de tecnologia de software.
Porém, mais importante que aprender a linguagem é aprender a programar no
paradigma de orientação a objetos. Figura 2.4 – Layout Memória após inicialização

O texto abaixo
//criando novoé uma
aliastradução do artigo de autoria de Peter Norvig
Carro carro2 = carro1;
(http://norvig.com/21-days.html, para ver original ou busque na internet "Aprenda
a programar em dez anos"), os conselhos apresentados servem para todos os que
desejam ou necessitam aprender programar.

Abaixo está a receita de Peter Norvig para sucesso na programação:

 Aprenda inglês. Leia o texto original. Essa tradução só está aqui para exercitar o meu inglês, não o seu.
(Nota do tradutor)
 Se interesse por programação e programe porque você acha legal. Tenha certeza que isso continue a
ser legal para você dedicar dez anos nisso.
 Converse com outros programadores; leia outros programas. Isso é mais importante do que qualquer
livro ou curso de treinamento.
 Programe. O melhor tipo de aprendizado é aprender fazendo. Colocando de uma forma mais técnica,
"o nível máximo de performance individual em um domínio não é alcançado automaticamente em
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
função de uma experiência estendida, mas sim aumentado, mesmo por indivíduos extremamente
experientes, por um esforço deliberativo de melhorar." (p. 366) e "o aprendizado mais efetivo requer
uma tarefa bem definida com uma dificuldade apropriada para o indivíduo em particular, dado que
2.3 Membros de Instância
exista um retorno sobre a experiência e oportunidades de repetição e correções de erros." (p. 20-21)
Cada objeto criado deverá ter sua própria instância de variáveis
do livro Cognition in Practice: Mind, Mathematics, and Culture in Everyday Os valores
Life, das variáveis
que é uma referência
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
interessante deste ponto de vista.
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
 Se você quiser, gaste quatro anos em uma universidade (ou mais em uma pós-graduação). Isso lhe dará
classe. Porém não devemos confundir isto com a implementação do método, que
acesso a alguns empregos que requerem alguma formação e um grande entendimento Dois objetos distintos
do campotêm de
é compartilhada por todas as instâncias da classe.
trabalho, mas se você não gosta muito de ir para escola, você pode (com alguma o mesmo estadoconseguir
dedicação) se suas
alguma experiência similar sobre esse tipo de trabalho. Em qualquer caso,variáveis apenas ler livros não
membro têmserá
os
2.3.1 Invocação de Métodos
suficiente. "Educação em ciências da computação não faz de ninguém um gênio em programação
mesmos valores.
Objetos se comunicam pela troca de mensagens, isto significa que um
tanto quanto estudar pincéis e pigmentos não fazem um bom pintor." diz Eric Raymond, autor de
objeto pode ter que mostrar um comportamento particular invocando uma
The New Hacker’s Dictionary. Um dos melhores programadores que eu já contratei tinha apenas o
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
segundo grau, e ele produziu vários softwares incríveis, tem seu próprio grupo de discussão, e fez
chamada de um método em um objeto usando o operador binário "." (ponto),
dinheiro suficiente em ações para comprar seu próprio clube noturno.
devendo especificar a mensagem completa: o objeto que é o recebedor da
 Trabalhe em projetos com outros programadores. Seja o melhor programador em alguns projetos, seja
mensagem, o método a ser invocado e os argumentos para o método (se houver).
o pior em outros. Quando você é o melhor você testa suas habilidades para liderar um projeto e para
O método invocado no outros
inspirar os recebedor
com pode
a sua também enviar você
visão. Quando informações
for o pior deaprenderá
volta ao o que os mestres ensinam e o
objeto chamador através de um valor de retorno. O método chamado
que eles não gostam de fazer (porque eles fazem você fazer por eles). deve ser
um que esteja definido pelo objeto.
 Trabalhe em projetos após outros programadores. Esteja envolvido em entender um programa escrito

Todos
Seja um os direitos reservados
Profissional Aprendendoa 3Way
comNetworks
Profissionais 7
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br 812
www.3way.com.br
Linguagem de Programação Java

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.

Todos os direitos reservados a 3Way Networks


Seja um Profissional Aprendendo com Profissionais 912
www.3way.com.br
Linguagem
Linguagemde
deProgramação
ProgramaçãoJava
Java

por outro. Veja o que é preciso para entender e consertar quando o programador original não está por
perto. Pense valor
//atribuindo em comoa desenvolver
variável seus programas para que seja fácil mantê-los, se não for você.
referência
 Aprenda
Carro carro1 pelo
= menos meia dúzia de linguagens de programação. Inclua na lista uma linguagem
new Carro();
carro1.ano = "2001";
orientada a objetos (como Java ou C++), uma que seja de abstração funcional (como Lisp ou ML),
carro1.modelo= "fusca";
uma que suporte abstração sintática (como Lisp), uma que suporte especificação declarativa (como
carro1.cor = "prata";
Prolog ou C++ com templates), uma que suporte co-rotinas (como Icon ou Scheme), e uma que
suporte paralelismo (como Sisal).
 Lembre-se que há um "computador" em "ciência da computação". Saiba quanto tempo leva para o seu
computador computar uma instrução, carregar uma palavra até a memória (com e sem cache), ler
palavras consecutivas do disco rígido, procurar por uma nova posição no disco.
 Se envolva no esforço de padronização de uma linguagem. Pode ser o comité ANSI C++, ou na
padronização de programação na sua empresa, se utilizaram edentação com 2 ou 4 espaços. Em
qualquer caso, você aprende o que outras pessoas gostam em uma linguagem, o quanto elas gostam e
talvez um pouco do porque elas gostam.
 Tenha o bom senso de cair fora desse processo de padronização tão rápido quanto possível.

1.3 O curso Figura 2.4 – Layout Memória após inicialização

Este curso énovo


//criando abordado de forma bastante prática, ou seja, construindo programas com a linguagem de
alias
Carro carro2 = carro1;
programação o máximo possível durante o treinamento.
Você tem um material com a teoria necessária e um conjunto de atividades práticas, denominadas
laboratórios. Todo o conteúdo corresponde ao que já definimos como JSE.
O material não é e não deve ser adotado como sua única referência para estudos da linguagem, a
aquisição de livros ou leitura do tutorial oficial da Sun é recomendado.
Seu material está ordenado numa seqüência didática que consideramos a mais adequada para o seu
aprendizado. A cada exemplo ou exercício apresentado em um capítulo tentamos não utilizar recursos da
linguagem que ainda não tenham sido apresentados no capítulo corrente ou anterior. No entanto, sempre que
possível nós introduzimos vários destes recursos em exemplos de códigos com o objetivo de apresentá-lo
deliberadamente para você ou simplesmente para simplificar o código exemplo. Assim vamos apresentado algumas
bibliotecas da linguagem, sem entrar em detalhes, para que você vá se familiarizando com uso das mesmas.

1.3.1 Convenções de Código


Os códigos e exemplos apresentados neste material seguem as convenções de código-fonte Java, sempre
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
que possível, mas podem sofrer adaptações para melhorar a impressão.
Você deve se familiarizar com essa convenção veja em
http://www.oracle.com/technetwork/java/codeconv-138413.html
2.3 Membros de Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
1.3.2 Sobre os exercícios
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
No curso Java e Orientação a Objetos, é recomendado estudar em casa aquilo que foi visto durante a aula,
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
fazendo os exercícios que não foram feitos ou refazendo os que já foram feitos em sala.
classe. Porém não devemos confundir isto com a implementação do método, que
Os laboratórios deverão ser resolvidos durante o treinamento com objetivo de Dois objetosa distintos
exercitar linguagemtêmde
é compartilhada por todas as instâncias da classe.
programação e não a sua capacidade de programar. Contudo eles apresentam uma pequena o mesmo estado que
aplicação se suas
será
completada ao final de todos os laboratórios. variáveis membro têm os
2.3.1 Invocação de Métodos
Durante a execução de um laboratório o mesmo pode necessitar de listagem demesmos códigos que já foram
valores.
Objetos se comunicam pela troca de mensagens, isto significa que um
construídos nos laboratórios anteriores, portanto não deixe de fazer o exercício do laboratório, especialmente as
objeto que
tarefas podeforem
ter que mostrar
indicadas paraum
vocêcomportamento particular
fazer. Os laboratórios invocando
possuem uma estimada e o instrutor deverá
uma duração
operação apropriada que foi definida no objeto. Em Java, isto é
segui-la a fim de concluir os laboratórios com sucesso. Não atrase o andamentofeito pela do curso, se sentir dificuldade
chamada de um
chame o instrutor. método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,
1.4 Fazer o método a ser invocado
Laboratório 0 e os argumentos para o método (se houver).
O método Siga instruções do Laboratório 0também
invocado no recebedor pode enviar informações
e tome cuidado com o tempo dedevolta ao
execução, sempre recorra ao instrutor
objeto chamador através de um valor de retorno.
em caso de dúvida, nunca deixe uma dúvida sem reposta. O método chamado deve ser
um que esteja definido pelo objeto.

Seja Todos os direitos reservados


um Profissional Aprendendoa 3Way
comNetworks
Profissionais 8
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br 12
10
www.3way.com.br
Linguagem
Linguagem de
deProgramação
ProgramaçãoJava
Java

2 Bases da Programação em Java


//atribuindo valor nossa
Antes de começarmos a variável
jornada referência
no mundo da programação em
Carro carro1 = new Carro();
Java, é importante compreendermos a terminologia básica e os conceitos em
carro1.ano = "2001"; A essência da
programação orientada a objetos.
carro1.modelo= Neste capítulo veremos os princípios básicos
"fusca";
da programação em Java= sem aprofundamento dos temas, que serão revistos Programação Orientada a
carro1.cor "prata";
com maior profundidade nos capítulos subseqüentes. Objetos (POO) consiste
em modelar as abstrações
2.1 Classes usando Classes e Objetos.
Abstrações são o fundamento utilizado por nós, seres humanos, a fim de
lidar com a complexidade. Uma abstração demonstra o comportamento e
propriedades essenciais de um objeto, que o diferencia de outro objeto qualquer.
Por exemplo, ao utilizar um carro, você não pensa nele como um conjunto de
dezenas de milhares de peças individuais. Pensamos em um carro como um único
objeto sobre qual podemos realizar um determinado conjunto de operações. Essa
abstração permite que as pessoas utilizem um carro sem nenhum conhecimento
sobre mecânica de automóveis. Podemos ignorar os detalhes do motor como:
Figura 2.4 – Layout Memória após inicialização
sistema de injeção de combustíveis, transmissão, sistema de freios funcionam
//criando
individualmente novo
ou em aliasAo invés disso, utilizamos o objeto automóvel como um elemento único.
conjunto.
Carro carro2 = carro1;
A essência da Programação Orientada a Objetos (POO) consiste modelar
as abstrações usando Classes e Objetos. A parte difícil deste trabalho é encontrar a
Um Objeto é qualquer abstração mais correta. Uma Classe modela uma abstração pela definição das
coisa criada a partir dessa propriedades e comportamentos dos objetos representados pela abstração. Uma
Classe, então, especifica a categoria dos Objetos e funciona como uma "planta
Classe, algo contendo as
baixa" na criação desses objetos. Um Objeto é qualquer coisa criada a partir dessa
propriedades e
Classe, algo contendo as propriedades e comportamentos definidos na Classe.
comportamentos Voltando ao exemplo do carro, um grupo de engenheiros mecânicos criam o
definidos na Classe. projeto de um carro (a Classe) e a partir deste projeto são reproduzidos milhares
de automóveis (os Objetos), praticamente idênticos entre si.
Propriedades de um Objeto da Classe são chamados de atributos e são
definidos usando variáveis em Java, também denominado Campos da Classe. O
comportamento de um Objeto, também conhecido por operações, são definidos
Figura 2.5 – Layoutmétodos
usando-se Memória duasemvariáveis
Java. referência
Variáveis parae ométodos utilizados na definição da classe
mesmo objeto
são, juntos, denominados de Membros da Classe.
Usando notação de Classe da UML (Unified Modeling Language),
2.3 Membros de Instância podemos descrever graficamente o exemplo de uma classe Carro, ver Figura 2.1.
Ambos ter
Cada objeto criado deverá atributos (variáveis)
sua própria e métodos
instância são mostrados na forma expandida na
de variáveis Os valores das variáveis
Figura 2.1.
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
Figura 2.1 Notação UML para Classe
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.

Seja Todos
um Profissional Aprendendo
os direitos reservados comNetworks
a 3Way Profissionais 9
www.3way.com.br 12
Seja um Profissional Aprendendo com Profissionais 11
www.3way.com.br
Linguagem
Linguagem de
de Programação
Programação Java
Java

2.1.1 Declarando Membros: Variáveis e Métodos


Na Listagem 2.1valor
//atribuindo mostraa avariável
implementação em Java da definição da classe mostrada na Figura 2.1. O
referência
exemplo, apesarcarro1
Carro de não se
= preocupar com a utilidade desta implementação, mostra as principais características da
new Carro();
definição de uma classe em
carro1.ano Java.
= "2001";
carro1.modelo= "fusca";
carro1.cor
public class =Carro
"prata";
{ // nome da classe

// Variaveis
private String cor;
private String ano;
private String modelo;
private String nome;

// Constructor
public Carro() {
modelo = "2000";
}
// Métodos
public String acelerar()
Figura 2.4 – {
Layout Memória após inicialização
return "acelerando !";
//criando
} novo alias
Carro carro2
public =String
carro1;
frear() {
return "freando !";
}
public String abrirPorta() {
return "abre porta !";
}
}
Listagem 2.1 – Elementos Básicos da Definição de uma Classe

A classe possui quatro variáveis, toda variável em Java deve ter um tipo, neste caso todas são do tipo String
(linhas 4 a 7), possui três métodos (linhas 13 a 15) representado as operações disponíveis aos objetos da classe e
um método especial (linha 10) com o mesmo nome da classe, este método é denominado construtor e seu
propósito é inicializar o objeto quando este é criado a partir da classe.
String é uma classe em Java, ela armazena um conjunto de caracteres.
Figura
Como2.5 – Layout Memória
estamos duas variáveis referência
aprendendo o que éparauma
o mesmo objetodetalharemos a classe String
classe,
Um Objeto é instância de posteriormente.
uma Classe.
2.3 Membros de Instância2.2 Objetos
Cada objeto criado deverá ter Umsua própria
objeto é umainstância
instância de variáveis
de uma classe. EleOs valores dasusando-se
é construído variáveisa
(atributos) definidas pela classe.classe,
Os métodos definem o comportamento
da mesma maneira que usamos uma "planta emde um um para
baixa" objeto constituem
construir uma
objeto. Isto é importante, pois denota
casa, éque
umaum métodoreal
entidade pertence a cadaque
da abstração objeto da representa;
a classe usando
o seu o exemplo
estado.
classe. Porém não devemos confundir isto com
do carro, uma ainstância
implementação do método,
representa que criado a partir do projeto dos
um veículo Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
engenheiros mecânicos. Um objeto deve ser explicitamente criadoestado
a partirse
desuas
uma
o mesmo
classe antes que possa ser utilizado em um
2.3.1 Invocação de Métodos programa. variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos da
O propósito valores.
chamada
objeto
2.2.1 pode ter de
Instância que mostrar um comportamento particular invocando uma
Classes ao construtor é inicializar
operação Em apropriada que são
Java, objetos foi manipulados
definida no através
objeto. de
Emreferências
Java, istodeé objetos
feito pela
(ou o objeto que está sendo
chamada de um método em um objeto usando o operador
simplesmente referência). O processo de criação de um objeto normalmentebinário "." (ponto), criado.
devendo
envolve osespecificar a mensagem completa: o objeto que é o recebedor da
seguintes passos:
mensagem, o métododea ser
Declaração umainvocado
variávele de
os argumentos paracorresponde
referência: isto o método (sea houver).
declarar
O método umainvocado
variávelnoderecebedor
uma classepode também para
apropriada enviararmazenar
informações de volta ao
a referência ao
objeto chamador através
objeto criado. de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.

SejaTodos
um Profissional Aprendendo
os direitos reservados com
a 3Way Profissionais
Networks 10
www.3way.com.br 12
Seja um Profissional Aprendendo com Profissionais 12
www.3way.com.br
Linguagem de Programação Java

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.

Todos os direitos reservados a 3Way Networks


Seja um Profissional Aprendendo com Profissionais 12
13
www.3way.com.br
Linguagem
Linguagem de
de Programação
Programação Java
Java

//declaracao de duas variaveis referência que denota dois


//objetos distintos, nomeando dois objetos carro respectivamente
//atribuindo valor a variável referência
Carro
Carro carro1,
carro1 =carro2;
new Carro();
carro1.ano = "2001";
Criação do Objeto:"fusca";
carro1.modelo= para criar o objeto fazemos uso do operador new, juntamente com a chamada do
construtor da classe, assim criamos uma instância da classe.
carro1.cor = "prata";

//criacao de dois Objetos distintos


carro1 = new Carro();
carro2 = new Carro();

O operador new retorna a referência da nova instância de uma classe Carro. Esta referência pode ser
atribuída a uma variável de referência da classe apropriada. Cada objeto tem uma identidade única e sua própria
cópia das variáveis (atributos) declarados na definição da classe, ou seja, os dois objetos carro, referenciados por
carro1 e carro2 têm sua própria cópia das variáveis: cor, ano, modelo, nome.
A declaração e instanciação também podem ser combinadas:

Figura 2.4 – Layout Memória após inicialização


Carro carro1 = new Carro(),
carro2 = new
//criando Carro();
novo alias
Carro carro2 = carro1;

Figura 2.2 – Instâncias da Classe em UML

A Figura 2.2 mostra a notação UML para classe e objetos. A representação gráfica de um objeto é muito
parecida com a de um classe. Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.2.2 Referência de Objetos


Com já foi observado,
2.3 Membros de Instância uma referência nos permite manipular objetos que foram criados e armazenados na
memória Cada
do computador. Em Java,
objeto criado deverá objetos
tersósua
podem ser utilizados
própria instânciaa partir de uma referência que está armazenada
de variáveis Os valores das variáveis
em uma variável.
(atributos) Um
definidas objeto
pela pode
classe. ter váriasdefinem
Os métodos referências, também chamadas
o comportamento de um de aliases. O objeto pode ser
em um objeto constituem
manipulado por qualquer um desses aliases.
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
//declaracao Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
Carro carro1; o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto. Figura 2.3 – Layout Memória após declaração

Todos os direitos reservados a 3Way Networks


Seja
Seja um
um Profissional
Profissional Aprendendo
Aprendendo com
com Profissionais 11
12
www.3way.com.br
Profissionais 14
www.3way.com.br
Linguagem
Linguagem de
de Programação Java
Programação Java

//atribuindo
//atribuindo valor
valor a
a variável
variável referência
referência
Carro
Carro carro1
carro1 = new Carro();
= new Carro();
carro1.ano
carro1.ano =
= "2001";
"2001";
carro1.modelo=
carro1.modelo= "fusca";
"fusca";
carro1.cor
carro1.cor =
= "prata";
"prata";

Figura
Figura 2.4
2.4 –– Layout
Layout Memória
Memória após
após inicialização
inicialização
//criando
//criando novo
novo alias
alias
Carro
Carro carro2
carro2 =
= carro1;
carro1;

Figura
Figura 2.5
2.5 –– Layout
Layout Memória
Memória duas
duas variáveis
variáveis referência
referência para
para o
o mesmo
mesmo objeto
objeto

2.3
2.3 Membros de
Membros de Instância
Instância
Cada
Cada objeto
objeto criado
criado deverá
deverá ter
ter sua
sua própria
própria instância
instância de
de variáveis
variáveis Os
Os valores
valores das
das variáveis
variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento
(atributos) definidas pela classe. Os métodos definem o comportamento de de um
um em um objeto constituem
em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o
objeto. Isto é importante, pois denota que um método pertence a cada objeto da
classe. Porém
Porém nãonão devemos
devemos confundir
confundir isto
isto com
com aa implementação
implementação do do método,
método, que
que o seu
seu estado.
estado.
classe. Dois objetos distintos têm
têm
éé compartilhada
compartilhada porpor todas
todas as
as instâncias
instâncias da
da classe.
classe. Dois objetos distintos
o
o mesmo
mesmo estado
estado se
se suas
suas
2.3.1 Invocação
Invocação dede Métodos
Métodos variáveis
variáveis membro têm os
membro têm os
2.3.1
Objetos sese comunicam
comunicam pelapela troca
troca de
de mensagens,
mensagens, isto
isto significa
significa que
que umum mesmos valores.
mesmos valores.
Objetos
objeto pode ter que mostrar um comportamento particular
objeto pode ter que mostrar um comportamento particular invocando uma invocando uma
operação apropriada
operação apropriada queque foi
foi definida
definida no
no objeto.
objeto. Em
Em Java,
Java, isto
isto éé feito
feito pela
pela
chamada de um método em um objeto usando o operador binário
chamada de um método em um objeto usando o operador binário "." (ponto), "." (ponto),
devendo especificar
devendo especificar aa mensagem
mensagem completa:
completa: oo objeto
objeto que
que éé o o recebedor
recebedor da da
mensagem, o método a ser invocado e os argumentos para o método
mensagem, o método a ser invocado e os argumentos para o método (se houver).(se houver).
O método
O método invocado
invocado no no recebedor
recebedor pode
pode também
também enviar
enviar informações
informações de de volta
volta ao
ao
objeto chamador
objeto chamador através
através de
de um valor de
um valor de retorno.
retorno. O
O método
método chamado
chamado devedeve ser
ser
um que esteja definido pelo objeto.
um que esteja definido pelo objeto.

Todos os direitos reservados a 3Way Networks


Seja
Seja um
um Profissional
Profissional Aprendendo
Aprendendo com
com Profissionais 12
12
www.3way.com.br
Profissionais 15
www.3way.com.br
Linguagem
Linguagem de
de Programação
Programação Java
Java

//declaracao
Carro carro = new Carro();
//atribuindo valor a variável referência Em Java a chamada
Carro carro1 = new Carro();
//invocando método
carro1.ano = "2001"; de um método é feito
String retorno=carro.acelerar(); usando o operador
carro1.modelo= "fusca";
carro1.cor = "prata";
//A sentença a baixo causa erro compilação, binário "." (ponto).
//método não está definido no obejeto invocador
carro.print();

2.3.1.1 Chamando Métodos de Objeto


Para ilustrar como chamar os métodos, utilizaremos como exemplo a classe
String. Pode-se usar a documentação da API Java para conhecer todos os atributos e
métodos disponíveis na classe String. Posteriormente, iremos criar nossos próprios
métodos.
Para chamar um método a partir de um objeto, escrevemos o seguinte:

nomeDoObjeto.nomeDoMétodo([argumentos]);
Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Vamos pegar dois métodos encontrados na classe String como exemplo:
Carro carro2 = carro1;

Declaração do método Definição


Retorna o caractere especificado no índice. Um
índice vai de 0 até length() - 1. O primeiro
public char charAt(int index) caractere da seqüência está no índice 0, o seguinte,
no índice 1, e assim sucessivamente por todo o
array.
Compara o conteúdo de duas Strings, ignorando
maiúsculas e minúsculas. Duas strings são
public boolean equalsIgnoreCase (String outraString) consideradas iguais quando elas têm o mesmo
tamanho e os caracteres das duas strings são iguais,
sem considerar caixa alta ou baixa.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Tabela 4: Exemplos de Métodos da classe String

Usando os métodos:
2.3 Membros de Instância
Stringcriado
Cada objeto str1 deverá
= "Hello";
ter sua própria instância de variáveis
char x = str1.charAt(0); Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um
// retornará o caracter H e o armazenará no atributo xem um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos
String confundir
str2 isto com a implementação do método, que
= "hello";
Dois objetos distintos têm
é compartilhada// poraqui
todas será retornado
as instâncias o valor booleano true
da classe.
boolean result = str1.equalsIgnoreCase(str2); Há duas formas
o mesmo estadopara se
se suas
enviar argumentos
variáveis paraos
membro têm
2.3.1 Invocação de Métodos
2.3.2 Envio de Argumentos
Objetos para
se comunicam Métodos
pela troca de mensagens, isto significa que um um método,
mesmos valores. é
o primeiro
Em exemplos
objeto pode anteriores,
ter que mostrar enviamos atributos
um comportamento para invocando
particular os métodos.
uma envio por valor e o
operação apropriada que foi definida no objeto. Em Java, isto de
Entretanto, não fizemos nenhuma distinção entre os diferentes tipos é atributos
feito pela segundo é envio por
que podem
chamada deser
umenviados
métodocomo argumento
em um para os ométodos.
objeto usando operador binário "." (ponto), referência.
devendo especificar a mensagem completa: o objeto que é o recebedor da
2.3.2.1 Passagem
mensagem, o métododeaParâmetros
ser invocadopor valor
e os argumentos para o método (se houver).
O método invocado no recebedor pode por
Quando ocorre uma passagem valor,enviar
também a chamada do método
informações ao cópia do valor do atributo e o
faz uma
de volta
envia como argumento. O método chamado não modifica o valor original
objeto chamador através de um valor de retorno. O método chamado deve ser do argumento mesmo que estes valores
sejam modificados durante operações
um que esteja definido pelo objeto. de cálculo implementadas pelo método.
Por exemplo:
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 13
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br
12
16
www.3way.com.br
Linguagem de Programação Java

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.

Todos os direitos reservados a 3Way Networks


Seja um Profissional Aprendendo com Profissionais 12
17
www.3way.com.br
Linguagem de
Linguagem de Programação
Programação Java
Java

PassagemPorValor
public classvalor
//atribuindo {
a variável referência
Carro carro1 = new Carro();
public =
carro1.ano static void main(String[] args) {
"2001";
int i = 10;
carro1.modelo= "fusca";
carro1.cor //= exibe o valor de i
"prata";
System.out.println(i);
// chama o método teste
// envia i para o método teste
teste(i);---------------------------------------+
// exibe o valor de i não modificado |
+---------->System.out.println(i); |
| } |
| public static void teste(int j) { <------------------+
| // muda o valor do argumento
+---------j = 33;
}
}
FiguraListagem 2.2 –Memória
2.4 – Layout Passagem porinicialização
após valor

//criando novo alias


No exemplo
Carro dado,
carro2 método teste() foi chamado e o valor de i foi enviado como argumento. O valor de i é
= ocarro1;
copiado para o atributo j do método. Já que j é o atributo modificado no método teste(), não afetará o valor do
atributo i, o que significa uma cópia diferente do atributo.
Como padrão, todo tipo primitivo, quando enviado para um método, utiliza a forma de envio por valor.

2.3.2.2 Passagem de Parâmetros por referência


Quando ocorre um envio por referência, a referência de um objeto é enviada para o método chamado. Isto
significa que o método faz uma cópia da referência do objeto enviado. Entretanto, diferentemente do que ocorre
no envio por valor, o método pode modificar o objeto para o qual a referência está apontando. Mesmo que
diferentes referências sejam usadas nos métodos, a localização do dado para o qual ela aponta é a mesma. Veja
próximo exemplo, Listagem 2.3:

public class PassagemPorReferencia {

public static Figuravoid


2.5 – Layout Memória duas variáveis
main(String[] referência
args) { para o mesmo objeto
// criar um array de inteiros
int[] idades = { 10, 11, 12 };
2.3 Membros de // exibir os valores do array
Instância
for (int i = 0; i < idades.length; i++) {
Cada objeto criado deverá ter sua própria instância de variáveis
System.out.println(idades[i]); Os valores das variáveis
(atributos) definidas pela} classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante,//pois denotao que
chamar um método
método testepertence
e enviar a cadaa objeto da
o seu estado.
classe. Porém não devemos // referência
confundir isto paracom a oimplementação
array do método, que
+----------teste(idades); Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
| // exibir os valores do array o mesmo estado se suas
| for (int i = 0; i < idades.length; i++) {
2.3.1 Invocação de Métodos variáveis membro têm os
| System.out.println(idades[i]);<----------------------+
Objetos
| se comunicam}pela troca de mensagens, isto significa que um mesmos
| valores.
| }
objeto pode ter que mostrar um comportamento particular invocando uma |
+---->public static void teste(int[] arr) { |
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
// mudar os valores do array |
chamada de um método for um objeto
em(int i = 0; usando
i < oarr.length;
operador binário i++) "." {(ponto), |
devendo especificar a mensagem arr[i]completa:
= i +o 50;-------------------------------+
objeto que é o recebedor da
mensagem, o método a }ser invocado e os argumentos para o método (se houver).
O método invocado} no recebedor pode também enviar informações de volta ao
}
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto. Listagem 2.3 – Passagem por "referência"

Todos os direitos reservados a 3Way Networks


Seja um Profissional Aprendendo com Profissionais 14
12
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br 18
www.3way.com.br
Linguagem
Linguagem de
de Programação
Programação Java
Java

A Figura 2.3 ilustra o resultado da execução do código na Listagem 2.3:


//atribuindo valor a variável referência
Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 2.6 - Exemplo de Envio por referência

2.4 Membros Estáticos


Há casos em que você precisará que alguns atributos sejam compartilhados por todos os objetos de uma
classe em particular, ou seja, esses atributos devem pertencer somente à Classe e não aos objetos criados a partir
dessa classe. Por exemplo, imagine que você queira manter um controle de quantos objetos de uma classe foram
criados e permitir que cada objetos consiga recuperar esta informação. Definir um contador como uma variável de
instância na definição da classe não resolveria o problema, pois já sabemos que são criadas cópias desta variável
para cada objeto criado a partir da definição de uma classe. Então como resolver o problema? A solução é usar
variáveis estáticas - usar a palavra chave static antes da declaração da variável. Uma variável estática é inicializada
quando a classe é carregada em tempo de execução. De forma similar, os métodos também podem ser estáticos.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto
Figura usando
2.7 – Diagrama o mostrando
Classe operadordefinição
binário "." (ponto),
de membros estáticos
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
A Figura 2.7 mostra a redefinição da classe Carro que foi acrescentado dois membros estáticos, ou
O método invocado no recebedor pode também enviar informações de volta ao
membros da classe, marcado sublinhado abaixo do nome, conforme notação definida na UML. Em sua
objeto chamador através de um valor de retorno. O método chamado deve ser
implementação usamos a palavra reservada static como mostrado na Listagem 2.4 abaixo:
um que esteja definido pelo objeto.

Seja Todos os direitos reservados a 3Way Networks


um Profissional Aprendendo com Profissionais 15
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br 12
19
www.3way.com.br
Linguagem
Linguagemde
deProgramação
ProgramaçãoJava
Java

public class Carro {


// Variáveis de Instância
//atribuindo valor a variável referência
String modelo;
Carro carro1 = new Carro();
String cor;
carro1.ano = "2001";
String ano;
carro1.modelo= "fusca";
// declaração variável estática
carro1.cor = "prata";
static int contador; // 1

// construtor modificado para incrementar o contador


// para cada objeto criado
public Carro() { // 2
contador = contador + 1;
}
Temos acesso aos
// Métodos de Instância membros estáticos de
public String acelerar() {
return "acelerando !"; uma classe usando
} diretamente o nome da
classe seguido do
public String frear()
Figura{2.4 – Layout Memória após inicialização
return "freando !";
operador ponto (.), não
//criando
} novo alias precisamos de uma
Carro carro2 = carro1;
instância.
public String abrirPorta() {
return "abre porta !";
}

// Método Estático //3


static int getContadorInstancia() {
return contador;
}
}
Listagem 2.4 – Exemplo de membros de classe

A variável estática contador é declarada em (1, linha 7), ela será alocada e inicializada por padrão com o
valor 0 (zero) quando a classe for carregada. Toda vez que um objeto Carro for criado o construtor da classe em (2,
linha 10) será executado. Figura O construtor incrementa
2.5 – Layout Memória explicitamente
duas variáveis o contador
referência para o mesmo objeto da classe. O método
getContadorInstancia() em (3, linha 18) é estático e é um método da classe, ele retorna o valor do contador quando
for invocado.
O código seguinte
2.3 Membros invoca o método getContadorInstancia() da classe Carro:
de Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
//Nome da classe invoca método estatico
(atributos) definidas pela classe. Os métodos definem
int retorno = Carro.getContadorInstancia(); o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que da classe:
Membros estáticos também podem ser acessados via referência para objetos Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
//Referencia de objeto invoca método estatico
2.3.1 Invocação
Carro de Métodos
carro1 = new Carro(); variáveis membro têm os
int retorno = carro1.getContadorInstancia();
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operaçãoNote que membros
apropriada que foide classe podem
definida no ser acessados
objeto. tantoisto
Em Java, peloénome
feitodapela
classe quanto pela referência de
objetos da classe, porém membros de instância só são acessíveis
chamada de um método em um objeto usando o operador binário "." (ponto),via referência de objetos da classe.
devendo especificar a mensagem completa: o objeto que é o recebedor da
2.5 Herança
mensagem, - Relacionamentos
o método a ser invocado e osdo tipo "é-um"
argumentos para o método (se houver).
O método Você dispõem
invocado no de dois mecanismos
recebedor pode também fundamentais afim de se de
enviar informações construir
volta aonovas classes a partir de classes
existentes: herançaatravés
objeto chamador e agregação.
de umFaz todo
valor desentido
retorno.construir nossa
O método classe Carro
chamado deveherdando
ser todas as características de
uma classe Veículo que já exista,
um que esteja definido pelo objeto. uma vez que um Carro é um Veículo. Mas um Veículo é constituído de diversas

Seja um Profissional
Todos Aprendendo
os direitos reservados comNetworks
a 3Way Profissionais 16
www.3way.com.br 12
Seja um Profissional Aprendendo com Profissionais 20
www.3way.com.br
Linguagem de Programação Java

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.

Todos os direitos reservados a 3Way Networks


Seja um Profissional Aprendendo com Profissionais 12
21
www.3way.com.br
Linguagem
Linguagem de
de Programação
Programação Java
Java

partes, então poderíamos construir nossa classe Veículo pela agregação de outros objetos que constituem um
veículo, //atribuindo
assim podemos dizer queaumvariável
valor Veículo tem um Motor, tem um Chassi e tem uma Carroceria.
referência
A Figura
Carro 2.7 mostra
carro1 a relação
= new entre as classes Veículo e Carro, ela mostra que um Carro É-UM Veículo, a
Carro();
carro1.ano
classe Veículo = "2001";
é denominada Superclasse enquanto a classe Carro é chamada de Subclasse. A classe Veículo é uma
carro1.modelo= "fusca";
generalização para todo Carro (neste caso veículos motorizados), enquanto a classe Carro representa a
carro1.cor = "prata";
especialização da classe Veículo, ou seja um tipo particular de veículo.

Figura 2.8 – Diagrama de Classe descrevendo a relação de Herança

Figura 2.4 – Layout Memória após inicialização


Em Java, essa relação é representada pela palavra-chave extends. Uma subclasse só pode estender
(herdar)//criando
somente uma novo alias
única superclasse. A listagem 2.4 de código demonstra o uso de extends para criar a
Carro carro2 = carro1;
subclasse Carro a partir da superclasse Veículo.

class Veiculo { // nome da classe

// (1)Variaveis
private String cor;
private String ano;
private String modelo;
private String nome;

// (2) Constructor
public Veiculo() { modelo="2000" };

// (3) Métodos
public String acelerar() { return "acelerando !"; }
public String
Figurafrear() { return
2.5 – Layout Memória "freando
duas variáveis !";
referência para } objeto
o mesmo
public String abrirPorta() { return "abre porta !"; }
}

2.3 Membros
class de Instância
Carro extends Veiculo {
// declaração
Cada objeto criado deverá de Variáveis e Métodos
ter sua própria da nova
instância classe
de variáveis Os valores das variáveis
}
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que umListagem
método
2.5 –pertence a cada objeto da
Exemplo Herança
o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todasmuito
Não se preocupe as instâncias da classe.em compreender qual relação deverá ser utilizada para criar suas
neste momento o mesmo estado se suas
classes, foque na terminologia e nas palavras-chave que estão sendo apresentadas. variáveis membro têm os
2.3.1 Invocação de Métodos
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
2.6 Agregação - Relacionamentos do tipo "tem-um"
objeto pode ter que
Você pode mostrar
construir umclasses
novas comportamento particular
de objetos por invocando
agregação umajá existentes, o objeto agregado é
de objetos
operação apropriada que
constituído de outros objetos.foi definida no objeto. Em Java, isto é feito pela
chamadaJava
de um método em um objeto usando o operador binário "." (ponto),
implementa o conceito de agregação de objetos pelo uso da referência. Objetos em Java não podem
devendo
conter especificar
outros objetos aexplicitamente.
mensagem completa: o objetopoderão
Objetos somente que é conter
o recebedor
variáveisdade tipos primitivos e referências a
mensagem, o
outros objetos.método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de
Uma relação de agregação é demonstrada na Figura 2.8, este diagrama volta ao
UML informa que objetos da classe
objeto chamador através de um valor de retorno.
Veículo TEM-UM objeto da classe Motor associado a ela. O método chamado deve ser
um que esteja definido pelo objeto.

Todos os direitos reservados a 3Way Networks


Seja um Profissional Aprendendo com Profissionais 17
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br
12
22
www.3way.com.br
Linguagem
Linguagem de
de Programação
Programação Java
Java

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
Figura 2.9 – Diagrama de Classe descrevendo Agregação
carro1.modelo= "fusca";
carro1.cor = "prata";
A listagem mostra a implementação da relação TEM-UM mostrada na Figura 2.9.

class Veiculo // nome da classe


{
// Agregação
Motor motor1 = new Motor();
}

2.7 Princípios de Programação Com Java


 Tudo em Java deve ser colocado dentro de uma classe;
Figura 2.4 – Layout Memória após inicialização
 Há dois tipos de valores em Java: valores atômicos de tipos primitivos e valores de referência;
 //criando novo alias
Referências indicam objetos que são criados a partir de uma classe;
 Objetos só podem=ser
Carro carro2 carro1;
manipulados via referência;
 Objetos em Java não podem conter outros Objetos, ele somente tem referências para outros objetos;
 Remoção de objetos é gerida pelo sistema de tempo de execução (runtime). Este processo é conhecido
como Garbage Collection.
 Java faz distinção entre nomes em MAIÚSCULAS e minúsculas, ou seja, é CASE SENSITIVE.

2.8 Estrutura de Arquivos Fontes em Java


Em Java, um arquivo de código-fonte tem os elementos especificados na seguinte ordem:
 A definição opcional de package para especificar o nome do pacote da classe. As classes e interfaces
definidas em um arquivo fonte tornam-se parte deste pacote. Se omitida, as definições pertencem ao
pacote default. Veremos mais sobre pacotes posteriormente.
 Zero ou mais usos da sentença import. A sentença import será discutida em detalhes posteriormente.
 Qualquer número de definições de classes e interfaces. Tecnicamente um arquivo de código-fonte em
Java não precisaFigura
conter
2.5 –qualquer definição,
Layout Memória masreferência
duas variáveis ele seria
para oinútil.
mesmoExperimente
objeto compilar um arquivo
fonte sem nenhuma definição. As classes e interfaces podem ser definidas em qualquer ordem. O
compilador Java impõe a restrição de somente uma classe com modificador public por arquivo, sendo
2.3 Membros que sede esta existir o nome do arquivo de código-fonte deve ser nomeado obrigatoriamente com o
Instância
Cada objeto criadopública.
nome da classe deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
Vejaé Figura
objeto. Isto 2.10 na
importante, próxima
pois denotapágina,
que um demonstração
método pertence da estrutura
a cada de um arquivo
objeto da de código-fonte válido.
o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
// Nome do Arquivo: Aplicacao.java Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
//PARTE 1: (Opcional)
2.3.1 Invocação de Métodos
//Nome Pacote variáveis membro têm os
package com.nomeempresa.projeto.nomepacote;
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
//PARTE 2: (Zero ou Mais)
operação apropriada que foi
//Pacotes definida no objeto. Em Java, isto é feito pela
usados
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar
importa mensagem
java.util.*;completa: o objeto que é o recebedor da
import
mensagem, o método a serjavax.swing.JOptionPane;
invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
//PATE 3: (Zero ou Mais)
objeto chamador//através de um valor
Definições de retorno.
de classes O método chamado
e interfaces deve ser ordem)
(em qualquer
um que esteja definido pelo objeto.
public class Aplicacao {}
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 18
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br
12
23
www.3way.com.br
Linguagem de
Linguagem de Programação
Programação Java
Java

class C1{}
interface I1{}
//atribuindo valor a variável referência
Carro carro1
// ...= new Carro();
carro1.ano = "2001";
class Cn{}
carro1.modelo= "fusca";
interface In{}
carro1.cor = "prata";
//fim arquivo
Figura 2.10 – Estrutura do arquivo de código-fonte

2.9 O método main()


O interpretador Java executa uma chamada ao main() na classe especificada na linha de comando. Este é o
meio padrão pelo qual aplicações standalone são invocadas. O método main() tem a seguinte assinatura:

public static void main(String [] args)

O comando java AlgumaClasse, resulta em uma chamada para o método AlgumaClasse.main(). Assim
qualquer classe pode ter um método main() mas somente a classe especificada ao interpretador será executada.
Figura 2.4 – Layout Memória após inicialização

2.10 //criando
Fazer Laboratório 1
novo alias
Carro carro2 =docarro1;
Siga instruções Laboratório 1 e tome cuidado com o tempo de execução, sempre recorra ao instrutor
em caso de dúvida, nunca deixe uma dúvida sem reposta.

2.11 Exercícios
Escreva, compile e execute todas as listagens de código apresentadas neste capítulo.

3 Identificadores, Palavras-chave e Tipos


Assim como outras linguagens, a linguagem de programação Java é definida por uma regra gramatical, que
especifica como construções sintaticamente legais podem ser formadas usando os elementos da linguagem, e por
uma definição semântica que especifica o significado das construções sintaticamente corretas.

3.1 Comentários
Um programa deve ser documentado com comentários e notas em lugares relevantes. Comentários tem
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
como propósito a documentação, eles são ignorados pelo compilador.
Para fazer um comentário em Java, você pode usar o // para comentar
uma linha simples até o final, tudo após o // será ignorado pelo
2.3 Membros
Um programa deser
deve Instância compilador:
Cada objeto
documentado pelacriado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela
inserção de comentários. classe. Os métodos
//isto definem
comenta o comportamento
até o fim da de um
linha em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir istooucom então usar o /* */ do
a implementação para comentar
método, que
Dois objetos distintos
Comentários têm
Javadoc são
múltiplas
é compartilhada por todas as instâncias dalinhas,
classe.tudo o que estiver entre eles será
ignorado pelo compilador. o mesmo estado se
usados para gerar umasuas
2.3.1 Invocação de Métodos variáveis membroHTML
documentação têm os
Objetos se comunicam /* pela troca de mensagens, isto significa que um paramesmos valores. em
seus programas
Um comentário
objeto pode ter que mostrar umcom comportamento particular invocando uma Java.
varias linhas
operação apropriada que foi definida */ no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,Você o método
pode a criar
ser invocado e os argumentos
comentários para o métodocom
Javadoc começando-os (se houver).
/** e
O terminando-os
método invocado comno recebedor
*/, funciona podecomo também enviar informações
o exemplo anterior só de que
volta ao
ao
objeto chamador através de um valor de retorno. O método
adicionarmos tags apropriadas (como @tag valor) podemos colocar mais chamado deve ser
um que estejaem
informação definido
nossospelo objeto. Por exemplo:
comentários.
Seja um Profissional Aprendendo com Profissionais 19
Todos os direitos reservados a 3Way Networks
www.3way.com.br
Seja um Profissional Aprendendo com Profissionais 12
24
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

/**
//atribuindo
Este valor
e um exemplo deacomentários
variável referência
especiais para documentação usado por
Carro carro1 = new Carro();
java para gerar uma documentação em html. Este usa tags como:
carro1.ano
@author Carlos= Eduardo
"2001";
carro1.modelo=
@version 1.2 "fusca";
carro1.cor
@see <a = "prata";
href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javadoc.html">Javadoc
Tutorial</a>
*/

3.2 Ponto-e-Vírgula, Blocos e Espaço


Uma sentença é constituída de uma ou mais linhas de código terminadas por ponto-e-vírgula ( ; ). Uma
exemplo de sentença simples é:

System.out.println("Hello");

Um bloco é uma ou mais sentenças cercadas por chaves ({) de abertura e outra (}) de fechamento. Blocos
de sentenças podem ser aninhados indefinidamente. Qualquer
Figura 2.4 – Layout Memóriaquantidade de espaços são permitidos. Um exemplo
após inicialização
de bloco://criando novo alias
Carro carro2 = carro1;
public static void main( String[] args ){

System.out.println("Hello");

System.out.println("world");

}
Listagem 3.1 – Blocos e sentenças

3.3 Identificadores
Identificadores são tokens, elementos básicos que constitui a linguagem,
representa nomes de variáveis, métodos, classes, etc. Exemplos de identificadores
Identificadores em Java
são: Hello, main, System, out, println.
Com isto, significa queFigura 2.5 – Layout Memória
o identificador: MaInduas
nãovariáveis referência que
é o mesmo mesmo objeto são case-sensitive, ou
para omain.
Identificadores devem começar com uma letra, ou um caractere sublinha "_", ou seja, é feito distinção de
um caractere dólar "$". Letras podem ser maiúsculas ou minúsculas. Os caracteres caracteres maiúsculos e
2.3 Membros
subsequentes podemde Instância
usar números de 0 a 9. minúsculos.
Os identificadores criados por você não podem
Cada objeto criado deverá ter sua própria instância de variáveis ser iguais aos Os valores das variáveis
identificadores reservados
(atributos) definidas pela gramática
pela classe. Os métodos da linguagem
definem o (palavras
comportamentoreservadas)
de um em um objeto constituem
objeto.class,
como: Isto épublic, void, etc.
importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Exemplospor de todas
identificadores válidos: Dois objetos distintos têm
é compartilhada as instâncias da classe.
numero, número, var0001, a_com_b, _var01_, $$_100. o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Exemplos de identificadores inválidos:
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
n^mero, 0001var, a-com-b, var/01, $$..100 .
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
3.4 Palavras
devendo Reservadas
especificar a mensagem completa: o objeto que é o recebedor da
mensagem,São oidentificadores
método a ser reservados
invocado epela linguagem epara
os argumentos que onão devem(se
método serhouver).
utilizados como outra finalidade. Seu
uso de forma incorreta gerará um erro de compilação.
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 20
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
25
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

abstract assert boolean break byte


//atribuindo
case valor
catch a variável
char referência
class continue
Carro carro1 = new Carro();
const
carro1.ano =default
"2001"; do double else
carro1.modelo=
enum "fusca"; false
extends float final
carro1.cor = "prata";
finally for goto if implements
import instanceof int interface long
native new null package private
protected public return short static
strictfp super switch synchronized this
throw throws transient true try
void volatile while
Figura 3.1 – Palavras Reservadas

Figura 2.4 – Layout Memória após inicialização


Os identificadores const e goto não são utilizados atualmente em Java, mas é palavra reservada porque em
//criando novo alias
versões anteriores eles tinham utilidade e foi depreciado o seu uso. Já null, true e false são literais reservados.
Carro carro2 = carro1;

3.5 Variáveis, Declarações e Atribuição


Variáveis em Java podem ser de:
 Instância: é um espaço na memória usado para armazenar o estado de Variáveis em Java
um objeto. podem ser de instância,
 Estática ou de classe: que pertencem à classe e não a uma instância de estática e local.
um objeto. Devem ser declaradas e
 Local: também chamadas de variáveis de método, que são declaradas inicializadas antes de
em blocos ou métodos e são alocadas para cada invocação de método serem utilizadas.
ou bloco.

A variável armazena valores de um tipo de dado. Uma variável deve ter um


nome, um tipo, um tamanho particular e um valor associado a ela.
O tipo da variável indica o tipo
Figura de dado
2.5 – Layout queduas
Memória ela variáveis
pode conter.
referênciaOpara
nome dasobjeto
o mesmo
variáveis deve seguir as mesmas regras de nomenclatura que os identificadores.

3.5.1 Declarando e inicializando Variáveis


2.3 Membros de Instância
A seguir, vemos como é feita a declaração de uma variável:
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos
<tipo do dado> <nome> [= valor inicial];
definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois
Os valores colocados entre < > são obrigatórios, enquanto que os valores contidos objetos
entre [ ] sãodistintos
opcionais.têm
é compartilhada
Exemplos por todas
de declarações as instânciasválidas:
e inicializações da classe.
o mesmo estado se suas
2.3.1 char
Invocação de Métodos variáveis membro têm os
caracter;
Objetos se comunicam pela troca de mensagens, isto significa que um
double area; mesmos valores.
pode ter flag;
objeto boolean que mostrar um comportamento particular invocando uma
int idade = 10;
operação apropriada
float areaMesa que foi definida no objeto. Em Java, isto é feito pela
= 4.5f;
chamada de um método em um objeto usando o operador binário "." (ponto),
devendobyte
especificar
b1=2, a mensagem
b2=4; completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
int i=10;
O método invocado no recebedor pode também enviar informações de volta ao
int j=i;
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 21
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
26
www.3way.com.br
Siga-nos também no Twitter!
twitter.com/3waynet
Linguagem de Programação
Linguagem JavaJava
de Programação

JAVA é muito exigente com relação ao tipo de dado, é uma linguagem fortemente tipada. O compilador
não permitirá que você use
//atribuindo o operador
valor de atribuição
a variável (=) para inserir uma referência de objeto de uma classe
referência
Elefante em uma carro1
Carro variável referência do tipo da classe Coelho, nem permitirá que se atribua um valor do tipo float a
= new Carro();
uma variável do tipo int: = "2001";
carro1.ano
carro1.modelo= "fusca";
carro1.cor = "prata";
Coelho coelho = new Elefante(); //erro
int i = 3.4f; //erro

Abaixo vemos um exemplo de programa que declara e inicializa algumas variáveis:

public class ExemploVariaveis {

public static void main( String[] args ){

//declara uma variável com nome result e tipo boolean


boolean result;

//declara uma variável com nome option e tipo char


char option;
Figura 2.4 – Layout Memória após inicialização

//criando novo alias


// atribui o símbolo C para a variável
Carro carro2 = carro1;
option = 'C';

//declara uma variável com nome grade e tipo double


// e a inicializa com o valor 0.0
double grade = 0.0;

}
}
Listagem 3.2 – Declaração de variáveis

3.5.2 Exibindo o valor de uma Variável


Para exibirmos em qualquer dispositivo de saída o valor de uma variável, podemos fazer uso dos seguintes
comandos:

System.out.println() ou System.out.print()
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

Aqui está um simples programa como exemplo:

2.3 Membros de Instância


public class ImprimeVariavel {
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
public static void main(String[] args) {
(atributos) definidas pela classe. Os métodos definem o comportamento de umem um objeto constituem
objeto. Isto é importante, poisint
denota que =um10;
value método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir
char x;isto com a implementação do método, que
x = 'A';da classe.
Dois objetos distintos têm
é compartilhada por todas as instâncias
System.out.println(value); o mesmo estado se suas
System.out.println("O valor de x = " + x); variáveis membro têm os
2.3.1 Invocação de Métodos
}
Objetos
} se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular
Listagem 3.3 – Imprimindo invocando uma
valor de variáveis
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
3.5.3 Variáveis de Referência e de Valor
devendo especificar a mensagem completa: o objeto que é o recebedor da
Java suporta duas classes de variáveis, elas podem ser: de referência ou de valor.
mensagem, o método a ser invocado e os argumentos para o método (se houver).
As variáveis de valor (ou primitivas) são aquelas que armazenam dados no exato espaço de memória onde
O método invocado no recebedor pode também enviar informações de volta ao
a variável está.
objeto chamador através
As variáveis de um valor
de referência são de retorno.
aquelas queOarmazenam
método chamado deve de
o endereço ser memória onde o dado está
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 22
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
28
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

armazenado. Ao declarar uma variável do tipo de uma certa classe, se declara uma variável que referencia um
objeto daquela classe.
//atribuindo valor a variável referência
Por exemplo,
Carro carro1 vamos suporCarro();
= new que se tenha estas duas variáveis do tipo int e da classe String.
carro1.ano = "2001";
int num = 10; "fusca";
carro1.modelo=
String nome == "Hello";
carro1.cor "prata";

Suponha que o quadro abaixo represente a memória do computador, com seus endereços de memória, o
nome das variáveis e os tipos de dados que ele pode suportar.

Endereço Identificador Valor

0x10001 num 10
: : :
0x20002 nome 0x30001
: Figura: 2.4 – Layout Memória
: após inicialização
//criando novo 0x30001
alias "Hello"
Carro carro2 = carro1;
Figura 3.2 – Memória após inicialização de variáveis.

A variável num (do tipo int) o valor é o atual valor contido por ela e a variável referência nome (do tipo
String) somente é armazenado o endereço de memória que contém o valor da variável.

3.6 Tipos Básicos em Java


3.6.1 Literais Java Para usar um literal de
Um literal é um valor constante, este valor pode ser numérico (inteiros e caracter devemos
ponto-flutuantes), caracteres, booleanos ou cadeia de caracteres (String). Há ainda cercar o caractere entre
o literal null que representa uma referência nula (sem destino). delimitadores de aspas
simples. Por exemplo, a
3.6.2 Tipos Dados Primitivos
3.6.2.1 Lógico – boolean
letra A, é representada
O tipo booleano tem dois
Figuravalores literais
2.5 – Layout true
Memória duas false, ele
e variáveis podepara
referência representar
o mesmo objeto como o 'A'.
dois estados: true (verdadeiro) ou false (falso). No exemplo abaixo é declarada a
variável verdade do tipo boolean e é atribuída a esta o valor true.
2.3 Membros de Instância
boolean verdade = true;
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um
3.6.2.2 Textual – char and String em um objeto constituem
objeto. Isto é importante,
O tipo pois denota
de dado caracter que um
representa ummétodo pertence
CARACTER a cada
UNICODE, objeto de
conjunto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
caracteres de 16 bits sem sinal, em substituição ao conjunto de caracter ASCII de 8 Dois objetos distintos têm
ébits.
compartilhada por todas
Unicode permite o uso as
deinstâncias
símbolos edacaracteres
classe. especiais das línguas.
o mesmo estado se suas
Para usar um literal de caracter devemos cercar o caractere entre delimitadores de aspasmembro
variáveis simples.têm
Por os
2.3.1 Invocação
exemplo, a letra A,deéMétodos
representada como o 'A'. Ou podemos ainda usar o código hexadecimal do caractere
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
UNICODE, por exemplo '\u0041', esta é a representação hexadecimal do caractere unicode 'A'.
objeto pode ter caracteres
Para usar que mostrar um comportamento
especiais, particular
tais como um caractere de invocando uma contra-barra é usada seguida
nova-linha, uma
operação
pelo códigoapropriada
do caracter.que foi definida
Por exemplo, no objeto.
'\n' para EmdeJava,
o caracter isto é '\r'
nova-linha, feito
parapela
o retorno de "carro-do-carro", o
chamada de um método
'\b' para o "backspace". em um objeto usando o operador binário "." (ponto),
devendoOespecificar
tipo String,a que
mensagem
não é um completa: o objeto
tipo primitivo mas que
uma éclasse,
o recebedor da representar sequencias de
é usado para
mensagem, o método
caracteres. Por exemplo:a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
"Um literal
objeto chamador String
através de umpode
valorconter caracter
de retorno. de escape
O método chamado\n". deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 23
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
29
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

Alguns exemplos de declarações e inicializações de variáveis do tipo char e do tipo String:


//atribuindo valor a variável referência
Carro carro1 = new Carro();
// declara e inicializa
carro1.ano = "2001"; uma variável char
char ch = 'A';
carro1.modelo= "fusca";
carro1.cor = "prata";
Literais do tipo String
// declara e inicializa duas variáveis char são seqüências de
char ch1,ch2;
ch1='\U0020';
caracteres que devem
ch2='B; estar cercadas por
aspas-duplas ("") e
// declara duas variáveis String e as inicializa devem começar e
String deseja = "Bom dia !! \n";
String lembre = "Strings são imutáveis !"; terminar na mesma
linha.
// declara duas variáveis String
String str1,str2;

3.6.2.3 Inteiro – byte, short, int e long Figura 2.4 – Layout Memória após inicialização
Há quatro tipos
//criando novointeiros em Java, representados pelas palavras chaves byte,
alias
short, int e long.carro2
Carro Os literais
= integrais
carro1;podem ser escritos de três formas diferentes:
decimal (base 10), hexadecimal (base 16) e octal (base 8). Para números decimais
basta escrevê-lo como ele é exemplo: 2010.
Para usar os outros literais inteiros em Java você pode seguir algumas notações especiais. Para números
hexadecimais devemos utilizar o prefixo "0x" (zero xis minúsculo) ou "0X" (zero xis maiúsculo). Para números em
octal ele deve ser precedido de "0" (zero).
Por exemplo, considere o número 12 (em decimal):

int valDecimal = 12;


int valHexadecimal = 0xC;
int valOctal = 014;

Os literais inteiros são, por padrão, do tipo de dados int (32-bit com sinal). Em alguns casos pode-se
desejar forçar o literal inteiro para o tipo long (64-bit com sinal), isso pode ser feito usando o caractere "l" ou "L"
como sufixo do literal.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

Tamanho (bits) Tipo Faixa


2.3 Membros de Instância
Cada objeto criado
8 deverá ter sua -27 a 2de
byte própria instância 7
- 1 variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
16 short -215 a 215 - 1
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos 32 confundir isto com
int a implementação
-231do
a 2método,
31
-1 que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
64 long -263 a 263 - 1 o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Tabela 3.1: Tipos e faixa de valores dos Tipos Integrais
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada
3.6.2.4 Ponto que– float
Flutuante foi definida
e double no objeto. Em Java, isto é feito pela
chamadaOsdeliterais
um método em um objeto
de ponto flutuante podemusando o operador
ser expressos notação"."
em binário (ponto),
padrão ou científica. Por exemplo, 123.4
devendo especificar
está na notação a enquanto
padrão, mensagem123.4e2
completa:está na o notação
objeto que é o recebedor
científica. da tipos fracionários são do tipo
Os literais dos
mensagem, o método
de dados double a ser64-bit)
(um valor invocado
porepadrão.
os argumentos para ouma
Para inicializar método (se houver).
variável com o tipo de dados float (32-bit), de
O método
menor invocado
precisão, no recebedor
adicione o caracterepode
"f" outambém enviar
"F" ao literal: informações de volta ao
3.1415F.
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 24
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
30
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

double d1 = 123.4;
double d2 = 1.234e2; // mesmo valor de d1, mas em notação científica
//atribuindo
float valor a variável referência
f1 = 123.4f;
Carro carro1 = new Carro();
carro1.ano = "2001";
Tamanho (bits) Tipo
carro1.modelo= Faixa
"fusca"; Os literais dos tipos
carro1.cor =float
"prata";31 31 fracionários são do tipo
32 -2 a 2 - 1
de dados double e do
64 double
63
-2 a 2 - 1
63
tipo float.
Tabela 3.2: Tipos e faixa de valores dos Número Fracionários

3.6.2.5 Exemplos de declarações e atribuições


O seguinte programa demonstra como declarar e atribuir valores para
variáveis dos tipos int, float, boolean, char e String:

public class Atribui {


Figura 2.4 – Layout Memória após inicialização
public static void main (String args []) {
//criando novo alias
Carro carro2//= declara
carro1;variavel integer
int x, y;

// declara variavel ponto-flutuante


float z = 3.414f;

// declare e atribui double


double w = 3.1415;

// declare e atribui boolean


boolean verdadeiro = true;

// declare variavel caracter


char c;

// declare variavel String


StringFigura
str;
2.5 – Layout Memória duas variáveis referência para o mesmo objeto
// declare e atribui variavel String
String str1 = "bye";
// atribui valor para variavel char
2.3 Membros decInstância = 'A';
// atribui valor a variavel String
Cada objeto str
criado deverá ter declaracoes!";
= "Pratique sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela
// classe.
atribui Os valor
métodosa definem
variaveis o comportamento
inteiras de um em um objeto constituem
objeto. Isto é importante,
x =pois
6; denota que um método pertence a cada objeto da
o seu estado.
y = 1000;
classe. Porém não devemos confundir isto com a implementação do método, que
//atribuições não permitidas Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
// y = 3.1415926; // 3.1415926 não e inteiro o mesmo estado se suas
// requer casting e decimal será
2.3.1 Invocação de Métodos // truncado.
variáveis membro têm os
Objetos se comunicam pela troca de//mensagens,
//w = 175,000; A vírgulaisto (,) significa
não pode que umaparecer, mesmos valores.
//em ponto-flutuante
objeto pode ter que mostrar um comportamento particular invocando uma use (.);
//verdadeiro = 1; // confusão comum feita por
operação apropriada que foi definida no objeto. Em Java, isto é C/C++
// ex-programadores feito pela
chamada de um método em um objeto
//z = 3.14156; usando o operador binário
// Não pode atribuir double "." (ponto),dentro de um
devendo especificar a mensagem completa: o objeto que é o recebedor
// float; Isto requer da
conversão.
}
mensagem, o método a ser invocado e os argumentos para o método (se houver).
}
O método invocado no recebedor pode também enviar informações de volta ao
Listagem 3.4 O
objeto chamador através de um valor de retorno. – Exemplo
método atribuições
chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 25
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
31
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

3.7 Conversões
Já dissemos que ovalor
//atribuindo Java é bastante
a variávelrigoroso quanto aos tipos das variáveis, tudo tem haver com o tamanho
referência
de cada Carro
tipo, ou carro1
com quantidade
= new de bits que cada tipo exige para representar o dado a ser armazenado na variável.
Carro();
Enquanto um número fracionário
carro1.ano costuma ser armazenado em uma variável do tipo double (64 bits), tentar atribui-
= "2001";
lo a umacarro1.modelo= "fusca";
variável do tipo int (32 bits) não funciona pois é um código que diz: "i deve receber tudo que está em d",
mas nãocarro1.cor = "prata";
se sabe se d realmente é um número inteiro ou não, ou seja, Java não consegue antecipar se o valor
armazenado em d vai caber em i.

double d = 3.1415;
int i = d; // não compila

O mesmo ocorre no seguinte trecho:

int i = 3.14;

O mais interessante, é que nem mesmo o seguinte código compila:

Figura 2.4pode
double d = 5; // ok, o double – Layoutconter
Memória após
um inicialização
número inteiro
int i = d;
//criando // alias
novo não compila
Carro carro2 = carro1;
Apesar de 5 ser um bom valor para um int, o compilador não tem como saber que valor estará dentro
desse double no momento da execução, mesmo que você esteja lendo o valor literal de d no seu código fonte, o
compilador não tem como garantir que essa atribuição ocorra sem perda de valores. É como colocar uma xícara de
café grande numa xícara pequena, alguma coisa vai derramar. Já no caso a seguir é o contrário:

int i = 5;
double d2 = i;

O código acima compila sem problemas, já que um double pode guardar um número com ou sem ponto
flutuante. Todos os inteiros representados por uma variável do tipo int podem ser guardados em uma variável
double, então não haverá problemas com o código acima.

3.7.1 Casting de Tipos Primitivos


Às vezes, precisamos que um número quebrado seja arredondado e armazenado em um número inteiro.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Para fazer isso sem que haja o erro de compilação, é preciso ordenar que o número quebrado seja moldado (cast)
como um número inteiro. Esse processo recebe o nome de casting.

2.3 Membros
double d3 de
= Instância
3.14;
Cadai objeto
int criado
= (int) d3; deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
O casting
objeto. Isto foi feito pois
é importante, para denota
moldar que
a variável d3 como
um método um int.aOcada
pertence de i agora
valorobjeto da é 3. O mesmo ocorre entre
o seu estado.
valores int e long.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
long x = 10000; o mesmo estado se suas
variáveis membro têm os
int i = x; // não compila, pois pode estar perdendo informação
2.3.1 Invocação de Métodos
Objetos se comunicam mesmos valores.
E, se quisermos realmentepela
fazertroca de mensagens,
isso, fazemos isto significa que um
o casting:
objeto pode ter que mostrar um comportamento particular invocando uma
operaçãolong
apropriada que foi definida no objeto. Em Java, isto é feito pela
x = 10000;
chamadaint i =método
de um (int) em x; um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
3.7.2 Literais
mensagem, numéricos
o método e Promoção
a ser invocado eNumérica
os argumentos para o método (se houver).
O métodoAlguns castings
invocado no aparecem
recebedortambém quando atribuímos
pode também valores literais
enviar informações numéricos,
de volta ao por exemplo:
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 26
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
32
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

float x = 0.0;
//atribuindo valor a variável referência
O código
Carro acima não
carro1 compila
= new pois todos os literais ponto flutuante são considerados double pelo Java. E
Carro();
float não pode receber
carro1.ano um double
= "2001"; sem perda de informação, para fazer isso funcionar podemos escrever o
seguinte:carro1.modelo= "fusca";
carro1.cor = "prata";
float x = 0.0f;

Como já vimos a letra f, que pode ser maiúscula ou minúscula, indica que
aquele literal deve ser tratado como float.
Para converter um tipo
long l = 0.0L; primitivo para o tipo
wrapper associado,
A letra L, que também pode ser maiúscula ou minúscula, indica que basta usar o construtor
aquele literal deve ser tratado como long. da classe wrapper, uma
Outro caso, que é mais comum: vez que toda classe
wrapper possui um
double d = 5;
float f = 3;
Figura 2.4 – Layout Memória após inicialização construtor que recebe
//criando
float x = novo alias
(float) d + f; seu tipo primitivo
Carro carro2 = carro1; correspondente.
Você precisa do casting porque o Java faz as contas e vai promovendo o
resultado intermediário sempre para o maior tipo que apareceu durante as
operações, no caso o double. Em caso de tipos menores como byte e short o Java
os promove para int na hora de fazer as contas.
Até casting com variáveis do tipo char podem ocorrer. O único tipo
primitivo que não pode ser atribuído a nenhum outro tipo é o boolean.

3.8 Classes Wrapper (Empacotadoras)


As classes wrapper que representam valores numéricos são subclasses da classe Number.
O objetivo das classes wrapper é empacotar (boxing) tipos primitivos em objetos onde for necessário. Por
exemplo:

public class TesteWrapper {


Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
public static void main(String[] args) {

Float f1 = new Float("1.1f"); // compila, não considera double:


2.3 Membros de Instância
Float f2 = new Float("1.1");
Cada objeto criado
Doubledeverá
d = newter Double("1.2");
sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela
//classe.
retornaOs métodos
erro: definem o comportamento de um em um objeto constituem
objeto. Isto é importante,
//pois denota que
Character c =umnew
método pertence a cada objeto da
Character("e");
o seu estado.
Boolean b1 = new Boolean("false");
classe. Porém não devemos confundir isto com a implementação do método, que
Boolean b2 = new Boolean("True"); Dois objetos distintos têm
é compartilhada por todas
// as instâncias não
compila, da classe.
há diferenciação de maiúsculas: o mesmo estado se suas
Boolean b3 = new Boolean("FaLsE");
2.3.1 Invocação
} de Métodos variáveis membro têm os
}Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular
Listagem 3.5 – Empacotando invocando uma
variáveis
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaVejamos método situações
de um algumas em um objeto
onde a usando o operador
classe wrapper binário "." (ponto),
é exigida:
devendo especificar
As classesawrapper
mensagem completa:emo estruturas
são essenciais objeto que é o recebedor
de dados chamadas dedacoleções;
mensagem, oMétodos
método quea serretornam
invocadoo etipo
os genérico
argumentos para
Object ; o método (se houver).
O método invocado no recebedor
Outro objetivo pode
é facilitar também enviar
a conversão de/parainformações
o tipo Stringdee/ou
volta ao numéricas diferentes (octal,
bases
objeto chamador através de um valor
binário, hexadecimal, etc); de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 27
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
33
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Por outro lado, o tipo


//atribuindo primitivo
valor é exigido em:
a variável referência
Carro
 Incrementos
carro1 = e decrementos;
new Carro();
 Fórmulas matemáticas;
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";
Assim o uso do valor primitivo ou da classe wrapper vai depender da necessidade, neste sentido vários
métodos de conversão de um tipo para outro foram criados.

3.8.1 Construtores Wrapper


Para converter um tipo primitivo para o tipo wrapper associado, basta usar o Além do construtor que
construtor da classe wrapper, uma vez que toda classe wrapper possui um construtor recebe o tipo primitivo
que recebe seu tipo primitivo correspondente como argumento: associado, todo tipo
Float f = new Float(1.1f);
wrapper possui um
Double d = new Double(1.2); construtor que recebe
Character c = new Character('e'); uma String.
Boolean b = new Boolean(false);
Figura 2.4 – Layout Memória após inicialização
A classe wrapper de Character é a única exceção que o construtor da classe
//criando novo alias
permite receber
Carro um char, não
carro2 permitindo receber uma String.
= carro1;
Float f2 = new Float("1.1");
Double d = new Double("1.2");

retorna erro:

Character c = new Character("e");

Note no exemplo anterior que a classe Boolean recebe um construtor de String que não difere de
maiúsculas ou minúsculas.

3.8.2 Método valueOf


Outra forma de embrulhar tipos primitivos é usando o método estático valueOf(), que recebe um valor
String como parâmetro. Veja o exemplo:
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
public class TesteValueOf {

public static void main(String[] args) {


2.3 Membros de Instância
Cada objeto Float
criado f1deverá ter sua própria instância //deok,
= Float.valueOf("1.1f"); variáveis Os valores
não considera comodas variáveis
double:
(atributos) definidas pela classe.
Float f2 Os métodos definem o comportamento de um
= Float.valueOf("1.1");
em um objeto constituem
Double
objeto. Isto é importante, d = Double.valueOf("1.2");
pois denota que um método pertence a cada //objeto
retorna
da erro: o seu estado.
classe. Porém não devemos confundir isto
c =com a implementação do método, que
// Character Character.valueOf("e"); Dois objetos distintos têm
é compartilhada por todas as instâncias
Boolean da classe.
b1 = Boolean.valueOf("false");
Boolean b2 = Boolean.valueOf("True"); // Ok, não é sensível ao caso
o mesmo estado se suas
Boolean b3 = Boolean.valueOf("FaLsE");
2.3.1 Invocação de Métodos variáveis membro têm os
}
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
}
objeto pode ter que mostrar um comportamento particular invocando uma
Listagem 3.6 – Método valueOf()
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
3.8.3 Conversões
chamada de um método em um objeto usando o operador binário "." (ponto),
Para transformar
devendo especificar uma String
a mensagem em número
completa: utilizamos
o objeto que éaso classes Wrappers
recebedor da para os tipos primitivos
correspondentes. Por exemplo, para transformar a String em um
mensagem, o método a ser invocado e os argumentos para o método (se houver). número inteiro utilizamos o método estático
parseInt() da classe Integer:
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 28
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
34
www.3way.com.br
Linguagem
Linguagemde
deProgramação
ProgramaçãoJava
Java

String s = "101";
int i = Integer.parseInt(s);
//atribuindo valor a variável referência
Carro carro1 = new Carro();
As classes Double,
carro1.ano
Short, Long, Float, etc contêm os mesmos métodos, como parseDouble() e
= "2001";
parseFloat() que retornam um
carro1.modelo= "fusca"; double e float respectivamente, parse<ClasseWrapper>() onde <ClasseWrapper>
seja igual o nome da classe
carro1.cor Wrapper correspondente, com exceção das classes Character e Boolean.
= "prata";

3.9 AutoBoxing
Esse processo de wrapping e unwrapping é entediante. O Java 5.0 traz um recurso chamado de
autoboxing, que faz isso sozinho para você, porém o preço a se pagar é a perda de legibilidade do código:

Integer x = 5;
int y = x;
O boxing automático e
No Java 1.4 esse mesmo código é inválido. No Java 5.0 ele compila as conversões unboxing
perfeitamente. É importante ressaltar que isso não quer dizer que tipos primitivos aliviam nosso trabalho
e referências agora são a mesma coisa, isso é simplesmente um artifício para de converter valores de
facilitar a codificação. Figura 2.4 – Layout Memória após inicialização tipos primitivos em
Agora vocênovo
//criando pode fazer
aliastodos os tipos de operações matemáticas com as objetos das classes
wrappers,
classesCarro porém= você
carro2 corre o risco de seu programa retornar um exceção
carro1; wrappers
do tipo NullPointerException. correspondentes e vice-
O autoboxing também pode ser feito diretamente para Object: versa.
Object o = 5;

Isto seria útil, por exemplo, se você precisar passar o valor de um tipo
primitivo para um método que espera receber um Object como argumento.

3.9.1 Boxing e Unboxing Automático para Tipos Primitivos

int i = 10;
Autoboxing ou
autounboxing ocorre Integer iRef = new Integer(i); // Boxing Explicito
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
sempre que houver a int j = iRef.intValue(); // Unboxing Explicit
necessidade de
conversão de tipos iRef = i; // Boxing Automatico
2.3 Membros de
primitivos em objetos Instância
Cada objeto criadoj deverá = iRef;ter sua própria instância // Unboxing de variáveis
AutomaticoOs valores das variáveis
wrappers e vice-versa.
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denotaAque conversão
um método do Boxing
pertence converte
a cada valores
objeto da primitivos em objetos da classe
o seu estado.
wrappers isto
classe. Porém não devemos confundir do tipo
comdea dado correspondente.
implementação que do Unboxing converte objetos
A conversão
do método,
Dois objetos distintos têm
é compartilhada por todas as wrappers
instâncias para tipo de dado primitivo correspondente.
da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
3.9.2 Ocorrência de Boxing e Unboxing automático mesmos valores.
Objetos se comunicam pela troca de mensagens, isto significa que um
Se aplica em várias situações: comparação, atribuição, em estruturas de
objeto pode ter que mostrar um comportamento particular invocando uma
repetição, etc.
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
Comparações podem ser realizadas através do operador == (igualdade) ou
chamada de um método em um objeto usando o operador binário "." (ponto),
pelo método equals(); o primeiro, quando é aplicado entre objetos, compara se as variáveis referenciam o mesmo
devendo especificarque
objeto, enquanto a mensagem
o segundo avaliacompleta:
se os o objetopossuem
objetos que é oo valores
recebedor da
significativamente iguais. Veremos no
mensagem, o método a ser invocado e os argumentos para o método (se houver).
código-fonte do exemplo a seguir, que as comparações entre tipos diferentes podem ser realizadas:
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto. Seja um Profissional Aprendendo com Profissionais 29
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
35
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

public class AutoBoxing {


//atribuindo valor avoid
public static variável referência
main(String[] args) {
Carro carro1 = new Carro();
carro1.ano Integer
= "2001";
a = new Integer(2);
carro1.modelo= "fusca";
Integer b = new Integer(2);
carro1.cor int= "prata";
c = 2;

// compara se a e b referenciam o mesmo objeto:


if (a == b)
System.out.println("1:a e b são os mesmos objetos");
else
System.out.println("1:a e b não os mesmos objetos");

// compara se a e b possuem o mesmo valor:


if (a.equals(b))
System.out.println("2: a e b tem valores iguais");

// a é convertido para tipo primitivo


// os dois valores são comparados como tipos primitivos
if (a == c) Figura 2.4 – Layout Memória após inicialização
System.out.println("3: a e c tem valores iguais");
//criando novo alias
Carro carro2 = carro1;
// c é convertido para objeto
// os dois valores são comparados como objetos
if (a.equals(c))
System.out.println("4: a e c tem valores iguais");
}
}
Listagem 3.7 – Boxing e Unboxing implícitos

3.10 Fazer Laboratório 2


Siga instruções do laboratório 2 e tome cuidado com o tempo de execução, sempre recorra ao instrutor
em caso de dúvida, nunca deixe uma dúvida sem reposta.

3.11 Exercícios
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Escreva, compile e execute todas listagens de código apresentadas neste capítulo.

4 Operadores
2.3 Membros de Instância
Em Java temos diferentes tipos de operadores. Existem operadores aritméticos, operadores relacionais,
Cada objeto criado deverá ter sua própria instância de variáveis Osprecedência
valores daspara
variáveis
operadores lógicos e operadores condicionais. Estes operadores obedecem a uma ordem de que
(atributos) definidas pela classe. Os métodos definem o comportamento de um
o compilador saiba qual operação executar primeiro, no caso de uma sentença possuir grande em variedade
um objetodestes.
constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
4.1 Operadores Aritméticos Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
Aqui temos a lista dos operadores aritméticos que podem ser utilizados nao criação mesmode estado se suas
expressões
matemáticas: variáveis membro têm os
2.3.1 Invocação de Métodos
Objetos se comunicam pela troca de mensagens, istoDescrição
significa que um mesmos valores.
Operador Uso
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
* op1 * op2
chamada de um método em um objeto usando Multiplica
o operador op1 por op2
binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
/ op1 / op2 Divide op1 por op2
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor
% pode
op1 % também
op2 enviar
Resto da informações
divisão de op1 de
porvolta
op2 ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 30
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
36
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

- op1 - op2 Subtrai op2 de op1


//atribuindo valor a variável referência
Carro carro1 = new Carro();
+ op1 + op2 Soma op1 e op2
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";Tabela 4.1 - Operadores aritméticos e suas funções

Aqui temos um programa que exemplifica o uso destes operadores:

public class Aritimetica {

public static void main(String[] args) {

// alguns numeros
int i = 37, j = 42;
double x = 27.475, y = 7.22;
System.out.println(" Valor Variavel... ");
System.out.println(
Figura 2.4 –"i = Memória
Layout " + i após
);inicialização
System.out.println( "j = " + j );
//criando novo alias
System.out.println( "x = " + x );
Carro carro2 = carro1;
System.out.println( "y = " + y );

// adição dos números


System.out.println( " Adicao... ");
System.out.println( " i + j = " + (i + j) );
System.out.println( " x + y = " + (x + y) );

// subtração dos números


System.out.println( " Subtracao... ");
System.out.println( " i - j = " + (i – j) );
System.out.println( " x - y = " + (x – y) );

// multiplicação dos números


System.out.println( " Multipicacao... ");
System.out.println( " i * j = " + (i * j) );
System.out.println( " x * y = " + (x * y) );
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
// divisão dos números
System.out.println( " Divisao... ");
System.out.println( " i/j = " + (i / j) );
2.3 Membros deSystem.out.println(
Instância " x/y = " + (x / y) );
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
// resto da divisão
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
System.out.println( " Resto da Divisao... ");
objeto. Isto é importante, pois denota que um método
System.out.println( " i%j pertence
= " a+cada
(i objeto
% j) );da o seu estado.
classe. Porém não devemos confundir isto com a implementação
System.out.println( " x%y = " + (x % y) );do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
// misturando operações o mesmo estado se suas
System.out.println(" Tudo Junto... ");
2.3.1 Invocação de Métodos variáveis membro têm os
System.out.println(" j + y = " + (j + y) );
Objetos se comunicam pela troca de mensagens,
System.out.println(" i * x = "isto
+ significa
(i * x)que);um
mesmos valores.
objeto pode ter
} que mostrar um comportamento particular invocando uma
operação} apropriada que foi definida no objeto. Em Java, isto é feito pela
Listagem 4.1 – Operadores aritméticos
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
4.2 Operadores
mensagem, o métodode Incremento
a ser invocado e e osDecremento
argumentos para o método (se houver).
O métodoAlém dos operadores
invocado aritméticos
no recebedor básicos, Java
pode também enviardá informações
suporte ao operador
de volta unário
ao de incremento (++) e ao
operador
objeto chamador decremento
unário deatravés de um(--). Operadores
valor de retorno.++ ouO --, respectivamente
método chamado deve aumentam
ser ou diminuem em 1 o valor
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 31
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
37
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

da variável. Por exemplo, a expressão:


//atribuindo valor a variável referência
count carro1
Carro = count=+ new
1; // incrementa o valor de count em 1
Carro();
carro1.ano = "2001";
é equivalente a, count++;
carro1.modelo= "fusca";
carro1.cor = "prata";

Operador Uso Descrição

++ op++ Incrementa op em 1; avalia a


expressão antes do valor ser acrescido

++ ++op Incrementa op em 1; incrementa o valor antes da expressão ser


avaliada
Decrementa op em 1; Avalia a expressão antes do valor ser
-- op--
decrescido

-- Decrementa op em 1; decrementa op em 1 antes da expressão ser


--op
avaliada Figura 2.4 – Layout Memória após inicialização
//criando novo alias Tabela 4.2- Operadores de incremento e decremento
Carro carro2 = carro1;

Como visto na tabela acima, os operadores de incremento e decremento podem ser usados tanto antes
como após o operando. E sua utilização dependerá disso. Quando usado antes do operando, provoca acréscimo ou
decréscimo de seu valor antes da avaliação da expressão em que ele aparece. Por exemplo:

int i = 10;
int j = 3;
int k = 0;
k = ++j + i; // resultará em k = 4+10 = 14

Quando utilizado depois do operando, provoca, na variável, acréscimo ou decréscimo do seu valor após a
avaliação da expressão na qual ele aparece. Por exemplo:

int i = 10;
int j = 3; Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
int k = 0;
k = j++ + i; // resultará em k = 3+10 = 13

2.3 Membros de Instância


4.3 Operadores
Cada objetoRelacionais
criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos)
Os definidas
operadorespela classe. Os
relacionais sãométodos
usados para comparar
definem dois valores ede
o comportamento um
determinar o relacionamento
em entre
um objeto constituem
eles. A saída
objeto. Isto édesta avaliaçãopois
importante, serádenota
fornecida
quecom
umum valor lógico:
método trueaou
pertence cada objeto da
false.
o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da Uso
Operador classe. Descrição
o mesmo estado se suas
> op1 > op2 op1 é maior do que op2 variáveis membro têm os
2.3.1 Invocação de Métodos
>= op1 >= op2
Objetos se comunicam pela troca de mensagens, op1 é maior ou igual aque
isto significa op2 um mesmos valores.
< op1 <
objeto pode ter que mostrar um comportamento op1op2 particular
é menor do invocando
que op2 uma
operação apropriada que <= foi definidaop1 no<=objeto.
op2 Em Java, isto
op1 é menor ou igual é feito
a op2pela
chamada de um método em um objeto usando o operador binário "." (ponto),
== op1 == op2 op1 que
é igualé aoop2
devendo especificar a mensagem completa: o objeto recebedor da
mensagem, o método a ser!= invocado e os op1argumentos
!= op2 paranão
op1 o método
igual a op2 (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
Tabela 4.3 - Operadores relacionais
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 32
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
38
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

O programa a seguir,
//atribuindo valormostra a utilização destes
a variável operadores:
referência
Carro carro1 = new Carro();
public class OperadoresRelationais
carro1.ano = "2001"; {
carro1.modelo= "fusca";
public static
carro1.cor void main(String[] args) {
= "prata";

// declara números
int i = 37, j = 42, k = 42;
System.out.println("Variaveis...");
System.out.println("i =" + i);
System.out.println("j =" + j);
System.out.println("k =" + k);

// maior que
System.out.println("maior que...");
System.out.println("i >j =" + (i > j)); // false
System.out.println("j >i =" + (j > i)); // true
System.out.println("k >j =" + (k > j)); // false
Figura 2.4 – Layout Memória após inicialização
// maior ou igual a
//criando novo alias
System.out.println("maior ou igual a...");
Carro carro2 = carro1;
System.out.println("i >=j =" + (i >= j)); // false
System.out.println("j >=i =" + (j >= i)); // true
System.out.println("k >=j =" + (k >= j)); // true

// menor que
System.out.println("menor que...");
System.out.println("i <j =" + (i < j)); // true
System.out.println("j <i =" + (j < i)); // false
System.out.println("k <j =" + (k < j)); // false

// menor ou igual a
System.out.println("menor ou igual a...");
System.out.println("i <= j = " + (i <= j)); // true
System.out.println("j <= i = " + (j <= i)); // false
System.out.println("k <= j = " + (k <= j)); // true

// igual
Figuraentre variaveis
2.5 – Layout Memória duas de tipo
variáveis primitivo
referência para o mesmo objeto
System.out.println("igual a...");
System.out.println("i==j=" + (i == j)); // false
System.out.println("k==j=" + (k == j)); // true
2.3 Membros de Instância
Cada objeto // diferente
criado deverá ter sua própria instância de variáveis Os valores das variáveis
System.out.println("diferente...");
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
System.out.println("i != j = " + (i != j)); // true
objeto. Isto é importante, pois denota que um método
System.out.println("k != jpertence
= " + a(kcada
!= objeto
j)); da
//false o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada} por todas as instâncias da classe.
} o mesmo estado se suas
2.3.1 Invocação de Métodos Listagem 4.2 – Operadores Relacionais variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
4.4 Operadores
operação apropriada Lógicos
que foi definida no objeto. Em Java, isto é feito pela
chamadaOperadores lógicosem
de um método avaliam um ouusando
um objeto mais operandos
o operador lógicos que"."
binário geram um único valor final true ou false
(ponto),
como resultado da expressão. São seis os operadores lógicos:
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, E lógico,a ser invocado e os argumentos para o método (se houver).
&& o método
& E
O método invocado binário,
no recebedor pode também enviar informações de volta ao
||
objeto chamador OUatravés
lógico, de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 33
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
39
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

| OU binário,
^ OU exclusivo
//atribuindo binário
valor a ,variável referência
!
Carro negação.
carro1 = new Carro();
carro1.ano = "2001";
A operação básica para
carro1.modelo= um operador lógico é:
"fusca";
carro1.cor = "prata";
x1 op x2

Onde x1 e x2 podem ser expressões, variáveis ou constantes lógicas, e op pode tanto ser &&, &,||,| ou ^.

4.4.1 && (e lógico) e & (e binário)

x1 x2 Resultado
true true true
true false false
false true false
Figura 2.4 – Layout Memória após inicialização
false false false
//criando novo alias
Carro carro2 = carro1; Tabela 4.4 - Tabela para && e &

A diferença básica do operador && para & é que o && suporta uma avaliação de curto-circuito (ou
avaliação parcial), enquanto que o & não. O que isso significa?
Dado o exemplo:

exp1 && exp2

o operador E irá avaliar a expressão exp1, e, imediatamente, retornará um valor false se aexpressão exp1
forfalsa.Seaexpressãoexp1 resultar em um valorfalse ooperador nunca avaliará a expressão exp2, pois o valor de
toda a expressão será falsa mesmo que o resultado isolado de exp2 seja verdadeiro. Já o operador & sempre
avalia as duas partes da expressão, mesmo que a primeira tenha o valor false.
O programa a seguir, mostra a utilização destes operadores:

Figura 2.5{– Layout Memória duas variáveis referência para o mesmo objeto
public class TesteAnd

public static void main(String[] args) {


int i = 0;
2.3 Membros deintInstância
j = 10;
Cada objeto boolean
criado deverá
test =terfalse;
sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
// usando
objeto. Isto é importante, o operador
pois denota && empertence
que um método curto circuito
a cada objeto da
test = (i > 10) && (j++ > 9); o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
System.out.println(i); Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
System.out.println(j);
System.out.println(test);
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
// usando o operador &
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
test = (i > 10) & (j++ > 9);
objeto pode ter que System.out.println(i);
mostrar um comportamento particular invocando uma
operação apropriada System.out.println(j);
que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
System.out.println(test);
devendo especificar a mensagem completa: o objeto que é o recebedor da
}
mensagem,
} o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
Listagem 4.3 – Operador E
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 34
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
40
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Note que o comando


//atribuindo valorj++,anavariável
linha 8 contendo &&, nunca será executado, pois o operador não o avalia,
referência
visto queCarro
a primeira parte da
carro1 = expressão (i>10) retorna um valor booleano false.
new Carro();
carro1.ano = "2001";
4.4.2 || ( ou lógico) e | ( ou"fusca";
carro1.modelo= binário)
carro1.cor = "prata";

x1 x2 Resultado
true true true
true false true
false true true
false false false

Tabela 4.5 - Tabela para || e |

A diferença básica entre os operadores ||–eLayout


Figura 2.4 |, é Memória
que, semelhante ao operador &&, o || também suporta a
após inicialização
avaliação parcial. O que isso significa?
//criando novo alias
Dada a expressão,
Carro carro2 = carro1;
exp1 || exp2

O operador OU lógico irá avaliar a expressão exp1, imediatamente retornará um valor lógico true para
toda a expressão se a primeira parte for avaliada como verdadeira. Se a expressão exp1 resultar em verdadeira a
segunda parte exp2 nunca será avaliada, pois o valor final da expressão será true independentemente do resultado
da segunda expressão.
O programa a seguir, mostra a utilização destes operadores:

public class TesteOr {

public static void main(String[] args) {

int i = 0;
int j Figura
= 10; 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
boolean test = false;

// uso do operador ||
2.3 Membros detest
Instância
= (i < 10) || (j++ > 9);
System.out.println(i);
Cada objeto System.out.println(j);
criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um
System.out.println(test); em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos
// uso confundir isto com|a implementação do método, que
do operador
test = (i < 10) | (j++ > 9); Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
System.out.println(i); o mesmo estado se suas
System.out.println(j);
2.3.1 Invocação de Métodos
System.out.println(test);
variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um
} mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
}
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
Listagem 4.4 – Operador OU
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,Noteo que
método a ser invocado
a expressão e os argumentos
j++, nas linhas 9 e 15, nunca para
seráo avaliada
método (se houver). que usa o operador ||, pois a
na instrução
primeira
O método parte da expressão
invocado (i<10) já retorna
no recebedor true como
pode também valorinformações
enviar final da expressão.
de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 35
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
42
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

4.4.3 ^ (ou exclusivo binário)


//atribuindo valor a variável referência
Carro carro1 = new Carro();
x1 x2 Resultado
carro1.ano = "2001";
true
carro1.modelo= "fusca"; true false
carro1.cor = "prata";
true false true
false true true
false false false

Tabela 4.6 - Tabela para o operador ^

O resultado de uma expressão usando o operador ou exclusivo binário terá um valor true somente se uma
das expressões for verdadeira e a outra falsa. Note que ambos os operandos são necessariamente avaliados pelo
operador ^.
O programa a seguir, mostra a utilização deste operador:
Figura 2.4 – Layout Memória após inicialização
public class TesteXOR {
//criando novo alias
Carro public
carro2 static void main(String[] args) {
= carro1;

boolean val1 = true;


boolean val2 = true;
System.out.println(val1 ^ val2);

val1 = false;
val2 = true;
System.out.println(val1 ^ val2);

val1 = false;
val2 = false;
System.out.println(val1 ^ val2);

val1 = true;
val2 = false;
System.out.println(val1 ^ val2);
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
}
}
Listagem 4.5 – Operador OU exclusivo
2.3 Membros de Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos)
4.4.4 definidas pela classe. Os métodos definem o comportamento de um
! (negação) em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instânciasx1da classe. Resultado o mesmo estado se suas
2.3.1 Invocação de Métodos
true false variáveis membro têm os
Objetos se comunicam pela false troca de mensagens, istotrue significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no Tabela 4.7 - Tabela
objeto. EmparaJava,
o operador
isto! é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendoOespecificar
operador deanegação
mensagem completa:
inverte o resultado o objeto
lógico de queuma é expressão,
o recebedor da ou constante, ou seja, o que
variável
mensagem,
era o método
verdadeiro será falsoa eser invocado e os argumentos para o método (se houver).
vice-versa.
O método O programa
invocado anoseguir, mostrapode
recebedor a utilização
também deste operador:
enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 36
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
43
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

public class TesteNOT {


//atribuindo valor void
public static a variável referência
main(String[] args) {
Carro carro1 = new Carro();
carro1.ano boolean
= "2001";
val1 = true;
carro1.modelo= "fusca";
boolean val2 = false;
carro1.cor = "prata";
System.out.println(!val1);
System.out.println(!val2);
}
}
Listagem 4.6 – Operador de Negação

4.4.5 Operador Condicional ( ?: )


O operador condicional é também chamado de operador ternário. Isto significa que ele tem três
argumentos que juntos formam uma única expressão condicional. A estrutura de uma expressão utilizando um
operador condicional é a seguinte:
Figura 2.4 – Layout Memória após inicialização
exp1?exp2:exp3
//criando novo alias
Carro carro2 = carro1;
Onde exp1 é uma expressão lógica que deve retornar true ou false. Se o valor de exp1 for verdadeiro,
então, o resultado será a expressão exp2, caso contrário, o resultado será exp3.
O programa a seguir, mostra a utilização deste operador:

public class OperadorCondicional {

public static void main(String[] args) {

String status = "";


int pontuacao = 80;

// status do aluno
status = (pontuacao >= 60) ? "Aprovado" : "Reprovado";

// print status
System.out.println(status);
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
}

}
2.3 Membros de Instância Listagem 4.7 – Operador condicional (ou ternário)
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
4.5 Precedência de Operadores
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
A precedência serve para indicar a ordem na qual o compilador interpretará os diferentes tipos de
classe. Porém não devemos confundir isto com a implementação do método, que
operadores, para que ele sempre tenha como saída um resultado coerente e não ambíguo.Dois objetos
Na tabela distintos têm
os operadores
é compartilhada por todas as instâncias da classe.
na mesma linha possuem mesma precedência, a coluna ordem define a precedência do maioro mesmo
(1) para estado
o menorse suas
(15)
2.3.1 Invocação de Métodos variáveis membro têm os
ObjetosOrdem
se comunicam pela troca de mensagens, isto significa que Associativo
um mesmos valores.
Operador
objeto pode ter que mostrar um comportamento particular invocando uma
1 ( ) ,[], posfix ++, posfix -- Esquerda
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
2
chamada de um método unário(+,-),
em um objetoprefix ++, prefix --,
usando o ~operador
,! Direita
binário "." (ponto),
devendo especificar
3 a mensagem
(tipo), new completa: o objeto que é o recebedor da
Esquerda
mensagem, o método4
a ser invocado e os argumentos
* (mult), / (div), % (mod)
para o método (se houver).
esquerda
O método invocado no recebedor pode também enviar informações de volta ao
5
objeto chamador através + (adição),
de um valor– (subtração)
de retorno. O método chamado deve esquerda
ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 37
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
44
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

Ordem Operador Associativo


//atribuindo
6 valor
<< a variável referência
, >>, >>> esquerda
Carro carro1 = new Carro();
7
carro1.ano <,
= <=,>,>=,
"2001"; instanceof
carro1.modelo=
8 != , "fusca";
==
carro1.cor = "prata";
9 & (binário) esquerda
10 ^ (OU exclusivo binário) esquerda
11 | (binário) esquerda
12 && esquerda
13 || esquerda
14 ?: condicional esquerda
15 =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, |=, ^= direita
Tabela 4.7: Precedência de operadores

Figura 2.4 – Layout Memória após inicialização

No caso de novo
//criando dois operadores
alias com mesmo nível de precedência, terá prioridade o que estiver mais à
esquerda da expressão. Vejacarro1;
Carro carro2 = exemplo de uma expressão complexa:

int x = 7, y = 3,resultado=0;
resultado = ++y%2*5 + ++x/2+8*y-- + -10;

Podemos alterar a precedência pelo uso de parênteses, veja nova expressão:

int x = 7, y = 3,resultado=0;
resultado = (++y)%2*5 + (++x)/2+8*(y--) + -10;

A propósito, o resultado das expressões são respectivamente 26 e 0.

4.6 Exercícios
Escreva, compile e execute todas as listagens de código apresentadas neste capítulo.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

5 Estruturas de controle
Estruturas de controle de decisão são instruções em linguagem Java que permite que blocos específicos de
2.3 sejam
código Membros de Instância
escolhidos para serem executados, redirecionando determinadas partes do fluxo do programa.
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe.
5.1 Estruturas de decisão if - else Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante,
A declaração pois denota
if especifica que instrução
que uma um método pertence
ou bloco a cada objeto
de instruções da
seja executado se, eosomente
seu estado.
se, uma
classe. Porém
expressão lógicanão
fordevemos
verdadeira.confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas
A declaração as instâncias
if possui a seguinteda classe.
forma: o mesmo estado se suas
2.3.1 Invocação de Métodos
if (<expressão_lógica>) variáveis membro têm os
<sentença>
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
ou:
objeto pode ter que mostrar um comportamento particular invocando uma
if (<expressão_lógica>) {
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
<sentença 1>
chamada de um<sentença
método em2>um objeto usando o operador binário "." (ponto),
devendo} especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
Oonde,
método invocado norepresenta
expressão_lógica recebedoruma expressão
pode também ouenviar
variável lógica (que retorna
informações ao ou true). Por exemplo, dado o
de voltafalse
trecho de
objeto código: através de um valor de retorno. O método chamado deve ser
chamador
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 38
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
45
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

int nota = 68;


//atribuindo
if (nota > 60)valor a variável referência
Carro carro1 = new Carro();
System.out.println("Parabéns!");
carro1.ano = "2001";
ou:
carro1.modelo= "fusca";
int nota = 68;
carro1.cor = "prata";
if (nota > 60) {
System.out.println("Parabéns!");
System.out.println("Você passou!");
}

A declaração if-else é usada quando queremos executar determinado conjunto de instruções se a condição
for verdadeira e outro conjunto se a condição for falsa.
Possui a seguinte forma:

if (<expressão lógica>) Em uma expressão “if -


<sentença 1> else if - else”, se a
else primeira condição é
<sentença 2> Figura 2.4 – Layout Memória após inicialização falsa, o fluxo de
//criando novoescrevê-la
Também podemos alias na forma abaixo: controle segue para a
Carro carro2 = carro1; análise da segunda
if (<expressão lógica>) { condição.
<sentença 1>
<sentença 2>
} else {
<sentença 3>
<sentença 4>
}

Por exemplo, dado o trecho de código:

int nota = 68;


if (nota > 60)
System.out.println("Parabéns! Você passou!");
else
System.out.println("Lamento ! Reprovado");
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

ou:
int nota = 68;
2.3 Membros
if (nota > de Instância
60) {
Cada objeto criado deverá ter sua própria instância de variáveis
System.out.println("Parabéns!"); Os valores das variáveis
System.out.println("Você
(atributos) definidas pela classe. Os métodos passou!");
definem o comportamento de um
} else { em um objeto constituem
objeto. Isto éSystem.out.println("Lamento
importante, pois denota que um método
!"); pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com
System.out.println("Reprovado"); a implementação do método, que
Dois objetos distintos têm
é compartilhada
} por todas as instâncias da classe.
o mesmo estado se suas
A declaração
2.3.1 Invocação deelse
Métodos variáveis
pode conter outra estrutura if-else. Este aninhamento de estruturas membro
permite têm os
ter decisões
lógicas muito mais se
Objetos complexas.
comunicam pela troca de mensagens, isto significa que um mesmos valores.
A declaração
objeto pode ter que if-else-if
mostrarpossui
uma seguinte forma: particular invocando uma
comportamento
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
if (<expressão_lógica>)
chamada de um método em um objeto usando o operador binário "." (ponto),
<sentença 1>
devendoelse
especificar a mensagem completa: o objeto que é o recebedor da
if (<expressão_lógica>)
mensagem, o método
<sentença a ser 2>
invocado e os argumentos para o método (se houver).
O métodoelse
invocado no recebedor pode também enviar informações de volta ao
objeto chamador<sentença
através de3>um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 39
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
46
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Podemos ter várias


//atribuindo estruturas
valor else-if depois
a variável de uma declaração if. A estrutura else é opcional e pode ser
referência
omitida.Carro
No exemplo mostrado
carro1 = newacima, se a primeira condição é verdadeira, o programa executa a <sentença 1> e
Carro();
salta as outras instruções. =
carro1.ano Caso contrário, se a condição é falsa, o fluxo de controle segue para a análise da segunda
"2001";
condição. Se esta for verdadeira,
carro1.modelo= o programa executa a <sentença 2> e salta a <sentença 3>. Caso contrário, se a
"fusca";
segundacarro1.cor = "prata";
condição é falsa, então a <sentença 3> é executada.
Observe um exemplo da declaração if-else-if no seguinte trecho de código:

public class TesteIfElse {

public static void main(String[] args) {

int mesDoAno = 13;

if (mesDoAno == 12 || mesDoAno == 1 || mesDoAno == 2) {


System.out.println("Verão");
} else if (mesDoAno == 3 || mesDoAno == 4 || mesDoAno == 5) {
System.out.println("Outono");
} else if (mesDoAno
Figura 2.4 –== 6 Memória
Layout || mesDoAno == 7 || mesDoAno == 8) {
após inicialização
System.out.println("Inverno");
//criando novo alias
} else if (mesDoAno == 9 || mesDoAno == 10 || mesDoAno == 11) {
Carro carro2 = carro1;
System.out.println("Primavera");
} else {
System.out.println("Mês não é válido: " + mesDoAno);
}
}
}
Listagem 5.1 – Testando IF-ELSE

5.2 Declaração switch


Outra maneira de indicar uma condição é através de uma declaração switch. A construção switch permite
que uma única variável tenha múltiplas possibilidades de avaliação. O switch trabalha sobre os tipos primitivos byte,
short, char e int, ele também pode operar sobre tipos enumerados (a serem vistos posteriormente) sobre classes
empacotadoras Characater, Byte, Short e Integer.
A declaração switch possui a seguinte forma:
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto O programa executa
switch (<variável_do_tipo_permitido>) { todas instruções a
case <valor 1>:
[instrução1;] partir do primeiro case,
2.3 Membros de[instrução2;]
Instância até encontrar uma
Cada objeto [...
criado ]deverá ter sua própria instância de variáveis Os valores
instrução das variáveis
break, que
(atributos) definidas pela classe. Os métodos definem o comportamento de um
[break;]
eminterromperá
um objeto constituem
a
case <valor
objeto. Isto é importante, pois 2>:
denota que um método pertence a cada objeto da
[instrução1;] execução doestado.
o seu switch,
classe. Porém não devemos
[instrução2;]isto com a implementação do método, que
confundir nada
Dois após o break
objetos serátêm
distintos
é compartilhada por todas
[...]as instâncias da classe. executado.
[break;]
o mesmo estado se suas
2.3.1 Invocação de <valor
case Métodosn>: variáveis membro têm os
[instrução1;]
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
[instrução2;]
objeto pode ter que [...]mostrar um comportamento particular invocando uma
operação apropriada [break;]
que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
default:
devendo especificar a[instrução1;]
mensagem completa: o objeto que é o recebedor da
[instrução2;]
mensagem, o método a[...] ser invocado e os argumentos para o método (se houver).
O método invocado no[break;]
recebedor pode também enviar informações de volta ao
objeto chamador
} através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 40
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
47
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

onde, <variável_do_tipo_permitido>
//atribuindo valor a variável compreende os tipos de dados citados anteriormente e <valor n> são
referência
constantes literais
Carro dos tipos= de
carro1 dados
new citados.
Carro();
Quando a declaração
carro1.ano = "2001"; switch é encontrada, o fluxo de controle avalia inicialmente a
<variável_do_tipo_permitido>
carro1.modelo= "fusca"; e segue para o case que possui o valor igual ao da variável. O programa executa
todas ascarro1.cor
instruções a partir= deste
"prata";
ponto, mesmo as dos próximos case, até encontrar uma instrução break, que
interromperá a execução do switch, nada após o break será executado.
Se nenhum dos valores case for satisfeito, o bloco default será executado. Este é um bloco opcional. O
bloco default não é obrigatório na declaração switch.
Exemplo para switch:

public class TesteSwitch {

public static void main(String[] args) {

int mesDoAno = 11;

switch (mesDoAno) {
case 12: Figura 2.4 – Layout Memória após inicialização

//criando 1:
case novo alias
Carro case 2: = carro1;
carro2
System.out.println("Verão");
break;
case 3:
case 4:
case 5:
System.out.println("Outono");
break;
case 6:
case 7:
case 8:
System.out.println("Inverno");
break;
case 9:
case 10:
case 11:
System.out.println("Primavera");
break;Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
default:
System.out.println("Mês não é válido: " + mesDoAno);
break;
2.3 Membros
} de Instância
}Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um
} Asem
instruções contidas
um objeto constituem
objeto. Isto é importante, Listagem
pois denota que um
5.2 – Testando método pertence a cada objeto da dentro do bloco
Switch-Case o seu while são
estado.
classe. Porém não devemos confundir isto com a implementação do método, que executadas repetidas
Dois objetos distintos têm
é compartilhada
Note quepor
paratodas as de
o caso instâncias
intervalos dadeclasse.
valores a declaração if-else-if é mais vezes enquanto o valor de
o mesmo estado se suas
indicada, veja exemplo if-else-if. expressão_lógica for
2.3.1 Invocação de Métodos variáveis membro têm os
verdadeiro.
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
5.3 Iterações (Laços)
objeto pode ter que
Estruturas mostrardeum
de controle comportamento
repetição são comandos particular invocando
em linguagem Javauma
que permitem executar partes específicas do código determinada quantidade depela
operação apropriada que foi definida no objeto. Em Java, isto é feito
chamada
vezes. Existem trêsmétodo
de um tipos de em um objeto
estruturas usandogerais:
de iteração o operador binárioe"."
while, do-while for.(ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,
5.3.1 whileo método a ser invocado e os argumentos para o método (se houver).
O método invocado nowhile
A declaração recebedor
executapode também
repetidas enviar
vezes um informações de volta ao
bloco de instruções
objeto chamador através de um valor de retorno.
enquanto a expressão lógica (condição) resultar em true (boolean). O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 41
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
48
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

A declaração while possui a seguinte forma:


//atribuindo valor a variável referência
while (expressão_lógica)
Carro {
carro1 = new Carro();
carro1.ano = "2001";
instrução1;
carro1.modelo= "fusca";
instrução2;
carro1.cor = "prata";
}

Por exemplo, dado o trecho de código:

int i = 4;
while (i > 0){
System.out.print(i);
i--;
}
A diferença entre uma declaração
Abaixo, temos outros exemplos de declarações while:
while e do-while é que, no laço while,
Exemplo 1: Figura 2.4 – Layout Memória após inicialização
a avaliação é feita antes de se
int x = 0; executarem as instruções enquanto
//criando novo
{ alias
while (x<10)
Carro carro2 = carro1; que, no laço do-while, primeiro se
System.out.println(x);
x++;
executam as instruções e depois
} realiza-se a avaliação.

Exemplo 2:
// laço infinito
while (true)
System.out.println("hello");

Exemplo 3:
// a instrução do laço não será executada
while (false)
System.out.println("hello");

5.3.2 do-while Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
A declaração do-while é similar ao while. As instruções dentro do laço do-while serão executadas pelo
menos uma vez.
2.3 Membros
A declaraçãode Instância
do-while possui a seguinte forma:
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
do {
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante,
instrução1;pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não
nstrução2; confundir isto com a implementação do método, que
devemos
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
...
o mesmo estado se suas
} while (expressão_lógica);
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
Inicialmente, as instruções dentro do laço do-while são executadas. Então, a condição na expressão_lógica
objeto pode terverdadeira,
é avaliada. Se for que mostrar um comportamento
as instruções dentro do laço particular invocando uma
do-while serão executadas novamente.
operaçãoA diferença
apropriada que foi definida no objeto. Em Java, isto
entre uma declaração while e do-while é que, no laço é feito
while,pela
a avaliação da expressão lógica é
chamada de um método em um objeto usando o operador binário
feita antes de se executarem as instruções nele contidas enquanto que, no laço "." (ponto),
do-while, primeiro se executam as
devendo especificar
instruções a mensagem
e depois realiza-se completa:
a avaliação o objeto
da expressão lógica,que é o asrecebedor
ou seja, instruçõesdadentro em um laço do-while são
mensagem, o método a ser
executadas pelo menos uma vez. invocado e os argumentos para o método (se houver).
O método invocado
Abaixo, temosnoalguns
recebedor pode
exemplos quetambém enviar informações
usam a declaração do-while: de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 42
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
49
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Exemplo 1:
int x = 0;
//atribuindo
do { valor a variável referência
Carro carro1 = new Carro();
System.out.println(x);
carro1.ano
x++; = "2001";
carro1.modelo=
} while (x<10); "fusca";
carro1.cor = "prata";
Exemplo 2:
// laço infinito
do {
System.out.println("hello");
} while(true);

Exemplo 3:
// Um laço executado uma vez
do
System.out.println("hello");
while (false);

Figura 2.4 – Layout Memória após inicialização


5.3.3 Declaração for
//criando novo
A declaração for, alias
como nas declarações anteriores, permite a execução do mesmo código uma quantidade
Carro carro2
determinada de vezes. = carro1;
A declaração for possui a seguinte forma:

for ([declaração]; [expressão]; [incremento]) {


instrução1;
instrução2;
...
}

onde:
1. [declaração] – seção de declaração e inicialização das variáveis locais para o laço, executada um única
vez na primeira iteração
2. [expressão] – executada a cada passo do laço, é utilizada como condição de parada quando a
expressão resultar em false as iterações terminam.
3. [incremento] – normalmente usada para incrementar um contador para o laço, mas qualquer
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
declaração válida em Java poderá ser executada. É executado após a execução do bloco interno ao
laço.

2.3 Membros
Um exemplode
paraInstância
a declaração for:
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos)
fordefinidas
(int i pela
= 0;classe.
i < Os10;métodos
i++) { definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da
System.out.print(i);
o seu estado.
}
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo
Neste exemplo, uma variável i, do tipo int, é inicializada com o valor zero. A expressão lógicaestado se suas
"i é menor
que 10" é avaliada. Se for verdadeira, então a instrução dentro do laço é executada. Apósvariáveis membroi terá
isso, a expressão têm os
2.3.1 Invocação de Métodos
seu valor adicionado em 1 e, novamente, a condição lógica será avaliada. Este processo continuarámesmos valores.a
até que
Objetos se comunicam pela troca de mensagens, isto significa que um
condição lógica resulte no valor false.
objeto pode ter que mostrar um comportamento particular invocando uma
Este mesmo exemplo, utilizando a declaração while, é mostrado abaixo:
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaint de ium= método
0; em um objeto usando o operador binário "." (ponto),
devendowhile
especificar
(i < a10)mensagem
{ completa: o objeto que é o recebedor da
mensagem, oSystem.out.print(i);
método a ser invocado e os argumentos para o método (se houver).
i++; no recebedor pode também enviar informações de volta ao
O método invocado
}
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 43
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
50
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

5.4 Declarações
//atribuindode valor
Interrupção e Desvio
a variável referência
Declarações
Carro de interrupção
carro1 permitem que redirecionemos o fluxo de controle do programa. A linguagem
= new Carro();
Java possui três declarações
carro1.ano de desvio do fluxo de processamento ou sua interrupção. São elas: break, continue,
= "2001";
carro1.modelo=
return (há "fusca";
ainda try-catch-finally que será visto no capítulo que trata de exceções).
carro1.cor = "prata";
5.4.1 Declaração break
A declaração break possui duas formas: unlabeled (não identificada - vimos esta forma com a declaração
switch) e labeled (identificada).

5.4.1.1 Declaração unlabeled break


A forma unlabeled de uma declaração break encerra a execução de um switch e o fluxo de controle é
transferido imediatamente para o final deste. Podemos também utilizar a forma para terminar declarações for,
while ou do-while. Por exemplo:

public class UnlabeledBreak {


Figura 2.4 – Layout Memória
public static void main(String[] args)após {
inicialização

//criando novo alias


String =soletrar
Carro carro2 carro1;= "Pneumoultramicroscopicossilicovulcanoconiótico";
int tamanho = soletrar.length();
int i;
boolean encontrou = false;
char procurarpor = 'ó';

for (i = 0; i < tamanho; i++) {


if (soletrar.charAt(i) == procurarpor) {
encontrou = true;
break;
}
}

if (encontrou) {
System.out.println("Encontrei a letra " + procurarpor
+ " na posição " + i + "");
} else {
Figura 2.5 – Layout Memória duas variáveis
System.out.println("A referência
letra " + paraprocurarpor
o mesmo objeto
+ " não está na maior palavra do Português");
}
}
2.3 Membros
} de Instância
Cada objeto criado deverá terListagem sua 5.3própria instância
– Iterador FOR com LABELde variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
Neste não
classe. Porém exemplo, se oconfundir
devemos "ó" com
caracter isto for encontrado,
a implementação a declaração for será
do método, queinterrompida e o controle do
Dois objetos distintos têm
éprograma será transferido
compartilhada por todaspara a próximada
as instâncias classe. abaixo da declaração for.
instrução
o mesmo estado se suas
5.4.1.2 Declaração labeled break
2.3.1 Invocação de Métodos variáveis membro têm os
A forma labeled de uma declaração break encerra o processamento de um laço que é mesmos
identificado por um
valores.
Objetos se comunicam pela troca de mensagens, isto significa que um
label especificado na declaração break.
objeto pode ter que mostrar um comportamento particular invocando uma
Um label, em linguagem Java, é definido colocando-se um nome seguido de dois-pontos, como por
operação
exemplo:
apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo teste:
especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado
esta no recebedor
linha indica pode
que temos um também
label com o enviar informações de volta ao
nome teste.
objeto chamador através de um valor de retorno. O método
O programa a seguir possui dois laços while aninhados, chamado devecom
o laço ser rotulo (externo) executaria
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 44
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
51
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

infinitamente se não houvesse uma declaração break externo, na linha 15. Quando a condição na linha 13 for
o labeled break valor
satisfeita//atribuindo terminará
a avariável
execução do laço externo indo direto para linha 21, assim a linha 18 nunca
referência
será executada.
Carro carro1 = new Carro();
carro1.ano = "2001";
public class LabeledBreak
carro1.modelo= "fusca"; {
carro1.cor = "prata";
public static void main(String[] args) {

int i = 0;
externo: while (true) { //infinito
System.out.println("Dentro Laço (while) externo");
while (true) {
i++;
System.out.println("i = " + i);
if (i == 3) {
System.out.println("break (laço interno) i="+i);
break;
}
if (i == 2) {
System.out.println("break externo i="+i);
Figura 2.4 – Layout Memória após inicialização
break externo;
//criando novo alias
}
Carro carro2 }= carro1;

System.out.println("fora laço (while) interno i="+i);


}

System.out.println("Fora laço (while) externo i="+i);


}
}
Listagem 5.4 – Iterador While com Label

5.4.2 Declaração continue


A declaração continue tem duas formas: unlabeled e labeled. Utilizamos uma declaração continue para
saltar a repetição atual de declarações for, while ou do-while.

5.4.2.1 Declaração unlabeledFigura


continue
2.5 – Layout Memória duas variáveis referência para o mesmo objeto
A forma unlabeled salta as instruções restantes de um laço e avalia novamente a expressão lógica que o
controla.
2.3 Membros de Instância
5.4.2.2 Cada
Declaração labeled
objeto continue
criado deverá ter sua própria instância de variáveis Os valores das variáveis
A forma labeled da declaração continue interrompe a repetição atual de um laço e salta para a repetição
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
exterior marcada com o label indicado.
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
public class TesteContinue { Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
public static void main(String[] args) {
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
int i = 0;
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
outer: while (true) {
objeto pode ter que mostrarSystem.out.println("laço
um comportamento particular invocando uma
Outer");
operação apropriada que foiwhile
definida no objeto.
(true) { Em Java, isto é feito pela
chamada de um método em um objeto i++;usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o= recebedor
System.out.println("i " + i); da
if (i == 1) {
mensagem, o método a ser invocado e os argumentos para o método (se houver).
System.out.println("continue");
O método invocado no recebedor pode também enviar informações de volta ao
continue;
objeto chamador através de um valor} de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 45
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
52
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

if (i == 3) {
System.out.println("continue outer");
//atribuindo valor a variávelcontinue
referência
outer;
Carro carro1 = new Carro();
}
carro1.ano = "2001"; if (i == 5) {
carro1.modelo= "fusca"; System.out.println("break");
carro1.cor = "prata"; break;
}
if (i == 7) {
System.out.println("break outer");
break outer;
}
}
}
}
}
Listagem 5.5 – Interrompendo Iteradores com CONTINUE LABEL

5.4.3 Declaração return Figura 2.4 – Layout Memória após inicialização


returnalias
A declaração novo
//criando é utilizada para sair de um método. O fluxo de controle retorna para a declaração que
segue a Carro
chamadacarro2
do método original. A declaração de retorno possui dois modos: o que retorna um valor e o que
= carro1;
não retorna nada.
Para retornar um valor, escreva o valor (ou uma expressão que calcula este valor) depois da palavra chave
return. Por exemplo:

return ++count;

ou

return "Hello";

Abordaremos as declarações return nas próximas lições, quando falarmos sobre métodos.

5.5 Fazer Laboratório 3


Siga instruções do laboratório
Figura 2.5 –eLayout
tomeMemória
cuidado
duascom o tempo
variáveis depara
referência execução, sempre recorra ao instrutor em
o mesmo objeto
caso de dúvida, nunca deixe uma dúvida sem reposta.

5.6
2.3 Exercícios de Instância
Membros
Escreva, compile e execute Um array armazena
Cada objeto criado deverátodas
ter as
sualistagens
própriadeinstância
código apresentadas
de variáveis Os valores das variáveis
neste capítulo.
(atributos) definidas pela classe. Os métodos definem o comportamento de um múltiplos itens de um
em umtipo
mesmo objeto constituem
de dado em
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
6 Porém
classe. Arraynão devemos confundir isto com a implementação do método, que um bloco contínuo de
Dois objetos
memória. distintosdetêm
O tamanho
é compartilhada
Um arraypor todasestrutura
é uma as instâncias da classe.
de dados que define uma coleção ordenada de
o mesmo estado se suas
um array é fixo e não
elementos homogêneos e de tamanho fixo. Um array armazena múltiplos itens de
um mesmo
2.3.1 tipo dededado
Invocação em um bloco contínuo de memória. O tamanho de um
Métodos variáveis
pode membro
ser alterado têm os
depois
array é fixo e não pode ser
Objetos se comunicam alterado depois
pela trocadede
suamensagens,
criação. isto significa que um demesmos valores.
sua criação.
objeto pode ter que mostrar um comportamentoé como
Se imaginarmos que uma variável em Java uma invocando
particular xícara de café
uma
só se toma café) um array
operação apropriada que foi definida no objeto. Em Java, isto équantidade
(onde seria uma bandeja contendo uma feito pela
definida dedexícaras.
chamada um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
6.1 Declarando
mensagem, o métodoArray
a ser invocado e os argumentos para o método (se houver).
O método Independentemente
invocado no recebedor de array
do tipopode com oenviar
também qual você esteja trabalhando,
informações de volta ao
o identificador
objeto chamador array é, de
do através na verdade,
um valoruma referênciaOpara
de retorno. métodoum objeto
chamado real deve
que foi
ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 46
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
54
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

criado na pilha. Este é o objeto que guarda as referências para os outros objetos ou valores de tipos primitivos,
pode ser//atribuindo
criado tanto implicitamente da sintaxe de inicialização do array, como explicitamente, com o
como parte referência
valor a variável
operadorCarro
new . Uma parte=donew
carro1 objeto array (de fato, o único campo ou método acessível) é o atributo length (ele só
Carro();
está disponível para leitura),
carro1.ano = que informa a você quantos elementos podem ser armazenados naquele objeto array.
"2001";
Array precisa ser declarados
carro1.modelo= "fusca"; como qualquer variável. Ao declarar um array, defina o tipo de dados deste
seguido carro1.cor = "prata";
por colchetes [] e pelo nome que o identifica. Por exemplo:

int [] idades;

ou colocando os colchetes depois do identificador. Por exemplo:

int idades[];

Depois da declaração, precisamos criar o array e especificar seu tamanho. Este processo é chamado de
construção (a palavra, em orientação a objetos, para a criação de objetos). Para se construir um objeto, precisamos
utilizar um construtor. Por exemplo:

// declaração Figura 2.4 – Layout Memória após inicialização


int idades[];
//criando novo alias
// construindo
Carro carro2 = carro1;
idades = new int[100];

ou, pode ser escrito como:

// declarar e construir
int idades[] = new int[100];

No exemplo, a declaração diz ao compilador Java que o identificador idades será usado como um nome de
um array contendo valores do tipo int, e que o novo array contém 100 elementos.
Ou invés de utilizar uma nova linha de instrução para construir um array, também é possível
automaticamente declarar, construir e adicionar um valor uma única vez.
Exemplos:

// criando um array de valores lógicos em uma variável


// resultados. Este
Figuraarray contém
2.5 – Layout Memória 4 elementos
duas queparasão
variáveis referência o mesmo objeto
// inicializados com os valores {true, false, true, false}
boolean resultados[] ={ true, false, true, false };

2.3 Membros deumInstância


// criando array de 4 variáveis double inicializados Um índice é atribuído
//
Cada objeto criado deverá 90,
com os valores {100, 80, própria
ter sua 75}; instância de variáveis
double [] notas = {100, 90, 80, 75};
Os valores
para das variáveis
cada membro de
(atributos) definidas pela classe. Os métodos definem o comportamento de um em
um um objeto
array, constituem
permitindo
objeto. Isto
// écriando
importante,
um pois
array denota que um método
de Strings pertence a cadadias
com identificador objetoe da o seu estado.
ao programador
classe. Porém não devemos
// também confundir isto com
já inicializado. Estea array
implementação
contém do método, que
7 elementos
String por
dias[]
Dois objetos
acessar distintos têm
os valores
é compartilhada todas =as instâncias da classe.
{"Seg","Ter","Qua","Qui","Sex","Sab","Dom"}; individualmente
o mesmo estado se suas
quando necessário
variáveis membro têm os
2.3.1 Invocação de Métodos
Uma vez que tenha sido inicializado, o tamanho de um array não pode ser
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos. valores.
modificado, pois é armazenado em um bloco contínuo de memória.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
6.2 Acessando um elemento do Array
chamada de um método em um objeto usando o operador binário "." (ponto),
Para acessar um elemento do array, ou parte de um array, utiliza-se um
devendo especificar a mensagem completa: o objeto que é o recebedor da
número inteiro chamado de índice. Os números dos índices são sempre inteiros. Eles
mensagem, o método a ser invocado e os argumentos para o método (se houver).
começam com zero e progridem seqüencialmente por todas as posições até o fim do
O método invocado no recebedor pode também enviar informações de volta ao
array. Lembre-se que os elementos dentro do array possuem índice de 0 a length - 1.
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 47
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
55
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Por exemplo, dado o array idades que declaramos anteriormente, temos:


//atribuindo valor a variável referência
// atribuir
Carro carro110= ao
newprimeiro
Carro();elemento do array
idades[0]
carro1.ano = 10;
= "2001";
// imprimir o último elemento do array
carro1.modelo= "fusca";
System.out.print(idades[99]);
carro1.cor = "prata";

Lembre-se que o array, uma vez declarado e construído, terá o valor de cada membro inicializado
automaticamente, usando o valor default para cada tipo de dado primitivo.
Entretanto, tipos de dados por referência, como as variáveis do tipo String, não serão inicializados com
caracteres em branco ou com uma String vazia "", serão inicializados com o valor null. Deste modo, o ideal é
preencher os elementos do arrays de forma explícita antes de utilizá-los. A manipulação de objetos com referência
null causará a desagradável surpresa de uma exceção do tipo NullPointerException, por exemplo, ao tentar
executar algum método da classe String, conforme o exemplo a seguir:

public class ExemploArray {


public static void main(String[] args) {
String[] nulls = new String[2];
Figura 2.4 – Layout Memória//
System.out.print(nulls[0]); apósLinha
inicialização
correta, mostra null
System.out.print(nulls[1].trim());
//criando novo alias // Causa erro
Carro }carro2 = carro1;
}
Listagem 6.1 – Referênciando Array

O código abaixo utiliza uma declaração for para mostrar todos os elementos de um array.

public class PercorrendoArray {


public static void main(String[] args) {
int[] idades = new int[100];

for (int i = 0; i < 100; i++) {


System.out.print(idades[i]);
}
}
}
Listagem 6.2 – Iterando sobre Array
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

6.3 Tamanho de Array


O atributo length de um array retorna seu tamanho, ou seja, a quantidade de
2.3 Membros
elementos, deéInstância
ou seja ele uma constante já que o array depois de criado não sofrerá
alteraçãoCada objeto É criado
de tamanho. utilizadodeverá
como noter sua abaixo:
código própria instância de variáveis Para se obter
Os valores o número
das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um de elementos de um
em um objeto constituem
objeto. nomeArray.length
Isto é importante, pois denota que um método pertence a cada objeto da array,opode-se utilizar
seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que o atributo
Dois objetoslength. O têm
distintos
Por exemplo,
é compartilhada dado as
por todas o código anterior,
instâncias podemos reescrevê-lo como:
da classe. atributo length de um
o mesmo estado se suas
array retorna seu
public class TamanhoArray {
2.3.1 Invocação de Métodos variáveis membro têm os
public static void main(String[] args) { tamanho.
Objetos se comunicam pela troca de int[100];
mensagens, isto significa que um mesmos valores.
int[] idades = new .
objeto pode ter que formostrar
(intum i =comportamento particular invocando
0; i < idades.length; i++) { uma
operação apropriada que foiSystem.out.print(idades[i]);
definida no objeto. Em Java, isto é feito pela
chamada de um método } em um objeto usando o operador binário "." (ponto),
}
devendo} especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
Listagem 6.3 – Tamanho do Array
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 48
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
56
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

6.4 Arrays Multidimensionais


Arrays multidimensionais
//atribuindo valor asão implementados
variável como arrays dentro de arrays. São declarados ao atribuir
referência
um novoCarro
conjunto de colchetes
carro1 = new depois do nome do array. Por exemplo:
Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
// array inteiro de 512 x 128 elementos
carro1.cor = =
int [][] doisD "prata";
new int[512][128];

// array de caracteres de 8 x 16 x 24
char [][][] tresD = new char[8][16][24];

// array de String de 4 linhas x 2 colunas


String [][] bixoComX = {{"mamífero", "baleia"},
{"carnívoro", "Leão"},
{"pássaro", "galinha"},
{"réptil", "Brontossauro"}};

Acessar um elemento em um array multidimensional é semelhante a acessar elementos em um array de uma


dimensão. Por exemplo, para acessar o primeiro elemento da primeira linha do array bixoComX, escreve-se:
Figura 2.4 – Layout Memória após inicialização
System.out.print(bixoComX[0][0]);
//criando novo alias
Carro carro2 = carro1;
Isso mostrará a String "terry" na saída padrão. Caso queira mostrar todos os elementos deste array,
escreve-se:
for (int i = 0; i < bixoComX.length; i++) {
for (int j = 0; j < bixoComX[i].length; j++) {
System.out.print(bixoComX[i][j] + " ");
}
}

O código abaixo monta um array denominado matrix, contendo 3 arrays de double. Na linha 4 é definido
e criado a primeira dimensão do array, observe que o segundo par de colchetes não contém um número, logo os
elementos da segunda dimensão não foram definidos ainda, ou seja estão com valor default null.
Na linha 6 definimos o primeiro elemento de matrix, ele tem uma referência para um array de double com
um elemento double em que foi atribuído (linha 7) o valor 8.5.
Na linha 9 definimos o segundo elemento de matrix, ele tem uma referência para um array de double com
dois elementos double em que foram atribuídos
Figura 2.5 os valores
– Layout Memória 6.3 e referência
duas variáveis 4.4 . para o mesmo objeto
Na linha 9 definimos o terceiro elemento de matrix, ele tem uma referência para um array de double com
três elementos double em que foram atribuídos os valores 1.5 e 2.9 e 5.5.
2.3 Membros de Instância
public class Matrix {
Cada public
objeto criado
staticdeverá ter sua própria args)
void main(String[] instância
{ de variáveis Os valores das variáveis
(atributos) definidas pela classe. Osmatriz
//criando métodos 2Ddefinem
com 3 oelementos
comportamento de um em um objeto constituem
objeto. Isto é importante, pois denotamatrix
double[][] que um=método pertence a cada objeto da
new double[3][];
o seu estado.
//montando
classe. Porém não devemos confundirelemento
isto com a0implementação
de matrix do método, que
matrix[0] = new double[1]; Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
matrix[0][0]=8.5; o mesmo estado se suas
//montando elemento 1 de matrix
2.3.1 Invocação de Métodos
matrix[1] = new double[2]; variáveis membro têm os
matrix[1][0]
Objetos se comunicam = 6.3;
pela troca de mensagens, isto significa que um mesmos valores.
matrix[1][1] = 4.4;
objeto pode ter que mostrar um comportamento particular invocando uma
//montando elemento 2 de matrix
operação apropriada matrix[2]
que foi definida
= newnodouble[3];
objeto. Em Java, isto é feito pela
chamada de um método em um objeto
matrix[2][0] 1.5; o operador binário "." (ponto),
= usando
devendo especificar amatrix[2][1]
mensagem completa:
= 2.9; o objeto que é o recebedor da
matrix[2][1]
mensagem, o método a ser invocado e os = 5.5;
argumentos para o método (se houver).
}
O método} invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor Listagem
de retorno. O método
6.4 – Array's de múltiplaschamado
dimensões deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 49
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
57
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Na Figura 6.1, avalor


//atribuindo matriz,aarray de arrays,
variável é mostrada após os elementos terem sido explicitamente
referência
inicializados.
Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 6.1 – matrix Array Multidimensional

Figura 2.4 – Layout Memória após inicialização


6.5 Copiando Arrays
//criando novo alias
A biblioteca padrão Java disponibiliza um método static, System.arraycopy(), que pode efetuar cópias de
Carro carro2 = carro1;
um array de modo muito mais rápido do que você conseguiria se fosse usar um laço for para efetuar a cópia
manualmente. System.arraycopy() é sobrecarregado para manipular todos os tipos. A seguir há um exemplo que
manipula arrays de int. A sintaxe é:

System.arraycopy( de, indiceDe, para, indicePara, contagem );

Por exemplo, o programa a seguir define dois arrays e depois copia os quatro últimos elementos do
primeiro array para o segundo. A cópia começa na posição 2 do array de origem e copia 4 elementos, começando
na posição 3 do array de destino.

public class CopiaArray {

public static void main(String args[]) {

int[] numerosPrimos = { 2, 3, 5, 7, 11, 13 };


Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
int[] numerosSortudos = { 1001, 1002, 1003, 1004, 1005, 1006, 1007};

System.arraycopy(numerosPrimos, 2, numerosSortudos, 3, 4);


2.3 Membros de Instância
for (int i = 0; i < numerosSortudos.length; i++) {
Cada objeto criado System.out.println("O
deverá ter sua própria instância
elementode
" +variáveis
i + " apósOsa valores
cópia das
é" variáveis
(atributos) definidas pela classe. Os métodos+definem o comportamento de um
numerosSortudos[i]); em um objeto constituem
objeto. Isto é importante,
} pois denota que um método pertence a cada objeto da
o seu estado.
} devemos confundir isto com a implementação do método, que
classe. Porém não
} Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
Listagem 6.5 – Copiando array's o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
6.6 Percorrendo
objeto pode ter que Arrays
mostrarcom
umEnhaced-for
comportamento particular invocando uma
O Java 5.0 traz uma nova
operação apropriada que foi definida sintaxe para percorrermos
no objeto. arrays
Em Java, (e coleções,
isto que veremos mais a frente). Este
é feito pela
laço é similar aos laços for-each
chamada de um método em um objeto usando o operador binário "." (ponto), etc.) .
de outras linguagens de programação (Perl,Php, Python,
devendoSintaxe do Enhanced-for:
especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
for (<tipo dado> <variável> : <Expressão>)
O método invocado no recebedor pode também enviar informações de volta ao
<sentença>
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 50
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
58
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

No caso de você não ter necessidade de manter uma variável com o índice que indica a posição do
elemento no array, ou de modificar
//atribuindo valor ao elemento array, podemos usar o enhanced-for. Veja a comparação:
variáveldoreferência
Carro carro1 = new Carro();
Laço for(;;) tradicional
carro1.ano = "2001"; Laço for(:) melhorado
carro1.modelo= "fusca";
idades = {12, =30,
int[] carro1.cor 45, 55};
"prata"; int[] idades = {12, 30, 45, 55};
int somaIdade = 0; int somaIdade = 0;
for (int i = 0; i < idades.length; i++) for (int element : idades)
soma += idades[i]; soma += element;

Tabela 6.1 – Enhanced-for

public class ForEach {

public static void main(String[] args) {

int[] idades = {12,30,45,55};

for (intFigura
i :2.4idades)
– Layout Memória
{ após inicialização
//criando novo alias System.out.print(i + ", ");
}
Carro carro2 = carro1;
}
}
Listagem 6.5 – Percorrendo array's com Enhanced-For

6.7 Manipulando Arrays com java.util.Arrays


Em java.util você encontrará a classe Arrays, que tem um conjunto de métodos static para executar
funções necessárias para a manipulação dos arrays: equals(), para comparar dois arrays em termos de igualdade;
fill(), para preencher um array com um valor; sort(), para ordenar o array; e binarySearch(), para procurar um
elemento em um array ordenado. Todos estes métodos são sobrecarregados para todos os tipos primitivos e
Object. Além disto, há um método específico asList() que transforma qualquer array em um contêiner List, sobre o
qual falaremos mais tarde.

import java.util.Arrays;
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

public class TesteArrays {

2.3 Membros de Instância


public static void main(String[] args) {
Cada objeto int[]
criado numeros
deverá ter sua própria instância de variáveis
= { -1, 2, 120, 0, -275 }; Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem
int[] outrosNumeros = new int[5]; o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir com
// preencha isto com a implementação
algum valor do método, que
Dois objetos distintos têm
Arrays.fill(outrosNumeros, 2, 5, new Double(Math.PI).intValue());
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
// imprimir array como está variáveis membro têm os
2.3.1 Invocação de Métodos
System.out.println("Aqui array numeros não classificado");
Objetos se comunicam pela troca de mensagens, isto significa que um
System.out.println(Arrays.toString(numeros)); mesmos valores.
System.out.println();
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada System.out.println("Aqui
que foi definida no objeto. Em Java, isto é feito pela
array outrosNumeros não classificado");
chamada de um método em um objeto usando o operador binário "." (ponto),
System.out.println(Arrays.toString(outrosNumeros));
devendo especificar aSystem.out.println();
mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no// compare two arrays
recebedor pode também enviar informações de volta ao
if (Arrays.equals(numeros, outrosNumeros)) {
objeto chamador através de um valor de retorno. O método
System.out.println("os doischamado
arraysdeve sãoser
iguais!");
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 51
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
59
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

} else {
System.out.println("os dois arrays são diferentes!");
//atribuindo} valor a variável referência
Carro carro1 = new Carro();
carro1.ano //= classificar
"2001"; o array numeros
carro1.modelo= "fusca";
Arrays.sort(numeros);
carro1.cor = "prata";
// imprime array numeros classificado
System.out.println("Aqui array classificado");
System.out.println(Arrays.toString(numeros));
System.out.println();
}
}
Listagem 6.6 – Manipulando array's com java.util.Arrays

6.8 Fazer Laboratório 4


Siga instruções do laboratório e tome cuidado com o tempo de execução, sempre recorra ao instrutor em
caso de dúvida, nunca deixe uma dúvida sem reposta
Figura 2.4 – Layout Memória após inicialização
6.9 Exercícios novo alias
//criando
Escreva,carro2
Carro compile =
e execute
carro1;todas as listagens de código apresentadas neste capítulo.

7 Programação Orientada a Objetos


7.1 Classes e Objetos
7.1.1 Definindo Classes
Antes de escrever sua classe pense no que ela conhece (variáveis de instância, estado) e no que ela faz
(métodos, comportamento). Procure listar as outras classes que colaborarão com a sua no sentido de prover as
funcionalidades desejadas.
Use nomes apropriados para a classe, atributos e métodos sigam convenção
de nomenclatura Java. Para definir uma classe, escrevemos: Antes de escrever sua
classe pense no que ela
<modificador>* class <nome> {
} conhece (variáveis de
instância, estado) e no
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
<modificador de classe> class <nome> que ela faz (métodos,
<clausula extends> <clausula implements > // Class header comportamento).
{ // corpo da Classe .
2.3 Membros de Instância
<declaraçãoDoAtributo>*
<declaraçãoDoConstrutor>*
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
<declaraçãoDoMétodo>*
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
<classe aninhada>
objeto. Isto é importante, pois denota que um método pertence a cada objeto da
<declaração interface> o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
<bloco de inicialização> Dois objetos distintos têm
é compartilhada
} por todas as instâncias da classe.
o mesmo estado se suas
onde:
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
<modificador> é um modificador de acesso, que pode ser usado em combinação com outros
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
<nome> nome da sua classe
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem
<declaraçãoDoAtributo> completa:
atributos o objeto
definidos para aque é o recebedor da
classe
mensagem, o método a ser invocado e os argumentos para o método (se houver).
<declaraçãoDoConstrutor>
O método invocado no recebedormétodo construtor
pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 52
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
60
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

<declaraçãoDoMétodo> métodos da classe


//atribuindo valor a variável referência
<classe
Carro aninhada>
carro1 = new veremos
Carro();adiante
carro1.ano = "2001";
<declaração interface>"fusca";
carro1.modelo= veremos adiante
carro1.cor = "prata";
<bloco de inicialização> veremos adiante

Neste exemplo, criaremos uma classe que conterá o registro de um estudante. Como já identificamos o
objetivo da nossa classe, agora podemos nomeá-la. Um nome apropriado para nossa classe seria Estudante.
Para definir nossa classe, escrevemos:

public class Estudante {

String nome;
String endereco;
int idade;
double matematicaPontos;
Figura 2.4 – Layout Memória após inicialização
double portuguesPontos;
double cienciaPontos;
//criando novo alias
Carro carro2 = carro1;
}

onde:

public modificador de acesso, permite que esta classe esteja acessível a qualquer outra classe em
qualquer pacote;
class palavra-chave usada para criar uma classe ;
Estudante identificador único que identifica a classe.

7.1.2 Definindo Métodos


Nos exemplos apresentados anteriormente, temos apenas um método, o Um método é um
método main(). Em Java, nós podemos definir vários métodos e podemos chamá-
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto trecho de código
los a partir de outros métodos. distinto que pode ser
Por que é necessário criar métodos? invocado por qualquer
Porque não colocamos todas as instruções dentro de um grande método? outro método para
2.3 Membros de Instância
Conforme uma tarefa cresce e se torna mais complexa, surge uma série de
realizar alguma
situações Cada objeto
a serem criado para
resolvidas deverá que terestesua própria possa
problema instância de variáveis
ser solucionado. Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um operação específica.
em um objeto constituem
Podemos dizer que passamos a ter dentro de um problema uma série de pequenos
objeto. Isto é importante, pois denota que um método pertenceeste a cada emobjeto
partesda .
probleminhas. Assim, conhecido o problema, ao separarmos o seu estado.
classe. Porém não devemos confundir isto com a implementação
menores, nosso trabalho de escrever grandes classes se torna menos crítico e de do método, que
Dois objetos distintos têm
é compartilhada
mais por todas as instâncias da classe.
fácil manutenção. o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Métodos possuem as seguintes características:
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode
 ter que
Podem mostrar
ou não umum
retornar comportamento
valor. particular invocando uma
operação apropriada que ou
Podem aceitar foinão
definida no objeto. Em Java, isto é feito pela
argumentos.
chamada deApós
um método
o métodoem um objeto
encerrar usando o fluxo
sua execução operador binárioé"."
de controle (ponto),
retornado
devendo especificar
a quem o achamou.
mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O métodoA forma geralno
invocado para declaração
recebedor de um
pode métodoenviar
também é informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 53
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
61
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

<modificadores método> <tipo retorno> <nome do método> (<lista de parâmetros formais>)


<clausula
//atribuindothrows> // prototipação
valor a variáveldo método
referência
{ // Corpo
Carro do método
carro1 = new Carro();
<variáveis locais>
carro1.ano = "2001";
<classes locais aninhadas>
carro1.modelo= "fusca";
carro1.cor
<sentenças> = "prata";
}

Além do nome do método é possível especificar as seguintes informações:


 modificador de escopo ou acessibilidade.
 outros modificadores de métodos (static, final, abstract, synchronized, native, transient, volatile)
 o tipo do valor a ser retornado ou void se o método não retornar qualquer valor
 lista de parâmetros formais
 cláusula throws, para tratamento de exceções a ser vista em capítulo posterior.

Os parâmetros formais é uma lista, de parâmetros usados para passar informação ao método quando este
é invocado e são separados por vírgula. Uma lista de parâmetros vazia deve ser especificada dentro dos parenteses.
Figura 2.4 – Layout Memória após inicialização
Cada parâmetro é uma simples declaração de variável que consiste em seu tipo e nome:
//criando novo alias
Carro carro2
<modificador = carro1;
do parâmetro> <tipo> <nome do parâmetro>
Objetos têm estado
Os nomes do parâmetro são variáveis locais ao método. O modificador de (variáveis de instância)
parâmetro final será discutido num próximo momento. e comportamento
O nome do método e a lista de parâmetros formais compreendem a (métodos).
assinatura de um método. O corpo do método é um bloco que contém as declarações .
de variáveis locais e as sentenças do método.
Da mesma maneira que as variáveis membro, os métodos membro podem ser
caracterizados como:
 métodos de estáticos, usa modificador static
 métodos de instância, sem modificador

7.1.2.1 Definindo Métodos na Classe


Sabemos que objetos têm estado e comportamento, representados pelas variáveis de instância e
métodos. Mas até o momentoFigura não2.5relacionamos
– Layout Memóriaestes
duas variáveis referência para
dois princípios doso mesmo objetoNo código abaixo, estamos
objetos.
adicionando uma operação à classe Estudante, esta operação atua sobre o estado do objeto, não alterando, mas
informando. Veja a definição da operação getMedia(). Também definimos uma nova classe EstudanteExemplo,
2.3 criarMembros
para e manipularde Instância
instâncias da classe Estudante.
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
class
(atributos) Estudante
definidas {
pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
String nome;
classe. Porém não devemos confundir isto com a implementação do método, que
String endereco; Dois objetos distintos têm
é compartilhadaintpor todas as instâncias da classe.
idade;
double matematicaPontos; o mesmo estado se suas
2.3.1 double
Invocação portuguesPontos;
de Métodos variáveis membro têm os
double cienciaPontos;
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um /**
método em um objeto usando o operador binário "." (ponto),
* Calcula a media das classes de português, matemática e ciências
devendo especificar
*/
a mensagem completa: o objeto que é o recebedor da
mensagem, o método
publica ser invocado
double e os argumentos
getMedia() { para o método (se houver).
O método invocado no recebedor
double result pode
= 0; também enviar informações de volta ao
objeto chamador result
através de um valor de retorno. O+ método
= (matematicaPontos chamado deve
portuguesPontos ser
+ cienciaPontos) / 3;
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 54
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
62
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

return result;
}
}//atribuindo valor a variável referência
Carro carro1 = new Carro();
carro1.ano
public = "2001";
class EstudanteExemplo {
carro1.modelo= "fusca";
carro1.cor = "prata";
public static void main(String[] args) {

// criar instâncias de objetos para Estudante


Estudante annaRegistro = new Estudante();
Estudante beahRegistro = new Estudante();
Estudante crisRegistro = new Estudante();

// modifica estado, atributo nome dos estudantes


annaRegistro.nome = "Anna";
beahRegistro.nome = "Beah";
crisRegistro.nome = "Cris";
annaRegistro.endereco = "Brasil";
beahRegistro.endereco = "Filipinas";
crisRegistro.endereco = "EUA";
Figurada
// alterar notas 2.4 anna
– Layout Memória após inicialização
annaRegistro.matematicaPontos
//criando novo alias = 6.5;
annaRegistro.portuguesPontos
Carro carro2 = carro1; = 8.9;
annaRegistro.cienciaPontos = 9.5;

// mostrar o nome de anna


System.out.println(annaRegistro.nome);
// mostrar a media da anna
System.out.println("Media=" + annaRegistro.getMedia());
}
}
Listagem 7.1 – Criando uma classe

7.1.3 Métodos de Instância e a Referência this


Métodos de instância são compartilhados entre objetos da mesma classe,
diferentemente das variáveis de instância onde se tem uma para cada objeto. Deste
modo deve haver alguma "mágica" Figura 2.5 para
– Layoutque o interpretador
Memória Java para
duas variáveis referência saiba qualobjeto Métodos de instância
o mesmo
referência está invocando um método! E há, a grosso modo, toda invocação de são compartilhados
método passa, além dos parâmetros formais, um argumento extra que é a referência entre objetos da
do objeto chamador do método. Para entender isso melhor, tomemos o método
2.3 Membros de Instância mesma classe,
setIdade(int i) como exemplo, ao ser invocado os argumentos passados ao método
Cada objeto criado deverá ter sua própria instância de variáveis diferentemente
Os valores das das
variáveis
seriam como em setIdade(refobjeto, 10), onde refobjeto é a referência do objeto
(atributos) definidas pela classe. Os métodos definem o comportamento
chamador. Isto é feito de forma implícita por Java. Não espere que o compilador Java de um variáveis de instância
em um objeto constituem
objeto.chamadas
aceite Isto é importante,
como estapois em denota
seu código.que O umexemplo
métodoé pertence
para te dar a cada
uma objeto
idéia doda onde seotem seuuma para
estado.
classe. Porém não devemos confundir isto com a implementação do método, que
que acontece. Doiscada objeto.
objetos distintos têm
é compartilhada por todas as instâncias da classe.
Suponha que você esteja dentro de um método e queira obter a referência o mesmo. estado se suas
para o objeto corrente, como fazer? Para este propósito podemos usar a palavra variáveis membro têm os
2.3.1 this.
chave Invocação
A palavrade Métodos
chave this — que só pode usada dentro de um método -
mesmos valores.
contém aObjetos
referênciase para
comunicam
o objetopela cujotroca
métodode mensagens, isto significa
está sendo chamado. Vocêque um
pode
objetoesta
tratar pode ter que
referência comomostrar
qualquer umoutra
comportamento particular
referência a objeto. Perceba invocando
que, se vocêuma
operação
está chamandoapropriada
um métodoque mA()
foi definida no objeto.
de uma classe a partirEm de Java,
outro isto
método é feito
mB()pela
da
chamada de um método em um objeto usando o operador
mesma classe, você não precisa usar this. Você simplesmente invoca o método. A binário "." (ponto),
devendo this
referência especificar
correnteaé mensagem
automaticamente completa:
usadaopeloobjeto
outroque é o recebedor da
método.
mensagem, o método
A referência a ser
this é deinvocado e os argumentos
grande utilidade para o
em situações método
onde o nome (se de
houver).
uma
variável
O método localinvocado
conflita com o nome da pode
no recebedor variável de instância.
também enviarPor exemplo: de volta ao
informações
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 55
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
63
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

class Estudante{
//atribuindo valor a variável referência
int idade;
Carro carro1 = new Carro();
carro1.ano = "2001";
public void setIdade(int idade){
carro1.modelo= "fusca";
carro1.cor idade
= "prata";
= idade; // Não é uma boa prática

}
}

O nome do argumento nesta declaração é idade (linha 3), que tem o mesmo nome do atributo de objeto
idade (linha 2). Já que o argumento idade é local ao método, o valor do argumento idade será usado, na instrução:

idade = idade;

Neste caso estamos simplesmente associando o valor do argumento idade para si mesmo! Isto não é o que
queremos que aconteça neste código. A fim de corrigir esse equivoco, usamos a referência this para fazer a
distinção entre os nomes. Para utilizar a referência
Figura 2.4 –this , digitamos:
Layout Memória após inicialização

//criando novo alias


this.<nomeDoAtributo>
Carro carro2 = carro1;

O ideal é reescrever o nosso método do seguinte modo:

public void setIdade(int idade){

this.idade = idade;
}

Este método irá atribuir o valor do argumento idade para o atributo de objeto idade do objeto Estudante.

7.1.4 Sobrecarga de Métodos (Overloading)


Nas nossas classes, podemos necessitar de criar métodos que tenham os
mesmos nomes, mas que funcionem de maneira diferente dependendo dos Sobrecarga de métodos
argumentos que informamos. Esta capacidade é chamada de SOBRECARGA (ou permite que um método
overloading em inglês) de métodos. Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto com o mesmo nome,
Sobrecarga de métodos permite que um método com o mesmo nome, entretanto com
entretanto com diferentes tipos ou quantidade de argumentos, possa ter diferentes tipos ou
2.3 Membros
implementações de Instância
diferentes e retornar valores de diferentes tipos. Ao invés de quantidade de
inventar novos nomes todas
Cada objeto criado as vezes,
deveráa sobrecarga de métodos
ter sua própria pode ser
instância de utilizada
variáveis Os valores das
argumentos, possa ter
variáveis
quando a mesma
(atributos) operação
definidas tem implementações
pela classe. Os métodos definemdiferentes.o comportamento de um implementações
em um objeto constituem
Por éexemplo,
objeto. Isto na nossa
importante, classe Estudante,
pois denota que um métodoqueremos ter um
pertence método
a cada objetoque
da diferentes
o seue estado.
retornar
mostre
classe. as informações
Porém sobre oconfundir
não devemos estudante. Entretanto,
isto queremos quedo
com a implementação o método
método,printque
mostre dados diferentes dependendo dos daargumentos
valores de diferentes
Dois objetos distintos têm
é compartilhada por todas as instâncias classe. que lhe informamos. tipos.
Por exemplo, quando não enviamos qualquer argumento queremos que o o mesmo estado se suas
método print mostre o nome, endereço e idade do estudante. Quando passamos um
2.3.1 Invocação de Métodos variáveis membro têm os
argumento do tipo String, queremos que o método mostre esta String mais o nome mesmos valores.
Objetos se comunicam pela troca de mensagens, isto significa que um
e as notas do estudante.
objeto pode ter que mostrar um comportamento particular invocando uma
Teremos os seguintes métodos dentro da nossa classe Estudante:
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada método
de umvoid
public em um objeto usando o operador binário "." (ponto),
print(){
devendo especificar a mensagem completa: o +objeto
System.out.println("nome:" nome); que é o recebedor da
mensagem, o método a ser invocado e os argumentos para
System.out.println("endereco:" o método (se houver).
+ endereco);
O método invocadoSystem.out.println("idade:"
no recebedor pode também enviar + idade);informações de volta ao
}
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 56
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
64
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

public void print(String msg){


System.out.println(msg);
//atribuindo valor a variável referência
System.out.println("nome:" + nome);
Carro System.out.println("Nota
carro1 = new Carro(); de Matematica:" + matNota);
carro1.ano = "2001";
System.out.println("Nota de Portugues:" + portNota);
carro1.modelo= "fusca";
System.out.println("Nota de Ciencias:" + cienNota);
}carro1.cor = "prata";

Quando tentamos chamar estes métodos no método main(), criado para a classe EstudanteExemplo:

public static void main(String[] args) {

Estudante annaRegistro = new Estudante();

annaRegistro.nome="Anna";
annaRegistro.endereco="Philippines";
annaRegistro.idade=15;

// sobrecarga de métodos
annaRegistro.print();
Figura 2.4 – Layout Memória após inicialização
annaRegistro.print("Situação do(a) Aluno(a) ");
}//criando novo alias
Carro carro2 = carro1;
Teremos diferentes saídas para a chamada ao método print.
Lembre-se sempre de que métodos sobrecarregados possuem as seguintes propriedades:
1. o mesmo nome
2. lista de parâmetros formais diferentes
3. definido na mesma classe
O principal propósito dos
7.1.5 Construtores
Utilizado quando há uma chamada com o operador new. São como construtores são
métodos mas a assinatura de um construtor é diferente de um método, temos as inicializar o estado de um
propriedades de um construtor: objeto quando este é
criado.
1. Devem ter o mesmo nome da classe
2. Construtor são como métodos, entretanto, somente as seguintes
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
informações podem ser colocadas no cabeçalho do construtor:
 Escopo ou identificador de acessibilidade (como public, private)
 Nome do construtor
2.3 Membros
 Lista dede Instânciaformais, opcional
parâmetros
3. Cada
Não objetovalor
retornam criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos)
4. definidas
Somente pela classe.
são invocados Os métodos
usando operadordefinem
new duranteo comportamento
a instanciação da de um em um objeto constituem
objeto. classe
Isto é ou
importante,
dentro de pois
outrodenota
construtorque usando
um métodothis()pertence
e/ou super() a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
Para declarar
é compartilhada por todas as instâncias um construtor, escrevemos:
da classe.
o mesmo estado se suas
Toda classe tem o variáveis membro têm os
[modificador] <nomeClasse> (<argumento>*) {
2.3.1 Invocação de Métodos
seu construtor mesmos valores.
Objetos se comunicam <instrução>*
pela troca de mensagens, isto significa que um
padrão. }
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
7.1.6 Construtor
devendo especificar a mensagem Padrão
completa: o (default)
objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos épara
O construtor padrão umoconstrutor
método (sepúblico e sem argumentos. Se não for
houver).
O método invocado no recebedor pode também enviar informações de volta aoJava automaticamente definirá
definido um construtor para a classe, então, o compilador
um construtor padrão para a classe.
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 57
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
65
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Por exemplo, na nossa classe Estudante, o construtor padrão é definido do seguinte modo:
//atribuindo valor a variável referência
Estudante()
publiccarro1
Carro {}
= new Carro();
carro1.ano = "2001";
7.1.7 Overloading de Construtores
carro1.modelo= "fusca";
Construtores podem
carro1.cor sofrer sobrecarga (overloading), por exemplo, temos aqui
= "prata"; Construtores podem
quatro construtores: sofrer sobrecarga
(overloading).
public Estudante() {
// qualquer código de inicialização aqui
}

public Estudante(String temp){


this.nome = temp;
}

public Estudante(String nome, String endereco) {


this.nome = nome;
this.endereco = endereco;
Figura 2.4 – Layout Memória após inicialização
}
//criando novo alias
Carro carro2
public = carro1; matematica, double portugues, double ciencia) {
Estudante(double
matematicaNota = matematica;
portuguesNota = portugues;
cienciaNota = ciencia;
}

7.1.8 Usando Construtores


Para utilizar os construtores, definidos na seção anterior, temos as seguintes instruções:

public static void main(String[] args) {


// criar três objetos para o registro do estudante
Estudante annaRegistro = new Estudante("Anna");
Estudante beahRegistro = new Estudante("Beah", "Filipinas");
Estudante crisRegistro = new Estudante(80,90,100);
// algum código a partir daqui
}
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

Ao criar um novo objeto o construtor será invocado, logo após a alocação das variáveis de instância.
Vejamos o seguinte exemplo, vamos adicionar o atributo estático static int refCount à classe Estudande (linha 3):
2.3 Membros de Instância
Cada Estudante{
class objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
int idade;
(atributos) definidas pela classe. Os métodos definem o comportamento de um
static int refCount; em um objeto constituem
objeto. Isto é importante,
public void poissetIdade(int
denota que um idade){
método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
idade = idade; // Não é uma boa prática Dois objetos distintos têm
é compartilhada } por todas as instâncias da classe.
} o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
OObjetos
propósito
se de refCount épela
comunicam contar o número
troca de objetosisto
de mensagens, quesignifica
são instanciados mesmos
que um a partir da valores.
classe Estudante.
Então,
objeto opode
que desejamos é incrementar
ter que mostrar o valor de refCount
um comportamento todainvocando
particular vez que umumaobjeto da classe Estudante é
instanciado. Os construtores são um bom local para modificar e incrementar
operação apropriada que foi definida no objeto. Em Java, isto é feito pela o valor de refCount, pois ao menos um
deles certamente será invocado quando um objeto Estudante for instanciado.
chamada de um método em um objeto usando o operador binário "." (ponto), Por exemplo:
devendo especificar a mensagem completa: o objeto que é o recebedor da
public Estudante() {
mensagem, o método a ser invocado
refCount++; e os argumentos
// adicionar para o método (se houver).
um estudante
O método
} invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 58
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
66
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

public Estudante(String nome) {


refCount++; // adicionar um estudante
//atribuindo
this.nomevalor a variável referência
= nome;
Carro
} carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo=
public "fusca";nome, String endereco) {
Estudante(String
carro1.cor = "prata";
refCount++; // adicionar um estudante
this.nome = nome;
this.endereco = endereco;
}

public Estudante(double matematica, double portugues, double ciencia) {


refCount++; // adicionar um estudante
matematicaNota = matematica;
portuguesNota = portugues;
cienciaNota = ciencia;
}

7.1.9 Utilizando o Construtor this( )


Chamadas a construtores podemFigura
ser 2.4
encadeados, o que
– Layout Memória após significa
inicializaçãoser possível chamar um construtor a
partir de outro construtor. Usamos uma invocação a this() para isso. Por exemplo, dado o seguinte código:
//criando novo alias
Carro carro2 = carro1;
public Estudante() {
this("alguma string");
}

public Estudante(String temp) {


this.nome = temp;
}

public static void main( String[] args ) {


Estudante annaRegistro = new Estudante();
}

No código acima, quando se executa a instrução do método o main() (linha 8), será chamado o construtor
padrão (linha 1). A instrução inicial (linha 2) deste construtor resultará na chamada ao segundo construtor (linha 4).
Há algum regras para utilização da chamada ao construtor por this():
1. A chamada ao construtor DEVE
Figura 2.5 – Layout SEMPRE
Memória OCORRER
duas variáveis NApara
referência PRIMEIRA
o mesmo objeto
LINHA DE INSTRUÇÃO Como boa prática de
2. UTILIZADO PARA A CHAMADA DE UM CONSTRUTOR. A chamada ao
programação, é ideal
2.3 Membros this() pode ser seguida por outras instruções.
de Instância nunca construir
Como boa prática
Cada objeto de deverá
criado programação,ter sua é ideal
próprianunca construir
instância demétodos
variáveis métodos
Os valores das variáveis
que repitam as
que repitamdefinidas
(atributos) as instruções.
pela Buscamos
classe. Os amétodos
utilizaçãodefinem
de sobrecarga com o objetivo
o comportamento dedeum
evitarmos em um objeto
instruções. constituem
objeto. Istoessa repetição. Deste
é importante, modo, que
pois denota reescreveremos
um método os construtores
pertence a cadadaobjeto
classeda
o seu
Buscamos estado.
a utilização
Estudante, definida na seção 7.16, para reutilizar o construtor default:
classe. Porém não devemos confundir isto com a implementação do método, que
Dois
de objetos distintos
sobrecarga com o têm
é compartilhada por todas as instâncias da classe.
public Estudante() { o mesmo
objetivo estado se suas
de evitarmos
refCount++; // adicionar um estudante
essa repetição.
variáveis membro têm os
2.3.1 }Invocação de Métodos
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
pode terEstudante(String
objeto public nome) {
que mostrar um comportamento particular invocando uma
this();// construtor default
operação apropriada que foi
this.nome = nome;definida no objeto. Em Java, isto é feito pela
chamada} de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
public
mensagem, Estudante(String
o método a ser invocado enome, String para
os argumentos endereco)
o método{ (se houver).
this(nome);
O método invocado no recebedor= pode
this.endereco também enviar informações de volta ao
endereco;
objeto chamador
} através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 59
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
67
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

public Estudante(double matematica, double portugues, double ciencia) {


//atribuindo
this(); valor a variável
// adicionar referência
um estudante
Carro matematicaNota
carro1 = new Carro();
= matematica;
carro1.ano = "2001";
portuguesNota = portugues;
carro1.modelo= "fusca";
cienciaNota = ciencia;
}carro1.cor = "prata";

7.2 Fazer Laboratório 5


Siga instruções do laboratório e tome cuidado com o tempo de execução, sempre recorra ao instrutor em
caso de dúvida, nunca deixe uma dúvida sem reposta.

7.3 Herança
Como já vimos no capítulo 2, uma das formas de criarmos novas classes é fazê-lo através de herança, o
que nos proporcionará uma grande vantagem em relação a outros paradigmas de programação, pois assim
podemos reutilizar código que seja comum às classes (lembre-se: reuso é algo mais eficiente e menos falho do que
"copiar e colar").
Um exemplo de hierarquia de classes
Figuraé2.4
mostrado Figura
com a após
– Layout Memória 7.1.
inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

Figura 7.1: Hierarquia de Classes

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
Definimos código comum a uma determinada classe (superclasse) e definimos
(atributos) definidas pela classe. Os métodos definem o comportamento de um Todas as classes são
código mais específico em classes que herdam (subclasse) as características da classe em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da subclasses da classe
o seu estado.
mais genérica.
classe. Porém não devemos confundir isto com a implementação do método, que Object.
Em Java, dizemos que a subclasse estende a superclasse. Um relacionamento Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
de herança significa que a subclasse herdará membros (atributos e operações – o mesmo estado se suas
métodos e variáveis de instância) da superclasse. variáveis membro têm os
2.3.1 Invocação de Métodos
A classe Object é a classe ancestral de todas as outras. O compilador Java,
Objetos se comunicam pela mesmos valores.
automaticamente, insere a definição da troca depara
herança mensagens, isto significa
todas as definições que um
de classes.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método
7.3.1 Definindo em um
Superclasses objeto usando o operador binário "." (ponto),
e Subclasses
devendoParaespecificar
criar umaa mensagem
nova classe completa:
por herançao objeto
usamosque é o recebedor
a palavra-chave da
extends.
mensagem, ocriando
Ilustraremos método umaa ser invocadode
superclasse e os argumentos
exemplo, para
a partir o métodoUML:
do diagrama (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 60
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
69
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Figura 7.2 – Exemplo de Generalização
Carro carro2 = carro1;

public class Funcionario {

double salario;
java.util.Date dataContrato;
String nome;
String cargo="indefinido";

public Funcionario(){}

public Funcionario(String nome,double salario,


java.util.Date dataContrato) {
this.salario = salario;
this.dataContrato = dataContrato;
this.nome = nome;
} Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

void bonusSalario (double percentual) {


salario *= 1 + percentual / 100;
2.3 Membros
} de Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
}
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
Listagem 7.2 – Definindo classe Funcionario
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
Vamos criar
é compartilhada por outra
todas classe chamada
as instâncias da Gerente.
classe. E, como um gerente também é-um funcionário, concluímos
o mesmo estado se suas
que podemos estendê-la da classe Funcionario, assim, poderemos herdar todas as propriedades existentes nesta
classe.
2.3.1 Veja o código:de Métodos
Invocação variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
class Gerente extends Funcionario {
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada
double que foi definida no objeto. Em Java, isto é feito pela
bonus;
chamada de um método em
String secretaria;um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
String cargo;
mensagem, o método a ser invocado e os argumentos para o método (se houver).
public Gerente(String nomeGerente,double salarioGerente,
O método invocado no recebedor pode também enviar informações de volta ao
java.util.Date dataContratoGerente,String secretaria) {
objeto chamador através de um valor
nome=nomeGerente; de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 61
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
70
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

salario = salarioGerente;
dataContrato = dataContratoGerente;
//atribuindo valor a variável
this.secretaria referência
= secretaria;
Carro carro1 = new Carro();
cargo="gerente";
carro1.ano = "2001";
carro1.modelo= "fusca";
bonus = 0.0;
carro1.cor
} = "prata";

void bonusLucro (double lucro) {


bonus += lucro * 0.01;
}

}
Listagem 7.3 – Definindo classe Gerente por herança

Agora Responda! Quem nasce primeiro os filhos ou os pais? Se nós chamarmos a superclasse de "pai" da
subclasse, quem deve ser criado primeiro?
A classe Gerente usa seu próprio construtor para fazer as inicializações necessárias, observe que fazemos
FiguraFuncionario.
acesso direto às variáveis membros da classe Isto após
2.4 – Layout Memória só éinicialização
possível porque no processo de criação dos
objetos, //criando
os construtores das superclasses
novo alias são invocados antes dos construtores das subclasses, uma vez que as
subclasses podem depender de
Carro carro2 = carro1; partes definidas na superclasse, estas têm que estar completamente formadas
antes que as partes da subclasse sejam construídas.
Outros atributos foram acrescentados à classe Gerente, como um bônus por produtividade e nome da
secretária do gerente. Após isso, as instruções dentro do construtor da subclasse são executadas. Para ilustrar,
considere o seguinte código:

public class MainGerente {

public static void main(String[] args) {

//uma instancia de calendar


java.util.Calendar database = java.util.Calendar.getInstance();

//configura data de contratacao do funcionario


database.set(2005, 6, 10);

Figura 2.5 –de


//instancia Layout Memória duas variáveis referência para o mesmo objeto
Gerente
Gerente funcionario = new Gerente("Hide Otta",1999.99,
database.getTime(), "Effe Ciente");
2.3 Membros de//invoca
Instânciamétodo da heranca
Cada objeto funcionario.bonusSalario(2);
criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os
//invoca métodos
método da definem o comportamento de um
instancia
em um objeto constituem
funcionario.bonusLucro(10000.00);
objeto. Isto é importante, pois denota que um método pertence a cada objeto da
//imprime estado desta instancia de Gerente o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
System.out.println("Nome funcionario: Dois objetos distintos têm
" + funcionario.nome);
é compartilhada por todas as instâncias da classe.
System.out.println("Cargo: " + funcionario.cargo);
System.out.println("Secretariado por : "+ funcionario.secretaria);
o mesmo estado se suas
System.out.println("Salario base: " +
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
String.format("%,.2f", funcionario.salario));
System.out.println("Salario + Comissao: " +
objeto pode ter que mostrar um comportamento particular invocando uma
String.format("%,.2f", (funcionario.salario+
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
funcionario.bonus)));
chamada de um método em um objeto usando o operador binário "." (ponto),
}
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,
} o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
Listagem 7.4 – Usando as classes Funcionario e Gerente
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 62
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
71
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

7.3.2 Chamando
//atribuindoConstrutor
valorsuper() e Referência
a variável super
referência
No exemplo
Carro anterior,
carro1 = newListagem 7.3, a classe Gerente definiu um construtor. Grande parte do que ele faz é
Carro();
configurar as variáveis membro
carro1.ano da superclasse. Observe que as mesmas operações também são definidas em um
= "2001";
carro1.modelo=
dos construtores "fusca"; E o reuso como fica? Será que posso invocar o construtor da superclasse
da classe Funcionario.
carro1.cor
para reaproveitar = "prata";
o código?
Para nossa comodidade a resposta é sim. Uma subclasse pode invocar explicitamente um construtor de
sua superclasse imediata. Isso é feito utilizando a chamada de construtor super(). Uma invocação a super(), no
construtor de uma subclasse, irá resultar na execução de um construtor específico da superclasse, sendo este
diferenciado com base nos argumentos passados.
Remodelando o construtor da classe Gerente:

public GerenteM(String nome,double salario,


java.util.Date dataContrato,String secretaria) {

//invoca construtor superclasse


super(nome,salario,dataContrato);
= secretaria;
this.secretaria Figura 2.4 – Layout Memória após inicialização
cargo="gerente";
//criando bonus
novo alias
= 0.0;
Carro carro2 = carro1;
}
Listagem 7.5 – Invocando construtor da superclasse

Este código chama o construtor não padrão de sua superclasse imediata (a classe Funcionario) e a executa.
Devemos relembrar, quando usamos uma chamada ao super():
1. A instrução super() DEVE SER A PRIMEIRA INSTRUÇÃO EM UM CONSTRUTOR.
2. As instruções this() e super() não podem ocorrer simultaneamente no mesmo construtor.

Repare que tanto na superclasse Funcionario quanto na subclasse Gerente, está definido o atributo cargo,
veja que este atributo é inicializado no construtor da subclasse Gerente, então quem fica com a referência para
String "gerente", o atributo da superclasse ou da subclasse? Neste caso dizemos que a variável da superclasse está
shadowed ou seja sendo ocultada pela definição de uma variável com mesmo nome na subclasse.
Para resolver conflitos de nomes, como apresentado no parágrafo anterior, ou simplesmente fazer
referência aos membros da superclasse, podemos
Figura 2.5 – Layout usar
Memória a referência
duas de objeto
variáveis referência super.objeto
para o mesmo Exemplo:

public GerenteM(String nome,double salario,


java.util.Calendar dataContrato,String secretaria) {
2.3 Membros de Instância
Cada objeto criado deverá
//invoca ter sua
construtor própria instância de variáveis
superclasse Os valores das variáveis
super(nome,salario,dataContrato);
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
this.secretaria = secretaria;
objeto. Isto é importante, pois denota
//atributo quesuperclasse
cargo um método pertence a cada objeto da o seu estado.
classe. Porém não devemos
super.cargo="gerente";a implementação do método, que
confundir isto com
Dois objetos distintos têm
é compartilhada por todas as instâncias
//atributo cargoda na
classe.
classe corrente
this.cargo="gerente"; o mesmo estado se suas
bonus = 0.0;
2.3.1 }Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
Listagem 7.6 – Referênciando membros da superclasse
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
7.3.3 Modificador
chamada de Classe
de um método em final
um objeto usando o operador binário "." (ponto),
devendo especificar a mensagemque
Podemos declarar classes não permitem
completa: o objeto a herança.
que é Estas classes são
o recebedor da chamadas classes finais. Para
definir que uma classe seja final, adicionamos a palavra-chave final
mensagem, o método a ser invocado e os argumentos para o método (se houver). da classe (na posição do
na declaração
modificador).
O Por exemplo,
método invocado desejar
se vocêpode
no recebedor também classe Gerente
que a enviar não possa
informações ter classes
de volta ao filhas - ser estendida, ou
herdada por outra classe - você deverá escrever:
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 63
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
72
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

public final class Gerente {


//atribuindo valor a variável referência
// Código da classe aqui
Carro carro1 = new Carro();
}
carro1.ano = "2001";
carro1.modelo= "fusca";
Muitas classes na=API"prata";
carro1.cor Java são declaradas final para certificar que seu comportamento não seja herdado e
possivelmente modificado. Exemplos são as classes Integer, Double, Math e String.

7.4 Polimorfismo
Um mesmo método pode apresentar várias formas, de acordo com seu contexto. O polimorfismo é
importante pois permite que a semântica de uma interface seja efetivamente separada da implementação que a
representa.
O termo polimorfismo é originário do grego e significa muitas formas (poli = muitas, morphos = formas).
(ver wikipedia).
Entendeu? Não! Então tenha calma, vamos explicar!
Na prática, se temos uma hierarquia de classe como na figura abaixo:

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 7.3 – Polimorfismo e Herança

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
então podemos fazer a seguinte declarações:

Animal cao = new Cachorro();


2.3 Membros de Instância
Animal bichano = new Gato();
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento
ou seja, uma variável de referência de uma classe mais genérica (superclasse) de um Polimorfismo
em um objeto permite
constituem
objeto. Isto é importante, pois denota que um método pertence a cada
pode receber referência de objetos de classes mais especializadas (subclasses). objeto da que referências de tipos
o seu estado.
classe.assim,
Sendo Porémpodemos
não devemos
também confundir
declarar:isto com a implementação do método, que de classes mais abstratas
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe. (genéricas) representem
o mesmo estado se suas
Animal bicho; o comportamento
variáveis membro dastêm os
2.3.1 bicho
Invocação= new Cachorro();
de Métodos classes concretas que
bicho.fazerRuido(); //ruído é o latir de cachorro
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
bicho = new Gato(); referenciam.
objeto bicho.fazerRuido();
pode ter que mostrar um comportamento
//ruído é o miar particular
do gato invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaOde um método
método fazerRuido(), objeto usando
em um definido o operador
como uma binárioda
característica "."classe
(ponto),
devendofoiespecificar
Animal, sobrepostoapelas
mensagem completa:
versões do o objeto
método nas que Cachorro
subclasses é o recebedor
e Gato, da
mensagem,
embora o método
possuam a serassinatura
a mesma invocado e(mesmo
os argumentos para o método
nome, número (se houver).
de parâmetros e
O método
tipos invocado no
dos parâmetros), recebedor
eles apresentampode tambémcom
resultados enviar informações
formas diferentes.de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 64
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
73
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

7.4.1 Coleções Heterogêneas de Objetos


//atribuindo valorarrays,
Em nosso estudo sobre vimos quereferência
a variável ele é uma estrutura de dados que armazena diversos elementos
do mesmo tipo de
Carro dados,=desde
carro1 new tipos primitivos bem como referências para outros objetos. Agora imagine-se
Carro();
formando um petshop a partir
carro1.ano da hierarquia de classes apresentada na Figura 7.3, onde temos definidos, além das
= "2001";
classes Cachorro e Gato, as classes
carro1.modelo= "fusca";Canario e Coelho. Sem polimorfismo, essa tarefa nos levaria a definir uma
estruturacarro1.cor = tipo
de array para cada "prata";
de animal em nossa loja, exemplo:

//coleção de Cachorros
Cachorro [] caes = new Cachorro[3];
caes[0] = new Cachorro("Raja");
caes[1] = new Cachorro("Lilica");
caes[2] = new Cachorro("Lupi");

//coleçao de Coelhos
Coelho [] peludos = new Coelho[3];
peludos[0]=new Coelho("Fred");
peludos[1]=new Coelho("Fofão");

O recurso do polimorfismo nos permite criar


Figura 2.4 – Layout único array
um Memória para nossa coleção de animais, veja:
após inicialização

//criando novo alias


//cria coleção
Carro carro2 = carro1;
Animal[] bichos = new Animal[10];

//atribui referencia a coleção


bichos[0] = new Cachorro("Raja");
bichos[1] = new Gato("Garfield");
bichos[2] = new Canario("Piupiu");
bichos[3] = new Coelho("Pernalonga");
bichos[4] = new Coelho("Lilica");
bichos[5] = new Gato("Frajola");

Uma vez que toda classe em Java estende a classe Object, é possível manipular coleções genéricas para
todos os tipos de dados, inclusive de valores de tipos primitivos (neste caso devemos fazer uso das classes
empacotadoras):

Object[] primitivos = new Object[3];


primitivos[0] = new
FiguraInteger(10);
2.5 – Layout Memória duas variáveis referência para o mesmo objeto
primitivos[1] = new Double(2.2);
primitivos[2] = new Character("C");

2.3 Determinando
7.4.2 Membros dea Classe Instância
de um Objeto
Um dos problemas que deverá
Cada objeto criado ter suaao própria
enfrentaremos lidar cominstância
referênciasde genéricas
variáveispara objetos
Os valores das variáveis
de subclasses, é
(atributos) definidas pela classe. Os métodos definem o comportamento
que não sabemos mais a qual classe pertence a referência armazenada. Reveja nosso em de um um objeto
exemplo constituem
da coleção de
objeto. Isto
animais, é importante,
a qual pois adenota
classe pertence quede
referência umobjeto
método pertence em
armazenada a cada objeto da
bichos[4]? Tudo bem você o olhou
seu estado.
o código-
fonte e descobriu que é do tipo Coelho, mas nem sempre isso é possível. Então que
classe. Porém não devemos confundir isto com a implementação do método, como determinar a classe de umtêm
Dois objetos distintos
é compartilhada por todas as instâncias da classe.
objeto? o mesmo estado se suas
Existem duas maneiras de se descobrir a qual classe determinado objeto pertence:
2.3.1 Invocação de Métodos variáveis membro têm os
1. Obtendo-se o nome da classe: Utiliza-se o método getClass() que retorna a classe do objeto (onde Class
é a classe Objetos
em si) que sepossui
comunicam
o métodopelachamado
troca degetName()
mensagens, que isto significa
retorna o nome que
daumclasse. mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
Por exemplo:
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaString
de um namemétodo= bichos[4].getClass().getName();
em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,2. Testar se uma ser
o método objeto qualquer
invocado e osfoi instanciadopara
argumentos de ouma determinada
método classe: Utiliza-se a palavra-chave
(se houver).
instanceof.
O método invocado no recebedor pode também enviar informações de volta àao
Esta palavra-chave possui dois operadores: a referência para o objeto esquerda e o nome da classe à
direita. A expressão retorna um booleano dependendo de o
objeto chamador através de um valor de retorno. O método chamado deve serobjeto ser uma instância da classe declarada ou
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 65
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
74
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

qualquer uma de suas subclasses. Por exemplo:


//atribuindo valor a variável referência
Stringcarro1
Carro ex1 = "Polimorfismo";
= new Carro();
System.out.println(ex1 instanceof String);//retorna true
carro1.ano = "2001";
String ex2;
carro1.modelo= "fusca";
System.out.println(ex2 instanceof String);//retorna false,referencia null
carro1.cor = "prata";

7.4.3 Casting de Referências de Objetos


No item 7.4.1, usamos os recursos de polimorfismo para referenciar qualquer objeto como Object, isso
nos permitiu criar coleções heterogêneas. Podemos até passar argumentos genéricos para métodos, um método
que recebe uma referência a Object como argumento, isto é, qualquer objeto criado em Java. Todas as vezes que
provocamos uma mudança no tipo da referência de subclasse para o da superclasse dizemos que houve up-casting.
Veja exemplo,

public class Database {


private Object[] dados;
private int posicao = 0;
Figura 2.4 – Layout Memória após inicialização
public
//criando Database(int
novo alias tamanho) {
dados = new
Carro carro2 = carro1; Object[tamanho];
}
public void insere(Object object) {
this.dados[this.posicao] = object;
this.posicao++;
}
public Object retornaObjeto(int indice) {
return this.dados[indice];
}
}
Listagem 7.7 – Paramêtros Genéricos

public class DatabaseGenerico {

public static void main(String[] args) {

//uma Figura 2.5 – Layoutde


instancia Memória duas variáveis referência para o mesmo objeto
calendar
java.util.Calendar data_base = java.util.Calendar.getInstance();

//configura data de contratacao do funcionario


2.3 Membros dedata_base.set(2005,
Instância 6, 10);
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos
//instancia definem o comportamento de um
de Gerente
em um objeto constituem
Gerente funcionario = new Gerente("Hide Otta",1999.99,
objeto. Isto é importante, pois denota que um método pertence a cada objeto da
data_base.getTime(),"Effe oCiente");
seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
//invoca método da heranca Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
funcionario.bonusSalario(2);
o mesmo estado se suas
//invoca método da instancia
2.3.1 Invocação de Métodos variáveis membro têm os
funcionario.bonusLucro(10000.00);
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que //Cria
mostrarumumobjeto
comportamento
Database particular invocando uma
operação apropriada Database
que foi definida
dados no objeto.
= new Em Java, isto é feito pela
Database(10);
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a//Armazena um Gerente no Database
mensagem completa: o objeto que é o recebedor da
dados.insere(funcionario);//ok, up-casting para object
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no//Armazena
recebedor pode
uma também
String enviar informações de volta ao
no Database
objeto chamador através de um valor de retorno.
dados.insere(new O método chamado deve ser
String("Gerente!"));//ok,up-casting para object
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 66
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
75
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

// Como resgatar o Objeto ?


Gerente o_funcionario = dados.retornaObjeto(0); //(1)
//atribuindo valorcompilacao
//erro a variável referência
Carro carro1
//imprimeCarro();
= new estado desta instancia de Gerente
carro1.ano System.out.println("Nome
= "2001"; funcionario: " + o_funcionario.nome);
carro1.modelo= "fusca";
System.out.println("Cargo: " + o_funcionario.cargo);
carro1.cor System.out.println("Secretariado
= "prata"; por : "+ o_funcionario.secretaria);
System.out.println("Salario base: " + String.format(
"%,.2f", o_funcionario.salario));
System.out.println("Salario + Comissao: " + String.format("%,.2f",
(o_funcionario.salario + o_funcionario.bonus)));
}
}
Listagem 7.8 – Todo objeto é Object

Se tentarmos recuperar a referência armazenada como em (1 – linha 24),

Gerente o_funcionario = dados.retornaObjeto(0); //(1)qual o tipo da classe ?


Figura 2.4 – Layout Memória após inicialização
teremos um erro de compilação, informando que os tipos são incompatíveis.
//criando novo alias
Nós temos certeza de que esse Object é uma referência a um objeto da classe Gerente, já que fomos nós
Carro carro2 = carro1;
que o adicionamos ao objeto Database, a classe que guarda nossa coleção heterogênea de objetos. Mas o
compilador Java não sabe se o que vai ser retornado pelo método será realmente um objeto da classe Gerente.
Então retornaremos a referência Object polimórfica a uma variável do tipo Object,

Object o_funcionario = dados.retornaObjeto(0); //ok

Mas agora não é possível utilizarmos a referência para fazermos acesso aos membros do o objeto Gerente:

System.out.println("Nome funcionario: "+ o_funcionario.nome); //erro

Mas por que? A referência teve uma amnésia?


A resposta para o dilema é que, o compilador decidirá o que você pode referenciar usando como base o
tipo da referência e não o tipo do objeto para o qual ela aponta. Deste modo,é legal fazermos:

System.out.println("funcionario:
Figura 2.5 – Layout Memória"duas
+ variáveis
o_funcionario.toString());
referência para o mesmo objeto //ok

Pois o método toString() é um método definido na classe Object.


Seu objeto Gerente
2.3 Membros não mudou, ele continua o mesmo, o que mudou foi o tipo da referência. Então para
de Instância
voltarmosCada
a ter acesso
objeto aos membros
criado deverádo objeto
ter suadevemos
própriaforçar a conversão
instância do tipo da referência para o tipo do
de variáveis Os valores das variáveis
objeto
(atributos) definidas pela classe. Os métodos definem o comportamento de como
real. Se tiver certeza de que o tipo do objeto é um Gerente, então proceda um abaixo: em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
Gerente o_funcionario = (Gerente) dados.retornaObjeto(0); //ok
classe. Porém não devemos
estadoconfundir isto com a implementação
de Gerente do método, que
//imprime desta instancia Dois objetos distintos têm
é compartilhada por todas as instâncias da
System.out.println("Nome classe.
funcionario: " + o_funcionario.nome);//ok
o mesmo estado se suas
Se você nãodesabe
2.3.1 Invocação ao certo qual o tipo do objeto real, teste-o antes com instanceof,variáveis
Métodos membro
senão uma exceçãotêm
do os
tipo ClassCastException seria lançada
Objetos se comunicam pela(uma o quê?
troca Calma chegaremos
de mensagens, lá). Neste
isto significa que exemplo
um mesmos
o objeto valores.
armazenado no
índicie
objeto1 pode
do array
teré do
quetipo String. um comportamento particular invocando uma
mostrar
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaGerente o_funcionario;
de um método em um objeto usando o operador binário "." (ponto),
if( dados.retornaObjeto(1) instanceof Gerente){
devendo especificar a mensagem
o_funcionario completa: odados.retornaObjeto(0);
= (Gerente) objeto que é o recebedor //ok da
mensagem, o método
//imprimea ser estado
invocadodesta
e os argumentos
instancia para
deo Gerente
método (se houver).
O método invocado no recebedor pode também
System.out.println("Nome enviar informações
funcionario: de volta ao
" + o_funcionario.nome);
} //ok através de um valor de retorno. O método chamado deve ser
objeto chamador
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 67
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
76
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

7.4.4 Operações Polimórficas


//atribuindo valor poraSobreposição de Métodos
variável referência
Atentemos
Carro novamente
carro1 = new para a hierarquia de classes da Figura 7.3, a classe Animal define o comportamento
Carro();
fazerRuido(), é óbvio que animais
carro1.ano diferentes como Cachorro e Gato produzem sons diferentes, o que é comum é o
= "2001";
fato de que ambos produzem"fusca";
carro1.modelo= algum tipo de som (ou ruído). É desejável que características específicas possam ser
carro1.cor
implementadas = "prata";
para cada subclasse.
Esta característica de sobreposição nos permite implementar um mesmo comportamento e especializá-lo
na subclasse. Veja exemplo:

public class Carnivoro { Em Java os métodos da


String ruido; superclasse podem ser
redefinidos nas
public Carnivoro(String ruido){ subclasses, dizemos que o
this.ruido = ruido;
}
método está sendo
sobreposto (override) nas
void fazerRuido(){ subclasses.
System.out.println("nao faço
Figura 2.4 ruidos
– Layout Memóriaainda");
após inicialização
}
//criando novo alias
Carro
void carro2 = carro1;
comer(){
System.out.println("preferencia por proteina animal");
}

void andar(){
System.out.println("ando com quatro patas");
}
}
Listagem 7.9 – Superclasse Carnivoro

Definindo uma subclasse Cachorro, que redefine método fazerRuido() (linha 6):

public class Cachorro extends Carnivoro {

public Cachorro() {
super("Auuuu,auuu,auuu");
} Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

void fazerRuido(){
System.out.println("Latir="+ ruido);
2.3 Membros
} de Instância
}Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe.Listagem
Os métodos definem
7.10 – Subclasse o especialização
Cachorro, comportamento de um
de Carnivoro em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
Definindopor
é compartilhada uma subclasse
todas Gato, que
as instâncias classe. método fazerRuido() (linha 6):
da redefine
o mesmo estado se suas
public class Gato extends Carnivoro {
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam
public Gato() { pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que super("Miauuuu,miauuu,miauuu");
mostrar um comportamento particular invocando uma
}
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de void
um método em um objeto usando o operador binário "." (ponto),
fazerRuido(){
devendo especificar aSystem.out.println("Miar
mensagem completa: o objeto ="+que é o recebedor da
ruido);
mensagem, o}método a ser invocado e os argumentos para o método (se houver).
O método} invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor
Listagemde
7.11retorno.
– SubclasseO método
Gato, chamado
especialização deve ser
de Carnivoro
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 68
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
77
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

Para testarmos essa


//atribuindo característica
valor a variávelpolimórfica de Java vamos escrever a seguinte classe:
referência
Carro carro1 = new Carro();
public class =
carro1.ano TestaCarnivoro
"2001"; {
carro1.modelo= "fusca";
public static
carro1.cor void main(String[] args) {
= "prata";

Carnivoro bicho = new Carnivoro("sem ruido");


bicho.fazerRuido(); // (1) qualquer carnivoro
bicho = new Cachorro();
//tem que latir
bicho.fazerRuido();// (2)
bicho = new Gato();
//tem que miar
bicho.fazerRuido();// (3)
}
}
Listagem 7.12 – Testando polimórfismo

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


O método fazerRuido() agora é especifico para cada subclasse (Cachorro e Gato) da superclasse
Carro carro2 = carro1;
(Carnivoro), mas que método será chamado, o da superclasse ou da subclasse?

bicho.fazerRuido();

Quando o método é chamado a referência de objeto bicho estará chamando a versão mais específica do
método para o tipo de objeto sendo referenciado por bicho.
1. Na Listagem 7.12, linha 4, será invocado o método fazerRuido() de Carnivoro (listagem 7.9 linha 6);
2. Na listagem 7.12, linha 7, será invocado o método fazerRuido() para Cachorro (listagem 7.10 linha 6);
3. Na listagem 7.12 linha 10, será invocado o método fazerRuido() para Gato (listagem 7.11 linha 6);

Podemos dizer que a JVM tenta localizar a assinatura do método sendo invocado pelas classes mais
especializadas, as que estão nos níveis mais baixo da hierarquia de classes. Se não encontrar uma versão do método
nessa classe, começará a retroceder, subir, na hierarquia até encontrar algo que atenda.
A JVM determina o método a ser invocado em tempo de execução usando um recurso denominado de
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
ligação tardia, isso significa que durante o processo de compilação não é feita qualquer ligação entre a chamada
por uma referência e método a ser invocado, exceto se o método for marcado pelos modificador static ou final.

2.3 Membros
7.4.4.1 de Instância
Invocando Métodos Sobrepostos
ÉCada
muitoobjeto criado
útil, pois deverá
o objetivo real ter sua própria
da sobrescrita não éinstância
substituirde variáveis
a versão de Os valoresinvocar
Podemos das variáveis
(atributos) definidas pela
método da superclasse, masclasse. Os métodos definem o comportamento de um
estendê-lo. em um objetodaconstituem
métodos
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
superclasse,
classe. Porém
public nãoclass
devemos confundir isto
Funcionario { com a implementação do método, que
Dois objetos distintos
sobrescritos da têm
é compartilhada por todas as instâncias da classe.
String nome; o mesmo estado
subclasse, usando a se suas
double salario; variáveis membro
2.3.1 Invocação
Datedeaniversario;
Métodos referência super. têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode String
ter que valoresCampos()
mostrar um comportamento { particular invocando uma
return "Nome: " + nome +
operação apropriada que foi"\nSalario:
definida no objeto. Em
" + salario;
Java, isto é feito pela
chamada de um} método em um objeto usando o operador binário "." (ponto),
devendo}especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a serListagem
invocado
7.14 – e os argumentos
Superclasse Funcionário para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 69
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
78
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

Na Listagem 7.15, linha 7, invocamos o método valoresCampos() da superclasse Funcionarios.


//atribuindo valor a variável referência
publiccarro1
Carro Secretaria
class = extends Funcionario {
new Carro();
carro1.ano = "2001";
String departamento;
carro1.modelo= "fusca";
String chefe;
carro1.cor = "prata";
String valoresCampos() {
// chama método da superclasse
return super.valoresCampos() +
"\nDepartamento: " + departamento + "\nChefe: "+ chefe;
}
}
Listagem 7.15 – Subclasse Secretaria

Uma invocação de método na forma super.algumMétodo() tem o mesmo efeito que a invocação feita por
uma referência do tipo da superclasse. O método não precisa estar definido diretamente na superclasse, ele pode
ter sido herdado de alguma classe mais alta na hierarquia.
Figura 2.4 – Layout Memória após inicialização

7.4.4.2 //criando
Regras sobrenovo alias de Métodos
Sobreposição
Carro carro2 = carro1;
As seguintes regras para sobreposição de métodos devem ser seguidas:
1 – O tipo de retorno do método na subclasse deve ser o mesmo ou um subtipo do tipo de retorno do
método sobreposto na superclasse.
2 – O método que está sobrepondo não pode ser menos acessível que o seu método sobreposto.
3 – O método que está sobrepondo não pode lançar exceções de tipos diferentes das exceções do método
sobreposto. Veremos detalhes no estudo de exceções.

Estas regras resultam da natureza do polimorfismo combinado com as


características de tipagem segura da linguagem Java. Considere este exemplo:

public class Pai {


Lembrando que o
public void m() { nome do método e
} ordem dos argumentos
} do método na
Listagem
Figura 2.57.16 – Superclasse
– Layout MemóriaPai
duas variáveis referência para o mesmo objeto subclasse devem ser
idênticos aos do
public class Filho extends Pai { método da superclasse,
2.3 Membros de Instância
private void m() {//problemas aqui, é private
para que a versão da
}
}
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
superclasse seja
(atributos) definidas pela classe. Os métodos definem o comportamento de um em umsobreposta.
objeto constituem
Listagem 7.17 – Subclasse Filho
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
public class UsaAmbos { Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
public void mo() { o mesmo estado se suas
Pai p1 = new Pai(); variáveis membro têm os
2.3.1 Invocação de Métodos
Pai p2 = new Filho();
Objetos se comunicam
p1.m(); pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que p2.m();
mostrar um comportamento particular invocando uma
}
operação
}
apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
Listagem 7.18 – Testando sobreposição de métodos
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O métodoUminvocado
membro no
marcado com opode
recebedor modificar
tambémprivate só estão
enviar acessível de
informações dentro
voltadaaoprópria classe, ou seja somente
métodos
objeto e construtores
chamador definidos
através de umna classe
valor depoderão
retorno.usar este membro.
O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 70
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
79
www.3way.com.br
Linguagem
LinguagemdedeProgramação
ProgramaçãoJava
Java

Uma chamada a p2.m() (listagem 7.18, linha 6) resulta na execução da


versão//atribuindo
do método m() definido
valor anavariável (Listagem 7.17, linha 2). Porém,
classe Filhoreferência
Também é possível criar
pela regra
Carro2 (dois)
carro1o método
= newm() da classe Filho tem menor visibilidade que o
Carro(); métodos que não
método m() na classe Pai,= o"2001";
carro1.ano que viola a regra e portanto o código não irá compilar.
carro1.modelo= "fusca"; possam ser modificados
7.4.5 carro1.cor = "prata";
Modificador de Método final pelos filhos, impedindo o
Métodos marcados como final são o que chamamos de métodos finais. override. Estes métodos
Para declarar um método final, adicionamos a palavra-chave final na declaração são o que chamamos de
do método (na posição do modificador). métodos finais.
Assim como uma classe final não pode ser herdada, gerando um erro de
compilação caso o façamos. O mesmo acontecerá ao se tentar fazer um override
de um método final.

7.5 Encapsulamento
Quando estamos criando as nossas classes e definindo as suas
propriedades e métodos, queremos implementar algum tipo de restrição para
acessar esses dados. Por exemplo, ao Figura
necessitar que um certo atributo seja
2.4 – Layout Memória após inicialização
modificado apenas pelos métodos dentro da classe, é possível esconder isso dos outros objetos que estejam
usando//criando
a sua classe. novo alias
Para implementar isso, com Java, temos os modificadores de acesso (veja seção 7.5.2).
Carro carro2 = carro1;
Existem quatro diferentes tipos de modificadores de acesso: public, private, protected e "default" ou
pacote. Os três primeiros modificadores são escritos explicitamente no código para indicar o acesso, para o tipo
default, não se utiliza nenhuma palavra-chave.

Existem quatro 7.5.1 Pacotes


diferentes tipos de Esta é uma característica poderosa que oferece um mecanismo para
modificadores de gerenciamento de um grande grupo de classes e interfaces e evita possíveis conflitos
de nome, sendo também um modo de encapsulamento dessas estruturas.
acesso: public, private,
protected e default. 7.5.1.1 Criando pacotes
Para criar pacotes, declaramos como segue:

package <nomeDoPacote>;
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

Suponha que desejamos criar um pacote onde colocaremos a nossa classe


Funcionario juntamente, com outras classes relacionadas. Chamaremos o nosso pacote
2.3 Membros de Instância de empresa.rh.
Cada objeto criado temos
A primeira coisa que deverá queter
fazer é criar
sua as pastas
própria (ou diretórios)
instância chamadas Os valores das variáveis
de variáveis
empresa/rh,
(atributos) estes diretórios
definidas pela classe.seOsencontram de algumo outro
métodos definem diretório onde
comportamento de um esteja em um Pacotes são
objeto constituem
guardando
objeto. Isto éseus arquivospois
importante, de denota
classes que
(arquivos com extensão
um método pertence.class),
a cadapor exemplo
objeto da [ utilizados para
o seu estado.
/opt/java/lib
classe. Porém não ]. devemos confundir isto com a implementação do método, que agrupar classes e
Em seguida,
é compartilhada copiar
por todas para a pasta
as instâncias rh todas as classes que pertençam a este Dois objetos distintos têm
da classe. interfaces
pacote. Adicione a seguinte instrução no arquivo da classe, esta linha deve ser a o mesmo estado se suas
relacionadas em
primeira
2.3.1 linha dentro
Invocação de seu arquivo fonte (rever seção 2.8 ). Agora vamos modificar a variáveis membro têm os
de Métodos
classe Funcionario uma únicavalores.
mesmos unidade.
Objetos se para que a mesma
comunicam pela fique
troca dentro do pacote:isto significa que um
de mensagens,
objeto pode ter que mostrar um comportamento particular invocando uma
package empresa.rh;
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método
public class em um objeto usando
Funcionario { o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
double
mensagem, o método salario;
a ser invocado e os argumentos para o método (se houver).
java.util.Date dataContrato; //(1)
O método invocado no recebedor
String nome;
pode também enviar informações de volta ao
objeto chamador String
através de um valor de retorno. O método chamado deve ser
cargo="indefinido";
um que esteja definido pelo objeto. Seja um Profissional Aprendendo com Profissionais 71
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
80
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

public Funcionario(){}
//atribuindo valor a variável referência
Carro public
carro1 Funcionario(String
= new Carro(); nome,double salario,
carro1.ano = "2001"; java.util.Date dataContrato) { //(2)
carro1.modelo= "fusca"; = salario;
this.salario
carro1.cor this.dataContrato
= "prata"; = dataContrato;
this.nome = nome;
}

void bonusSalario (double percentual) {


salario *= 1 + percentual / 100;
}
}
Listagem 7.19 – Definindo pacotes

Pacotes podem ser aninhados. Neste caso, o interpretador espera que a estrutura de diretórios
contendo as classes combine com a hierarquia dos pacotes. Veja a figura abaixo:
Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 7.4 – Diretórios Pacotes

7.5.1.2 Importando Pacotes


Reveja a classe Funcionario que definimos anteriormente (Listagem 7.19), observe abaixo (Listagem 7.20),
em (1, linha 6) e (2, linha 13). Quando precisamos fazer referência a uma classe que pertence a outro pacote,
devemos usar seu nome completo Figura(nome
2.5 – Layout Memória duas variáveis
completamente referênciaNo
qualificado). paracaso
o mesmo objeto utilizando a classe Date do
estamos
pacote java.util.
Ter que usar o nome completamente qualificado de uma classe não é
2.3 agradável,
muito Membros dede
além Instância
tornar as linhas de nosso código-fonte bem grandes, Quando precisamos fazer
tornandoCada
sua leitura
objeto mais difícil, deverá
criado o que não teré nada bom parainstância
sua própria manutenção de de uma
variáveis referência
Os valoresa uma classe
das variáveis
programa. definidas pela classe. Os métodos definem o comportamento de um
(atributos) queum
em pertence
objetoaconstituem
outro
Paraé importante,
utilizar classes
poisexternas
denota ao quepacote, de uma forma amaiscada simples,
objeto da pacote, devemos
objeto. Isto um método pertence o seu estado. seu
usar
podemos
classe. importar
Porém não os pacotesconfundir
devemos dessas classes. Por padrão,
isto com todos as suas
a implementação do classes
método, Java
que nome completo ou têm
Dois objetos distintos
éimportam o pacote
compartilhada por java.lang implicitamente.
todas as instâncias É por isso que é possível utilizar
da classe. podemos
classes como String e Integer dentro da sua classe, sem usar seu nome completo: o mesmo estado seossuas
importar
pacotes dessas classes.
java.lang.String,
2.3.1 Invocação java.lang.Integer.
de Métodos variáveis membro têm os
Para importar
Objetos pacotes você
se comunicam pelausatroca
a palavra-chave
de mensagens, import istoseguido do que
significa nomeum mesmos valores.
completamente qualificado da classe, veja:
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
import empresa.rh.Gerente;
chamada de um método em um objeto usando o operador binário "." (ponto),
devendoouespecificar
você pode ausar
mensagem
somente ocompleta: o objeto
nome do pacote que é curinga
e o caracter o recebedor
"*", da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado
import no recebedor pode também enviar informações de volta ao
empresa.rh.*;
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 72
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
81
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

A primeira forma importa especificamente a classe Gerente do pacote empresa.rh, enquanto que a
seguinte,//atribuindo
com o curinga, importa
valor todas as classes do
a variável pacote empresa.rh.
referência
Lembre-se,
Carro import
carro1 = deve
new ser colocado após a cláusula package e antes das definições de classe ou interface
Carro();
no arquivo de código fonte=(ver
carro1.ano seção 2.8). Refazendo o código,
"2001";
carro1.modelo= "fusca";
carro1.cor = "prata";
package empresa.rh;

import java.util.Date;

public class Funcionario {

double salario;
Date dataContrato; //(1)
String nome;
String cargo="indefinido";

public Funcionario(){}

public Funcionario(String nome,double salario,Date dataContrato) { //(2)


this.salario =Figura 2.4 – Layout Memória após inicialização
salario;
this.dataContrato
//criando novo alias = dataContrato;
this.nome
Carro carro2 = carro1;= nome;
}

void bonusSalario (double percentual) {


salario *= 1 + percentual / 100;
}
}
Listagem 7.20 – Importando pacotes

7.5.1.3 Localização de Classes e CLASSPATH


Antes que você possa executar sua aplicação a JVM precisa fazer o carregamento das classes (class loader).
O class loader é um mecanismo usado para carregar classes a partir de arquivos nos diretórios ou arquivos
compactados (zip ou jar), especificados na propriedade de sistema java.class.path. Esta propriedade é configurada
quando a variável de ambiente CLASSPATH está definida. As classes são localizadas seqüencialmente através dos
diretórios e arquivos jar (ou zip) que estejam especificados na propriedade java.class.path. A configuração padrão
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
para propriedade java.class.path é o subdiretório jre/lib dentro do diretório onde
foi instalado o JDK( ou JRE).
Você pode usar java -verbose SuaClasse, para ver a seqüência da carga É possível definir a
2.3classes,
das Membros de sua
ao executar Instância
aplicação. variável CLASSPATH com
Cada objeto
Quando surge ocriado deverá ter sua própria
erro NoClassDefFoundError, instância
significa que ode JVMvariáveis
não Os valores
mais das de
de um local variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento
conseguiu localizar sua classe ou alguma classe da qual ela depende. Você deve de um em umbasta
pesquisa; objetosepará-
constituem
objeto.
informarIsto é importante,
à JVM poispelos
onde procurar denota que um
pacotes, método
definindo pertence
a variável a cada objeto da los por ponto-e-vírgula
CLASSPATH. o seu estado.
classe. Porém
Tomando não nosso
devemos confundir
pacote isto com
de exemplo, a implementação
empresa.rh, e supondo do que
método,
nossoque (noDois objetosou
Windows) distintos
dois- têm
épacote
compartilhada
está sob opor todas as/opt/java/lib
o diretório instâncias da(ou classe.
c:\opt\java\lib) escrevemos:
o mesmo estado se suas
pontos (nos sistemas
baseados
variáveisem Unix). têm os
membro
2.3.1 Invocação de Métodos
export CLASSPATH=/opt/java/lib (para sistemas baseados em UNIX);
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um (para
set CLASSPATH=c:\opt\java\lib Windows); particular invocando uma
comportamento
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaComo
de umfoimétodo
dito, em
seusumpacotes podem oestar
objeto usando dentro
operador de "."
binário arquivos
(ponto),
compactados jar ou zip, neste caso devemos incluir o nome
devendo especificar a mensagem completa: o objeto que é o recebedor do arquivo com da
extensão:
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
export CLASSPATH=/opt/java/lib/aplicacao.jar
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 73
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
83
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

Você também pode


//atribuindo colocar
valor seus pacotes
a variável ou arquivos jar no diretório JAVA_HOME/jre/lib/ext, este
referência
diretórioCarro
é verificado antes=danew
carro1 CLASSPATH na seqüência de carga das classes.
Carro();
carro1.ano = "2001";
7.5.1.4 carro1.modelo=
Importação Estática"fusca";
carro1.cor = "prata";
Como vimos em capítulos anteriores membros estáticos são referenciados pelo nome da classe, assim antes de
invocar um método ou utilizar um atributo devemos proceder como no exemplo (Listagem 7.21, linha 4 e 5):

class Calcula1 {

public static void main(String[] args) {

double x = 10.0, y = 20.5;


double raizquadrada = Math.sqrt(x);
double hipotenusa = Math.hypot(x, y);
double area = Math.PI * y * y;
}
}
Figura 2.4 –7.21
Listagem Layout Memória
– Sem apósstatic
importação inicialização

//criando novo alias


Carro
No Javacarro2 = carro1;
5.0 foi introduzido o static import, que importa métodos e atributos estáticos de qualquer classe
(ou atributos da interface), além dos tipos enumerados, desde que não estejam em pacotes não nomeados, ou
seja, default package.
Deste modo, você pode importar os métodos utilizados no exemplo anterior (Listagem 7.21, linha 4 e 5) e
usá-los diretamente, sem utilizar o nome da classe ou interface para referenciá-los (Listagem 7.22, linha 5 e 6):
Importando todos os membros estáticos (Listagem 7.22, linha 1):

import static java.lang.Math.*;//curinga, qualquer membro estático

class Calcula2 {

public static void main(String[] args) { Apesar de poder importar


todos os métodos e
double x = 10.0, y = 20.5; atributos estáticos da
double raizquadrada = sqrt(x); //membro estático
double hipotenusa Figura 2.5=– Layout
hypot(x,Memória y);
duas variáveis referência
//membro para o mesmo objeto
estático uma classe, a classe em si
double area = PI * y * y; não foi importada, se
} você tentar instanciar um
}
2.3 Membros de Instância objeto sem o nome
Listagem 7.22 – Usando static import
Cada objeto criado deverá ter sua própria instância de variáveis Oscompletamente
valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um qualificado da classe,
em um objeto com
constituem
Você pode
objeto. Istoimportar um membro
é importante, estáticoque
pois denota específico
um método (Listagem 7.23, alinhas
pertence cada1objeto
e 2): da operador new, o
o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que compilador não
Dois objetos distintos têm
por todasjava.lang.Math.sqrt;
import static
é compartilhada as instâncias da classe. // método estatico conseguiria localizá-la
import static java.lang.Math.PI; // campo estático o mesmo estado se suas
precisando de um import
2.3.1 class
Invocação de Métodos{ variáveis membro têm os
Calculate3 normal à parte.
Objetos
publicsestatic
comunicam voidpela troca de mensagens,
main(String[] args) isto { significa que um mesmos valores.
double x = 10.0, y = 20.5;
objeto pode ter que mostrar um comportamento particular invocando uma
double raizquadrada = sqrt(x);
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
//requer nome completo
chamada de double
um método em um objeto
hipotenusa usando o operador
= Math.hypot(x, y); binário "." (ponto),
devendo especificar
double aarea
mensagem
= PI * completa:
y * y; o objeto que é o recebedor da
mensagem, } o método a ser invocado e os argumentos para o método (se houver).
O método} invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um
Listagem 7.23 –valor
Usandode retorno.
static O método chamado deve ser
import específico
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 74
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
84
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

7.5.2 Modificadores de Acesso


//atribuindo valor a variável referência
Carro carro1 = new Carro();
7.5.2.1 carro1.ano
Público - public = "2001";
Define que os elementos
carro1.modelo= da classe são acessíveis tanto internamente quanto externamente à classe.
"fusca";
Qualquer objeto que interage
carro1.cor com a classe pode ter acesso aos elementos públicos a partir de qualquer pacote.
= "prata";
Por exemplo:

// Arquivo: SuperclassA.java (1)

package packageA;

public class SuperclassA {


public int superclassVarA; // (2)
public void superclassMethodA() {/*...*/} // (3)
}

class SubclassA extends SuperclassA {


void subclassMethodA() { superclassVarA = 10; } // (4) OK.
Figura 2.4 – Layout Memória após inicialização
}
//criando novo alias
AnyClassA
class carro2
Carro {
= carro1;

SuperclassA obj = new SuperclassA();


void anyClassMethodA() {
obj.superclassMethodA(); // (5) OK.
}

}
Listagem 7.24 – Definindo classes no pacote A

// Arquivo: SubclassB.java (6)

package packageB;

import packageA.*;
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
public class SubclassB extends SuperclassA {
void subclassMethodB() { superclassMethodA(); } // (7) OK.
}
2.3 Membros de Instância
Cada AnyClassB
class objeto criado
{ deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto éSuperclassA objdenota
importante, pois = new SuperclassA();
que um método pertence a cada objeto da o seu estado.
classe. Porémvoid
não devemos confundir isto {com a implementação do método, que
anyClassMethodB() Dois objetos distintos têm
é compartilhada por todas as instâncias da =classe.
obj.superclassVarA 20; // (8) OK.
}
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
}
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
Listagem 7.25 – Definindo
objeto pode ter que mostrar um comportamento particular invocando umaclasses no pacote B

operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaOde um método
exemplo contémem doisum objetofonte,
arquivos usando o operador
mostrados binário 7.24
na Listagem "." (ponto),
e na Listagem 7.45. A hierarquia dos
devendo especificar
pacotes definidas pelosaarquivos
mensagem completa:
está descrita o objeto
na Figura 7.5, que é o recebedor
mostrando o packageAdae o packageB, dois pacotes que
contêm suaso respectivas
mensagem, método a serclasses. As classes
invocado do packageBpara
e os argumentos fazem uso das(se
o método classes definidas no pacote packageA. A
houver).
classe
O SuperclassA
método invocado packageA
dono recebedortempode
duas subclasses:
também enviar SubclassA no packageA
informações e SubclassB
de volta ao no packageB.
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 75
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
85
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 7.5 – Visibilidade Pública


Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Demonstramos
Carro carro2 acessibilidade
= carro1; pública neste exemplo, onde observa-se o
uso do modificador de acesso public para o campo superclassVarA e no método
Membro com
superclassMethodA() na Listagem 7.24, linha 6 e 7 respectivamente, definidos na
classe SuperclassA. Estes membros podem ser usados por todos os clientes do
acessibilidade protegida
exemplo, que são: são acessíveis por todas
 Cliente 1: SubclassA (Listagem 7.24, linha 11), a partir da subclasse as classes contidas no
definida no mesmo pacote, ela tem acesso ao campo herdado. mesmo pacote.
 Cliente 2: AnyClassA (Listagem 7.24, linha 17), uma classe no mesmo
pacote, que tem-um objeto do tipo SuperclassA, pode invocar o
método de instância superclassMethodA.
 Cliente 3: SubclassB (Listagem 7.25, linha 6), uma subclasse em outro
pacote, que chama o método herdado.
 Cliente 4: AnyClassB (Listagem 7.25, linha 11), uma classe definida em
outro pacote, que tem-um objeto do tipo SuperclassA que acessa a
variável membro daFigura
classe.
2.5 – Layout Memória duas variáveis referência para o mesmo objeto

7.5.2.2 Protegido – protected


Membro com acessibilidade protegida são acessíveis por todas as classes contidas no mesmo pacote e por
2.3 Membros de Instância
todas as subclasses desta classe em qualquer pacote em que a classe seja visível. Em outras palavras, classes que
Cada objeto criado deverá ter sua própria instância de variáveis Osdevalores
não são subclasses em outros pacotes não podem fazer uso de membros protegidos a partir outros das variáveis
pacotes. Ele
(atributos) definidas pela classe. Os métodos definem o comportamento de um emosum objeto daconstituem
é menos restritivo que o modificador padrão (default ou pacote). Por exemplo, redefinindo membros classe
objeto. Isto énaimportante,
SuperclassA pois
Listagem 7.24 denota
(linhas 6 eque um método
7), para pertence a cada objeto da
protected: o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas
public class as instâncias da
SuperclassA { classe.
o mesmo estado se suas
protected
2.3.1 Invocação int superclassVarA;
de Métodos // (2) variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
protected void superclassMethodA() {/*...*/} // (3)
objeto }pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaAssim,
de umo método em um objeto usando
método anyClassMethodB(), o operador
na classe dentro"."
Client4binário do (ponto),
pacote packageB não pode acessar o
devendo especificar atambém
campo superclassVar, mensagem completa:
não pode acessaroo objeto
métodoque é o recebedor da
superclassMethodA() definidos na classe SuperclassA
mensagem, o métodocom
dentro de packageA, a ser invocado
mostrado naeFigura
os argumentos
7.6. para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 76
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
86
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 7.6 – Modificador Protected

7.5.2.3 Padrão ou Pacote Figura 2.4 – Layout Memória após inicialização


Define que os elementos da classe são acessíveis somente aos métodos das classes definidas dentro do
//criando novo alias
mesmo pacote. Não há palavra chave para o modificador padrão (default). É aplicado na ausência de um
Carro carro2 = carro1;
modificador de acesso. Por exemplo:

public class SuperclassA {

int superclassVarA; // (2)

void superclassMethodA() {/*...*/} // (3)


}

No exemplo, os campos superclassVarA e o método superclassMethodA estão definidos como default,


então eles estão acessíveis para classes dentro do pacote packageA, mas não acessíveis para classes em outro
pacote (mesmo estando aninhado).

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador
Figure 7.7. binário "." (ponto),
Visibilidade Default
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método
As classes a serdentro
clientes invocado e os argumentos
do pacote para o método
packageB (Client3 (senão
e Client4) houver).
podem ter acesso aos membros de
O método invocado no recebedor pode também enviar
SuperclassA. Observe as relações demonstradas na Figura 7.7. informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 77
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
87
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

7.5.2.4 Privado - private


Define que os elementos
//atribuindo valor da
a classe são acessíveis
variável somente na classe que o definiu. Por exemplo:
referência
Carro carro1 = new Carro();
SuperclassA
public class =
carro1.ano "2001"; {
carro1.modelo= "fusca";
private int
carro1.cor superclassVarA;
= "prata"; // (2)

private void superclassMethodA() {/*...*/} // (3)


}

Veja Figura 7.8, nenhum cliente pode acessar estes membros.

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 7.8 – Modificador Private

Um padrão adotado como estratégia de desenvolvimento é tornar todas as variáveis membros privadas e
construir métodos de acesso público para elas (GET e SET). Métodos auxiliares que não ofereçam recursos para
outras classes também devem ser declarados como privados.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
7.6 Métodos de Configuração e Captura
Até agora vínhamos cometendo um grande erro na implementação de nossas classes. Nosso erro decorre
do
2.3fato de deixarmosde
Membros osInstância
dados de nossas classes exposto ao acesso externo. Isso significa que podemos alterar o
valor das Cada
variáveis
objeto criado através
de instância deverádoter
operador ponto, como
sua própria abaixo:de variáveis
instância Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
funcionario.nome = "Ana";
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seugetter
estado.
classe. Porém não devemos confundir isto com a implementação do método, que Métodos são
épermitir
Para que se possa implementar o princípio do encapsulamento, isto é, não
compartilhada por todas as instâncias usados para ler valorestêm
Dois objetos distintos
que qualquer objeto acesse da
os classe.
dados de qualquer modo. Para isto o mesmo
de atributosestado se suas
de objeto,
declaramos os campos ou atributos, da nossa classe com modificador de acesso variáveis
2.3.1 Invocação ou seja,membro
de classe.têm os
private. Entretanto,deháMétodos
momentos em que queremos que outros objetos acessem mesmos valores.
Objetos
alguns destes se comunicam
atributos, tanto parapela trocaquanto
escrita de mensagens, isto
para leitura. significa
Para que um
que possamos
objeto pode ter que mostrar um comportamento particular invocando
fazer isso, criamos métodos de configuração chamados de getter e setter, com uma
operação apropriada
visibilidade pública. que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar
7.6.1 Métodos Gettera mensagem completa: o objeto que é o recebedor da
mensagem, o método
O método dea captura
ser invocado
recebee os
o argumentos para o método (se houver).
nome de get<NomeDoAtributo>(). Ele
O método
retorna uminvocado
objeto dono recebedor
mesmo pode
tipo do também
atributo enviar
e deve informações
retornar de atributo
o valor do volta ao
objeto
desejado.chamador
Para o nosso de um valor
atravésexemplo, de retorno.
queremos O método
um método chamado
que possa ler odeve ser
nome,
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 78
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
88
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

endereço, nota de inglês, nota de matemática e nota de ciências do estudante. Assim na classe Funcionario
teríamos//atribuindo
para o campo nome o método,
valor a variável referência
Carro carro1 = new Carro();
private String=nome;
carro1.ano "2001";
...
carro1.modelo= "fusca"; Métodos setter são
public String =
carro1.cor getNome(){...};
"prata"; usados para modificar
os valores de atributos
7.6.2 Métodos Setter de objeto, ou seja, de
Para que outros objetos possam modificar os atributos da classe,
classe.
disponibilizamos métodos que possam gravar ou modificar os valores das variáveis
de instância. Este método é escrito como set<NomeDoAtributoDeObjeto>(<tipo
do atributo parametrizado>). Novamente, para o campo nome o método ficaria:

private String nome;


...
public void setNome(String nome){...};

7.6.3 Aplicando Encapsulando no Exemplo Funcionario/Gerente


Figura 2.4 – Layout Memória após inicialização
Vamos usar os novos conhecimentos adquiridos até aqui para aprimorar as classes Funcionario e Gerente,
//criando
que temos usado comonovo alias
exemplo ao longo do capítulo.
Carro carro2 = carro1;
package empresa.rh;

import java.util.Date;

public class Funcionario {

private double salario;

private Date dataContrato;

private String nome;

public Funcionario() {
}

public Funcionario(String nome,


Figura 2.5 – Layout Memória double
duas variáveis salario,Date
referência dataContrato) {
para o mesmo objeto
this.salario = salario;
this.dataContrato = dataContrato;
this.nome = nome;
2.3 Membros
} de Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
public void bonusSalario(double percentual) {
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
salario *= 1 + percentual / 100;
objeto. Isto é importante,
} pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada //por todas as de
métodos instâncias da classe.
configuracao
public Date getDataContrato() { o mesmo estado se suas
2.3.1 Invocação
return dataContrato; variáveis membro têm os
} de Métodos
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar
public um comportamento particular
void setDataContrato(Date invocando{ uma
dataContrato)
operação apropriada this.dataContrato
que foi definida no objeto.= dataContrato;
Em Java, isto é feito pela
}
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar
publica String
mensagem completa:{ o objeto que é o recebedor da
getNome()
mensagem, o método areturn
ser invocado
nome;e os argumentos para o método (se houver).
O método invocado
} no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 79
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
89
www.3way.com.br
Linguagem de Programação
Linguagem Java Java
de Programação

public void setNome(String nome) {


this.nome = nome;
//atribuindo
} valor a variável referência
Carro carro1 = new Carro();
carro1.ano = "2001";
public double getSalario() {
carro1.modelo=
return"fusca";
salario;
carro1.cor
} = "prata";

public void setSalario(double salario) {


this.salario = salario;
}
}
Listagem 7.26 – Encapsulamento dos campos da classe Funcionário

package empresa.rh;

import java.util.Date;
Figura 2.4 – Layout Memória após inicialização
public class Gerente extends Funcionario {
//criando novo alias
private
Carro carro2double bonus;
= carro1;

private String secretaria;

public Gerente(String nome, double salario,Date dataContrato,


String secretaria) {

// invoca construtor superclasse


super(nome, salario, dataContrato);
this.secretaria = secretaria;
bonus = 0.0;
}

void bonusLucro(double lucro) {


bonus += lucro * 0.01;
}

// métodos de Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
configuracao
public double getBonus() {
return bonus;
}
2.3 Membros de Instância
Cadapublic
objeto void
criadosetBonus(double
deverá ter sua bonus)
própria {instância de variáveis Os valores das variáveis
(atributos) definidas this.bonus
pela classe. Os= métodos
bonus; definem o comportamento de um em um objeto constituem
objeto. Isto é}importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
public String getSecretaria() { Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
return secretaria; o mesmo estado se suas
}
2.3.1 Invocação de Métodos variáveis membro têm os
public
Objetos void setSecretaria(String
se comunicam pela troca de mensagens, secretaria)
isto significa { que um mesmos valores.
this.secretaria = secretaria;
objeto pode }ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada
} de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem Listagem
completa: o objeto que
7.27 – Encapsulamento é o
da classe recebedor da
Gerente
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado
package no recebedor pode também enviar informações de volta ao
empresa.rh;
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.
Seja um Profissional Aprendendo com Profissionais 80
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
90
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

import java.util.Calendar;
import static java.util.Calendar.getInstance;
//atribuindo valor a variável referência
Carro carro1
public = new Carro();
class MainGerente {
carro1.ano = "2001";
carro1.modelo= "fusca";
public static void main(String[] args) {
carro1.cor = "prata";
// uma instancia de calendar
Calendar dataBase = getInstance();//data contratação

// configura data de contratacao do funcionario


dataBase.set(2005, 6, 10);

// instancia de Gerente
Gerente funcionario = new Gerente("Hide Otta", 1999.99,
dataBase.getTime(),"Effe Ciente");

// invoca método da heranca


funcionario.bonusSalario(2);
Figurada
// invoca método 2.4 –instancia
Layout Memória após inicialização
funcionario.bonusLucro(10000.00);
//criando novo alias
Carro carro2 = carro1;
// imprime estado desta instancia de Gerente
System.out.println("Nome funcionario: " + funcionario.getNome());
System.out.println("Secretariado por : "+
funcionario.getSecretaria();

System.out.println("Salario base: " + String.format("%,.2f",


funcionario.getSalario()));
System.out.println("Salario + Comissao: " + String.format("%,.2f",
(funcionario.getSalario() + funcionario.getBonus())));

}
}
Listagem 7.28 -Usando getXXX() e setXXX() das classes Funcionario e Gerente

7.7 Fazer Laboratório 6 Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Siga instruções do laboratório e tome cuidado com o tempo de execução, sempre recorra ao instrutor em
caso de dúvida, nunca deixe uma dúvida sem reposta.
2.3 Membros de Instância
7.8 OCada objeto==criado
operador deverá ao
comparado terMétodo
sua própria
equalsinstância de variáveis Os valores das variáveis
(atributos) definidas
Quando pela classe.
queremos saber Osse métodos definem
duas variáveis o comportamento
primitivas de um o operador
são iguais usamos em um objeto constituem
==. Como bem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da
sabemos, este mesmo operador quando utilizado com referência de objetos nos diz se as variáveis referenciam
o seu estado. o
classe. Porém
mesmo objeto.não devemos confundir isto com a implementação do método, que Dois objetos distintos têm
é compartilhada
A classe por todas
Object no as instâncias
pacote da classe.
java.lang define o método equals(), que compara a igualdade (o estado) entre
o mesmo estado se suas
dois objetos. Se este método não for sobreposto o método equals() retorna true somente se as duas referências
apontam para o mesmo
2.3.1 Invocação objeto. Entretanto nosso objetivo ao utilizar equals() deve comparar
de Métodos variáveis membro
o conteúdo entre têm
dois os
objetos, se isso forse
Objetos possível. É por isso
comunicam pelaque equals()
troca é freqüentemente
de mensagens, sobreposto
isto significa mesmos
em novas classes.
que um valores.o
Por exemplo,
método equals() na classe String retorna true se, e somente
objeto pode ter que mostrar um comportamento particular invocando umase, o argumento passado ao método (uma referência
de Object),apropriada
operação quenull
é diferente de foie odefinida
objeto que
no está sendo
objeto. Emcomparado
Java, istocontém a mesma
é feito pela seqüência de caracteres do
objeto
chamadaquedeestáuminvocando
método oem método:
um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
String str1 = "Igual";
mensagem, o método a ser invocado e os argumentos para o método (se houver).
String str2 = new String("Igual");
O método invocado
boolean iguais no recebedor pode também enviar informações de volta ao
= str1.equals(str2);
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 81
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
91
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Uma implementação simples, mas decente, pode ser uma operação de


ou-exclusivo (XOR operador ^), entre os camposreferência
da classe. O código seguinte
//atribuindo
ilustra essas modificações:
valor a variável A documentação de Java
Carro carro1 = new Carro();
carro1.ano = "2001";
recomenda sobrepor o
package empresa.rh;
carro1.modelo= "fusca"; método hashCode()
carro1.cor = "prata"; sempre que o método
import java.util.Date;
equals() for sobreposto.
public class Funcionario {

private double salario;


private Date dataContrato;
private String nome;

public Funcionario() {
}

public Funcionario(String nome, double salario, Date dataContrato) {


this.salario = salario;
this.dataContrato = dataContrato;
Figura 2.4 – Layout Memória após inicialização
this.nome = nome;
//criando novo alias
}
Carro carro2 = carro1;
public void bonusSalario(double percentual) {
salario *= 1 + percentual / 100;
}
// métodos de configuracao
public Date getDataContrato() {
return dataContrato;
}

public void setDataContrato(Date dataContrato) {


this.dataContrato = dataContrato;
}

public String getNome() {


return nome;
}
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
// Equals e hashCode métodos
public boolean equals(Object o) {

2.3 Membros deboolean


Instância
resultado = false;
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
if ((o != null) && (o instanceof Funcionario)) {
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
Funcionario f = (Funcionario) o;
objeto. Isto é importante, poisif
denota que um método pertence
(nome.equals(f.nome) a cada objeto da o seu estado.
&& dataContrato.equals(f.dataContrato)
classe. Porém não devemos confundir isto com &&a salario
implementação do método,{que
== f.salario) Dois objetos distintos têm
é compartilhada por todas as instâncias da classe. = true;
resultado
} o mesmo estado se suas
}
2.3.1 Invocação de Métodos variáveis membro têm os
return resultado;
Objetos mesmos valores.
} se comunicam pela troca de mensagens, isto significa que um
objeto pode ter que mostrar um comportamento particular invocando uma
public que
operação apropriada hashCode()
int foi definida no{ objeto. Em Java, isto é feito pela
return (nome.hashCode() ^ dataContrato.hashCode()
chamada de um método em um objeto usando o operador binário "." (ponto),
^ Double.valueOf(salario).hashCode());
devendo especificar
} a mensagem completa: o objeto que é o recebedor da
mensagem,
} o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode7.29
Listagem também enviarmétodo
– Implementando informações de volta ao
equals() e hashcode()
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 82
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
92
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

import static java.util.Calendar.getInstance;


//atribuindo valor a variável referência
Carro carro1
public = new Carro();
class TesteEquals {
carro1.ano = "2001";
carro1.modelo= "fusca";
public static void main(String[] args) {
carro1.cor = "prata";
Calendar cal = getInstance();
cal.set(2000, 10, 10);
Date data = cal.getTime();

Funcionario emp1 = new Funcionario("Vagabo Undo", 3500.0f, data);


Funcionario emp2 = new Funcionario("Vagabo Undo", 3500.0f, data);

if (emp1 == emp2) {
System.out.println("emp1 = emp2");
} else {
System.out.println("emp1 <> emp2");
}
Figura 2.4 – Layout Memória após inicialização
if (emp1.equals(emp2)) {
System.out.println("emp1 = emp2");
//criando novo alias
} =
Carro carro2 else {
carro1;
System.out.println("emp1 <> emp2");
}

emp2 = emp1;
System.out.println("faz emp2 = emp1;");

if (emp1 == emp2) {
System.out.println("emp1 == emp2");
} else {
System.out.println("emp1 == emp2");
}

}
Listagem 7.30 – Comparando objetos Funcionario com seu equals()
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

7.9 Classses Abstratas


2.3 Membros de Instância
Reflita um pouco sobre a hierarquia de classes da Figura 7.9, nós vimos que podemos dizer que Gato ou
Leão é-umCada
Animal, ou
objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
Animal bichano = new Gato();
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
Animal gatao = new Leao();
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada
e também por todas asque
sabemos instâncias
Galinha da classe.
é-um Animal, ou o mesmo estado se suas
2.3.1 Invocação de Métodos
Animal galinha = new Galinha();
variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode
Agora ter queO mostrar
pense! que é umum comportamento
objeto Animal? Que forma particular invocando
ele tem? Como eleuma
anda? O que ele come? Que som
ele faz? apropriada que foi definida no objeto. Em Java, isto é feito pela
operação
chamada de um método em um objeto usando o operador binário "." (ponto),
devendoAnimal bicho
especificar = new Animal();
a mensagem completa://o que seria
o objeto que éumo Animal
recebedor ? da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 83
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
93
www.3way.com.br
Siga-nos também no Twitter!
twitter.com/3waynet
Linguagem de Programação
Linguagem JavaJava
de Programação

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;
Figura 7.9 - Classe Abstrata

Percebe que não faz muito sentido ter um objeto da classe Animal. Precisamos sim de uma classe Animal
para termos herança e polimorfismo, entretanto não vamos precisar de instâncias de Animal. Pelo menos não
neste exemplo.
Volte sua atenção para classe Felino ou Aves, da mesma forma que Animal, não precisamos de instâncias
dessas classes, mas há uma característica comum às suas subclasse, que podemos definir com certeza. No caso a
maneira como os Felinos andam – com quatro patas – ou como as Aves andam – com duas pernas. Mas não
podemos dizer com certeza que todas as Aves emitem o mesmo som, ou que um Leão coma o mesmo que um
Gato, e menos ainda que emitam o mesmo som.
Para definir operações em classes devemos, necessariamente, saber qual o seu comportamento.
Entretanto, em muitos casos não sabemos como estas operações se comportarão na classe que estamos criando,
mas sabemos que elas possuemFiguraeste2.5
comportamento ou variáveis
– Layout Memória duas pelo menos abstraímos
referência estas
para o mesmo características da coisa real.
objeto
Assim, é desejável que as subclasses que herdem desta classe possua, obrigatoriamente, estas operações. Por
exemplo, queremos criar uma superclasse chamada Animal. Esta classe tem certos métodos como comer(), andar()
e fazerRuido(). Entretanto, existem tantas diferenças entre os métodos nestas subclasses que não podemos
2.3 Membros de Instância
generalizar este comportamento na superclasse. Para realizarmos isto, teremos que criar uma superclasse que
Cada objeto criado deverá ter sua própria instância de variáveis Osclasse
valores das variáveis
possua alguns métodos com implementações e outros não. Este tipo de classe é chamada de abstrata. Uma
(atributos) definidas pela classe. Os métodos definem o comportamento
classe abstrata é uma classe que não pode ser instanciada. Nós definimos classes abstratas de um em umcom objeto constituem
o modificar
objeto. Isto
abstract antesé de
importante,
class. pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada
public por todas as instâncias
abastract da classe.
class Animal{...}
o mesmo estado se suas
2.3.1 Invocação
Os métodosdenas
Métodos variáveis membro têm os
classes abstratas que não têm implementação são chamados de métodos abstratos. Para
Objetosabstrato,
criar um método se comunicam pela troca
apenas escreva de mensagens,
a assinatura isto sem
do método significa que(sem
o corpo mesmos
um um abre chaves { e valores.
um fecha
objeto}),pode
chave e use ater que mostrar
palavra-chave um comportamento
abstract. Por exemplo: particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadapublic
de um abstract
método emvoid fazerRuido();
um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,ou o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
abstract public void fazerRuido();
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 84
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
95
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Podemos ter classes abstratas sem métodos abstratos, mas toda classe com qualquer método abstrato é
obrigatoriamente abstrata.valor
//atribuindo Vamos aremodelar
variávela classe Animal e defini-lá como uma classe abstrata:
referência
Carro carro1 = new Carro();
//superclasse = "2001";
carro1.ano
class Animal {
public abstract "fusca";
carro1.modelo=
carro1.cor = "prata";
String ruido;

public Animal(String ruido){


this.ruido = ruido;
}

public abstract void fazerRuido();


public abstract void comer();
abstract public void andar();

}
Listagem 7.31 – Implementando classes abstratas

Figura 2.4 – Layout Memória após inicialização


Quando uma classe
//criando novo estende
alias a classe abstrata Animal, ela é obrigada a implementar o métodos abstratos,
como comer(), ou tornar-se abstrata.
Carro carro2 = carro1; Veja:

//superclasse
public abstract class Felino extends Animal {

public Felino(String ruido){


super(ruido);
}

public abstract void fazerRuido();


public abstract void comer();
public void andar(){
System.out.println("anda com quatro patas");
}

}
Listagem
Figura 2.5 – Layout 7.31 – Herança
Memória de classes
duas variáveis abstrados
referência para o mesmo objeto

Se a classe Felino implementar o método andar(), mas não implementar fazerRuido() e nem comer(),
2.3 métodos
estes Membros de Instância
continuam sendo abstratos (Listagem 7.31, linhas 7 e 8), devendo a classe ser abstrata também.
JáCada
a classe Gato é concreta,
objeto criado deverádevendo
ter suaimplementar todos métodos
própria instância abstratos definido
de variáveis na das
Os valores superclasse
variáveis
(atributos)7.32,
(Listagem linhas 6pela
definidas e 9):classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
//subclasse
classe. Porém não devemos- especialização
confundir isto comcarnivoro
a implementação do método, que
public class Gato extends Felino { Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
public Gato() { o mesmo estado se suas
super("Miauuuu,miauuu,miauuu");
2.3.1 Invocação
} de Métodos variáveis membro têm os
public
Objetos void comer(){
se comunicam pela troca de mensagens, isto significa que um mesmos valores.
System.out.println("come rato");
objeto pode ter
}
que mostrar um comportamento particular invocando uma
operação apropriada que foi definida
public void fazerRuido(){ no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador
System.out.println("Miar ="+ ruido); binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
}
} o método a ser invocado e os argumentos para o método (se houver).
mensagem,
O método invocado no recebedor
Listagem 7.32pode tambémclasses
– Implementando enviar informações
concretas declasses
que herdam de voltaabstratas
ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 85
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
96
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Vejamos como utilizar essas classes. A Listagem 7.33 não compilará, porque não podemos instanciar
classes abstratas
//atribuindo 7.33, linhas
(Listagemvalor 4 e 6). Mas
a variável perceba que mesmo não podendo ter instâncias de classes
referência
abstratas, podemos
Carro ter variáveis
carro1 referência do tipo da classe abstrata (Listagem 7.33, linha 11):
= newdeCarro();
carro1.ano = "2001";
public class Zoo
carro1.modelo= {
"fusca";
public static
carro1.cor void main(String[] args) {
= "prata";

//errado - abstrata não instancia


Animal bicho = new Animal("sem ruido");

//errado - abstrata não instancia


Felino bichanos = new Felino("sem ruido");

Gato gato = new Gato();

gato.fazerRuido(); //qualquer Gato


bichanos = gato; //Gato é um Felino - up-casting
bichanos.fazerRuido();//polimofirmo de referência
bicho = bichanos;//Felino é um Animal - up-casting
bicho.fazerRuido();//polimofirmo
Figura 2.4 – Layout Memória após de referência
inicialização
}
//criando
}
novo alias
Carro carro2 = carro1;
Listagem 7.33 – Reunindo a bicharada

7.10 Interfaces
Uma interface, a grosso modo, é um tipo de classe abstrata que só pode conter métodos abstratos ou
atributos marcados com o modificador final. Interfaces, por natureza, são
abstratas, não necessitando do modificador abstract.
Quando você cria uma interface, está definindo um contrato. Este Interface é uma classe
contrato reza o que uma classe, que aceita o contrato, deverá ter como abstrata que só pode
comportamento definido pela interface implementado.
conter métodos abstratos
e/ou atributos marcados
7.10.1 Porque utilizar Interfaces?
Utilizamos interfaces quando queremos uma relação entre classes não com o modificador final.
relacionadas (semelhante a uma herança)
Figura que
2.5 – Layout implementem
Memória duas variáveismétodos similares.
referência para o mesmo objeto
Através de interfaces, podemos compartilhar esse comportamento entre as
classes, mas sem forçar um relacionamento entre elas.
Tome como de
2.3 Membros exemplo a classe Linha, ela contém métodos que obtém o
Instância
tamanho Cada
da linha
objeto criado odeverá
e compara objeto terLinhasuacom objetosinstância
própria de mesma de classe.
variáveis
Considere também que tenhamos outra classe, MeuInteger, que contém métodos
Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
que comparam um objeto MeuInteger com objetos da mesma classe. Você pode
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
ver que ambas as classes têm métodos similares que comparam objetos do
classe. Porém não devemos confundir isto com a implementação do método, que
mesmo tipo, entretanto eles não estão relacionados. Para ter certeza de que as Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
classes implementam os mesmos métodos com as mesmas assinaturas, utilizamos o mesmo estado se suas
as interfaces. Você pode criar uma interface Relacao que têm alguns métodos de comparação. A Figura
variáveis 7.10 mostra
membro têm os
2.3.1 Invocação de Métodos
o diagrama UML desta interface Relacao e sua utilização pelas classes Linha e MeuInteger:
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 86
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
97
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

//atribuindo valor a variável referência


Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 7.10 – UML interface Relacao

Existem outros motivos para você querer utilizar interfaces em seus programas:

 Usar referências de objetos sem saber qual a classe que a implementa. Como veremos mais adiante,
podemos utilizar uma interface como tipo de dados.
Figura 2.4 – Layout Memória após inicialização
 Utilizar interfaces como mecanismo alternativo para herança múltipla, que permite às classes ter
//criando
mais de umanovo alias Herança múltipla não está implementada em Java.
superclasse.
Carro carro2 = carro1;
7.10.2 Interface vs. Classe Abstrata
A principal diferença entre uma interface e uma classe abstrata é que a classe abstrata pode possuir
métodos implementados (concretos) ou não implementados (abstratos). Na interface, todos os métodos são
definidos com abstratos e públicos, sendo que a palavra-chave abstract e public sendo opcional na declaração.

7.10.3 Criando Interfaces


Para criarmos uma interface, utilizamos a sintaxe abaixo:

[public] [abstract] interface <NomeDaInterface> {

< [public] [static] [final] <tipoAtributo> <atributo> = <valorInicial>; >*

< [public] [abstract] <retorno> <nomeMetodo>(<parametro>*); >*


}
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

Como exemplo, criaremos uma interface que define o relacionamento entre dois objetos de acordo com a
"ordem natural" dos objetos:
2.3 Membros de Instância
Cada objeto
public criado Relacao
interface deverá ter
{ sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
public boolean
objeto. Isto é importante, maiorQue(Object
pois denota que um métodoa, Object
pertence b); objeto da
a cada o seu estado.
classe. Porém não devemos confundir isto com a implementação
a, Objectdob);método, que
public boolean menorQue(Object Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
public boolean igualA(Object a, Object b);
o mesmo estado se suas
}
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de 7.34
Listagem mensagens, istoem
– Interface Relacao significa
Java que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operaçãoPara
apropriada
implementar queesta
foi interface
definida você
no objeto.
deve usar Ema palavra
Java, isto
chaveé feito pela na definição da classe. Por
implements
chamada de um método em um objeto usando o operador binário
exemplo, esta é a implementação da interface Relacao pela classe Linha (Figura 7.10):"." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método
public classa ser invocado
Linha e os argumentos
implements Relacao para{ o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador private
atravésdouble x1; de retorno. O método chamado deve ser
de um valor
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 87
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
98
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

private double x2;


private double y1;
//atribuindo valor ay2;
private double variável referência
Carro carro1 = new Carro();
carro1.ano = "2001"; x1, double x2, double y1, double y2) {
public Linha(double
carro1.modelo= "fusca";
this.x1 = x1;
carro1.cor this.x2
= "prata";
= x2;
this.y2 = y2;
this.y1 = y1;
}

public double tamanho() {


double tamanho = Math
.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
return tamanho;
}

public boolean maiorQue(Object a, Object b) {


double ca = ((Linha) a).tamanho();//casting
double cb = ((Linha) b).tamanho();//casting
Figura 2.4 – Layout Memória após inicialização
return (ca > cb);
}
//criando novo alias
Carro carro2 = carro1;
public boolean menorQue(Object a, Object b) {
double ca = ((Linha) a).tamanho();//casting
double cb = ((Linha) b).tamanho();//casting
return (ca < cb);
}

public boolean igualA(Object a, Object b) {


double ca = ((Linha) a).tamanho();//casting
double cb = ((Linha) b).tamanho();//casting
return (ca == cb);
}
}
Listagem 7.35 – Implementando interface Relacao na classe Linha

Quando a classe implementa uma interface ela aceita o contrato da interface, então ela têm que
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
implementar todos os métodos definidos na interface, caso contrário o compilador Java emitirá um erro de
compilação. Da mesma forma também implementamos a classe MeuInteger:

2.3 Membros de Instância


public class MeuInteger implements Relacao {
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
Integer
(atributos) definidas pelavalor;
classe. Os métodos definem o comportamento de um
public MeuInteger(int valor){ em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da
this.valor=valor; o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
} Dois objetos distintos têm
é compartilhada por todasint
private as instâncias
valor(){da classe.
return valor.intValue(); o mesmo estado se suas
}
2.3.1 Invocação de Métodos variáveis membro têm os
public boolean maiorQue(Object a, Object b) { mesmos valores.
Objetos se comunicam
int ca = pela troca de mensagens,
((MeuInteger) isto significa que um
a).valor();//casting
objeto pode ter que int
mostrar
cb = um comportamento
((MeuInteger) particular invocando uma
b).valor();//casting
operação apropriada return
que foi (ca
definida no objeto. Em Java, isto é feito pela
> cb);
chamada de um} método em um objeto usando o operador binário "." (ponto),
public boolean menorQue(Object a, Object b) {
devendo especificar aint
mensagem completa: o objeto
ca = ((MeuInteger) que é o recebedor da
a).valor();//casting
mensagem, o método int
a ser cb
invocado e os argumentos
= ((MeuInteger) para o método (se houver).
b).valor();//casting
O método invocado noreturn
recebedor
(capode também enviar informações de volta ao
< cb);
} através de um valor de retorno. O método chamado deve ser
objeto chamador
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 88
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
99
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

public boolean igualA(Object a, Object b) {


//atribuindo valor
int ca = a((MeuInteger)
variável referência
a).valor();//casting
Carro carro1 = new Carro();
int cb = ((MeuInteger) b).valor();//casting
carro1.ano return
= "2001";
(ca == cb);
carro1.modelo=
} "fusca";
carro1.cor
} = "prata";
Listagem 7.36 – Implementando interface Relacao na classe MeuInteger

7.10.4 Relacionamento de uma Interface para uma Classe


Como vimos nas seções anteriores, a classe pode implementar uma
interface e para isso, deve prover o código de implementação para todos os métodos
Uma classe que definidos na interface.
implementa uma Outro detalhe a se notar na relação entre uma interface e uma classe, é que a
interface tem que classe pode apenas herdar uma única superclasse, mas pode implementar diversas
interfaces. Um exemplo de uma classe que implementa diversas interfaces:
implementar o código
para todos os FiguraPessoa
public class implements
2.4 – Layout IPessoa, IVivente, IQualquerUm {
Memória após inicialização
métodos definidos na // algumas linhas de código
//criando novo }alias
interface.
Carro carro2 = carro1;
Outro exemplo de uma classe que estende de outra superclasse e
implementa interfaces:

public class EstudanteComputacao extends Estudante


implements IPessoa,IVivente {
// algumas linhas de código
}

Uma interface não faz parte de uma hierarquia de classes. Classes não relacionadas podem implementar a
mesma interface.

7.10.5 Herança entre Interfaces


Interfaces não são partes de uma hierarquia de classes. Entretanto, interfaces podem ter relacionamentos
entre si. Por exemplo, suponha Figura
que tenhamos duas interfaces,
2.5 – Layout Memória IEstudante
duas variáveis e IPessoa.
referência para Se IEstudante estende IPessoa,
o mesmo objeto
esta herda todos os métodos declarados em IPessoa.

public interface IPessoa {


2.3 Membros
... de Instância
}Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um Interface pode ser
em um objeto constituem
public interface IEstudante extends IPessoa {
objeto. Isto é importante, pois denota que um método pertence a cada objeto da utilizada como
... o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que declaração de um tipo
} Dois objetos distintos têm
é compartilhada por todas as instâncias da classe. de váriavel, apesar de
o mesmo estado se suas
Além disto, interfaces podem ter herança múltipla, exemplo: não poder ser
2.3.1 Invocação de Métodos variáveis membro têm os
instanciada.
Objetos se comunicam
interface IPessoa{} pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
apropriadaIQualquerOutroInterface{}
operaçãointerface que foi definida no objeto. Em Java, isto é feito pela
chamadainterface
de um método em um objeto
IEstudante extends usando o operador binário "." (ponto),
devendo especificar aIPessoa,IQualquerOutroInterface
mensagem completa: o objeto que é{ o recebedor da
mensagem, o método
//... a ser invocado e os argumentos para o método (se houver).
O método } invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 89
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
100
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

7.10.6 Interface vs. Classe


Uma característica
//atribuindo comum
valor a entre uma interface
variável e uma classe é que ambas são tipos. Isto significa que
referência
uma interface
Carro pode
carro1ser usada
= newnoCarro();
lugar onde uma classe é esperada. Por exemplo, dadas a classe Pessoa e a
interfacecarro1.ano
IPessoa, as seguintes declarações são válidas:
= "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";
IPessoa ip = new Pessoa();
Pessoa cp = new Pessoa();

Entretanto, não se pode criar uma instância de uma interface, assim como não podemos instanciar
classes abstratas. Um exemplo disso é:

IPessoa ip = new IPessoa(); //erro - não instancia interface !!!

Outra característica comum é que ambas, interfaces e classes, podem definir métodos, embora uma
interface não possa tê-los implementados. Já uma classe pode.

7.11 Classes Aninhadas


Figuraa2.4
Classe aninhada (nested class) surgiu – Layout
partir daMemória
versãoapós
1.1 inicialização
do Java. Assim como métodos e propriedades,
uma classe aninhada énovo
//criando aliasum membro da classe.
considerada
Carro carro2 = carro1;
public class Externa {
class Interna { Classe aninhada é um
// ...
}
recurso que permite
} definir uma classe
dentro de outra.
Uma classe aninhada é utilizada para reforçar sua dependência com a sua
classe externa, ou seja, ela depende dos outros membros da classe externa para
funcionar. Por exemplo, suponha um cursor que depende totalmente de um editor de
texto:

public class EditorDeTexto {


class Cursor {
// ...
} Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
}

Alguns consideram que este novo recurso afetou a legibilidade do código, tornando-o mais complexo,
2.3 Membros
inclusive de Instância
aninhando uma à outra de forma recursiva, como por exemplo:
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas
public pelaAclasse.
class { Os métodos definem o comportamento de um em um objeto constituem
class B {pois denota que um método pertence a cada objeto da
objeto. Isto é importante,
class C { o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
} Dois objetos distintos têm
é compartilhada} por todas as instâncias da classe.
o mesmo estado se suas
}
2.3.1 Invocação de Métodos variáveis membro têm os
Objetosdoserecurso
Apesar comunicam pelaaninhadas
de classes troca de dificultar
mensagens, isto significa
a legibilidade umaplicado), amesmos
quemal
(se for valores.
maioria aceita que
classes
objeto internas
pode teré um
que recurso
mostrarque umpermite organizar melhor
comportamento o seu
particular conjunto uma
invocando de classes. Especialmente classes
internas
operaçãosãoapropriada
muito úteisque
para:foi definida no objeto. Em Java, isto é feito pela
chamada deTratamento
um método deem
eventos gráficos:
um objeto cliqueodeoperador
usando mouse, pressionamento de botão, etc. É utilizado bastante
binário "." (ponto),
quando se estuda a parte de tratamento de
devendo especificar a mensagem completa: o objeto que é o recebedor da AWT.
este recurso eventos gráficos
mensagem,  Classe aninhadas
o método de teste:e os
a ser invocado emargumentos
vez de se criar
parauma classe (se
o método externa à uma classe, para testar as suas
houver).
funcionalidades, é possível e recomendável criar uma
O método invocado no recebedor pode também enviar informações de volta ao classe aninhada que poderá ter vários métodos
de teste. Iremos ver sobre isso mais à frente.
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 90
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
101
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

7.11.1 Classe Aninhada valor a variável referência


//atribuindo
Veja o seguinte
Carro carro1 exemplo, Listagem 7.37, ele define a classe ClasseExterna (linha 1), uma classe interna
= new Carro();
(linha 3),carro1.ano
e a instância (linha= 10) :
"2001";
carro1.modelo= "fusca";
carro1.cor = "prata";
public class ClasseExterna {

public class ClasseInterna {


public String toString() {
return "Classe Interna";
}
} // ClasseInterna

public String toString() {


ClasseInterna ci = new ClasseInterna();
return "Classe Externa com " + ci;
} // toString

public static void main(String[] args) {


Figura=2.4new
ClasseExterna ce – Layout Memória após inicialização
ClasseExterna();
System.out.println(ce);
//criando novo alias
Carro }carro2
// main
= carro1;
} // ClasseExterna
Listagem 7.37

Note neste exemplo, que é possível ter classes dentro de outras, onde a classe ClasseExterna, definiu uma
classe internamente denominada ClasseInterna. Ambas sobrepõe o método toString(), que é executado
automaticamente toda vez que é invocado (chamado) o método System.out.print().
Note que quando se compila ClasseExterna.java, surgem dois arquivos .class:
 ClasseExterna.class - este é o resultado da compilação de ClasseExterna.
 ClasseExterna$ClasseInterna.class - este é o resultado da compilação de Assim como outros
ClasseInterna, porém como ela é interna, a sua classe externa também é membros da classe,
listada, separada pelo cifrão ($). como métodos e
propriedades,
7.11.2 Classes aninhadas estáticas
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto classes aninhadas
Assim como outros membros da classe, como métodos e propriedades, classes também pode ser
aninhadas também pode ser estáticas denominadas classes aninhadas estáticas (static estáticas.
nested
2.3 class)
Membrosou nãodeestáticas
Instânciadenominadas classes internas de instância (instance
inner class).
CadaAssim, quando
objeto criado deveráclasse
dizemos ter interna nunca instância
sua própria referimos de a uma classe-
variáveis Os valores das variáveis
membro estática; enquanto que classe aninhada é um termo geral
(atributos) definidas pela classe. Os métodos definem o comportamento de um tanto para classes-
membro estáticas ou não. Vejamos o exemplo: em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
public class ClasseTopo { Dois objetos distintos têm
é compartilhada
//por todasé asuma
esta instâncias
classedaaninhada
classe. estática o mesmo estado se suas
// static nested class
2.3.1 Invocação de Métodos
public static class ClasseAninhadaEstatica { variáveis membro têm os
Objetos se comunicamstatic
public void
pela troca de main(String[] args) {que um
mensagens, isto significa mesmos valores.
System.out.println("Classe Aninhada Estática");
objeto pode ter que }mostrar um comportamento particular invocando uma
operação apropriada
} que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
// esta
devendo especificar é uma classe
a mensagem interna
completa: de instancia
o objeto que é o recebedor da
// instance inner class
mensagem, o método a ser invocado
class ClasseInterna { e os argumentos para o método (se houver).
O método invocado no//recebedor
somente classes aninhadas estáticasdepodem
pode também enviar informações volta ao
ter membros estáticos
objeto chamador através
// de
as um valor
duas de retorno. abaixo
declarações O método chamado deve
retornariam ser
erro
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 91
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
102
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

//static int i = 1;
//public static void main(String[] args) { }
//atribuindo
} valor a variável referência
Carro public
carro1static
= new void
Carro();
main(String[] args) {
carro1.ano System.out.println("Classe
= "2001"; Topo");
carro1.modelo=
} "fusca";
}carro1.cor = "prata";
Listagem 7.39 – Classes Internas e classes estáticas aninhadas

Note neste exemplo, que tanto a classe de mais alto nível (ClasseTopo, linha 1) e a sua classe aninhada
ClasseAninhadaEstatica (linha 4 ), possuem cada uma seu próprio método main(). Você pode usar cada classe de
forma independente, experimente executar as classes como segue:

> java ClasseTopo


> java ClasseTopo\$ClasseAninhadaEstatica

Note neste exemplo, que como regra de sintaxe as classes internas não-estáticas Local inner classes
(ClasseInterna, linha 12) não podem ter membros
Figura 2.4 estáticos.
– Layout Memória após inicialização são classes
//criando novo alias definidas dentro de
7.11.3 Classes
Carro internas
carro2locais
= carro1; um bloco de
Classes internas locais (local inner classes) são aquelas que são definidas dentro método.
de um bloco de método ou de um comando (statement). Vejamos o exemplo:

public class ClasseInternaLocal {


public static void main(String[] main) {
class DentroDaMain {
public String toString() {
return "DentroDaMain";
}
}
DentroDaMain ddm = new DentroDaMain();
// erro: nao é permitido classes aninhadas estáticas locais
//static class EstaticaDentroDaMain { }
//erro: não é permitido qualquer modificador de acesso
// private class PrivadaDentroDaMain { }
System.out.println(ddm);
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
if (true) {
class DentroDoIf {
public String toString() {
2.3 Membros de Instância return "DentroDoIf";
}
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
}
(atributos) definidas pela classe. Os métodos definem
DentroDoIf ddi = new DentroDoIf();o comportamento de um em um objeto constituem
objeto. Isto é importante, poisSystem.out.println(ddi);
denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos
} confundir isto com a implementação do método, que
//erro: fora do escopo do if Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
//DentroDoIf ddi1 = new DentroDoIf(); o mesmo estado se suas
}
2.3.1 }Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca Listagem
de mensagens, isto significa que um mesmos valores.
7.40 – Local inner class
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaNeste exemplo, veja que é possível criar classes internas locais tanto dentro de um bloco de método (linha
de um método em um objeto usando o operador binário "." (ponto),
3) ou dentro de um bloco de comando (linha 15). Note também que não é permitido criar classes estáticas locais,
devendo especificar a mensagem completa: o objeto que é o recebedor da
utilizando-se do modificador static. Também não é permitido utilizar modificadores de acesso - como public,
mensagem, o método a ser invocado e os argumentos para o método (se houver).
protected e private - à classes internas, somente é permitido utilizar o padrão - sem modificadores de acesso.
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 92
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
103
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

7.11.4 Classes internas anônimas


Classes internas anônimas
//atribuindo valor a (anonymous inner classes) em geral aumentam bastante a complexidade de
variável referência
entendimento
Carrodecarro1
seu código, portanto
= new deve ser utilizado de forma comedida ou em situações em que seu usa já
Carro();
seja esperado - por exemplo,
carro1.ano = em tratamento de eventos gráficos AWT. Vejamos o exemplo:
"2001";
carro1.modelo= "fusca";
carro1.cor = "prata";
public class TesteClasseAnonima {

public static void main(String[] args) {

class TesteDescendente extends Teste {

public String toString() {


return "TesteDescendente - filha de: " +
super.toString();
}

} // fim TesteDescendente

Teste t1 = new Teste();


Teste t2 = new Figura 2.4 – Layout Memória após inicialização
TesteDescendente();
Teste t3;
//criando novo alias
Carro carro2 = carro1;
t3 = new Teste() {

public String toString() {


return "Classe anonima - filha de: " + super.toString();
}; // fim toString()

}; // fim new Teste()

System.out.println("t1:" + t1 + "\nt2:" + t2 + "\nt3:" + t3);

} // fim main()

} // fim TesteClasseAnonima

class Teste {

Figura
public String 2.5 – Layout Memória
toString() { duas variáveis referência para o mesmo objeto
return "Classe Teste";
} // fim main()

2.3 Membros de Instância


} // fim Teste
Cada objeto criado deverá ter sua própria instância de variáveis
Listagem 7.41 – Classes Internas Anônimas Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
Na Listagem
classe. Porém 7.41, a confundir
não devemos instância associada
isto com aà implementação
variável t2 (linhado13), foi criada
método, que através da definição de uma
classe interna denominada TesteDescendente (linha 5), que é filha da classe Teste (linha 27). DoisDe
objetos
forma distintos
análoga, etêm
é compartilhada por todas as instâncias da classe.
com o mesmo efeito, foi criado uma nova definição de classe, porém sem utilizar nenhum nome novo, conformeo mesmo estado se suas
podemos ver na declaração da variável t3 (linhas 15-19).
2.3.1 Invocação de Métodos variáveis membro têm os
Simplesmente foi incluído um novo bloco que define a classe anônima após a chamadamesmos new Teste() (linha
valores.
Objetos se comunicam pela troca de mensagens, isto significa que um
15), com uma sobreposição do método toString() da classe pai Teste().
objeto pode ter que mostrar um comportamento particular invocando uma
Como uma classe interna anônima não tem nome, não possível referenciá-la além do ponto de sua
operação apropriada
declaração, quesalvar
então, deve-se foi sua
definida no objeto.
referência no mesmo Eminstante
Java, isto é definição.
de sua feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar ademensagem
7.11.5 Modificadores acesso completa: o objeto que é o recebedor da
mensagem, o método a ser invocado
Assim como outros membros, e os argumentos
pode-se utilizarpara o método
private, public(seouhouver).
protected na definição de classes
O método invocado no recebedor
aninhadas. Vejamos o exemplo: pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 93
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
104
www.3way.com.br
Linguagem de Programação
Linguagem Java Java
de Programação

class TiposDeAcesso {
static class AcessoPadrao {
//atribuindo valor
public a variável
static referência args) {
void main(String[]
Carro carro1 = new Carro();
System.out.println("AcessoPadrao");
carro1.ano} = "2001";
carro1.modelo=
} "fusca";
carro1.cor = "prata";
public static class AcessoPublico {
public static void main(String[] args) {
System.out.println("AcessoPublico");
}
}

private static class AcessoPrivado {


public static void main(String[] args) {
System.out.println("AcessoPrivado");
}
}

protected static class AcessoProtegido {


Figura main(String[]
public static void 2.4 – Layout Memória após inicialização
args) {
System.out.println("AcessoProtegido");
//criando novo alias
}
Carro carro2 = carro1;
}
}

public class TesteDeAcesso {


public static void main(String[] args) {
TiposDeAcesso.AcessoPadrao.main(null);
TiposDeAcesso.AcessoPublico.main(null);
TiposDeAcesso.AcessoProtegido.main(null);
// TiposDeAcesso.AcessoPrivado.main(null); //isto causa erro
}
}

class TesteDescendente extends TiposDeAcesso {


public static void main(String[] args) {
AcessoPadrao.main(null);
AcessoPublico.main(null);
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
AcessoProtegido.main(null);
// AcessoPrivado.main(null); // isto causa erro
}
}
2.3 Membros de Instância
Listagem 7.42 – Classes aninhadas e modificadores de acesso
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto.Você
Isto pode executar as
é importante, classes
pois como
denota quesegue:
um método pertence a cada objeto da o seu estado.
classe. >Porém
java TesteDeAcesso
não devemos confundir isto com a implementação do método, que
AcessoPadrao Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
AcessoPublico o mesmo estado se suas
2.3.1 AcessoProtegido
Invocação de Métodos variáveis membro têm os
> java TiposDeAcesso\$AcessoPadrao
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
AcessoPadrao
objeto pode ter que mostrar um comportamento particular invocando uma
operação> java TiposDeAcesso\$AcessoPublico
apropriada que foi definida no objeto. Em Java, isto é feito pela
AcessoPublico
chamada de um método em um objeto usando o operador binário "." (ponto),
> java TiposDeAcesso\$AcessoPrivado
devendo especificar a mensagem completa: o objeto que é o recebedor da
AcessoPrivado
mensagem, o método a ser invocado e os argumentos para o método (se houver).
> java TiposDeAcesso\$AcessoProtegido
O método invocado no recebedor pode também enviar informações de volta ao
AcessoProtegido
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto. Seja um Profissional Aprendendo com Profissionais 94
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
105
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Aqui neste exemplo,


//atribuindo apenas
valor exemplificamos
a variável o acesso externo por uma classe de mesmo pacote e uma
referência
classe descendente.
Carro carro1Há também
= newoutras situações de teste de acesso externo, como: classe por pacote diferente e
Carro();
classe descendente.
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor
7.12 Tipos Enumerados= "prata";
Quando você precisar criar uma constante, você utilizará definição de variáveis estática e final. Toda vez
que usamos a palavra-chave final estamos informando que algo não pode mudar. Com classes, final significa que
não podemos mais fazer herança, com métodos não podemos mais sobrepô-lo e com variáveis significa que após a
inicialização o valor da variável não pode mais ser alterado, exemplo:

static final int JANEIRO=1;

Algumas vezes necessitamos de conjuntos de valores constantes - por exemplo, conjunto de estação do
ano. Uma abordagem padrão para definição de um conjunto com esta natureza, seria definir uma classe ou
interface contendo as constantes como abaixo:

public class Estacoes { Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro public
carro2 static final
= carro1; int PRIMAVERA = 1;
public static final int VERAO = 2;
public static final int OUTONO = 3;
public static final int INVERNO = 4;
}

public class EstacoesDoAno {

int estacao;

public void setEstacao(int estacao){


this.estacao=estacao;
}

public static void main(String[] args) {

EstacoesDoAno estacaoAtual = new EstacoesDoAno();


Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
estacaoAtual.setEstacao(Estacoes.PRIMAVERA);// (1) nome constante
// qualificado pelo nome da classe
estacaoAtual.setEstacao(1);// mesmo que anterior
2.3 Membros deestacaoAtual.setEstacao(5);//
Instância não existe mas é aceito
Cada objeto System.out.println(Estacoes.VERAO);
criado deverá ter sua própria instância de variáveis "2",Osevalores
// Imprime das variáveis
não "VERAO"
(atributos) definidas
} pela classe. Os métodos definem o comportamento de um em um objeto constituem
} é importante, pois denota que um método pertence a cada objeto da
objeto. Isto o seu estado.
classe. Porém não devemos confundirListagem isto com
7.43 –aConjuntos
implementação doJava
de constantes em método,
1.4 que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
A abordagem utilizada apresenta algumas desvantagens:
2.3.1 Invocação variáveis membro têm os
 não éde Métodos
segura quanto ao tipo – qualquer inteiro pode ser passado ao método setEstacao().
Objetos se comunicam
 devemos pela da
utilizar o nome troca de (ou
classe mensagens,
interface) isto
parasignifica
referenciar quea constante.
um mesmos valores.
objeto pode oter que
valor nãomostrar
representauma comportamento
informação textualparticular
do nome da invocando
constante.uma
operação apropriada
as classesque foi definida
que utilizam no objeto.devem
estas constantes Em Java, isto é feitocaso
ser recompiladas pelaseus valores sofram mudança.
chamada de um método em um objeto usando o operador binário "." (ponto),
devendoJava
especificar a mensagem
5.0 implementa completa:
este conceito de oconjunto
objeto de queconstantes
é o recebedorcom o da novo tipo enum. O tipo enum
representa
mensagem,oso tipos
métodoenumerados ou conjuntos
a ser invocado comumente
e os argumentos paravistos em outras
o método (se linguagens
houver). de programação, ele define
um conjuntoinvocado
O método de nomes noe recebedor
valores constantes. Vejamosenviar
pode também como informações
fica nosso exemplo ao enum:
usando
de volta
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 95
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
106
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

public enum Estacoes {


PRIMAVERA,VERAO,OUTONO,INVERNO;
//atribuindo valor a variável referência O tipo enum representa os
}
Carro carro1 = new Carro(); tipos enumerados ou
carro1.ano = "2001";
public class EstacoesDoAno { conjuntos de nomes e
carro1.modelo= "fusca";
Estacoes estacao; valores constantes.
carro1.cor = "prata";
public void setEstacao(Estacoes estacao){
this.estacao=estacao;
}
public static void main(String[] args) {
EstacoesDoAno estacaoAtual =
new EstacoesDoAno();

estacaoAtual.setEstacao(Estacoes.PRIMAVERA);
//estacaoAtual.setEstacao(1);// erro - nao existe 1
//estacaoAtual.setEstacao(5);// erro - nao existe 5
System.out.println(Estacoes.VERAO); // Imprime "VERAO"
}
}
Figura 2.4 – Layout Memória após inicialização
Listagem 7.44 – Usando tipos enumerados em Java 1.5
//criando novo alias
Carro carro2 = carro1;
O tipo enum estende implicitamente a classe java.lang.Enum. Nossas enumerações podem ter
construtores, métodos, variáveis. Como as classes, as enumerações podem ser declaradas dentro de classes, como
enumerações estáticas e locais. Veja exemplo de um enumerado mais complexo:

public enum EEstacoes {

PRIMAVERA(Mes.SETEMBRO,Mes.NOVEMBRO),
VERAO(Mes.DEZEMBRO,Mes.FEVEREIRO),
OUTONO(Mes.MARÇO,Mes.MAIO),
INVERNO(Mes.JUNHO,Mes.AGOSTO);

enum Mes {
JANEIRO,FEVEREIRO,MARÇO,ABRIL,MAIO,JUNHO,JULHO,
AGOSTO,SETEMBRO,OUTUBRO,NOVEMBRO,DEZEMBRO;
}
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
private Mes inicio, fim;

//visibilidade são private ou package


2.3 Membros de Instância
private EEstacoes(Mes inicio,Mes fim){
Cada objeto this.inicio=inicio;
criado deverá ter sua própria instância de variáveis Os valores das variáveis
this.fim=fim;
(atributos) definidas pela classe. Os métodos definem o comportamento de um
} em um objeto constituem
objeto. Isto é importante, pois denota que um
public Mes getInicio() { método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir
return inicio;a implementação do método, que
isto com
Dois objetos distintos têm
é compartilhada } por todas as instâncias da classe.
public Mes getFim() { o mesmo estado se suas
return fim;
2.3.1 Invocação de Métodos variáveis membro têm os
} mesmos valores.
}Objetos se comunicam pela troca de mensagens, isto significa que um
objeto pode ter que mostrar um comportamento particular invocando uma
operaçãopublic
apropriada
classque foi definida no {objeto. Em Java, isto é feito pela
EEstacoesDoAno
chamada de um método em um objeto usando o operador binário "." (ponto),
public static void main(String[] args) {
devendo especificar aString
mensagem completa: o objeto que é o recebedor da
msg="";
mensagem, o método fora ser (EEstacoes
invocado e os estacao
argumentos para o método (se houver).
: Eestacoes.values()){
O método invocado no recebedorswitchpode também enviar
(estacao) { informações de volta ao
objeto chamador através de um valorcase PRIMAVERA
de retorno. : msg="Flores,Frutos
O método chamado deve ser e chuvas"; break;
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 96
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
107
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

case VERAO : msg="Calor e Chuvas"; break;


case OUTONO : msg="Ventos e Seca"; break;
//atribuindo valor a variável referência
case INVERNO : msg="Frio e Seca"; break;
Carro carro1 = new
} Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
System.out.println(estacao + " começa no mês "
carro1.cor = "prata"; + estacao.getInicio() + ", termina no mês "
+ estacao.getFim() + ", temos " + msg);
}
}
}
Listagem 7.45 – Enumerados com métodos, construtores, etc

O tipo enumerado acrescenta dois métodos implicitamente,

static <tipo da sua enum>[] values() Retorna um array contendo as constantes desta
enum, na ordem em que são declaradas
static <tipo da sua enum> valueOf(StringFigura
nome) 2.4 – Layout MemóriaRetorna uma constante da enum com o argumento
após inicialização
nome passado.
//criando novo alias
Carro carro2 = carro1;
O comando switch, no Java 5, também pode ser usado com enumerados e não somente tipos integrais
inteiros, o rótulo case pode ser acompanha da constante.

7.13 Fazer Laboratório 7


Siga instruções do laboratório e tome cuidado com o tempo de execução, sempre recorra ao instrutor em
caso de dúvida, nunca deixe uma dúvida sem reposta

7.14 Exercícios
Escreva, compile e execute todas listagens de código apresentadas neste capítulo.

8 Exceções
Uma exceção é um evento que interrompe o fluxo normal de processamento de uma classe. Este evento é
um erro de algum tipo. Isto causa o término inesperado da execução de seu programa.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Estes são alguns dos exemplos de exceções que podem ter ocorridos em exercícios anteriores:
 ArrayIndexOutOfBoundsException: ocorre ao acessar um elemento inexistente de um array.
 NumberFormatException: ocorre ao enviar um parâmetro não-numérico para o método
2.3 Membros de Instância
Integer.parseInt().
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um
8.1 Manipulando Exceções Exceção
em é um constituem
um objeto evento
objeto. Isto é importante, pois denota que um método pertence a cada
Para tratar exceções em Java utilizamos a declaração try-catch-finally. O que
objeto da queointerrompe
seu estado.o
classe. Porém não devemos confundir isto com a implementação do método, que
devemos fazer para proteger as instruções passíveis de gerar uma exceção é inserí-las Dois objetos fluxo normal de têm
distintos
édentro
compartilhada por
deste bloco. todas as instâncias da classe. processamento de
o mesmo estado se suas
A forma geral de um try-catch-finally é: uma classe.
variáveis Todatêm os
membro
2.3.1 Invocação de Métodos exceção é de algum
Objetos
try{ se comunicam pela troca de mensagens, isto significa que um mesmos valores.
tipo.
objeto pode//escreva
ter que mostrar um comportamento
as instruções passíveisparticular
de gerarinvocando
uma exceçãouma
//neste que
operação apropriada blocofoi definida no objeto. Em Java, isto é feito pela
} catch (<exceptionType1> <varName1>){
chamada de um//escreva
método emaqui um objeto usando o operador binário "." (ponto),
o código do seu programa, caso ocorra
devendo especificar
//umaa exceção
mensagem de completa: o objeto tipo
um determinado que é o recebedor da
mensagem,
} .o método
. . a ser invocado e os argumentos para o método (se houver).
O método} invocado
catch (<exceptionTypen> <varNamen>){
no recebedor pode também enviar informações de volta ao
//escreva aqui o código do seu programa, caso ocorra
objeto chamador através de um valor de retorno. O método chamado deve ser
//uma exceção de um determinado tipo
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 97
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
108
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

} finally {
//escreva a ação que o seu programa executará caso
//atribuindo
//ocorra valor
ou nãoa um
variável
erro oureferência
exceção
Carro
} carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
Exceções geradas durante a execução do bloco try podem ser detectadas e tratadas num bloco catch. O
carro1.cor = "prata";
código no bloco finally é sempre executado, ocorrendo ou não a exceção.
A seguir são mostrados os principais aspectos da sintaxe da construção de um try-catch- finally:
1. A notação de bloco é obrigatória, o try.
2. Para cada bloco try, pode haver um ou mais blocos catch, mas somente um bloco finally.
3. Um bloco try deve que ser seguido de pelo menos um bloco catch ou um bloco finally, ou ambos.
4. Cada bloco catch define o tratamento de uma exceção de um tipo.
5. O cabeçalho do bloco catch recebe somente um argumento, que é o tipo da exceção (Exception) que
este bloco irá tratar.
6. A exceção deve ser da classe Throwable ou de uma de suas subclasses.

Tomemos, por exemplo, uma classe que imprime o segundo argumento passado através da linha de
comandos. Supondo que não há verificaçãoFigura
no código paraMemória
2.4 – Layout o número de argumentos.
após inicialização

//criando novo alias


public class ExceptionExample {
Carro carro2 = carro1;
public static void main(String[] args) {

System.out.println(args[1]);
System.out.println("Finish");
}
}

Ao executar esta classe sem informar nenhum argumento, ao tentar acessar diretamente - conforme o
exemplo descrito - o segundo argumento args[1], uma exceção será lançada e interromperá a execução normal do
programa. A seguinte mensagem será mostrada na console do sistema:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1


at ExceptionExample.main(ExceptionExample.java:5)

Para prevenir que isto Figura


ocorra,2.5 – Layout Memória duas variáveis referência para o mesmo objeto
podemos colocar o código dentro de um bloco try-catch. O bloco finally é
opcional. Neste exemplo, não utilizaremos o bloco finally.

2.3 Membros de Instância


public class ExceptionExample {
Cada objeto criado deverá ter sua própria args)
public static void main(String[] { de variáveis
instância Os valores das variáveis
(atributos) definidas pela
try classe.
{ Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, poisSystem.out.println(args[1]);
denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir
} catch isto com a implementação do método,
(ArrayIndexOutOfBoundsException exp)que
{
System.out.println("Exception caught!"); Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
} o mesmo estado se suas
2.3.1 Invocação
System.out.println("Finish"); variáveis membro têm os
} de Métodos
}Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular
Listagem 8.1 – Tratando invocando uma
exceção de runtime
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaAssim,
de um método
quando em um objeto
tentarmos rodar ousando
programa o operador
novamente sem"."
binário (ponto), dos argumentos, a saída
a informação
devendo
trataria especificar
a exceção a mensagem
e o fluxo do programacompleta: o objeto quemostrando
não será interrompido, é o recebedor da
o resultado:
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado
Exception no recebedor
caught! Finish pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 98
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
110
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

8.2 Categorias de Exceções


Imediatamente abaixo
//atribuindo valordaaclasse java.lang.Throwable
variável referênciaencontram-se as duas categorias gerais de exceções:
as classes java.lang.Error
Carro carro1 e=java.lang.Exception.
new Carro();
A classe Exception
carro1.ano trata as exceções que os usuários podem tratar. Em geral, estas condições são o
= "2001";
resultadocarro1.modelo= "fusca";
de algum erro lógico em sua programação - como divisão por zero e referência inválida de índice em um
carro1.cor = "prata";
array – ou erros imponderáveis - como a falha de comunicação com um servidor de banco de dados.
Por outro lado, a classe Error é utilizada pela JVM para manipular os erros ocorridos no ambiente de
execução (JRE). Geralmente, estes erros estão além do controle do programador Java, desde que sejam causados
dentro do ambiente de execução. Por exemplo: erro de falta de memória e erro de acesso ao disco rígido.
Abaixo encontra-se a hierarquia das classes de exceções. Todas essas exceções estão definidas no pacote
java.lang ou em outros pacotes, como java.io.

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método
Figura 8.1 – Hierarquia chamado deve ser
de Exceções
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 99
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
111
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

O bloco catch respeita


//atribuindo valor aa hierarquia
variáveldas das classes de exceções, múltiplos blocos catch devem ser
referência
ordenados da subclasse
Carro carro1para a superclasse.
= new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca"; {
class MultipleCatchError
carro1.cor = "prata"; Todas as exceções são
public static void main(String args[]) { subclasses, direta ou
try { indiretamente, da classe
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]); java.lang.Throwable.
System.out.println(a / b);

} catch (Exception e) {
System.out.println(e);

} catch (ArrayIndexOutOfBoundsException e2) {


System.out.println(e2);
}
System.out.println("After try-catch-catch.");
} Figura 2.4 – Layout Memória após inicialização
}
//criando novo alias
Listagem =
Carro carro2 8.2 –carro1;
Pegue exceções na ordem inversa da hierarquia

A compilação desse código produzirá a mensagem de erro abaixo, já que a classe Exception é superclasse
da classe ArrayIndexOutOfBoundsException.

MultipleCatchError.java:9: exception java.lang.ArrayIndexOutOfBoundsException has already been caught


} catch (ArrayIndexOutOfBoundsException e2) {

O catch faz um entrevista com a referência do objeto da exceção lançada,


As exceção derivadas ele pergunta se a referência é-um objeto do tipo da exceção marcada em catch. No
de Error são lançadas caso, qualquer exceção é sempre uma subclasse de Exception, logo os blocos catch
inferiores jamais serão alcançados.
pela JVM, já as
RuntimeException são
8.2.1 Exceções Verificadas e Não-verificadas
normalmente erros de Figura 2.5 –Uma exceção
Layout Memória duaspode
variáveisser verificada
referência ou objeto
para o mesmo não-verificada.
Uma exceção
lógica. verificada é aquela que o compilador Java exige o tratamento. O compilador se
certifica que cada catch ou lista de exceções encontram-se dentro da cláusula
2.3 Membros de Instância throws. Se a exceção verificada não for capturada nem listada, ocorre um erro de
Cada objeto criado compilação.
deverá ter sua própria instância de variáveis Os valores das variáveis
Ao contrário
(atributos) definidas pela classe. Os métodos das oexceções
definem verificadas,
comportamento de as
umexceções não-verificadas não
em um objeto constituem
forçam o tratamento de exceções no momento
objeto. Isto é importante, pois denota que um método pertence a cada objeto da da compilação. As classes de
exceção não-verificadas são: Error, RuntimeException, e suas o seu estado.
subclasses. Error são
classe. Porém não devemos confundir isto com a implementação do método, que
lançadas pela
é compartilhada por todas as instâncias JVM, devendo se preocupar com elas quem estiver desenvolvendotêm
da classe.
Dois objetos distintos
recursos para JVM. RuntimeException são erros de lógica, o mesmo
ficandoestado
a cargose do
suas
2.3.1 Invocação de Métodosprogramador se livrar delas. variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
8.3 Lançando Exceções
objeto pode ter que mostrar um comportamento particular invocando uma
8.3.1 A palavra-chave
operação apropriada quethrow
foi definida no objeto. Em Java, isto é feito pela
Além de capturar
chamada de um método em exceções, Java também
um objeto usando opermite
operadorquebinário
os métodos lancem exceções. A sintaxe para o
"." (ponto),
lançamento de exceções é:
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
throw <objetoExceção>;
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador
Considere através de um valor de retorno. O método chamado deve ser
este exemplo:
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 100
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
112
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

class ThrowDemo {
//atribuindo valor a variável referência
Carro public
carro1static
= new void
Carro();
main(String args[]) {
carro1.ano = "2001";
carro1.modelo=
try {"fusca";
carro1.cor = "prata";
throw new RuntimeException("throw demo");
} catch (RuntimeException e) {
System.out.println("Exceção capturada aqui.");
System.out.println(e);
}
}
}
Listagem 8.3 – Lançando exceções

Esta classe mostrará a seguinte saída:

Exceção capturada aqui. java.lang.RuntimeException: throw demo


Figura 2.4 – Layout Memória após inicialização
8.3.2 Desviando
//criando Exceções
novo alias
No casocarro2
Carro de um método causar uma exceção, mas não capturá-la, deve-se utilizar a palavra-chave throws
= carro1;
para repassar esta exceção para quem o método que o chamou. Esta regra se aplica apenas para exceções
verificadas. Veremos mais sobre exceções verificadas e não-verificadas mais a frente.
Esta é a sintaxe para o uso da palavra-chave throws:

<tipo>* <nomeMetodo> (<argumento>*) throws <listaExcecao> {


<instrução>*
}

Este exemplo mostra o método m() (linha 2) repassando a exceção ClassNotFoundException. O método
main() (linha 6), método chamador de m(), tornou-se o responsável por tratar a exceção lançada por
Class.forName(), invocado por m() (linha 3).

public class TesteThrows {

public static void


Figura m() Memória
2.5 – Layout ClassNotFoundException
throwsduas {
variáveis referência para o mesmo objeto
Class.forName("QQClase");
}

2.3 Membros de Instância


public static void main(String args[]) {
try {
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
m();
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
} catch (ClassNotFoundException e) {
objeto. Isto é importante, poisSystem.out.println(e);
denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos
} confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
}
} o mesmo estado se suas
2.3.1 Invocação de Métodos Listagem 8.4 – Repassando exceções variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
O método
objeto pode estático
ter que Class.forName()
mostrar está marcado
um comportamento throwsinvocando
particular ClassNotFoundException,
uma este método está
marcado
operaçãopara lançar exceções
apropriada tipo ClassNotFoundException,
que foidodefinida no objeto. Em Java,que istocomo sabemos
é feito pela deveria ser trata em m() por
um bloco try-catch-finally,
chamada de um métodomas em neste caso optamos
um objeto usando por ignorar, temporariamente,
o operador binário "." (ponto), relançando a exceção.
Existem quatro cenários diferentes num bloco try-catch-finally:
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,1. o Uma saída aforçada
método ocorre equando
ser invocado o fluxo depara
os argumentos controle é forçado
o método a sair do bloco try por uma instrução
(se houver).
return, continue ou break.
O método invocado no recebedor pode também enviar informações de volta ao
2. As instruções
objeto chamador atravésdentro blocodetry-finally
de umdovalor retorno.executam
O método normalmente
chamado deve sem ser
que nenhum erro ocorra.
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 101
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
113
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

3. O código pode ter um bloco catch específico para tratar a exceção que foi lançada.
4. Temos o oposto
//atribuindo do terceiro
valor cenário, onde
a variável a exceção não é tratada. Nesse caso, a exceção lançada não
referência
foi tratada
Carro carro1por= nenhum bloco catch.
new Carro();
carro1.ano = "2001";
Estes cenários são vistos
carro1.modelo= na classe a seguir:
"fusca";
carro1.cor = "prata";
public class CenariosExceptionsDemo {

static void myMethod(int n) throws Exception {

try {
switch (n) {
case 1:
System.out.println("primeiro caso");
return;
case 3:
System.out.println("terceiro caso");
throw new RuntimeException("terceiro caso demo");
case 4:
Figura 2.4 – Layout Memória após inicialização
System.out.println("quarto caso");
//criando novo alias throw new Exception(" quarto caso demo");
case 2:
Carro carro2 = carro1;
System.out.println("segundo case");
}
} catch (RuntimeException e) {
System.out.print("captura RuntimeException:"+e.getMessage());
} finally {
System.out.println("bloco try executado.");
}
}

public static void main(String args[]) {

for (int i = 1; i <= 4; i++) {

try {
CenariosExceptionsDemo.myMethod(i);
} catch (Exception e) {
Figura 2.5 –System.out.print("Exção
Layout Memória duas variáveis referênciatratada:
para o mesmo objeto
");
System.out.println(e.getMessage());
}
System.out.println();
2.3 Membros de}Instância
Cada }objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
} definidas pela classe. Os métodos definem o comportamento de um Para
(atributos) emcriar
um uma classe
objeto de
constituem
objeto. Isto é importante, pois
Listagem 8.5denota
– Cenáriosque umtry-catch-finally
do bloca método pertence a cada objeto da exceção, aoclasse tem que
seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que estender a classe
Dois objetos distintos têm
é8.4
compartilhada
Criando por todas as instâncias da classe.
Exceções o mesmo estado ou
RuntimeException se suas
Apesar de muitas classes de exceção já existirem no pacote java.lang, Exception.
variáveis membro têm os
2.3.1 classes
essas Invocação de Métodos
de exceção não são suficientes para cobrir todas possibilidades de
mesmos valores.
exceções Objetos
que podem se comunicam pela troca de mensagens,
ocorrer na implementação isto significa
de suas próprias classes. que
Daí aum
objetodepode
razão ter que
querermos criarmostrar um comportamento
nossas próprias classes de exceções.particular invocando uma
operaçãoPara apropriada que foi definida no objeto.
criar nossa própria exceção, teremos que criar Em Java, uma
isto classe
é feitoquepela
chamada de um método em um objeto usando o operador binário
estenda a classe RuntimeException ou Exception, ou qualquer de suas subclasses. "." (ponto),
devendo
Deste especificar
modo, devemosa personalizar
mensagem acompleta:
classe de oacordo
objetocom queo éproblema
o recebedor
a ser da
mensagem,
resolvido. o método
Atributos a ser invocado
de objeto e os argumentos
e construtores para o método
podem ser adicionados (se classe
na sua houver).
O método
de exceção.invocado no recebedor pode também enviar informações de volta ao
Veja um exemplo:
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 102
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
114
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

public class ExemploException extends Exception {


public ExemploException(String msg) {
//atribuindo valor a variável referência
super(msg);
Carro }carro1 = new Carro();
carro1.ano
} = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";
public class TesteExemploException {

public static void main(String args[]) {


try {
throw new ExemploException(
"Mensagem de ExemploException");
} catch (ExemploException e) {
System.out.println("Mensagem exceção : " +
e.getMessage());
}
}
}
Listagem 8.6 – Criando suas próprias classes de exceções

Figura 2.4 – Layout Memória após inicialização


8.5 Sobrescrita
//criando de Métodos
novo alias e Exceções
Quandocarro2
Carro sobrepomos um método que contenham a cláusula throws na sua definição, temos que tomar o
= carro1;
cuidado de sobrescrevermos este método com um subconjunto apropriado das exceções já definidas no método da
superclasse :
 As exceções declaradas devem ser da mesma classe ou subclasse da exceções marcadas na cláusula
throws. Por exemplo, se o método da superclasse lança um IOException então o método sobreposto
pode lançar um IOException ou FileNotFoundException (subclasse de IOException), mas não um
Exception.
 Podemos usar um subconjunto das exceções declaradas na cláusula throws do método na superclasse
 Não podemos adicionar novos tipos de classes de exceções - além das que já estão definidas na
cláusula throws no método da superclasse ao método sobreposto na subclasse.

Exemplos:

public class TesteA {


métodoA()
public void Figura 2.5 – Layoutthrows RuntimeException
Memória duas {
variáveis referência para o mesmo objeto
// alguma operacao
} Sobrepor métodos que
} contenham a cláusula
2.3 Membros de Instância
Listagem 8.7 – Relançando exceções em métodos sobrepostos throws em sua definição,
Cada objeto criado deverá ter sua própria instância de variáveis Os valores
o método devedas variáveis
lançar a
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
public class TesteB1 extends TesteA { mesma exceção ou um
objeto. Isto é importante, pois métodoA()
public void denota que um método
throws pertence a cada objeto da
ArithmeticException o seu estado.
de suas subclasses e não
classe. Porém
{ não devemos confundir isto com a implementação do método, que
// alguma operacao Dois
pode serobjetos distintos
adicionado tipos têm
é compartilhada por todas as instâncias da classe.
} o mesmo
diferentes. se suas
estado
}
2.3.1 Invocação de Métodos variáveis membro têm os
Listagem 8.8 – Sobrepondo métodos com subclasses de exceções
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
public class TesteB2 extends TesteA {
operação apropriada
publicque void foi métodoA()
definida nothrows
objeto. Exception
Em Java, isto { é feito pela
chamada de um método em um objeto
// alguma operacao usando o operador binário "." (ponto),
devendo especificar
} a mensagem completa: o objeto que é o recebedor da
mensagem,
} o método a ser invocado e os argumentos para o método (se houver).
O método invocado no8.9–
Listagem recebedor pode também
Sobrepondo métodos enviar
com superclasses informações de volta ao
de exceções
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 103
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
115
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Aqui, TesteB1 (Listagem 8.8), vai compilar pois ArithmeticException é subclasse de RuntimeException. Já
TesteB2 (Listagem 8.9), nãovalor
//atribuindo a Exception
compila, variávelé superclasse
referência de RuntimeException.
Mais exemplos,
Carro carro1seguindo
= new as regras:
Carro();
carro1.ano = "2001";
import java.io.*;
carro1.modelo= "fusca";
public class TestMultiA
carro1.cor = "prata"; {
public void metodoA() throws IOException, RuntimeException {
// faz alguma operação IO
}
}
Listagem 8.10 – Sobrepondo métodos que relançam exceções

import java.io.*;
public class TestMultiB1 extends TestMultiA {
public void metodoA() throws FileNotFoundException,
UTFDataFormatException, ArithmeticException {
// faz agluma operação de IO e númerica
}
} Figura 2.4 – Layout Memória após inicialização

//criando novo Listagem


alias8.11 – Throws com subclasses de exceções no método da superclasse
Carro carro2 = carro1;
A classe TesteMultiB1 (Listagem 8.9) compila, ambos FileNotFoundException e
Atenção, não é a
UTFDataFormatException são subclasses de IOException e ArithmeticException é uma
quantidade mas o
subclasse de RuntimeException. Observe atentamente que na linha 4, temos uma maior
número de classes, mas não temos um novo tipo de classe de Exceção, todas a exceções tipo da classe de
utilizadas são subclasses das exceções declaradas no método da superclasse. exceção que faz a
diferença para
import java.io.*; sobrepor um
import java.sql.*; método.
public class TestMultiB2 extends TestMultiA {
public void metodoA() throws FileNotFoundException,
UTFDataFormatException, ArithmeticException,
SQLException {
// faz algum IO, numero e SQL
} Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
}
Listagem 8.12 – Throws com novo tipo de exceções não declarado no método da superclasse

2.3 Membros de Instância


ACada
classeobjeto
TestMultiB2 deverá 8.12),
criado(Listagem não compila,
ter sua própria pois SQLException
instância não foi sidoOsdeclarada
de variáveis no método
valores das variáveis
em TestMultiA;
(atributos) não pode
definidas pelaserclasse.
acrescentado novosdefinem
Os métodos tipos de classes de exceções ao
o comportamento demétodo
um sobreposto.
em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
import
classe. Porém nãojava.io.*;
devemos confundir isto com a implementação do método, que
public class TestMultiB3 extends TestMultiA { Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
public void metodoA() throwsFileNotFoundException, o mesmo estado se suas
UTFDataFormatException,ZipException {
2.3.1 Invocação de Métodos
// faz algum IO/Arguivo variáveis membro têm os
} se comunicam pela troca de mensagens, isto significa que um
Objetos mesmos valores.
}
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no8.13objeto.
Listagem EmdasJava,
– Subconjunto isto
Exceções é feito pela
declaradas

chamada de um método em um objeto usando o operador binário "." (ponto),


devendoPorespecificar a mensagem
último, a classe completa:
TestMultiB3 (Listagem o objeto que é o que
8.13) demonstra recebedor da usar um conjunto menor de
você pode
mensagem,
exceções o método
no método a ser invocado
sobreposto, do quee havia
os argumentos
no métodopara o método (se houver).
da superclasse.
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 104
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
116
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

8.6 Fazer Laboratório 8


Siga instruções dovalor
//atribuindo laboratório e tome cuidado
a variável com o tempo de execução, sempre recorra ao instrutor em
referência
caso de Carro
dúvida, nunca
carro1deixe
= uma
new dúvida sem reposta
Carro();
carro1.ano = "2001";
carro1.modelo=
8.7 Exercício "fusca";
carro1.cor = "prata";
Escreva, compile e execute todas listagens de código apresentadas neste capítulo.

9 Tipos Genéricos O principal objetivo da


9.1 Por que Generics? adição de Generics ao
Uma grande inconveniência da linguagem de programação Java era a
Java é solucionar
necessidade constante de fazer typecast ou casting (conversões de tipo
problemas como o
explícitas) em expressões que necessitassem de referências de objetos mais
específicas. Por exemplo, um objeto ArrayList permite que você adicione objetos casting que destrói os
de qualquer tipo à coleção, mas quando você quiser recuperar estes elementos, benefícios de uma
terá de fazer um typecast nos objetos para que o tipo de referência seja mais linguagem com os tipos
específico à sua necessidade, ou seja, uma referência para uma subclasse de fortemente definidos.
Figura 2.4 – Layout Memória após inicialização
Object. O casting é um perigo em potencial, uma vez que não é possível, em
tempo de //criando
compilação,novo alias
garantir qual o tipo do objeto poderá ser referenciado –
podendo gerar uma exceção carro1;
Carro carro2 = do tipo ClassCastException, em tempo de execução.
Adiciona-se a isto o fato de seu código ficar mais poluído e, portanto, menos
legível. Além disso, o casting destrói os benefícios de uma linguagem com os
tipos fortemente definidos, já que esse procedimento anula a segurança trazida
pela checagem de tipos durante a compilação.
O principal objetivo da adição de Generics ao Java é solucionar problemas como os apresentados no
parágrafo anterior. A adição de tipos Generics, em Java 5.0, permite definir o uso de um tipo específico para uma
classe, como ArrayList, que trabalha com uma grande variedade de tipos.
Considere um objeto ArrayList para ver como Generics ajuda a melhorar nosso código. Um objeto
ArrayList possui a capacidade de armazenar referências de objetos, elementos de qualquer tipo de referência em
uma coleção de objetos. Uma instância de ArrayList, entretanto, sempre força a realizar um casting nos objetos que
recuperamos a partir da coleção. Considere a seguinte linha de instrução:

ArrayList umArrayList = new ArrayList();


String umaString Figura 2.5 – Layout Memória
= (String) duas variáveis referência para o mesmo objeto
umArrayList.get(0);

Agora note a versão utilizando Generics,


2.3 Membros de Instância
ArrayList<String> umArrayList = new ArrayList<String>();
Cada objeto criado deverá ter sua própria instância de variáveis
String umaString = umArrayList.get(0); Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante,
A nova versão dapois denota
classe que um
ArrayList, método
permite pertenceoatipo
especificar cadade objeto
objetodaque será aceito
o seupela
estado.
coleção.
classe.
Assim, Porém
em tempo nãode
devemos confundir
compilação, isto com
é possível a implementação
verificar do método,
se estamos adicionando que elemento que não satisfaça a
algum Dois objetos distintos têm
édeclaração
compartilhada por todas
- garantindo queashaja
instâncias
somentedaobjetos
classe.do tipo String. Desta forma você pode eliminar o casting quando
o mesmo estado se suas
recuperar um elemento da coleção e ter uma linha de instrução como a seguinte:
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos
String se comunicam
umaString = pela troca de mensagens, isto significa que um
umArrayList.get(0); mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operaçãoEmbora o casting
apropriada que possa ser removido,
foi definida isso não
no objeto. Emsignifica que évocê
Java, isto possa
feito pelaatribuir o valor de retorno do
método get()
chamada de um a uma variável
método emdeum referência com tipoodiferente
objeto usando operadoraobinário
do objeto armazenado no ArrayList – no caso de
"." (ponto),
devendo tipo String.a Ao
objetos doespecificar atribuir ocompleta:
mensagem valor retornado pelo que
o objeto é o get()
método a uma da
recebedor referência que não seja do tipo
String,
mensagem, o método a ser invocado e os argumentos para o método (se houver). tal como indica a mensagem
você receberá um erro de equiparação de tipos em tempo de compilação,
Oseguinte:
método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 105
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
117
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

found: java.lang.String required: java.lang.Integer


Integer data = umArrayList.get(0);
//atribuindo valor a variável referência
Carro carro1 = new Carro();
Para se ter uma =idéia
carro1.ano
de como Generics é usado, antes de entrarmos em mais detalhes, considere o
"2001";
seguintecarro1.modelo=
fragmento de código:"fusca";
carro1.cor = "prata";
ArrayList <String> genArrList = new ArrayList <String>();
genArrList.add("A generic string");
String umaString = genArrList.get(0);
JOptionPane.showMessageDialog(this, umaString);

A versão com generics de ArrayList usa o literal <String>, aparecendo imediatamente após a referência do
tipo ArrayList. Assim declarada, a referência genArrList ficará amarrada ao tipo String. Logo, somente objetos do
tipo String poderão ser usados com o método add(), bem como, não será possível retornar objeto do tipo Integer
ou qualquer outro tipo que não seja do tipo String, usando o método get(). As próximas instruções não são válidas:

int umInt = genArrList.get();


Integer umInteger = genArrList.get();
Figura 2.4 – Layout Memória após inicialização

9.2 Declarando uma Classe


//criando novo alias Utilizando Generics
Carro carro2
Você também = criar
pode carro1;
suas próprias classes utilizando Generics.
Ao invés de uma longa discussão sobre como declarar uma classe utilizando Generics, veja este exemplo:

public class Jaula<TipoValido> {


private TipoValido variavel; A partir da versão 5.0,
public Jaula() {} Java fornece aos
public TipoValido get() { desenvolvedor as
return variavel; implementações de
}
public void add(TipoValido variavel){
Collection que fazem uso
this.variavel = variavel; de Generics.
}
}
Listagem 9.1 – Uma classe Genérica
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Vamos dissecar a sintaxe de Generics, utilizada na declaração da classe
Jaula. Na linha 1, você declara a classe:
2.3 Membros de Instância
class Jaula<TipoValido>
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
o nome
objeto. Isto da classe pois
é importante, é seguido
denotapor
que umum par de sinais
método < (menor
pertence que)objeto
a cada e > (maior
da que) envolvendo o literal
TipoValido:
classe. Porém<TipoValido>.
não devemos Istoconfundir
é chamado istodecom
parâmetro de tipo, qualquer
a implementação identificador
do método, que válido o
emseu estado.
Java pode ser
usado - por convenção utiliza-se a letra maiúscula T de Type (ou Tipo). Os usos dos sinais <...> Doisindicam
objetosque
distintos
a classetêm
é compartilhada por todas as instâncias da classe.
declarada é uma não trabalha com um tipo específico. Por isso, observe que o atributo da classe foi declaradose
o mesmo estado suas
para
ser do tipo TipoValido :
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos seTipoValido
comunicam variavel;
pela troca de mensagens, isto significa que um mesmos valores.
private
objeto pode ter que mostrar um comportamento particular invocando uma
operaçãoEssaapropriada
declaraçãoque foi definida
especifica no objeto.
que a variável Em Java,
de instância isto éé de
variavel feito
um pela
tipo Generico, e depende do tipo
chamada de um método em um objeto usando o operador binário "." (ponto),
de dado que será usado na declaração da referência de objeto da classe Jaula<TipoVariavel>. Quando declarar uma
devendo da
instância especificar a deverá
classe, você mensagem completa:
especificar o tipo o
da objeto quequal
classe com é ovocê
recebedor da
deseja trabalhar. Por exemplo:
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no jaulaLeao
Jaula<Leao> recebedor pode = newtambém enviar informações de volta ao
Jaula<Leao>();
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 106
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
118
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

A sintaxe <Leao> após a declaração de Jaula especifica que essa instância da classe irá trabalhar com
variáveis//atribuindo
do tipo Leao. Podemos
valortrabalhar com variáveis
a variável do tipo Integer ou qualquer outro tipo de referência. Para
referência
trabalharCarro Integer, =
com umcarro1 o fragmento do código teria a seguinte instrução:
new Carro();
carro1.ano = "2001";
Jaula<Integer>
carro1.modelo= jaulaInteger
"fusca"; = new Jaula<Integer>();
carro1.cor = "prata";
Observe a declaração para o método get() (linha 5):

public TipoValido get() {


return variavel;
}

O método get() retorna um valor do tipo TipoValido, que é um tipo Generic. Isso significa que o método
terá um tipo de dado em tempo de execução, ou mesmo em tempo de compilação. Depois de declarar um objeto
do tipo Jaula, TipoValido será ligado a um tipo de dado específico. Essa instância atuará como se tivesse sido
declarada para ter esse tipo de dado específico, e apenas esse, desde o início.
No seguinte código, duas instâncias da classe Jaula foram criadas.
Figura 2.4 – Layout Memória após inicialização
Jaula <String> jaulaString = new Jaula <String>();
//criando
String str novo alias
= jaulaString.get();
Carro carro2 = carro1;
Jaula <Urso> jaulaUrso = new Jaula <Urso>();
Urso urso = jaulaUrso.get();

Note que a criação de uma instância de uma classe que utiliza Generics é bem similar à criação de uma
classe normal, exceto pelo tipo de dado específico entre os sinais <> logo após o nome do construtor. Essa
informação adicional indica o tipo de dado com que você trabalhará para essa instância da classe Jaula em
particular. Depois de criada a instância, torna-se possível acessar os elementos da classe sem a necessidade do
typecast no valor do retorno do método get(), uma vez que já foi decidido que ele irá trabalhar com um tipo de
dado de referência específico.

9.2.1 Limitação "Primitiva" Limitação em


Uma limitação de Generics em Java, é que eles são de uso restrito a tipos Generics é para que
referência de Objetos, e não funcionarão com tipos primitivos. Por exemplo, o eles sejam de uso
comando a seguir seria ilegal, uma vez
Figura 2.5que int Memória
– Layout é um tipo
duasde dadoreferência
variáveis primitivo.
para o mesmo objeto
restrito a tipos
Jaula <int> jaulaInt = new Jaula <int>(); referência de
Objetos, e não
2.3 Membros de Instância funcionarão com
Você terá que empacotar os tipos primitivos com um a classe Wrapper, antes
Cada objeto criado deverá ter sua própria instância de variáveis Os valores
tipos das variáveis
primitivos.
de usá-los como argumentos Generics.
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Jaula
Isto é importante,
<Integer>pois denota que um
jaulaInteger método
= new pertence
Jaula a cada objeto da
<Integer>(); o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é9.2.2
compartilhada
Limitandopor todas as instâncias da classe.
Genéricos o mesmo estado se suas
No exemplo mostrado anteriormente, os parâmetros de tipo da classe Jaula variáveis membro têm os
2.3.1 ser
podem Invocação de Métodos
referencias para qualquer tipo de classe. Há casos, entretanto, onde você
Objetos se comunicam pelasertroca de em
mensagens, isto de
significa que um mesmos valores.
quer restringir os tipos que poderão usados instanciações uma classe do
objeto
tipo pode ter
Generics. Javaque mostrar
permite umo comportamento
limitar particular
conjunto de possíveis tipos invocando
que podemuma ser
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
utilizados.
chamadaPor um método
deexemplo, em um
a classe Jaulaobjeto usando
(Listagem 9.2),o que
operador
utilizabinário "." serviria
Generics, (ponto),como um contêiner para um
devendo qualquer.
carnívoro especificar
Ematempo
mensagem completa:
de execução, T seráouma
objeto que de
instância é uma
o recebedor
subclasse da
de Carnivoro, supondo que essa
mensagem,
classe tenha osido
método a sercomo
definida invocado e os argumentos
subclasse de Animal. Épara o método
utilizado (se houver).
extends para fazer a limitação de classes que
possam
O método fazerinvocado
uso da classe generica criada.
no recebedor pode também enviar informações de volta ao
objeto O exemplo aatravés
chamador seguir limita
de umasvalorinstanciações da classe
de retorno. Jaula para
O método subclasses
chamado devee ser
Carnivoro.
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 107
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
119
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

class Jaula <T extends Carnivoro> {


//atribuindo valor a variável referência
Carro private
carro1 T
= animal;
new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
public Jaula() {}
carro1.cor = "prata";
public T get() {
return animal; Para limitar as
}
instanciações ao tipo
public void add(T animal){ de uma classe, nós
this.animal = animal; usamos a cláusula
} extends seguida pela
}
nome da classe que
Listagem 9.2 – Limitando tipos genericos
limita (ou restringe) o
class TesteJaula{ tipo Generico.
public static void main(String args[]) {
Figura 2.4 – Layout Memória após inicialização
Jaulaalias
//criando novo <Gato> obj1 = new Jaula<Gato>();
//O= comando
Carro carro2 carro1; seguinte é ilegal
Jaula<Animal> obj2 = new Jaula<Animal>();
}
}
Listagem 9.3 – Testando classe Genérica limidata

A instanciação de obj1 (Listagem 9.3, linha 3) é válida, uma vez que Gato é uma subclasse de Animal.
Porém a criação de obj2 (linha 5) causará um erro em tempo de compilação, uma vez que Animal não é uma
subclasse de Carnivoro.
Usar Generics limitados nos dá um benefício adicional, que é a checagem estática de tipos. Como
resultado, nós temos a garantia de que toda instanciação de um tipo Generics respeita os limites (ou restrições) que
atribuímos a ele. Uma vez que asseguramos que toda instância do tipo é uma subclasse do limite atribuído, e então
podemos chamar, de forma segura, qualquer método do objeto.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
NOTA a ausência do limite explícito no parâmetro, <T> é o mesmo que <T extends Object>.

2.3 9.3 Declarando Métodos Genéricos


Membros de Instância
Além de declarar classe Generics, também podemos declarar métodos
Métodos
Cadagenéricos
objeto criado deverá ter sua própria instância de variáveis Os valores dasonde
variáveis
Generics. Parametrizar métodos é útil quando queremos realizar tarefas as
são chamados
(atributos) definidasdepela classe. Os métodos definem o comportamento de um em um
dependências de tipo entre os argumentos e o valor de retorno sãoobjeto constituem
Generics, mas
polimórficos,
objeto. e são pois
Isto é importante, denota que um método pertence a cada objeto da
não depende de nenhuma informação do tipo da classe, e mudaráoaseu estado.
cada chamada
definidos para serem
classe. Porém não devemos confundir
ao método. isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada
métodospor todas as instâncias Pordaexemplo,
classe. suponha que queremos adicionar um método make() em uma
o mesmo estado se suas
parametrizados pelo classe que use ArrayList. Este método estático admitiria umvariáveis
único argumento,
2.3.1 Invocação membro quetêm os
tipo. de Métodos seria o único elemento do objeto ArrayList. Para fazer com que nosso ArrayList
Objetos se comunicam pela troca de mesmos valores.
receba qualquer tipomensagens, isto
de elemento, significa que
o argumento e oum
retorno do método make() deve
objeto pode ter que mostrar umGenerics.
utilizar comportamento particular invocando uma
operação apropriada que foi definida Vejanocomoobjeto. Emmétodos
declarar Java, isto é feito
genéricos no pela
exemplo a seguir:
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem publiccompleta:
class Util o objeto
{ que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
/* T extends Object implicitamente */
O método invocado no recebedor pode também enviar informações de volta ao
public static <E> ArrayList<E> make(E e) {
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 108
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
120
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

System.out.println("doidao");
ArrayList<E> lista = new ArrayList<E>();
//atribuindo valor a variável referência
lista.add(e);
Carro carro1 = newlista;
return Carro();
carro1.ano
} = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";
public static void main(String[] args) {
System.out.println(make(new Integer(1200)));
System.out.println(make(777));
System.out.println(make(777.0));
}
}
Listagem 9.4 – Métodos genéricos

Para construir uma nova instância de ArrayList<Integer>, nós simplesmente teríamos o seguinte comando:

Util.make(new Integer(0));

O método, após a invocação, comporta-se


Figura 2.4 – como se tive após
Layout Memória sidoinicialização
declarado desta forma:
//criando novo alias
static=ArrayList<Integer>
publiccarro2
Carro carro1; make(Integer i){
ArrayList<Integer> lista = new ArrayList<Integer>();
lista.add(i);
return lista;
}

A coisa mais estranha na declaração de um método genérico é que devemos colocar o <T> antes do tipo
de retorno do método. O <T>, posto assim, implica que o método retorna o que vem após sua declaração, no caso,
ArrayList<E>.

9.4 Subtipagem
Como você já sabe, é possível atribuir a referência de um objeto Integer a um Object, já que Object é um
supertipo de Integer:

Object umObject = new Object();


Integer umIntegerFigura
= new Integer(10);
2.5 – Layout Memória duas variáveis referência para o mesmo objeto
umObject = oumInteger; // OK

Na terminologia de orientação a objetos, isto é um relação do tipo é-um. Uma vez que Integer é um tipo
2.3 Membros de Instância
de Object, então a atribuição é permitida. Mas Integer é também um tipo de Number, então o código seguinte
também éCada
válido.objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante,
public pois denota que um
void umMetodo(Number n){método pertence a cada objeto da o seu estado.
classe. Porém não //devemos
corpo doconfundir
métodoisto com a implementação do método, que
omitido
}
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
umMetodo(new Integer(10)); // OK o mesmo estado se suas
umMetodo(new Double(10.1)); // OK
2.3.1 Invocação de Métodos variáveis membro têm os
mesmos valores.
OObjetos
mesmosepode
comunicam
ser dito pela
para troca de mensagens,
generics. isto Jaula
Usando a classe significa que um
(Listagem 9.2), tendo Number como seu
objeto pode ter que mostrar um comportamento particular invocando
argumento de tipo da classe, você pode realizar uma invocação ao método add() umacom qualquer argumento seja
operação apropriada
compatível com Number: que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendoJaula<Number>
especificar a mensagem
jaula = completa: o objeto que é o recebedor da
new Jaula<Number>();
mensagem, o método a serInteger(10));
jaula.add(new invocado e os argumentos
// OK para o método (se houver).
O métodojaula.add(new Double(10.1));
invocado no recebedor pode também // OKenviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 109
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
121
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Agora considere o seguinte método:


//atribuindo valor a variável referência
void jaulaTeste(Jaula<Number>
public carro1
Carro = new Carro(); n){
// corpo
carro1.ano método omitido
= "2001";
}
carro1.modelo= "fusca";
carro1.cor = "prata";
Que tipo de argumento será aceito? Observando a assinatura do método, você sabe que ele aceita um
argumento simples do tipo Jaula<Number>. Mas o que exatamente isto significa? Então você continua e passa um
Jaula<Integer> ou Jaula<Double>, como era de se esperar, correto? Errado, porque Jaula<Integer> e Jaula<Double> não
são subtipos de Jaula<Number>.
A compreensão se torna mais fácil quando você pensa em objetos tangíveis – coisas como uma imagem –
como uma Jaula.

// Uma jaula é uma coleção de coisas,


//com barras para prende-las A interface Collection é a
interface Jaula<E> extends Collection<E>; interface raiz na hierarquia
de coleções; ela representa
Um leão é tipo de animal, então Leão dever subtipo de Animal :
Figura 2.4 – Layout Memória após inicialização
um grupo de objetos. Já que
uma Jaula será usado como
//criando novo extends
interface Leão alias Animal {}
Carro carro2
Leão rei = carro1;
= ...;
um conjunto de objetos (de
animais), terá sentido usá-
Onde você precisar de algum animal você poderá fornecer um leão: lo neste exemplo.

Animal a = rei;

Um leão pode, é claro, ser colocado numa jaula para leões:

Jaula<Leão> jaulaLeão = ...;


jaulaLeão.add(rei);

e um borboleta numa jaula para borboletas:

interface Borboleta extends Animal {}


Borboleta monarca = ...;
Figura 2.5 – Layout Memória
Jaula<Borboleta> jaulaBorboleta = duas
...;variáveis referência para o mesmo objeto
jaulaBorboleta.add(monarca);

Mas o que éde


2.3 Membros uma jaula de animal? Você poderia achar que é uma jaula que serve para prender qualquer
Instância
tipo de animal:
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
Jaula<Animal> jaulaAnimal = ...;
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Esta jaula dever estar preparada para manter qualquer tipo de animal, todos elesDois objetos
juntos. distintos
Ela deverá tertêm
é compartilhada
resistentes por
paratodas
reteras instâncias da classe.
barras uma leão e pouco o mesmo estado se suas
espaço entre elas de modo a reter uma borboleta. Tal tipo de jaula
não deve ser simples de se construir, então: variáveis membro têm os
2.3.1 Invocação de Métodos
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
jaulaAnimal.add(rei);
objeto pode ter que mostrar um comportamento particular invocando uma
jaulaAnimal.add(monarca);
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaUma de vez
um que um leão
método é umobjeto
em um tipo de animalo (Leão
usando é subtipo
operador de"."
binário Animal),
(ponto), a questão então retorna, "Uma
jaula de Leão é um tipo de jaula de animal? Ou seja, Jaula<Leão>
devendo especificar a mensagem completa: o objeto que é o recebedor daé um subtipo de Jaula<Animal>?". Pela definição
de
mensagem, o método a ser invocado e os argumentos para o método (se houver). muito sentido quando você
jaula de animal, dada acima, a resposta é “não”. Ficou surpreso! Mas isto faz
começa
O método a pensar:
invocadonãonoserecebedor
pode presumir que umaenviar
pode também jaula informações
de leão podedereter
voltaumaao borboleta, e uma jaula de
borboleta,
objeto chamador através de um valor de retorno. O método chamado deve serjaula pode ser considerada
certamente, não pode manter um leão. Na verdade, nem uma
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 110
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
122
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

suficientemente adequada para qualquer tipo de animal:


//atribuindo valor a variável referência
jaulaAnimal
Carro carro1==jaulaLeão;
new Carro(); // erro compilação
jaulaAnimal
carro1.ano = jaulaBorboleta;
= "2001"; // erro compilação
carro1.modelo= "fusca";
Sem generics os animais
carro1.cor podem ser colocados em tipos inadequados de jaulas, de onde seria possível que
= "prata";
eles escapassem.

9.5 Usando o Coringa <?>


Observe o exemplo

import java.util.*;

class Jaula<E> {

private E animal;

public Jaula() { }
Figura 2.4 – Layout Memória após inicialização
public
//criando E get()
novo alias{
return animal;
Carro carro2 = carro1;
}

public void add(E animal) {


this.animal = animal;
}

public void fill(List<Carnivoro> animais){


animais.add(new Cachorro()); // Ok,adiciona um Cachorro de
//subtipo Carnivoro
}
}
Listagem 9.5 – Nova Jaula com método que Lista de carnivoros

public class JaulaDemo {

Figura
public static 2.5 – Layout
void Memória duas variáveis
main(String[] args) referência
{ para o mesmo objeto

List<Cachorro> listaCachorro = new ArrayList<Cachorro>();


listaCachorro.add(new Cachorro());
2.3 Membros delistaCachorro.add(new
Instância Cachorro());
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos
Jaula<Carnivoro> definem
jaula o comportamento
= new de um
Jaula<Carnivoro>();
em um objeto constituem
jaula.fill(listaCachorro);
objeto. Isto é importante, pois denota que um método pertence//Erro,esperava
a cada objeto daList<Carnivoro>
//foi passado List<Cachorro> o seu estado.
classe. Porém não
} devemos confundir isto com a implementação do método, que Dois objetos distintos têm
é compartilhada
} por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos
Listagem 9.6 – Testa Jaula
variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
O compilador vai emitir a seguinte mensagem (Listagem 9.6, linha 8),
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
The method fill(List<Carnivoro>) in the type Jaula<Carnivoro> is not applicable for the arguments
chamada de um método em um objeto usando o operador binário "." (ponto),
(List<Cachorro>)
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,Esteoerro
método a ser invocado
de compilação e os
é igual aoargumentos
que ocorre apara
um o método
método (se houver).
qualquer, que receba como argumento uma
O método invocado no recebedor pode também enviar informações
referência de tipo diferente do tipo do parâmetro definido na assinatura de volta
do ao
método. Ou seja, como visto
objeto chamador
anteriormente através
(seção de um valor denão
9.5), List<Cachorro> retorno. O método
é subtipo chamado deve
de List<Carnivoro>. Mas ser
o que pesa neste exemplo é que,
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 111
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
123
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

com genérics, parece que perdemos o que havia de melhor em Java, o polimorfismo de referência. O que você deve
observar//atribuindo
é que a notação de genéricos
valor nos obrigareferência
a variável a trabalhar com um único tipo, não nos deixando manipular os
métodosCarro
sobrepostos
carro1nas =subclasses a partir de referências do tipo da superclasse, como vimos ser possível ao
new Carro();
estudarmos polimorfismo, =
carro1.ano sem generics.
"2001";
Para continuarmos com
carro1.modelo= a segurança de tipo, trazida por generics, e ainda termos o nosso aclamado
"fusca";
carro1.cor
comportamento = "prata";
polimórfico, precisamos de uma maneira de dizer ao compilador que desejamos usar qualquer
subtipo genérico do tipo do argumento declarado. Felizmente podemos utilizar o literal <?>, o coringa, como forma
de dizer ao compilador que o método aceita qualquer tipo, ou ainda <? extends AlgumaClasse>, para dizer que
qualquer objeto do tipo da classe ou de suas subclasses serão aceitos.
Vejamos nosso exemplo modificado:

public class Jaula<T> {


Quando utilizamos private T animal;
<?>, sem extends
estamos dizendo public Jaula() {
}
<? extends
Object>, ou seja public Figura 2.4 – Layout
T get() { Memória após inicialização
qualquer objeto. novo alias
//criando return animal;
}
Carro carro2 = carro1;
public void add(T animal) {
this.animal = animal;
}
public void fill(List<? extends Carnivoro> listaCanivoros){
listaCanivoros.add(new Cachorro());//ERRO
}
}
Listagem 9.7 – Usado o coringa

public class JaulaDemo {

public static void main(String[] args) {

List<Cachorro> listaCachorro = new ArrayList<Cachorro>();


listaCachorro.add(new Cachorro());
Figura 2.5 – Layout MemóriaCachorro());
listaCachorro.add(new duas variáveis referência para o mesmo objeto

Jaula<Carnivoro> jaula = new Jaula<Carnivoro>();


jaula.fill(listaCachorro);//ok, Cachorro extends Carnivoro
2.3 Membros
} de Instância
} Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos
Listagem 9.8–definem o comportamento
Testa Jaula com argumento coringa de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Nosso problema agora é o método add(E o) (Listagem 9.7, linha 15), de List. ODois objetos
método distintos
add(), em suatêm
é compartilhada por todas as instâncias da classe.
definição exige que o argumento deve ter o mesmo tipo utilizado por List, mas o problema o mesmo estado seno
reside justamente suas
fato de que o argumento pode ser de qualquer tipo ou subtipo da classe Carnivoro, assim add() se recusa
variáveis membro têm a os
2.3.1 Invocação
adicionar de Métodos
algo desconhecido e que possa causar algum problema. Esse é o preço a ser pago pelo benefício de uma
Objetos
tipagem segura se comunicam
(previsível peladetroca
em tempo de mensagens,
compilação) e de podermosisto significa
invocarque um métodosmesmos
qualquer
valores.
polimórfico. Você
objeto
terá que pode
aceitarter quedemostrar
o fato um fill()
seu método comportamento
só poderá fazerparticular invocando ouma
leitura. Reescrevendo exemplo,
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadapublic métodoJaula<T>
de um class em um objeto
{ usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
private T animal;
mensagem, o método a ser invocado e os argumentos para o método (se houver).
public Jaula() {
O método invocado}
no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 112
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
124
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

public T get() {
return animal;
//atribuindo
} valor a variável referência
Carro carro1 = new Carro();
carro1.ano = "2001";
public void add(T animal) {
carro1.modelo= "fusca";= animal;
this.animal
carro1.cor
} = "prata";
public void fill(List<? extends Carnivoro> listaCanivoros){
//animais.add(new Carnivoro("qq"));
//não pode adicionar quando
//usamos <? extends Carnivoro>
for(Carnivoro bicho: listaCarnivoros)
bicho.fazerRuido();
}
Listagem 9.9 – Coringa torna sua referência somente leitura

Outra situação que provavelmente você esperaria encontrar é uma declaração como a que se segue:

List<? extends Carnivoro>Figura


carnivoros = new
2.4 – Layout Memória apósArrayList<?
inicialização extends Carnivoro>();

//criando novo alias


Pois é, mais uma vez a resposta é não, você não pode criar instâncias de algo que você não sabe o que é
Carro carro2 = carro1;
(ver seção 9.5). Então, para criar uma instância que possa ser atribuída à referência, você deve criar um objeto
genérico de um subtipo de Carnivoro, por exemplo:

List<? extends Carnivoro> carnivoros;


//usando Carnivoro
List<Carnivoro> listaCarnivoro = new ArrayList<Carnivoro>();
listaCarnivoro.add(new Cachorro());
listaCarnivoro.add(new Gato());

//ou um subtipo de Carnivoro


List<Cachorro> listaC= new ArrayList<Cachorro>();
carnivoros = listaC;

9.6 9.6 Fazer Laboratório 9


Siga instruções do laboratório e tome cuidado com o tempo de execução, sempre recorra ao instrutor em
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
caso de dúvida, nunca deixe uma dúvida sem reposta

9.7 9.7 Exercício Java Collection


2.3 Membros de Instância
Escreva, compile e execute todas listagens de código apresentadas neste Framework está
capítulo. Cada objeto criado deverá ter sua própria instância de variáveis Osdividido
valores entre
das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objetoclasse
Interfaces e constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da concretas que
10 Java Collections
classe. Porém não devemos confundir isto com a implementação do método, que
o seu estado.
As estruturas de dados são muito utilizadas na programação em geral. implementam
Dois as têm
objetos distintos
é compartilhada por todas as instâncias da classe. interfaces
Quando desenvolvemos algum programa, freqüentemente utilizamos arrays. Em o mesmoCollection,
estado se suas
algoritmos complexos, listas (ligadas ou não), mapas, pilhas e filas são essenciais. Map, Queue e/ou suas
variáveis membro têm os
2.3.1 Invocação de Métodos sub-classes.
Por serem muito utilizadas, várias estruturas já estão disponíveis no pacote mesmos valores.
Objetos se comunicam pela troca de mensagens, isto significa que um
java.util e são chamados de Java Collection Framework, ou simplesmente
objeto pode
Colletion. ter classes
Nestas que mostrar
podemos umcontar
comportamento
com várias particular
operações invocando
muito comuns, uma
operação
como métodos de ordenação, busca, interseção, união, diferença e vários outros.pela
apropriada que foi definida no objeto. Em Java, isto é feito
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
10.1 Hierarquia Das Interfaces
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O conjunto de classes Java para coleções (Java Collection Framework) é
O método de
composto invocado no recebedor
várias interfaces pode
e classes tambémExistem
concretas. enviar três
informações
interfacesde volta ao
principais:
objeto chamador através de um valor de retorno. O método chamado
Collection, Map e Queue, que definem os métodos comuns de estruturas de dados deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 113
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
125
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

do tipo conjuntos, mapas e filas respectivamente.


Caso você precisevalor
//atribuindo de alguma estrutura dereferência
a variável dados, você deve utilizar uma das classes concretas, que de uma
forma ouCarro
outra herdam
carro1de=umanewdasCarro();
três interfaces citadas.
A seguir mostramos
carro1.ano estas classes no formato hierárquico em árvore. As interfaces estão marcadas com
= "2001";
italico e carro1.modelo=
as classes concretas com linha tracejada, que significa implements:
"fusca";
carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 10.1: Hierarquia Básica de Java Collections

As coleções não se resumem somente a estas interfaces e classes concretas da Figura 10.1, na verdade
estamos apresentando as que são mais utilizadas por programadores Java, uma lista mais detalhada pode ser
verificada na documentação da API.

10.2 Generics e Coleções Java


No JDK 1.5, os métodos da interface Collection foram atualizados para suportar Generics, veja tabela:
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Métodos da interface Collection
public boolean add(E o) Insere o elemento específico o nessa coleção. Retorna true se o foi
2.3 Membros de Instância adicionado com sucesso à coleção.
Cada
public void objeto criado deverá
clear() ter sua
Remove todosprópria instância
os elementos dessadecoleção.
variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
public boolean
objeto. remove(Object
Isto é importante, poiso) Remove
denota que um uma única pertence
método instância de Object
a cada o dessa
objeto da coleção, seoele estiver
seu
presente. Retorna true se o foi encontrado e removido da coleção. estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
épublic boolean contains(Object
compartilhada o) Retorna
por todas as instâncias true se essa coleção contém o Object o.
da classe.
o mesmo estado se suas
public boolean isEmpty() Retorna true se essa coleção não contém nenhum objeto ou elemento.
variáveis membro têm os
2.3.1 Invocação de Métodos
public intObjetos
size() se comunicam pelaRetorna o número de elementos
troca de mensagens, isto significa que um nessa coleção. mesmos valores.
objeto pode ter iterator()
public Iterator<E> que mostrar um Retorna
comportamento
um iteratorparticular
que nos permiteinvocando umaelementos da coleção.
acessar
operação apropriada que foi
public boolean equals(Object o)
definida no objeto. Em Java, isto é
Retorna true se o Object o é igual a essa coleção.
feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
public int especificar
devendo hashCode() a mensagem completa:
Retorna o valor do hash
o objeto quecodeé o(i.e., o ID) parada
recebedor essa coleção. Mesmos objetos
ou coleçõestêmomesmovalordehashcodeouID.
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também
Tabela 1 - métodosenviar informações
da interface Collection JDK de
1.5 volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 114
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
126
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Não vamos apresentar


//atribuindo valoro modelo tradicional,
a variável do JDK 1.4, que é mais propenso a problemas de segurança
referência
quanto ao tipo, jácarro1
Carro discutimos
= este
new assunto quando falamos sobre tipos genéricos.
Carro();
Vejamos, uma vez=mais,
carro1.ano um exemplo de uma classe que não utiliza a versão Generics para a criação de
"2001";
uma lista, podemos incluir sem
carro1.modelo= problemas objetos de qualquer tipo, no caso String, Integer entre os outros
"fusca";
carro1.cor
elementos. = "prata";

import java.util.*;

public class NaoGenericoDemo {

public static void main(String args[]) {

List list = new ArrayList();


list.add(new Integer(1));
list.add(new Integer(2));
list.add("String");
System.out.println(list);
Collections.sort(list);
Figura 2.4 – Layout Memória após inicialização
System.out.println(list);
//criando
} novo alias
Carro
} carro2 = carro1;
Listagem 10.1 – List não genérico

Ao executar esta classe é gerada a seguinte saída:

[1, 2, String]
Exception in thread "main" java.lang.ClassCastException: java.lang.String
at java.lang.Integer.compareTo(Integer.java:35)
at java.util.Arrays.mergeSort(Arrays.java:1156)
at java.util.Arrays.sort(Arrays.java:1080)
at java.util.Collections.sort(Collections.java:117)
at treeway.cap9.NaoGenericoDemo.main(NaoGenericoDemo.java:12)

O motivo é que o método Collections.sort() invoca o método de comparação - compareTo() da interface


Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Comparable – do primeiro objeto, que recebe como argumento o objeto subseqüente, este processo se repetirá
até o fim da coleção. Dessa forma, para nosso exemplo, haverá uma comparação entre um objeto Integer e um
objeto String, resultando no erro acima. Agora veja a mesma classe utilizando o tipo genérico:
2.3 Membros de Instância
Cada objeto
import criado deverá ter sua própria instância de variáveis
java.util.*; Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
public class GenericoDemo {
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir
void isto com a implementação
args[]) {do método, que
public static main(String Dois objetos distintos têm
é compartilhada por todas as instâncias da
List<Integer> classe.
list = new ArrayList<Integer>();
list.add(new Integer(1)); o mesmo estado se suas
2.3.1 list.add(new Integer(2));
Invocação de Métodos variáveis membro têm os
list.add("String");
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que System.out.println(list);
mostrar um comportamento particular invocando uma
operação apropriada Collections.sort(list);
que foi definida no objeto. Em Java, isto é feito pela
chamada de um método System.out.println(list);
em um objeto usando o operador binário "." (ponto),
}
devendo} especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
Listagem 10.2 – Coleções e genéricos
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 115
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
127
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

O que acontecerá será um erro de compilação na linha 8, ou seja, o Generics bloqueia os elementos
estranhos a lista não permitindo
//atribuindo valor a quevariável
esta tenhareferência
elementos diversos, fora o especificado. Assim você não terá
nenhuma surpresa
Carro durante=a new
carro1 execução do seu programa.
Carro();
carro1.ano = "2001";
The method add(Integer)
carro1.modelo= in the type List<Integer> is not
"fusca";
applicable for the=arguments
carro1.cor "prata";(String)

10.3 Percorrendo Collections


Há duas maneiras de percorrer coleções:
1. usando o laço for-enhanced (ou for-each)
2. ou usando Iteradores

10.3.1 Laço for-each


O laço for-each permite você percorrer uma coleção ou array, nos já o usamos para arrays. Sua sintaxe
para coleções é similar.

for (Object o : collection) System.out.println(o);


Figura 2.4 – Layout Memória após inicialização

Veja exemplo,novo alias


//criando
Carro carro2 = carro1;
import java.util.*;

public class PercorreArrayList {


public static void main(String[] args) {
ArrayList<String> lista1 = new ArrayList<String>();
ArrayList<Integer> lista2 = new ArrayList<Integer>();
lista1.add("a");
lista1.add("b");
lista1.add("c");
lista2.add(100);//auto-box
lista2.add(110);//auto-box
lista2.add(111);//auto-box

// imprime lista1
for (String e : lista1)
System.out.println(e);
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

// imprime lista2
for (Integer e : lista2)
2.3 Membros de Instância
System.out.println(e);
}
}
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento
Listagem 10.3 – Enhanced For
de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é10.3.2 Interface por
compartilhada Iterator
todas as instâncias da classe.
o mesmo
Interface muito importante é a interface Iterator, que permite navegar (iterar) pelos estado se de
vários elementos suas
uma coleção.
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos interface
se comunicam pela troca de{ mensagens, isto significa que um mesmos valores.
public Iterator<E>
objeto pode ter que mostrar
//retorna trueumse comportamento particular invocando
houver mais elementos a iterar uma
operação apropriada
boolean quehasNext();
foi definida no objeto. Em Java, isto é feito pela
chamada de um //retorna
método em o um
proximo
objetoelemento na proxima
usando o operador iteracao
binário "." (ponto),
E next();
devendo especificar a mensagem completa: o objeto que é o recebedor da
//remove o ultimo elemento retornado pela iteracao
mensagem, o método a ser invocado e os argumentos para o método (se houver).
void remove();
O método } invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 116
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
129
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

A interface Iterator é bastante simples, uma referência a Iterator é obtido da própria coleção, que
implementa Iterator, através
//atribuindo do método
valor iterator()referência
a variável e depois podemos navegar pela coleção por meio dos métodos
hasNext(), next()carro1
Carro e remove();
= new Carro();
carro1.ano = "2001";
Veja exemplo :
carro1.modelo= "fusca";
carro1.cor = "prata";
import java.util.*;

public class PercorreArrayList2 {


public static void main(String[] args) {
ArrayList<String> lista1 = new ArrayList<String>();
ArrayList<Integer> lista2 = new ArrayList<Integer>();
lista1.add("a");
lista1.add("b");
lista1.add("c");
lista2.add(100);//auto-box
lista2.add(110);//auto-box
lista2.add(111);//auto-box
Figura 2.4 – Layout Memória após inicialização
//referência a implementação de Iterator em ArrayList
//criando novo aliasi1 = lista1.iterator();
Iterator
Carro carro2 = carro1;
Iterator i2 = lista2.iterator();

// imprime lista1 Iterator é uma


while (i1.hasNext()) { interface que permite
System.out.println(i1.next()); navegar (iterar) pelos
}
vários elementos de
// imprime lista2 uma coleção.
while (i2.hasNext()) {
System.out.println(i2.next());
}
}
}
Listagem 10.4 – Iteradores de Coleções

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
10.4 Usando Listas – Interface List
Implementa listas de dados, onde os elementos (repetidos ou não) estão ordenados pelo índice e não
classificado.
2.3 Membros de Instância
Cada objeto criado deverá ter sua própria instância de variáveis
10.4.1 LinkedList Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de
É implementação de uma lista encadeada. A classe LinkedList contém métodos emum que um objetoque
permitem constituem
listas
objeto. Isto sejam
encadeadas é importante, pois pilhas,
usadas como denotafilas
queouumalgum
método pertence
outra a cada
estrutura objeto
de dados. Temdauma inserção
o eseu
deleção muito
estado.
classe.
mais Porémque
rápidos nãoArrayList
devemos confundir isto com a implementação do método, que
e Vector. Dois objetos distintos têm
é compartilhada
O códigopor todasmostra
a seguir as instâncias da classe.
como usar a classe LinkedList e vários dos métodos definidos em Collection:
o mesmo estado se suas
2.3.1 Invocação de Métodos
import java.util.*; variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
public class LinkedListDemo {
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada
publicque foi definida
static no objeto. Em
void main(String Java, isto
args[]) { é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar aLinkedList<Integer>
mensagem completa: olista objeto= que
new éLinkedList<Integer>();
o recebedor da
mensagem, o método a//adiciona
ser invocado elementos
e os argumentos para
a lista
o método (se houver).
O método invocado nolista.add(new
recebedor pode Integer(1));
também enviar informações de volta ao
objeto chamador através de um valor de
lista.add(new retorno. O método chamado deve ser
Integer(2));
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 117
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
130
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

lista.add(new Integer(3));
lista.add(new Integer(1));
//atribuindo valor a variável referência
Carro carro1 = new Carro();
//imprime elementos com toString() de AbstractColletion
carro1.ano //= e"2001";
quantidade de elementos da lista
carro1.modelo= "fusca";
System.out.println(lista + ", size = " + lista.size());
carro1.cor = "prata";
//adiciona elemento inicio da lista
lista.addFirst(new Integer(0));
//adiciona elemento fim da lista
lista.addLast(new Integer(4));

//imprime elementos com toString() de AbstractColletion


System.out.println(lista);
//imprime primeiro e ultimo elemento da lista
System.out.println(lista.getFirst() + ", " + lista.getLast());
//retorna elemento por indice, comeca em 0
System.out.println(lista.get(2) + ", " + lista.get(3));
//remove primeiro elemento da lista
lista.removeFirst();
Figura
//remove ultimo 2.4 – Layout Memória
elemento da listaapós inicialização
lista.removeLast();
//criando novo alias
//imprime
Carro carro2 elementos com toString() de AbstractColletion
= carro1;
System.out.println(lista);
//auto-unboxing e remove elemento da lista
lista.remove(new Integer(1));
//imprime elementos com toString() de AbstractColletion
System.out.println(lista);
//remove terceiro elemento da lista
lista.remove(2);
//imprime elementos com toString() de AbstractColletion
System.out.println(lista);
}
}
Listagem 10.5 – ListIterator

10.5 ArrayList
Vector é apropriado para uso em multithread, porém é mais lento que ArrayList. O ArrayList é uma versão
de um array redimensionável.Figura Usa2.5métodos não-sincronizados,
– Layout Memória seu para
duas variáveis referência acesso aleatório
o mesmo objeto é rápido, prefira esta a
LinkedList se precisar de iteração rápida que pouca inserção ou remoção aleatória. Exemplo:

import java.util.*;
2.3 Membros de Instância
Cada objeto
public classcriado deverá ter {sua própria instância de variáveis
ArrayListDemo Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
public static
objeto. Isto é importante, main(String
void que
pois denota um método args[])
pertence a{ cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
ArrayList<String> al = new ArrayList<String>(2); Dois objetos distintos têm
é compartilhada por todas as instâncias da classe. + ", tamanho = " + al.size());
System.out.println(al
o mesmo estado se suas
al.add("R");
2.3.1 al.add("U");
Invocação de Métodos variáveis membro têm os
al.add("O");
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
System.out.println(al + ", tamanho = " + al.size());
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada al.remove("U");
que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o+operador
System.out.println(al = "."
binário
", tamanho " +(ponto),
al.size());
ListIterator li = al.listIterator();
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método awhile
ser invocado e os argumentos para o método (se houver).
(li.hasNext())
O método invocado no recebedor pode também enviar informações de volta ao
System.out.println(li.next());
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 118
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
131
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Object a[] = al.toArray();


//atribuindo valor
for (int ai variável
= 0; i < referência
a.length; i++)
Carro carro1 = new Carro();
System.out.println(a[i]);
carro1.ano
} = "2001";
carro1.modelo=
} "fusca";
carro1.cor = "prata";
Listagem 10.6 – Usando ArrayList

10.5.1 Teste de Desempenho


Um exemplo para testar o desempenho das classes na inserção e busca. Não se deixe levar pelos
resultados ao escolher uma implementação, siga as recomendações de uso da documentação API:

import java.util.*;

public class TestaEficienciaCollection {

public void mensurar(Collection<Integer> c,int size){

long inicio=0; Figura 2.4 – Layout Memória após inicialização


long fim=0;
//criando novo alias
double tempo=0.0;
Carro carro2 = carro1;
System.out.println("Iniciando teste ..."+c.getClass().getName());
System.out.println("Inserindo " +size+ " elementos...");

inicio = System.currentTimeMillis();

for (int i = 0; i < size; i++) {


c.add(Math.i);
}

fim = System.currentTimeMillis();
tempo = (fim - inicio) / 1000.0;
System.out.println("Tempo : " + tempo);
System.out.println("Consultando " +size+ " elementos...");

inicio = System.currentTimeMillis();
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
for (int i = 0; i < size; i++) {
c.contains(i);
}
2.3 Membros de Instância
Cada objeto fim
criado deverá ter sua própria instância de variáveis
= System.currentTimeMillis(); Os valores das variáveis
tempo = (fim
(atributos) definidas pela classe. - inicio)
Os métodos / 1000.0;
definem o comportamento de um
System.out.println("Tempo : " + tempo); em um objeto constituem
objeto. Isto}é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas
public as instâncias
static da classe.
void main(String[] args) {
o mesmo estado se suas
variáveis membro têm os
TestaEficienciaCollection teste= new TestaEficienciaCollection()
2.3.1 Invocação de Métodos
ArrayList <Integer> c1 = new ArrayList<Integer>(); mesmos valores.
Objetos se comunicam pela troca de mensagens, isto significa que um
LinkedList <Integer> c2 = new LinkedList<Integer>();
objeto pode ter que Vector<Integer>
mostrar um comportamento particular invocando uma
c3 = new Vector<Integer>();
operação apropriada teste.mensurar(c1,1000);
que foi definida no objeto. Em Java, isto é feito pela
chamada de um método teste.mensurar(c2,1000);
em um objeto usando o operador binário "." (ponto),
teste.mensurar(c3, 1000);
devendo especificar
} a mensagem completa: o objeto que é o recebedor da
mensagem,
} o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar
Listagem 10.7 informações
– Teste de perfomance de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 119
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
132
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

10.6 Usando Conjuntos – Interface Set


Implementação de
//atribuindo conjuntos
valor que nãoreferência
a variável permite elementos duplicados e não há preocupação com
ordenamento. método equals()
CarroO carro1 hashCode() é usado para saber se dois objetos são idênticos.
= new eCarro();
carro1.ano = "2001";
carro1.modelo= "fusca";
10.6.1 HashSet
carro1.cor
O HashSet é uma= implementação
"prata"; da interface Set que usa uma tabela hash (espalhamento). O uso de
uma tabela hash permite buscar os elementos de forma fácil e rápida. A implementação usa o código de hash do
objeto, chama o método hashCode(), que determina onde um objeto será ou está armazenado. Usamos HashSet
quando quiser um conjunto com elementos únicos e quando a ordem dos elementos na iteração for irrelevante.
Exemplo:

import java.util.*;

public class HashSetDemo {

public static void main(String args[]) {

HashSet<String> hs = new HashSet<String>(5);


Figura 2.4 – Layout Memória após inicialização
System.out.println(hs.add("one"));
//criando novo alias
System.out.println(hs.add("two"));
System.out.println(hs.add("one"));
Carro carro2 = carro1;
System.out.println(hs.add("three"));
System.out.println(hs.add("four"));
System.out.println(hs.add("five"));
System.out.println(hs);
}
}
Listagem 10.8 – Genéric HashSet

10.6.2 TreeSet
O TreeSet é uma implementação da interface Set que usa uma árvore de balanceamento. Esta classe
assegura que o conjunto será organizado em uma ordem ascendente, na regra de comparação padrão. Veja o
exemplo:

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
import java.util.*;

public class TreeSetDemo {


2.3 Membros de Instância
public static void main(String args[]) {
Cada objeto TreeSet<String>
criado deverá ter ts sua= própria instância de variáveis
new TreeSet<String>(); Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um
ts.add("um");
em um objeto constituem
ts.add("dois");
objeto. Isto é importante, pois denota que um método pertence a cada objeto da
ts.add("tres"); o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
ts.add("quatro"); Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
ts.add("10");
System.out.println(ts);
o mesmo estado se suas
2.3.1 Invocação} de Métodos variáveis membro têm os
}
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
Listagem 10.9 – TreeSet
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
10.7 Usando
chamada de um Mapas
método–em Interface
um objetoMap usando o operador binário "." (ponto),
Implementa mapeamentos entre
devendo especificar a mensagem completa: chaves não-repetidas
o objeto que é oa recebedor
valores. Um
da mapa é composto de uma
associação
mensagem,entre objetoachave
o método (Key) a um
ser invocado objeto
e os valor (Value).
argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 120
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
133
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

10.7.1 HashMap
Implementação de
//atribuindo Map,a modela
valor variávelmapas não ordenados, sem classificação e com métodos não-
referência
sincronizados.
CarroA carro1
implementação
= new usa o código de hash do objeto, chama o método hashCode(), que determina
Carro();
onde umcarro1.ano
objeto será ou está
= armazenado.
"2001"; Veja exemplo:
carro1.modelo= "fusca";
carro1.cor = "prata";
import java.util.HashMap;

public class HashMapDemo {

public static void main(String[] args) {

HashMap<Integer, String> hm = new HashMap<Integer, String>();


hm.put(1, "um");
hm.put(2, "dois");
hm.put(3, "tres");
hm.put(4, "quatro");
hm.put(5, "10");
System.out.println(hm.size());
System.out.println(hm);
Figura 2.4 – Layout Memória Integer(3)));
System.out.println(hm.get(new após inicialização
System.out.println(hm.get(0));
//criando novo alias
Carro }carro2 = carro1;
}
Listagem 10.10 - HashMap

10.8 Classificando Coleções: Collections.sort


Vimos anteriormente que as listas são percorridas de maneira pré determinada de acordo com a inclusão
dos itens. Mas muitas vezes queremos percorrer a nossa lista de maneira ordenada, classificando os elementos de
acordo com nossa necessidade.
A classe Collections (com s no final) nos permite ordenar coleções, através do um método estático sort,
que recebe um List como argumento e o ordena em sua ordem natural (números = crescente, string = alfabética).
Exemplo:

import java.util.*;

public class OrdenandoCollection {


Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
public static void main(String[] args) {

List<String> lista = new ArrayList<String>();


2.3 Membros de Instância
Cada objeto lista.add("Goiânia");
criado deverá ter sua própria instância de variáveis Os valores das variáveis
lista.add("São Paulo");
(atributos) definidas pela classe. Os métodos definem o comportamento de um
lista.add("Aracajú"); em um objeto constituem
objeto. Isto é importante, pois
// lista denota
sem que um método pertence a cada objeto da
ordenação o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
System.out.println(lista);
Collections.sort(lista);
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
// lista ordenada o mesmo estado se suas
2.3.1 Invocação
System.out.println(lista); variáveis membro têm os
} de Métodos
}Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular
Listagem 10.11 – Manipulando invocando uma
coleções
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
Como resultado da execução teremos:
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
[Goiânia, São Paulo, Aracajú]
O método invocado no recebedor
[Aracajú, Goiânia, pode também enviar informações de volta ao
São Paulo]
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 121
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
134
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

O método sort() utiliza a implementação do método compareTo(), da interface Comparable,


implementado
//atribuindo String, para
pela classe valor classificar um
a variável List ou arrays de objetos String. Se quisermos fazer com que
referência
os elementos
Carrodacarro1
nossa coleção
= new sejam ordenados devemos implementar a interface java.lang.Comparable, e
Carro();
fornecer carro1.ano
uma implementação para o método int compareTo(Object), do objeto que será colocado na coleção. Vejo
= "2001";
o modo como invocamos o método:
carro1.modelo= "fusca";
carro1.cor = "prata";
int x = esteObjeto.compareTo(outroObjeto);

O método compereTo() retorna um int que deve ter as seguintes características:


 zero se esteObjeto for igual a outroObjeto.
 negativo se esteObjeto for menor que outroObjeto.
 positivo se esteObjeto for maior que outroObjeto.

Veja exemplo de comparação entre objetos Funcionários baseado na diferença das datas de contratação,
ordenado pelo tempo de casa em ordem decrescente.

import java.util.*;
Figura 2.4 – Layout Memória após inicialização
public class
//criando Funcionario
novo alias implements Comparable<Funcionario> {
Carro carro2 = carro1;
private double salario;
private Date dataContrato;
private String nome;
private String cargo = "indefinido";

public Funcionario() {
}

public Funcionario(String nome, double salario, Date dataContrato) {


this.salario = salario;
this.dataContrato = dataContrato;
this.nome = nome;
}

public Date getDataContrato() {


return dataContrato;
} Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

public int compareTo(Funcionario o) {


Calendar esteFuncionarioData = Calendar.getInstance();
2.3 Membros deesteFuncionarioData.setTime(dataContrato);
Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os
Calendar métodos definem o comportamento
outroFuncionarioData de um
= Calendar.getInstance();
em um objeto constituem
outroFuncionarioData.setTime(o.getDataContrato());
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos
long confundir isto com a implementação do método, que
esteFuncionarioTempo= Dois objetos distintos têm
esteFuncionarioData.getTimeInMillis();
é compartilhada por todas
longasoutroFuncionnarioTempo=
instâncias da classe. outroFuncionarioData.getTimeInMillis();
o mesmo estado se suas
return esteFuncionarioTempo > outroFuncionnarioTempo
2.3.1 Invocação de Métodos variáveis
? 1 membro têm os
: esteFuncionarioTempo > outroFuncionnarioTempo mesmos valores.
? 0 : -1;
Objetos se comunicam pela troca de mensagens, isto significa que um
}
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada
public que foi definida
String toString() no objeto.
{ Em Java, isto é feito pela
chamada de um método Calendar
em um cal
objeto = Calendar.getInstance();
usando o operador binário "." (ponto),
devendo especificar acal.setTime(DataContrato);
mensagem completa: o objeto que é o recebedor da
return nome + " desde "
mensagem, o método a ser invocado e os argumentos para o método (se
+ String.format("%td-%tm-%tY", houver).
cal, cal, cal);
O método invocado
} no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 122
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
135
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

public static void main(String[] args) {


List<Funcionario> funcList = new ArrayList<Funcionario>();
//atribuindoCalendar
valor a dataContrato
variável referência
= Calendar.getInstance();
Carro carro1 = new Carro();
carro1.ano dataContrato.set(2005,
= "2001"; 0, 02);
carro1.modelo= "fusca";
funcList.add(new Funcionario("Haroldo",100,dataContrato.getTime()));
carro1.cor = "prata";
dataContrato.set(2000, 1, 02);
funcList.add(new Funcionario("Aroldo",2000,dataContrato.getTime()));

dataContrato.set(2002, 2, 02);
funcList.add(new Funcionario("Frodo",3000, dataContrato.getTime()));

dataContrato.set(1997, 3, 02);
funcList.add(new Funcionario("Zaroldo",400,dataContrato.getTime()));

//imprime lista pela ordem de inserção


System.out.println(funcList);
Collections.sort(funcList);
Figura
//imprime lista 2.4 – Layout
pela ordem Memória
de após inicialização de Funcionario
compareTo
System.out.println(funcList);
//criando novo alias
Carro }carro2 = carro1;
}
Listagem 10.12 – Permitindo comparações de Objetos

Esta tipo de comparação sempre ocorre entre os objetos do mesmo tipo armazenados na lista, porém há
outra maneira. Podemos criar classes que implementam a interface Comparator e chamar a sobrecarga do método
sort(List o, Comparator c), assim o método sort() irá empregar o objeto que implementa Comparator ao invés de
chamar compareTo() do objeto.

10.9 Fazer Laboratório 10


Siga instruções do laboratório e tome cuidado com o tempo de execução, sempre recorra ao instrutor em
caso de dúvida, nunca deixe uma dúvida sem reposta

10.10 Exercício
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Escreva, compile e execute todas listagens de código apresentadas neste capítulo.

11
2.3 Construindo
Membros Interfaces Gráficas com AWT/Swing
de Instância
Mesmo sem conhecer interface gráfica com o usuário ou GUI (Graphical
Cada objeto criado deverá ter sua própria instância de variáveis Os valores
Projeto das variáveis
desenvolvido
User Interface) é possível criar uma grande variedade de diferentes projetos.
(atributos) definidas pela classe. Os métodos definem o comportamento de um ememGUI
umafeta
objeto constituem
o uso de
Entretanto, estas aplicações não teriam grandes chances de serem agradáveis aos
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
usuários, tão acostumados aos ambientes gráficos como Windows, Solaris e Linux. sua aplicação pois
classe. Porém não devemos confundir isto com a implementação do método, que
Ter um projeto desenvolvido em GUI afeta o uso de sua aplicação pois Dois objetos
resulta distintos têm
em facilidade
éresulta
compartilhada por todas as instâncias
e melhordaexperiência
classe.
em facilidade de uso para os usuários de seus ode
mesmo estado se suas
uso e melhor
aplicativos. Java fornece ferramentas como Abstract Window Toolkit (AWT) e experiência para ostêm os
variáveis membro
2.3.1 para
Swing Invocação de Métodos
desenvolver aplicações GUI interativas.
Objetos se comunicam pela troca de mensagens, isto significa que um usuários.
mesmos valores.
objeto
11.1 pode ter que mostrar
AWT (Abstract Window umToolkit)
comportamento
vs. Swingparticular invocando uma
operaçãoA apropriada que foi definida no
JFC (Java Foundation Classes) é uma objeto. Em Java,
importante istodeé Java
parte feitoSDK.
pela
chamada de um método em um objeto usando o operador binário "."
Refere-se a uma coleção de APIs que simplificam o desenvolvimento de aplicações (ponto),
devendo especificarbasicamente
Java GUI. Consistem a mensagem emcompleta:
cinco APIs o objeto AWT
incluindo que eé Swing.
o recebedor
As outrasda
mensagem, o método a ser invocado e os argumentos para o método (se
três APIs são Java2D, Accessibility e Drag and Drop. Todas essas APIs dão suporte houver).
O método invocado no recebedor pode também enviar informações
aos desenvolvedores na criação e implementação de aplicações visualmente de volta ao
objeto chamador
destacadas. através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 123
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
136
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Ambas AWT e Swing dispõem de componentes GUI que podem ser usadas na criação de aplicações Java e
Applets. //atribuindo
Diferentemente de alguns
valor a componentes AWT que usam código nativo, a API gráfica de seu sistema
variável referência
operacional.
CarroSwing fornece
carro1 uma Carro();
= new implementação independente de plataforma que assegura que aplicações
desenvolvidas em diferentes
carro1.ano plataformas tenham a mesma aparência. AWT, entretanto, assegura que o look and
= "2001";
feel (a aparência) de uma aplicação
carro1.modelo= "fusca"; executada em duas máquinas diferentes sejam compatíveis. A API Swing é
carro1.cor
construída sobre um número= "prata";
de APIs que implementa várias partes da AWT. Como resultado, componentes AWT
ainda podem ser usados com componentes Swing, mas não é recomendado.
Você pode ver uma demonstração de AWT e Swing com exemplos do JDK, veja em:

> $JAVA_HOME/demo/jfc/SwingSet2/
Swing é escrito > java -jar SwingSet2.jar SwingSet2 Java fornece
inteiramente em ferramentas como
Java. 11.2 Componentes GUI AWT Abstract Window
Apesar de não ser mais tão utilizada a AWT, ainda é Toolkit (AWT) e Swing
utilizada indiretamente por Swing, como gerenciadores de para desenvolver
layouts e classes para controle de eventos. Assim aplicações GUI
apresentamos alguns componentes para que você se
Figura 2.4 – Layout Memória após inicialização interativas.
familiarize com o processo de desenvolvimento e vá
//criando novo alias
gradualmente aprendendo a utilizar a JFC.
Carro carro2 = carro1;
11.2.1 Fundamental Window Classes
No desenvolvimento de aplicações GUI, os componentes como os botões ou
campos de texto são localizados em containers. Essa é uma lista de importantes
classes containers fornecidas pela AWT.

Classe AWT Descrição


Component Uma classe abstrata para objetos que podem ser exibidos no console interagir com o
usuário. A raiz de todas as outras classes AWT.
Container Uma subclasse abstrata da classe Component. Um componente que pode conter outros
componentes.
Panel Herda a classe Container. Uma área que pode ser colocada em um Frame, Dialog ou
Window. Superclasse da Memória
Figura 2.5 – Layout classe Applet.
duas variáveis referência para o mesmo objeto

Window Também herda a classe Container. Uma janela top-level, que significa que ela não pode ser
contida em nenhum outro objeto. Não tem bordas ou barra de menu.
2.3 Membros de Instância
Dialog Uma janela contendo a barra de título e o botão de fechar, utilizada para criar janelas para
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
comunicação com o usuário.
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
Frame Isto é importante,
objeto. Uma janela completa
pois denota quecomumum título,pertence
método barra de menu,
a cadaborda,
objetoedacantos redimensionáveis.
o seu estado.
Possui quatro
classe. Porém não devemos construtores,
confundir isto comdois deles possuemdo
a implementação as método,
seguintesqueassinaturas:
Dois objetos distintos têm
é compartilhada porFrame()
todas as instâncias da classe.
Frame(String title) o mesmo estado se suas
2.3.1 Invocação de Métodos Tabela 11.1: Classes Container AWT
variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que omostrar
Para configurar tamanhoum comportamento
da janela, podemos utilizarparticular invocando
o método uma
setSize(), do seguinte modo:
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadavoidde um método em width,
setSize(int um objeto intusando
height) o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,Reconfigura
o método o tamanho da janela
a ser invocado para
e os o width(largura)
argumentos height(altura)
para o emétodo fornecidos como argumentos.
(se houver).
O método invocado no recebedor pode também enviar informações de volta ao
void setSize(Dimension
objeto chamador através de um valord)de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 124
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
137
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Reconfigura o tamanho da janela para os atributos d.width e d.height baseado em um objeto instanciado
Dimension especificado
da classe//atribuindo valor como argumento.
a variável referência
Por padrão
Carro uma janela
carro1 = newnão é visível a não ser que seja configurada a sua visibilidade para true. Esta é a
Carro();
sintaxe para o método setVisible():
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata"; b)
void setVisible(boolean

Ao criar aplicações GUI, o objeto Frame é o mais comumente utilizado. Aqui está um exemplo de como
criar uma aplicação dessas:

import java.awt.*;

public class FrameDemo extends Frame {

public static void main(String args[]) {


FrameDemo sf = new FrameDemo();
sf.setSize(100, 100); // Tente removendo esta linha
sf.setVisible(true); // Tente removendo esta linha
} Figura 2.4 – Layout Memória após inicialização
}
//criando novo alias
Listagem 11.1 – Criando uma Janela com AWT Frame
Carro carro2 = carro1;

Este é o resultado esperado pela execução da classe FrameDemo:

Figura 11.1: Executando Frame AWT em Ambiente Linux/Gnome 2

Note que o botão de fechar ainda não funciona porque nenhum mecanismo de suporte a eventos foi
adicionado a classe até o momento.
FiguraConheceremos sobre
2.5 – Layout Memória suportereferência
duas variáveis a eventos
para nos próximos
o mesmo objeto tópicos.

11.2.2 Graphics
Vários métodos
2.3 Membros de gráficos são encontrados na classe Graphics. Aqui está a lista de alguns desses métodos.
Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
drawLine() definidas pela classe. Os métodos
(atributos) drawPolyline()
definem o comportamento setColor() de um em um objeto constituem
objeto.
fillRect()Isto é importante, pois denotadrawPolygon()
que um método pertence a cada objeto da
getFont() o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
drawRect() fillPolygon() setFont() Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
clearRect() getColor() drawString()
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Tabela 11.2: Alguns métodos da classe Graphics
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operaçãoRelacionada
apropriadaa essa
queclasse
foi definida no Color,
está a classe objeto.que Emtem três construtores.
Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
Formatodo
devendo Construtor
especificar a mensagem completa: o objeto Descrição que é o recebedor da
Color(int r, int
mensagem, g, int b) a ser invocado e os argumentos para
o método Valoro inteiro
métodode(se 0 ahouver).
255
O método invocado no recebedor
Color(float r, float g, float b) pode também enviar informações de volta
Valor decimal de 0.0 a 1.0. ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 125
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
138
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Color(int rgbValue) Valor variável de 0 a 224-1 (preto a branco).


Vermelho: bits 16-23
//atribuindo valor a variável referência
Carro carro1 = new Carro(); Verde: bits 8-15
carro1.ano = "2001"; Azul: bits 0-7
carro1.modelo= "fusca";
carro1.cor = "prata"; Tabela 11.3: Construtores Color

Aqui está uma classe demonstrando a utilização de alguns métodos da classe Graphics:

import java.awt.*;

public class GraphicsPanelDemo extends Panel {

GraphicsPanelDemo () {
// Constante na classe Color
setBackground(Color.WHITE);
}
Figura 2.4 – Layout Memória após inicialização
public void paint(Graphics g) {
//criando novo alias
// vermelho
g.setColor(new
Carro carro2 = carro1; Color(255, 0, 0));
g.setFont(new Font("Helvetica", Font.PLAIN, 16));
g.drawString("Bem Vindo ao mundo GUI de Java!", 30, 100);

// preto
g.setColor(new Color(1, 0, 0));
g.fillRect(10,100,150,10);
}

public static void main(String args[]) {


Frame f = new Frame("Testando Graphics/Panel");
GraphicsPanelDemo painel = new GraphicsPanelDemo();
f.add(painel);
f.setSize(600, 300);
f.setVisible(true);
}
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
}
Listagem 11.2 - Desenhando com Graphics no AWT Panel

2.3 Membros de Instância


Para
Cadaumobjeto
panel secriado
tornar deverá
visível, ele
terdeve
suaserprópria
colocadoinstância
em uma janela visível como um frame. Executando o
de variáveis Os valores das variáveis
código apresentado temos o seguinte resultado esperado:
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
Figura 11.2: Executando GraphicsPanel
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 126
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
139
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

11.2.3 Mais Componentes AWT


O exemplo apresenta
//atribuindo valoros componentes
a variável de controles AWT. Controles são componentes como botões ou
referência
campos textos
Carroque permitem
carro1 ao usuário
= new interagir com a aplicação GUI. Essas são todas as subclasses da classe
Carro();
Component.
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 11.3 - Executando ControlComponentDemo

Figura 2.4 – Layout Memória após inicialização


Código que gerou a Figura 11.3:
//criando novo alias
Carro
importcarro2 = carro1;
java.awt.*;

public class ControlComponentDemo extends Frame {

public ControlComponentDemo(){
setLayout(new GridLayout(4,6,10,10));
setSize(600, 200);
add(new Label("Nome"));
add(new Label("Componente"));
add(new Label("Nome"));
add(new Label("Componente"));
add(new Label("Nome"));
add(new Label("Componente"));
add(new Label("Button ->"));
add(new Button("Click Aqui"));
add(new Label("Label ->"));
add(new Label("Um
Figura Rotulo"));
2.5 – Layout Memória duas variáveis referência para o mesmo objeto
add(new Label("TextField ->"));
add(new TextField());
add(new Label("CheckBox ->"));
2.3 Membros deadd(new Instância Checkbox("chk1", true));
add(new
Cada objeto criado deverá Label("CheckBoxGroup
ter sua própria instância ->")); de variáveis
CheckboxGroup cbg = new CheckboxGroup(); Os valores das variáveis
(atributos) definidas pela classe.Checkbox("radios
add(new Os métodos definem1", o comportamento
cbg, true));de um em um objeto constituem
objeto. Isto é importante, pois denota que
add(new Label("List ->")); um método pertence a cada objeto da o seu estado.
classe. Porém não devemos
List confundir
list = new isto com a implementação
List(3, false); do método, que
list.add("item 1");
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
list.add("item 2"); o mesmo estado se suas
add(list);
2.3.1 Invocação de Métodos variáveis membro têm os
add(new Label("Choice ->"));
Objetos se comunicam pela troca
Choice chooser = denewmensagens,
Choice();isto significa que um mesmos valores.
objeto pode ter que chooser.add("Opção
mostrar um comportamento 1"); particular invocando uma
operação apropriada chooser.add("Opção
que foi definida no objeto. 2"); Em Java, isto é feito pela
chooser.add("Opção 3");
chamada de um método em um objeto usando o operador binário "." (ponto),
add(chooser);
devendo especificar aadd(new
mensagem completa: o objeto
Label("Scrollbar que é o recebedor da
->"));
mensagem, o método aadd(new
ser invocado e os argumentos para o método (se houver).
Scrollbar());
O método invocado nosetBackground(Color.WHITE);
recebedor pode também enviar informações de volta ao
setVisible(true);
objeto chamador }
através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 127
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
140
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

public static void main(String args[]) {


new ControlComponentDemo();
//atribuindo
} valor a variável referência
Carro
} carro1 = new Carro();
carro1.ano = "2001"; Listagem 11.3 – Componentes AWT
carro1.modelo= "fusca";
carro1.cor = "prata";
11.3 Gerenciadores de Layout
A posição e o tamanho dos componentes em cada Container é determinado pelo gerenciador de layout. O
gerenciador de layout gerencia a disposição dos componentes no container. Esses são alguns dos gerenciadores de
layout incluídos na JFC.
 FlowLayout
 BorderLayout
 GridLayout
 GridBagLayout
 CardLayout
 BoxLayout

Figura 2.4 – Layout Memória após inicialização


O gerenciador de layout pode ser configurado usando o método setLayout() da classe Container. O
método //criando
possui a seguinte
novoassinatura:
alias
Carro carro2 = carro1;
void setLayout(LayoutManager mgr)

Caso não seja necessário utilizar nenhum gerenciador de layout, é possível passar o layout do tipo nulo
(NullLayout) como argumento para esse método, ao se fazer isso será necessário posicionar todos os elementos
manualmente com a utilização do método setBounds() da classe Component. Este método possui a seguinte
assinatura:

public void setBounds(int x, int y, int width, int height)

O método controla a posição baseada nos argumentos x (esquerda) e y (topo), e o tamanho width
(largura) e height (altura) especificados. Isso seria bastante difícil e tedioso de programar, principalmente ao se
possuir um layout com diversos objetos Component e Container. Teríamos de chamar esse método para cada
componente, além de conhecer sua determinada posição em pixels. Sem falar que o resultado da apresentação em
diferentes ambientes gráficos ouFigura
resoluções deMemória
2.5 – Layout vídeo diferentes
duas variáveisnão podepara
referência sero mesmo
garantido.
objeto

11.3.1 O Gerenciador FlowLayout


O FlowLayout
2.3 Membros o gerenciador padrão para a classe Panel e suas subclasses, incluindo a classe Applet. Ele
deéInstância
posicionaCada
os componentes
objeto criadoda esquerda
deverá terparasuaa direita
própriae instância
de cima para baixo, começando no canto superior
de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de umFlowLayout
esquerdo. Imagine como se utilizasse um editor de textos. É assim que o gerenciador funciona.
em um objeto constituem
Ele possui três construtores que são como os listados abaixo:
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Construtores FlowLayout Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
FlowLayout() Cria um novo objeto FlowLayout com o alinhamento centralizado e 5 unidades de
2.3.1 Invocação de Métodos variáveis membro têm os
intervalo horizontal e vertical aplicado aos componentes por padrão.
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
FlowLayout(int align) Cria um novo objeto FlowLayout com o alinhamento especificado e o intervalo padrão
objeto pode ter que mostrar um comportamento
de 5 unidades particular
horizontal e vertical aplicadoinvocando uma
aos componentes.
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
FlowLayout(int
chamada de umalign,
métodoCria
emumumnovo objeto
objeto FlowLayout
usando com obinário
o operador primeiro"."argumento
(ponto), como o alinhamento
int hgap, int vgap) aplicado, o intervalo horizontal hgap e
devendo especificar a mensagem completa: o objeto que é o recebedoro intervalo vertical
davgap aplicado aos
componentes.
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também Tabelaenviar informações
11.4 - Construtores de volta ao
FlowLayout
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 128
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
141
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

O intervalo se refere ao espaçamento entre os componentes e é medido em pixels. O argumento


alinhamento deve ser um dos
//atribuindo seguintes:
valor a variável referência
Carro
 FlowLayout.LEFT
carro1 = new Carro();
 FlowLayout.CENTER
carro1.ano = "2001";
 FlowLayout.RIGHT
carro1.modelo= "fusca";
carro1.cor = "prata";
Veja exemplo:

import java.awt.*;

public class FlowLayoutDemo extends Frame {

public static void main(String args[]) {

FlowLayoutDemo fld = new FlowLayoutDemo();


fld.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
fld.add(new Button("ONE"));
fld.add(new Button("TWO"));
fld.add(new Button("THREE"));
Figura 2.4 – Layout Memória após inicialização
fld.add(new Button("FOUR"));
//criando novo alias
fld.add(new Button("FIVE"));
Carro carro2 = carro1;
fld.setSize(200, 100);
fld.setVisible(true);
}
}
Listagem 11.4 - FlowLayout

O resultado da execução sobre a plataforma Linux/Gnome é apresentado abaixo.

Figura 11.4 - Executando FlowLayoutDemo


Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

11.3.2 O Gerenciador BorderLayout


2.3 Membros de Instância
O BorderLayout divide o container em cinco partes – north (norte), south (sul), east (leste), west (oeste) e
Cada objeto
center (centro). criado deverá
Cada componente ter suaa própria
é adicionado uma região instância de As
específica. variáveis
regiões north south espalham-se
Ose valores das variáveis
horizontalmente enquanto
(atributos) definidas que as regiões
pela classe. east edefinem
Os métodos west ajustam-se verticalmente.
o comportamento de umA regiãoemcentro, por
um objeto outro lado,
constituem
ajusta-se eméambos,
objeto. Isto horizontalmente
importante, pois denotae que
verticalmente.
um método Esse layout éa o
pertence padrão
cada paradaobjetos Window, incluindo as
objeto o seu estado.
subclasses Frame
classe. Porém e Dialog.
não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
Construtores BorderLayout
2.3.1 Invocação de Métodos variáveis membro têm os
BorderLayout() Cria um novo objeto BorderLayout sem valores.
nenhum
Objetos se comunicam pela troca de mensagens, espaçamento que um sobre mesmos
isto significaaplicado os diferentes
objeto pode ter que mostrar um comportamento particular componentes. invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
BorderLayout(int
chamada de um hgap,
métodoint em
vgap)
um objeto usando o operador Cria um novo "."
binário objeto BorderLayout com espaçamento
(ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da vgap aplicado sobre os
horizontal hgap e vertical
diferentescomponentes.
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode Tabela também enviar informações
11.5 - Construtores BorderLayout de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 129
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
142
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Como no gerenciador FlowLayout, os parâmetros hgap e vgap aqui também se referem ao espaçamento
entre os //atribuindo
componentes no container.
valor a Para um componente a uma região específica, use o método add() e
adicionarreferência
variável
passe dois argumentos:
Carro carro1o =componente
new Carro(); a ser adicionado e a região onde o componente deve ser posicionado.
Adicionarcarro1.ano
mais de um componente
= "2001"; a um container resulta em exibir apenas o último componente adicionado. A
lista a seguir apresenta as regiões
carro1.modelo= válidas que são campos predefinidos na classe BorderLayout.
"fusca";
carro1.cor
 = "prata";
BorderLayout.NORTH
 BorderLayout.SOUTH
 BorderLayout.EAST
 BorderLayout.WEST
 BorderLayout.CENTER Apenas um
componente pode
Aqui está uma classe demonstrando como a BorderLayout pode ser utilizada: ser colocado em
uma região.
import java.awt.*;

public class BorderLayoutDemo extends Frame {

public static void main(String args[])


Figura 2.4 – Layout Memória após{inicialização

//criando novo alias


BorderLayoutDemo bld = new BorderLayoutDemo();
Carro carro2 = carro1;
bld.setLayout(new BorderLayout(10, 10)); // pode remover
bld.add(new Button("NORTH"), BorderLayout.NORTH);
bld.add(new Button("SOUTH"), BorderLayout.SOUTH);
bld.add(new Button("EAST"), BorderLayout.EAST);
bld.add(new Button("WEST"), BorderLayout.WEST);
bld.add(new Button("CENTER"), BorderLayout.CENTER);
//bld.setSize(200, 200);
bld.setSize(400, 400);//redimensione
bld.setVisible(true);
}
}
Listagem 11.5 - BorderLayout

A figura mostra o resultado.

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Figura 11.5 - Executando BorderLayoutDemo
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
11.3.3 O gerenciador GridLayout
chamada de um método em um objeto usando o operador binário "." (ponto),
Com o gerenciador GridLayout, componentes também são posicionados da esquerda para a direita e de
devendo
cima especificar
para baixo como noa mensagem
gerenciador completa:
FlowLayout.o Além objeto queo gerenciador
disso, é o recebedor da
GridLayout divide o container em um
mensagem, o método a ser invocado e os argumentos para o método (se houver).
número de linhas e colunas. Todas essas regiões são do mesmo tamanho. Ele sempre ignora o tamanho preferido
O método
do invocado
componente. no recebedor
A seguir, pode também
são apresentados enviar disponíveis
os construtores informaçõespara de avolta
classeaoGridLayout.
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 130
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
143
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Construtores GridLayout
//atribuindo valor a variável referência
GridLayout() Cria um novo objeto GridLayout com uma única linha e uma
Carro carro1 = new Carro();
única coluna por padrão.
carro1.ano = "2001";
GridLayout(int rows, int cols)"fusca";
carro1.modelo= Cria um novo objeto GridLayout com o número especificado
carro1.cor = "prata"; de linhas e colunas.
GridLayout(int rows, int cols, int hgap, int vgap) Cria um novo objeto GridLayout com o número especificado
de linhas e colunas. Os espaçamentoshorizontalhgap e
verticalvgap sãoaplicadosaoscomponentes.

Tabela 11.6 - Construtores GridLayout

Vejamos a seguinte classe:

import java.awt.*;

public class GridLayoutDemo extends Frame {


Figura 2.4 – Layout Memória após inicialização
public
//criando static
novo void main(String args[]) {
alias
GridLayoutDemo
Carro carro2 = carro1; gld = new GridLayoutDemo();
gld.setLayout(new GridLayout(2, 3, 4, 4));
gld.add(new Button("ONE"));
gld.add(new Button("TWO"));
gld.add(new Button("THREE"));
gld.add(new Button("FOUR"));
gld.add(new Button("FIVE"));
gld.setSize(200, 200);
gld.setVisible(true);
}
}
Listagem 11.6 - GridLayout

Esse é o resultado da classe (observe o efeito do redimensionamento sobre o frame na segunda figura):

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos Figura 11.6 - Executando GridLayoutDemo
variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
11.3.4 Painéis
operação e Layoutsque
apropriada Complexos
foi definida no objeto. Em Java, isto é feito pela
chamadaParade criar layouts mais
um método em complexos,
um objeto éusando
possívelo combinar
operadorosbinário
diferentes gerenciadores de layout com o uso de
"." (ponto),
objetos do tipo Panel. Lembre-se que Panel é um Container
devendo especificar a mensagem completa: o objeto que é o recebedor e um Component ao mesmo
da tempo. É possível inserir
Components em um Panel e adicionar este a uma região específica
mensagem, o método a ser invocado e os argumentos para o método (se houver). do Container.
O método Observe a técnica
invocado utilizada na
no recebedor classe
pode a seguir:enviar informações de volta ao
também
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 131
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
144
www.3way.com.br
Linguagem de Programação
Linguagem Java Java
de Programação

import java.awt.*;
//atribuindo
public valor a variável
class CompondoLayouts referência
extends Frame {
Carro carro1 = new Carro();
carro1.ano = "2001";
public static void main(String args[]) {
carro1.modelo= "fusca";
carro1.corCompondoLayouts
= "prata"; cl = new CompondoLayouts();
Panel panelNorth = new Panel();
Panel panelCenter = new Panel();
Panel panelSouth = new Panel();

/* Painel North */
// Painéis usam FlowLayout por padrão
panelNorth.add(new Button("ONE"));
panelNorth.add(new Button("TWO"));
panelNorth.add(new Button("THREE"));

/* Painel Center */
panelCenter.setLayout(new GridLayout(1, 4));
panelCenter.add(new TextField("1st"));
Figura 2.4
panelCenter.add(new – Layout Memória após inicialização
TextField("2nd"));
//criando panelCenter.add(new
novo alias TextField("3rd"));
panelCenter.add(new
Carro carro2 = carro1; TextField("4th"));

/* Painel South */
panelSouth.setLayout(new BorderLayout());
panelSouth.add(new Checkbox("Choose me!"), BorderLayout.CENTER);
panelSouth.add(new Checkbox("I'm here!"), BorderLayout.EAST);
panelSouth.add(new Checkbox("Pick me!"), BorderLayout.WEST);

/* Adicionando os Panels ao Frame container */


// Frames usam BorderLayout por padrão
cl.add(panelNorth, BorderLayout.NORTH);
cl.add(panelCenter, BorderLayout.CENTER);
cl.add(panelSouth, BorderLayout.SOUTH);
cl.setSize(300, 300);
cl.setVisible(true);
}
}
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Listagem 11.7 – Layout Complexos

2.3 Este é o resultado


Membros da classe:
de Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de Figura 11.7 - Executando
retorno. O método Layout Complexo deve ser
chamado
um que esteja definido pelo objeto.
Seja um Profissional Aprendendo com Profissionais 132
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
146
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

11.4 Componentes
//atribuindo GUI Swing
valor a variável referência
Como pacote AWT,
Carroo carro1 o pacote
= new Swing fornece classes para criar aplicações GUI. O pacote é encontrado em
Carro();
javax.swing. A diferença principal
carro1.ano entre esses dois é que o componente Swing é escrito inteiramente usando Java enquanto o
= "2001";
outro não. Como resultado, projetos
carro1.modelo= "fusca"; GUI escritos utilizando classes do pacote Swing possuem a mesma aparência mesmo
quando executado
carro1.cor sobre plataformas completamente diferentes. Além disso, Swing fornece componentes mais interessantes.
= "prata";
Os nomes dos componentes de Swing são quase similares aos componentes AWT. Uma diferença óbvia é a convenção
de nomes dos componentes. Basicamente, os nomes dos componentes Swing são os mesmos nomes dos componentes AWT
mas com um prefixo em que é adicionado a letra J. Por exemplo, um componente no AWT é a classe Button, o mesmo
componente correspondente a este no pacote Swing é a classe JButton. Descrito abaixo, está uma lista de alguns dos
componentes Swing:

Componente Descrição

JComponent A classe raiz para todos os componentes Swing, excluindo containers hierarquicamente
superiores.

JButton Um botão do tipo "pressionar". Corresponde a classe Button no pacote AWT.


Figura 2.4 – Layout Memória após inicialização
JCheckBox Um item que pode ser marcado ou desmarcado pelo usuário. Corresponde a classe
//criando novo alias
Checkbox no pacote AWT.
Carro carro2 = carro1;

JFileChooser Permite ao usuário que selecione um arquivo. Corresponde a classe FileChooser no


pacote AWT.

JTextField Permite a edição de uma única linha de texto. Corresponde a classe TextField no pacote
AWT.

JFrame Herda e corresponde a classe Frame no pacote AWT, mas as duas são ligeiramente
incompatíveis em termos de adição de componentes a esse container. É preciso pegar o
conteúdo do pane atual antes de adicionar um componente.

JPanel Herança de um JComponent.É uma classe container simples. Corresponde a classe Panel
no pacote AWT.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
JApplet Herança da classe Applet no pacote AWT. Também ligeiramente incompatível com a
classe Applet em termos de adição de componentes a esse container.

2.3 Membros
JOptionPane de Instância
Herda JComponent. Fornece uma maneira fácil de exibir caixas de diálogo pop-up.
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
JDialog Herança
(atributos) definidas pela classe. da classe
Os métodos Dialog onocomportamento
definem pacote AWT. Normalmente
de um utilizado para informar o
em um objeto constituem
usuário de
objeto. Isto é importante, pois denota quealguma coisa oupertence
um método alertá-lo para umaobjeto
a cada entrada.
da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
JColorChooser Herda JComponent. Permite ao usuário selecionar uma cor. Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos Tabela 11.7 - Alguns componentes Swing
variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
de componentes Swing, por favor recorra à documentação API.
objeto Para
podea lista
ter completa
que mostrar um comportamento particular invocando uma
operação apropriada que foi definida
11.4.1 Configurando Containers JFrame e JApplet
no objeto. Em Java, isto é feito pela
chamada de um método em um objeto
Como mencionado, os containers top-level usandocomo o operador
o JFrame e o "."
binário (ponto),
JApplet no pacote Swing são ligeiramente
devendo especificar
incompatíveis a mensagem completa:
com seus correspondentes AWT. Isso emo termos
objetodeque é de
adição o componentes
recebedor da ao container. Ao invés de adicionar
mensagem,um
diretamente o método
componente a seraoinvocado
container e os argumentos
como nos containerspara AWT,o émétodo (seprimeiro
necessário houver).pegar o conteúdo do ContentPane
do container.invocado
O método Para fazer isso utiliza-se o método
no recebedor getContentPane()
pode também do container: de volta ao
enviar informações
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 133
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
147
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

import javax.swing.*;
import java.awt.*;
//atribuindo valor a variável referência
Carro
publiccarro1
class = new Carro();
SwingDemo extends JFrame {
carro1.ano = "2001";
JButton botao = new JButton("Fonte");
carro1.modelo= "fusca";
JLabel rotulo = new JLabel("Um botao");
carro1.cor = "prata";
public SwingDemo() {
super("Primeira Aplicação Swing");
this.setSize(300, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new FlowLayout());//default BorderLayout
this.getContentPane().add(rotulo);//conteiner que recebe o componente
this.getContentPane().add(botao);
this.setVisible(true);
}

public static void main(String args[]) {


new SwingDemo();
}
} Figura 2.4 – Layout Memória após inicialização

//criando novo alias Listagem 11.8 - JFrame


Carro carro2 = carro1;

Note que o pacote java.awt ainda é importado porque os gerenciadores de layout em uso são definidos
neste pacote. Aqui está um resultado demonstrativo:

Figura 11.8 - Executando SwingDemo

11.5 Manipulação de Eventos


Os componentes Swing são2.5construídos
Figura com
– Layout Memória duasbase noreferência
variáveis padrãopara
de oprojeto denominado Model Delegate
mesmo objeto
(Modelo de Delegação). Este padrão descreve o modo como sua classe pode responder a uma interação do
usuário. Para compreender o modelo, devemos perceber a colaboração entre três componentes:
2.3 Membros de Instância
1. Event
Cada objetoSource
criado(Gerador
deverá deterEvento) - O event
sua própria source de
instância refere-se ao
variáveis
componente da interface que origina o evento. Por exemplo, se o
Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um emcomponentes
Os um objeto constituem
Swing
usuário pressiona um botão, o event source neste caso é o botão.
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
tem uma interação do
classe. Porém não devemos confundir isto com a implementação do método, que
2. Event Listener/Handler (Monitor de Eventos/Manipulador) - O event Dois objetos
usuário distintos
através de têm
é compartilhada por todas as instâncias da classe.
listener recebe informações de eventos e processa as interações do o mesmo estado se suas
eventos gerados pelos
usuário. Quando um botão é pressionado, o event listener pode tratá- variáveis membro
componentes têm os
através
2.3.1 Invocação de Métodos
lo exibindo uma informação útil ao usuário.
Objetos se comunicam pela troca de mensagens, isto significa que um de acções do usuário
mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando com a aplicação..
3. Event Object (Objeto Evento) - Quando um evento ocorre uma
(por
operação apropriada
exemplo, quando o usuário interage com um componente dafeito
que foi definida no objeto. Em Java, isto é pela
interface
chamada de um método
gráfica), um em umde
objeto objeto
eventousando o operador
é criado. binário
Este objeto "." (ponto),
contém todas as
devendo especificar a mensagem
informações completa:
necessárias sobre oo evento
objeto gerado.
que é oAsrecebedor
informações da
mensagem, o método
incluem ao ser
tipoinvocado e osdigamos,
de evento, argumentos para do
o clique o método
mouse.(se
Háhouver).
diversas
O método invocado
classes no
de recebedor
evento parapode também
diferentes enviar informações
categorias de volta Um
de ações do usuário. ao
objeto chamador através de um valor de retorno. O método chamado
objeto de evento tem o tipo de dado de uma dessas classes. deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 134
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
148
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Aqui está representado


//atribuindo valoro modelo de delegação
a variável de eventos:
referência
Carro carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
carro1.cor = "prata";

Figura 11.9 - Modelo de Delegação de Eventos

Figura 2.4 – Layout Memória após inicialização


Inicialmente, um listener deverá ser registrado pelo event source. Assim ele poderá receber informações
sobre os //criando
eventos quandonovo alias no event source. Somente um listener registrado poderá receber notificações
ocorrerem
Carro carro2 = carro1;
dos eventos. Uma vez registrado, um listener simplesmente aguarda até que ocorra um evento.
Quando alguma coisa acontece no event source, um objeto event, que descreve o evento, é criado. O
evento é então disparado pelo gerador para os listener registrados. Quando o listener recebe um objeto event
(ou seja, uma notificação) de um event source, ele executa sua função. Ele decifra a notificação e processa o
evento ocorrido.

11.5.1 Registrando Classes Ouvintes (Listeners)


O event source registra um listener através dos métodos add<Tipo>Listener.

void add<Tipo>Listener(<Tipo>Listener listenerObj)

<Tipo> depende do tipo de event source. Ele pode ser Key, Mouse, Focus, Component, Action e outros.
Diversos listener podem ser registrados para um event source para recepção de notificações de
eventos. Um listener registrado pode também ser removido através do método remove<Tipo>Listener.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
void remove<Tipo>Listener(<Tipo>Listener listenerObj)

11.5.2 Classes Event


2.3 Membros de Instância
Um EventObject tem uma classe de evento que indica seu tipo. Na raiz da hierarquia das classes Event
Cada EventObject,
estão a classe objeto criado
que deverá ter sua
é encontrada própriajava.util.
no pacote instância
Umade variáveis
subclasse imediataOs
davalores das variáveis
classe EventObject
é(atributos) definidas pela
a classe AWTEvent. classe.
A classe Os métodos
AWTEvent definem ono
está declarada comportamento
pacote java.awt.deEla
umé a raiz
em um objeto
de todos os constituem
eventos
objeto. Isto é importante, pois denota que um método pertence
baseados em AWT. A seguir temos algumas das classes de evento AWT: a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
éClasses
compartilhada
de EventoporDescrição
todas as instâncias da classe.
o mesmo estado se suas
variáveis
ComponentEvent Estende a classe AWTEvent. Instanciada quando um componenteé movido,
2.3.1 Invocação de Métodos membro têm os
redimensionado,
tornado visível ou invisível. mesmos valores.
Objetos se comunicam pela troca de mensagens, isto significa que um
InputEvent
objeto Estende
pode ter que a classe
mostrar umComponentEvent.
comportamento Classe abstrata
particular de evento,
invocando umaraiz apartir da qual são
operação apropriada que foi definida no objeto. Em Java, isto é feito peladados.
implementadas todas as classes de componentesde entrada de
chamada de um método
ActionEvent Estendeem um objeto
a classe usando
AWTEvent. o operador
Instanciada um"."
binário
quando (ponto),
botão é pressionado, um item de uma
devendo especificarlista
a mensagem completa:
recebe duplo-clique o objeto
ou quando umque
itemédeomenu
recebedor da
é selecionado.
mensagem, o método a ser invocado e os argumentos para o método (se houver).
ItemEvent Estende a classe AWTEvent. Instanciada quando um item é selecionado ou desmarcado pelo
O método invocado no recebedor pode também enviar informações de volta ao
usuário, seja numa lista ou caixa de seleção (checkbox).
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 135
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
149
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

KeyEvent Estende a classe InputEvent. Instanciado quando uma tecla é pressionada, liberada ou
digitada
//atribuindo (pressionada
valor e liberada).
a variável referência
Carro carro1 = new Carro();
MouseEvent Estende a classe InputEvent. Instanciada quando um botão do mouse é pressionado,
carro1.ano = "2001";
liberado,"fusca";
carro1.modelo= clicado (pressionado e liberado) ou quando o cursor do mouse entra ou sai de uma
carro1.corparte=visível de um componente.
"prata";
TextEvent Estende a classe AWTEvent. Instanciada quando o valor de um campo texto ou area de texto
sofre alteração.
WindowEvent Estende a classe ComponentEvent. Instanciada quando um objeto Windowé
aberto,fechadoativado, desativado, minimizado, restaurado ou quando o foco
étransferido para dentro ou para fora da janela.
Tabela 1: Classes Event

Tome nota: todas as subclasses de AWTEvent seguem esta convenção de nomeação: <Tipo>Event

11.5.3 Listeners de Evento


Listeners de evento são classes que implementam as interfaces <Tipo>Listener. A tabela a seguir algumas
Figura 2.4 – Layout Memória após inicialização
interfaces utilizadas com maior freqüência:
//criando novo alias
Carro carro2 = carro1;
Listeners de Evento Descrição
ActionListener Recebe eventos de ação, estes podem ser um pressionamento do mouse ou da
barra de espaço sobre o objeto.
MouseListener Recebe eventos do mouse.
MouseMotionListener Recebe eventos de movimento do mouse, que incluem arrastar e mover o
mouse.
WindowListener Recebe eventos de janela (abrir, fechar, minimizar, entre outros).
Tabela 2: Event Listeners

11.5.3.1 Método de ActionListener


Este é o método da interface ActionListener que deve ser implementado:

Métodos de ActionListener Descrição


Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

Chamado quando o mouse é pressionado ou foi utilizada a


public void actionPerformed(ActionEvent e)
barra de espaço sobre um botão por exemplo.
2.3 Membros de Instância Tabela 3: Método de ActionListener
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
11.5.3.2 Métodos de MouseListener
(atributos) definidas pela classe. Os métodos definem o comportamento de um
Estes são os métodos da interface MouseListener que devem ser implementados:em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Métodos de MouseListener Descrição Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
public void mouseClicked(MouseEvent e) o mesmo estado
Chamado quando o mouse é pressionado (pressionar e soltar).se suas
2.3.1 Invocação de Métodos variáveis membro têm os
public void mouseEntered(MouseEvent e) Chamado quando o cursor do mouse entra em um componente.
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
public void mouseExited(MouseEvent e) Chamado quando o cursor do mouse sai de um componente.
objeto pode ter que mostrar um comportamento particular invocando uma
operação Chamado Emquando
Java, oisto
botão do mouse
pelaé pressionado sobre um
public voidapropriada que foi definidae) no objeto.
mousePressed(MouseEvent é feito
chamada de um método em um objeto usando componente
o operador (pressionar).
binário "." (ponto),
devendo especificar a mensagem completa:Chamado o objetoquandoque éo obotão
recebedor daé solto sobre um
do mouse
public void mouseReleased(MouseEvent
mensagem, o método a ser invocado e ose)argumentos para(soltar).
o método (se houver).
componente
O método invocado no recebedor pode também enviar informações de volta ao
Tabela 4: Métodos de MouseListener
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 136
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
150
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

11.5.3.3 Métodos de MouseMotionListener


//atribuindo valor a variável referência
Estes são
Carro os métodos
carro1 da interface
= new Carro(); MouseMotionListener que devem ser implementados:
carro1.ano = "2001";
Métodos MouseListener
carro1.modelo= "fusca"; Descrição
carro1.cor = "prata";
Chamado quando o mouse é pressionado sobre um componente
public void mouseDragged(MouseEvent e) e então arrastado (dragged). É chamado tantas vezes quanto o
mouse for arrastado.
Chamado quando o cursor do mouse é movido sobre um
public void mouseMoved(MouseEvent e) componente, sem que o mouse esteja pressionado. Será
chamado múltiplas vezes, tantas quantas o mouse for movido.
Tabela 5: Métodos MouseMotionListener

11.5.3.4 Métodos WindowListener


Estes são os métodos da interface WindowListener que devem ser implementados:
Figura 2.4 – Layout Memória após inicialização
Métodos WindowListener
//criando novo alias Descrição
Carro carro2 = carro1;
public void windowOpened(WindowEvent e) Chamado quando uma janela é aberta (quando o objeto
Window torna-se visível pela primeira vez)
public void windowClosing(WindowEvent e) Chamado quando uma janela é encerrada (objeto
Window)
public void windowClosed(WindowEvent e) Chamado quando a janela foi fechada após a liberação de
recursos utilizados pelo objeto (EventSource).
public void windowActivated(WindowEvent e) Chamado quando uma janela é ativada, ou seja, está em
uso.
public void windowDeactivated(WindowEvent e) Chamado quando uma janela deixa de ser a janela ativa.
public void windowIconified(WindowEvent e) Chamado quando a janela é iconificada
public void windowDeiconified(WindowEvent e) Chamado quando a janela retorna do estado iconificado
Figura 2.5 – Layout Memória para o normal
duas variáveis referência para o mesmo objeto

Tabela 6: Métodos WindowListener

2.3 Membros
11.5.3.5 Roteiro para decriação
Instância
de Aplicações Gráficas com tratamento de eventos
Cada objeto criado
Estes são os passos a serem deverá ter sua
lembrados própria
ao criar uma instância de variáveis
aplicação gráfica com tratamentoOs valores das variáveis
de eventos.
(atributos)1.definidas pela classe. Os métodos definem o comportamento de um
Criar uma classe que descreva e mostre a aparência da sua aplicação gráfica. em um objeto constituem
objeto. Isto
2. é Criar
importante, poisque
uma classe denota que uma método
implemente interfacepertence a cada
XXXListener objeto da
apropriada. o seuestar
Esta classe poderá inserida
estado.
classe. Porémna não devemos confundir
classe do primeiro passo. isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas
3. Na classe as instâncias
implementada, da classe.
sobrepor todos os métodos da interface XXXListener.o mesmo estado se suas
4. Descrever em cada método como o evento deve ser tratado. Podemos deixar vazio um método que
2.3.1 Invocação de Métodos variáveis membro têm os
não desejamos tratar.
Objetos se comunicam
5. Registrar pela troca de(amensagens,
o objeto XXXListener instância daisto significa
classe que umdo passo mesmos
XXXListener valores.
2) no EventSource
objeto pode utilizando
ter que omostrar
método um comportamento particular invocando uma
add<Tipo>Listener.
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamadaVejade exemplo
um métodode usoemdoumEvento Action:
objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem,import java.awt.BorderLayout;
o método a ser invocado e os argumentos para o método (se houver).
import java.awt.event.ActionEvent;
O método invocado no recebedor pode também enviar informações de volta ao
import java.awt.event.ActionListener;
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 137
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
151
www.3way.com.br
Linguagem de Programação
Linguagem Java Java
de Programação

import javax.swing.JButton;
import javax.swing.JFrame;
//atribuindo
import valor a variável referência
javax.swing.JTextField;
Carro carro1 = new Carro();
carro1.ano
public = "2001"; extends JFrame implements ActionListener {
class ActionDemo
carro1.modelo= "fusca";tf;
private JTextField
carro1.cor = "prata";
private JButton bt;

public ActionDemo(String title) {


super(title);
tf = new JTextField();
bt = new JButton("Cliqui Aqui");

add(tf, BorderLayout.SOUTH);
add(bt, BorderLayout.NORTH);

setSize(300, 300);
bt.addActionListener(this);
Figura 2.4 – Layout
//o evento windowClose Memória após inicialização
e disparado
//criando this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
novo alias
setVisible(true);
Carro carro2 = carro1;
}

public void actionPerformed(ActionEvent actionEvent) {

//acao depende do conteudo do campo texto tf


if (tf.getText().equals("Ação"))
tf.setText("Cliquei e mudei");
else
tf.setText("Ação");
}

public static void main(String args[]) {


new ActionDemo("Action Demo");
}
}
Listagem 11.9 - Eventos
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

A seguir vemos algumas imagens da janela criada pela classe ActionDemo:


2.3 Membros de Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no Figura
recebedor pode também enviar informações de volta ao
11.10.1:2 – Botão dispara maniupulador de Envento Action, na mesma classe
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.
Seja um Profissional Aprendendo com Profissionais 138
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
152
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

11.5.4 Implementando Manipuladores de Eventos com Anonymous inner class


//atribuindo valor a variável referência
visto no=Capítulo
Como foicarro1
Carro 7.14, as anonymous inner class, são classes internas que são declaradas sem
new Carro();
um nome. Normalmente
carro1.ano = "2001"; em contextos onde o reuso da classe não é importante. Por exemplo
são utilizadas
declarar uma anonymous
podemoscarro1.modelo= "fusca";inner class como um argumento de método ou atribuição de uma variável.
Se você observar =
carro1.cor a listagem
"prata"; anterior verá que o manipulador de evento ActionListener foi implementado
pela própria classe ActionDemo, mas essa estratégia pode causar alguns transtornos quando você tem que
manipulador as ações de vários botões. Você consegue perceber a dificuldade? Você terá que saber qual botão
disparou o evento. Fazer isso não é difícil, mas é enfadonho, veja um exemplo com três botões:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class ActionDemo extends JFrame implements ActionListener {


private JTextField tf;
Figura 2.4 – Layout Memória após inicialização
private JButton bt1;
//criando novo
private alias bt2;
JButton
Carro private
carro2 JButton
= carro1;
bt3;

public ActionDemo(String title) {


super(title);
tf = new JTextField();
bt1 = new JButton("botão 1");
bt2 = new JButton("botão 2");
bt3 = new JButton("botão 3");

add(tf, BorderLayout.SOUTH);
add(bt3, BorderLayout.EAST);
add(bt2, BorderLayout.CENTER);
add(bt1, BorderLayout.WEST);

setSize(300, 300);
bt1.addActionListener(this);
bt2.addActionListener(this);
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
bt3.addActionListener(this);
//o evento windowClose e disparado
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
2.3 Membros desetVisible(true);
Instância
Cada }objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um
public void actionPerformed(ActionEvent actionEvent) { em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence
if (actionEvent.getSource()== bt1)a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação
tf.setText("Cliquei no botãodo1");
método, que
elseasif (actionEvent.getSource()== bt2) Dois objetos distintos têm
é compartilhada por todas instâncias da classe.
tf.setText("Cliquei no botão 2"); o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
JButton bt = (JButton) actionEvent.getSource();
Objetos se comunicam pela troca de mensagens, isto significa que
if (bt.getActionCommand().equals("botão 3"))um mesmos valores.
objeto pode ter que mostrar um comportamento particular
tf.setText("Cliquei no botãoinvocando
3"); uma
}
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método
public static objeto
em umvoid usando o operador
main(String args[]) binário
{ "." (ponto),
devendo especificar anewmensagem completa: o objeto
ActionDemo("Action Demo que 2");é o recebedor da
mensagem, o método
} a ser invocado e os argumentos para o método (se houver).
O método} invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. ListagemO11.10 – Eventoschamado deve ser
método
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 139
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
153
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Veja que no método


//atribuindo actionPerformed()
valor você tem que testar qual botão disparou o evento usando uma
a variável referência
das comparações com actionEvent.getSource(),
Carro carro1 = new Carro(); que retorna a referência do objeto fonte do evento, ou fazendo
casting desta referencia para
carro1.ano inferir sobre o rótulo do botão. Você pode utilizar uma anonymous inner class para
= "2001";
fazer o mesmo, veja:
carro1.modelo= "fusca";
carro1.cor = "prata";
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class ActionDemo3 extends JFrame {


private JTextField tf;

private JButton bt;


Figura 2.4 –title)
public ActionDemo3(String Layout Memória
{ após inicialização
super(title);
//criando novo alias
tf==carro1;
Carro carro2 new JTextField();
bt = new JButton("Cliqui Aqui");
add(tf, BorderLayout.SOUTH);
add(bt, BorderLayout.NORTH);
setSize(300, 300);
// usando anonymous inner class como argumento do método
bt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent actionEvent) {
// acao depende do conteudo do campo texto tf
if (tf.getText().equals("Ação 3"))
tf.setText("Cliquei e mudei");
else
tf.setText("Ação 3");
}
});

// o evento windowClose e disparado


Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
2.3 Membros de Instância
public static void main(String args[]) {
Cada objeto new criado deverá ter sua própria
ActionDemo3("Action Demoinstância
3"); de variáveis Os valores das variáveis
(atributos) definidas
} pela classe. Os métodos definem o comportamento de um em um objeto constituem
} é importante, pois denota que um método pertence a cada objeto da
objeto. Isto
Listagem 11.11 – Eventos de Ação
o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
Você cria um objeto em tempo de execução para o evento, este fará a chamada a um método, que se
o mesmo estado se suas
encarregará de executar
2.3.1 Invocação as instruções, desta forma cada botão tem seu próprio manipulador
de Métodos variáveis membro
de evento, têm os
não sendo
preciso testar qualse
Objetos objeto disparoupela
comunicam o evento,
troca pois o objeto manipulador
de mensagens, do evento
isto significa que um é único paramesmos valores.
cada objeto fonte.
Isto faz sentido, você concorda? O objeto de botão realizará
objeto pode ter que mostrar um comportamento particular invocando uma uma ação exclusiva, o código do manipulador não
necessitará ser reaproveitado em momento algum.
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
11.6Classes Adaptadoras
devendo especificar a mensagem completa: o objeto que é o recebedor da
Vamos
mensagem, o método implementar um exemplo
a ser invocado de uso para
e os argumentos da interface (se houver). e MouseMotionListener.
o métodoMouseListener
Diferentemente da interface ActionListener, esta interface
O método invocado no recebedor pode também enviar informações de define cinco e dois métodos
volta ao respectivamente, portanto
você
objetodeve implementar
chamador todos
através de os
ummétodos
valor degrafados
retorno. nasOinterfaces, veja exemplo:
método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 140
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
154
www.3way.com.br
Linguagem de Programação
Linguagem Java Java
de Programação

import java.awt.BorderLayout;
//atribuindo
import valor a variável referência
java.awt.TextField;
Carro carro1 = new Carro();
import java.awt.event.MouseEvent;
carro1.ano = "2001";
import java.awt.event.MouseListener;
carro1.modelo=
import "fusca";
java.awt.event.MouseMotionListener;
carro1.cor = "prata";
import javax.swing.JFrame;

public class EventosMouseDemo extends JFrame {

private TextField tf;

public EventosMouseDemo(String titulo) {


super(titulo);
tf = new TextField(60);
add(tf, BorderLayout.SOUTH);
setSize(300, 300);
this.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent mouseEvent) {
Figura 2.4 – Layout Memória após inicialização
eventoMouse1(mouseEvent);
}
//criando novo alias
Carro carro2 = carro1;
public void mouseEntered(MouseEvent mouseEvent) {
eventoMouse2(mouseEvent);
}

public void mouseExited(MouseEvent mouseEvent) {


eventoMouse3(mouseEvent);

public void mousePressed(MouseEvent mouseEvent) {


eventoMouse4(mouseEvent);
}

public void mouseReleased(MouseEvent mouseEvent) {


eventoMouse5(mouseEvent);
}
}); Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

this.addMouseMotionListener(new MouseMotionListener() {
public void mouseDragged(MouseEvent mouseEvent) {
2.3 Membros de Instância eventoMouse6(mouseEvent);
Cada objeto criado
} deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
public
objeto. Isto é importante, pois denotavoid mouseMoved(MouseEvent
que um método pertence a cada mouseEvent)
objeto da {
eventoMouse7(mouseEvent); o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
} Dois objetos distintos têm
é compartilhada por todas
}); as instâncias da classe. o mesmo estado se suas
2.3.1 Invocação dethis.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Métodos variáveis membro têm os
setVisible(true);
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
}
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada
public voidque foi definida no objeto. Em Java,
eventoMouse1(MouseEvent me) isto
{ é feito pela
chamada de um método em um objeto usando
tf.setText("Cliquei operador binário "." (ponto),
no oMouse.");
}
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, opublic
método void
a ser invocado e os argumentos para me)
eventoMouse2(MouseEvent o método
{ (se houver).
O método invocado tf.setText("Cursor
no recebedor pode também enviar informações
posicionado no componente."); de volta ao
objeto chamador
} através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.
Seja um Profissional Aprendendo com Profissionais 141
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
155
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

public void eventoMouse3(MouseEvent me) {


//atribuindo valor a variávelsaiu
tf.setText("Mouse referência
do componente.");
Carro }carro1 = new Carro();
carro1.ano = "2001";
carro1.modelo= "fusca";
public void eventoMouse4(MouseEvent me) {
carro1.cor tf.setText("Mouse
= "prata"; foi pressionado.");
}

public void eventoMouse5(MouseEvent me) {


tf.setText("Botão do Mouse liberado.");
}

public void eventoMouse6(MouseEvent me) {


tf.setText("Mouse arrastado até " + me.getX() + "," + me.getY());
}

public void eventoMouse7(MouseEvent me) {


tf.setText("Mouse moveu para posição(x,y) =" +
me.getX() + "," + me.getY());
} Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro public
carro2static void main(String args[]) {
= carro1;
new EventosMouseDemo("Demo Eventos de Mouse");
}
}
Listagem 11.12 – Classes adaptadoras de Eventos

Nem sempre você precisará implementar todos os métodos de uma interface, como no exemplo anterior
onde implementamos MouseListener e MouseMotionListener. É muito trabalhoso, freqüentemente
necessitaremos implementar somente alguns métodos da interface. Felizmente, os engenheiros do Java fizeram a
bondade de adicionar as classes adaptadores. Estas classes implementam todos os métodos das interfaces
XXXListener que possuem mais de um método. As implementações dos métodos são vazias, ou seja, não fazem
nada, simplesmente funcionam como um gabarito para sobrescrevermos os métodos que queremos utilizar. Veja
como utilizar com o exemplo abaixo, onde usamos a interface a classe Adaptadora WindowAdapter.

import java.awt.event.WindowAdapter;
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
2.3 Membros de Instância
import javax.swing.JLabel;
Cada objeto criado deverá ter sua própria instância de variáveis
public class FechaJanela extends JFrame { Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota
private JLabel que um método pertence a cada objeto da
label; o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
FechaJanela(String Dois objetos distintos têm
é compartilhada public
por todas as instâncias da classe.titulo) {
super(titulo); o mesmo estado se suas
this.setSize(300, 300); variáveis membro têm os
2.3.1 Invocação de Métodos
label = new JLabel("Feche a Janela");
Objetos se comunicam pela trocajava.awt.BorderLayout.CENTER);
this.add(label, de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
this.addWindowListener(new WindowAdapter() {
operação apropriada que foipublic
definidavoid
no objeto. Em Java, isto é feito pela
windowClosing(WindowEvent e) {
chamada de um método em um objeto usando
fechado(); o operador binário "." (ponto),
devendo especificar a mensagem} completa: o objeto que é o recebedor da
mensagem, o método a}); ser invocado e os argumentos para o método (se houver).
O método invocado nothis.setVisible(true);
recebedor pode também enviar informações de volta ao
}
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 142
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
156
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

public void fechado() {


System.exit(0);
//atribuindo
} valor a variável referência
Carro carro1 = new Carro();
carro1.ano = "2001";
public static void main(String args[]) {
carro1.modelo=
new "fusca";
FechaJanela("Exemplo Fecha Janela");
carro1.cor
} = "prata";
}
Listagem 11.13 – Eventos de Janela

Usando a classe WindowAdapter você pôde sobrescrever somente o método windowClosing() um dos
sete métodos grafados na interface WindowListener.

11.7Fazer Laboratório 11
Siga instruções do laboratório e tome cuidado com o tempo de execução, sempre recorra ao instrutor em
caso de dúvida, nunca deixe uma dúvida sem reposta

11.8Exercício Figura 2.4 – Layout Memória após inicialização


Escreva, compile
//criando novo e execute
alias todas listagens de código apresentadas neste capítulo.
Carro carro2 = carro1;

12 Internacionalização do código
Em java a partir da versão 5.0 é possível fazer de forma adequada a Internacionalização
internacionalização do código de uma aplicação desktop, com Swing utilizando
significa você ter umna
recurso de formatação de Data e Números, principalmente monetário.
A internacionalização significa sua aplicação rodar em mais de um idioma, aplicação com a
criando de forma parametrizada os dados de labels a serem mostrados em possibilidade de mudar
arquivos .properties. o seu idioma baseado
A formatação baseia-se na Localização do idioma informada, seja pelo no SO ou através de
Sistema Operacional (SO) ou informado através de parametro pelo usuário. A seleção do usuário,
classe java.util.Locale que é responsável por determinar o idioma a ser utilizado conhecido também
para internacionalização. Locale você define a região conforme exemplo: como i18n.
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
Locale local = new Locale(“pt”, “BR”); //Brasil

O primeiro parâmetro define o idioma e o segundo o país, conforme ISO-


2.3 isso
CODE, Membros
porque de Instância
existe país que fala dois idiomas, possibilitando então ser
totalmenteCada objeto criado deverá ter sua própria instância de variáveis
configurável. Os valores das variáveis
Para
(atributos) recuperar
definidas pelaa classe.
localização do SO, definem
Os métodos ou seja, odacomportamento
JVM deve ser de
feito
umem um objeto constituem
conforme
objeto. exemplo
Isto abaixo: pois denota que um método pertence a cada objeto da
é importante, o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Locale porlocal Dois objetos distintos têm
é compartilhada todas=asLocale.getDefault();
instâncias da classe.
o mesmo estado se suas
12.1
2.3.1 Formatação
Invocação de Métodos variáveis membro têm os
Existe a classe
Objetos DateFormatpela
se comunicam e NumberFormat para trabalhar
troca de mensagens, com formatação
isto significa mesmos
que um baseado no valores.
Locale informado,
utilizadas
objeto parater
pode formatar datas e números
que mostrar respectivamente.
um comportamento Para criação
particular de objeto
invocando umadessas classes não se utiliza o
operador new e sim o método estático de getInstance() conforme abaixo:
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
DateFormat dataFormatador = DateFormat.getInstance();
devendoNumberFormat
especificar a mensagem completa: =o NumberFormat.getInstance();
numeroFormatador objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método Parainvocado
o exemplonoacima
recebedor pode
o Locale também
utilizado é o enviar
padrão,informações de volta
ou seja, da JVM. Para ao
determinar um Locale específico
objeto chamador através de um valor de retorno.
você deve passar o Locale como parametro conforma abaixo:O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 143
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
157
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

Locale ptBR = new Locale("pt", "BR");


//atribuindo valor a variável referência
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, ptBR);
Carro carro1 = new Carro();
NumberFormat numberFormat = NumberFormat.getNumberInstance(ptBR);
carro1.ano = "2001";
carro1.modelo= "fusca";
Com o objeto de formatação
carro1.cor = "prata";criado para um Locale determinado o processo de formatação é simples, basta
utilizar o método format() do objeto passando como parâmetro o objeto que deseja formatar.

dateFormat.format(new Date());
numberFormat.format(13.23);

com as respectivas saídas:

Sexta-feira, 21 de Setembro de 2007


13,23

Você pode utilizar o objeto de formatação para converter textos em Objetos com o método parse(), veja
abaixo: Figura 2.4 – Layout Memória após inicialização

//criando novo alias


dateFormat.parse("Sexta-feira, 21 de Setembro de 2007");
Carro carro2 = carro1;
numberFormat.parse("13,23");

12.2ResourceBoundle
A classe ResourceBoundle é a responsável por acessar o arquivo .properties de internacionalização
baseado no Locale definido. Existe um padrão para nomear os arquivos de internacionalização, deve ser composto
por messages_“iso-code-language”_“iso-code-country”.properties conforme exemplo abaixo para o Brasil.

messages_pt_BR.properties

O arquivo .properties e composto por uma lista de registros com chave e valor, onde a chave será a mesma
para todos os arquivos de todos idiomas e o valor que será diferente para cada um.

messages_pt_BR.properties
welcome=Bem vindo!
messages_en_US.properties
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
welcome=Hello!

Para carregar o arquivo do respectivo Locale definido é necessário utilizar o método getBoundle() da classe
2.3 Membros de Instância
passando o nome inicial do arquivo e o Locale conforme abaixo:
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas
Locale ptBRpela classe.
= new Os métodos definem o comportamento de um
Locale("pt","BR"); em um objeto constituem
objeto. ResourceBundle
Isto é importante, pois denota
bundle que um método pertence a cada objeto da
= ResourceBundle.getBundle("messages", ptBR);o seu estado.
System.out.println(bundle.getString("welcome"));
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
A procura pelo arquivo .properties ocorre de três formas, primeiro ele procurao mesmo estado
pelo nome se suas
completo
definido não encontrar então procura com somente a definição do idioma variáveis
pelo locale,deseMétodos
2.3.1 Invocação e caso nãomembro
encontretêm
ele os
procura com somente o nome do arquivo.
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
messages_pt_BR.properties //pesquisa 1
operação apropriada que foi definida
messages_pt.properties no objeto.2 Em Java, isto é feito pela
//pesquisa
chamada de um método em um objeto
messages.properties //pesquisa usando 3 o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método
12.3Mensagens a ser invocado e os argumentos para o método (se houver).
Formatadas
O método
Da invocado no recebedor
mesma forma pode
que existe tambémque
as classes enviar informações
ajudam de volta
a formatação ao e número, existe a classe
de data
objeto chamador através de um valor de retorno.
MessageFormat que ajuda na formatação de mensagens. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 144
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
158
www.3way.com.br
Linguagem de de
Linguagem Programação JavaJava
Programação

O que é formatação de mensagens? Quando se trabalha com internacionalização e unificação de


mensagens repetidas em todo
//atribuindo valoro sistema, mas quereferência
a variável trechos da mensagem precisa ser dinâmico, então se utiliza dos
ResourceBoundle
arquivosCarro carro1 = para
newdefinir as mensagens e utiliza-se de MessageFormat para trocar campos chaves da
Carro();
mensagem por conteúdo dinâmico
carro1.ano = "2001"; conforme abaixo:
carro1.modelo= "fusca";
carro1.cor = "prata";
String mensagem = "Este é um curso de {0} com {1} horas da 3way.";
String mensagemFormatada = MessageFormat.format(mensagem, "Java", "40");
System.out.println(mensagemFormatada);

a saída será:

Este é um curso de Java com 40 horas da 3way.

12.4Fazer Laboratório 12
Siga instruções do laboratório e tome cuidado com o tempo de execução, sempre recorra ao instrutor em
caso de dúvida, nunca deixe uma dúvida sem reposta
Figura 2.4 – Layout Memória após inicialização

12.5Exercício
//criando novo alias
Carro
Escreva, compile =
carro2 carro1;
e execute todas listagens de código apresentadas neste capítulo.

13 Exportação de Aplicação
Para aplicações Java construídas para rodar localmente na máquina do usuário existe duas formas indicada
para exportar o projeto e enviar a aplicação para o usuário sem perder a portabilidade que java oferece.

13.1Jar executável
Exportar a aplicação para um arquivo JAR é uma tarefa simples utilizando IDEs de desenvolvimento, como
Eclipse, a própria IDE possui o recurso de exportar gerando o arquivo .jar.
Só exportar o projeto para um arquivo jar não é o mais indicado, porque o usuário terá que iniciar a
aplicação por prompt através do comando java e qual o nome a classe com os pacotes que possui o método main.
Este seria um trabalho tedioso para o usuário inicar a aplicação.
A solução é criar um jar executável, ou seja, com um duplo clique do usuário a aplicação já é iniciada e o
usuário não precisa digitar nenhum comando,
Figura 2.5 ou muito
– Layout Memória menosreferência
duas variáveis saber qual
para oamesmo
classeobjeto
que precisa ser chamada para
iniciar a aplicação.
Quando você for gerar o arquivo jar executável é necessário que informe qual a classe que deve ser
invocada quando o arquivo
2.3 Membros sofrer um duplo clique do usuário.
de Instância
Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
13.2Java Web
(atributos) Startpela
definidas (JWS)
classe. Os métodos definem o comportamento de um
JavaéWeb Start é semelhante aoque
exemplo anterior,pertence
do jar executável. A diferença
em um objeto constituem
objeto. Isto importante, pois denota um método a cada objeto da fundamental o seu
entre as duas
estado.
é a suaPorém
classe. distribuição, quando gerado
não devemos um isto
confundir jar executável você precisa enviar
com a implementação que.jar para o usuário e quando o
o arquivo
do método,
mesmo for alterado você precisará enviar novamente. Para aplicação JWS você envia para Dois
o objetos distintos
usuário um arquivotêm
é compartilhada por todas as instâncias da classe.
o mesmo estado
com extensão jnlp, este arquivo possui instruções de onde a JVM do usuário deve baixar os arquivos e qual a classe se suas
deve ser executada para iniciar a aplicação.
2.3.1 Invocação de Métodos variáveis membro têm os
Desta forma sempre que houver uma atualização da aplicação é necessário que atualizemesmos somente valores.
o servidor
Objetos se comunicam pela troca de mensagens, isto significa que um
que esta disponibilizando o arquivo JAR e quando o usuário executar a aplicação automaticamente ele identificará
objeto pode ter que mostrar um comportamento particular invocando uma
que foi atualizado o arquivo no servidor e baixará a nova versão, deixando a máquina do usuário sempre atualizada.
operação apropriada
O arquivo queserfoiexecutado
jar para definidavianoJava
objeto. Em precisa
Web Start Java, isto é feito pela
ser assinado digitalmente, isso é um modelo de
chamada de um método em um objeto usando o operador binário "." (ponto),
segurança implementado por Java. A assinatura digital é uma forma de identificar a origem do arquivo. A assinatura
devendo
pode ser criada por você em sua máquina e assinar os arquivos para que o usuário da
especificar a mensagem completa: o objeto que é o recebedor consiga executá-los.
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 145
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
159
www.3way.com.br
Linguagem de Programação
Linguagem JavaJava
de Programação

13.3Fazer Laboratório 13
Siga instruções dovalor
//atribuindo laboratório e tome cuidado
a variável com o tempo de execução, sempre recorra ao instrutor em
referência
caso de dúvida,
Carro nunca
carro1deixe
= uma
new dúvida sem reposta
Carro();
carro1.ano = "2001";
carro1.modelo=
13.4Exercício "fusca";
carro1.cor = "prata";
Escreva, compile e execute todas listagens de código apresentadas neste capítulo.

Figura 2.4 – Layout Memória após inicialização

//criando novo alias


Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância


Cada objeto criado deverá ter sua própria instância de variáveis Os valores das variáveis
(atributos) definidas pela classe. Os métodos definem o comportamento de um em um objeto constituem
objeto. Isto é importante, pois denota que um método pertence a cada objeto da o seu estado.
classe. Porém não devemos confundir isto com a implementação do método, que
Dois objetos distintos têm
é compartilhada por todas as instâncias da classe.
o mesmo estado se suas
2.3.1 Invocação de Métodos variáveis membro têm os
Objetos se comunicam pela troca de mensagens, isto significa que um mesmos valores.
objeto pode ter que mostrar um comportamento particular invocando uma
operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da
mensagem, o método a ser invocado e os argumentos para o método (se houver).
O método invocado no recebedor pode também enviar informações de volta ao
objeto chamador através de um valor de retorno. O método chamado deve ser
um que esteja definido pelo objeto.Seja um Profissional Aprendendo com Profissionais 146
www.3way.com.br
Todos os direitos reservados a 3Way Networks
Seja um Profissional Aprendendo com Profissionais 12
160
www.3way.com.br
Siga-nos também no Twitter!
twitter.com/3waynet

Você também pode gostar