Lgica de Programao
28 de novembro de 2015
Sumrio
ii
Prefcio
vii
ii
Introduo
1.1 O que um Computador? . . . . . . . . . . . . . . . .
1.2 Comunicao . . . . . . . . . . . . . . . . . . . . . . .
1.3 Formato Binrio . . . . . . . . . . . . . . . . . . . . . .
1.4 Unidades . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5 Arquiteturas de Processadores . . . . . . . . . . . . . .
1.6 O que um Programa? . . . . . . . . . . . . . . . . . .
1.7 Linguagem de Mquina . . . . . . . . . . . . . . . . .
1.8 Linguagem de Programao . . . . . . . . . . . . . . .
1.9 Compilador . . . . . . . . . . . . . . . . . . . . . . . . .
1.10 Sistemas Operacionais . . . . . . . . . . . . . . . . . .
1.11 Mquinas Virtuais . . . . . . . . . . . . . . . . . . . . .
1.12 Editores de Texto . . . . . . . . . . . . . . . . . . . . . .
1.13 Terminal . . . . . . . . . . . . . . . . . . . . . . . . . .
1.14 Hello World em Java . . . . . . . . . . . . . . . . . . . .
1.15 Arquivos .java . . . . . . . . . . . . . . . . . . . . . . .
1.16 Arquivos .class . . . . . . . . . . . . . . . . . . . . . . .
1.17 Separando os Arquivos .java e os .class . . . . . . . . .
1.18 Verso do Compilador e da Mquina Virtual . . . . .
1.19 O que o Mtodo Main? . . . . . . . . . . . . . . . . .
1.20 Classes Executveis . . . . . . . . . . . . . . . . . . . .
1.21 Variaes do Mtodo Main . . . . . . . . . . . . . . . .
1.22 Argumentos de Linha de Comando . . . . . . . . . . .
1.23 Exibindo Mensagens . . . . . . . . . . . . . . . . . . .
1.24 Comentrios . . . . . . . . . . . . . . . . . . . . . . . .
1.25 Indentao . . . . . . . . . . . . . . . . . . . . . . . . .
1.26 Engenharia Reversa . . . . . . . . . . . . . . . . . . . .
1.27 Ofuscadores . . . . . . . . . . . . . . . . . . . . . . . .
1.28 Erro: Compilar um arquivo inexistente . . . . . . . . .
1.29 Erro: Executar utilizando as extenses .class ou .java
1.30 Erro: No fechar os blocos . . . . . . . . . . . . . . . .
1.31 Erro: No fechar as aspas . . . . . . . . . . . . . . . . .
1.32 Erro: Trocar maisculas e minsculas . . . . . . . . .
1.33 Erro: Esquecer o ponto e vrgula . . . . . . . . . . . .
1.34 Erro: Esquecer o main . . . . . . . . . . . . . . . . . .
1.35 Erro: Utilizar sequncias de escape invlidas . . . . .
1.36 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
3
5
7
8
9
9
10
10
12
14
14
14
16
16
17
18
18
20
20
21
23
24
24
25
26
27
27
27
28
28
29
29
29
31
Variveis
2.1 O que uma Varivel? . . . . . . . . .
2.2 Declarando e Inicializando Variveis
2.3 Exibindo os Valores das Variveis . .
2.4 Copiando Valores . . . . . . . . . . .
2.5 Tipos Primitivos . . . . . . . . . . . .
2.6 Tipos Numricos No Primitivos . .
2.7 String . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
33
33
33
35
35
37
41
42
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
www.k19.com.br
iii
S UMRIO
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
3
Data e Hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Valores Literais . . . . . . . . . . . . . . . . . . . . . . . . . . .
O Modificador final . . . . . . . . . . . . . . . . . . . . . . . .
Nmeros Aleatrios . . . . . . . . . . . . . . . . . . . . . . . .
Convenes de Nomenclatura . . . . . . . . . . . . . . . . . .
Regras de Nomenclatura . . . . . . . . . . . . . . . . . . . . .
Palavras Reservadas . . . . . . . . . . . . . . . . . . . . . . . .
Erro: Variveis com nomes repetidos . . . . . . . . . . . . . .
Erro: Esquecer a inicializao de uma varivel local . . . . .
Erro: Trocar aspas simples por aspas duplas ou vice-versa .
Erro: Utilizar o separador decimal errado . . . . . . . . . . .
Erro: Valores incompatveis com os tipos das variveis . . .
Erro: Esquecer dos caracteres de tipagem para long ou float
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
42
43
50
50
51
53
54
55
55
56
57
57
57
58
Operadores
3.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Converses Entre Tipos Primitivos . . . . . . . . . . . . . .
3.3 Converses Entre Tipos Primitivos e No Primitivos . . . .
3.4 Converso Entre Tipos Primitivos e String . . . . . . . . . .
3.5 Converses Automticas . . . . . . . . . . . . . . . . . . . .
3.6 Operadores Aritmticos . . . . . . . . . . . . . . . . . . . .
3.7 Tipo do Resultado de uma Operao Aritmtica . . . . . .
3.8 Diviso Inteira . . . . . . . . . . . . . . . . . . . . . . . . . .
3.9 Overflow e Underflow . . . . . . . . . . . . . . . . . . . . . .
3.10 Regras para Operaes Aritmticas com Valores Especiais
3.11 Concatenao de Strings . . . . . . . . . . . . . . . . . . . .
3.12 Operadores Unrios + e - . . . . . . . . . . . . . . . . . . . .
3.13 Operadores de Atribuio . . . . . . . . . . . . . . . . . . .
3.14 Operadores de Comparao . . . . . . . . . . . . . . . . . .
3.15 Operadores Lgicos . . . . . . . . . . . . . . . . . . . . . . .
3.16 Operador Ternrio ?: . . . . . . . . . . . . . . . . . . . . . .
3.17 Operador de Negao . . . . . . . . . . . . . . . . . . . . . .
3.18 Incremento e Decremento . . . . . . . . . . . . . . . . . . .
3.19 Avaliando uma Expresso . . . . . . . . . . . . . . . . . . .
3.20 Operaes com Strings . . . . . . . . . . . . . . . . . . . . .
3.21 Operaes com Data e Hora . . . . . . . . . . . . . . . . . .
3.22 Erro: Utilizar operandos e operadores incompatveis . . .
3.23 Erro: Diviso inteira por zero . . . . . . . . . . . . . . . . .
3.24 Erro: Armazenamento de valores incompatveis . . . . . .
3.25 Erro: Castings no permitidos . . . . . . . . . . . . . . . . .
3.26 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
61
61
61
63
65
66
68
70
71
75
77
78
80
80
83
85
92
92
94
99
104
108
109
110
110
111
112
Controle de Fluxo
4.1 Introduo . . . . . . . . . . . . . .
4.2 Instrues de Deciso . . . . . . . .
4.3 Instruo if . . . . . . . . . . . . . .
4.4 Instruo else . . . . . . . . . . . .
4.5 Instrues de Deciso Encadeadas
4.6 Instrues de Repetio . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
115
115
115
115
118
122
124
www.facebook.com/k19treinamentos
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
iii
S UMRIO
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
4.15
4.16
4.17
4.18
4.19
4.20
4.21
4.22
4.23
4.24
4.25
4.26
5
iv
iv
Instruo while . . . . . . . . . . . . . . . . . . . . . . . . .
Instruo for . . . . . . . . . . . . . . . . . . . . . . . . . .
Instrues de Repetio Encadeadas . . . . . . . . . . . .
Instruo break . . . . . . . . . . . . . . . . . . . . . . . .
Instruo continue . . . . . . . . . . . . . . . . . . . . . .
Blocos Sem Chaves . . . . . . . . . . . . . . . . . . . . . .
Laos Infinitos . . . . . . . . . . . . . . . . . . . . . . . .
Instruo switch . . . . . . . . . . . . . . . . . . . . . . . .
Instruo do-while . . . . . . . . . . . . . . . . . . . . . .
Unreachable Code . . . . . . . . . . . . . . . . . . . . . . .
Erro: No utilizar condies booleanas . . . . . . . . . .
Erro: Else sem if . . . . . . . . . . . . . . . . . . . . . . . .
Erro: Else com condio . . . . . . . . . . . . . . . . . . .
Erro: Ponto e vrgula excedente . . . . . . . . . . . . . . .
Erro: Lao infinito . . . . . . . . . . . . . . . . . . . . . .
Erro: Chave do switch com tipos incompatveis . . . . .
Erro: Casos do switch com expresses no constantes . .
Erro: Break ou continue fora de um lao . . . . . . . . . .
Erro: Usar vrgula ao invs de ponto e vrgula no lao for
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
124
129
133
139
148
153
154
154
157
160
161
162
162
163
163
164
164
165
165
166
Array
5.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 O que um Array? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4 Declarao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5 Inicializao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6 Acessando o Contedo de um Array . . . . . . . . . . . . . . . . . . . . .
5.7 Alterando o Contedo de um Array . . . . . . . . . . . . . . . . . . . . . .
5.8 Outras Formas de Inicializao . . . . . . . . . . . . . . . . . . . . . . . .
5.9 Percorrendo um Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.10 Array Multidimensional . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.11 Erro: Utilizar valores incompatveis como ndices de um array . . . . . .
5.12 Erro: No definir a primeira dimenso de um array em sua inicializao
5.13 Erro: Acessar uma posio invlida de um array . . . . . . . . . . . . . .
5.14 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
169
169
169
170
171
172
173
173
175
175
177
183
184
184
184
.
.
.
.
.
.
.
.
.
.
.
.
187
187
187
188
190
194
197
199
201
201
202
203
204
Mtodos
6.1 Introduo . . . . . . . . . . . . .
6.2 Estrutura Geral de um Mtodo .
6.3 Parmetros . . . . . . . . . . . . .
6.4 Resposta . . . . . . . . . . . . . .
6.5 Passagem de Parmetros . . . . .
6.6 Sobrecarga . . . . . . . . . . . . .
6.7 Varargs . . . . . . . . . . . . . . .
6.8 Erro: Parmetros incompatveis .
6.9 Erro: Resposta incompatvel . . .
6.10 Erro: Esquecer a instruo return
6.11 Erro: No utilizar parnteses . . .
6.12 Resumo . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
www.k19.com.br
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
S UMRIO
String
7.1 Referncias . . . . . . . . . . . . . . . . . . . . . . .
7.2 Pool de Strings . . . . . . . . . . . . . . . . . . . . .
7.3 Diferena Entre o Operador == e o Mtodo equals
7.4 Imutabilidade . . . . . . . . . . . . . . . . . . . . .
7.5 StringBuilder . . . . . . . . . . . . . . . . . . . . . .
7.6 Formatao . . . . . . . . . . . . . . . . . . . . . . .
7.7 Formatao de Data e Hora . . . . . . . . . . . . .
7.8 Resumo . . . . . . . . . . . . . . . . . . . . . . . . .
www.facebook.com/k19treinamentos
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
205
205
206
207
208
208
209
216
217
S UMRIO
vi
vi
www.k19.com.br
Prefcio
O contedo deste livro uma introduo lgica de programao e linguagem Java. Apesar de
introdutrio, os tpicos deste livro so apresentados com bastante profundidade. Portanto, este material no adequado para quem procura apenas um conhecimento superficial sobre programao.
O leitor no precisa ter experincia com programao. Mas, necessrio estar acostumado a
utilizar computadores no seu dia a dia e ter conhecimento sobre os tpicos bsicos de matemtica
abordados no ensino fundamental.
Organizao
No Captulo 1, sero apresentados os principais elementos de um computador e alguns conceitos
bsicos como linguagem de mquina, linguagem de programao, compilador, sistema operacional
e mquina virtual. Alm disso, o leitor ter o primeiro contato com um programa escrito em linguagem Java.
No Captulo 2, o conceito de varivel ser apresentado. Veremos o processo de criao de variveis utilizando a linguagem Java. Alm disso, mostraremos os tipos primitivos dessa linguagem e
tambm o tipo String.
No Captulo 3, veremos como as variveis podem ser manipuladas atravs dos operadores da
linguagem Java. Sero apresentadas as operaes de converso, as aritmticas, as de atribuio, as
de comparao e as lgicas. Alm disso, mostraremos o funcionamento do operador de negao e
do operador ternrio.
No Captulo 4, sero apresentadas as instrues de deciso e de repetio da linguagem Java.
Veremos como o fluxo de execuo de um programa pode ser controlado com as instrues if, else,
while, for, switch, do, break e continue.
No Captulo 5, ser apresentado o conceito de array. Mostraremos como criar e manipular arrays
unidimensionais e multidimensionais. Alm disso, discutiremos os principais erros relacionados aos
arrays.
No Captulo 6, mostraremos como reutilizar cdigo atravs da criao de mtodos. Veremos
como definir e utilizar os parmetros e o retorno de um mtodo. Alm disso, apresentaremos o conceito de sobrecarga e varargs.
No Captulo 7, caractersticas especficas dos objetos do tipo String sero discutidas. Dentre elas,
falaremos sobre imutabilidade, pool de strings e string builder. Alm disso, mostraremos os recursos
da plataforma Java para formatao de strings.
Sees
As sees so classificadas de acordo com o nvel de dificuldade. Sees que tratam de assuntos
considerados bsicos, so marcadas com a figura . A imagem
est associada s sees que
www.facebook.com/k19treinamentos
vii
S UMRIO
viii
abordam
Simulaes
Para facilitar o entendimento do leitor, diversas simulaes ilustradas foram adicionadas neste
livro. O objetivo das simulaes mostrar passo a passo a execuo de um programa. A imagem
abaixo apresenta a ilustrao de um passo de uma simulao.
rea de cdigo
1 class Variavel {
2
public static void main (String [] args) {
3
int a = 2;
4
int b = a;
5
System.out.println (a);
6
System.out.println (b);
7
}
8 }
a=2
b=2
Na rea de cdigo, apresentado o cdigo do programa cuja execuo est sendo simulada. Na
rea das variveis, possvel visualizar as variveis criadas at o momento e os seus valores atuais. A
linha ou instruo que est sendo executada no passo atual destacada na rea de cdigo. Na rea
das variveis, as variveis que foram alteradas no passo atual da simulao so apresentadas em uma
caixa de cor laranja e as que no foram alteradas em uma caixa de cor azul.
As mensagens exibidas pelos programas na sada padro so apresentadas na rea de sada. As
linhas exibidas no passo atual da simulao sero destacadas com um crculo laranja.
1 class Variavel {
2
public static void main (String [] args) {
3
int a = 2;
4
int b = a;
5
System.out.println (a);
6
System.out.println (b);
7
}
8 }
a=2
b=2
2
2
rea de sada
viii
www.k19.com.br
CAPTULO
I NTRODUO
HD
Atualmente, os computadores esto presentes no cotidiano da maioria das pessoas. Voc, provavelmente, j est acostumado a utilizar computadores no seu dia a dia. Mas, ser que voc conhece
o funcionamento bsico de um computador? A seguir, listaremos os principais elementos de um
computador e suas respectivas funes.
Memria RAM
ULA + UC
CPU
Registradores
HD (Disco Rgido): A principal funo dos HDs armazenar dados. Geralmente, os documentos
que os usurios salvam, por exemplo, arquivos de texto, planilhas eletrnicas, apresentaes,
imagens, udios e vdeos so guardados nos HDs. Normalmente, os dados e as operaes dos
programas que os usurios instalam nos computadores tambm so mantidos nos discos rgidos. O contedo armazenado nos HDs persistente, ou seja, no descartado quando os
computadores so desligados. Geralmente, os discos rgidos so capazes de armazenar uma
grande quantidade de dados. Contudo, as operaes de acesso e de armazenamento de dados
no considerada rpida.
www.facebook.com/k19treinamentos
I NTRODUO
Memria RAM: A principal funo da memria RAM armazenar dados. O acesso e o armazenamento de dados na memria RAM bem mais rpido do que nos HDs. Por isso, quando os
usurios executam um programa, os dados e operaes desse programa so copiados do HD
para a memria RAM. Analogamente, os documentos abertos pelos usurios tambm so copiados do HD para a memria RAM. Geralmente, a quantidade de dados que podemos armazenar na memria RAM bem menor do que a quantidade de dados que podemos armazenar
nos HDs. Quando os computadores so desligados, os dados guardados na memria RAM so
descartados.
CPU (Unidade Central de Processamento - Processador): Basicamente, a tarefa da CPU executar
operaes aritmticas e operaes lgicas. A UC (Unidade de Controle), a ULA (Unidade Lgica e Aritmtica) e os registradores so componentes bsicos da CPU. Normalmente, a UC
copia uma operao de um programa armazenado na memria RAM e guarda os dados dessa
operao nos registradores. Na sequncia, a ULA executa a operao acessando os dados armazenados nos registradores e guarda o resultado dessa operao tambm nos registradores.
Por fim, a UC copia o resultado armazenado nos registradores para a memria RAM.
1.2 Comunicao
Os computadores so capazes de se comunicar com dispositivos perifricos como teclado, mouse,
monitor, caixa de som, impressoras, projetores, entre outros. Eles tambm so capazes de se comunicar com outros computadores. Essa comunicao realizada atravs das diversas portas fsicas
que os computadores possuem. A seguir, listaremos algumas portas fsicas e as suas respectivas funes.
Ethernet: Utilizada para conectar um computador a uma rede local de computadores. Atravs dessa
porta, um computador pode enviar e receber dados de outros computadores.
Paralela: Essa porta foi criada para conectar um computador a uma impressora. Hoje, utilizada
tambm para conectar computadores a scanners, cmeras de vdeo, entre outros dispositivos.
www.k19.com.br
I NTRODUO
PS/2: Teclados e mouses antigos so conectados aos computadores atravs dessa porta.
USB: Atualmente, a porta mais utilizada. Diversos dispositivos so conectados aos computadores
atravs das portas USB. Por exemplo, teclados, mouses, impressoras, celulares, HDs externos,
entre outros.
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
Os textos que voc est acostumado a escrever ou ler so escritos com as letras do
Alfabeto Latino. As 26 letras bsicas do Alfabeto Latino so: A, B, C, D, E, F, G, H, I, J, K, L, M, N,
O, P, Q, R, S, T, U, V, W, X, Y e Z.
Em outras partes do mundo, outros alfabetos so utilizados. Por exemplo, na Grcia, as pessoas
utilizam o Alfabeto Grego. No Mundo rabe, o Alfabeto rabe. Na China, o Alfabeto Chins.
Por analogia, podemos dizer que os computadores utilizam o Alfabeto Binrio. Esse alfabeto
composto pelo caractere 0 e pelo caractere 1. Todos os dados manipulados por um computador
devem ser definidos em formato binrio, ou seja, com os caracteres 0 e 1.
Nmeros
As pessoas esto acostumadas a lidar com os nmeros em formato decimal. Os computadores,
por outro lado, trabalham com nmeros em formato binrio. Veja, a seguir, as representaes decimal e binria de alguns nmeros.
www.facebook.com/k19treinamentos
I NTRODUO
Decimal
0
1
2
3
4
5
6
7
8
9
Binrio
0
1
10
11
100
101
110
111
1000
1001
Decimal
10
11
12
13
14
15
16
17
18
19
Binrio
1010
1011
1100
1101
1110
1111
10000
10001
10010
10011
Decimal
20
21
22
23
24
25
26
27
28
29
Binrio
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
Caracteres
Nos computadores, os caracteres de um texto tambm devem ser definidos em formato binrio.
Para realizar essa transformao, primeiramente, cada caractere associado a um valor numrico
inteiro. Por exemplo, o caractere A e o caractere ? so normalmente associados aos valores 65 e
63, respectivamente. A representao binria de cada caractere corresponde representao binria
do valor numrico associado a esse caractere.
Os caracteres so mapeados para formato binrio atravs de padres como ASCII (http://pt.
wikipedia.org/wiki/ASCII) e Unicode (http://pt.wikipedia.org/wiki/Unicode). Veja, a seguir,
a representao binria de alguns caracteres de acordo com o padro ASCII.
Caractere
A
B
C
D
E
F
G
H
I
J
K
Decimal
65
66
67
68
69
70
71
72
73
74
75
Binrio
01000001
01000010
01000011
01000100
01000101
01000110
01000111
01001000
01001001
01001010
01001011
Caractere
L
M
N
O
P
Q
R
S
T
U
V
Decimal
76
77
78
79
80
81
82
83
84
85
86
Binrio
01001100
01001101
01001110
01001111
01010000
01010001
01010010
01010011
01010100
01010101
01010110
Normalmente, cada caractere corresponde a uma sequncia composta por oito ou dezesseis dgitos binrios. A quantidade de dgitos utilizados limita a quantidade de caracteres que podem ser
4
www.k19.com.br
I NTRODUO
representados. Por exemplo, com oito dgitos binrios, podemos representar no mximo 256 caracteres. Com dezesseis dgitos binrios, podemos representar at 65536 caracteres.
1.4 Unidades
Voc deve estar acostumado a medir distncias utilizando as unidades de comprimento do Sistema Internacional de Medidas (International System of Units SI) como milmetro, centmetro,
metro e quilmetro. Os americanos e os ingleses utilizam com maior frequncia as unidades de
medida do Imperial Unit como polegada, p, jarda e milha.
De forma anloga, importante ser capaz de medir a quantidade de dados que um computador
pode armazenar ou transmitir. Essa mensurao pode ser realizada com ajuda das unidades de medida. A unidade de medida bsica o bit. Cada 0 ou 1 que um computador armazena ou transmite
um bit. Por padro, um byte corresponde a 8 bits. O smbolo utilizado para representar o byte a
letra B.
A Comisso Eletrotcnica Internacional (International Electrotechnical Commission IEC) e o
Sistema Internacional de Medidas (International System of Units SI) definem unidades de medida
relacionadas ao byte. As unidades do padro IEC 80000-13 utilizam valores que so potncias de
1024. J as unidades baseadas no SI utilizam valores que so potncias de 1000. Veja a Tabela 1.3.
www.facebook.com/k19treinamentos
I NTRODUO
Nome
byte
kibibyte
mebibyte
gibibyte
tebibyte
pebibyte
exbibyte
zebibyte
yobibyte
IEC
Smbolo
B
KiB
MiB
GiB
TiB
PiB
EiB
ZiB
YiB
Bytes
10240
10241
10242
10243
10244
10245
10246
10247
10248
Nome
byte
kilobyte
megabyte
gigabyte
terabyte
petabyte
exabyte
zettabyte
yottabyte
SI
Smbolo
B
kB
MB
GB
TB
PB
EB
ZB
YB
Bytes
10000
10001
10002
10003
10004
10005
10006
10007
10008
Tabela 1.3: Unidades de medida segundo o padro IEC 80000-13 e o Sistema Internacional de Unidades
www.k19.com.br
I NTRODUO
750 GB possui capacidade igual a 698,63 GB. Os usurios que no sabem que esses sistemas operacionais adotam unidades de medida diferentes das adotadas pelos fabricantes de HD se sentem
enganados.
GRAVA REG-1
19
GRAVA REG-2
11
001001010011
001010001011
SOMA
EXIBE
REG-3
010001010011
011011000000
Figura 1.7: Instrues de processador
Nesse exemplo fictcio, os trs primeiros bits das instrues definem qual operao o processador deve executar. A operao GRAVA representada pelo cdigo 001, a operao SOMA
representada pelo cdigo 010 e a operao EXIBE representada pelo cdigo 011.
As operaes do tipo GRAVA servem para armazenar um valor em um registrador. Por isso,
necessrio indicar o valor e o nmero do registrador onde esse valor deve ser armazenado. Tanto o
valor quanto o nmero do registrador so definidos em formato binrio.
As operaes do tipo SOMA servem para somar os valores armazenados em dois registradores
e guardar o resultado em um terceiro registrador. Por isso, necessrio indicar o nmero de trs registradores. Os valores armazenados nos dois primeiros registradores so adicionados e o resultado
armazenado no terceiro registrador.
As operaes do tipo EXIBE servem para exibir na tela o valor armazenado em um registrador.
Por isso, necessrio indicar o nmero de um registrador. O valor armazenado nesse registrador
exibido na tela.
A primeira instruo indica ao processador que o valor 19 deve ser gravado no registrador 1. A
segunda instruo indica que o valor 11 deve ser armazenado no registrador 2. J a terceira instruo
determina a realizao da adio dos valores anteriormente armazenados nos registradores 1 e 2 alm
de indicar que o resultado deve ser armazenado no registrador 3. Por ltimo, a quarta instruo
determina ao processador que o valor do registrador 3 deve ser exibido na tela.
No h um padro universal para o formato das instrues que os processadores podem executar. Consequentemente, as mesmas operaes podem ser definidas de formas diferentes em dois
processadores distintos. Considere o exemplo fictcio a seguir com algumas instrues para dois
www.facebook.com/k19treinamentos
I NTRODUO
SOMA
Arquitetura X
REG-2
REG-1
0110001100100001
SOMA
Arquitetura Y
REG-3
010001010011
Figura 1.8: Instrues de processadores diferentes
As duas instrues mostradas na Figura 1.8 indicam aos processadores que o valor do registrador
1 deve ser adicionado ao valor do registrador 2 e o resultado deve ser armazenado no registrador 3.
Contudo, as sequncias binrias dessas instrues so diferentes porque os processadores so de
arquiteturas diferentes.
As instrues que um processador pode executar so definidas pela sua arquitetura. As arquiteturas de processadores mais utilizadas atualmente so x86, x86_64 e ARM.
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
Da mesma forma que pintores so capazes de produzir pinturas sofisticadas utilizando apenas tinta, pincel e quadro, programadores so capazes de criar programas sofisticados
a partir dos recursos bsicos oferecidos pelos computadores.
www.k19.com.br
I NTRODUO
class Xpto{
private int xpto;
private String lala;
public Xpto(int x,
String l){
this.xpto = xpto;
this.lala = lala;
}
double soma = 0;
for ( int i = 0; i < numeros . length ; i ++) {
soma += numeros [ i ];
}
System . out . println ( " A soma " + soma ) ;
Cdigo Java 1.1: Exemplo de cdigo em Java
www.facebook.com/k19treinamentos
I NTRODUO
10
Por enquanto, voc no precisa se preocupar em entender o que est escrito no cdigo acima.
Observe apenas que um programa escrito em linguagem de programao bem mais fcil de ser
compreendido do que um programa escrito em linguagem de mquina.
1.9 Compilador
Vimos que os computadores so capazes de processar o cdigo escrito em linguagem de mquina. Tambm vimos que invivel desenvolver um programa em linguagem de mquina. Por isso,
existem as linguagens de programao. Da surge uma pergunta: se os computadores entendem apenas comandos em linguagem de mquina, como eles podem executar cdigo escrito em linguagem
de programao?
Na verdade, os computadores no executam cdigo escrito em linguagem de programao. Esse
cdigo que denominado cdigo fonte deve ser traduzido para cdigo em linguagem de mquina.
Essa traduo realizada por programas especiais chamados compiladores.
while(true){
if(x < 1){
return 0;
}
return 1;
}
CDIGO FONTE
PROCESSADOR
COMPILADOR
CDIGO DE MQUINA
NO EXECUTA
while(true){
if(x < 1){
return 0;
}
return 1;
}
CDIGO FONTE
PROCESSADOR
EXECUTA
10
www.k19.com.br
11
I NTRODUO
Em sistemas operacionais como o Windows, geralmente, o usurio clica duas vezes em um cone
correspondente ao programa que ele deseja executar e o Windows se encarrega de copiar as instrues desse programa do disco rgido para a memria RAM. Dessa forma, o usurio no precisa
conhecer os comandos dos processadores para executar um programa.
Os sistemas operacionais controlam a execuo dos programas. Inclusive, eles permitem que vrios programas sejam executados simultaneamente. Alm disso, oferecem diversas funcionalidades
aos usurios, como controlar o volume das caixas de som, o brilho do monitor, o acesso internet
entre outros.
Os sistemas operacionais tambm oferecem diversos servios aos prprios programas. Por exemplo, as impressoras configuradas pelos usurios so gerenciadas pelos sistemas operacionais. Qualquer programa que deseja interagir com uma impressora pode utilizar os recursos oferecidos pelos
sistemas operacionais para esse propsito. Sendo assim, os sistemas operacionais funcionam como
intermedirios entre os programas e os computadores.
www.facebook.com/k19treinamentos
11
I NTRODUO
12
PLATAFORMA 1
EXECUTA
PROGRAMA 2
PLATAFORMA 2
EXECUTA
PROGRAMA 2
PLATAFORMA 3
NO EXECUTA
Figura 1.14: Ilustrao mostrando que cada plataforma necessita de um executvel especfico
12
www.k19.com.br
13
I NTRODUO
PROGRAMA
MQUINA VIRTUAL 1
PLATAFORMA 1
EXECUTA
MQUINA VIRTUAL 2
PLATAFORMA 2
EXECUTA
MQUINA VIRTUAL 3
PLATAFORMA 3
EXECUTA
Na analogia da Figura 1.15, o programa seria o plugue, as mquinas virtuais seriam os adaptadores e as plataformas seriam as tomadas. Como as tomadas seguem padres diferentes, so necessrios adaptadores para encaixar o mesmo plugue em todas as tomadas. Analogamente, como as
plataformas seguem padres diferentes, so necessrias mquinas virtuais para executar o mesmo
programa em todas as plataformas.
Para cada plataforma, uma mquina virtual especfica necessria. Todas as mquinas virtuais
devem saber ler as instrues do programa que desejamos executar para depois traduzi-las para a
linguagem de mquina da plataforma correspondente. Dessa forma, as mquinas virtuais atuam
como tradutores.
Assim como qualquer coisa, algum precisa desenvolver as mquinas virtuais. Qualquer pessoa
pode desenvolver uma mquina virtual. Contudo, essa uma tarefa que exige conhecimento tcnico
muito avanado. Por isso, normalmente, os programadores que desenvolvem os programas no desenvolvem as mquinas virtuais. Geralmente, as mquinas virtuais so desenvolvidas por grandes
empresas ou so projetos de cdigo aberto que envolvem programadores experientes do mundo inteiro.
As mquinas virtuais podem ser gratuitas ou pagas. Os maiores exemplos de mquinas virtuais so a Oracle JVM (Java Virtual Machine), a OpenJDK JVM, a Microsoft CLR (Common Language
Runtime) e a Mono CLR.
A nossa explicao sobre mquinas virtuais pode dar a entender que elas funcionam apenas
como meros tradutores ou adaptadores. Contudo, importante destacar que as mquinas virtuais oferecem diversos outros recursos como gerenciamento de memria e otimizao em tempo de
execuo.
www.facebook.com/k19treinamentos
13
I NTRODUO
14
1.13 Terminal
A maior parte dos usurios dos computadores no possui conhecimento sobre programao. Esses usurios interagem com os computadores atravs das interfaces visuais oferecidas pelos sistemas
operacionais. Geralmente, essas interfaces visuais no exigem conhecimentos tcnicos.
Os sistemas operacionais oferecem tambm interfaces baseadas em texto. Essas interfaces no
so muito agradveis para a maior parte dos usurios. Porm, geralmente, elas so mais prticas
para os programadores.
No Windows, o programa Command Prompt e o programa Windows Power Shell permitem que
os usurios controlem o computador atravs de uma interface baseada em texto. Nos sistemas operacionais da famlia Unix, h diversos programas que oferecem esse tipo de interface. Geralmente,
esses programas so chamados de Terminal.
Importante
Antes de compilar e executar um programa escrito em Java, necessrio que voc tenha
instalado e configurado em seu computador o JDK (Java Development Kit ). Consulte o artigo
da K19 sobre como instal-lo e configur-lo:
http://www.k19.com.br/artigos/instalando-o-jdk-java-development-kit/.
O primeiro passo escrever o cdigo fonte do programa. Qualquer editor de texto pode ser utilizado. No exemplo abaixo, o cdigo fonte foi armazenado no arquivo HelloWorld.java. O nome do
arquivo no precisa ser HelloWorld mas a extenso deve ser obrigatoriamente .java. Considere que o
arquivo HelloWorld.java foi salvo na pasta introducao.
1 class HelloWorld {
2
public static void main ( String [] args ) {
3
System . out . println ( " Hello World " ) ;
4
}
5 }
Cdigo Java 1.2: HelloWorld.java
14
www.k19.com.br
15
I NTRODUO
O comando cd altera o diretrio atual do terminal. No exemplo acima, esse comando foi utilizado
para alterar o diretrio atual do terminal para introducao.
O comando javac aciona o compilador da linguagem Java. No exemplo acima, esse comando foi
utilizado para compilar o arquivo HelloWorld.java. O compilador traduz o cdigo fonte do arquivo
HelloWorld.java e armazena o cdigo compilado em um novo arquivo chamado HelloWorld.class. O
nome do arquivo .class gerado pelo compilador igual ao nome da classe contida no arquivo HelloWorld.java.
Para conferir se o arquivo HelloWorld.class foi criado, podemos utilizar o comando ls nos terminais dos sistemas operacionais da famlia Unix ou o comando dir no Command Prompt do Windows.
Esses comandos listam o contedo da pasta atual do terminal.
K19 / introducao$ ls
HelloWorld . class
HelloWorld . java
06:41
<DIR >
.
06:41
<DIR >
..
06:52
425 HelloWorld . class
06:52
106 HelloWorld . java
2 File ( s )
531 bytes
2 Dir ( s ) 57 ,925 ,980 ,160 bytes disponveis
www.facebook.com/k19treinamentos
15
I NTRODUO
16
Para executar a classe HelloWorld que est no arquivo HelloWorld.class, a extenso .class no deve
ser utilizada.
Mais Sobre
A maioria das linguagens de programao so case sensitive. Isso significa que elas
diferenciam as letras maisculas das minsculas. Portanto, ao escrever o cdigo de um programa, devemos tomar cuidado para no trocar uma letra maiscula por uma letra minscula
ou vice-versa.
A extenso est incorreta pois utiliza letra maiscula. Na tentativa de compilar esse arquivo, um
erro ser gerado.
K19 / introducao$ javac Programa . Java
error : Class names , Programa . Java , are only accepted if annotation processing is explicitly requested
www.k19.com.br
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
I NTRODUO
class Cosen {
public static void main ( String [] args ) {
System . out . println ( " Cosen " ) ;
}
}
class Lobato {
public static void main ( String [] args ) {
System . out . println ( " Lobato " ) ;
}
}
class Jonas {
public static void main ( String [] args ) {
System . out . println ( " Jonas " ) ;
}
}
Cdigo Java 1.4: Programa.java
C :\ Users \ K19\introducao>
C :\ Users \ K19\introducao>
Cosen
C :\ Users \ K19\introducao>
Lobato
C :\ Users \ K19\introducao>
Jonas
www.facebook.com/k19treinamentos
17
I NTRODUO
18
03:13 PM
<DIR >
.
03:13 PM
<DIR >
..
03:07 PM
404 Cosen . class
03:07 PM
404 Jonas . class
03:07 PM
405 Lobato . class
3 File ( s )
1 ,213 bytes
2 Dir ( s ) 57 ,925 ,980 ,160 bytes disponveis
da compilao.
Tambm podemos verificar a verso da mquina virtual atravs da opo -version do comando
java.
K19 / introducao$ java - version
java version "1.8.0"
Java ( TM ) SE Runtime Environment ( build 1.8.0 - b132 )
Java HotSpot ( TM ) 64 - Bit Server VM ( build 25.0 - b70 , mixed mode )
O mtodo main o comeo do programa. Podemos dizer que o ponto de partida de um programa em Java a primeira instruo do mtodo main. As demais instrues so executadas na
18
www.k19.com.br
19
I NTRODUO
mesma ordem na qual esto definidas no cdigo. Eventualmente, durante a execuo das instrues, algum erro pode ocorrer e interromper o fluxo do processamento.
De acordo com a especificao da linguagem Java, o mtodo main deve receber um array de strings
como parmetro, ter o tipo de retorno void e ser definido com os modificadores public e static. Somente classes que possuem o mtodo main de acordo com essas regras podem ser executadas.
Lembre-se
O funcionamento dos arrays ser abordado no Captulo 5. Os conceitos de mtodo, parmetro e tipo de retorno sero apresentados no Captulo 6.
Lembre-se
Neste livro, no sero abordados o conceito de classe e os modificadores public e static.
Simulao
Veremos, a seguir, uma simulao de execuo de um programa em Java.
1 class ExibeMensagens {
2
public static void main ( String [] args ) {
3
System . out . println ( " A " ) ;
4
System . out . println ( " B " ) ;
5
System . out . println ( " C " ) ;
6
}
7 }
A
1 class ExibeMensagens {
2
public static void main ( String [] args ) {
3
System . out . println ( " A " ) ;
4
System . out . println ( " B " ) ;
5
System . out . println ( " C " ) ;
6
}
7 }
A
B
www.facebook.com/k19treinamentos
19
I NTRODUO
20
1 class ExibeMensagens {
2
public static void main ( String [] args ) {
3
System . out . println ( " A " ) ;
4
System . out . println ( " B " ) ;
5
System . out . println ( " C " ) ;
6
}
7 }
A
B
C
Terminal 1.18: Tentando executar uma classe que no possui o mtodo main
Algumas variaes da forma tradicional do mtodo main so aceitas. Por exemplo, a posio dos
modificadores public e static pode ser invertida.
1 static public void main ( String [] args )
Cdigo Java 1.11: Invertendo os modificadores public e static
20
www.k19.com.br
21
I NTRODUO
O parmetro pode ser definido com varargs, representado pelas reticncias no cdigo abaixo.
1 public static void main ( String ... args )
Cdigo Java 1.14: Utilizando varargs
Lembre-se
No Captulo 6, mostraremos com mais detalhes a definio de parmetros com varargs.
Agora, no prximo exemplo, a classe Programa foi executada com trs argumentos de linha de
comando: K19, Livros e Java.
K19 / introducao$ java Programa K19 Livros Java
Terminal 1.20: Executando a classe Programa com trs argumentos de linha de comando
A cada execuo da classe Programa, argumentos diferentes podem ser passados na linha de comando. Esses argumentos podem ser recuperados dentro do mtodo main. No exemplo abaixo, criamos um programa que exibe na sada padro o primeiro, o segundo e o terceiro argumento da linha
de comando. O primeiro argumento acessado atravs da varivel args[0]. O segundo argumento
acessado atravs da varivel args[1]. O terceiro argumento acessado atravs da varivel args[2].
1 class Programa {
2
public static void main ( String [] args ) {
3
System . out . println ( args [0]) ;
4
System . out . println ( args [1]) ;
5
System . out . println ( args [2]) ;
6
}
7 }
Cdigo Java 1.15: Recuperando os argumentos de linha de comando
A seguir exibida a sada do programa ao executar a classe Programa com trs argumentos de linha
de comando.
www.facebook.com/k19treinamentos
21
I NTRODUO
22
Terminal 1.21: Executando a classe Programa com trs argumentos de linha de comando
Mais Sobre
O funcionamento dos arrays ser abordado no Captulo 5.
Voc no pode esquecer que, ao executar uma classe, os argumentos de linha de comando so
separados por espao e o primeiro parmetro vem imediatamente direita do nome da classe. O
ndice do primeiro argumento 0, do segundo 1, do terceiro 2 e assim sucessivamente.
K19 / introducao$ java Programa arg0 arg1 arg2
Para definir um argumento de linha de comando que contm um ou mais espaos, o caractere
aspas dupla deve ser utilizado para delimitar esse argumento.
K19 / introducao$ java Programa " Rafael Cosentino " " Rafael Lobato " " Marcelo Martins "
Simulao
Veremos, a seguir, uma simulao de execuo de um programa em Java que exibe os trs primeiros argumentos da linha de comando na sada padro.
1
Suponha que a classe Argumentos tenha sido executada com os argumentos K19, Java e Lgica, como no exemplo abaixo.
java Argumentos K19 Java Lgica
Como sabemos, o fluxo de execuo do programa inicia na primeira linha do mtodo main. Ou
seja, ele comea na linha 3 do cdigo abaixo. A instruo presente nessa linha exibe o primeiro
argumento da linha de comando, isto , exibe K19 na sada padro.
1 class Argumentos {
2
public static void main ( String [] args ) {
3
System . out . println ( args [0]) ;
4
System . out . println ( args [1]) ;
5
System . out . println ( args [2]) ;
6
}
7 }
K19
22
www.k19.com.br
23
I NTRODUO
1 class Argumentos {
2
public static void main ( String [] args ) {
3
System . out . println ( args [0]) ;
4
System . out . println ( args [1]) ;
5
System . out . println ( args [2]) ;
6
}
7 }
K19
Java
1 class Argumentos {
2
public static void main ( String [] args ) {
3
System . out . println ( args [0]) ;
4
System . out . println ( args [1]) ;
5
System . out . println ( args [2]) ;
6
}
7 }
K19
Java
Lgica
Para adicionar quebras de linha ou tabulaes nas mensagens, necessrio utilizar as chamadas sequncias de escape. Uma quebra de linha definida com a sequncia de escape \n. Uma
tabulao, com \t.
Na Tabela 1.5, as sequncias de escape da linguagem Java so apresentadas.
Sequncia de escape
\t
\b
\n
\r
\f
\
\"
\\
Descrio
Adiciona uma tabulao (tab)
Volta para o caractere anterior (backspace)
Adiciona uma quebra de linha (newline)
Volta para o incio da linha (carriage return)
Adiciona uma quebra de pgina (formfeed)
Adiciona o caractere aspas simples
Adiciona o caractere aspas dupla
Adiciona uma barra invertida
Tabela 1.5: Sequncias de escape
www.facebook.com/k19treinamentos
23
I NTRODUO
1
2
3
4
5
24
Rafael
Linha1
Linha2
Digite sim
Jonas disse : " Ol "
C :\ K19 \ Livros
O mtodo println adiciona uma quebra de linha no final da mensagem exibida. Para exibir mensagens sem quebra de linha, podemos utilizar o mtodo print.
1 System . out . print ( " MENSAGEM SEM QUEBRA DE LINHA " ) ;
1.24 Comentrios
Podemos acrescentar comentrios em qualquer ponto do cdigo fonte. Geralmente, os comentrios funcionam como anotaes que o programador adiciona no cdigo fonte para explicar a lgica
do programa. Eles so teis tanto para o prprio programador que os escreveu quanto para outros
programadores que, eventualmente, precisam ler e/ou alterar o cdigo fonte.
Os compiladores ignoram os comentrios inseridos no cdigo fonte. Portanto, no cdigo de mquina gerado pela compilao do cdigo fonte, os comentrios no so inseridos.
Em Java, para comentar uma linha, podemos utilizar a marcao //.
1 System . out . println ( " K19 " ) ;
2 // comentrio de linha
3 System . out . println ( " Rafael Cosentino " ) ;
Cdigo Java 1.22: Comentrio de linha
1.25 Indentao
A organizao do cdigo fonte fundamental para o entendimento da lgica de um programa.
Cada linguagem de programao possui os seus prprios padres de organizao. Observe a organizao padro do cdigo fonte escrito com a linguagem de programao Java.
24
www.k19.com.br
25
I NTRODUO
1 class Programa {
2
public static void main ( String [] args ) {
3
System . out . println ( " K19 " ) ;
4
System . out . println ( " Lgica de Programao em Java " ) ;
5
}
6 }
Cdigo Java 1.24: Programa.java
Para visualizar facilmente a organizao dos blocos (trechos delimitados por chaves), o cdigo
fonte deve ser indentado. A indentao consiste em deixar uma certa quantidade de espaos em
branco ou tabulaes no comeo de cada linha.
No exemplo acima, a linha 1 no est dentro de nenhum bloco. Por isso, nenhum espao em
branco foi deixado no comeo dessa linha. A linha 2 est dentro do bloco da classe Programa. Por
isso, uma tabulao foi adicionada no comeo dessa linha. As linhas 3 e 4 esto dentro do bloco do
mtodo main que, por sua vez, est dentro do bloco da classe Programa. Por isso, duas tabulaes foram
adicionadas no comeo dessa linha. A linha 5 est dentro do bloco da classe Programa. Por isso, uma
tabulao foi adicionada no comeo dessa linha. A linha 6 no est dentro de nenhum bloco. Por
isso, nenhum espao em branco foi deixado no comeo dessa linha.
Um cdigo corretamente indentado mais fcil de ler. Consequentemente, a sua manuteno se
torna mais simples.
Mais Sobre
Voc pode verificar a conveno de indentao da linguagem Java definida pela Oracle
no seguinte endereo:
http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-136091.html
www.facebook.com/k19treinamentos
25
I NTRODUO
26
1.27 Ofuscadores
Para dificultar o processo de engenharia reversa, podemos utilizar ferramentas que modificam o
cdigo fonte ou o cdigo compilado com o intuito de prejudicar o processo de decompilao. Essas
ferramentas so chamadas de ofuscadores.
Na maior parte dos casos, a utilizao de ofuscadores torna invivel ou muito custosa a aplicao
de engenharia reversa com intuito de copiar ou piratear um software.
26
www.k19.com.br
27
I NTRODUO
1 class Programa {
2
public static void main ( String [] args ) {
3
// instrues
Cdigo Java 1.26: Programa.java
Veja a mensagem que o compilador do Java exibe quando um bloco no fechado corretamente.
www.facebook.com/k19treinamentos
27
I NTRODUO
28
Veja a mensagem que o compilador do Java exibe quando as aspas no so fechadas corretamente.
Programa . java :3: error : unclosed string literal
System . out . println (" K19 );
^
Programa . java :3: error : ; expected
System . out . println (" K19 );
^
Programa . java :5: error : reached end of file while parsing
}
^
3 errors
28
www.k19.com.br
29
I NTRODUO
Observe que no cdigo Java acima, o mtodo main foi definido com letra maiscula. Contudo, no
Java, o correto com minscula. Ao compilar o cdigo, nenhum erro ocorre. Mas, ao executar, o
seguinte erro exibido.
K19 /k19$ javac HelloWorld . java
K19 /k19$ java HelloWorld
Error : Main method not found in class HelloWorld , please define the main method as :
public static void main ( String [] args )
www.facebook.com/k19treinamentos
29
I NTRODUO
30
3
System . out . println ( " Hello \ xWorld " ) ;
4
}
5 }
Cdigo Java 1.31: HelloWorld.java
30
www.k19.com.br
31
I NTRODUO
1.36 Resumo
1
10
Algumas unidades de medida para dados binrios do padro IEC 80000-13 so: bit, byte (B),
kibibyte (KiB), mebibyte (MiB), gibibyte (GiB) e tebibyte (TiB).
11
Algumas unidades de medida para dados binrios do SI so: bit, byte (B), kilobyte (kB), megabyte (MB), gigabyte (GB) e terabyte (TB).
12
13
14
www.facebook.com/k19treinamentos
31
I NTRODUO
15
32
16
17
18
19
20
21
Todo programa necessita de um ponto de partida. O ponto de partida dos programas escritos
em Java a primeira instruo do mtodo main.
22
23
24
25
26
Cdigo escrito em linguagem Java deve ser armazenado em arquivos com a extenso .java.
27
Para que uma classe em Java seja executvel, ela deve possuir o mtodo main.
28
Em Java, o mtodo println utilizado para exibir mensagens com quebra de linha na sada
padro.
29
Em Java, o mtodo print utilizado para exibir mensagens sem quebra de linha na sada pa-
dro.
32
www.k19.com.br
CAPTULO
VARIVEIS
numeroDaConta = 4823
MEMRIA RAM
4823
numeroDaConta
MEMRIA RAM
A Figura 2.1 ilustra o processo de armazenamento do valor 4823 na varivel numeroDaConta. Essa
varivel est associada terceira posio da memria RAM. Lembre-se que esse valor armazenado
em formato binrio.
www.facebook.com/k19treinamentos
33
VARIVEIS
34
3 boolean contaAtiva ;
Cdigo Java 2.1: Declarao de variveis
Duas ou mais variveis de um mesmo tipo podem ser declaradas na mesma instruo. O tipo
deve ser definido apenas uma vez e os nomes das variveis separados por vrgula. No exemplo abaixo,
trs variveis do tipo double foram declaradas: saldo, limite e taxa.
1 double saldo , limite , taxa ;
Cdigo Java 2.2: Declarao de duas ou mais variveis na mesma instruo
Mais Sobre
Em Java, devemos informar, no cdigo fonte, o tipo das variveis. Por isso, essa linguagem considerada estaticamente tipada.
Toda varivel deve ser inicializada antes de sua utilizao. O processo de inicializao consiste
em atribuir a uma varivel o seu primeiro valor. No exemplo abaixo, a varivel numeroDaConta foi declarada na linha 1 e inicializada com o valor 3466 na linha 2.
1 int numeroDaConta ;
2 numeroDaConta = 3466;
Cdigo Java 2.3: Declarao e inicializao de uma varivel
Tambm possvel declarar e inicializar uma varivel em apenas uma linha. No exemplo abaixo,
a varivel numeroDaConta foi declarada e inicializada com o valor 3466 na linha 1.
1 int numeroDaConta = 3466;
Cdigo Java 2.4: Declarao e inicializao de uma varivel
34
www.k19.com.br
35
VARIVEIS
Na primeira linha, o valor armazenado na varivel numero exibido na sada padro. Na segunda
linha, o texto numero exibido na sada padro.
Alterar o valor armazenado em uma varivel no afeta o valor armazenado em uma outra varivel. No exemplo abaixo, a varivel a foi inicializada com o valor 1 e a varivel b foi inicializada com
uma cpia do valor armazenado na varivel a. Depois, os valores armazenados nessas duas variveis
foram modificados. A varivel a recebeu o valor 2 e a varivel b recebeu o valor 3. Lembre-se que alterar o valor da varivel a no afeta o valor armazenado na varivel b e vice-versa. Portanto, ao exibir
os valores armazenados nessas variveis, os nmeros 2 e 3 sero apresentados na sada padro.
1
2
3
4
5
6
7
8
9
10
11
int a = 1;
int b = a ;
a = 2;
b = 3;
System . out . println ( a ) ; // exibe o valor 2
System . out . println ( b ) ; // exibe o valor 3
www.facebook.com/k19treinamentos
35
VARIVEIS
36
Simulao
Para ilustrar a cpia de valores de variveis, simularemos a execuo de um programa em Java.
Ao executar a classe Variavel, a execuo iniciada na primeira linha do mtodo main. Assim, a
execuo comea na linha 3 do cdigo abaixo. A instruo dessa linha declara a varivel a do tipo int
e a inicializa com o valor 2.
1
1 class Variavel {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = a ;
5
System . out . println ( a ) ;
6
System . out . println ( b ) ;
7
}
8 }
a=2
Em seguida, a linha 4 executada. Nessa linha, declarada a varivel b do tipo int e seu valor
inicializado com o valor armazenado na varivel a.
2
1 class Variavel {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = a ;
5
System . out . println ( a ) ;
6
System . out . println ( b ) ;
7
}
8 }
a=2
b=2
Seguindo o fluxo de execuo, a linha 5 executada. A instruo dessa linha exibe na sada
padro o valor armazenado na varivel a. Assim, o nmero 2 exibido na sada padro.
3
1 class Variavel {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = a ;
5
System . out . println ( a ) ;
6
System . out . println ( b ) ;
7
}
8 }
a=2
b=2
Em seguida, a linha 6 executada. A instruo dessa linha exibe na sada padro o valor armazenado na varivel b.
4
36
www.k19.com.br
37
VARIVEIS
1 class Variavel {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = a ;
5
System . out . println ( a ) ;
6
System . out . println ( b ) ;
7
}
8 }
a=2
b=2
2
2
Descrio
Espao ocupado
byte
1 byte
short
2 bytes
int
4 bytes
long
8 bytes
float
4 bytes
52
)2
1023
e (2 2
52
)2
1023
double
boolean
8 bytes
1 bit
char
2 bytes
Chamaremos os tipos primitivos byte, short, char, int, long, float e double de tipos primitivos numricos. Os tipos byte, short, char, int e long sero chamados de tipos primitivos inteiros. J os tipos
float e double sero chamados de tipos primitivos reais.
Mais Sobre
O espao necessrio para armazenar uma varivel do tipo boolean 1 bit. Contudo,
dependendo da plataforma, o espao ocupado pode ser maior.
Mais Sobre
O tipo float e o tipo double aceitam tambm os valores Infinity, 0 e NaN (Not
a Number). Os valores Infinity so representados pelas constantes Float.NEGATIVE_INFINITY,
Float.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY e Double.POSITIVE_INFINITY. O valor NaN representado pelas constantes Float.NaN e Double.NaN. Veremos mais sobre esses valores adiante.
www.facebook.com/k19treinamentos
37
VARIVEIS
38
BigInteger e BigDecimal
Para armazenar nmeros inteiros que extrapolam os intervalos de valores dos tipos primitivos
numricos, podemos utilizar o tipo BigInteger.
http://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html
Para armazenar nmeros reais que extrapolam os intervalos de valores dos tipos primitivos numricos ou que exijam mais preciso, podemos utilizar o tipo BigDecimal.
http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html
Qualquer nmero aceito por um tipo primitivo inteiro pode ser armazenado em uma varivel do
tipo BigInteger. Alm desses valores, o tipo BigInteger capaz de armazenar muitos outros. Assim,
algum poderia argumentar que optar por uma varivel do tipo BigInteger sempre a melhor escolha.
No entanto, o uso de BigInteger tem algumas desvantagens em relao ao uso dos tipos primitivos
inteiros. Uma delas que uma varivel do tipo BigInteger ocupa mais espao. Alm disso, operaes
envolvendo os valores armazenados em variveis do tipo BigInteger so consideravelmente mais lentas do que as operaes envolvendo os tipos primitivos inteiros. A mesma comparao vlida entre
o tipo BigDecimal e os tipos primitivos reais.
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
Escolher entre os tipos numricos primitivos e os tipos BigInteger e BigDecimal semelhante a optar pelo uso de um carro ou de um caminho. De fato, o caminho capaz de
transportar tudo o que um carro capaz de transportar e muito mais. Por outro lado, estacionar um caminho em um shopping, por exemplo, bem mais complicado do que estacionar
um carro. Alm disso, o gasto de combustvel do caminho ser provavelmente maior do que o
gasto do carro.
Mnimo
Byte.MIN_VALUE
Short.MIN_VALUE
Integer.MIN_VALUE
Long.MIN_VALUE
Float.MIN_VALUE
Double.MIN_VALUE
Character.MIN_VALUE
Mximo
Byte.MAX_VALUE
Short.MAX_VALUE
Integer.MAX_VALUE
Long.MAX_VALUE
Float.MAX_VALUE
Double.MAX_VALUE
Character.MAX_VALUE
Tabela 2.2: Constantes para os valores mnimos e mximos dos tipos primitivos numricos
Por exemplo, para exibir o maior valor que uma varivel do tipo int pode armazenar, podemos
utilizar o seguinte cdigo.
38
www.k19.com.br
39
VARIVEIS
Contudo, algum que venha a ler esse cdigo pode no reconhecer esse nmero como sendo o
maior valor do tipo int. Uma situao como essa pode comprometer o entendimento do cdigo por
parte do leitor. Para melhorar a legibilidade do cdigo, podemos utilizar a constante Integer.MAX_VALUE.
1 System . out . println ( Integer . MAX_VALUE ) ;
Importante
As constantes apresentadas na Tabela 2.2 para os valores mnimos dos tipos byte, short,
int e long armazenam os nmeros -128, -32768, -2147483648 e -9223372036854775808, respec-
Nmeros inteiros
Nmeros inteiros podem ser armazenados em variveis dos tipos byte, short, int ou long. Basicamente, para escolher o tipo mais apropriado, devemos considerar a grandeza dos nmeros que
desejamos armazenar.
Por exemplo, considere a numerao dos andares de um prdio. Nesse prdio, h 3 subsolos
numerados com -1, -2 e -3, o trreo numerado com 0 e os outros 20 andares com os nmeros
de 1 a 20. Precisamos armazenar o nmero de um andar qualquer desse prdio. De acordo com a
Tabela 2.1, o tipo byte aceita valores entre -128 e 127. Portanto, o tipo byte uma escolha adequada
para a nossa varivel.
Atualmente, os motores dos automveis comuns no ultrapassam 10.000 RPM (rotaes por minuto). Dessa forma, possvel armazenar a rotao mxima de um automvel em uma varivel do
tipo short.
No livro O crebro feminino, a neuropsiquiatra Louann Brizendine afirmou que, em mdia, uma
mulher fala 20 mil palavras por dia. Vamos considerar que, em um dia atpico, uma mulher pode falar
cerca de 40 mil palavras. Dessa forma, para armazenar a quantidade de palavras que uma mulher
fala em um dia, seria razovel utilizar uma varivel do tipo int.
Atualmente, a populao mundial de aproximadamente 7 bilhes de pessoas. Para armazenar
esse valor, devemos utilizar uma varivel do tipo long.
Na Tabela 2.1, voc pode verificar que a quantidade de espao ocupado por uma varivel depende do seu tipo. Para diminuir a quantidade de memria RAM utilizada, podemos priorizar o uso
dos tipos byte, short, int e long nessa ordem.
www.facebook.com/k19treinamentos
39
VARIVEIS
40
Nmeros reais
Nmeros reais podem ser armazenados em variveis dos tipos float e double. Para escolher o
tipo mais apropriado, devemos considerar a grandeza e a preciso dos nmeros que desejamos armazenar. O tipo double permite armazenar valores de maior grandeza e de maior preciso quando
comparado ao tipo float.
O menor valor que pode ser representado pelo tipo double (2 252 ) 21023 e o maior 2
2 )21023 . A quantidade de valores reais entre esses dois nmeros infinita. O tipo double, contudo,
permite apenas a representao de uma quantidade finita de valores nesse intervalo.
52
Por exemplo, o nmero 1 pode ser representado em double. O prximo nmero depois do 1 que
pode ser representado em double 1.0000000000000002220446049250313080847263336181640625
(que igual a 1 + 252 ). Depois desse nmero, o prximo nmero que pode ser representado
1.000000000000000444089209850062616169452667236328125 (que igual a 1 + 251 ).
De maneira geral, um valor que no pode ser representado em double substitudo pelo valor
mais prximo que pode ser representado. Por exemplo, o nmero 1.0000000000000003 no pode
ser representado em double. Assim, esse nmero substitudo pelo valor double mais prximo, que
1.0000000000000002220446049250313080847263336181640625.
O tipo float funciona de forma anloga ao tipo double e capaz de armazenar alguns valores entre
(2 223 ) 2127 e (2 223 ) 2127 .
O valor especial NaN (Not-a-Number) representa o resultado de algumas operaes invlidas
envolvendo valores do tipo float ou do tipo double. O valor especial Infinity representa o infinito. O
resultado de algumas operaes envolvendo valores do tipo float ou do tipo double pode ser +Infinity
ou Infinity.
Armadilha
Quando um nmero possui muitas casas decimais, o mtodo println no exibe todas
elas. No exemplo abaixo, ao tentar exibir o valor 1.0000000000000003, o mtodo println exibe o
valor 1.0000000000000002.
1 System . out . println (1.0000000000000003) ; // exibe 1.0000000000000002
Curiosidade
No dia 25 de Fevereiro de 1991, em Dhahran, na Arbia Saudita, durante a Guerra do
Golfo, o sistema antimssil americano chamado Patriot falhou e no conseguiu interceptar um
mssil iraquiano. Esse mssil atingiu o seu alvo, um alojamento americano. No total, 28 soldados
40
www.k19.com.br
41
VARIVEIS
Verdadeiro ou falso
Variveis do tipo boolean podem armazenar o valor true (verdadeiro) ou o valor false (falso). No
podemos armazenar nmeros em variveis do tipo boolean.
Caracteres
Tecnicamente, uma varivel do tipo char armazena um nmero inteiro entre 0 e 65.535. Contudo,
o valor armazenado em um varivel do tipo char representa o cdigo de um caractere de acordo com
a codificao UTF-16 do padro Unicode (http://www.unicode.org/). De forma abstrata, podemos
dizer que uma varivel do tipo char armazena um caractere.
www.facebook.com/k19treinamentos
41
VARIVEIS
42
Primitivo
Wrapper Class
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean
Importante
Todo tipo no primitivo tambm aceita o valor null. Esse valor representa o vazio.
2.7 String
Na linguagem Java, o tipo String um dos mais importantes e mais utilizados. O tipo String
usado para armazenar texto (sequncia de caracteres). No exemplo abaixo, a varivel texto do tipo
String foi associada sequncia de caracteres K19 Treinamentos.
1 String texto = " K19 Treinamentos " ;
Cdigo Java 2.16: Utilizando o tipo String
Qualquer caractere definido na codificao UTF-16 do padro Unicode pode ser utilizado para
formar uma string.
O espao utilizado por uma string depende da quantidade de caracteres que ela possui. Cada
caractere ocupa 16 bits. Portanto, a string K19 Treinamentos, que possui 16 caracteres (o caractere
espao tambm deve ser contabilizado), ocupa 256 bits.
Como String um tipo no primitivo, podemos armazenar o valor null em uma varivel do tipo
String.
42
www.k19.com.br
43
VARIVEIS
java.util.Calendar c = new java.util.GregorianCalendar( 1982 ,
Ano
11 ,
Ms (0 ~ 11)
12 ,
Dia (1 ~ 31)
10 ,
Hora (0 ~ 23)
5 ,
Minuto (0 ~ 59)
30 )
Segundo (0 ~ 59)
No exemplo acima, o primeiro parmetro define o ano; o segundo o ms; o terceiro o dia; o
quarto a hora; o quinto os minutos; e o sexto os segundos. O ms definido da seguinte forma: 0
janeiro, 1 fevereiro, 2 maro e assim por diante. Dessa forma, a data 12 de Dezembro de 1982 e
hora 10:05:30 foram associadas varivel c.
Null
Considere um programa que utiliza uma varivel do tipo Double para armazenar a variao do
Dlar em relao ao Real. Essa varivel deve ser atualizada diariamente.
1 Double variacao ;
No dia 30 de Abril de 2014, a variao foi de 0, 139%. Ento, nesse dia, o valor 0.139 foi armazenado na varivel variacao.
1 variacao = -0.139;
No dia seguinte, 1 de Maio de 2014, devido ao feriado internacional do dia do trabalho, o mercado
financeiro no funcionou. Dessa forma, a cotao do Dlar em relao ao Real no sofreu alterao.
Nesse dia, qual valor deveria ser armazenado na varivel variacao?
Provavelmente, nesse caso, o mais intuitivo seria utilizar o valor 0. Contudo, a utilizao desse
valor gera uma ambiguidade. A varivel variacao armazenaria o valor 0 quando o mercado financeiro
no funciona, ou seja, nos sbados, domingos, feriados e datas extraordinrias. Mas, tambm armazenaria o valor 0 quando as operaes financeiras realizadas em um determinado dia no alteram a
cotao do Dlar em relao ao Real. Se o programa precisa diferenciar essas duas situaes, o valor
0 no pode ser utilizado para esses dois casos.
Para resolver esse problema, nos dias em que o mercado financeiro no funciona, o valor null
poderia ser armazenado na varivel variacao. O null um valor especial que representa o vazio.
1 variacao = null ;
www.facebook.com/k19treinamentos
43
VARIVEIS
44
Importante
As variveis de tipos primitivos no aceitam o valor null.
Se a palavra chave null for definida dentro de aspas dupla, a varivel nome seria associada
sequncia de caracteres null e no armazenaria o valor null.
1 String nome = " null " ;
Booleanos
O valor verdadeiro representado pelo valor literal true e o valor falso pelo valor literal false.
1 boolean a = true ;
2
3 boolean b = false ;
Cdigo Java 2.23: Utilizando valores literais booleanos
Inteiros
Nmeros inteiros podem ser escritos nos formatos binrio, octal, decimal e hexadecimal. A representao de um nmero em cada um desses formatos uma sequncia composta por um ou
mais dgitos. No formato decimal, so usados os dgitos de 0 a 9. J no formato binrio, so utilizados apenas os dgitos 0 e 1. No formato octal, so usados os dgitos de 0 a 7. Por fim, no formato
hexadecimal, so usados os dgitos de 0 a 9 e as letras de A a F. A letra A corresponde ao valor 10, a
letra B corresponde ao valor 11 e assim sucessivamente. A Tabela 2.4 apresenta os nmeros inteiros
de 0 a 21 representados em cada um desses formatos.
44
www.k19.com.br
45
VARIVEIS
Decimal
0
1
2
3
4
5
6
7
8
9
10
Binrio
0
1
10
11
100
101
110
111
1000
1001
1010
Octal
0
1
2
3
4
5
6
7
10
11
12
Hexadecimal
0
1
2
3
4
5
6
7
8
9
A
Decimal
11
12
13
14
15
16
17
18
19
20
21
Binrio
1011
1100
1101
1110
1111
10000
10001
10010
10011
10100
10101
Octal
13
14
15
16
17
20
21
22
23
24
25
Hexadecimal
B
C
D
E
F
10
11
12
13
14
15
Em Java, valores literais inteiros podem ser escritos no cdigo fonte em qualquer um desses formatos. Mas como podemos observar na Tabela 2.4, o nmero 2 em formato binrio tem a mesma
representao que o nmero 10 em formato decimal. Para diferenci-los, a linguagem Java define
algumas regras.
Para utilizar o formato binrio, devemos acrescentar o prefixo 0b ou o prefixo 0B.
Para usar o formato octal, devemos acrescentar o prefixo 0.
Para utilizar o formato hexadecimal, devemos acrescentar o prefixo 0x ou o prefixo 0X.
Qualquer outra sequncia formada por dgitos de 0 a 9 estar no formato decimal.
No cdigo abaixo, o nmero 19 atribudo a variveis do tipo int utilizando os formatos binrio,
octal, decimal e hexadecimal.
1
2
3
4
5
6
7
8
9
10
11
// 19 em binrio
int a = 0 b10011 ;
// 19 em octal
int b = 023;
// 19 em decimal
int c = 19;
// 19 em hexadecimal
int d = 0 x13 ;
Cdigo Java 2.24: Nmero 19 nos formatos binrio, octal, decimal e hexadecimal
Por padro, os valores literais inteiros so considerados valores do tipo int. Para definir um valor
literal inteiro do tipo long, devemos utilizar o sufixo L (le maisculo) ou l (le minsculo). A utilizao do sufixo l (le minsculo) no recomendada pois, visualmente, esse caractere pode ficar
muito parecido com o caractere 1 (um).
Como vimos, variveis do tipo int no armazenam valores maiores do que 2.147.483.647. Ento,
considere o valor inteiro 2.147.483.648. Esse valor no pode ser armazenado em variveis do tipo
int pois ultrapassa o limite de 2.147.483.647.
Por outro lado, o valor 2.147.483.648 pode ser armazenado em variveis do tipo long, j que esse
tipo de varivel aceita valores at 9.223.372.036.854.775.807.
www.facebook.com/k19treinamentos
45
VARIVEIS
46
No cdigo abaixo, h uma tentativa de atribuir o valor 2.147.483.648 varivel a. Note que nem o
sufixo L e nem o sufixo l foi acrescentado ao nmero. Assim, mesmo a varivel a sendo do tipo long,
esse cdigo gera um erro de compilao.
1 // erro de compilao
2 long a = 2147483648;
Cdigo Java 2.25: Erro de compilao
Para resolver esse problema, devemos utilizar o sufixo L ou o sufixo l, como no cdigo abaixo.
1
2
3
4
5
Reais
Valores literais reais so definidos com o separador de casas decimais . (ponto). Veja alguns
exemplos:
1 double a = 19.19;
2
3 double b = 0.19;
4
5 double c = .19;
Cdigo Java 2.27: Valores literais reais
Para resolver esse problema, devemos utilizar o sufixo F (fe maisculo) ou f (fe minsculo). Ao
utilizar um desses sufixos, indicamos ao compilador que o valor literal real deve ser tratado como
float.
1 float a = 19.09 F ;
2
3 float b = 19.09 f ;
Cdigo Java 2.29: Utilizando o sufixo F e f
Para indicar que um valor literal do tipo double, podemos utilizar o sufixo D (d maisculo) ou
d (d minsculo). Esses sufixos so redundantes para valores literais reais pois, por padro, esses
valores j so do tipo double.
46
www.k19.com.br
47
VARIVEIS
Tambm podemos definir valores literais reais na forma exponencial. No exemplo abaixo, a varivel a foi inicializada com o valor 1.74e3. Esse valor o resultado da multiplicao do nmero
esquerda do caractere e ( minsculo) por 10 elevado ao nmero direita do caractere e ( minsculo). Em outras palavras, esse valor igual a 1.74 103 , ou seja, igual a 1740.
1 double a = 1.74 e3 ; // 1740 na forma exponencial
Cdigo Java 2.30: Forma exponencial
Caracteres
Caracteres literais so definidos dentro de aspas simples. No exemplo abaixo, a varivel a foi
inicializada com o cdigo numrico do caractere K.
1 char a = K ;
Cdigo Java 2.32: Caracteres literais
O cdigo do caractere K 75. Dessa forma, as duas inicializaes do exemplo abaixo so equivalentes. Para no ter de decorar o cdigo de cada caractere, provavelmente, voc vai optar pela
inicializao com aspas simples.
1 char a = K ;
2
3 char b = 75;
Cdigo Java 2.33: Caracteres literais
Importante
Apenas um caractere pode ser definido dentro de aspas simples.
Importante
Para definir os caracteres \, e " (barra invertida, aspas simples e aspas duplas), devemos acrescentar uma \ (barra invertida) frente desses caracteres. Assim, devemos utilizar as
sequncias de escape \\, \ e \". Veja o exemplo a seguir.
1 char a = \\ ;
2
3 char b = \ ;
4
5 char c = \" ;
A quantidade de caracteres definidos pela codificao UTF-16 do padro Unicode muito maior
do que a quantidade de teclas do seu teclado. Dessa forma, voc no pode digitar a maior parte dos
caracteres aceitos pela linguagem Java.
www.facebook.com/k19treinamentos
47
VARIVEIS
48
Para definir caracteres que no esto associados s teclas do seu teclado, voc pode utilizar o
cdigo de cada caractere. Por exemplo, para definir o caractere (mega), podemos utilizar o cdigo
937.
Na segunda inicializao do exemplo abaixo, utilizamos o valor \u03A9 dentro de aspas simples.
O nmero direita do caractere u (u minsculo) o cdigo do caractere desejado em notao hexadecimal com 4 dgitos.
1 char a = 937;
2
3 char b = \ u03A9 ; // 937 em notao hexadecimal com 4 dgitos
Cdigo Java 2.35: Utilizando o cdigo dos caracteres
Mais Sobre
De acordo com a especificao da linguagem Java, os caracteres literais podem ser definidos em notao octal para oferecer compatibilidade com a linguagem C. Contudo, nessa
notao, somente os caracteres correspondentes aos cdigos do intervalo [0, 255] podem ser
definidos.
1 char a = \101 ; // 65 em notao octal
Cdigo Java 2.36: Utilizando a notao octal
Como vimos, podemos definir um caractere de diversas formas. Veja no exemplo abaixo algumas
formas de definir o caractere A.
1
2
3
4
5
6
7
8
9
10
11
12
13
char a1 = A ;
char a2 = 65; // cdigo do caractere A em decimal
char a3 = \ u0041 ; // cdigo do caractere A em notao hexadecimal
char a4 = \101 ; // cdigo do caractere A em notao octal
char a5 = 0 B1000001 ; // cdigo do caractere A em formato binrio
char a6 = 0101; // cdigo do caractere A em formato octal
char a7 = 0 X41 ; // cdigo do caractere A em formato hexadecimal
Cdigo Java 2.37: Diferentes formas para definir o caractere A
Strings
Strings literais so definidas dentro de aspas duplas. No exemplo abaixo, a varivel a foi associada
sequncia de caracteres K19 Treinamentos.
1 String a = " K19 Treinamentos " ;
Cdigo Java 2.38: Strings literais
Para simplificar, uma string literal uma sequncia de caracteres literais dentro de aspas duplas.
48
www.k19.com.br
49
VARIVEIS
Importante
Para utilizar os caracteres \ e " (barra invertida e aspas duplas) dentro de uma string,
devemos usar as sequncias de escape \\ e \", respectivamente.
No exemplo abaixo, ocorre um erro de compilao.
1 String a = " C :\ k19 \ rafael \ cosentino " ;
Cdigo Java 2.39: Erro de compilao
Legibilidade
No cdigo abaixo, a varivel numero foi inicializada com determinado valor.
1 long numero = 4000000000000 L ;
Qual valor esse? Observe que h certa dificuldade para descobrir o valor desse nmero. Para
melhorar a legibilidade dos valores literais inteiros ou reais, podemos separar os dgitos utilizando o
caractere _ (underscore). Assim, o cdigo acima pode ser escrito da seguinte forma.
1 long numero = 4 _000_000_000_000L ;
Cdigo Java 2.42: Utilizando o caractere _
Os dois cdigos acima so equivalentes, mas o ltimo mais legvel, facilitando o entendimento
por parte do leitor.
H algumas regras para o uso desse caractere. O underscore no pode ser colocado antes do
primeiro dgito e nem aps o ltimo dgito de um nmero inteiro ou real. Para nmeros do tipo long,
o _ no pode ser colocado ao lado do L ou do l. Alm disso, para valores reais, o caractere underscore
no pode ser colocado ao lado do . e nem ao lado do E ou E. No cdigo abaixo, mostramos alguns
usos indevidos de underscore.
1
2
3
4
5
6
int x1 = 1 _000_000_000_ ;
long x2 = _4_000_000_000_000L ;
long x3 = 4 _000_000_000_000_L ;
double x4 = _544_435_765 .34;
double x5 = 544 _435_765_ .34;
double x6 = 82.3 E_4 ;
Cdigo Java 2.43: Erro de compilao ao usar o caractere _ incorretamente
www.facebook.com/k19treinamentos
49
VARIVEIS
50
importante observar que os caracteres _ no aparecem na tela quando um nmero nesse formato exibido.
1 System . out . println (4 _000_000_000_000L ) ; // exibe 4000000000000
Cdigo Java 2.44: Os caracteres _ no so exibidos na tela
Por exemplo, no cdigo abaixo, a varivel a (que final) foi inicializada com o valor 10. Depois
dessa inicializao, na tentativa de trocar o valor dessa varivel, um erro de compilao gerado.
1 final int a = 10;
2
3 a = 5; // erro de compilao
Cdigo Java 2.46: Tentando alterar o valor de uma varivel final
A inicializao de uma varivel final no precisa ser realizada junto com a sua declarao. Enquanto uma varivel final no for inicializada, ela denominada blank final.
1 final int a ;
2
3 a = 10;
Cdigo Java 2.47: Declarando e inicializando uma varivel final em linha separadas
Podemos adaptar o intervalo dos nmeros gerados com algumas operaes matemticas. Suponha que voc queira gerar aleatoriamente um nmero que seja maior ou igual a um certo valor
mnimo e menor do que um certo valor mximo. O cdigo abaixo exemplifica como essa tarefa pode
ser feita.
1 double minimo = -5.0;
50
www.k19.com.br
51
VARIVEIS
Simulao
Vamos simular a execuo de um programa em Java que gera um nmero aleatrio atravs do
mtodo Math.random e o exibe na sada padro.
1
A execuo da classe NumeroAleatorio iniciada na primeira linha do mtodo main. Assim, a
execuo comea na linha 3 do cdigo abaixo. A instruo dessa linha declara a varivel a do tipo
double e a inicializa com o valor devolvido pelo mtodo Math.random.
1 class NumeroAleatorio {
2
public static void main ( String [] args ) {
3
double a = Math . random () ;
4
System . out . println ( a ) ;
5
}
6 }
a = 0.87
Em seguida, a linha 4 executada. A instruo presente nessa linha exibe o valor da varivel a na
sada padro.
2
1 class NumeroAleatorio {
2
public static void main ( String [] args ) {
3
double a = Math . random () ;
4
System . out . println ( a ) ;
5
}
6 }
a = 0.87
0.87
Voc consegue deduzir quais dados sero armazenados nas variveis j, f e m? Provavelmente, no.
Vamos melhorar um pouco os nomes dessas variveis.
www.facebook.com/k19treinamentos
51
VARIVEIS
52
1 int jan ;
2 int fev ;
3 int mar ;
Agora, talvez, voc tenha uma vaga ideia. Vamos melhorar mais um pouco os nomes dessas
variveis.
1 int janeiro ;
2 int fevereiro ;
3 int marco ;
Agora sim! Voc j sabe para que servem essas variveis? Se voc parar para pensar ainda no
sabe muita coisa sobre elas. Ento, importante melhorar mais uma vez o nome dessas variveis.
1 int numeroDePedidosEmJaneiro ;
2 int numeroDePedidosEmFevereiro ;
3 int numeroDePedidosEmMarco ;
Finalmente, os nomes das variveis conseguem expressar melhor a inteno delas. Consequentemente, a leitura e o entendimento do cdigo fonte seria mais fcil.
Geralmente, bons nomes de variveis so compostos por vrias palavras como no exemplo a
seguir.
1 int numeroDeCandidatosAprovados ;
Quando o nome de uma varivel composto, fundamental adotar alguma conveno para
identificar o incio e o trmino das palavras. A separao natural das palavras na lngua portuguesa
so os espaos. Contudo, os nomes das variveis em Java no podem possuir espaos. No adotar
uma conveno de nomenclatura para identificar o incio e o termino das palavras como escrever
um texto em portugus sem espaos entre as palavras. Em alguns casos, o leitor no saberia como
separar as palavras. Considere o exemplo abaixo.
salamesadia
O que est escrito no texto acima? A resposta depende da diviso das palavras. Voc pode ler
como sala mesa dia ou salame sadia. Dessa forma, fica clara a necessidade de deixar visualmente
explcita a diviso das palavras.
Em algumas linguagens de programao, delimitadores so utilizados para separar as palavras
que formam o nome de uma varivel.
numero_de_candidatos_aprovados;
numero-de-candidatos-aprovados;
Em outras linguagens de programao, letras maisculas e minsculas so utilizadas para separar as palavras.
NumeroDeCandidatosAprovados;
52
www.k19.com.br
53
VARIVEIS
numeroDeCandidatosAprovados;
Em Java, a conveno de nomenclatura adotada para separar as palavras que formam o nome de
uma varivel o Camel Case, que consiste em escrever o nome da varivel com a primeira letra de
cada palavra em maiscula com exceo da primeira letra da primeira palavra.
1 int numeroDaConta ; // segue a conveno
2 int NumeroDaConta ; // no segue a conveno
Cdigo Java 2.57: Conveno para nomes de variveis
Tambm devemos nos lembrar que a linguagem Java case sensitive. Dessa forma, numeroDaConta
e NumeroDaConta so consideradas variveis diferentes pelo fato do nome da primeira comear com
letra minscula e o da segunda com maiscula.
Importante
Considere um cdigo Java que declara uma varivel chamada pontuao. Note o uso
dos caracteres e no nome dessa varivel. Geralmente, os cdigos desses caracteres so
diferentes em cada padro de codificao. Por exemplo, no UTF-8, o cdigo do caractere
50087, enquanto que no ISO-8859-1 231.
Suponha que esse cdigo tenha sido salvo em um arquivo que utiliza a codificao UTF-8. Se
ele for aberto em um editor que utiliza a codificao ISO-8859-1, o caractere no ser apresentado corretamente, dificultando a leitura ou a modificao do cdigo fonte.
Para evitar esse tipo de problema, a recomendao utilizar apenas as letras de A a Z (tanto
maisculas quanto minsculas) e os dgitos de 0 a 9 pois, geralmente, os cdigos desses caracteres no variam de codificao para codificao.
Mais Sobre
Alm do _ (underscore) e $ (cifro), so considerados Java letters todos os caracteres do
padro Unicode das categorias gerais: Lu (Letter, uppercase), Ll (Letter, lowercase), Lt (Letter,
titlecase), Lm (Letter, modifier), Lo (Letter, other) e Nl (Number, letter).
Dessa forma, o nome de uma varivel pode conter caracteres de diversos sistemas de escrita
www.facebook.com/k19treinamentos
53
VARIVEIS
54
como o japons, coreano e chins, assim como as letras acentuadas do portugus. Consequentemente, os programadores podem definir os nomes das variveis utilizando a suas lnguas nativas.
Contudo, para no ter problema na visualizao do cdigo fonte de um programa Java nos diversos editores de texto e sistemas operacionais, a recomendao utilizar apenas as letras maisculas de A at Z, as letras minsculas de a at z e os dgitos de 0 a 9.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// vlido
int numeroDaConta ;
// invlido pois o nome de uma varivel no pode comear com dgito
int 2 outraVariavel ;
// invlido pois o nome de uma varivel no pode ser igual a uma palavra reservada
double double ;
// invlido pois o nome de uma varivel no pode conter espaos
double saldo da conta ;
// vlido
int umaVariavelComUmNomeSuperHiperMegaUltraGigante ;
// vlido
int numeroDaContaCom8Digitos_semPontos ;
// vlido
int valorDoProdutoEmR$;
// invlido pois o caractere # no considerado uma Java letter
int # telefone ;
Cdigo Java 2.58: Exemplos de nomes de variveis vlidos e invlidos
continue
default
do
double
else
enum
extends
final
finally
float
for
if
goto
implements
import
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
strictfp
super
switch
synchronized
this
throw
throws
transient
try
void
volatile
while
54
www.k19.com.br
55
VARIVEIS
www.facebook.com/k19treinamentos
55
VARIVEIS
56
Agora, veja um exemplo de programa em Java que utiliza aspas simples onde deveria haver aspas
duplas.
1 class Programa {
2
public static void main ( String [] args ) {
3
String s = K19 Treinamentos ;
4
}
5 }
Cdigo Java 2.62: Programa.java
56
www.k19.com.br
57
VARIVEIS
www.facebook.com/k19treinamentos
57
VARIVEIS
58
2
public static void main ( String [] args ) {
3
long a = 2147483648;
4
}
5 }
Cdigo Java 2.65: Programa.java
1 class Programa {
2
public static void main ( String [] args ) {
3
float a = 3.14;
4
}
5 }
Cdigo Java 2.66: Programa.java
2.21 Resumo
1
Para armazenar um valor em uma varivel, esse valor deve ser compatvel com o tipo da vari-
vel.
A linguagem Java possui oito tipos primitivos: byte, short, int, long, float, double, boolean e char.
58
www.k19.com.br
59
7
VARIVEIS
Os tipos no primitivos correspondentes aos tipos primitivos so: Byte, Short, Integer, Long,
Float, Double, Boolean e Character.
10
11
Para armazenar nmeros reais grandes e mais precisos, podemos utilizar o tipo BigDecimal.
12
Uma varivel do tipo String pode ser associada a uma sequncia de caracteres.
13
Em Java, para trabalhar com datas e horas, podemos usar o tipo java.util.Calendar.
14
15
16
17
18
19
20
Podemos gerar nmeros aleatrios em Java com o mtodo random() da classe Math.
21
22
www.facebook.com/k19treinamentos
59
VARIVEIS
60
60
www.k19.com.br
CAPTULO
O PERADORES
3.1 Introduo
Para manipular os valores literais ou os dados armazenados nas variveis de uma aplicao, devemos utilizar os operadores oferecidos pela linguagem de programao que estamos utilizando. Os
principais tipos de operaes so:
Converses
Aritmticas (
Atribuies (
+=
Comparaes (
Lgicas (
&
*=
/=
-=
==
!=
<
&&
||
<=
!
%=
>
++
>=
? :
--
Agora, considere um nmero inteiro dentro do intervalo de valores do tipo long. No podemos
garantir que esse valor possa ser armazenado em uma varivel do tipo int porque o intervalo do tipo
long mais abrangente do que o intervalo do tipo int. Por exemplo, o nmero 2147483648 est no
intervalo do tipo long mas no est no intervalo do tipo int.
Por causa disso, no podemos copiar diretamente um valor armazenado em uma varivel do tipo
long para uma varivel do tipo int. A tentativa de realizar esse tipo de cpia gera erro de compilao
mesmo que o valor armazenado na varivel do tipo long seja compatvel com int. Veja o exemplo a
seguir.
www.facebook.com/k19treinamentos
61
O PERADORES
62
1 long a = 19;
2 int b = a ;
Cdigo Java 3.2: Erro de compilao - Incompatibilidade
Observe, na Tabela 3.1, a compatibilidade entre os tipos primitivos. Note, por exemplo, que um
valor do tipo int pode ser convertido automaticamente para long, float ou double. Por outro lado, um
valor do tipo long no pode ser convertido automaticamente para byte, short, char ou int.
Para
De
byte
short
char
int
long
float
double
byte
short
char
int
long
float
double
3
7
7
7
7
7
7
3
3
7
7
7
7
7
7
7
3
7
7
7
7
3
3
3
3
7
7
7
3
3
3
3
3
7
7
3
3
3
3
3
3
7
3
3
3
3
3
3
3
Para copiar o valor armazenado em uma varivel para outra varivel de um tipo incompatvel,
necessrio realizar uma operao de casting. Esse tipo de operao fora a converso dos valores.
No exemplo abaixo, o valor armazenado na varivel a, que do tipo long, foi copiado para a varivel
b, que do tipo int, com uma operao de casting.
1 long a = 19;
2 int b = ( int ) a ;
Cdigo Java 3.3: Casting
Operaes de casting podem gerar resultados indesejados. Suponha que uma varivel do tipo
long armazene o valor 3000000000. Se uma operao de casting for aplicada para copiar esse valor
para uma varivel do tipo int, o valor obtido na cpia ser -1294967296.
1 long a = 3000000000 L ;
2 int b = ( int ) a ; // b = -1294967296
Cdigo Java 3.4: Valores indesejados com casting
62
www.k19.com.br
63
O PERADORES
O tipo boolean no compatvel com os outros tipos primitivos. Alm disso, no possvel utilizar
operaes de casting para realizar converses de booleanos. No exemplo abaixo, a varivel a do tipo
int e a varivel b do tipo boolean. A tentativa de copiar o valor da varivel b para a varivel c, que
do tipo int, com casting gera erro de compilao. Analogamente, a tentativa de copiar o valor da
varivel a para varivel d, que do tipo boolean, com casting tambm gera erro de compilao.
1
2
3
4
5
6
7
int a = 10;
boolean b = true ;
int c = ( int ) b ; // erro de compilao
boolean d = ( boolean ) a ; // erro de compilao
Cdigo Java 3.6: Converso de booleanos
Curiosidade
No dia 6 de Junho de 1996, a Agncia Espacial Europeia lanava o voo 501 do foguete
Ariane 5. O objetivo da misso era transportar satlites para o espao. Esses satlites seriam
utilizados para analisar o impacto da atividade solar sobre a atmosfera terrestre. O desenvolvimento desse projeto levou uma dcada e custou cerca de 7 bilhes de dlares.
O lanamento do foguete, no entanto, no ocorreu como o esperado. Em menos de um minuto
aps o incio do lanamento, o foguete desviou-se de sua trajetria e explodiu, causando um
prejuzo direto de cerca de 360 milhes de dlares.
A exploso foi causada por uma falha no software que controlava o foguete. Essa falha ocorreu
devido a uma operao de converso de um valor que estava no formato ponto flutuante de 64
bits para o formato inteiro de 16 bits. Como o valor era superior a 32767, ele no poderia ser
representado no formato inteiro de 16 bits. Dessa forma, o valor obtido na converso desencadeou uma falha no sistema de controle do foguete, levando sua exploso.
Fazendo um paralelo com a linguagem Java, esse problema poderia ocorrer na converso de um
valor do tipo double para um valor do tipo short.
www.facebook.com/k19treinamentos
63
O PERADORES
64
A Tabela 3.2 mostra como realizar o boxing e o unboxing para cada tipo primitivo e seu correspondente no primitivo.
Boxing
Boolean.valueOf()
Byte.valueOf()
Short.valueOf()
Character.valueOf()
Integer.valueOf()
Long.valueOf()
Float.valueOf()
Double.valueOf()
Unboxing
booleanValue()
byteValue()
shortValue()
charValue()
intValue()
longValue()
floatValue()
doubleValue()
Para realizar converses entre tipos no correspondentes, podemos usar o casting. Confira o
exemplo abaixo.
1 Double d = ( double ) 1;
2
3 int i = ( int ) ( double ) d ;
Cdigo Java 3.10: Boxing e unboxing com casting
Na primeira linha do exemplo acima, o valor literal 1 do tipo int convertido para o tipo double
por meio de casting. Em seguida, realizado um boxing de double para Double. Na terceira linha,
64
www.k19.com.br
65
O PERADORES
primeiro realizado um unboxing do tipo Double para o tipo double atravs de um casting. Em seguida,
realizada uma converso do tipo double para o tipo int por meio de casting.
Nesses casos, necessrio realizar uma converso de String para int. Em Java, essa converso
pode ser realizada com o uso do mtodo parseInt da classe Integer. Confira o exemplo abaixo.
1 String a = " 19 " ;
2 int b = Integer . parseInt ( a ) ;
Cdigo Java 3.12: Converso de String para int
A Tabela 3.3 a seguir mostra os mtodos utilizados para converter valores do tipo String para
valores primitivos.
byte
Byte.parseByte()
short
Short.parseShort()
int
Integer.parseInt()
long
Long.parseLong()
float
Float.parseFloat()
double
Double.parseDouble()
boolean
Boolean.parseBoolean()
O mtodo parseBoolean() devolve true se a string passada como parmetro for igual a true independentemente das letras serem maisculas ou minsculas (por exemplo, TRUE, tRuE, etc).
Caso contrrio, o mtodo devolve false.
Para os demais mtodos, se o argumento no respeitar as regras estabelecidas na documentao
do Java Standard Edition (Java SE), um erro de execuo ser gerado. O cdigo abaixo exemplifica
casos que provocam erros de execuo.
1
2
3
4
5
6
7
8
9
10
// NumberFormatException
Byte . parseByte ( " " ) ;
Short . parseShort ( " abc " ) ;
Integer . parseInt ( " 18 + 1 " ) ;
Integer . parseInt ( " 19 " ) ;
Long . parseLong ( " 19 L " ) ;
Double . parseDouble ( " K19 " ) ;
// NullPointerException
Double . parseDouble ( null ) ;
Cdigo Java 3.13: Erros de converso
www.facebook.com/k19treinamentos
65
O PERADORES
66
Como vimos, por padro, o valor literal 10 do tipo int. Valores do tipo int no podem ser atribudos variveis do tipo byte.
Contudo, de acordo com a especificao da linguagem Java, nas atribuies envolvendo variveis
do tipo byte e valores literais, a converso automtica desde que o valor a ser atribudo esteja no
intervalo de valores do tipo da varivel.
No exemplo acima, como o nmero 10 est no intervalo de valores do tipo byte, o valor literal 10,
que do tipo int, convertido automaticamente para o tipo byte. Tecnicamente, as duas inicializaes abaixo so equivalentes.
1 byte b = 10;
2
3 byte b = ( byte ) 10;
A tentativa de atribuir o valor 200 a uma varivel do tipo byte gera erro de compilao, pois esse
valor no est no intervalo de valores aceitos pelo tipo byte.
1 byte b = 200; // erro de compilao
Analogamente, a converso automtica tambm ocorrer nas atribuies com expresses constantes (expresses envolvendo valores literais e variveis final). No exemplo abaixo, o valor da expresso constante 1 + 1, que do tipo int, foi automaticamente convertido para byte.
1 byte b = 1 + 1;
A mesma regra aplicada nas atribuies envolvendo variveis do tipo short e char. No exemplo
abaixo, o valor literal 3000, que do tipo int, convertido automaticamente para short. O valor literal
65, que tambm do tipo int, convertido para char.
1 short s = 30000; // converso automtica
2
3 char c = 65; // converso automtica
No exemplo abaixo, a varivel b do tipo Byte. Na atribuio, o valor literal 10, que do tipo int,
convertido automaticamente para o tipo byte. Na sequncia, o boxing tambm ocorre automaticamente e o valor convertido de byte para Byte.
1 Byte b = 10; // casting e boxing
A mesma regra aplicada nas atribuies envolvendo variveis do tipo Short e Char.
No exemplo abaixo, o valor literal 3000, que do tipo int, convertido automaticamente para
short e depois para Short atravs de um boxing. O valor literal 65, que tambm do tipo int, con66
www.k19.com.br
67
O PERADORES
Simulao
Veremos, a seguir, a simulao de um programa em Java para ilustrar alguns tipos de converses.
Ao executar a primeira linha do mtodo main, uma varivel do tipo String chamada s ser criada
e associada sequncia de caracteres 3.14.
1
1 class Conversao {
2
public static void main ( String [] args ) {
3
String s = " 3.14 " ;
4
double d = Double . parseDouble ( s ) ;
5
int i = ( int ) d ;
6
byte b = 87;
7
System . out . println ( i ) ;
8
}
9 }
s = 3.14
2
Em seguida, na execuo da linha 4, o mtodo parseDouble da classe Double converte a string
3.14 para um valor do tipo double. Esse valor armazenado na varivel d.
1 class Conversao {
2
public static void main ( String [] args ) {
3
String s = " 3.14 " ;
4
double d = Double . parseDouble ( s ) ;
5
int i = ( int ) d ;
6
byte b = 87;
7
System . out . println ( i ) ;
8
}
9 }
s = 3.14
d = 3.14
Na execuo da linha 5, o valor do tipo double armazenado na varivel d convertido para o tipo
int atravs de uma operao de casting. O valor obtido nessa converso armazenado na varivel
i. Como o tipo int no permite o armazenamento de casas decimais, o resultado da converso o
valor inteiro 3.
1 class Conversao {
2
public static void main ( String [] args ) {
3
String s = " 3.14 " ;
4
double d = Double . parseDouble ( s ) ;
5
int i = ( int ) d ;
6
byte b = 87;
7
System . out . println ( i ) ;
8
}
9 }
www.facebook.com/k19treinamentos
s = 3.14
d = 3.14
i=3
67
O PERADORES
68
Na execuo da linha 6, o literal 87, que do tipo int, automaticamente convertido para o tipo
byte para que possa ser armazenado na varivel b.
4
1 class Conversao {
2
public static void main ( String [] args ) {
3
String s = " 3.14 " ;
4
double d = Double . parseDouble ( s ) ;
5
int i = ( int ) d ;
6
byte b = 87;
7
System . out . println ( i ) ;
8
}
9 }
s = 3.14
d = 3.14
i=3
b = 87
1 class Conversao {
2
public static void main ( String [] args ) {
3
String s = " 3.14 " ;
4
double d = Double . parseDouble ( s ) ;
5
int i = ( int ) d ;
6
byte b = 87;
7
System . out . println ( i ) ;
8
}
9 }
s = 3.14
d = 3.14
i=3
b = 87
Os operandos das operaes aritmticas podem ser tanto de tipos primitivos numricos quanto
de tipos no primitivos numricos (ver Tabela 2.3). Ou seja, os operandos podem ser dos tipos byte,
short, char, int, long, float, double, Byte, Short, Character, Integer, Long, Float e Double.
Contudo, as operaes aritmticas so realizadas apenas com valores primitivos numricos, ou
seja, com valores dos tipos byte, short, char, int, long, float e double. Dessa forma, os valores dos
68
www.k19.com.br
69
O PERADORES
Armadilha
Como a preciso dos tipos float e double limitada, algumas operaes aritmticas
podem gerar valores incorretos. Por exemplo, o resultado da operao 0.9 0.8 deveria ser 0.1.
Contudo, na linguagem Java, nem o valor 0.9 e nem o valor 0.8 podem ser representados em float
ou double. Assim, valores aproximados so utilizados. O nmero 0.9 substitudo pelo valor
0.90000000000000002220446049250313080847263336181640625 e o nmero 0.8 substitudo
pelo valor 0.8000000000000000444089209850062616169452667236328125. Portanto, o resultado
da operao no 0.1, mas 0.09999999999999997779553950749686919152736663818359375. O
mtodo println exibe esse resultado arredondado.
1 System . out . println (0.9 - 0.8) ; // exibe : 0.09999999999999998
Nesse caso, uma alternativa para obter o valor correto seria utilizar o tipo BigDecimal, que possui
preciso arbitrria.
1 BigDecimal a = new BigDecimal ( " 0.9 " ) ;
2 BigDecimal b = new BigDecimal ( " 0.8 " ) ;
3 System . out . println ( a . subtract ( b ) ) ; // exibe : 0.1
A subtrao com valores do tipo BigDecimal realizada atravs do mtodo subtract. As operaes
com valores do tipo BigDecimal so mais lentas do que as operaes com valores do tipo float ou
do tipo double. Por isso, o tipo BigDecimal s deve ser utilizado se a preciso for realmente fundamental. Geralmente, em clculos financeiros, h a necessidade de utilizar o tipo BigDecimal.
Mais Sobre
As operaes de potenciao, raiz quadrada e valor absoluto podem ser realizadas atravs dos mtodos Math.pow, Math.sqrt e Math.abs, respectivamente.
1 System . out . println ( Math . pow (2 , 5) ) ; // exibe 32
2 System . out . println ( Math . sqrt (9) ) ;
// exibe 3
3 System . out . println ( Math . abs ( -19.3) ) ; // exibe 19.3
Cdigo Java 3.29: Potenciao, raiz quadrada e valor absoluto
Mdulo
Em Matemtica, o mdulo de um nmero x o valor numrico de x desconsiderando o seu
sinal (valor absoluto). Por exemplo, o mdulo de 2 2 e expressamos esse valor da seguinte forma:
| 2| = 2. Em Java, a palavra mdulo tem outro significado. Ela indica o resto da diviso de um
nmero por outro.
Podemos calcular o resto da diviso de um nmero por outro atravs do operador %. Por exemplo,
o resto da diviso do nmero 6 pelo nmero 5 1. Para calcul-lo, utilizamos a operao 6 % 5. Nas
operaes de mdulo, o sinal do resultado igual ao sinal do dividendo. Veja alguns exemplos abaixo.
www.facebook.com/k19treinamentos
69
O PERADORES
1
2
3
4
70
//
//
//
//
exibe : 1
exibe : 1
exibe : -1
exibe : -1
Diviso por 0
Nas operaes de diviso ou de mdulo envolvendo nmeros inteiros, se o divisor for 0, o erro de
execuo ArithmeticException ocorrer.
1 int a = 10 / 0; // Ocorrer ArithmeticException
Por outro lado, nas operaes de diviso ou mdulo envolvendo pelo menos um nmero real, o
resultado ser +Infinity, -Infinity ou NaN se o divisor for 0.
1 double b = 10.0 / 0; // O resultado ser + Infinity
2 double c = -10.0 / 0; // O resultado ser - Infinity
3 double d = 0.0 / 0;
// O resultado ser NaN
Neste caso, poderamos aplicar uma operao de casting no resultado da operao b1 + b2.
1 byte b1 = 1;
2 byte b2 = 2;
3 byte b3 = ( byte ) ( b1 + b2 ) ;
Cdigo Java 3.34: Utilizando casting
Para saber o tipo do resultado de uma operao aritmtica, devemos aplicar as seguintes regras:
Se pelo menos um dos operandos for do tipo double ou Double, o resultado ser do tipo double.
Caso contrrio, se pelo menos um dos operandos for do tipo float ou Float, o resultado ser do
tipo float.
Caso contrrio, se pelo menos um dos operandos for do tipo long ou Long, o resultado ser do
tipo long.
Caso contrrio, o resultado ser do tipo int.
70
www.k19.com.br
71
O PERADORES
byte a = 1;
short b = 2;
double c = 3.14;
int resutaldo1 = a + b ;
double resultado2 = b + c ;
double resultado3 = a + c ;
Cdigo Java 3.35: Determinando o tipo do resultado de uma operao aritmtica
Matematicamente, o resultado da operao 5/2 2.5. Contudo, no exemplo acima, o valor obtido
na diviso a / b 2. Quando ocorre uma diviso entres dois valores inteiros, a parte fracionria do
resultado descartada.
Podemos converter explicitamente um dos valores envolvidos na diviso ou at mesmo os dois
para algum tipo que aceita nmeros reais. Dessa forma, a diviso no seria inteira e a parte fracionria no seria descartada. Essas converses podem ser realizadas com operaes de casting. No
exemplo abaixo, o resultado de cada uma das operaes de diviso 2.5. Lembre-se que as operaes
de casting so realizadas antes das operaes aritmticas.
1
2
3
4
5
6
7
8
9
10
11
int a = 5;
int b = 2;
// convertendo o valor armazenado na varivel " a "
System . out . println (( double ) a / b ) ; // exibe : 2.5
// convertendo o valor armazenado na varivel " b "
System . out . println ( a / ( double ) b ) ; // exibe : 2.5
// convertendo os valores armazenados nas variveis " a " e " b "
System . out . println (( double ) a / ( double ) b ) ; // exibe : 2.5
Cdigo Java 3.37: Castings
www.facebook.com/k19treinamentos
71
O PERADORES
72
Simulao
Nessa simulao, realizaremos operaes aritmticas e operaes de casting. Alm disso, mostraremos as diferenas entre diviso inteira e diviso real.
Ao executar a classe Operacoes, a primeira linha do mtodo main ser processada. O operador %
calcular o resto da diviso entre os nmeros 13 e 4. O resultado dessa operao 1.
1
1 class Operacoes {
2
public static void main ( String [] args ) {
3
System . out . println (13 % 4) ;
4
System . out . println (10 / 4) ;
5
System . out . println (( double ) 10 / 4) ;
6
System . out . println (10 / ( double ) 4) ;
7
System . out . println (( double ) (10 / 4) ) ;
8
System . out . println (10.0 / 0) ;
9
System . out . println (0.0 / 0) ;
10
System . out . println (0 / 0) ;
11
}
12 }
1
2
O fluxo de execuo prossegue e a linha 4 ser executada. A diviso entre os nmeros inteiros
10 e 4 ser realizada com a utilizao do operador /. Como os dois operandos dessa operao so
valores inteiros, ocorre uma diviso inteira. Por isso, o resultado ser 2 e no 2.5.
1 class Operacoes {
2
public static void main ( String [] args ) {
3
System . out . println (13 % 4) ;
4
System . out . println (10 / 4) ;
5
System . out . println (( double ) 10 / 4) ;
6
System . out . println (10 / ( double ) 4) ;
7
System . out . println (( double ) (10 / 4) ) ;
8
System . out . println (10.0 / 0) ;
9
System . out . println (0.0 / 0) ;
10
System . out . println (0 / 0) ;
11
}
12 }
1
2
Em seguida, a linha 5 executada. Assim como na linha 4, o operador / ser utilizado para
calcular a diviso entre os nmeros 10 e 4. Contudo, uma operao de casting converte o literal 10,
que do tipo int, para double antes da diviso. Como pelo menos um dos operandos um valor real,
ocorrer uma diviso real. Sendo assim, o resultado ter casas decimais e ser exibido o nmero 2.5
na sada padro.
3
72
www.k19.com.br
73
O PERADORES
1 class Operacoes {
2
public static void main ( String [] args ) {
3
System . out . println (13 % 4) ;
4
System . out . println (10 / 4) ;
5
System . out . println (( double ) 10 / 4) ;
6
System . out . println (10 / ( double ) 4) ;
7
System . out . println (( double ) (10 / 4) ) ;
8
System . out . println (10.0 / 0) ;
9
System . out . println (0.0 / 0) ;
10
System . out . println (0 / 0) ;
11
}
12 }
1
2
2.5
Na sequncia, a linha 6 executada. Assim como nas linhas 4 e 5, o operador / ser utilizado
para calcular a diviso entre os nmeros 10 e 4. Antes da diviso, uma operao de casting converte o
literal 4, que do tipo int, para double. Como pelo menos um dos operandos um valor real, ocorrer
uma diviso real. Sendo assim, o resultado ser 2.5.
4
1 class Operacoes {
2
public static void main ( String [] args ) {
3
System . out . println (13 % 4) ;
4
System . out . println (10 / 4) ;
5
System . out . println (( double ) 10 / 4) ;
6
System . out . println (10 / ( double ) 4) ;
7
System . out . println (( double ) (10 / 4) ) ;
8
System . out . println (10.0 / 0) ;
9
System . out . println (0.0 / 0) ;
10
System . out . println (0 / 0) ;
11
}
12 }
1
2
2.5
2.5
Continuando, a linha 7 executada. Assim como nas linhas 4, 5 e 6, o operador / ser utilizado
para calcular a diviso entre os nmeros 10 e 4. Note que essa operao foi delimitada com parnteses. Sendo assim, a diviso ser executada antes da operao de casting. Como os dois operandos
dessa diviso so nmeros inteiros, o resultado no ter casas decimais. Sendo assim, esse resultado
ser 2. Em seguida, o casting transformar esse valor inteiro em real. Consequentemente, ser exibido o nmero 2.0 na sada padro.
5
1 class Operacoes {
2
public static void main ( String [] args ) {
3
System . out . println (13 % 4) ;
4
System . out . println (10 / 4) ;
5
System . out . println (( double ) 10 / 4) ;
6
System . out . println (10 / ( double ) 4) ;
7
System . out . println (( double ) (10 / 4) ) ;
8
System . out . println (10.0 / 0) ;
9
System . out . println (0.0 / 0) ;
10
System . out . println (0 / 0) ;
11
}
12 }
www.facebook.com/k19treinamentos
73
O PERADORES
74
1
2
2.5
2.5
2.0
A prxima linha que ser executada a 8. Nessa linha, a diviso entre o literal 10.0, que do tipo
double, e o literal 0, que do tipo int, realizada com a utilizao do operador /. Como pelo menos
um dos operandos um valor real, ocorrer a diviso real. Sendo assim, o resultado dessa operao
Infinity.
1 class Operacoes {
2
public static void main ( String [] args ) {
3
System . out . println (13 % 4) ;
4
System . out . println (10 / 4) ;
5
System . out . println (( double ) 10 / 4) ;
6
System . out . println (10 / ( double ) 4) ;
7
System . out . println (( double ) (10 / 4) ) ;
8
System . out . println (10.0 / 0) ;
9
System . out . println (0.0 / 0) ;
10
System . out . println (0 / 0) ;
11
}
12 }
1
2
2.5
2.5
2.0
Infinity
A prxima linha que ser executada a 9. Nessa linha, a diviso entre o literal 0.0, que do tipo
double, e o literal 0, que do tipo int, realizada com a utilizao do operador /. Como pelo menos
um dos operandos um valor real, ocorrer a diviso real. Sendo assim, o resultado dessa operao
NaN.
1 class Operacoes {
2
public static void main ( String [] args ) {
3
System . out . println (13 % 4) ;
4
System . out . println (10 / 4) ;
5
System . out . println (( double ) 10 / 4) ;
6
System . out . println (10 / ( double ) 4) ;
7
System . out . println (( double ) (10 / 4) ) ;
8
System . out . println (10.0 / 0) ;
9
System . out . println (0.0 / 0) ;
10
System . out . println (0 / 0) ;
11
}
12 }
1
2
2.5
2.5
2.0
Infinity
NaN
Continuando a execuo, a linha 10 executada e a diviso do literal 0, que do tipo int, por
ele mesmo calculada com o operador /. Essa operao considerada uma diviso inteira porque os dois operandos so valores inteiros. Uma diviso inteira por 0 gera um erro de execuo, o
ArithmeticException.
8
74
www.k19.com.br
75
O PERADORES
1 class Operacoes {
2
public static void main ( String [] args ) {
3
System . out . println (13 % 4) ;
4
System . out . println (10 / 4) ;
5
System . out . println (( double ) 10 / 4) ;
6
System . out . println (10 / ( double ) 4) ;
7
System . out . println (( double ) (10 / 4) ) ;
8
System . out . println (10.0 / 0) ;
9
System . out . println (0.0 / 0) ;
10
System . out . println (0 / 0) ;
11
}
12 }
1
2
2.5
2.5
2.0
Infinity
NaN
Exception in thread " main " java . lang . ArithmeticException : / by zero
at Aritmetica . main ( Aritmetica . java :7)
Lembrando que o menor valor aceito pelo tipo long Long.MIN_VALUE e o maior Long.MAX_VALUE, as
operaes do exemplo abaixo causam underflow e overflow.
1 System . out . println ( Long . MIN_VALUE - 1) ; // underflow : 9223372036854775807
2 System . out . println ( Long . MAX_VALUE + 1) ; // overflow : -9223372036854775808
Nas operaes aritmticas envolvendo valores do tipo float ou double, tambm pode ocorrer overflow ou underflow. No overflow, o resultado pode ser inifinito. No underflow, o resultado pode ser
0.
www.facebook.com/k19treinamentos
75
O PERADORES
1
2
3
4
5
6
7
8
9
76
//
//
//
//
overflow : Infinity
overflow : - Infinity
underflow : 0.0
underflow : -0.0
//
//
//
//
overflow : Infinity
overflow : - Infinity
underflow : 0.0
underflow : -0.0
Armadilha
Considere um carto de memria com velocidade de gravao mxima igual a 270
MB/s. Essa velocidade equivale a (270 * 1000 * 1000 * 8) bits/s, ou seja, 2160000000 bits/s. Esse
valor no pode ser armazenado em uma varivel do tipo int, mas pode ser armazenado em uma
varivel do tipo long.
No exemplo abaixo, o valor da expresso 270 * 1000 * 1000 * 8 foi armazenado na varivel velocidade,
que do tipo long. Como essa expresso composta somente por valores do tipo int, o resultado
dela do tipo int. O valor 2160000000 no pode ser representado com o tipo int. Dessa forma,
ocorre overflow e o resultado 2134967296.
1 long velocidade = 270 * 1000 * 1000 * 8; // -2134967296
Para resolver esse problema, os valores da expresso devem ser do tipo long para que o resultado
seja do tipo long e no ocorra overflow.
1 long velocidade = 270 L * 1000 L * 1000 L * 8 L ; // 2160000000
Importante
Em Java, o overflow ou o underflow no geram erros formais. Em outras palavras, a
linguagem Java no possui nenhum mecanismo para avisar o programador que um desses problemas ocorreu. Dessa forma, o programador deve estar sempre atento para evitar erros de
lgica causados pelo overflow ou pelo underflow.
Simulao
Nessa simulao, mostraremos um exemplo de overflow e de underflow.
Ao executar a classe OverflowUnderflow, a primeira linha do mtodo main ser processada. Nessa
linha, o valor 1 adicionado ao maior valor do tipo int. Como o resultado dessa operao ultrapassa
o valor mximo do tipo int, ocorre um overflow e o resultado dessa operao ser 2147483648.
1
1 class OverflowUnderflow {
2
public static void main ( String [] args ) {
3
System . out . println ( Integer . MAX_VALUE + 1) ;
4
System . out . println ( Integer . MIN_VALUE - 1) ;
5
}
6 }
76
www.k19.com.br
77
O PERADORES
-2147483648
Em seguida, a linha 4 executada. Nessa linha, o valor 1 subtrado do menor valor do tipo int.
Como o resultado dessa operao menor do que o limite mnimo do tipo int, ocorre um underflow
e o resultado dessa operao ser 2147483647.
2
1 class OverflowUnderflow {
2
public static void main ( String [] args ) {
3
System . out . println ( Integer . MAX_VALUE + 1) ;
4
System . out . println ( Integer . MIN_VALUE - 1) ;
5
}
6 }
-2147483648
2147483647
77
O PERADORES
78
No exemplo abaixo, o operador + foi aplicado a valores do tipo int e do tipo String. Nesses casos,
os valores do tipo int so automaticamente convertidos para String e a concatenao realizada.
Analogamente, essa converso ocorrer toda vez que o operador + for aplicado a valores que no so
do tipo String com valores que so do tipo String.
1
2
3
4
5
Simulao
Nessa simulao, realizaremos operaes de concatenao.
Ao executar a classe Concatenacoes, a primeira linha do mtodo main ser processada. Nessa linha,
uma varivel chamada s do tipo String ser associada string K.
1
78
www.k19.com.br
79
O PERADORES
1 class Concatenacoes {
2
public static void main ( String [] args ) {
3
String s = " K " ;
4
s = " Cursos " + s ;
5
s = s + 19;
6
System . out . println ( s ) ;
7
}
8 }
s = K
Em seguida, a linha 4 ser executada e a string Cursos ser concatenada esquerda da string
K. Essa concatenao produz a string Cursos K. Essa string associada varivel s atravs do
operador =.
2
1 class Concatenacoes {
2
public static void main ( String [] args ) {
3
String s = " K " ;
4
s = " Cursos " + s ;
5
s = s + 19;
6
System . out . println ( s ) ;
7
}
8 }
s = Cursos K
Na sequncia, a linha 5 executada. O literal 19, que do tipo int, convertido automaticamente
para String. Em seguida, a string 19 concatenada direita da string Cursos K. Essa concatenao
produz a string Cursos K19. Essa string associada varivel s atravs do operador =.
3
1 class Concatenacoes {
2
public static void main ( String [] args ) {
3
String s = " K " ;
4
s = " Cursos " + s ;
5
s = s + 19;
6
System . out . println ( s ) ;
7
}
8 }
s = Cursos K19
Por fim, a linha 6 ser executada e a mensagem Cursos K19 ser exibida na sada padro.
1 class Concatenacoes {
2
public static void main ( String [] args ) {
3
String s = " K " ;
4
s = " Cursos " + s ;
5
s = s + 19;
6
System . out . println ( s ) ;
7
}
8 }
s = Cursos K19
Cursos K19
www.facebook.com/k19treinamentos
79
O PERADORES
80
3.12 Operadores Unrios + e O operador unrio + preserva o sinal dos valores numricos enquanto o operador unrio - inverte
o sinal desses valores. O resultado gerado por esses operadores segue as seguintes regras.
O resultado do tipo int quando o operando do tipo byte, short, char, int, Byte, Short, Character
ou Integer.
O resultado do tipo long quando o operando do tipo long ou Long.
O resultado do tipo float quando o operando do tipo float ou Float.
O resultado do tipo double quando o operando do tipo double ou Double.
1 System . out . println (+1) ; // exibe : 1
2 System . out . println ( -1) ; // exibe : -1
int valor = 1;
valor += 2; // valor = 3
valor -= 1; // valor = 2
valor *= 6; // valor = 12
valor /= 3; // valor = 4
valor %= 3; // valor = 1
valor ++; // valor = 2
valor - -; // valor = 1
Cdigo Java 3.63: Exemplo de uso dos operadores de atribuio
80
www.k19.com.br
81
O PERADORES
Os operadores de atribuio +=, -=, *=, /=, %=, ++ e -- so chamados de operadores compostos,
pois alm de modificar o valor de uma varivel, eles realizam uma operao aritmtica. Nas instrues com os operadores de atribuio compostos, h uma operao de casting implcita. Assim, as
instrues do exemplo acima so equivalentes s instrues do cdigo abaixo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int valor = 1;
valor = ( int ) ( valor + 2) ; // valor = 3
valor = ( int ) ( valor - 1) ; // valor = 2
valor = ( int ) ( valor * 6) ; // valor = 12
valor = ( int ) ( valor / 3) ; // valor = 4
valor = ( int ) ( valor % 3) ; // valor = 1
valor = ( int ) ( valor + 1) ; // valor = 2
valor = ( int ) ( valor - 1) ; // valor = 1
Cdigo Java 3.64: Utilizando os operadores aritmticos
Mais Sobre
Qual o resultado de uma operao de atribuio? O resultado de uma operao de
atribuio o valor do segundo operando. No exemplo abaixo, a operao a = 1 devolve o valor
1 do tipo int.
1 int a ;
2
3 System . out . println ( a = 1) ; // exibe : 1
Cdigo Java 3.65: Utilizando os operadores aritmticos
Simulao
Nessa simulao, mostraremos um exemplo de utilizao dos operadores de atribuio.
Ao executar a classe Atribuicao, a primeira linha do mtodo main ser processada. Nessa linha,
uma varivel chamada a do tipo int declarada e inicializada com o valor 7.
1
1 class Atribuicao {
2
public static void main ( String [] args ) {
3
int a = 7;
4
a += 3;
5
a *= 2;
6
a ++;
7
a -= 1.82;
8
System . out . println ( a ) ;
9
}
10 }
www.facebook.com/k19treinamentos
a=7
81
O PERADORES
82
1 class Atribuicao {
2
public static void main ( String [] args ) {
3
int a = 7;
4
a += 3;
5
a *= 2;
6
a ++;
7
a -= 1.82;
8
System . out . println ( a ) ;
9
}
10 }
a = 10
3
Na sequncia, a linha 5 executada. Utilizando o operador *=, o valor armazenado na varivel a
multiplicado por 2. O resultado dessa operao armazenado na prpria varivel a. Dessa forma,
aps a execuo dessa linha, o valor contido nessa varivel ser 20.
1 class Atribuicao {
2
public static void main ( String [] args ) {
3
int a = 7;
4
a += 3;
5
a *= 2;
6
a ++;
7
a -= 1.82;
8
System . out . println ( a ) ;
9
}
10 }
a = 20
4
Agora, a linha 6 executada. Utilizando o operador ++, o valor 1 adicionado ao valor armazenado na varivel a. Dessa forma, depois dessa linha, o valor contido nessa varivel ser 21.
1 class Atribuicao {
2
public static void main ( String [] args ) {
3
int a = 7;
4
a += 3;
5
a *= 2;
6
a ++;
7
a -= 1.82;
8
System . out . println ( a ) ;
9
}
10 }
a = 21
Continuando a execuo, a linha 7 ser processada. A operao a -= 1.82 equivalente expresso a = (int)(a - 1.82). O resultado da subtrao a -1.82 19.18. O casting desse valor produz o
nmero 19, que armazenado na varivel a.
5
82
www.k19.com.br
83
O PERADORES
1 class Atribuicao {
2
public static void main ( String [] args ) {
3
int a = 7;
4
a += 3;
5
a *= 2;
6
a ++;
7
a -= 1.82;
8
System . out . println ( a ) ;
9
}
10 }
a = 19
1 class Atribuicao {
2
public static void main ( String [] args ) {
3
int a = 5;
4
a += 3;
5
a *= 2;
6
a ++;
7
a -= 1.82;
8
System . out . println ( a ) ;
9
}
10 }
a = 19
19
int valor = 2;
boolean b ;
b = ( valor == 2) ;
b = ( valor != 2) ;
b = ( valor < 2) ;
b = ( valor <= 2) ;
b = ( valor > 1) ;
b = ( valor >= 1) ;
//
//
//
//
//
//
b
b
b
b
b
b
=
=
=
=
=
=
true
false
false
true
true
true
Os operandos das operaes <, <=, > e >= podem ser tanto valores de tipos primitivos numricos
quanto valores de tipos no primitivos numricos (ver Tabela 2.3). Se um operando for de um tipo
www.facebook.com/k19treinamentos
83
O PERADORES
84
no primitivo numrico, ento, antes da comparao ser efetuada, o seu valor convertido para o
tipo primitivo numrico correspondente atravs do autoboxing.
1
2
3
4
5
6
7
8
9
int i = 1;
long l = 2 L ;
Float f = 3.0 F ;
Double d = 4.0;
boolean b ;
b = ( i < l ) ; //
b = ( l <= f ) ; //
b = ( f > d ) ; //
b = ( d >= i ) ; //
b
b
b
b
=
=
=
=
true
true
false
true
Mais Sobre
Nas operaes com ==, <, <=, > e >=, se pelo menos um dos operandos for NaN ento
o resultado false. Por outro lado, com o operador !=, se um dos operandos for NaN ento o
resultado true.
Mais Sobre
O valor 0 considerado igual ao valor +0.
Simulao
Nessa simulao, mostraremos um exemplo de utilizao dos operadores de comparao.
1
Ao executar a classe Comparacoes, a primeira linha do mtodo main ser processada. Nessa linha,
uma varivel chamada a do tipo int declarada e inicializada com o valor 1.
1 class Comparacoes {
2
public static void main ( String [] args ) {
3
int a = 1;
4
System . out . println ( a == 1) ;
5
System . out . println ( a > 5) ;
6
System . out . println ( a <= 3) ;
7
}
8 }
84
a=1
www.k19.com.br
85
O PERADORES
Na sequncia, a linha 4 ser executada. O operador == foi utilizado para verificar se o valor
armazenado na varivel a igual a 1. Como a varivel a armazena o valor 1, essa operao devolve
true.
2
1 class Comparacoes {
2
public static void main ( String [] args ) {
3
int a = 1;
4
System . out . println ( a == 1) ;
5
System . out . println ( a > 5) ;
6
System . out . println ( a <= 3) ;
7
}
8 }
a=1
true
3
Na sequncia, a linha 5 ser executada. O operador > foi utilizado para verificar se o valor armazenado na varivel a maior do que 5. Como a varivel a armazena o valor 1, essa operao devolve
false.
1 class Comparacoes {
2
public static void main ( String [] args ) {
3
int a = 1;
4
System . out . println ( a == 1) ;
5
System . out . println ( a > 5) ;
6
System . out . println ( a <= 3) ;
7
}
8 }
a=1
true
false
4 Em seguida, a linha 6 ser executada. O operador <= foi utilizado para verificar se o valor armazenado na varivel a menor ou igual a 3. Como a varivel a armazena o valor 1, essa operao devolve
true.
1 class Comparacoes {
2
public static void main ( String [] args ) {
3
int a = 1;
4
System . out . println ( a == 1) ;
5
System . out . println ( a > 5) ;
6
System . out . println ( a <= 3) ;
7
}
8 }
a=1
true
false
true
www.facebook.com/k19treinamentos
85
O PERADORES
86
Como verificar se o jogador ganhou? Podemos utilizar um operador lgico. Os operadores lgicos
da linguagem Java so:
& (E simples)
&& (E duplo)
| (OU simples)
|| (OU duplo)
(OU exclusivo)
Os operandos de uma operao lgica so valores do tipo boolean ou Boolean. Valores do tipo
Boolean so convertidos para boolean atravs do autoboxing. O resultado de uma operao lgica
A tabela verdade uma forma prtica de visualizar o resultado dos operadores lgicos. Veja a
seguir a tabela verdade dos operadores & e &&.
a<3
V
V
F
F
b>4
V
F
V
F
a<3&b>4
V
F
F
F
Considere agora uma mudana nas regras do jogo. Suponha que o jogador ganha se no primeiro lanamento o resultado for menor do que 3 ou no segundo lanamento o resultado for
maior do que 4. Para verificar se o jogador ganha o jogo, podemos usar os operadores OU. Os
operadores | (OU simples) e || (OU duplo) devolvem true se pelo menos uma das condies
for true.
1
2
3
4
Tambm, podemos utilizar a tabela verdade para visualizar o resultado dos operadores | e ||.
86
www.k19.com.br
87
O PERADORES
a<3
V
V
F
F
b>4
V
F
V
F
a<3|b>4
V
V
V
F
a < 3 || b > 4
V
V
V
F
Agora, suponha que o jogador ganha o jogo se uma das situaes abaixo ocorrer:
(i) No primeiro lanamento, o resultado menor do que 3 e, no segundo lanamento, o
resultado no maior do que 4.
(ii) No primeiro lanamento, o resultado no menor do que 3 e, no segundo lanamento, o
resultado maior do que 4.
Nesse tipo de jogo, podemos utilizar o operador OU exclusivo para verificar se o jogador
vencedor. O operador (OU exclusivo) devolve true se e somente se exatamente uma das condies for true (ou seja, uma delas deve ser true e a outra deve ser false).
1 int a = ( int ) ( Math . random () * 6 + 1) ;
2 int b = ( int ) ( Math . random () * 6 + 1) ;
3 System . out . println ( a < 3 ^ b > 4) ;
Cdigo Java 3.80: Exemplo de uso do operador
b>4
V
F
V
F
a<3b>4
F
V
V
F
Os operadores & e && produzem o mesmo resultado. Ento, qual a diferena entre eles? O operador & sempre avalia as duas condies. Por outro lado, o operador && no avalia a segunda condio
se o valor da primeira condio for false. De fato, esse comportamento plausvel, pois se o valor da
primeira condio for false, o resultado da operao false independentemente do valor da segunda
condio. Dessa forma, podemos simplificar a tabela verdade do operador &&.
a<3
V
V
F
b>4
V
F
?
Analogamente, podemos deduzir a diferena entre os operadores | e ||. As duas condies sempre so avaliadas quando utilizamos o operador |. Agora, quando utilizamos o operador ||, a segunda condio avaliada se e somente se o valor da primeira condio for false. Realmente, esse
www.facebook.com/k19treinamentos
87
O PERADORES
88
comportamento aceitvel, pois o resultado da operao true quando o valor da primeira condio for true independentemente do valor da segunda condio. Dessa forma, podemos simplificar a
tabela verdade do operador ||.
a<3
V
F
F
b>4
?
V
F
a < 3 || b > 4
V
V
F
int i = 10;
System . out . println ( i >
System . out . println ( i >
System . out . println ( i >
System . out . println ( i >
System . out . println ( i ) ;
Simulao
Nessa simulao, mostraremos um exemplo de utilizao dos operadores lgicos.
Ao executar a classe Logicos, a primeira linha do mtodo main ser processada. Nessa linha, uma
varivel chamada a do tipo int declarada e inicializada com o valor 2.
1
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
Na sequncia, a linha 4 ser executada e uma varivel chamada b do tipo int declarada e
inicializada com o valor 10.
2
88
www.k19.com.br
89
O PERADORES
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
Agora, na linha 5, a operao a > 0 ser executada. Como o valor armazenado na varivel a 2,
o resultado dessa operao ser true.
3
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
Em seguida, ainda na linha 5, o operador || devolver true sem avaliar o lado direito (b < 0) pois,
como vimos no passo anterior, o lado esquerdo (a > 0) devolveu true.
4
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
Para finalizar a linha 5, o resultado da expresso a > 0 || b < 0, que true, ser exibido na sada
padro.
5
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
true
6
Em seguida, na linha 6, a operao a == 2 ser executada. Como a varivel a armazena o valor 2,
o resultado dessa operao true.
www.facebook.com/k19treinamentos
89
O PERADORES
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
90
a=2
b = 10
true
Na sequncia, ainda na linha 6, como o lado esquerdo (a == 2) do operador && true, o lado
direito (b != 10) desse operador deve ser avaliado. Como a varivel b armazena o valor 10, o resultado
de b != 10 false.
7
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
true
Continuando na linha 6, o operador && devolver o valor false pois, como vimos no passo anterior, o lado direito (b != 10) devolveu false.
8
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
true
Para finalizar a linha 6, o resultado da expresso a == 2 && b != 10, que false, ser exibido na
sada padro.
9
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
true
false
90
www.k19.com.br
91
O PERADORES
Agora, na linha 7, a operao a <= 0 ser executada. Como a varivel a armazena o valor 2, o
resultado dessa operao false.
10
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
true
false
Em seguida, ainda linha 7, a operao b >= 1 ser executada. Como a varivel b armazena o valor
10, o resultado dessa operao true.
11
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
true
false
Continuando na linha 7, o operador devolver true pois, como vimos nos passos anteriores, o
lado esquerdo (a <= 0) false e o lado direito (b >= 1) true.
12
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
a=2
b = 10
true
false
Para finalizar a linha 7, o resultado da expresso a <= 0 b >= 1, que true, ser exibido na sada
padro.
13
1 class Logicos {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a > 0 || b < 0) ;
6
System . out . println ( a == 2 && b != 10) ;
7
System . out . println ( a <= 0 ^ b >= 1) ;
8
}
9 }
www.facebook.com/k19treinamentos
a=2
b = 10
91
O PERADORES
92
true
false
true
O programa deve exibir a mensagem aprovado se nota de um aluno for maior ou igual a 5 e
reprovado se a nota for menor do que 5. Esse problema pode ser resolvido com o operador ternrio.
nota >= 5 ? aprovado : reprovado
Condio
Valor 1
Valor 2
Quando a condio (nota >= 5) true, o operador ternrio devolve o primeiro valor ("aprovado").
Caso contrrio, devolve o segundo valor ("reprovado"). Podemos guardar o resultado do operador
ternrio em uma varivel ou simplesmente exibi-lo.
1 String resultado = nota >= 5 ? " aprovado " : " reprovado " ;
2 System . out . println ( nota >= 5 ? " aprovado " : " reprovado " ) ;
No exemplo anterior, o operador ternrio foi utilizado com valores do tipo String. Contudo, podemos utiliz-lo com qualquer tipo de valor. Veja o exemplo a seguir.
1 int i = nota >= 5 ? 1 : 2;
2 double d = nota >= 5 ? 0.1 : 0.2;
92
www.k19.com.br
93
O PERADORES
Simulao
Nessa simulao, mostraremos um exemplo de utilizao do operador ternrio e do operador de
negao.
1
Ao executar a classe TernarioNegacao, a primeira linha do mtodo main ser processada. Nessa
linha, uma varivel chamada nota do tipo double declarada e inicializada com o valor 6.3.
nota = 6.3
Em seguida, na linha 4, a operao nota >= 5 executada. Como a varivel nota armazena o valor
6.3, o resultado dessa operao true.
2
nota = 6.3
Ainda na linha 4, o operador de negao aplicado ao resultado da operao nota >= 5. Como
vimos no passo anterior, essa operao devolveu true. Dessa forma, a expresso !(nota >= 5) devolve
false. Esse valor armazenado na varivel reprovado.
3
nota = 6.3
reprovado = false
Agora, na linha 5, o operador ternrio utilizado. Como o valor armazenado na varivel reprovado
false, esse operador devolve APROVADO. Essa string associada varivel s.
4
www.facebook.com/k19treinamentos
93
O PERADORES
94
nota = 6.3
reprovado = false
s = APROVADO
nota = 6.3
reprovado = false
s = APROVADO
APROVADO
1 int i = 10;
2 ++ i ; // pr incremento
3 --i ; // pr decremento
Cdigo Java 3.106: Pr incremento e pr decremento
94
www.k19.com.br
95
O PERADORES
1 int i = 10;
2 System . out . println ( i ++ == 10) ; // exibe : true
3 System . out . println ( i ) ; // exibe : 11
Observe que o operador ++ foi utilizado nas expresses do exemplo acima em conjunto com o
operador ==. Como dois operadores foram utilizados na mesma expresso, voc pode ter dvida em
relao a quem ser executado primeiro. O incremento com o operador ++ ser realizado antes ou
depois da comparao com o operador ==?
O incremento ocorrer antes da comparao. Contudo, como o operador ++ foi utilizado na forma
de ps incremento, a operao i++ devolver o valor antigo da varivel i. Dessa forma, a comparao
utilizar o valor armazenado na varivel i antes do incremento.
Analogamente, a comparao utilizaria o valor antigo da varivel i se o operador -- fosse utilizado
na forma de ps decremento.
Agora, considere a utilizao do operador ++ na forma de pr incremento.
1 int i = 10;
2 System . out . println (++ i == 10) ; // exibe : false
3 System . out . println ( i ) ; // exibe : 11
Nesse ltimo exemplo, a operao ++i devolver o valor novo da varivel i. Dessa forma, a comparao utilizar o valor armazenado na varivel i depois do incremento.
Analogamente, a comparao utilizaria o valor novo da varivel i se o operador -- fosse utilizado
na forma de pr decremento.
int i = 10;
int j = 10;
System . out . println ( i ++ == i - 1) ;
System . out . println (++ j == j ) ;
www.facebook.com/k19treinamentos
95
O PERADORES
96
Simulao
Nessa simulao, mostraremos um exemplo de utilizao dos operadores de incremento e decremento.
Ao executar a classe IncrementoDecremento, a primeira linha do mtodo main ser processada. Nessa
linha, uma varivel chamada a do tipo int declarada e inicializada com o valor 2.
1
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println (++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=2
Em seguida, a linha 4 ser executada. Nessa linha, uma varivel chamada b do tipo int declarada e inicializada com o valor 10.
2
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println (++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=2
b = 10
Em seguida, na linha 5, a operao a++ ser executada. Dessa forma, a varivel a passa a armazenar o valor 3. Como o operador ++ foi utilizado na forma de ps incremento, essa operao devolve o
valor antigo da varivel a, ou seja, devolve 2.
3
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println (++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=3
b = 10
4
Agora, ainda na linha 5, a operao de igualdade a++ == 2 ser executada para verificar se o
resultado da operao a++ igual a 2. No passo anterior, vimos que a operao a++ devolveu 2. Dessa
forma, o resultado da expresso a++ == 2 ser true.
96
www.k19.com.br
97
O PERADORES
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println (++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=3
b = 10
5 Continuando na linha 5, o operador lgico || devolver true sem avaliar o lado direito (b++ == 10)
porque, como vimos no passo anterior, o lado esquerdo (a++ == 2) devolveu true.
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println (++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=3
b = 10
Para finalizar a linha 5, o valor da expresso a++ == 2 || b++ == 10, que true, ser exibido na
sada padro.
6
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println (++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=3
b = 10
true
7
Em seguida, na linha 6, a operao ++a ser avaliada. Dessa forma, o valor armazenado na
varivel a passa a ser 4. Como o operador ++ foi utilizado na forma de pr incremento, a operao ++a
devolve o novo valor da varivel a, ou seja, devolve 4.
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println ( ++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
www.facebook.com/k19treinamentos
a=4
b = 10
97
O PERADORES
98
true
Na sequncia, ainda na linha 6, a operao de desigualdade ++a < 4 ser avaliada. No passo
anterior, vimos que a operao ++a devolveu 4. Dessa forma, a expresso ++a < 4 devolver false.
8
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println ( ++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=4
b = 10
true
Continuando na linha 6, o operador && devolver false sem avaliar o lado direito (--b == 10) pois,
como vimos no passo anterior, o lado esquerdo (++a < 4) devolveu false.
9
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println ( ++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=4
b = 10
true
Para finalizar a linha 6, o resultado da expresso ++a < 4 && --b == 10, que false, ser exibido
na sada padro.
10
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println (++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=4
b = 10
true
false
11
98
www.k19.com.br
99
O PERADORES
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println (++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=4
b = 10
true
false
4
12
Por fim, ao executar a linha 8, o valor da varivel b ser exibido na sada padro.
1 class IncrementoDecremento {
2
public static void main ( String [] args ) {
3
int a = 2;
4
int b = 10;
5
System . out . println ( a ++ == 2 || b ++ == 10) ;
6
System . out . println (++ a < 4 && --b == 10) ;
7
System . out . println ( a ) ;
8
System . out . println ( b ) ;
9
}
10 }
a=4
b = 10
true
false
4
10
www.facebook.com/k19treinamentos
99
O PERADORES
100
Precedncia
1
Operador
++
-++
--
+
!
(tipo)
*
/
%
+
<
<=
>
>=
6
7
8
9
10
11
12
==
!=
&
|
&&
||
? :
=
+=
13
-=
*=
/=
%=
Operao
Ps incremento
Ps decremento
Pr incremento
Pr decremento
Mais unrio
Menos unrio
Negao
Casting
Multiplicao
Diviso
Mdulo
Adio
Subtrao
Menor
Menor ou igual
Maior
Maior ou igual
Igualdade
Diferena
E simples
Ou exclusivo
Ou simples
E duplo
Ou duplo
Ternrio
Atribuio
Incremental
Decremental
Multiplicativa
Divisria
Modular
Desempate
Direita Esquerda
Direita Esquerda
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Direita Esquerda
Direita Esquerda
Importante
O fato de um operador ter precedncia sobre outro no significa que ele ser executado
primeiro. Por exemplo, de acordo com a Tabela 3.9, o operador de pr incremento (++) possui
precedncia sobre o operador de diviso (/). Sabendo disso, considere o cdigo abaixo.
1 class DivisaoPorZero {
2
public static void main ( String [] args ) {
3
int x = 0;
4
System . out . println (1 / x + ++ x ) ;
5
}
6 }
Cdigo Java 3.122: DivisaoPorZero.java
Se a ordem de processamento das operaes de uma expresso fosse a mesma da ordem indu-
100
www.k19.com.br
101
O PERADORES
zida pela precedncia, a operao ++x seria executada antes da operao de diviso. Nesse caso,
o cdigo acima no apresentaria erro de execuo e exibiria o valor 1.
Contudo, na expresso 1 / x + ++x, a primeira operao realizada a de diviso. Assim, esse
cdigo produz um erro de execuo causado por uma diviso por zero.
De acordo com a Tabela 3.9, o operador de multiplicao tem precedncia sobre o operador de
adio. Dessa forma, a multiplicao tem maior prioridade do que a adio. Sendo assim, a expresso 2 + 3 5 equivalente expresso (2 + (3 5)). Portanto, o resultado dessa expresso 17.
Agora, considere a expresso 1 1 + 1. Se a operao de subtrao for executada antes da adio,
o resultado ser 1. Por outro lado, se a adio for efetuada antes da subtrao, o resultado ser 1.
Nessa expresso, todos os operadores possuem a mesma precedncia. Nesse caso, devemos nos orientar pela ltima coluna da Tabela 3.9 para determinar qual operador tem maior prioridade. Como
o desempate desses operadores realizado da esquerda para a direita, a subtrao tem maior prioridade do que a adio nessa expresso em particular. Portanto, a expresso 1 1 + 1 equivalente
expresso ((1 1) + 1). Logo, o resultado dessa expresso 1.
Ento, para eliminar ambiguidades em uma expresso, devemos acrescentar parnteses de acordo
com a prioridade dos operadores. Vamos exemplificar essa tarefa com a seguinte expresso, onde os
operadores esto destacados com a cor vermelha.
1 + 7 * 3 / 4 / (double)(int)x - y
As operaes de casting possuem maior precedncia nessa expresso. De acordo com a Tabela 3.9, quando h mais de uma operao de casting, a operao mais direita possui prioridade
sobre as outras. Dessa forma, devemos adicionar parnteses para envolver essa operao.
1 + 7 * 3 / 4 / (double)((int)x) - y
Considerando os operadores restantes (na cor vermelha), a outra operao de casting possui prioridade. Assim, ela deve ser envolvida com parnteses.
1 + 7 * 3 / 4 /
((double)((int)x))
- y
1 +
(7
* 3) / 4 / ((double)((int)x)) - y
1 +
((7
* 3) / 4) / ((double)((int)x)) - y
101
O PERADORES
102
1 +
(((7
* 3) / 4) / ((double)((int)x))) - y
Agora, restam os operadores de adio e de subtrao. Como o operador de adio est mais
esquerda, ele tem prioridade.
(1
+ (((7 * 3) / 4) / ((double)((int)x)))) - y
((1
+ (((7 * 3) / 4) / ((double)((int)x)))) - y)
Ao final desse processo, obtemos uma expresso sem ambiguidade. Agora, basta processar as
operaes de acordo com a seguinte regra: executar sempre o par de parnteses interno mais esquerda at o valor da expresso ser obtido. Um par de parnteses formado por um abre parnteses e um fecha parnteses. Dizemos que um par de parnteses interno se ele no contm
parnteses. No exemplo abaixo, os trs pares de parnteses em destaque so internos.
( ( )
Suponha que as variveis x e y sejam do tipo double e armazenem os valores 4.57 e 2.25, respectivamente. O par de parnteses interno mais esquerda envolve a expresso 7 * 3.
((1 + (((7 * 3) / 4) / ((double)((int)x)))) - y)
Como essa uma diviso entre dois valores inteiros, o resultado dessa expresso 5.
((1 + (5 / ((double)((int)x)))) - y)
102
www.k19.com.br
103
O PERADORES
((1 + (5 /
((double)4)))
- y)
((1 + (5 /
4.0))
- y)
((1 +
(5
/ 4.0)) - y)
((1 +
1.25)
- y)
Como essa expresso composta por um nmero do tipo int e um nmero do tipo double, o valor
dessa expresso 2.25.
(2.25 - y)
(2.25
- y)
0.0
www.facebook.com/k19treinamentos
103
O PERADORES
104
length
O mtodo length da classe String devolve a quantidade de caracteres (comprimento) de uma
string.
1 String s = " Rafael Cosentino " ;
2
3 int length = s . length () ;
4
5 System . out . println ( length ) ; // exibe : 16
charAt
O mtodo charAt da classe String recebe um nmero inteiro como parmetro. Esse parmetro
indica a posio de um caractere em uma string. Esse mtodo devolve o caractere nessa posio.
O argumento deve ser um nmero entre zero e o comprimento da string menos um. Um erro de
execuo ocorrer se um nmero fora desse intervalo for passado como argumento. Note que um
erro de execuo ocorrer se esse mtodo for utilizado com a string vazia.
1
2
3
4
5
6
7
8
9
contains
O mtodo contains da classe String verifica se uma determinada sequncia de caracteres est
contida em uma string. Esse mtodo recebe como parmetro uma sequncia de caracteres e devolve
true se e somente se essa sequncia est contida em uma determinada string.
No exemplo abaixo, o mtodo contains aplicado string cuja referncia est armazenada na
varivel s. Como essa string possui a sequncia de caracteres Objetos, a instruo da linha 6 exibe
true. Como essa string no contm a sequncia de caracteres objetos, a instruo da linha 7 exibe
false.
1 String s = " K11 - Orientao a Objetos em Java " ;
2
3 boolean resultado1 = s . contains ( " Objetos " ) ;
4 boolean resultado2 = s . contains ( " objetos " ) ;
104
www.k19.com.br
105
O PERADORES
5
6 System . out . println ( resultado1 ) ; // exibe : true
7 System . out . println ( resultado2 ) ; // exibe : false
endsWith
possvel verificar se uma string termina com uma determinada sequncia de caracteres. Para
isso, podemos usar o mtodo endsWith da classe String. Esse mtodo recebe uma sequncia de caracteres como parmetro. Ele devolve true se e somente se uma determinada string termina com essa
sequncia de caracteres.
No exemplo a seguir, o mtodo endsWith foi aplicado string cuja referncia est armazenada na
varivel s. Como essa string termina com Java, a instruo da linha 6 exibe true. Como essa string
no termina com Objetos, a instruo da linha 7 exibe false.
1
2
3
4
5
6
7
startsWith
possvel tambm verificar se uma string comea com uma determinada sequncia de caracteres. Podemos fazer isso com o mtodo startsWith da classe String. Esse mtodo recebe uma sequncia de caracteres como parmetro. Ele devolve true se e somente se uma determinada string comea
com essa sequncia de caracteres.
No exemplo abaixo, o mtodo startsWith aplicado string cuja referncia est armazenada na
varivel s. Como essa string no comea com Java, a instruo da linha 6 exibe false. Como essa
string comea com K11, a instruo da linha 7 exibe true.
1
2
3
4
5
6
7
replaceAll
Podemos realizar substituies em uma string com o mtodo replaceAll da classe String. Esse
mtodo recebe duas strings como parmetros e devolve um objeto do tipo String. Considere o exemplo abaixo.
1 String s1 = " Matamos o tempo , o tempo nos enterra " ; //
2
www.facebook.com/k19treinamentos
Machado de Assis
105
O PERADORES
106
Na linha 3, o mtodo replaceAll substituir cada ocorrncia de o tempo na string cuja referncia
est em s1 por um coveiro. Assim, ele devolve Matamos um coveiro, um coveiro nos enterra.
Na verdade, o primeiro parmetro desse mtodo uma expresso regular, mas esse assunto est
fora do escopo deste livro.
substring
possvel extrair um trecho de uma string com o mtodo substring da classe String. H duas
formas de utilizar esse mtodo. Na primeira, ele recebe apenas um parmetro. Esse parmetro indica
a posio do primeiro caractere do trecho desejado. O trmino desse trecho ser o ltimo caractere
da string. Veja o exemplo abaixo.
1 String s1 = " Porta corta fogo " ;
2
3 String s2 = s1 . substring (9) ;
4
5 System . out . println ( s2 ) ; // exibe : ta fogo
Na linha 3, o mtodo substring invocado com o argumento 9. Assim, ele devolve a substring de
Porta corta fogo que comea na posio 9 e se estende at o fim. Logo, a instruo da linha 5 exibe
ta fogo.
Na segunda forma de utilizar o mtodo substring, dois parmetros do tipo int so necessrios: a
e b. O mtodo ento devolve o trecho que comea com o caractere na posio a e termina com o
caractere na posio b 1. Vejamos um exemplo.
106
www.k19.com.br
107
O PERADORES
Na linha 3, o mtodo substring invocado com os argumentos 2 e 10. Assim, ele devolve a substring de O elevador chegou que comea na posio 2 e se estende at a posio de nmero 9 dessa
string. Logo, a instruo da linha 5 exibe elevador.
toUpperCase
Podemos transformar em maisculas todas as letras contidas em uma string com o mtodo
toUpperCase da classe String. No exemplo abaixo, esse mtodo aplicado string cujo contedo
Rafael Cosentino. Esse mtodo ento devolve a string com todas as letras maisculas, ou seja, devolve RAFAEL COSENTINO.
1 String s1 = " Rafael Cosentino " ;
2
3 String s2 = s1 . toUpperCase () ;
4
5 System . out . println ( s2 ) ; // exibe : RAFAEL COSENTINO
toLowerCase
Tambm podemos transformar em minsculas todas as letras contidas em uma string com o mtodo toLowerCase da classe String. No exemplo a seguir, esse mtodo aplicado string cujo contedo
Rafael Cosentino. Assim, esse mtodo devolve a string rafael cosentino.
1 String s1 = " Rafael Cosentino " ;
2
3 String s2 = s1 . toLowerCase () ;
4
5 System . out . println ( s2 ) ; // exibe : rafael cosentino
trim
Com o mtodo trim da classe String, podemos eliminar os espaos em branco do comeo e do
trmino de uma string. Veja o exemplo abaixo.
1
2
3
4
5
6
String s1 = "
Rafael
Cosentino
";
String s2 = s1 . trim () ;
// " Rafael
Cosentino "
System . out . println ( s2 ) ;
No cdigo acima, a chamada ao mtodo trim devolve a string que no possui espaos antes de
Rafael e no possui espaos aps Cosentino. Observe que os espaos entre Rafael e Cosentino
no so removidos.
www.facebook.com/k19treinamentos
107
O PERADORES
108
add
Podemos modificar uma data e hora acrescentando ou subtraindo uma quantidade nos campos
que definem essa data e hora. Essa tarefa pode ser feita com o mtodo add da classe Calendar.
1
2
3
4
5
6
7
8
9
10
Na primeira linha do cdigo acima, criado um objeto do tipo Calendar para representar a data 27
de Agosto de 2010. Na linha 4, foram adicionados 140 dias a essa data. Assim, obtemos a data 14 de
Janeiro de 2011. Na linha 7, so subtrados dois anos dessa data. Assim, a data obtida 14 de Janeiro
de 2009. Na ltima linha, so adicionadas 72 horas. Assim, a data obtida 17 de Janeiro de 2009.
before e after
Podemos comparar datas e horas. O mtodo before da classe Calendar usado para determinar se
uma data anterior a uma outra data. Analogamente, o mtodo after da classe Calendar utilizado
para determinar se uma data posterior a uma outra. Veja o exemplo abaixo.
1
2
3
4
5
6
// exibe : false
Na primeira linha do cdigo acima, criado um objeto do tipo Calendar que representa a data 27
de Agosto de 2010. Na segunda linha, um objeto do tipo Calendar criado para representar a data
no momento de execuo dessa instruo. Na linha 4, usamos o mtodo before para verificar se a
primeira data anterior segunda. Na linha 6, usamos o mtodo after para verificar se a primeira
data posterior segunda.
108
www.k19.com.br
109
O PERADORES
O operador - no pode ser aplicado a valores do tipo String. A mensagem de erro de compilao
seria semelhante apresentada abaixo.
Programa . java :5: error : bad operand types for binary operator -
System . out . println ( s1 - s2 );
^
first type : String
second type : String
1 error
www.facebook.com/k19treinamentos
109
O PERADORES
110
O operador de negao no pode ser aplicado a valores de tipos primitivos numricos. A mensagem de erro de compilao seria semelhante apresentada abaixo.
Programa . java :4: error : bad operand type int for unary operator !
System . out . println (! i );
^
1 error
Ao executar a classe Programa, a instruo da linha 4 provoca um erro de execuo devido diviso
do valor inteiro 100 pelo valor inteiro 0.
Exception in thread " main " java . lang . ArithmeticException : / by zero
at Programa . main ( Programa . java :4)
Nesse exemplo, declaramos a varivel a do tipo double e a varivel b do tipo int. Na linha 4, tentamos armazenar o valor de uma expresso cujo resultado do tipo double na varivel b. Como b do
tipo int, isso provoca um erro de compilao.
Programa . java :4: error : incompatible types : possible lossy conversion from double to int
int b = 5 + a ;
^
1 error
110
www.k19.com.br
111
O PERADORES
No exemplo abaixo, declaramos uma varivel do tipo float e tentamos inicializ-la com o valor
3.14.
1 class Programa {
2
public static void main ( String [] args ) {
3
float a = 3.14;
4
}
5 }
Cdigo Java 3.141: Programa.java
A converso de um nmero inteiro para String no permitida com o uso de casting. A classe
Programa acima no compila e apresenta o seguinte erro de compilao.
Programa . java :4: error : incompatible types : int cannot be converted to String
String b = ( String ) a ;
^
1 error
Para converter um nmero inteiro para String, podemos usar o mtodo valueOf da classe String.
A converso de String para int tambm no permitida usando uma operao de casting.
1 class Programa {
2
public static void main ( String [] args ) {
3
String b = " 19 " ;
4
int a = ( int ) b ;
5
}
6 }
Cdigo Java 3.143: Programa.java
www.facebook.com/k19treinamentos
111
O PERADORES
112
Para converter uma String para um int, podemos usar o mtodo parseInt da classe Integer.
3.26 Resumo
1
No necessrio fazer casting para copiar o valor armazenado em uma varivel primitiva para
outra varivel primitiva desde que o tipo da primeira varivel seja compatvel com o tipo da segunda.
Ver Tabela 3.1.
Apesar do tipo long ser compatvel com o tipo float, copiar valores armazenados em uma varivel do tipo long para uma varivel do tipo float pode gerar resultados indesejados.
A converso de um valor de tipo primitivo numrico para um valor de tipo no primitivo numrico realizada atravs de um processo chamado boxing.
A converso de um valor de tipo no primitivo numrico para um valor de tipo primitivo numrico realizada atravs de um processo chamado unboxing.
A converso de valores dos tipos byte, short, int, long, float, double e boolean para String pode ser
realizada atravs dos mtodos Byte.parseByte, Short.parseShort, Integer.parseInt, Long.parseLong,
Float.parseFloat, Double.parseDouble e Boolean.parseBoolean, respectivamente.
10
112
113
11
O PERADORES
Na diviso entre valores reais, se o divisor for zero, o resultado poder ser +Infinity, -Infinity ou
NaN.
12
13
14
15
O contedo de uma varivel pode ser modificado atravs dos operadores de atribuio: =, +=,
-=, *=, /=, %=, ++ e --.
16
Podemos comparar o contedo das variveis ou os valores literais atravs dos operadores relacionais: ==, !=, <, <=, > e >=.
17
18
e .
19
O operador && no avalia o segundo operando se o valor do primeiro operando for false.
20
21
22
23
24
www.facebook.com/k19treinamentos
113
O PERADORES
114
114
www.k19.com.br
CAPTULO
C ONTROLE DE F LUXO
4.1 Introduo
Neste captulo, mostraremos instrues que permitem controlar o fluxo de execuo de um programa. Essas instrues aumentam a inteligncia do cdigo. Basicamente, as linguagens de programao oferecem dois tipos de instrues para controlar o fluxo de execuo dos programas: instrues de deciso e de repetio.
4.3 Instruo if
A instruo de deciso if utilizada quando um determinado trecho de cdigo deve ser executado apenas se uma condio for true. A sintaxe da instruo if a seguinte:
1 if ( condio ) {
2
bloco de comandos
3 }
Como funciona a instruo if? Se a condio for true, o bloco de comandos ser executado. Caso
contrrio, ou seja, se a condio for false, o bloco de comandos no ser executado.
www.facebook.com/k19treinamentos
115
C ONTROLE DE F LUXO
116
A condio da instruo if deve ser um valor do tipo boolean ou do tipo Boolean. Os valores do tipo
Boolean so convertidos para boolean atravs do autoboxing. A Figura 4.1 ilustra o fluxo de execuo
da instruo if.
condio
false
true
bloco de
comandos
Simulao
A altura mnima para o ingresso na atrao The Barnstormer do parque temtico da Disney
Magic Kingdom 0.89 metros. Vamos simular a execuo do programa que controla o acesso dos
visitantes a essa atrao.
Na linha 1, um nmero aleatrio do tipo double gerado com o trecho de cdigo Math.random().
Vamos utilizar esse nmero para representar a altura de um visitante que deseja ingressar na atrao
The Barnstormer. Esse valor armazenado na varivel altura. Suponha que o valor 0.75 tenha sido
gerado.
1
1
2
3
4
5
6
1
2
3
4
5
6
altura = 0.75
altura = 0.75
0.75
116
www.k19.com.br
117
C ONTROLE DE F LUXO
Na linha 3, a comparao da condio do if devolve true pois o valor da varivel altura menor
do que 0.89.
3
1
2
3
4
5
6
altura = 0.75
0.75
1
2
3
4
5
6
altura = 0.75
0.75
Acesso bloqueado
1
2
3
4
5
6
altura = 0.75
0.75
Acesso bloqueado
The Barnstormer
Simulao
Na linha 1, um nmero aleatrio do tipo double gerado com o trecho de cdigo Math.random().
Vamos utilizar esse nmero para representar a altura de um visitante que deseja ingressar na atrao
The Barnstormer. Esse valor armazenado na varivel altura. Suponha que o valor 0.97 tenha sido
gerado.
1
1
2
3
4
5
6
altura = 0.97
www.facebook.com/k19treinamentos
117
C ONTROLE DE F LUXO
1
2
3
4
5
6
118
altura = 0.97
0.97
1
2
3
4
5
6
altura = 0.97
0.97
1
2
3
4
5
6
altura = 0.97
0.97
The Barnstormer
No exemplo acima, se a condio do if for true, o bloco de comandos do if ser executado. Caso
contrrio, ou seja, se a condio for false, o bloco de comandos do else ser executado.
A instruo else no pode aparecer sozinha no cdigo sem estar vinculada a uma instruo if. A
instruo else pode ser traduzida em portugus para seno. Em portugus, assim como em Java,
no faz sentido dizer seno sem antes dizer se. Por isso, no podemos utilizar a instruo else
sem antes ter utilizado a instruo if. A Figura 4.2 exibe o fluxograma das instrues if e else.
118
www.k19.com.br
119
C ONTROLE DE F LUXO
true
condio
bloco de
comandos
do if
false
bloco de
comandos
do else
Simulao
A altura mnima para o ingresso na atrao The Barnstormer do parque temtico da Disney
Magic Kingdom 0.89 metros. Vamos simular a execuo do programa que controla o acesso dos
visitantes a essa atrao.
1
Na linha 1, um nmero aleatrio do tipo double gerado com o trecho de cdigo Math.random().
Vamos utilizar esse nmero para representar a altura de um visitante que deseja ingressar na atrao
The Barnstormer. Esse valor armazenado na varivel altura. Suponha que o valor 0.75 tenha sido
gerado.
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
altura = 0.75
www.facebook.com/k19treinamentos
altura = 0.75
119
C ONTROLE DE F LUXO
120
0.75
Na linha 3, a comparao da condio do if devolve true pois o valor da varivel altura menor
do que 0.89.
3
1
2
3
4
5
6
7
8
altura = 0.75
0.75
1
2
3
4
5
6
7
8
altura = 0.75
0.75
Acesso bloqueado
Por fim, o fluxo de execuo pula para a linha 8 e a mensagem The Barnstormer exibida no
terminal.
5
1
2
3
4
5
6
7
8
altura = 0.75
0.75
Acesso bloqueado
The Barnstormer
Simulao
Na linha 1, um nmero aleatrio do tipo double gerado com o trecho de cdigo Math.random().
Vamos utilizar esse nmero para representar a altura de um visitante que deseja ingressar na atrao
The Barnstormer. Esse valor armazenado na varivel altura. Suponha que o valor 0.97 tenha sido
gerado.
1
120
www.k19.com.br
121
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
C ONTROLE DE F LUXO
altura = 0.97
altura = 0.97
0.97
1
2
3
4
5
6
7
8
altura = 0.97
0.97
1
2
3
4
5
6
7
8
altura = 0.97
0.97
Acesso liberado
Por fim, o fluxo de execuo continua e a linha 8 executada exibindo a mensagem The Barnstormer.
5
www.facebook.com/k19treinamentos
121
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
122
altura = 0.97
0.97
Acesso liberado
The Barnstormer
Simulao
Nessa simulao, mostraremos um exemplo de utilizao de instrues de deciso encadeadas.
Ao executar a primeira linha, uma varivel chamada nota do tipo double declarada e inicializada
com o valor 8.2.
1
1
2
3
4
5
6
7
8
9
10
11
122
nota = 8.2
www.k19.com.br
123
C ONTROLE DE F LUXO
Na sequncia, a linha 2 ser executada. Como a varivel nota armazena o valor 8.2, a operao
nota >= 5.0 devolve true.
2
1
2
3
4
5
6
7
8
9
10
11
nota = 8.2
3
Como a condio do if da linha 2 verdadeira, a linha 3 executada e a palavra Aprovado
exibida na sada padro.
1
2
3
4
5
6
7
8
9
10
11
nota = 8.2
Aprovado
4
Continuando a execuo, a linha 4 ser processada. Como a varivel nota armazena o valor 8.2,
a operao nota < 8.0 devolve false.
1
2
3
4
5
6
7
8
9
10
11
nota = 8.2
Aprovado
Como a condio do if da linha 4 falsa, o fluxo de execuo direcionado para a linha 7. Assim,
a mensagem Sua nota foi tima exibida na sada padro.
5
www.facebook.com/k19treinamentos
123
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
124
nota = 8.2
Aprovado
Sua nota foi tima
Traduzindo para o portugus a instruo while como enquanto, fica mais fcil entender o seu
funcionamento. O cdigo acima poderia ser lido da seguinte forma: Enquanto a condio for verdadeira, execute o bloco de comandos do while.
A condio da instruo while deve ser um valor do tipo boolean ou do tipo Boolean. Os valores
do tipo Boolean so convertidos para boolean atravs do autoboxing. Veja na Figura 4.3 o fluxo de
execuo da instruo while.
124
www.k19.com.br
125
C ONTROLE DE F LUXO
condio
false
true
bloco de
comandos
Considere um programa que exibe na tela cem mensagens de acordo com o seguinte padro:
Mensagem nmero 1
Mensagem nmero 2
...
Mensagem nmero 100
O cdigo acima teria cem linhas de instrues. Contudo, utilizando a instruo while, o cdigo
fica bem mais simples.
1
2
3
4
5
6
7
At agora, o uso da instruo while parece ser mais uma convenincia do que uma necessidade.
Vamos mudar um pouco o exemplo anterior para verificar a importncia das instrues de repetio.
Suponha que a frase Mensagem nmero x tenha de ser exibida um nmero aleatrio de vezes, mas
que no seja possvel determinar o nmero mximo de vezes que ela ser executada. Por exemplo,
suponha que a mensagem deva ser exibida enquanto o valor sorteado pelo mtodo random da classe
Math for menor do que 0.99999.
www.facebook.com/k19treinamentos
125
C ONTROLE DE F LUXO
126
1 int i = 0;
2
3 while ( Math . random () < 0.99999) {
4
System . out . println ( " Mensagem nmero " + ( i + 1) ) ;
5
i ++;
6 }
Cdigo Java 4.31: Exibindo a frase Mensagem nmero x um nmero aleatrio de vezes
A cada vez que executado, o programa acima pode exibir uma quantidade diferente de mensagens. Esse comportamento seria possvel sem a utilizao de uma instruo de repetio?
Simulao
Vamos simular a execuo de um programa que gera bilhetes de loteria. Para no alongar muito
a simulao, apenas 3 bilhetes sero gerados. Esses bilhetes devem ser numerados sequencialmente
iniciando com o nmero 1000.
Na linha 1, a varivel numero declarada e inicializada com o valor 1000.
1
2
3
4
5
6
numero = 1000
2
Na linha 2, a condio do while testada. Como o valor da varivel numero menor ou igual a
1002, a condio numero <= 1002 devolve true.
1
2
3
4
5
6
numero = 1000
3
Como a condio da linha 2 devolveu true, o corpo do while ser executado. Ao executar a linha
3, a mensagem Bilhete 1000 exibida no terminal.
1
2
3
4
5
6
numero = 1000
Bilhete 1000
126
www.k19.com.br
127
1
2
3
4
5
6
C ONTROLE DE F LUXO
numero = 1001
Bilhete 1000
O fluxo de execuo volta para a linha 2 e a condio do while testada novamente. Mais uma
vez, o valor da varivel numero menor ou igual a 1002. Dessa forma, a condio numero <= 1002 devolve
true.
5
1
2
3
4
5
6
numero = 1001
Bilhete 1000
6
Como a condio da linha 2 devolveu true, o corpo do while ser executado. Ao executar a linha
3, a mensagem Bilhete 1001 exibida no terminal.
1
2
3
4
5
6
numero = 1001
Bilhete 1000
Bilhete 1001
1
2
3
4
5
6
numero = 1002
Bilhete 1000
Bilhete 1001
Agora, o fluxo de execuo volta para a linha 2 e a condio do while testada novamente. O
valor da varivel numero igual a 1002. Dessa forma, a condio numero <= 1002 ainda devolve true.
8
1
2
3
4
5
6
www.facebook.com/k19treinamentos
numero = 1002
127
C ONTROLE DE F LUXO
128
Bilhete 1000
Bilhete 1001
Como a condio da linha 2 devolveu true, o corpo do while ser executado. Ao executar a linha
3, a mensagem Bilhete 1002 exibida no terminal.
9
1
2
3
4
5
6
numero = 1002
Bilhete 1000
Bilhete 1001
Bilhete 1002
10
1
2
3
4
5
6
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
Mais uma vez, o fluxo de execuo volta para a linha 2 para testar a condio do while. Finalmente, o valor da varivel numero no menor ou igual a 1002. Dessa forma, a condio devolve false.
11
1
2
3
4
5
6
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
Como a condio da linha 2 falsa, o corpo do while no ser mais executado. Portanto, o lao
interrompido e o fluxo de execuo pula para a linha 6. Ao executar essa linha, a mensagem FIM
exibida no terminal.
12
1
2
3
4
5
6
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
FIM
128
www.k19.com.br
129
C ONTROLE DE F LUXO
No lugar da inicializao, devemos inserir os comandos que sero executados antes do incio do
lao. No lugar da condio, devemos inserir uma expresso booleana que ser verificada antes de
cada iterao (repetio) do lao. Assim, como na instruo while, o lao continuar a ser executado
enquanto essa condio for verdadeira. No lugar da atualizao, devemos inserir os comandos que
sero executadas ao final de cada iterao do lao. A Figura 4.4 exibe o fluxograma da instruo for.
inicializao
condio
false
true
bloco de
comandos
atualizao
Importante
O termo iterao utilizado quando nos referimos repetio de uma ou mais aes. O
cdigo do corpo de um lao pode ser executado diversas vezes. A cada vez que ele executado,
dizemos que ocorre uma iterao.
www.facebook.com/k19treinamentos
129
C ONTROLE DE F LUXO
130
// inicializao
int i = 1;
// condio
while ( i <= 100) {
// comandos
System . out . println ( " Mensagem nmero " + i ) ;
// atualizao
i ++;
}
Perceba que o cdigo ficou mais compacto sem prejudicar a compreenso. Na linha em destaque,
declaramos e inicializamos a varivel i (int i = 1), definimos a condio de execuo (i <= 100) e
definimos que ao final de cada iterao devemos atualizar a varivel i (i++). Diferentemente do while,
no for, a inicializao, a condio e a atualizao do lao so definidas na mesma linha.
Mais Sobre
Vimos que a instruo for possui 3 argumentos: inicializao, condio e atualizao.
Esses argumentos podem ser mais complexos do que os utilizados anteriormente. Podemos
declarar e/ou inicializar diversas variveis na inicializao. Podemos definir condies mais
sofisticadas com uso dos operadores lgicos. Podemos atualizar o valor de diversas variveis na
atualizao. Veja um exemplo.
1 for ( int i = 1 , j = 2; i % 2 != 0 || j % 2 == 0; i += j , j += i ) {
2
// comandos
3 }
Mais Sobre
Os trs argumentos da instruo for (inicializao, condio e atualizao) so opcionais. Consequentemente, o seguinte cdigo vlido apesar de ser estranho no primeiro momento.
1 for (;;) {
2
// comandos
3 }
130
www.k19.com.br
131
C ONTROLE DE F LUXO
Simulao
Novamente, vamos simular a execuo de um programa que gera bilhetes de loteria. Mas agora,
vamos utilizar a instruo de repetio for. Para no alongar muito a simulao, apenas 3 bilhetes
sero gerados. Esses bilhetes devem ser numerados sequencialmente iniciando com o nmero 1000.
numero = 1000
2
Na linha 1, a condio do for testada. Como o valor da varivel numero menor ou igual a 1002,
a condio devolve true.
numero = 1000
Como a condio da linha 1 devolveu true, o corpo do for ser executado e a mensagem Bilhete
1000 exibida no terminal.
3
numero = 1000
Bilhete 1000
Agora, o fluxo de execuo volta para a linha 1 e a atualizao do for executada. Dessa forma,
a varivel numero incrementada para 1001.
4
numero = 1001
Bilhete 1000
www.facebook.com/k19treinamentos
131
C ONTROLE DE F LUXO
132
Depois da atualizao, a condio do for testada novamente. Mais uma vez, o valor da varivel
numero menor ou igual a 1002. Dessa forma, a condio devolve true.
5
numero = 1001
Bilhete 1000
Como a condio da linha 1 devolveu true, o corpo do for ser executado. Ao executar a linha 2,
a mensagem Bilhete 1001 exibida no terminal.
6
numero = 1001
Bilhete 1000
Bilhete 1001
Mais uma vez, o fluxo de execuo volta para a atualizao do for da linha 1. Dessa forma, a
varivel numero incrementada para 1002.
7
numero = 1002
Bilhete 1000
Bilhete 1001
8
Agora, a condio do for testada novamente. O valor da varivel numero ainda menor ou igual
a 1002. Dessa forma, a condio devolve true.
numero = 1002
Bilhete 1000
Bilhete 1001
Como a condio da linha 1 devolveu true, o corpo do for ser executado. Ao executar a linha 2,
a mensagem Bilhete 1002 exibida no terminal.
9
numero = 1002
Bilhete 1000
Bilhete 1001
Bilhete 1002
Mais uma vez, o fluxo de execuo retorna para executar a atualizao do for da linha 1. Assim,
a varivel numero incrementada para 1003.
10
132
www.k19.com.br
133
C ONTROLE DE F LUXO
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
Agora, a condio do for testada novamente. Finalmente, o valor da varivel numero no menor
ou igual a 1002. Dessa forma, a condio devolve false.
11
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
Como a condio do for da linha 1 falsa, o lao interrompido e o fluxo de execuo pula
para a linha 4. Ao executar essa linha, a mensagem FIM exibida no terminal.
12
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
FIM
No exemplo acima, para cada iterao do lao externo, h 200 iteraes do lao interno. Portanto,
o corpo do lao interno executa 800 vezes. Esse valor exatamente a quantidade de ingressos.
Alm de encadear fors, podemos encadear whiles. Veja algumas variaes do exemplo anterior.
1 int i = 1;
2 while ( i <= 4) {
3
int j = 1;
4
while ( j <= 200) {
www.facebook.com/k19treinamentos
133
C ONTROLE DE F LUXO
134
5
System . out . println ( " SETOR : " + i + " CADEIRA : " + j ) ;
6
j ++;
7
}
8
i ++;
9 }
1 int i = 1;
2 while ( i <= 4) {
3
for ( int j = 1; j <= 200; j ++) {
4
System . out . println ( " SETOR : " + i + " CADEIRA : " + j ) ;
5
}
6
i ++;
7 }
Simulao
A seguir, simulamos a execuo de dois laos do tipo for encadeados.
Na linha 1, temos a execuo de um lao for. Primeiramente, ocorre a declarao de uma varivel
do tipo int chamada i, que inicializada com o valor 0.
1
i=0
i=0
Como a condio do lao da linha 1 verdadeira, a linha 2 executada. Nessa linha, temos
um lao for. Assim, sua execuo comea pela inicializao. A varivel j do tipo int declarada e
inicializada com o valor de i+1. Como i armazena o valor 0, a varivel j inicializada com o valor 1.
3
134
www.k19.com.br
135
C ONTROLE DE F LUXO
i=0
j=1
i=0
j=1
Como a condio do lao da linha 2 verdadeira, a linha 3 executada. Assim, os valores armazenados nas variveis i e j so exibidos na sada padro.
5
i=0
j=1
i = 0, j = 1
Aps a execuo do corpo do lao da linha 2, o fluxo desviado para a atualizao do lao. Assim,
a operao j++ executada e a varivel j passa a armazenar o valor 2.
6
i=0
j=2
i = 0, j = 1
Aps a atualizao do lao da linha 2, a condio desse lao verificada. Como a varivel j
armazena o valor 2, a operao j <= 2 devolve true.
7
i=0
j=2
i = 0, j = 1
Como a condio do lao da linha 2 verdadeira, o corpo desse lao executado. Assim, a
instruo da linha 3 executada e os valores das variveis i e j so exibidos na sada padro.
8
www.facebook.com/k19treinamentos
135
C ONTROLE DE F LUXO
136
i=0
j=2
i = 0, j = 1
i = 0, j = 2
Aps a execuo do corpo do lao da linha 2, o fluxo direcionado para a atualizao do lao.
Assim, a operao j++ executada e a varivel j passa a armazenar o valor 3.
9
i=0
j=3
i = 0, j = 1
i = 0, j = 2
Aps a atualizao do lao da linha 2, a condio desse lao verificada. Como a varivel j
armazena o valor 3, o resultado da operao j <= 2 false e a execuo desse lao encerrada.
10
i=0
j=3
i = 0, j = 1
i = 0, j = 2
i=1
i = 0, j = 1
i = 0, j = 2
Aps a atualizao do lao da linha 1, a condio desse lao avaliada. Como o valor armazenado
em i 1, a operao i <= 2 devolve true.
12
i=1
i = 0, j = 1
i = 0, j = 2
136
www.k19.com.br
137
C ONTROLE DE F LUXO
Como a condio do lao da linha 1 verdadeira, o corpo desse lao executado. Assim, o lao
da linha 2 executado. O lao da linha 2 comea pela declarao e inicializao da varivel j do tipo
int. Como a varivel i armazena o valor 1, o resultado da operao i+1 2. Portanto, o valor 2
atribudo varivel j.
13
i=1
j=2
i = 0, j = 1
i = 0, j = 2
i=1
j=2
i = 0, j = 1
i = 0, j = 2
Como a condio do lao da linha 2 verdadeira, o corpo desse lao executado. Assim, a
instruo da linha 3 processada e os valores armazenados nas variveis i e j so exibidos na sada
padro.
15
i=1
j=2
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
i=1
j=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
17
Aps a atualizao do lao da linha 2, sua condio testada. Como a varivel j armazena o
valor 3, a operao j <= 2 devolve false e a execuo desse lao encerrada.
www.facebook.com/k19treinamentos
137
C ONTROLE DE F LUXO
138
i=1
j=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
i=2
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
i=2
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
Como a condio do lao da linha 1 verdadeira, o corpo desse lao executado. Sendo assim,
o lao da linha 2 processado. Isso comea com a declarao e inicializao da varivel j. Como i
armazena o valor 2, a varivel j inicializada com o valor 3.
20
i=2
j=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
138
i=2
j=3
www.k19.com.br
139
C ONTROLE DE F LUXO
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
i=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
i=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
www.facebook.com/k19treinamentos
139
C ONTROLE DE F LUXO
140
12
System . out . println ( " Soma : " + soma ) ;
13
14
if ( soma > 360) {
15
System . out . println ( " Voc ganhou com " + i + " lanamentos " ) ;
16
break ;
17
}
18 }
19 System . out . println ( " Jogue Novamente " ) ;
Importante
A instruo break deve aparecer somente dentro do corpo de um lao ou dentro do
corpo de um switch. Veremos a instruo switch neste captulo.
Importante
Quando a instruo break utilizada dentro de uma cadeia de laos, ela interrompe o
lao mais interno. No exemplo abaixo, trs laos encadeados foram definidos.
1 for ( int i = 0; i < 10; i ++) {
2
for ( int j = 0; j < 10; j ++) {
3
for ( int k = 0; k < 10; k ++) {
4
}
5
}
6 }
Se a instruo break for utilizada em qualquer lugar dentro do corpo do terceiro lao, esse lao
ser interrompido.
1 for ( int i = 0; i < 10; i ++) {
2
for ( int j = 0; j < 10; j ++) {
3
for ( int k = 0; k < 10; k ++) {
4
...
5
break ; // interrompe o terceiro lao
6
...
7
}
8
}
9 }
Caso contrrio, se a instruo break for utilizada dentro do corpo do segundo lao mas fora do
terceiro lao, o segundo lao ser interrompido.
1 for ( int i = 0; i < 10; i ++) {
2
for ( int j = 0; j < 10; j ++) {
3
...
4
break ; // interrompe o segundo lao
5
...
6
for ( int k = 0; k < 10; k ++) {
7
}
8
}
9 }
140
www.k19.com.br
141
C ONTROLE DE F LUXO
Caso contrrio, se a instruo break for utilizada dentro do primeiro lao mas fora do segundo
lao, o primeiro lao ser interrompido.
1 for ( int i =
2
...
3
break ; //
4
...
5
for ( int j
6
for ( int
7
}
8
}
9 }
Simulao
Vamos simular a execuo do jogo de dados descrito anteriormente. Para no alongar muito a
simulao, considere que o nmero mximo de lanamentos 2 e o valor que deve ser ultrapassado
7.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
soma = 0
soma = 0
i=1
www.facebook.com/k19treinamentos
141
C ONTROLE DE F LUXO
142
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
soma = 0
i=1
Como a condio da linha 2 devolveu true, o corpo do for ser executado. Ao executar a linha 3,
a mensagem Lanamento: 1 exibida no terminal.
4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
soma = 0
i=1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
soma = 0
i=1
numero = 5
142
www.k19.com.br
143
6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C ONTROLE DE F LUXO
soma = 0
i=1
numero = 5
Adiante, a linha 7 executada e o valor da varivel numero incrementado na varivel soma. Dessa
forma, a varivel soma passa a armazenar o valor 5.
7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
soma = 5
i=1
numero = 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
soma = 5
i=1
numero = 5
www.facebook.com/k19treinamentos
143
C ONTROLE DE F LUXO
144
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
soma = 5
i=1
numero = 5
Como a condio da linha 10 falsa, o corpo do if no ser executado e o fluxo de execuo vai
para a atualizao do for na linha 2. Dessa forma, a varivel i incrementada para 2.
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
soma = 5
i=2
Novamente, na linha 2, a condio do for testada. Como o valor da varivel i menor ou igual
a 2, a condio devolve true.
11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
soma = 5
i=2
144
www.k19.com.br
145
C ONTROLE DE F LUXO
Lanamento : 1
Nmero : 5
Soma : 5
Como a condio da linha 2 devolveu true, o corpo do for ser executado. Ao executar a linha 3,
a mensagem Lanamento: 2 exibida no terminal.
12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
soma = 5
i=2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
soma = 5
i=2
numero = 3
14
www.facebook.com/k19treinamentos
145
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
146
soma = 5
i=2
numero = 3
Adiante, a linha 7 executada e o valor da varivel numero incrementado na varivel soma. Dessa
forma, a varivel soma passa a armazenar o valor 8.
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
soma = 8
i=2
numero = 3
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
soma = 8
i=2
numero = 3
146
www.k19.com.br
147
C ONTROLE DE F LUXO
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3
Soma : 8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
soma = 8
i=2
numero = 3
18 Como a condio da linha 10 verdadeira, o corpo do if ser executado. Ao executar a linha 11,
a mensagem Voc ganhou com 2 lanamentos exibida no terminal.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
soma = 8
i=2
numero = 3
19
www.facebook.com/k19treinamentos
147
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
System . out . println ( " Nmero : " + numero ) ;
soma += numero ;
148
soma = 8
i=2
numero = 3
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int soma = 0;
for ( int i = 1; i <= 2; i ++) {
System . out . println ( " Lanamento : " + i ) ;
int numero = ( int ) ( Math . random () * 6 + 1) ;
soma = 8
148
www.k19.com.br
149
C ONTROLE DE F LUXO
2
3 for ( int i = 1; i <= 100; i ++) {
4
System . out . println ( " Lanamento : " + i ) ;
5
6
int numero = ( int ) ( Math . random () * 6 + 1) ;
7
8
System . out . println ( " Nmero : " + numero ) ;
9
10
if ( numero % 2 != 0) {
11
continue ;
12
}
13
14
soma += numero ;
15
16
System . out . println ( " Soma : " + soma ) ;
17
18
if ( soma > 180) {
19
System . out . println ( " Voc ganhou com " + i + " lanamentos " ) ;
20
break ;
21
}
22 }
23 System . out . println ( " Jogue Novamente " ) ;
No trecho destacado, calculamos o resto da diviso do nmero gerado aleatoriamente por dois.
Alm disso, na condio do if, verificamos se esse valor diferente de zero. Se essa condio for
verdadeira, significa que o nmero gerado aleatoriamente mpar e consequentemente deve ser
descartado. No corpo do if, utilizamos a instruo continue para abortar a iterao atual.
Importante
Quando aplicada a laos while, a instruo continue pula para a condio do lao. Por
outro lado, quando aplicada a laos for, ela pula para a atualizao do lao.
Importante
Quando a instruo continue utilizada dentro de uma cadeia de laos, ela afeta o lao
mais interno. No exemplo abaixo, trs laos encadeados foram definidos.
1 for ( int i = 0; i < 10; i ++) {
2
for ( int j = 0; j < 10; j ++) {
3
for ( int k = 0; k < 10; k ++) {
4
}
5
}
6 }
Se a instruo continue for utilizada em qualquer lugar dentro do corpo do terceiro lao, esse lao
ser afetado.
1 for ( int i = 0; i <
2
for ( int j = 0; j
3
for ( int k = 0;
4
...
5
continue ; //
6
...
7
}
8
}
9 }
10; i ++) {
< 10; j ++) {
k < 10; k ++) {
afeta o terceiro lao
Caso contrrio, se a instruo continue for utilizada dentro do corpo do segundo lao mas fora
www.facebook.com/k19treinamentos
149
C ONTROLE DE F LUXO
150
Caso contrrio, se a instruo continue for utilizada dentro do terceiro lao mas fora do segundo
lao, o primeiro lao ser afetado.
1 for ( int i =
2
...
3
continue ;
4
...
5
for ( int j
6
for ( int
7
}
8
}
9 }
Simulao
Vamos simular a execuo de um programa que gera aleatoriamente dois nmeros inteiros entre
1 e 100 e exibe no terminal apenas os mpares.
i=1
Na sequncia, a condio do for testada. Como valor da varivel i menor ou igual a 2, essa
condio devolve true.
2
150
i=1
O corpo do for executado porque a condio da linha 1 devolveu true. Ao executar a linha 2,
www.k19.com.br
151
C ONTROLE DE F LUXO
um nmero aleatrio entre 1 e 100 gerado e armazenado na varivel numero. Suponha que o valor
gerado seja 38.
1 for ( int i = 1; i <= 2; i ++) {
2
int numero = ( int ) ( Math . random () * 100 + 1) ;
3
if ( numero % 2 == 0) {
4
continue ;
5
}
6
System . out . println ( i ) ;
7 }
i=1
numero = 38
Na linha 3, verificamos se o resto da diviso do valor da varivel numero por 2 igual a 0. Como
essa varivel est armazenando o valor 38, a condio do if devolve true, pois o resto da diviso de
38 por 2 0.
4
i=1
numero = 38
i=1
numero = 38
Devido ao desvio causado pela instruo continue, o fluxo de execuo vai para a atualizao do
i=2
7
Na sequncia, a condio do for testada. Como valor da varivel i menor ou igual a 2, essa
condio devolve true.
www.facebook.com/k19treinamentos
151
C ONTROLE DE F LUXO
152
i=2
8
O corpo do for executado porque a condio da linha 1 devolveu true. Ao executar a linha 2,
um nmero aleatrio entre 1 e 100 gerado e armazenado na varivel numero. Suponha que o valor
gerado seja 97.
i=2
numero = 97
Na linha 3, verificamos se o resto da diviso do valor da varivel numero por 2 igual a 0. Como
essa varivel est armazenando o valor 97, a condio do if devolve false, pois o resto da diviso de
97 por 2 no 0.
9
i=2
numero = 97
Como a condio da linha 3 devolveu false, o corpo do if no executado. Dessa forma, o fluxo
de execuo vai direto para a linha 6 e o valor 97 exibido no terminal.
10
i=2
numero = 97
97
Prosseguindo, o fluxo de execuo vai para a atualizao do for na linha 1. Dessa forma, a
varivel i incrementada para 3.
11
152
www.k19.com.br
153
C ONTROLE DE F LUXO
i=3
97
i=3
97
Lembre-se
Na linguagem Java, apenas blocos de cdigo com apenas um comando podem ser associados s instrues de deciso if e else ou s instrues de repetio while e for.
Normalmente, no delimitar com chaves os blocos de cdigo com dois ou mais comandos gera
erros de lgica ou at mesmo erros de compilao. Para evitar esses problemas, a utilizao das
chaves mesmo em blocos com apenas um comando recomendada.
Considere o seguinte trecho de cdigo.
1 if ( a < 10)
2
a = a * 2 + 1;
www.facebook.com/k19treinamentos
153
C ONTROLE DE F LUXO
154
3 else {
4
if ( a < 20)
5
a = a * 3 + 1;
6
else
7
a = a * 4 + 1;
8 }
+ 1;
20)
+ 1;
+ 1;
Os leitores mais desavisados desse cdigo podem assumir a existncia da instruo else if. Contudo, essa instruo no existe na linguagem Java. Na verdade, nesse exemplo, o segundo if pertence
ao corpo do primeiro else.
Observe que a condio nunca devolver o valor false. Como a varivel i inicializada com o
valor 1 e no mais atualizada, a condio i < 10 ser sempre verdadeira. Dessa forma, os laos
acima nunca sero interrompidos. Eles sero executados indefinidamente. Esses laos so chamados popularmente de laos infinitos.
154
www.k19.com.br
155
C ONTROLE DE F LUXO
A chave uma expresso que pode ser de algum dos seguintes tipos primitivos: char, byte, short
ou int. Ela tambm pode ser de algum dos seguintes tipos no primitivos: Character, Byte, Short ou
Integer. Nesse caso, o autoboxing utilizado para converter o valor no primitivo da chave para
primitivo. Tambm podemos utilizar chaves do tipo String. Por fim, o tipo da chave pode ser um
enum type. Neste livro, no abordaremos os enum types.
Para cada caso, exceto o caso padro (default), necessrio definir uma expresso constante
compatvel com o tipo da chave do switch. No permitido definir dois casos com expresses de
mesmo valor ou um caso com expresso igual a null. Tambm no permitido definir mais do que
um caso padro.
Quando o valor da chave for igual ao valor da expressao1, todos os blocos sero executados.
Quando o valor da chave for igual ao valor da expressao2, os blocos 2, 3 e 4 sero executados.
Quando o valor da chave for igual ao valor da expressao3, os blocos 3 e 4 sero executados. Quando
o valor da chave no for igual ao valor da expressao1, expressao2 ou expressao3, apenas o bloco
4 ser executado.
Mais Sobre
O nmero de casos que podem ser declarados em um switch ilimitado. Alm disso, o
caso padro (default) opcional. Tecnicamente, um switch sem nenhum caso vlido. Portanto,
o cdigo a seguir est correto.
1 int x = 1;
2 switch ( x ) {
3
4 }
Cdigo Java 4.139: Um switch vazio
No exemplo abaixo, a varivel nota a chave do switch. Essa varivel do tipo char e foi inicializada
com o valor A. Como o valor da chave igual ao valor da expresso associada ao primeiro caso do
switch, as mensagens timo, Regular e Ruim sero exibidas na sada padro.
1 char nota = A ;
2 switch ( nota ) {
3
case A : System . out . println ( " timo " ) ;
4
case B : System . out . println ( " Regular " ) ;
5
case C : System . out . println ( " Ruim " ) ;
6 }
Para evitar que os blocos associados aos casos subsequentes sejam executados, geralmente, podemos utilizar a instruo break. Agora, no exemplo abaixo, somente a mensagem timo ser exibida na sada padro. A instruo break do ltimo bloco no necessria. Contudo, normalmente,
ela adicionada.
1 char nota = A ;
2 switch ( nota ) {
3
case A : System . out . println ( " timo " ) ; break ;
4
case B : System . out . println ( " Regular " ) ; break ;
5
case C : System . out . println ( " Ruim " ) ; break ;
www.facebook.com/k19treinamentos
155
C ONTROLE DE F LUXO
156
6 }
Cdigo Java 4.141: Utilizando a instruo break em conjunto com a instruo switch
O mesmo bloco pode ser associado a vrios casos. No exemplo abaixo, se a nota for A ou B, a
mensagem timo ser exibida na sada padro. Se a nota for C, a mensagem Regular ser exibida
na sada padro. Se a nota for D ou E, a mensagem Ruim ser exibida na sada padro.
1 char nota = A ;
2 switch ( nota ) {
3
case A : case B : System . out . println ( " timo " ) ; break ;
4
case C : System . out . println ( " Regular " ) ; break ;
5
case D : case E : System . out . println ( " Ruim " ) ; break ;
6 }
Cdigo Java 4.142: Um bloco associado a vrios casos
Simulao
Nessa simulao, mostraremos um exemplo de utilizao da instruo switch.
Ao executar a linha 1, uma varivel do tipo int chamada tipoDeSeguro declarada e inicializada
com o valor 2.
1
1 int tipoDeSeguro = 2;
2 switch ( tipoDeSeguro ) {
3
case 1: System . out . println ( " CARRO RESERVA " ) ;
4
case 2: System . out . println ( " GUINCHO E VIDROS " ) ;
5
case 3: System . out . println ( " ROUBO E COLISO " ) ;
6 }
tipoDeSeguro = 2
tipoDeSeguro = 2
3 Como o valor da varivel tipoDeSeguro armazena o valor 2, o fluxo de execuo direcionado para
a linha 4. Na execuo dessa linha, a mensagem GUINCHO E VIDROS exibida na sada padro.
1 int tipoDeSeguro = 2;
2 switch ( tipoDeSeguro ) {
3
case 1: System . out . println ( " CARRO RESERVA " ) ;
4
case 2: System . out . println ( " GUINCHO E VIDROS " ) ;
5
case 3: System . out . println ( " ROUBO E COLISO " ) ;
6 }
tipoDeSeguro = 2
GUINCHO E VIDROS
156
www.k19.com.br
157
C ONTROLE DE F LUXO
A prxima linha a ser executada a linha 5. Ao executar essa linha, a mensagem ROUBO E
COLISO ser exibida na sada padro.
4
1 int tipoDeSeguro = 2;
2 switch ( tipoDeSeguro ) {
3
case 1: System . out . println ( " CARRO RESERVA " ) ;
4
case 2: System . out . println ( " GUINCHO E VIDROS " ) ;
5
case 3: System . out . println ( " ROUBO E COLISO " ) ;
6 }
tipoDeSeguro = 2
GUINCHO E VIDROS
ROUBO E COLISO
A condio deve ser um valor do tipo boolean ou do tipo Boolean. Os valores do tipo Boolean so
convertidos para boolean atravs do autoboxing. Veja na Figura 4.5 o fluxograma da instruo dowhile.
bloco de
comandos
true
condio
false
No exemplo abaixo, a varivel x que do tipo int foi inicializada com o valor 10. Na primeira iterao, a condio do while falsa, pois o valor da varivel x no menor do que 10. Consequentemente,
o bloco do while no ser executado nem ao menos uma vez.
1 int x = 10;
2 while ( x < 10) {
3
System . out . println ( x ) ;
www.facebook.com/k19treinamentos
157
C ONTROLE DE F LUXO
158
4
x ++;
5 }
Cdigo Java 4.148: Um while que no executa
No exemplo abaixo, substitumos a instruo while pela instruo do-while. Nesse caso, o bloco
do lao sempre ser executado ao menos uma vez, pois a condio do lao verificada somente no
final das iteraes e no no comeo como ocorre no while.
1 int x = 10;
2 do {
3
System . out . println ( x ) ;
4
x ++;
5 } while ( x < 10) ;
Cdigo Java 4.149: Utilizando a instruo do-while
Simulao
Nessa simulao, mostraremos um exemplo de utilizao da instruo do-while.
Na execuo da linha 1, uma varivel do tipo int chamada a declarada e inicializada com o
valor 1.
1
1
2
3
4
5
6
int a = 1;
do {
System . out . println ( a ) ;
a ++;
} while ( a < 3) ;
System . out . println ( " FIM " ) ;
1
2
3
4
5
6
a=1
int a = 1;
do {
System . out . println ( a ) ;
a ++;
} while ( a < 3) ;
System . out . println ( " FIM " ) ;
a=1
1
2
3
4
5
6
int a = 1;
do {
System . out . println ( a ) ;
a ++;
} while ( a < 3) ;
System . out . println ( " FIM " ) ;
a=2
158
www.k19.com.br
159
C ONTROLE DE F LUXO
1
2
3
4
5
6
int a = 1;
do {
System . out . println ( a ) ;
a ++;
} while ( a < 3) ;
System . out . println ( " FIM " ) ;
a=2
1
2
3
4
5
6
int a = 1;
do {
System . out . println ( a ) ;
a ++;
} while ( a < 3) ;
System . out . println ( " FIM " ) ;
a=2
1
2
Com a execuo da linha 4, o valor da varivel a atualizado com o operador ++ e essa varivel
passa a armazenar o valor 3.
6
1
2
3
4
5
6
int a = 1;
do {
System . out . println ( a ) ;
a ++;
} while ( a < 3) ;
System . out . println ( " FIM " ) ;
a=3
1
2
Agora, a linha 5 executada. Como a varivel a armazena o valor 3, a operao a < 3 devolve
false. Sendo assim, o lao terminar.
7
1
2
3
4
5
6
int a = 1;
do {
System . out . println ( a ) ;
a ++;
} while ( a < 3) ;
System . out . println ( " FIM " ) ;
a=3
1
2
1
2
3
4
5
6
www.facebook.com/k19treinamentos
a=3
159
C ONTROLE DE F LUXO
160
1
2
FIM
Analogamente, o mesmo problema ocorre no cdigo abaixo. A varivel contador foi inicializada
com o valor 10. Como essa varivel final, no podemos alterar o seu contedo. Dessa forma, o
corpo do while nunca seria executado. Nesse caso, novamente ocorreria um unreachable code. Se a
varivel contador no fosse final, o cdigo compilaria sem problemas.
1 final int contador = 10;
2 while ( contador < 10) { // erro de compilao - unreachable code
3
System . out . println ( contador ) ;
4 }
Tambm podemos observar esse problema no exemplo abaixo. A varivel contador foi inicializada com o valor 0. Novamente, como essa varivel final, no podemos alterar o seu contedo.
Dessa forma, a condio do while sempre verdadeira. Como no h nada que interrompa o lao, as
linhas depois do corpo do while nunca seriam executadas. Nesse caso, mais uma vez ocorreria um
unreachable code.
1
2
3
4
5
Nem sempre uma instruo que nunca poder ser executada gera um unreachable code. Considere o exemplo abaixo. A varivel contador foi inicializada com o valor 10. O contedo dessa varivel
no pode ser alterado, pois ela final. Dessa forma, a condio do if sempre falsa e corpo do
if nunca ser executado. Contudo, o tratamento da instruo if diferenciado e o cdigo abaixo
compilaria sem gerar um unreachable code.
1 final int contador = 10;
2 if ( contador < 10) {
3
System . out . println ( contador ) ;
4 }
Mais Sobre
Por qu no ocorre unreachable code quando a condio de um if certamente falsa?
160
www.k19.com.br
161
C ONTROLE DE F LUXO
Quando o valor da varivel debug false, as mensagens no so exibidas. Caso contrrio, ou seja,
quando o valor da varivel debug true, as mensagens so exibidas.
Essa uma prtica comum em diversas linguagens de programao. Por isso, a linguagem Java
trata de forma diferenciada a instruo if em relao ao erro de compilao unreachable code.
Curiosidade
Em ingls, a palavra bug significa inseto. Um erro em um programa de computador costuma ser chamado de bug. A origem desse termo popularmente atribuda cientista Admiral
Grace Hopper. Na dcada de 1940, enquanto trabalhava no computador Mark II, Grace Hooper encontrou uma mariposa presa dentro de uma dos rels desse computador, o que impedia
o seu funcionamento.
O processo de busca e eliminao dos erros (bugs) de um programa chamado de debug ou
depurao.
www.facebook.com/k19treinamentos
161
C ONTROLE DE F LUXO
162
11
}
12
}
13 }
Cdigo Java 4.164: Programa.java
Observe que o corpo do comando if possui apenas uma instruo, j que as chaves no foram
utilizadas. Dessa forma, a instruo System.out.println("Menor") separa o comando else do if.
Programa . java :7: error : else without if
else
^
1 error
162
www.k19.com.br
163
C ONTROLE DE F LUXO
No cdigo acima, ocorre um erro de compilao na linha 6, pois a instruo else no admite uma
condio como na instruo if.
Programa . java :6: error : not a statement
else (a > 10)
^
Programa . java :6: error : ; expected
else (a > 10)
^
2 errors
www.facebook.com/k19treinamentos
163
C ONTROLE DE F LUXO
164
Observe que a condio a < 10 sempre verdadeira porque a varivel a foi inicializada com o
valor 1 e ela nunca alterada. Consequentemente, o corpo do while ser executado indefinidamente.
No cdigo acima, ocorre um erro de compilao na linha 5, pois a chave da instruo switch do
tipo double.
Programa . java :5: error : incompatible types : possible lossy conversion from double to int
switch ( a ) {
^
1 error
No cdigo acima, ocorre um erro de compilao na linha 8, pois a expresso do segundo caso da
instruo switch no constante.
Programa . java :8: error : constant expression required
case b : System . out . println ( b );
^
164
www.k19.com.br
165
C ONTROLE DE F LUXO
1 error
www.facebook.com/k19treinamentos
165
C ONTROLE DE F LUXO
166
4.26 Resumo
1
Para utilizar a instruo de deciso if, devemos definir uma condio e um corpo. O corpo o
bloco de cdigo que ser executado se e somente se a condio for true.
Para utilizar a instruo else, devemos definir um corpo. Essa instruo sempre est associada
instruo if. O corpo do else executado se e somente se a condio do if correspondente for
false.
Instrues de deciso podem ser encadeadas. Em outras palavras, podemos definir ifs e elses
dentro de ifs ou elses.
Para utilizar a instruo de repetio while, devemos definir uma condio e um corpo. O
corpo executado se e somente se a condio for true. Aps cada execuo do corpo, a condio
reavaliada para decidir se o corpo deve ser executado novamente.
Para utilizar a instruo de repetio for, devemos definir uma inicializao, uma condio,
uma atualizao e um corpo. Primeiro, a inicializao executada e em seguida a condio avaliada. Se a condio for true, o corpo executado. Caso contrrio, a execuo do lao encerrada.
Aps cada execuo do corpo, a atualizao processada e a condio reavaliada para decidir se o
corpo deve ser executado novamente.
166
Instrues de repetio podem ser encadeadas. Em outra palavras, podemos definir whiles e
www.k19.com.br
167
C ONTROLE DE F LUXO
10
A instruo continue interrompe a execuo de uma iterao. No while, o continue desvia o fluxo
de execuo para a condio. No for, o continue desvia o fluxo de execuo para a atualizao.
11
Quando o corpo do if possui apenas um comando, ele no precisa ser delimitado com chaves.
A mesma regra vale para o else, while, do-while e for.
12
13
Se a condio de um lao sempre true, o corpo desse lao ser executado repetidamente sem
parar (laos infinitos).
www.facebook.com/k19treinamentos
167
C ONTROLE DE F LUXO
168
168
www.k19.com.br
CAPTULO
A RRAY
5.1 Introduo
Considere um programa de computador que realiza clculos matemticos com os preos dos
produtos de um supermercado. Por exemplo, esse programa calcula a mdia dos preos e encontra
o produto mais barato.
Para manipular os preos dos produtos, dentro de um programa, esses valores devem ser armazenados em variveis.
1
2
3
4
double preco1 ;
double preco2 ;
double preco3 ;
...
Como uma varivel do tipo double armazena somente um valor de cada vez, seria necessrio criar
uma varivel para cada produto. Considerando que em um supermercado existem milhares de produtos, essa abordagem no prtica, pois seria necessrio criar uma grande quantidade de variveis.
Nesses casos, podemos utilizar arrays.
www.facebook.com/k19treinamentos
169
A RRAY
170
Quando um array criado, necessrio definir o tipo de valor que pode ser armazenado em cada
posio. Na analogia com armrio, seria como se tivssemos que definir o que pode ser guardado em
cada gaveta. Por exemplo, se definirmos que um armrio deve guardar livros, ento somente livros
podem ser armazenados nas gavetas desse armrio. No poderemos guardar revistas ou jornais.
REVISTA
LIVRO
5.3 Referncias
Em Java, os arrays so objetos. Para manipular (controlar) um objeto, necessrio possuir a
referncia do mesmo. A referncia de um array como o controle remoto de uma TV. Atravs do
controle remoto, podemos controlar a TV. Atravs da referncia, podemos controlar o array.
170
www.k19.com.br
171
A RRAY
1
2
-/--
0
CH
Importante
Os arrays no so armazenados em variveis. Somente as referncias dos arrays so
armazenadas em variveis.
5.4 Declarao
Antes de criar um array, necessrio declarar uma varivel para armazenar a referncia desse
array. Nessa declarao, o tipo da varivel o tipo das variveis contidas no array seguido dos caracteres [ e ] (colchetes).
1 int [] numeros ;
Cdigo Java 5.2: Declarao
Os colchetes tambm podem ser escritos direita do nome da varivel. Contudo, a forma mais
comum utiliz-los esquerda do nome da varivel.
1 int numeros [];
Cdigo Java 5.3: Colchetes direita do nome da varivel
Duas ou mais variveis podem ser declaradas na mesma instruo. No exemplo abaixo, as variveis numeros, codigos e matriculas so do tipo array de int. Os nomes das variveis devem ser separados
por vrgula.
1 int [] numeros , codigos , matriculas ;
Cdigo Java 5.4: Declarando diversas variveis na mesma instruo
www.facebook.com/k19treinamentos
171
A RRAY
172
5.5 Inicializao
Para criar um array, podemos utilizar o operador new. Na criao de um array, a capacidade deve
ser informada dentro dos colchetes. Essa capacidade pode ser um valor do tipo primitivo byte, short,
char ou int. Ela tambm pode ser um valor do tipo no primitivo Byte, Short, Character ou Integer.
No exemplo abaixo, o operador new cria um array com 10 posies para armazenar valores do tipo
int e devolve a referncia do mesmo. Essa referncia armazenada na varivel numeros.
1 int [] numeros ; // declarao
2
3 numeros = new int [10]; // inicializao
Cdigo Java 5.6: Inicializao
int[]
INFORMA O TIPO DO
NOVO OBJETO
IDENTIFICADOR DA VARIVEL
nomeDoArray
new
INSTANCIA UM
NOVO OBJETO
int[10];
INFORMA A QUANTIDADE
DE POSIES DO ARRAY
Quando um array criado, todas as posies so inicializadas com valores padro. Se as variveis
contidas no array forem de um tipo primitivo numrico, todas so inicializadas com o valor 0. Se elas
forem do tipo primitivo boolean, todas so inicializadas com o valor false. Se elas forem de um tipo
no primitivo, todas so inicializadas com o valor null.
1 int [] numeros = new int [10]; // as posies so inicializadas com 0
2
3 boolean [] aprovados = new boolean [10]; // as posies so inicializadas com false
4
5 String [] nomes = new String [10]; // as posies so inicializadas com null
Cdigo Java 5.8: Valores padro
Armadilha
No exemplo abaixo, um array com capacidade igual a 1 foi criado. De acordo
com as regras da linguagem Java, o cdigo abaixo compila sem problemas. Contudo, o erro
NegativeArraySizeException gerado durante a execuo.
1 int [] numeros = new int [ -1];
172
www.k19.com.br
173
A RRAY
Simulao
Nessa simulao, mostraremos um exemplo de utilizao de array.
1
Ao executar a linha 1, um array com trs variveis do tipo double criado. Essas trs variveis so
inicializadas com o valor real 0.0.
1
2
3
4
5
6
precos[0] = 0.0
precos[1] = 0.0
precos[2] = 0.0
www.facebook.com/k19treinamentos
173
A RRAY
1
2
3
4
5
6
174
precos[0] = 17.54
precos[1] = 0.0
precos[2] = 0.0
1
2
3
4
5
6
precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0
Agora, a linha 4 ser executada e o valor armazenado na varivel de ndice 0 do array criado na
linha 1 exibido na sada padro.
4
1
2
3
4
5
6
precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0
17.54
1
2
3
4
5
6
precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0
17.54
23.81
Por fim, a linha 6 ser executada e o valor armazenado na varivel de ndice 2 do array criado na
linha 1 exibido na sada padro.
6
1
2
3
4
5
6
174
precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0
www.k19.com.br
175
A RRAY
17.54
23.81
0.0
O mesmo array pode ser criado de uma forma mais simples. No exemplo abaixo, novamente, um
array para armazenar valores do tipo int foi criado com capacidade para trs variveis. A primeira
posio foi inicializada com o valor 1, a segunda, com o valor 2 e a terceira foi inicializada com o
valor 3.
1 int [] numeros = {1 , 2 , 3};
O atributo length
No exemplo anterior, a capacidade do array foi inserida diretamente no cdigo fonte em trs
pontos diferentes. Essa prtica pode dificultar algumas mudanas na lgica do cdigo. Em particular, para alterar a capacidade do array de 100 posies para 50 posies, trs lugares devem ser
www.facebook.com/k19treinamentos
175
A RRAY
176
alterados. Basicamente, todos os lugares onde a capacidade do array foi inserida diretamente no
cdigo teriam de ser alterados.
1
2
3
4
5
6
7
8
9
Para facilitar esse tipo de modificao, podemos utilizar o atributo length. Todo array possui
esse atributo e ele armazena a capacidade do array. No exemplo abaixo, o array foi criado com 100
posies. Nos laos, utilizamos o atributo length para recuperar a capacidade do array.
1
2
3
4
5
6
7
8
9
Agora, para alterar a capacidade do array de 100 posies para 50 posies, um nico ponto do
cdigo deve ser alterado.
O lao foreach
Como vimos, o for tradicional pode ser utilizado para percorrer as posies de um array.
1 for ( int i = 0; i < numeros . length ; i ++) {
2
System . out . println ( numeros [ i ]) ;
3 }
Cdigo Java 5.23: Percorrendo um array com o for tradicional
Se o objetivo for somente percorrer as posies de um array sem modificar o seu contedo, podemos utilizar o lao foreach. O exemplo abaixo apresenta a sintaxe desse lao.
1 for ( int numero : numeros ) {
2
System . out . println ( numero ) ;
3 }
Cdigo Java 5.24: Sintaxe do lao foreach
direita do caractere :, necessrio indicar a varivel que contm a referncia do array que
desejamos percorrer. No exemplo acima, a varivel numeros foi indicada. esquerda do caractere :,
necessrio declarar uma varivel compatvel com o tipo das variveis armazenadas no array. No
176
www.k19.com.br
177
A RRAY
exemplo acima, a varivel numero do tipo int foi declarada. Na primeira iterao do lao, o valor armazenado na primeira posio do array copiado e guardado na varivel numero. Na segunda iterao,
o valor da segunda posio do array copiado e guardado na varivel numero e assim sucessivamente
at a ltima posio do array.
3
3
1
0
Figura 5.5: Abstrao de um array multidimensional
Declarao
A declarao de um array multidimensional semelhante declarao de um array unidimensional. A quantidade de dimenses de um array definida pela quantidade de pares de colchetes. No
exemplo abaixo, a varivel numeros pode guardar a referncia de um array bidimensional. Observe os
dois pares de colchetes.
1 int [][] numeros ;
Cdigo Java 5.25: Array bidimensional
www.facebook.com/k19treinamentos
177
A RRAY
178
Assim como nos arrays unidimensionais, os colchetes podem ser escritos direita do nome da
varivel.
1 int numeros [][];
Cdigo Java 5.26: Array bidimensional
Tambm possvel mesclar as duas abordagens e definir pares de colchetes esquerda e direita
do nome da varivel.
1 int [] numeros [];
Cdigo Java 5.27: Array bidimensional
Duas ou mais variveis podem ser declaradas na mesma instruo. No exemplo abaixo, a varivel x pode armazenar a referncia de um array bidimensional, a varivel y a referncia de um array
tridimensional e a varivel z a referncia de um array unidimensional.
1 int [] x [] , y [][] , z ;
Cdigo Java 5.29: Declarando diversas variveis na mesma instruo
Inicializao
Na criao de um array multidimensional, pelo menos a capacidade da primeira dimenso precisa ser definida.
No exemplo abaixo, um array bidimensional foi criado. A primeira dimenso foi definida com
capacidade igual a 10 e a segunda dimenso com capacidade igual a 20. Nesse caso, foram criados
10 arrays com 20 posies cada um para armazenar valores do tipo int e um array com 10 posies
para armazenar as referncias desses 10 arrays. Ento, no total, 11 arrays foram criados, sendo 10
unidimensionais e 1 bidimensional. Dessa forma, temos espao para armazenar 200 (isto , 10 20)
valores do tipo int.
178
www.k19.com.br
179
A RRAY
No prximo exemplo, um array bidimensional foi criado. A primeira dimenso desse array foi
definida com capacidade igual a 30. A capacidade da segunda dimenso no foi definida. Nesse
caso, foi criado apenas 1 array com 30 posies para guardar referncias de arrays que armazenam
valores do tipo int.
1 int [][] numeros = new int [30][];
Cdigo Java 5.32: Inicializando apenas a primeira dimenso
Acesso
Para acessar uma posio em um array multidimensional, necessrio definir um ndice para
cada dimenso. No exemplo abaixo, armazenamos o valor 1 na quarta posio (posio 3) do terceiro
(posio 2) array unidimensional.
1 int [][] numeros = new int [10][20];
www.facebook.com/k19treinamentos
179
A RRAY
180
2
3 numeros [2][3] = 1;
Cdigo Java 5.36: Acessando as posies de um array multidimensional
Nesse outro exemplo, armazenamos o valor 1 na quarta posio (posio 3) do terceiro (posio
2) array unidimensional do segundo (posio 1) array bidimensional.
1 int [][][] numeros = new int [10][20][30];
2
3 numeros [1][2][3] = 1;
Cdigo Java 5.37: Acessando as posies de um array multidimensional
180
www.k19.com.br
181
A RRAY
Simulao
Nessa simulao, mostraremos um exemplo de utilizao de array multidimensional.
Ao executar a linha 1, um array multidimensional 2 por 2 do tipo int criado. Todas as posies
desse array so inicializadas com valor padro do tipo int, ou seja, todas as posies so inicializadas
com o valor 0.
1
1
2
3
4
5
6
7
8
9
x[0][0] = 0
x[0][1] = 0
x[1][0] = 0
x[1][1] = 0
2
Em seguida, a linha 2 executada e o valor inteiro 1 armazenado na varivel de ndice [0][0] do
array criado na linha 1.
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 0
x[1][0] = 0
x[1][1] = 0
3
Na sequncia, a linha 3 executada e o valor inteiro 2 armazenado na varivel de ndice [0][1]
do array criado na linha 1.
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
x[1][0] = 0
x[1][1] = 0
Agora, a linha 4 executada e o valor inteiro 3 armazenado na varivel de ndice [1][0] do array
criado na linha 1.
4
www.facebook.com/k19treinamentos
181
A RRAY
1
2
3
4
5
6
7
8
9
182
x[0][0] = 1
x[0][1] = 2
x[1][0] = 3
x[1][1] = 0
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
x[1][0] = 3
x[1][1] = 4
Em seguida, a linha 6 ser executada e o valor armazenado na varivel de ndice [0][0] do array
criado na linha 1 exibido na sada padro.
6
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
x[1][0] = 3
x[1][1] = 4
Na sequncia, a linha 7 ser executada e o valor armazenado na varivel de ndice [0][1] do array
criado na linha 1 exibido na sada padro.
7
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
x[1][0] = 3
x[1][1] = 4
1
2
182
www.k19.com.br
183
A RRAY
Na sequncia, a linha 8 ser executada e o valor armazenado na varivel de ndice [1][0] do array
criado na linha 1 exibido na sada padro.
8
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
x[1][0] = 3
x[1][1] = 4
1
2
3
Por fim, a linha 9 ser executada e o valor armazenado na varivel de ndice [1][1] do array criado
na linha 1 exibido na sada padro.
9
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
x[1][0] = 3
x[1][1] = 4
1
2
3
4
No cdigo acima, ocorre um erro de compilao na linha 5, pois um valor de tipo double foi utilizado como ndice do array.
Programa . java :5: error : incompatible types : possible lossy conversion from double to int
System . out . println ( numeros [ i ]);
^
1 error
www.facebook.com/k19treinamentos
183
A RRAY
184
No cdigo acima, tentamos acessar a posio de nmero 5 do array a. Apesar do array possuir 5
posies, elas devem ser acessadas com ndices que variam de 0 a 4.
Exception in thread " main " java . lang . ArrayIndexOutOfBoundsException : 5
at Programa . main ( Programa . java :4)
5.14 Resumo
1
dos.
184
www.k19.com.br
185
A RRAY
www.facebook.com/k19treinamentos
185
A RRAY
186
186
www.k19.com.br
CAPTULO
M TODOS
6.1 Introduo
Considere o sistema de uma empresa que precisa gerar diversos tipos de documentos como recibos, atestados e relatrios. Os dados da empresa devem aparecer no cabealho desses documentos.
1 System . out . println ( " ------------ K19 Treinamentos ------------" ) ;
2 System . out . println ( " ----------- contato@k19 . com . br -----------" ) ;
Cdigo Java 6.1: Cabealho
As duas linhas de cdigo acima exibem o cabealho dos documentos. Toda vez que um documento gerado, esse trecho de cdigo deve ser executado. A primeira abordagem para resolver esse
problema replicar essas duas linhas toda vez que for necessrio. Contudo, essa replicao tornar
a manuteno do sistema mais complicada.
Por exemplo, suponha que o sistema j esteja funcionando e o trecho de cdigo que exibe o cabealho dos documentos tenha sido replicado muitas vezes. Agora, considere uma mudana simples
no cabealho dos documentos. O telefone da empresa deve aparecer depois do email. Para atender
a essa nova regra, ser necessrio modificar o cdigo fonte em vrios lugares.
De forma geral, toda vez que houver uma alterao no cabealho, ser necessrio modificar muitos lugares do cdigo fonte. Consequentemente, a manuteno do sistema ser mais demorada.
Para facilitar eventuais mudanas no cabealho, podemos utilizar o conceito de mtodo. Um mtodo permite que um determinado trecho de cdigo possa ser reutilizado vrias vezes.
A palavra chave static permite que o mtodo exibeCabecalho possa ser utilizado sem a criao
www.facebook.com/k19treinamentos
187
M TODOS
188
de um objeto. O conceito de objeto no faz parte do contedo deste livro. Portanto, utilizaremos o
modificador static na declarao de todos os mtodos desse material.
A palavra chave void indica que o mtodo exibeCabecalho no devolver nenhuma resposta depois
de ser executado.
direita da palavra chave void, definimos o nome do mtodo. Em nosso caso, o nome do mtodo
exibeCabecalho. Os nomes dos mtodos so utilizados para cham-los posteriormente.
Depois do nome do mtodo, os parmetros so definidos dentro de parnteses. Como o mtodo
exibeCabecalho no precisa de parmetros, nada foi definido dentro dos parnteses.
Por fim, direita dos parmetros, foi definido o corpo do mtodo exibeCabecalho. No corpo de um
mtodo, colocamos as instrues que devem ser executadas quando esse mtodo for chamado.
Observe, no cdigo abaixo, o mtodo exibeCabecalho sendo chamado duas vezes.
1 class Programa {
2
public static void main ( String [] args ) {
3
// chamando o mtodo exibeCabecalho
4
exibeCabecalho () ;
5
System . out . println ( " Recibo : R$ 545 ,00 " ) ;
6
7
System . out . println () ;
8
9
// chamando mtodo exibeCabecalho
10
exibeCabecalho () ;
11
System . out . println ( " Atestado de Matrcula : Jonas Keizo Hirata " ) ;
12
}
13
14
static void exibeCabecalho () {
15
System . out . println ( " ------------ K19 Treinamentos ------------" ) ;
16
System . out . println ( " ----------- contato@k19 . com . br -----------" ) ;
17
}
18 }
Agora, acrescentar o telefone da empresa no cabealho dos documentos muito fcil. Basta
alterar o cdigo do mtodo exibeCabecalho.
1 static void exibeCabecalho () {
2
System . out . println ( " ------------ K19 Treinamentos ------------" ) ;
3
System . out . println ( " ----------- contato@k19 . com . br -----------" ) ;
4
System . out . println ( " -------------- 11 2387 -3791 --------------" ) ;
5 }
6.3 Parmetros
Considere um programa de computador que realiza operaes financeiras como o clculo de
juros simples por exemplo. Para evitar repetio de cdigo, podemos definir um mtodo para realizar
188
www.k19.com.br
189
M TODOS
www.facebook.com/k19treinamentos
189
M TODOS
190
Observe que o mtodo acima considera um capital fixo de R$ 10.000,00, uma taxa de juro fixa de
1,5% e um perodo fixo de 12 meses. De fato, esse mtodo no muito til porque toda vez que ele
for chamado, ele realizar o clculo com esses valores fixos.
Para tornar o mtodo calculaJuroSimples mais til, devemos parametriz-lo. Basicamente, os parmetros de um mtodo so variveis que permitem que valores diferentes sejam passados a cada
chamada desse mtodo.
1 static void calculaJuroSimples ( double capital , double taxa , int periodo ) {
2
double juro = capital * taxa * periodo ;
3 }
No cdigo acima, trs parmetros foram definidos para o mtodo calculaJuroSimples: capital, taxa
e periodo. O primeiro parmetro do tipo double, o segundo tambm do tipo double e o terceiro do
tipo int.
Agora, nas chamadas do mtodo calculaJuroSimples, devemos passar os trs valores necessrios
para o clculo do juro simples. No exemplo a seguir, o mtodo main chama o mtodo calculaJuroSimples
duas vezes. Na primeira chamada, os valores passados como parmetros so 10000, 0.015 e 12. Na
segunda chamada, os valores passados como parmetros so 25400, 0.02 e 30.
1 class Programa {
2
public static void main ( String [] args ) {
3
calculaJuroSimples (10000 , 0.015 , 12) ;
4
5
calculaJuroSimples (25400 , 0.02 , 30) ;
6
}
7
8
static void calculaJuroSimples ( double capital , double taxa , int periodo ) {
9
double juro = capital * taxa * periodo ;
10
}
11 }
6.4 Resposta
O valor calculado dentro do mtodo calculaJuroSimples armazenado em uma varivel local. Essa
varivel no pode ser acessada dentro do mtodo main. Em outras palavras, o mtodo main no tem
acesso ao valor do juro que foi calculado dentro do mtodo calculaJuroSimples.
Todo mtodo pode, ao final do seu processamento, devolver uma resposta para quem o chamou.
O comando return indica o valor de resposta de um mtodo.
1 static double calculaJuroSimples ( double capital , double taxa , int periodo ) {
2
double juro = capital * taxa * periodo ;
3
return juro ;
4 }
190
www.k19.com.br
191
M TODOS
void indicava que o mtodo no devolvia nenhuma resposta ao final do seu processamento. A pala-
vra double indica que o mtodo devolver um valor do tipo double ao final do seu processamento. A
segunda modificao a utilizao do comando return para devolver como resposta o juro calculado,
que um valor do tipo double.
Agora, a resposta pode ser recuperada no mtodo main e armazenada em uma varivel por exemplo.
1 class Programa {
2
public static void main ( String [] args ) {
3
double resposta1 = calculaJuroSimples (10000 , 0.015 , 12) ;
4
5
double resposta2 = calculaJuroSimples (25400 , 0.02 , 30) ;
6
7
System . out . println ( " Juro : " + resposta1 ) ;
8
System . out . println ( " Juro : " + resposta2 ) ;
9
}
10
11
static double calculaJuroSimples ( double capital , double taxa , int periodo ) {
12
double juro = capital * taxa * periodo ;
13
return juro ;
14
}
15 }
Um mtodo pode devolver outros tipos de valores. Para isso, basta modificar a marcao de
retorno definindo o tipo de valor que o mtodo devolver. Veja alguns exemplos.
1 static int metodo () {
2
// corpo de um mtodo que devolve int
3 }
Simulao
Nessa simulao, mostraremos um exemplo de chamada de mtodo.
1
Na execuo da linha 3, uma varivel do tipo int chamada a declarada e inicializada com o
valor 1. Essa varivel uma varivel local do mtodo main.
www.facebook.com/k19treinamentos
191
M TODOS
1 class Metodos {
2
public static void main ( String [] args ) {
3
int a = 1;
4
int b = 2;
5
int c = soma (a , b ) ;
6
System . out . println ( c ) ;
7
}
8
static int soma ( int a , int b ) {
9
int c = a + b ;
10
return c ;
11
}
12 }
192
amain = 1
Na sequncia, a linha 4 executada e uma varivel do tipo int chamada b declarada e inicializada com o valor 2. Essa varivel uma varivel local do mtodo main.
2
1 class Metodos {
2
public static void main ( String [] args ) {
3
int a = 1;
4
int b = 2;
5
int c = soma (a , b ) ;
6
System . out . println ( c ) ;
7
}
8
static int soma ( int a , int b ) {
9
int c = a + b ;
10
return c ;
11
}
12 }
amain = 1
bmain = 2
3
Em seguida, na linha 5, o mtodo soma chamado. Os valores armazenados nas variveis a e b do
mtodo main so passados como argumentos nessa chamada de mtodo.
1 class Metodos {
2
public static void main ( String [] args ) {
3
int a = 1;
4
int b = 2;
5
int c = soma (a , b ) ;
6
System . out . println ( c ) ;
7
}
8
static int soma ( int a , int b ) {
9
int c = a + b ;
10
return c ;
11
}
12 }
amain = 1
bmain = 2
Agora, as variveis a e b do mtodo soma recebem os valores passados como argumentos no passo
anterior. Essas variveis so variveis locais do mtodo soma.
4
192
www.k19.com.br
193
M TODOS
1 class Metodos {
2
public static void main ( String [] args ) {
3
int a = 1;
4
int b = 2;
5
int c = soma (a , b ) ;
6
System . out . println ( c ) ;
7
}
8
static int soma ( int a , int b ) {
9
int c = a + b ;
10
return c ;
11
}
12 }
amain = 1
bmain = 2
asoma = 1
bsoma = 2
1 class Metodos {
2
public static void main ( String [] args ) {
3
int a = 1;
4
int b = 2;
5
int c = soma (a , b ) ;
6
System . out . println ( c ) ;
7
}
8
static int soma ( int a , int b ) {
9
int c = a + b ;
10
return c ;
11
}
12 }
amain = 1
bmain = 2
asoma = 1
bsoma = 2
csoma = 3
6 Em seguida, ao executar a linha 10, o valor armazenado na varivel c do mtodo soma devolvido
como resposta para o mtodo main.
1 class Metodos {
2
public static void main ( String [] args ) {
3
int a = 1;
4
int b = 2;
5
int c = soma (a , b ) ;
6
System . out . println ( c ) ;
7
}
8
static int soma ( int a , int b ) {
9
int c = a + b ;
10
return c ;
11
}
12 }
amain = 1
bmain = 2
asoma = 1
bsoma = 2
csoma = 3
Agora, o fluxo de execuo volta para o mtodo main. Na linha 5, a varivel c desse mtodo recebe
a resposta da chamada do mtodo soma.
7
www.facebook.com/k19treinamentos
193
M TODOS
194
1 class Metodos {
2
public static void main ( String [] args ) {
3
int a = 1;
4
int b = 2;
5
int c = soma (a , b ) ;
6
System . out . println ( c ) ;
7
}
8
static int soma ( int a , int b ) {
9
int c = a + b ;
10
return c ;
11
}
12 }
amain = 1
bmain = 2
cmain = 3
Por fim, na execuo da linha 6, o valor da varivel c do mtodo main exibido na sada padro.
1 class Metodos {
2
public static void main ( String [] args ) {
3
int a = 1;
4
int b = 2;
5
int c = soma (a , b ) ;
6
System . out . println ( c ) ;
7
}
8
static int soma ( int a , int b ) {
9
int c = a + b ;
10
return c ;
11
}
12 }
amain = 1
bmain = 2
cmain = 3
194
www.k19.com.br
195
M TODOS
Alteraes nos valores armazenados nas variveis do mtodo exibeSoma no afetam o contedo
das variveis do mtodo main e vice-versa.
Para exemplificar esse comportamento, considere o cdigo abaixo. Na linha 3, a varivel a do
mtodo main foi declarada e inicializada com o valor 1. Na chamada do mtodo teste, na linha 5, o
valor armazenado nessa varivel copiado para a varivel a do mtodo teste. O contedo da varivel
a do mtodo teste alterado na linha 11 e essa varivel passa a armazenar o valor 2. Quando o fluxo
de execuo volta para o mtodo main, o mtodo println utilizado para exibir o valor da varivel a do
mtodo main. Essa varivel armazena o valor 1. Portanto, na sada padro, o nmero 1 ser exibido.
1 class Programa {
2
public static void main ( String [] args ) {
3
int a = 1;
4
5
teste ( a ) ;
6
7
System . out . println ( a ) ; // exibe 1
8
}
9
10
static void teste ( int a ) {
11
a = 2;
12
}
13 }
Cdigo Java 6.22: Programa.java
www.facebook.com/k19treinamentos
195
M TODOS
196
Simulao
Nessa simulao, mostraremos um exemplo de passagem de parmetros.
Na execuo da linha 3, uma varivel do tipo int chamada a declarada e inicializada com o
valor 1. Essa varivel uma varivel local do mtodo main.
1
1 class Parametros {
2
public static void main ( String [] args ) {
3
int a = 1;
4
troca ( a ) ;
5
System . out . println ( a ) ;
6
}
7
static void troca ( int a ) {
8
a = 2;
9
}
10 }
amain = 1
amain = 1
Agora, a varivel a do mtodo troca recebe o valor passado como argumento no passo anterior.
Essa varivel uma varivel local do mtodo troca.
3
1 class Parametros {
2
public static void main ( String [] args ) {
3
int a = 1;
4
troca ( a ) ;
5
System . out . println ( a ) ;
6
}
7
static void troca ( int a ) {
8
a = 2;
9
}
10 }
amain = 1
atroca = 1
4
Na execuo da linha 8, o valor da varivel a do mtodo troca alterado. Essa alterao no afeta
o valor da varivel a do mtodo main, pois essas variveis so independentes.
196
www.k19.com.br
197
M TODOS
1 class Parametros {
2
public static void main ( String [] args ) {
3
int a = 1;
4
troca ( a ) ;
5
System . out . println ( a ) ;
6
}
7
static void troca ( int a ) {
8
a = 2;
9
}
10 }
amain = 1
atroca = 2
5
O fluxo de execuo volta para o mtodo main. Ao executar a linha 5, o valor da varivel a do
mtodo main exibido na sada padro, ou seja, o nmero 1 exibido na sada padro.
1 class Parametros {
2
public static void main ( String [] args ) {
3
int a = 1;
4
troca ( a ) ;
5
System . out . println ( a ) ;
6
}
7
static void troca ( int a ) {
8
a = 2;
9
}
10 }
amain = 1
6.6 Sobrecarga
No exemplo abaixo, o mtodo maximo recebe como parmetro exatamente dois valores do tipo
double e devolve o maior deles.
1 static double maximo ( double a , double b ) {
2
if ( a > b ) {
3
return a ;
4
} else {
5
return b ;
6
}
7 }
Esse mtodo pode ser utilizado toda vez que temos dois valores do tipo double e desejamos descobrir qual o maior. As chamadas abaixo mostram a utilizao do mtodo maximo.
1 double m1 = maximo (7.8 , 9.8) ;
2 double m2 = maximo (3.2 , 1.7) ;
3 double m3 = maximo (5.4 , 4.9) ;
Agora, considere que, com bastante frequncia, necessrio descobrir o mximo entre trs valores do tipo double. Para resolver esse problema, o mtodo maximoEntreTresValores foi definido.
1 static double maximoEntreTresValores ( double a , double b , double c ) {
2
if ( a >= b && a >= c ) {
3
return a ;
4
} else if ( b >= a && b >= c ) {
5
return b ;
www.facebook.com/k19treinamentos
197
M TODOS
198
6
} else {
7
return c ;
8
}
9 }
10
11 static double maximo ( double a , double b ) {
12
if ( a >= b ) {
13
return a ;
14
} else {
15
return b ;
16
}
17 }
Os dois mtodos acima possuem objetivos muito parecidos. Um deles descobre quem o maior
entre dois valores do tipo double. O outro descobre quem o maior entre trs valores do tipo double.
Esses mtodos podem ser utilizados de forma semelhante ao apresentado no cdigo abaixo.
1 double m1 = maximo (7.8 , 9.8) ;
2 double m2 = maximoEntreTresValores (3.2 , 1.7 , 4.1) ;
De forma anloga e conforme a necessidade, poderamos definir o mtodo maximoEntreQuatroValores ou maximoEntreCincoValores. Do ponto de vista prtico, no interessante ter mtodos com ob-
Nas chamadas desses mtodos, eles so diferenciados de acordo com a quantidade de argumentos utilizados. No cdigo a seguir, a primeira chamada aciona o mtodo maximo que recebe dois parmetros. A segunda chamada aciona o mtodo maximo que recebe trs parmetros. A terceira chamada
aciona o mtodo maximo que recebe quatro parmetros.
1 double m1 = maximo (7.8 , 9.8) ;
2 double m2 = maximo (3.2 , 1.7 , 4.1) ;
3 double m3 = maximo (7.5 , 6.3 , 9.7 , 8.8) ;
Regra
Dois mtodos podem ter o mesmo nome se as respectivas listas de parmetros so diferentes em
quantidade ou tipo. Se essa regra no for respeitada, ocorrer erro de compilao.
198
www.k19.com.br
199
M TODOS
No exemplo abaixo, h uma sobrecarga invlida porque os dois mtodos que possuem o mesmo
nome tambm possuem listas de parmetros equivalentes. Os dois recebem dois parmetros do tipo
double.
1
2
3
4
5
6
7
6.7 Varargs
No exemplo abaixo, o mtodo calculaSomatorio recebe como parmetro exatamente trs valores
do tipo double. Depois, ele calcula e devolve o somatrio desses valores.
1 static double calculaSomatorio ( double a , double b , double c ) {
2
return a + b + c ;
3 }
double
double
double
double
s1
s2
s3
s4
=
=
=
=
calculaSomatorio (1.5 ,
calculaSomatorio (5.1 ,
calculaSomatorio (5.5 ,
calculaSomatorio (1.9 ,
2.7 ,
1.7 ,
4.2 ,
2.1 ,
6.4) ;
3.2) ;
4.7) ;
5.0) ;
Observe que o mtodo calculaSomatorio s pode ser utilizado para calcular o somatrio de exatamente trs valores do tipo double. Contudo, ele seria mais til se pudesse calcular o somatrio de
zero ou mais valores do tipo double. Para isso, o mtodo calculaSomatorio precisa ser capaz de receber
zero ou mais valores como parmetro.
Agora, no exemplo abaixo, o parmetro do mtodo calculaSomatorio um varargs. O que caracteriza esse parmetro ser um varargs a utilizao dos trs pontos.
1 static double calculaSomatorio ( double ... valores ) {
2
3 }
double
double
double
double
s1
s2
s3
s4
=
=
=
=
calculaSomatorio () ;
calculaSomatorio (5.1) ;
calculaSomatorio (5.5 , 4.2) ;
calculaSomatorio (1.9 , 2.1 , 5.0) ;
www.facebook.com/k19treinamentos
199
M TODOS
200
Agora, considere um mtodo que calcula e devolve a mdia aritmtica de valores do tipo double.
Matematicamente, no faz sentido calcular a mdia aritmtica de zero nmeros. Portanto, esse mtodo deve receber pelo menos um argumento do tipo double.
No exemplo abaixo, o mtodo calculaMedia foi definido com um parmetro do tipo double e um
varags de double. Sendo assim, a cada chamada desse mtodo, necessrio passar como argumento
pelo menos um valor do tipo double.
1 static double calculaMedia ( double valor , double ... valores ) {
2
double soma = valor ;
3
for ( int i = 0; i < valores . length ; i ++) {
4
soma += valores [ i ];
5
}
6
return soma / (1 + valores . length ) ;
7 }
double
double
double
double
m1
m2
m3
m4
=
=
=
=
calculaMedia (3.5) ;
calculaMedia (5.1 , 6.7) ;
calculaMedia (5.5 , 4.2 , 8.9) ;
calculaMedia (1.9 , 2.1 , 5.0 , 8.8) ;
Regra
H uma regra fundamental relacionada utilizao de varargs. O varargs, se existir, deve ser o
ltimo parmetro do mtodo correspondente. Dessa forma, as listas de parmetros dos mtodos
abaixo esto corretas.
1
2
3
4
5
6
7
Uma concluso imediata da regra de utilizao de varargs que todo mtodo pode ter no mximo
um parmetro varargs.
200
www.k19.com.br
201
M TODOS
www.facebook.com/k19treinamentos
201
M TODOS
202
Programa . java :3: error : incompatible types : String cannot be converted to int
int a = metodo ();
^
Programa . java :4: error : incompatible types : String cannot be converted to double
double b = metodo ();
^
Programa . java :5: error : incompatible types : String cannot be converted to boolean
boolean c = metodo ();
^
3 errors
Note que o mtodo teste no devolve uma resposta. Como esse mtodo no void, ocorre um
erro de compilao. A mensagem de erro de compilao seria semelhante apresentada abaixo.
Programa . java :8: error : missing return statement
}
^
1 error
No exemplo acima, se o valor gerado pelo mtodo Math.random for menor ou igual a 0.5, o mtodo
teste no devolver resposta. Novamente, como esse mtodo no void ocorre um erro de compilao. A mensagem de erro de compilao seria semelhante apresentada abaixo.
202
www.k19.com.br
203
M TODOS
Neste outro exemplo, o mtodo teste foi declarado corretamente, mas foi chamado sem parnteses.
1 class Programa {
2
public static void main ( String [] args ) {
3
teste ;
4
}
5
6
static void teste () {
7
System . out . println ( " K19 " ) ;
8
}
9 }
Cdigo Java 6.49: Programa.java
www.facebook.com/k19treinamentos
203
M TODOS
204
6.12 Resumo
1
Um mtodo possui uma marcao de retorno, um nome, uma lista de parmetros e um corpo.
A palavra reservada return utilizada para finalizar um mtodo e devolver uma resposta caso o
mtodo no seja void.
10
204
www.k19.com.br
CAPTULO
S TRING
7.1 Referncias
Em Java, as strings so objetos. Para controlar um objeto, necessrio possuir uma referncia
desse objeto. Uma referncia de uma string como um controle remoto de uma TV. Atravs de um
controle remoto, podemos controlar uma TV. Atravs de uma referncia, podemos controlar uma
string.
1
2
-/--
0
CH
Importante
As variveis do tipo String no armazenam os objetos do tipo String. Elas armazenam
referncias para esses objetos.
Ao executar o cdigo abaixo, um objeto do tipo String ser criado com o contedo Rafael. A
referncia desse objeto ser armazenada na varivel nome.
1 class Programa {
2
public static void main ( String [] args ) {
3
String nome = " Rafael " ;
4
}
5 }
www.facebook.com/k19treinamentos
205
S TRING
206
O pool de strings um repositrio no qual objetos do tipo String so armazenados para serem
reaproveitados. No pool de strings no h strings repetidas (objetos do tipo String que armazenam a
mesma sequncia de caracteres).
Importante
Objetos do tipo String criados com o operador new no so colocados no pool de strings.
Dessa forma, eles no so reaproveitados. No exemplo abaixo, dois objetos do tipo String com o
mesmo contedo sero criados. A varivel a armazenar uma referncia do primeiro objeto e a
varivel b armazenar uma referncia do segundo objeto.
1 class Programa {
2
public static void main ( String [] args ) {
3
String a = new String ( " Rafael " ) ;
4
String b = new String ( " Rafael " ) ;
5
}
6 }
Cdigo Java 7.3: Criando strings com o operador new
Mais Sobre
Considere um objeto do tipo String. Esse objeto pode estar ou no no pool de strings.
Atravs do mtodo intern, podemos obter uma referncia para um objeto do tipo String com o
mesmo contedo que esteja no pool de Strings.
No exemplo abaixo, um objeto do tipo String foi criado na linha 3 com o operador new. Consequentemente, esse objeto no armazenado no pool de Strings. Na linha 4, o mtodo intern
206
www.k19.com.br
207
S TRING
devolve uma referncia do objeto do tipo String que possui o mesmo contedo do objeto criado
na linha 3.
1 class Programa {
2
public static void main ( String [] args ) {
3
String a = new String ( " Rafael " ) ;
4
String b = a . intern () ;
5
}
6 }
Cdigo Java 7.4: Utilizando o mtodo intern
No exemplo seguinte, um objeto do tipo String foi criado na linha 3 com a utilizao da string
literal Rafael. Consequentemente, esse objeto armazenado no pool de strings. Na linha 4, o
mtodo intern devolve uma referncia do objeto criado na linha 3.
1 class Programa {
2
public static void main ( String [] args ) {
3
String a = " Rafael " ;
4
String b = a . intern () ;
5
}
6 }
Cdigo Java 7.5: Utilizando o mtodo intern
No mtodo main, so criados dois objetos do tipo String e suas referncias so armazenadas nas
variveis a e b. Como ambos os objetos armazenam a mesma sequncia de caracteres (a palavra
K19), o mtodo equals devolve true quando aplicado s variveis a e b.
Como o operador new cria um novo objeto, dois objetos diferentes foram criados nas linhas 3
e 4 do cdigo acima. Como so objetos diferentes, as referncias armazenadas nas variveis a e b
tambm so diferentes. Assim, quando o operador == aplicado s variveis a e b, ele devolve false.
www.facebook.com/k19treinamentos
207
S TRING
208
Na linha 3, criado um objeto do tipo String que armazena a sequncia de caracteres K19. Esse
objeto armazenado no pool de strings e a referncia desse objeto armazenada na varivel a. Na
linha 4, a sequncia de caracteres K19 utilizada novamente. Como o objeto criado na linha 3
est no pool de strings e seu contedo justamente a sequncia de caracteres K19, ao invs de
um novo objeto ser criado na linha 4, o objeto criado na linha 3 reaproveitado e a varivel b passa
a armazenar uma referncia desse objeto. Assim, as variveis a e b armazenam referncias iguais.
Portanto, o operador == devolve true quando aplicado a essas duas variveis.
7.4 Imutabilidade
O contedo de um objeto do tipo String no pode ser alterado. Por isso, as strings so consideradas imutveis. Alguns mtodos dos objetos do tipo String podem sugerir que o contedo de uma
string possa ser alterado. Contudo, esses mtodos, geralmente, criam uma cpia da string original
com determinadas alteraes.
Por exemplo, na linha 3 do cdigo abaixo, uma string foi criada de forma literal com o contedo
rafael. Uma referncia dessa string foi armazenada na varivel a. Na linha 4, o mtodo toUpperCase
foi utilizado. Esse mtodo cria uma cpia da string original substituindo as letras minsculas por
letras maisculas e devolve uma referncia dessa cpia. Dessa forma, a varivel b armazenar uma
referncia de um objeto do tipo String com o contedo RAFAEL.
1 class Programa {
2
public static void main ( String [] args ) {
3
String a = " rafael " ;
4
String b = a . toUpperCase () ;
5
6
System . out . println ( a ) ; // rafael
7
System . out . println ( b ) ; // RAFAEL
8
}
9 }
Cdigo Java 7.8: Utilizando o mtodo toUpperCase
7.5 StringBuilder
Em algumas situaes, necessrio montar uma string atravs de concatenaes sucessivas.
No exemplo abaixo, uma lista de nmeros criada atravs de uma sequncia de concatenaes.
1 class Programa {
2
public static void main ( String [] args ) {
3
String numeros = " " ;
208
www.k19.com.br
209
S TRING
4
for ( int i = 0; i < 1000; i ++) {
5
numeros = numeros + i + " " ;
6
}
7
System . out . println ( numeros ) ;
8
}
9 }
Cdigo Java 7.9: Montando uma lista de nmeros com concatenaes
A cada concatenao, um novo objeto do tipo String criado. No for do cdigo anterior, duas mil
concatenaes sero realizadas no total. Dessa forma, dois mil objetos do tipo String sero criados.
A criao de muitos objetos prejudica a performance dos programas.
Nessas situaes, podemos utilizar um objeto do tipo StringBuilder. Na linha 3 do exemplo abaixo,
um string builder vazio foi criado. No corpo do for, o mtodo append foi utilizado para adicionar contedo ao string builder. Depois do lao, o mtodo toString foi utilizado para obter uma string com o
contedo armazenado no string builder.
1 class Programa {
2
public static void main ( String [] args ) {
3
StringBuilder builder = new StringBuilder () ;
4
for ( int i = 0; i < 1000; i ++) {
5
builder . append ( i ) ;
6
builder . append ( " " ) ;
7
}
8
String numeros = builder . toString () ;
9
System . out . println ( numeros ) ;
10
}
11 }
Cdigo Java 7.10: Montando uma lista de nmeros com StringBuilder
Diferentemente das concatenaes com o operador +, o mtodo append no cria novos objetos.
Portanto, a performance do programa no comprometida.
7.6 Formatao
Considere um programa que registra as compras dos clientes nos caixas de um supermercado.
Quando uma compra finalizada, o programa deve exibir o cupom fiscal. Esse cupom deve conter
o nome, o preo unitrio e a quantidade de cada produto, alm do valor total por produto e o valor
total da compra. O preo unitrio deve ser exibido com 2 casas decimais e alinhado direita. A
quantidade deve ser exibida sempre com 3 dgitos. O preo total por produto deve ser exibido com 2
casas decimais e alinhado direita. Veja o exemplo abaixo.
www.facebook.com/k19treinamentos
209
S TRING
210
-----------------------------------------CUPOM FISCAL
-----------------------------------------PRODUTO
UNITRIO QTD
TOTAL
-----------------------------------------Sorvete
18.75 002
37.50
Chocolate
5.00 003
15.00
Refrigerante
3.89 014
54.46
Bolacha
1.80 058
104.40
-----------------------------------------TOTAL: 211.36
------------------------------------------
Ao invs do mtodo println, podemos usar o mtodo format para exibir o ttulo do cupom fiscal
de forma centralizada. O mtodo format no adiciona automaticamente uma quebra de linha no final
da mensagem exibida. Por isso, no exemplo abaixo, adicionamos uma quebra de linha manual com
a sequncia de escape \n.
1 System . out . format ( "
O mtodo format aceita uma quantidade varivel de argumentos. O primeiro argumento do mtodo format obrigatrio e chamado de string de formatao. Os demais argumentos so combinados com a string de formatao para definir a mensagem que ser exibida.
No exemplo abaixo, quando a string de formatao for combinada com o segundo argumento do
mtodo format, o trecho %s ser substitudo por CUPOM FISCAL. Dessa forma, o ttulo do cupom
fiscal ser exibido da forma desejada.
1 System . out . format ( "
210
www.k19.com.br
211
S TRING
Os 15 espaos em branco acrescentados diretamente no cdigo fonte podem gerar algumas dificuldades. Por exemplo, no fcil verificar se h exatamente 15 espaos em branco olhando o cdigo
fonte. Para melhorar a legibilidade do cdigo, podemos trocar o trecho %s por %27s. O nmero
27 indica a quantidade minma de caracteres que devem ser utilizados para formar a mensagem que
ser exibida.
1 System . out . format ( " %27 s \ n " , " CUPOM FISCAL " ) ;
No exemplo acima, quando a string de formatao for combinada com o segundo argumento
do mtodo format, o trecho %27s ser substitudo por CUPOM FISCAL. Contudo, 15 espaos em
branco sero adicionados esquerda desse texto para completar a quantidade mnima de caracteres
que 27.
37.65
37.65
Dois ou mais parmetros na string de formatao podem ser associados a um mesmo argumento
do mtodo format. Para isso, basta que esses parmetros possuam o mesmo ndice. No exemplo
abaixo, o primeiro e o terceiro parmetros da string de formatao foram associados ao argumento
A e o segundo parmetro ao argumento B. Dessa forma, a mensagem A B A seria exibida.
www.facebook.com/k19treinamentos
211
S TRING
212
Alinhamento
No exemplo abaixo, quando a string de formatao for combinada com os demais argumentos
do mtodo format, o parmetro %16s ser substitudo pelo argumento PRODUTO.
1 System . out . format ( " %16 s " , " PRODUTO " ) ;
Como o parmetro %16s define que a quantidade mnima de caracteres 16 e o argumento PRODUTO possui apenas 7 caracteres, 9 espaos so adicionados esquerda desse argumento. Sendo
assim, seria exibido na sada padro a string
PRODUTO. Portanto, o argumento PRODUTO seria alinhado direita.
Os espaos utilizados para completar a quantidade mnima de caracteres tambm podem ser
inseridos direita do argumento PRODUTO. Para isso, basta utilizar a flag -. Essa flag deve ser
colocada depois do caractere % e antes da quantidade minma de caracteres. Veja o exemplo a seguir.
1 System . out . format ( " % -16 s " , " PRODUTO " ) ;
212
www.k19.com.br
213
S TRING
No exemplo abaixo, a string de formatao do mtodo format possui quatro parmetros para os
ttulos das colunas. Observe as quantidades mnimas de caracteres definidas para cada parmetro.
Note tambm que a flag - foi utilizada no primeiro parmetro para alinhar o primeiro ttulo esquerda.
1 System . out . format ( " % -16 s %10 s %3 s %10 s \ n " , " PRODUTO " , " UNITRIO " , " QTD " , " TOTAL " ) ;
Com a string de formatao acima, se o nome de um produto tiver menos do que 16 caracteres, espaos em branco sero acrescentados esquerda desse nome para completar a quantidade
mnima de caracteres. Dessa forma, os nomes dos produtos sero alinhados direita.
Contudo, de acordo com a especificao do cupom fiscal, os nomes dos produtos devem ser
alinhados esquerda. Sendo assim, os espaos em branco utilizados para completar os 16 caracteres
devem ser acrescentados direita dos nomes dos produtos.
www.facebook.com/k19treinamentos
213
S TRING
214
Para alinhar os nomes dos produtos esquerda, devemos acrescentar o caractere - na string de
formatao como no exemplo abaixo.
1 System . out . format ( " % -16 s \ n " , nome ) ;
Agora, devemos considerar os nomes dos produtos que possuem mais do que 16 caracteres.
Nesse caso, podemos utilizar o mtodo substring para extrair os primeiros 16 caracteres desses nomes.
1 nome = nome . substring (0 , Math . min ( nome . length () , 16) ) ;
2 System . out . format ( " % -16 s \ n " , nome ) ;
Os preos unitrios devem ser exibidos com duas casas decimais. Para controlar a quantidade de
casas decimais, devemos utilizar a formatao de nmeros reais. Para isso, necessrio substituir,
na string de formatao, no parmetro correspondente aos preos dos produtos, o caractere s pelo
caractere f.
1 System . out . format ( " % -16 s %10 f \ n " , nome , preco ) ;
Agora, para definir que os preos dos produtos devem ser exibidos com exatamente dois dgitos
decimais, basta substituir o parmetro %10f por %10.2f. Por padro, esses preos seriam exibidos
com seis dgitos decimais.
1 System . out . format ( " % -16 s %10.2 f \ n " , nome , preco ) ;
As quantidades dos produtos so nmeros inteiros. Para poder utilizar as opes de formatao
de nmeros inteiros, devemos substituir o caractere s pelo caractere d.
1 System . out . format ( " % -16 s %10.2 f %3 d \ n " , nome , preco , quantidade ) ;
214
www.k19.com.br
215
S TRING
Como as quantidades dos produtos devem ser exibidas sempre com trs caracteres, eventualmente, zeros devem ser adicionados esquerda dessas quantidades. Para que isso ocorra automaticamente, basta acrescentar o caractere 0 na string de formatao, mais especificamente, no parmetro correspondente s quantidades dos produtos.
1 System . out . format ( " % -16 s %10.2 f %03 d \ n " , nome , preco , quantidade ) ;
Novamente, para exibir os preos totais dos produtos sempre com exatamente duas casas decimais, necessrio substituir o trecho %10f por %10.2f.
1 System . out . format ( " % -16 s %10.2 f %03 d %10.2 f \ n " , nome , preco , quantidade , total ) ;
Converses
No exemplo a seguir, quando a string de formatao for combinada com os demais argumentos
do mtodo format, o trecho %s ser substitudo pelo valor da varivel nome, o trecho %f ser substitudo pelo valor da varivel preco e o trecho %d pelo valor da varivel quantidade. O caractere s
indica que o nome deve ser tratado como texto, o caractere f indica que o preo deve ser tratado
como nmero real e o caractere d indica que a quantidade deve ser tratada como nmero inteiro.
1 System . out . format ( " % s % f % d \ n " , nome , preco , quantidade ) ;
Alm das converses s, f e d, podemos utilizar nas strings de formatao outras converses.
Veja na listagem abaixo algumas dessas converses.
B ou b: Se o argumento for null ou false, devolve false. Caso contrrio, devolve true.
C ou c: Formata valores do tipo byte, short, char e int maiores ou iguais a 0 e menores ou iguais a
1114111 como caracteres do padro Unicode. Esses valores contemplam todos os caracteres
do Basic Multilingual Plane e alguns caracteres do Supplementary Multilingual Plane.
www.facebook.com/k19treinamentos
215
S TRING
216
Flags
No exemplo abaixo, o valor da varivel nome ser formatado com pelo menos 20 caracteres. O
caractere - indica que o nome deve ser alinhado esquerda. O valor da varivel quantidade ser
formatado com pelo menos 5 caracteres. O caractere 0 indica que zeros devem ser adicionados
esquerda da quantidade at completar o nmero mnimo de caracteres.
1 System . out . format ( " % -20 s %05 d " , nome , quantidade ) ;
Alm das flags - e 0, podemos utilizar nas strings de formatao outras flags. Veja na listagem
abaixo algumas dessas flags.
Mais Sobre
Mais detalhes sobre o funcionamento das formataes podem ser obtidos no endereo:
http://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html
216
www.k19.com.br
217
S TRING
6
7 String fundacaoK19Formatada = sdf . format ( fundacaoK19 . getTime () ) ;
Cdigo Java 7.33: Aplicando o formado "dia/ms/ano hora:minuto:segundos
Na mscara de formatao, devemos utilizar os caracteres especiais para definir o formato desejado. Veja o que cada caractere indica.
d: dia
M: ms
y: ano
H: hora
m: minutos
s: segundos
Quando o caractere d utilizado de forma simples na mscara de formatao, os dias de 1 at
9 so formatados com apenas um dgito. Quando utilizamos dd, os dias de 1 at 9 so formatados
com dois dgitos (01, 02, 03, ..., 09). O funcionamento anlogo para o ms, ano, hora, minutos e
segundos.
7.8 Resumo
1
Para controlar um objeto do tipo String, necessrio utilizar uma referncia desse objeto.
O pool de strings permite que objetos do tipo String sejam reutilizados a fim de diminuir o
consumo de memria.
O mtodo equals da classe String verifica se dois objetos do tipo String armazenam a mesma
sequncia de caracteres.
Ao invs de realizar concatenaes sucessivas para montar uma string, devemos utilizar objetos do tipo StringBuilder, pois um nmero excessivo de concatenaes pode prejudicar o desempenho dos programas em Java.
www.facebook.com/k19treinamentos
217
S TRING
218
O mtodo format pode ser utilizado para exibir strings formatadas na sada padro.
218
www.k19.com.br