Professional Documents
Culture Documents
Orientao a Objetos
em Java
22 de agosto de 2015
As apostilas atualizadas esto disponveis em www.k19.com.br
Sumrio
Sobre a K19
Seguro Treinamento
Termo de Uso
Cursos
Preparao do ambiente
Introduo
1.1 Objetivo . . . . . . . . . . . . . . . . . . . .
1.2 Orientao a Objetos . . . . . . . . . . . .
1.3 Plataforma Java . . . . . . . . . . . . . . .
1.4 Plataforma Java VS Orientao a Objetos
1.5 Eclipse . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
1
2
2
2
Lgica
2.1 O que um Programa? . . .
2.2 Linguagem de Mquina . .
2.3 Linguagem de Programao
2.4 Compilador . . . . . . . . . .
2.5 Mquinas Virtuais . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
5
5
6
6
6
.
.
.
.
.
.
.
.
.
.
www.facebook.com/k19treinamentos
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
S UMRIO
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
3
6
ii
ii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
10
11
16
18
21
21
22
22
26
Orientao a Objetos
3.1 Domnio e Aplicao . . . . . . . . . . . . . . . . . . . . .
3.2 Objetos, Atributos e Mtodos . . . . . . . . . . . . . . . .
3.3 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4 Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5 Manipulando Atributos . . . . . . . . . . . . . . . . . . . .
3.6 Valores Padro . . . . . . . . . . . . . . . . . . . . . . . . .
3.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . .
3.8 Exerccios Complementares . . . . . . . . . . . . . . . . .
3.9 Relacionamentos: Associao, Agregao e Composio
3.10 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . .
3.11 Exerccios Complementares . . . . . . . . . . . . . . . . .
3.12 Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.13 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . .
3.14 Exerccios Complementares . . . . . . . . . . . . . . . . .
3.15 Sobrecarga (Overloading) . . . . . . . . . . . . . . . . . .
3.16 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . .
3.17 Construtores . . . . . . . . . . . . . . . . . . . . . . . . . .
3.18 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . .
3.19 Referncias como parmetro . . . . . . . . . . . . . . . .
3.20 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
29
29
30
32
35
36
36
37
42
42
44
46
46
48
49
49
50
51
54
59
59
Arrays
4.1 Criando um array . . . . . . . . . . . .
4.2 Modificando o contedo de um array
4.3 Acessando o contedo de um array . .
4.4 Percorrendo um Array . . . . . . . . .
4.5 foreach . . . . . . . . . . . . . . . . . .
4.6 Operaes . . . . . . . . . . . . . . . .
4.7 Exerccios de Fixao . . . . . . . . . .
4.8 Exerccios Complementares . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
61
61
62
62
63
63
64
64
68
.
.
.
.
69
69
70
71
75
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Encapsulamento
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
77
www.k19.com.br
iii
S UMRIO
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
6.10
6.11
6.12
7
Atributos Privados . . . . . . . . . . . . . . . . . . .
Mtodos Privados . . . . . . . . . . . . . . . . . . .
Mtodos Pblicos . . . . . . . . . . . . . . . . . . .
Implementao e Interface de Uso . . . . . . . . .
Por qu encapsular? . . . . . . . . . . . . . . . . . .
Celular - Escondendo a complexidade . . . . . . .
Carro - Evitando efeitos colateiras . . . . . . . . .
Mquinas de Porcarias - Aumentando o controle .
Acessando ou modificando atributos . . . . . . . .
Getters e Setters . . . . . . . . . . . . . . . . . . . .
Exerccios de Fixao . . . . . . . . . . . . . . . . .
Exerccios Complementares . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
77
77
78
79
79
79
80
81
81
82
83
87
Herana
7.1 Reutilizao de Cdigo . . . . . . . . . .
7.2 Uma classe para todos os servios . . .
7.3 Uma classe para cada servio . . . . . .
7.4 Uma classe genrica e vrias especficas
7.5 Preo Fixo . . . . . . . . . . . . . . . . . .
7.6 Reescrita de Mtodo . . . . . . . . . . .
7.7 Fixo + Especfico . . . . . . . . . . . . . .
7.8 Construtores e Herana . . . . . . . . . .
7.9 Exerccios de Fixao . . . . . . . . . . .
7.10 Exerccios Complementares . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
89
89
89
90
91
93
93
94
95
96
100
Polimorfismo
8.1 Controle de Ponto . . . . . . . . .
8.2 Modelagem dos funcionrios . .
8.3 UM (extends) . . . . . . . . . . .
8.4 Melhorando o controle de ponto
8.5 Exerccios de Fixao . . . . . . .
8.6 Exerccios Complementares . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
101
101
102
102
103
104
106
.
.
.
.
109
109
110
111
114
.
.
.
.
.
.
117
117
117
118
119
119
121
Classes Abstratas
9.1 Classes Abstratas . . . . . . .
9.2 Mtodos Abstratos . . . . . .
9.3 Exerccios de Fixao . . . .
9.4 Exerccios Complementares
10 Interfaces
10.1 Padronizao . . . . .
10.2 Contratos . . . . . . .
10.3 Exemplo . . . . . . . .
10.4 Polimorfismo . . . . .
10.5 Interface e Herana .
10.6 Exerccios de Fixao
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11 Pacotes
125
11.1 Organizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
11.2 O comando package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
www.facebook.com/k19treinamentos
iii
S UMRIO
11.3
11.4
11.5
11.6
11.7
11.8
11.9
iv
sub-pacotes . . . . . . . . . . . . . . . . . . .
Unqualified Name vs Fully Qualified Name
Classes ou Interfaces pblicas . . . . . . . .
Import . . . . . . . . . . . . . . . . . . . . . .
Conflito de nomes . . . . . . . . . . . . . . .
Nveis de visibilidade . . . . . . . . . . . . .
Exerccios de Fixao . . . . . . . . . . . . .
12 Exceptions
12.1 Errors vs Exceptions . . . . . . . . . . .
12.2 Checked e Unchecked . . . . . . . . .
12.3 Lanando uma unchecked exception .
12.4 Lanando uma checked exception . .
12.5 Capturando exceptions . . . . . . . . .
12.6 Exerccios de Fixao . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
125
126
126
127
128
128
129
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
133
133
134
134
135
135
136
13 Object
13.1 Polimorfismo . . . . .
13.2 O mtodo toString() .
13.3 O mtodo equals() . .
13.4 Exerccios de Fixao
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
139
139
140
143
145
14 String
14.1 Pool de Strings . . . .
14.2 Imutabilidade . . . .
14.3 Mtodos principais .
14.4 Exerccios de Fixao
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
151
151
152
152
154
15 Entrada e Sada
15.1 Byte a Byte . . . . . . . . . .
15.2 Scanner . . . . . . . . . . . .
15.3 PrintStream . . . . . . . . . .
15.4 Exerccios de Fixao . . . .
15.5 Exerccios Complementares
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
157
157
158
158
159
161
16 Collections
16.1 Listas . . . . . . . . .
16.2 Exerccios de Fixao
16.3 Conjuntos . . . . . . .
16.4 Colees . . . . . . .
16.5 Exerccios de Fixao
16.6 Lao foreach . . . . .
16.7 Generics . . . . . . . .
16.8 Exerccios de Fixao
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
163
163
166
169
169
170
171
171
172
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A Documentao
175
A.1 A ferramenta javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
A.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
B Swing
183
B.1 Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
iv
www.k19.com.br
S UMRIO
B.2
B.3
B.4
C Empacotamento
C.1 Empacotando uma biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C.2 Empacotando uma applicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
191
191
191
191
D Threads
D.1 Definindo Tarefas - (Runnables) . . .
D.2 Executando Tarefas . . . . . . . . . .
D.3 Exerccios de Fixao . . . . . . . . .
D.4 Controlando a Execuo das Tarefas
D.5 Exerccios de Fixao . . . . . . . . .
.
.
.
.
.
195
195
196
196
198
199
Socket
E.1 Socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
E.2 ServerSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
E.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
201
201
201
202
Chat K19
F.1 Arquitetura do Sistema
F.2 Aplicao servidora . .
F.3 Aplicao cliente . . . .
F.4 Exerccios de Fixao .
205
205
205
206
206
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
G Quizzes
215
H Respostas
217
www.facebook.com/k19treinamentos
S UMRIO
vi
vi
www.k19.com.br
S UMRIO
Sobre a K19
A K19 uma empresa especializada na capacitao de desenvolvedores de software. Sua equipe
composta por profissionais formados em Cincia da Computao pela Universidade de So Paulo
(USP) e que possuem vasta experincia em treinamento de profissionais para rea de TI.
O principal objetivo da K19 oferecer treinamentos de mxima qualidade e relacionados s principais tecnologias utilizadas pelas empresas. Atravs desses treinamentos, seus alunos tornam-se
capacitados para atuar no mercado de trabalho.
Visando a mxima qualidade, a K19 mantm as suas apostilas em constante renovao e melhoria, oferece instalaes fsicas apropriadas para o ensino e seus instrutores esto sempre atualizados
didtica e tecnicamente.
www.facebook.com/k19treinamentos
S UMRIO
Seguro Treinamento
Na K19 o aluno faz o curso quantas vezes quiser!
Comprometida com o aprendizado e com a satisfao dos seus alunos, a K19 a nica que possui o Seguro Treinamento. Ao contratar um curso, o aluno poder refaz-lo quantas vezes desejar
mediante a disponibilidade de vagas e pagamento da franquia do Seguro Treinamento.
As vagas no preenchidas at um dia antes do incio de uma turma da K19 sero destinadas ao
alunos que desejam utilizar o Seguro Treinamento. O valor da franquia para utilizar o Seguro Treinamento 10% do valor total do curso.
www.k19.com.br
S UMRIO
Termo de Uso
Termo de Uso
Todo o contedo desta apostila propriedade da K19 Treinamentos. A apostila pode ser utilizada
livremente para estudo pessoal . Alm disso, este material didtico pode ser utilizado como material
de apoio em cursos de ensino superior desde que a instituio correspondente seja reconhecida pelo
MEC (Ministrio da Educao) e que a K19 seja citada explicitamente como proprietria do material.
proibida qualquer utilizao desse material que no se enquadre nas condies acima sem
o prvio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido est sujeito s
medidas legais cabveis.
www.facebook.com/k19treinamentos
S UMRIO
S
TO
EN
AM
EIN
TREINAMENTOS
TR
EIN
AM
EN
TO
TR
www.k19.com.br/cursos
www.k19.com.br
S UMRIO
Preparao do ambiente
Para realizar os exerccios desta apostila, recomendamos que voc utilize um dos sistemas operacionais abaixo.
Ubuntu 14.04 (ou superior) (preferencialmente)
Windows 8 (ou superior)
Voc tambm precisar ter instalado o Oracle JDK 8 e o Eclipse Luna. No endereo a seguir, voc
encontrar tutoriais de instalao.
http://online.k19.com.br/
www.facebook.com/k19treinamentos
S UMRIO
www.k19.com.br
CAPTULO
I NTRODUO
Objetivo
O objetivo fundamental dos treinamentos da K19 transmitir os conhecimentos necessrios para
que os seus alunos possam atuar no mercado de trabalho na rea de desenvolvimento de software.
As plataformas Java e .NET so as mais utilizadas no desenvolvimento de software. Para utilizar
os recursos oferecidos por essas plataformas de forma eficiente, necessrio possuir conhecimento
slido em orientao a objetos.
Orientao a Objetos
Um modelo de programao ou paradigma de programao um conjunto de princpios, ideias,
conceitos e abstraes utilizado para o desenvolvimento de uma aplicao.
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
CABANA DE NDIO
IGLU
CASA OCIDENTAL
O modelo de programao mais adotado no desenvolvimento de sistemas corporativos o modelo orientado a objetos. Esse modelo utilizado com o intuito de obter alguns benefcios especficos. Normalmente, o principal benefcio desejado facilitar a manuteno das aplicaes.
www.facebook.com/k19treinamentos
I NTRODUO
Em geral, os conceitos do modelo de programao orientado a objetos diminuem a complexidade do desenvolvimento de sistemas que possuem as seguintes caractersticas:
Sistemas com grande quantidade de funcionalidades desenvolvidos por uma equipe.
Sistemas que sero utilizados por um longo perodo de tempo e sofrero alteraes constantes.
Plataforma Java
A plataforma Java ser objeto de estudo desse treinamento. Mas, devemos salientar que os conceitos de orientao a objetos que sero vistos podero ser aplicados tambm na plataforma .NET.
No primeiro momento, os dois elementos mais importantes da plataforma Java so:
A linguagem de programao Java.
O ambiente de execuo Java.
A linguagem de programao Java permite que os conceitos de orientao a objetos sejam utilizados no desenvolvimento de uma aplicao.
O ambiente de execuo Java permite que uma aplicao Java seja executada em sistemas operacionais diferentes.
PLATAFORMA JAVA
LINGUAGEM DE PROGRAMAO
ORIENTADA A OBJETOS
AMBIENTE DE EXECUO
MULTIPLATAFORMA
Eclipse
Na prtica, alguma ferramenta de desenvolvimento adotada para aumentar a produtividade.
Essas ferramentas so chamadas IDE (Integrated Development Environment - Ambiente de Desen2
www.k19.com.br
I NTRODUO
volvimento Integrado). Uma IDE uma ferramenta que prov facilidades para o desenvolvedor realizar as principais tarefas relacionadas ao desenvolvimento de um software.
No caso especfico da plataforma Java, a IDE mais utilizada o Eclipse. Essa ferramenta bem
abrangente e oferece recursos sofisticados para o desenvolvimento de uma aplicao Java. Alm
disso, ela gratuita.
Atravs do site http://www.eclipse.org/, as diversas distribuies do Eclipse podem ser obtidas.
www.facebook.com/k19treinamentos
I NTRODUO
www.k19.com.br
CAPTULO
L GICA
O que um Programa?
Um dos maiores benefcios da utilizao de computadores a automatizao de processos realizados manualmente por pessoas. Vejamos um exemplo prtico:
Quando as apuraes dos votos das eleies no Brasil eram realizadas manualmente, o tempo
para obter os resultados era alto e havia alta probabilidade de uma falha humana. Esse processo foi
automatizado e hoje realizado por computadores. O tempo para obter os resultados e a chance de
ocorrer uma falha humana diminuram drasticamente.
Basicamente, os computadores so capazes de executar instrues matemticas mais rapidamente do que o homem. Essa simples capacidade permite que eles resolvam problemas complexos
de maneira mais eficiente. Porm, eles no possuem a inteligncia necessria para definir quais
instrues devem ser executadas para resolver uma determinada tarefa. Por outro lado, os seres humano possuem essa inteligncia. Dessa forma, uma pessoa precisa definir um roteiro com a sequncia de comandos necessrios para realizar uma determinada tarefa e depois passar para um computador executar esse roteiro. Formalmente, esses roteiros so chamados de programas.
Os programas devem ser colocados em arquivos no disco rgido dos computadores. Assim, quando
as tarefas precisam ser realizadas, os computadores podem ler esses arquivos para saber quais instrues devem ser executadas.
Linguagem de Mquina
Os computadores s sabem ler instrues escritas em linguagem de mquina. Uma instruo
escrita em linguagem de mquina uma sequncia formada por 0s e 1s que representa a ao
que um computador deve executar.
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000010000000000100000000
000000000000111000011111101110100000111000000000101101000000100
111001101001000011011100000000001010011001100110100100001010101
000110100001101001011100110010000001110000011100100110111101100
111011100100110000101101101001000000110001101100001011011100110
111001101111011101000010000001100010011001010010000001110010011
Figura 2.1: Cdigo de Mquina.
Teoricamente, as pessoas poderiam escrever os programas diretamente em linguagem de mquina. Na prtica, ningum faz isso pois uma tarefa muito complicada e demorada.
www.facebook.com/k19treinamentos
L GICA
Linguagem de Programao
Como vimos anteriormente, escrever um programa em linguagem de mquina totalmente invivel para uma pessoa. Para resolver esse problema, surgiram as linguagens de programao, que
tentam se aproximar das linguagens humanas. Confira um trecho de um cdigo escrito com a linguagem de programao Java:
1 class OlaMundo {
2
public static void main ( String [] args ) {
3
System . out . println ( " Ol Mundo " ) ;
4
}
5 }
Cdigo Java 2.1: OlaMundo.java
Por enquanto voc pode no entender muito do que est escrito, porm fica bem claro que um
programa escrito dessa forma fica bem mais fcil de ser lido.
Um arquivo contendo as instrues de um programa em linguagem de programao chamado
de arquivo fonte.
Compilador
Por um lado, os computadores processam apenas instrues em linguagem de mquina. Por outro lado, as pessoas definem as instrues em linguagem de programao. Dessa forma, necessrio
traduzir o cdigo escrito em linguagem de programao por uma pessoa para um cdigo em linguagem de mquina para que um computador possa processar. 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
Mquinas Virtuais
6
www.k19.com.br
L GICA
Assim como as pessoas podem se comunicar atravs de lnguas diferentes, os computadores podem se comunicar atravs de linguagens de mquina diferentes. A linguagem de mquina de um
computador definida pela arquitetura do processador desse computador. H diversas arquiteturas diferentes (Intel, ARM, PowerPC, etc) e cada uma delas define uma linguagem de mquina diferente. Em outras palavras, um programa pode no executar em computadores com processadores
de arquiteturas diferentes.
Os computadores so controlados por um sistema operacional que oferece diversas bibliotecas
necessrias para o desenvolvimento das aplicaes que podem ser executadas atravs dele. Sistemas
operacionais diferentes (Windows, Linux, Mac OS X, etc) possuem bibliotecas diferentes. Em outras
palavras, um programa pode no executar em computadores com sistemas operacionais diferentes.
Portanto, para determinar se um cdigo em linguagem de mquina pode ou no ser executada
por um computador, devemos considerar a arquitetura do processador e o sistema operacional desse
computador.
Algumas bibliotecas especficas de sistema operacional so chamadas diretamente pelas instrues em linguagem de programao. Dessa forma, geralmente, o cdigo fonte est amarrado a uma
plataforma (sistema operacional + arquitetura de processador).
PROGRAMA 1
PLATAFORMA 1
EXECUTA
PROGRAMA 2
PLATAFORMA 2
EXECUTA
PROGRAMA 2
PLATAFORMA 3
NO EXECUTA
Figura 2.3: Ilustrao mostrando que cada plataforma necessita de um executvel especfico.
Uma empresa que deseja ter a sua aplicao disponvel para diversos sistemas operacionais (Windows, Linux, Mac OS X, etc), e diversas arquiteturas de processador (Intel, ARM, PowerPC, etc), ter
que desenvolver verses diferentes do cdigo fonte para cada plataforma (sistema operacional + arquitetura de processador). Isso pode causar um impacto financeiro nessa empresa que inviabiliza o
negcio.
www.facebook.com/k19treinamentos
L GICA
PROGRAMA
MQUINA VIRTUAL 1
PLATAFORMA 1
EXECUTA
MQUINA VIRTUAL 2
PLATAFORMA 2
EXECUTA
MQUINA VIRTUAL 3
PLATAFORMA 3
EXECUTA
Tudo parece estar perfeito agora. Porm, olhando atentamente a figura acima, percebemos que
existe a necessidade de uma mquina virtual para cada plataforma. Algum poderia dizer que, de
fato, o problema no foi resolvido, apenas mudou de lugar.
A diferena que implementar a mquina virtual no tarefa do programador que desenvolve as
aplicaes que sero executadas nela. A implementao da mquina virtual responsabilidade de
terceiros, que geralmente so empresas bem conceituadas ou projetos de cdigo aberto que envolvem programadores do mundo inteiro. Como maiores exemplos podemos citar a Oracle JVM (Java
Virtual Machine) e OpenJDK JVM.
Uma desvantagem em utilizar uma mquina virtual para executar um programa a diminuio
de performance, j que a prpria mquina virtual consome recursos do computador. Alm disso, as
instrues do programa so processadas primeiro pela mquina virtual e depois pelo computador.
Por outro lado, as mquinas virtuais podem aplicar otimizaes que aumentam a performance
da execuo de um programa. Inclusive, essas otimizaes podem considerar informaes geradas
durante a execuo. So exemplos de informaes geradas durante a execuo: a quantidade de uso
da memria RAM e do processador do computador, a quantidade de acessos ao disco rgido, a quantidade de chamadas de rede e a frequncia de execuo de um determinado trecho do programa.
Algumas mquinas virtuais identificam os trechos do programa que esto sendo mais chamados
em um determinado momento da execuo para traduzi-los para a linguagem de mquina do com8
www.k19.com.br
L GICA
putador. A partir da, esses trechos podem ser executados diretamente no processador sem passar
pela mquina virtual. Essa anlise da mquina virtual realizada durante toda a execuo.
Com essas otimizaes que consideram vrias informaes geradas durante a execuo, um programa executado com mquina virtual pode at ser mais eficiente em alguns casos do que um programa executado diretamente no sistema operacional.
Mais Sobre
Geralmente, as mquinas virtuais utilizam uma estratgia de compilao chamada
Just-in-time compilation (JIT). Nessa abordagem, o cdigo de mquina pode ser
gerado diversas vezes durante o processamento de um programa com o intuito de melhorar a
utilizao dos recursos disponveis em um determinado instante da execuo.
O cdigo fonte Java deve ser colocado em arquivos com a extenso .java. Agora, no necessrio
entender todo o cdigo do exemplo. Basta saber que toda aplicao Java precisa ter um mtodo
especial chamado main para executar.
O prximo passo compilar o cdigo fonte, para gerar um executvel que possa ser processado
pela mquina virtual do Java. O compilador padro da plataforma Java (javac) pode ser utilizado
para compilar esse arquivo. O compilador pode ser executado pelo terminal.
K19$ ls
OlaMundo . java
K19$ javac OlaMundo . java
K19$ ls
OlaMundo . class OlaMundo . java
O cdigo gerado pelo compilador Java armazenado em arquivos com a extenso .class. No
exemplo, o programa gerado pelo compilador colocado em um arquivo chamado OlaMundo.class
e ele pode ser executado atravs de um terminal.
K19$ ls
OlaMundo . class OlaMundo . java
K19$ java OlaMundo
Ol Mundo
www.facebook.com/k19treinamentos
L GICA
10
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, http://www.k19.com.br/artigos/
instalando-o-jdk-java-development-kit/.
Mais Sobre
Quando uma aplicao ou biblioteca Java composta por diversos arquivos .class, podemos empacot-los em um nico arquivo com a extenso .jar com o intuito de facilitar a distribuio da aplicao ou da biblioteca.
static
public
public
public
public
static
static
static
void
void
void
void
Os parmetros do mtodo main so passados pela linha de comando e podem ser manipulados
dentro do programa. O cdigo abaixo imprime cada parmetro recebido em uma linha diferente.
1 class Programa {
2
public static void main ( String [] args ) {
3
for ( int i = 0; i < args . length ; i ++) {
4
System . out . println ( args [ i ]) ;
5
}
6
}
7 }
Cdigo Java 2.4: Imprimindo os parmetros da linha de comando
10
www.k19.com.br
11
L GICA
Exerccios de Fixao
Abra o Eclipse e defina como workspace uma pasta chamada workspace-k11 na sua rea de
trabalho.
1
Importante
Uma workspace do Eclipse uma pasta que contm algumas configuraes. Por padro, os projetos tambm so armazenados nessa pasta. Podemos ter vrias workspaces para organizar projetos e configuraes.
O prximo passo criar um novo projeto. Feche a Welcome Page. Digite CTRL + 3 e pesquise
por Create a Java project. Selecione a opo correspondente e siga as imagens abaixo.
2
www.facebook.com/k19treinamentos
11
L GICA
12
Agora, crie uma classe. Digite CTRL + 3 e pesquise por Create a Java class. Selecione a opo
correspondente e siga a imagem abaixo.
3
12
www.k19.com.br
13
L GICA
Em seguida, abra a viso Navigator. Digite CTRL + 3 e pesquise por Navigator. Selecione a
opo correspondente e veja a imagem abaixo.
4
www.facebook.com/k19treinamentos
13
L GICA
14
Observe que o Eclipse criou duas pastas no projeto Logica. Uma chamada src e outra chamada
bin. O cdigo fonte do projeto armazenado na pasta src e o cdigo compilado na pasta bin. Por
isso, o arquivo OlaMundo.java foi colocado na pasta src e o arquivo OlaMundo.class na pasta bin.
O Eclipse compila automaticamente o cdigo fonte e salva o cdigo compilado na pasta bin.
A pasta .settings e os arquivos .classpath e .project so itens de configurao. No modificaremos esses itens.
Para prosseguir, acrescente o mtodo main na classe OlaMundo. No corpo dessa classe, digite
main seguido de CTRL + ESPAO. No menu de sugestes, selecione o modelo do mtodo main.
5
14
www.k19.com.br
15
L GICA
6
Utilize o mtodo println para exibir uma mensagem no Console. No corpo do mtodo main,
digite sysout seguido de CTRL + ESPAO e defina a mensagem que deve ser exibida dentro de
aspas dupla.
www.facebook.com/k19treinamentos
15
L GICA
16
Variveis
Basicamente, o que um programa faz manipular dados. Em geral, esses dados so armazenados
em variveis localizadas na memria RAM do computador. Uma varivel pode guardar dados de
vrios tipos: nmeros, textos, booleanos (verdadeiro ou falso), referncias de objetos. Alm disso,
toda varivel possui um nome que utilizado quando a informao dentro da varivel precisa ser
manipulada pelo programa.
numeroDaConta
numeroDaConta = 4823
MEMRIA RAM
4823
numeroDaConta
MEMRIA RAM
Declarao
Na linguagem de programao Java, as variveis devem ser declaradas para que possam ser utilizadas. A declarao de uma varivel envolve definir um nome nico (identificador) dentro de um
escopo e um tipo de valor. As variveis so acessadas pelos nomes e armazenam valores compatveis
com o seu tipo.
1
2
3
4
5
Mais Sobre
Uma linguagem de programao dita estaticamente tipada quando ela exige que
os tipos das variveis sejam definidos antes da compilao. A linguagem Java uma
linguagem estaticamente tipada.
Uma linguagem de programao dita fortemente tipada quando ela exige que os valores
armazenados em uma varivel sejam compatveis com o tipo da varivel. A linguagem Java
uma linguagem fortemente tipada.
16
www.k19.com.br
17
L GICA
Mais Sobre
Em geral, as linguagens de programao possuem convenes para definir os nomes
das variveis. Essas convenes ajudam o desenvolvimento de um cdigo mais legvel.
Na conveno de nomes da linguagem Java, os nomes das variveis devem seguir o padro camel case com a primeira letra minscula (lower camel case). Veja alguns exemplos:
nomeDoCliente
numeroDeAprovados
A conveno de nomes da linguagem Java pode ser consultada na seguinte url: http://www.
oracle.com/technetwork/java/codeconv-138413.html
A declarao de uma varivel pode ser realizada em qualquer linha de um bloco. No necessrio
declarar todas as variveis no comeo do bloco como acontece em algumas linguagens de programao.
1
2
3
4
5
6
7
8
9
10
11
No podemos declarar duas variveis com o mesmo nome em um nico bloco ou escopo pois
ocorrer um erro de compilao.
1
2
3
4
5
// Declarao
int numero = 10;
// Erro de Compilao
int numero = 10;
Cdigo Java 2.7: Duas variveis com o mesmo nome no mesmo bloco.
Inicializao
Toda varivel deve ser inicializada antes de ser utilizada pela primeira vez. Se isso no for realizado, ocorrer um erro de compilao. A inicializao realizada atravs do operador de atribuio
=. Esse operador guarda um valor em uma varivel.
1
2
3
4
5
// Declaraes
int numero ;
double preco ;
// Inicializao
www.facebook.com/k19treinamentos
17
L GICA
6
7
8
9
10
11
12
18
numero = 10;
// Uso Correto
System . out . println ( numero ) ;
// Erro de compilao
System . out . println ( preco ) ;
Cdigo Java 2.8: Inicializao
Tipos Primitivos
A linguagem Java define um conjunto de tipos bsicos de dados que so chamados tipos primitivos. A tabela abaixo mostra os oito tipos primitivos da linguagem Java e os valores compatveis.
Tipo
byte
short
int
long
float
double
boolean
char
Descrio
Valor inteiro entre -128 e 127 (inclusivo)
Valor inteiro entre -32.768 e 32.767 (inclusivo)
Valor inteiro entre -2.147.483.648 e 2.147.483.647 (inclusivo)
Valor inteiro entre -9.223.372.036.854.775.808 e
9.223.372.036.854.775.807 (inclusivo)
Valor com ponto flutuante entre 1, 40129846432481707
1045 e 3, 40282346638528860 1038 (positivo ou negativo)
Valor com ponto flutuante entre 4, 94065645841246544
10324 e 1, 79769313486231570 10308 (positivo ou negativo)
true ou false
Um nico caractere Unicode de 16 bits. Valor inteiro e
positivo entre 0 (ou \u0000) e 65.535 (ou \uffff)
Tamanho (peso)
1 byte
2 bytes
4 bytes
8 bytes
4 bytes
8 bytes
1 bit
2 bytes
Importante
Nenhum tipo primitivo da linguagem Java permite o armazenamento de texto. O tipo
primitivo char armazena apenas um caractere. Quando necessrio armazenar um
texto, devemos utilizar o tipo String. Contudo, importante salientar que o tipo String no
um tipo primitivo.
Operadores
Para manipular os valores das variveis de um programa, devemos utilizar os operadores oferecidos pela linguagem de programao adotada. A linguagem Java possui diversos operadores e os
principais so categorizados da seguinte forma:
Aritmtico (+, -, *, /, %)
Atribuio (=, +=, -=, *=, /=, %=)
18
www.k19.com.br
19
L GICA
Aritmtico
Os operadores aritmticos funcionam de forma muito semelhante aos operadores na matemtica. Os operadores aritmticos so:
Soma +
Subtrao Multiplicao *
Diviso /
Mdulo %
1
2
3
4
5
6
7
8
int
int
int
int
int
x =
x =
x =
umMaisUm = 1 + 1;
tresVezesDois = 3 * 2;
quatroDivididoPor2 = 4 / 2;
seisModuloCinco = 6 % 5;
x = 7;
x + 1 * 2;
x - 3;
x / (6 - 2 + (3*5) /(16 -1) ) ;
//
//
//
//
umMaisUm = 2
tresVezesDois = 6
quatroDivididoPor2 = 2
seisModuloCinco = 1
// x = 9
// x = 6
// x = 2
Importante
O mdulo de um nmero x , na matemtica, o valor numrico de x desconsiderando
o seu sinal (valor absoluto). Na matemtica expressamos o mdulo da seguinte forma:
| 2| = 2.
Em linguagens de programao, o mdulo de um nmero o resto da diviso desse nmero por
outro. No exemplo acima, o resto da diviso de 6 por 5 igual a 1. Alm disso, lemos a expresso
6%5 da seguinte forma: seis mdulo cinco.
Importante
As operaes aritmticas em Java obedecem as mesmas regras da matemtica com relao precedncia dos operadores e parnteses. Portanto, as operaes so resolvidas a
partir dos parnteses mais internos at os mais externos, primeiro resolvemos as multiplicaes,
divises e os mdulos. Em seguida, resolvemos as adies e subtraes.
Atribuio
Nas sees anteriores, j vimos um dos operadores de atribuio, o operador = (igual). Os operadores de atribuio so:
Simples =
Incremental +=
Decremental -=
www.facebook.com/k19treinamentos
19
L GICA
20
Multiplicativa *=
Divisria /=
Modular %=
1
2
3
4
5
6
int valor = 1;
valor += 2;
valor -= 1;
valor *= 6;
valor /= 3;
valor %= 3;
//
//
//
//
//
//
valor
valor
valor
valor
valor
valor
=
=
=
=
=
=
1
3
2
12
4
1
int valor = 1;
valor = valor +
valor = valor valor = valor *
valor = valor /
valor = valor %
//
//
//
//
//
//
2;
1;
6;
3;
3;
valor
valor
valor
valor
valor
valor
=
=
=
=
=
=
1
3
2
12
4
1
Como podemos observar, os operadores de atribuio, com exceo do simples (=), reduzem a
quantidade de cdigo escrito. Podemos dizer que esses operadores funcionam como atalhos para
as operaes que utilizam os operadores aritmticos.
Relacional
Muitas vezes precisamos determinar a relao entre uma varivel ou valor e outra outra varivel
ou valor. Nessas situaes, utilizamos os operadores relacionais. As operaes realizadas com os
operadores relacionais devolvem valores do tipo primitivo boolean. Os operadores relacionais so:
Igualdade ==
Diferena !=
Menor <
Menor ou igual <=
Maior >
Maior ou igual >=
1
2
3
4
5
6
7
8
int valor = 2;
boolean t = false ;
t = ( valor == 2) ;
t = ( valor != 2) ;
t = ( valor < 2) ;
t = ( valor <= 2) ;
t = ( valor > 1) ;
t = ( valor >= 1) ;
//
//
//
//
//
//
t
t
t
t
t
t
=
=
=
=
=
=
true
false
false
true
true
true
20
www.k19.com.br
21
L GICA
Lgico
A linguagem Java permite verificar duas ou mais condies atravs de operadores lgicos. Os
operadores lgicos devolvem valores do tipo primitivo boolean. Os operadores lgicos so:
E lgico &&
OU lgico ||
1
2
3
4
5
6
7
false ;
40 && valor
40 && valor
30 || valor
30 || valor
50 && valor
> 20;
> 30;
> 20;
< 20;
== 30;
//
//
//
//
//
teste
teste
teste
teste
teste
=
=
=
=
=
true
false
true
false
true
IF-ELSE
O comportamento de uma aplicao pode ser influenciado por valores definidos pelos usurios.
Por exemplo, considere um sistema de cadastro de produtos. Se um usurio tenta adicionar um
produto com preo negativo, a aplicao no deve cadastrar esse produto. Caso contrrio, se o preo
no for negativo, o cadastro pode ser realizado normalmente.
Outro exemplo, quando o pagamento de um boleto realizado em uma agncia bancria, o sistema do banco deve verificar a data de vencimento do boleto para aplicar ou no uma multa por
atraso.
Para verificar uma determinada condio e decidir qual bloco de instrues deve ser executado,
devemos aplicar o comando if.
1 if ( preco < 0) {
2
System . out . println ( " O preo do produto no pode ser negativo " ) ;
3 } else {
4
System . out . println ( " Produto cadastrado com sucesso " ) ;
5 }
Cdigo Java 2.14: Comando if
O comando if permite que valores booleanos sejam testados. Se o valor passado como parmetro para o comando if for true, o bloco do if executado. Caso contrrio, o bloco do else
executado.
O parmetro passado para o comando if deve ser um valor booleano, caso contrrio o cdigo
no compila. O comando else e o seu bloco so opcionais.
WHILE
Em alguns casos, necessrio repetir um trecho de cdigo diversas vezes. Suponha que seja
necessrio imprimir 10 vezes na tela a mensagem: Bom Dia. Isso poderia ser realizado colocando
10 linhas iguais a essa no cdigo fonte:
www.facebook.com/k19treinamentos
21
L GICA
22
Se ao invs de 10 vezes fosse necessrio imprimir 100 vezes, j seriam 100 linhas iguais no cdigo
fonte. muito trabalhoso utilizar essa abordagem para solucionar esse problema.
Atravs do comando while, possvel definir quantas vezes um determinado trecho de cdigo
deve ser executado pelo computador.
1 int contador = 0;
2
3 while ( contador < 100) {
4
System . out . println ( " Bom Dia " ) ;
5
contador ++;
6 }
A varivel contador indica o nmero de vezes que a mensagem Bom Dia foi impressa na tela.
O operador ++ incrementa a varivel contador a cada rodada.
O parmetro do comando while tem que ser um valor booleano. Caso contrrio, ocorrer um
erro de compilao.
FOR
O comando for anlogo ao while. A diferena entre esses dois comandos que o for recebe
trs argumentos.
1 for ( int contador = 0; contador < 100; contador ++) {
2
System . out . println ( " Bom Dia " ) ;
3 }
Exerccios de Fixao
Crie um programa que exiba o seu nome no Console 100 vezes. Digite CTRL + 3 e pesquise por
Create a Java class. Selecione a opo correspondente e siga a imagem abaixo.
8
22
www.k19.com.br
23
L GICA
www.facebook.com/k19treinamentos
23
L GICA
24
Crie um programa que exiba os nmeros de 1 a 100 no Console. Digite CTRL + 3 e pesquise
por Create a Java class. Selecione a opo correspondente e digite ExibeNumerosDe1Ate100 no
campo que define o nome da nova classe.
11
12
Faa um programa que percorra todos os nmeros de 1 at 100. Para os nmeros mpares, deve
ser exibido um * e para os nmeros pares **. Veja o exemplo abaixo:
14
*
**
*
**
*
**
Digite CTRL + 3 e pesquise por Create a Java class. Selecione a opo correspondente e digite
ExibeAsteriscos no campo que define o nome da nova classe.
15
24
www.k19.com.br
25
L GICA
7
} else {
8
System . out . println ( " ** " ) ;
9
}
10
}
11
}
12 }
Cdigo Java 2.20: ExibeAsteriscos.java
Salve o arquivo ExibeAsteriscos.java. Em seguida, execute a classe ExibeAsteriscos. Selecione o arquivo ExibeAsteriscos.java e digite CTRL + F11. Observe o contedo exibido na viso
Console.
16
Faa um programa que percorra todos os nmero de 1 at 100. Para os nmeros mltiplos de 4,
exiba a palavra PIN, e para os outros, exiba o prprio nmero. Veja o exemplo abaixo:
17
1
2
3
PIN
5
6
7
PIN
Digite CTRL + 3 e pesquise por Create a Java class. Selecione a opo correspondente e digite
PIN no campo que define o nome da nova classe.
18
www.facebook.com/k19treinamentos
25
L GICA
26
Salve o arquivo PIN.java. Em seguida, execute a classe PIN. Selecione o arquivo PIN.java e
digite CTRL + F11. Observe o contedo exibido na viso Console.
19
Exerccios Complementares
1
Crie um programa que exiba no Console um tringulo de *. Adicione uma classe chamada
Triangulo. Veja o exemplo abaixo:
*
**
***
****
*****
Crie um programa que exiba no Console vrios tringulos de *. Adicione uma classe chamada
Triangulos. Veja o exemplo abaixo:
2
*
**
***
****
*
**
***
****
26
www.k19.com.br
27
L GICA
www.facebook.com/k19treinamentos
27
L GICA
28
28
www.k19.com.br
CAPTULO
O RIENTAO A O BJETOS
Domnio e Aplicao
Um domnio composto pelas entidades, informaes e processos relacionados a um determinado contexto. Uma aplicao pode ser desenvolvida para automatizar ou tornar factvel as tarefas
de um domnio. Portanto, uma aplicao basicamente o reflexo de um domnio.
Para exemplificar, suponha que estamos interessados em desenvolver uma aplicao para facilitar as tarefas do cotidiano de um banco. Podemos identificar clientes, funcionrios, agncias e contas como entidades desse domnio. Assim como podemos identificar as informaes e os processos
relacionados a essas entidades.
FUNCIONRIO
JONAS
CONTA DO
JOS
CLIENTE
JOS
CONTA DA
MARIA
FUNCIONRIO
MARCELO
CLIENTE
MARIA
CLIENTE
JOO
CONTA DO
JOO
FUNCIONRIO
RAFAEL
DOMNIO BANCRIO
Figura 3.1: Domnio bancrio
www.facebook.com/k19treinamentos
29
O RIENTAO A O BJETOS
30
Mais Sobre
A identificao dos elementos de um domnio uma tarefa difcil, pois depende fortemente do conhecimento das entidades, informaes e processos que o compem. Em
geral, as pessoas que possuem esse conhecimento ou parte dele esto em contato constante com
o domnio e no possuem conhecimentos tcnicos para desenvolver uma aplicao.
Desenvolvedores de software buscam constantemente mecanismos para tornar mais eficiente o
entendimento dos domnios para os quais eles devem desenvolver aplicaes.
www.k19.com.br
31
O RIENTAO A O BJETOS
Funcionario
nome = Jonas Hirata
codigo = 3
salario = 3000
Funcionario
nome = Marcelo Rezende
codigo = 2
salario = 2000
tiraFerias
aumentaSalario
mudaHorario
Funcionario
FUNCIONRIO
JONAS
tiraFerias
aumentaSalario
mudaHorario
FUNCIONRIO
MARCELO
FUNCIONRIO
RAFAEL
tiraFerias
aumentaSalario
mudaHorario
Conta
saldo = 8000
numero = 3
CONTA DA
MARIA
Conta
saldo = 4000
numero = 2
CONTA DO
JOS
deposita
saca
geraExtrato
Conta
CONTA DO
JOO
deposita
saca
geraExtrato
saldo = 2000
numero = 1
deposita
saca
geraExtrato
Cliente
nome = Maria do Bairro
codigo = 3
Cliente
mudaEndereco
fazEmprestimo
Cliente
CLIENTE
MARIA
CLIENTE
JOS
mudaEndereco
fazEmprestimo
CLIENTE
JOO
DOMNIO BANCRIO
APLICAO
Mais Sobre
Em geral, no adequado utilizar o objeto que representa um determinado cliente
para representar outro cliente do banco, pois os dados dos clientes podem ser diferentes. Dessa forma, para cada cliente do banco, deve existir um objeto dentro do sistema para
represent-lo.
Mais Sobre
Os objetos no representam apenas coisas concretas como os clientes do banco. Eles
tambm devem ser utilizados para representar coisas abstratas como uma conta de um
cliente ou um servio que o banco oferea.
www.facebook.com/k19treinamentos
31
O RIENTAO A O BJETOS
32
Classes
Antes de um objeto ser criado, devemos definir quais sero os seus atributos e mtodos. Essa
definio realizada atravs de uma classe elaborada por um programador. A partir de uma classe,
podemos construir objetos na memria do computador que executa a nossa aplicao.
Podemos representar uma classe atravs de diagramas UML. O diagrama UML de uma classe
composto pelo nome da mesma e pelos atributos e mtodos que ela define. Todos os objetos criados
a partir da classe Conta tero os atributos e mtodos mostrados no diagrama UML. Os valores dos
atributos de dois objetos criados a partir da classe Conta podem ser diferentes.
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
Um objeto como se fosse uma casa ou um prdio. Para ser construdo, precisa de um
espao fsico. No caso dos objetos, esse espao fsico algum trecho vago da memria
do computador que executa a aplicao. No caso das casas e dos prdios, o espao fsico algum
terreno vazio.
Um prdio construdo a partir de uma planta criada por um engenheiro ou arquiteto. Para
criar um objeto, necessrio algo semelhante a uma planta para que sejam desenhados os
atributos e mtodos que o objeto deve ter. Em orientao a objetos, a planta de um objeto o
que chamamos de classe.
Uma classe funciona como uma receita para criar objetos. Inclusive, vrios objetos podem ser
criados a partir de uma nica classe. Assim como vrias casas ou prdios poderiam ser construdos a partir de uma nica planta; ou vrios bolos poderiam ser preparados a partir de uma nica
receita; ou vrios carros poderiam ser construdos a partir de um nico projeto.
32
www.k19.com.br
33
O RIENTAO A O BJETOS
Basicamente, as diferenas entre dois objetos criados a partir da classe Conta so os valores dos
seus atributos. Assim como duas casas construdas a partir da mesma planta podem possuir
caractersticas diferentes. Por exemplo, a cor das paredes.
Classes em Java
O conceito de classe apresentado anteriormente genrico e pode ser aplicado em diversas linguagens de programao. Mostraremos como a classe Conta poderia ser escrita utilizando a linguagem Java. Inicialmente, discutiremos apenas sobre os atributos. Os mtodos sero abordados
posteriormente.
1 class Conta {
2
double saldo ;
3
double limite ;
4
int numero ;
5 }
Cdigo Java 3.1: Conta.java
A classe Java Conta declarada utilizando a palavra reservada class. No corpo dessa classe, so
declaradas trs variveis que so os atributos que os objetos possuiro. Como a linguagem Java
www.facebook.com/k19treinamentos
33
O RIENTAO A O BJETOS
34
estaticamente tipada, os tipos dos atributos so definidos no cdigo. Os atributos saldo e limite
so do tipo double, que permite armazenar nmeros com casas decimais, e o atributo numero do
tipo int, que permite armazenar nmeros inteiros.
Importante
Por conveno, os nomes das classes na linguagem Java devem seguir o padro Pascal
Case.
A linha com o comando new poderia ser repetida cada vez que desejssemos criar (instanciar)
um objeto da classe Conta. A classe TestaConta serve apenas para colocarmos o mtodo main, que
o ponto de partida da aplicao.
1 class TestaConta {
2
public static void main ( String [] args ) {
3
// criando trs objetos
4
new Conta () ;
5
new Conta () ;
6
new Conta () ;
7
}
8 }
Cdigo Java 3.3: TestaConta.java
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
Chamar o comando new passando uma classe Java como se estivssemos contratando
uma construtora passando a planta da casa que queremos construir. A construtora se
encarrega de construir a casa para ns de acordo com a planta. Assim como a mquina virtual
se encarrega de construir o objeto na memria do computador.
34
www.k19.com.br
35
O RIENTAO A O BJETOS
CASA
PROGRAMADOR
PEDREIRO
PLANTA
Figura 3.8: Construindo casas
Referncias
Todo objeto possui uma referncia. A referncia de um objeto a nica maneira de acessar os
seus atributos e mtodos. Dessa forma, devemos guardar as referncias dos objetos que desejamos
utilizar.
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
1
2
-/--
0
CH
www.facebook.com/k19treinamentos
35
O RIENTAO A O BJETOS
36
Referncias em Java
Ao utilizar o comando new, um objeto alocado em algum lugar da memria. Para que possamos
acessar esse objeto, precisamos de sua referncia. O comando new devolve a referncia do objeto que
foi criado.
Para guardar as referncias devolvidas pelo comando new, devemos utilizar variveis no primitivas.
1 Conta referecia = new Conta () ;
Cdigo Java 3.4: Criando um objeto e guardando a referncia.
No cdigo Java acima, a varivel referencia receber a referncia do objeto criado pelo comando
new. Essa varivel do tipo Conta. Isso significa que ela s pode armazenar referncias de objetos do
tipo Conta.
Manipulando Atributos
Podemos alterar ou acessar os valores guardados nos atributos de um objeto se tivermos a referncia a esse objeto. Os atributos so acessados pelo nome. No caso especfico da linguagem Java, a
sintaxe para acessar um atributo utiliza o operador ".".
1
2
3
4
5
6
7
8
9
No cdigo acima, o atributo saldo recebe o valor 1000.0. O atributo limite recebe o valor
500 e o numero recebe o valor 1. Depois, os valores so impressos na tela atravs do comando
System.out.println.
Valores Padro
Poderamos instanciar um objeto e utilizar seus atributos sem inicializ-los explicitamente, pois
os atributos so inicializados com valores padro. Os atributos de tipos numricos so inicializados
com 0, os atributos do tipo boolean so inicializados com false e os demais atributos com null
(referncia vazia).
1 class Conta {
2
double limite ;
3 }
Cdigo Java 3.6: Conta.java
36
www.k19.com.br
37
O RIENTAO A O BJETOS
1 class TestaConta {
2
public static void main ( String [] args ) {
3
Conta conta = new Conta () ;
4
5
// imprime 0
6
System . out . println ( conta . limite ) ;
7
}
8 }
A inicializao dos atributos com os valores padro ocorre na instanciao, ou seja, quando o
comando new utilizado. Dessa forma, todo objeto nasce com os valores padro. Em alguns casos,
necessrio trocar esses valores. Para trocar o valor padro de um atributo, devemos inicializ-lo na
declarao. Por exemplo, suponha que o limite padro das contas de um banco seja R$ 500. Nesse
caso, seria interessante definir esse valor como padro para o atributo limite.
1 class Conta {
2
double limite = 500;
3 }
1 class TestaConta {
2
public static void main ( String [] args ) {
3
Conta conta = new Conta () ;
4
5
// imprime 500
6
System . out . println ( conta . limite ) ;
7
}
8 }
Exerccios de Fixao
1
Para no confundir, feche o projeto Logica clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
www.facebook.com/k19treinamentos
37
O RIENTAO A O BJETOS
38
Implemente uma classe para definir os objetos que representaro os clientes de um banco. Essa
classe deve possuir dois atributos: um para armazenar os nomes e outro para armazenar os cdigos
dos clientes. Digite CTRL + 3 e pesquise por Create a Java class. Selecione a opo correspondente
e digite Cliente no campo que define o nome da nova classe. Adicione os atributos solicitados nessa
classe.
2
Faa um teste criando dois objetos da classe Cliente. Altere e exiba no Console os valores armazenados nos atributos desses objetos. Crie uma nova classe chamada TestaCliente com o cdigo
abaixo.
3
38
www.k19.com.br
39
O RIENTAO A O BJETOS
Lembre-se
Para no digitar todo o cdigo, utilize os templates do mtodo main e do mtodo
println. Para utilizar o template do mtodo main, digite main e em seguida CTRL
+ ESPAO. Analogamente, digite sysout e em seguida CTRL + ESPAO para utilizar
o template do mtodo println.
4
Os bancos oferecem aos clientes a possibilidade de obter um carto de crdito que pode ser
utilizados para fazer compras. Um carto de crdito possui um nmero e uma data de validade.
Crie uma classe chamada CartaoDeCredito para modelar os objetos que representaro os cartes de
crdito.
5
Faa um teste criando dois objetos da classe CartaoDeCredito. Altere e exiba no Console os
valores armazenados nos atributos desses objetos. Crie uma nova classe chamada TestaCartaoDeCredito com o cdigo abaixo.
www.facebook.com/k19treinamentos
39
O RIENTAO A O BJETOS
9
10
11
12
13
14
15
16
17
18
19
20
}
21 }
40
Faa um teste criando dois objetos da classe Agencia. Altere e exiba no Console os valores armazenados nos atributos desses objetos. Crie uma nova classe chamada TestaAgencia com o cdigo
abaixo.
7
As contas do banco possuem nmero, saldo e limite. Crie uma classe chamada Conta para
definir os objetos que representaro as contas do banco.
8
40
www.k19.com.br
41
O RIENTAO A O BJETOS
4
double limite ;
5 }
Cdigo Java 3.16: Conta.java
9
Faa um teste criando dois objetos da classe Conta. Altere e exiba no Console os valores armazenados nos atributos desses objetos. Crie uma nova classe chamada TestaConta com o cdigo
abaixo.
11
Altere a classe Conta para que todos os objetos criados a partir dessa classe possuam R$ 100 de
www.facebook.com/k19treinamentos
41
O RIENTAO A O BJETOS
42
limite inicial.
1 public class Conta {
2
int numero ;
3
double saldo ;
4
double limite = 100;
5 }
Exerccios Complementares
1
Crie uma classe chamada Aluno para definir os objetos que representaro os alunos de uma
escola. Nessa classe, declare trs atributos: o primeiro para o nome, o segundo para o RG e o terceiro
para a data de nascimento dos alunos.
2
Faa uma classe chamada TestaAluno. Crie dois objetos da classe Aluno. Altere os valores dos
atributos desses objetos e exiba no Console os valores armazenados nesses atributos.
Em uma escola, alm dos alunos temos os funcionrios, que tambm precisam ser representados
em nossa aplicao. Ento crie uma classe chamada Funcionario que contenha dois atributos: o
primeiro para o nome e o segundo para o salrio dos funcionrios.
3
Faa uma classe chamada TestaFuncionario. Crie dois objetos da classe Funcionario. Altere os
valores dos atributos desses objetos e exiba no Console os valores armazenados nesses atributos.
4
5
Em uma escola, os alunos precisam ser divididos por turmas, que devem ser representadas
dentro da aplicao. Crie uma classe chamada Turma que contenha quatro atributos: o primeiro
para o perodo, o segundo para definir a srie, o terceiro para sigla e o quarto para o tipo de ensino.
6
Faa uma classe chamada TestaTurma. Crie dois objetos da classe Turma. Altere os valores dos
atributos desses objetos e exiba no Console os valores armazenados nesses atributos.
www.k19.com.br
43
O RIENTAO A O BJETOS
DEBIT
DEBIT
DEBIT
Duas classes deveriam ser criadas: uma para definir os atributos e mtodos dos clientes e outra
para os atributos e mtodos dos cartes de crdito. Para expressar o relacionamento entre cliente e
carto de crdito, podemos adicionar um atributo do tipo Cliente na classe CartaoDeCredito.
1 class Cliente {
2
String nome ;
3 }
Cdigo Java 3.26: Cliente.java
1 class CartaoDeCredito {
2
int numero ;
3
String dataDeValidade ;
4
Cliente cliente ;
5 }
Cdigo Java 3.27: CartaoDeCredito.java
www.facebook.com/k19treinamentos
43
O RIENTAO A O BJETOS
3
4
5
6
7
8
9
44
CARTO
numero = 123
dataValidade = 01/2012
cliente = null
CARTO
numero = 123
dataValidade = 01/2012
cliente = null
CLIENTE
nome = Jonas Hirata
cpf = 123.456.789-0
CARTO
numero = 123
dataValidade = 01/2012
cliente
CLIENTE
nome = Jonas Hirata
cpf = 123.456.789-0
Exerccios de Fixao
Defina um vnculo entre os objetos que representam os clientes e os objetos que representam os
cartes de crdito. Para isso, voc deve alterar a classe CartaoDeCredito.
12
Teste o relacionamento entre clientes e cartes de crdito. Crie uma nova classe chamada TestaClienteECartao com o cdigo abaixo.
13
44
www.k19.com.br
45
O RIENTAO A O BJETOS
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
}
30 }
Teste o relacionamento entre contas e agncias. Crie uma nova classe chamada TestaContaEAgencia com o cdigo abaixo.
15
www.facebook.com/k19treinamentos
45
O RIENTAO A O BJETOS
17
18
19
20
21
22
23
24
25
26
27
28
}
29 }
46
Exerccios Complementares
Defina um vnculo entre os alunos e as turmas, criando na classe Aluno um atributo do tipo
Turma.
7
Teste o relacionamento entre os alunos e as turmas, criando um objeto de cada classe e alterando
os valores dos atributos desses objetos. Exiba na Console os valores que esto nos atributos da turma
atravs do aluno. Crie uma nova classe chamada TesteAlunoTurma para implementar esse teste.
8
Mtodos
No banco, possvel realizar diversas operaes em uma conta: depsito, saque, transferncia,
consultas e etc. Essas operaes podem modificar ou apenas acessar os valores dos atributos dos
objetos que representam as contas.
Essas operaes so realizadas em mtodos definidos na prpria classe Conta. Por exemplo, para
realizar a operao de depsito, podemos acrescentar o seguinte mtodo na classe Conta.
1 void deposita ( double valor ) {
2
// implementao
3 }
Cdigo Java 3.35: Definindo um mtodo
www.k19.com.br
47
O RIENTAO A O BJETOS
Retorno: A resposta que ser devolvida ao final do processamento do mtodo. Quando um mtodo
no devolve nenhuma resposta, ele deve ser marcado com a palavra reservada void.
Retorno
void
Nome
Lista de parmetros
this.saldo += valor;
}
Corpo
Figura 3.13: Estrutura de um mtodo
Para realizar um depsito, devemos chamar o mtodo deposita() atravs da referncia do objeto que representa a conta que ter o dinheiro creditado.
1
2
3
4
5
// Referncia de um objeto
Conta c = new Conta () ;
// Chamando o mtodo deposita ()
c . deposita (1000) ;
Cdigo Java 3.36: Chamando o mtodo deposita()
Normalmente, os mtodos acessam ou alteram os valores armazenados nos atributos dos objetos. Por exemplo, na execuo do mtodo deposita(), necessrio alterar o valor do atributo saldo
do objeto que foi escolhido para realizar a operao.
Dentro de um mtodo, para acessar os atributos do objeto que est processando o mtodo, devemos utilizar a palavra reservada this.
1 void deposita ( double valor ) {
2
this . saldo += valor ;
3 }
Cdigo Java 3.37: Utilizando o this para acessar e/ou modificar um atributo
O mtodo deposita() no possui nenhum retorno lgico. Por isso, foi marcado com void. Mas,
para outros mtodos, pode ser necessrio definir um tipo de retorno especfico.
Considere, por exemplo, um mtodo para realizar a operao que consulta o saldo disponvel
das contas. Suponha tambm que o saldo disponvel igual a soma do saldo e do limite. Ento, esse
mtodo deve somar os atributos saldo e limite e devolver o resultado. Por outro lado, esse mtodo
no deve receber nenhum valor, pois todas as informaes necessrias para realizar a operao esto
nos atributos dos objetos que representam as contas.
www.facebook.com/k19treinamentos
47
O RIENTAO A O BJETOS
48
1 double consultaSaldoDisponivel () {
2
return this . saldo + this . limite ;
3 }
Cdigo Java 3.38: Mtodo com retorno double
Exerccios de Fixao
Acrescente alguns mtodos na classe Conta para realizar as operaes de deposito, saque, impresso de extrato e consulta do saldo disponvel.
16
Teste os mtodos da classe Conta. Crie uma nova classe chamada TestaMetodosConta com o
cdigo abaixo.
17
48
www.k19.com.br
49
O RIENTAO A O BJETOS
6
7
8
9
10
11
12
13
14
15
16
17
18
19
}
20 }
c . deposita (1000) ;
c . imprimeExtrato () ;
System . out . println ( " ----------------------------------------" ) ;
System . out . println ( " Chamando o mtodo saca passando o valor 100 " ) ;
c . saca (100) ;
c . imprimeExtrato () ;
System . out . println ( " ----------------------------------------" ) ;
double saldoDisponivel = c . consultaSaldoDisponivel () ;
System . out . println ( " SALDO DISPONVEL : " + saldoDisponivel ) ;
Exerccios Complementares
9
Adicione na classe Funcionario dois mtodos: um para aumentar o salrio e outro para consultar os dados dos funcionrios.
10 Teste os mtodos da classe Funcionario. Crie uma nova classe chamada TestaMetodosFuncionario para implementar esse teste.
Sobrecarga (Overloading)
Os clientes dos bancos costumam consultar periodicamente informaes relativas s suas contas. Geralmente, essas informaes so obtidas atravs de extratos. No sistema do banco, os extratos
podem ser gerados por mtodos da classe Conta.
1 class Conta {
2
double saldo ;
3
double limite ;
4
5
void imprimeExtrato ( int dias ) {
6
// extrato
7
}
8 }
Cdigo Java 3.44: Conta.java
O mtodo imprimeExtrato() recebe a quantidade de dias que deve ser considerada para gerar
o extrato da conta. Por exemplo, se esse mtodo receber o valor 30 ento ele deve gerar um extrato
com as movimentaes dos ltimos 30 dias.
Em geral, extratos dos ltimos 15 dias atendem as necessidades dos clientes. Dessa forma, poderamos acrescentar um mtodo na classe Conta para gerar extratos com essa quantidade fixa de
dias.
www.facebook.com/k19treinamentos
49
O RIENTAO A O BJETOS
50
1 class Conta {
2
double saldo ;
3
double limite ;
4
5
void imprimeExtrato () {
6
// extrato dos ltimos 15 dias
7
}
8
9
void imprimeExtrato ( int dias ) {
10
// extrato
11
}
12 }
Cdigo Java 3.45: Conta.java
O primeiro mtodo no recebe parmetros pois ele utilizar uma quantidade de dias padro
definida pelo banco para gerar os extratos (15 dias).
O segundo recebe um valor inteiro como parmetro e deve considerar essa quantidade de dias
para gerar os extratos.
Os dois mtodos possuem o mesmo nome e lista de parmetros diferentes. Quando dois ou mais
mtodos so definidos na mesma classe com o mesmo nome, dizemos que houve uma sobrecarga
de mtodos. Uma sobrecarga de mtodos s vlida se as listas de parmetros dos mtodos so
diferentes entre si.
No caso dos dois mtodos que geram extratos, poderamos evitar repetio de cdigo fazendo
um mtodo chamar o outro.
1 class Conta {
2
3
void imprimeExtrato () {
4
this . imprimeExtrato (15) ;
5
}
6
7
void imprimeExtrato ( int dias ) {
8
// extrato
9
}
10 }
Cdigo Java 3.46: Conta.java
Exerccios de Fixao
18
Crie uma classe chamada Gerente para definir os objetos que representaro os gerentes do
banco. Defina dois mtodos de aumento salarial nessa classe. O primeiro deve aumentar o salrio
com uma taxa fixa de 10%. O segundo deve aumentar o salrio com uma taxa varivel.
50
www.k19.com.br
51
O RIENTAO A O BJETOS
9
void aumentaSalario ( double taxa ) {
10
this . salario += this . salario * taxa ;
11
}
12 }
Cdigo Java 3.47: Gerente.java
Teste os mtodos de aumento salarial definidos na classe Gerente. Crie uma nova classe chamada TestaGerente com o cdigo abaixo.
19
Construtores
No domnio de um banco, todo carto de crdito deve possuir um nmero. Toda agncia deve
possuir um nmero. Toda conta deve estar associada a uma agncia.
Aps criar um objeto para representar um carto de crdito, poderamos definir um valor para
o atributo numero. De maneira semelhante, podemos definir um nmero para um objeto da classe
Agencia e uma agncia para um objeto da classe Conta.
1 CartaoDeCredito cdc = new CartaoDeCredito () ;
2 cdc . numero = 12345;
Cdigo Java 3.49: Definindo um nmero para um carto de crdito
www.facebook.com/k19treinamentos
51
O RIENTAO A O BJETOS
52
Definir os valores dos atributos obrigatrios de um objeto logo aps a criao dele resolveria as
restries do sistema do banco. Porm, nada garante que todos os desenvolvedores sempre lembrem
de inicializar esses valores.
Para no correr esse risco, podemos utilizar construtores. Um construtor permite que um determinado trecho de cdigo seja executado toda vez que um objeto criado, ou seja, toda vez que
o operador new chamado. Assim como os mtodos, os construtores podem receber parmetros.
Contudo, diferentemente dos mtodos, os construtores no devolvem resposta.
Em Java, um construtor deve ter o mesmo nome da classe na qual ele foi definido.
1 class CartaoDeCredito {
2
int numero ;
3
4
CartaoDeCredito ( int numero ) {
5
this . numero = numero ;
6
}
7 }
Cdigo Java 3.52: CartaoDeCredito.java
1 class Agencia {
2
int numero ;
3
4
Agencia ( int numero ) {
5
this . numero = numero ;
6
}
7 }
Cdigo Java 3.53: Agencia.java
1 class Conta {
2
Agencia agencia ;
3
4
Conta ( Agencia agencia ) {
5
this . agencia = agencia ;
6
}
7 }
Cdigo Java 3.54: Conta.java
Na criao de um objeto com o comando new, os argumentos passados devem ser compatveis
com a lista de parmetros de algum construtor definido na classe que est sendo instanciada. Caso
contrrio, um erro de compilao ocorrer para avisar o desenvolvedor dos valores obrigatrios que
devem ser passados para criar um objeto.
1
2
3
4
5
6
1
2
3
4
5
52
// ERRO DE COMPILAO
CartaoDeCredito cdc = new CartaoDeCredito () ;
// ERRO DE COMPILAO
Agencia a = new Agencia () ;
www.k19.com.br
53
O RIENTAO A O BJETOS
6
7 // ERRO DE COMPILAO
8 Conta c = new Conta () ;
Cdigo Java 3.56: Construtores
Construtor Padro
Toda vez que um objeto criado, um construtor da classe correspondente deve ser chamado.
Mesmo quando nenhum construtor for definido explicitamente, h um construtor padro que ser
inserido pelo prprio compilador. O construtor padro no recebe parmetros e ser inserido sempre que o desenvolvedor no definir pelo menos um construtor explicitamente.
Portanto, para instanciar uma classe que no possui construtores definidos no cdigo fonte, devemos utilizar o construtor padro, j que este inserido automaticamente pelo compilador.
1 class Conta {
2
3 }
Cdigo Java 3.57: Conta.java
Lembrando que o construtor padro s ser inserido pelo compilador se nenhum construtor for
definido no cdigo fonte. Dessa forma, se voc adicionar um construtor com parmetros ento no
poder utilizar o comando new sem passar argumentos, pois um erro de compilao ocorrer.
1 class Agencia {
2
int numero ;
3
4
Agencia ( int numero ) {
5
this . numero = numero ;
6
}
7 }
Cdigo Java 3.59: Agencia.java
1 // ERRO DE COMPILAO
2 Agencia a = new Agencia () ;
Cdigo Java 3.60: Chamando um construtor sem argumentos
Sobrecarga de Construtores
O conceito de sobrecarga de mtodos pode ser aplicado para construtores. Dessa forma, podemos definir diversos construtores na mesma classe.
1 class Pessoa {
2
String rg ;
3
int cpf ;
4
5
Pessoa ( String rg ) {
6
this . rg = rg ;
www.facebook.com/k19treinamentos
53
O RIENTAO A O BJETOS
54
7
}
8
9
Pessoa ( int cpf ) {
10
this . cpf = cpf ;
11
}
12 }
Cdigo Java 3.61: Pessoa.java
Quando dois construtores so definidos, h duas opes no momento de utilizar o comando new.
1
2
3
4
5
Exerccios de Fixao
20
21
54
55
O RIENTAO A O BJETOS
Altere o cdigo das classes TestaAgencia e TestaContaEAgencia para que os erros de compilao sejam resolvidos.
22
23
tro.
1 public class CartaoDeCredito {
2
int numero ;
3
String dataDeValidade ;
4
5
Cliente cliente ;
6
7
CartaoDeCredito ( int numero ) {
8
this . numero = numero ;
www.facebook.com/k19treinamentos
55
O RIENTAO A O BJETOS
56
9
}
10 }
Cdigo Java 3.67: CartaoDeCredito.java
25
Altere o cdigo das classes TestaCartaoDeCredito e TestaClienteECartao para que os erros
de compilao sejam resolvidos.
56
www.k19.com.br
57
O RIENTAO A O BJETOS
26
Acrescente um construtor na classe Conta para receber uma referncia de um objeto do tipo
Altere o cdigo das classes TestaConta, TestaContaEAgencia, TestaMetodosConta e TestaValoresPadrao para que o erros de compilao sejam resolvidos.
28
www.facebook.com/k19treinamentos
57
O RIENTAO A O BJETOS
20
21
22
23
24
25
26
}
27 }
58
58
www.k19.com.br
59
O RIENTAO A O BJETOS
4
5
6
7
8
9
10
11
}
12 }
ValoresPadrao.
Na chamada do mtodo transfere(), devemos ter duas referncias de contas: uma para chamar
o mtodo e outra para passar como parmetro.
1
2
3
4
5
6
Quando a varivel destino passada como parmetro, somente a referncia armazenada nessa
varivel enviada para o mtodo transfere() e no o objeto em si. Em outras palavras, somente o
endereo para a conta que receber o valor da transferncia enviado para o mtodo transfere().
Exerccios de Fixao
www.facebook.com/k19treinamentos
59
O RIENTAO A O BJETOS
60
Faa um teste para verificar o funcionamento do mtodo transfere. Crie uma nova classe
chamada TestaMetodoTransfere com o cdigo abaixo.
30
60
www.k19.com.br
CAPTULO
A RRAYS
Suponha que o sistema do banco tenha que gerar listas com os nmeros das contas de uma
agncia. Poderamos declarar uma varivel para cada nmero.
1
2
3
4
int numero1 ;
int numero2 ;
int numero3 ;
...
Cdigo Java 4.1: Uma varivel para cada nmero de conta
Contudo, no seria uma abordagem prtica, pois uma agncia pode ter uma quantidade muito
grande de contas. Alm disso, novas contas podem ser abertas todos os dias. Isso implicaria em
alteraes constantes no cdigo fonte.
Quando desejamos armazenar uma grande quantidade de valores de um determinado tipo, podemos utilizar arrays. Um array um objeto que pode armazenar muitos valores de um determinado
tipo.
Podemos imaginar um array como sendo um armrio com um determinado nmero de gavetas.
E cada gaveta possui um rtulo com um nmero de identificao.
Criando um array
Em Java, os arrays so criados atravs do comando new.
1 int [] numeros = new int [100];
Cdigo Java 4.2: Criando um array com capacidade para 100 valores do tipo int
www.facebook.com/k19treinamentos
61
A RRAYS
62
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
Importante
Quando um array criado com o comando new, todas as posies so inicializadas com
os valores padro (nmeros so inicializados com 0, booleanos com false e referncias
com null).
Tambm podemos definir os valores de cada posio de um array no momento da sua criao
utilizando as sintaxes abaixo:
1 int [] numeros = new int []{100 ,87};
Cdigo Java 4.4: Inicializando o contedo de um array
62
www.k19.com.br
63
A RRAYS
Importante
Acessar posies fora do intervalo de ndices de um array gera erro de execuo. Mais
especificamente, em Java, ocorrer a exception ArrayIndexOutOfBoundsExcep-
tion.
Percorrendo um Array
Quando trabalhamos com um array, uma das tarefas mais comuns acessarmos todas ou algumas de suas posies sistematicamente. Geralmente, fazemos isso para resgatar todos ou alguns dos
valores armazenados e realizar algum processamento sobre tais informaes.
Para percorrermos um array, utilizaremos a instruo de repetio for. Podemos utilizar a instruo while tambm. Porm, logo perceberemos que a sintaxe da instruo for, em geral, mais
apropriada quando estamos trabalhando com arrays.
1 int [] numeros = new int [100];
2 for ( int i = 0; i < 100; i ++) {
3
numeros [ i ] = i ;
4 }
Cdigo Java 4.7: Percorrendo um array
Para percorrer um array, necessrio saber a quantidade de posies do mesmo. Essa quantidade definida quando o array criado atravs do comando new. Nem sempre essa informao
est explcita no cdigo. Por exemplo, considere um mtodo que imprima na sada padro os valores armazenados em um array. Provavelmente, esse mtodo receber como parmetro um array e a
quantidade de posies desse array no estar explcita no cdigo fonte.
1 void imprimeArray ( int [] numeros ) {
2
// implementao
3 }
Cdigo Java 4.8: Mtodo que deve imprimir o contedo de um array de int
foreach
www.facebook.com/k19treinamentos
63
A RRAYS
64
Para acessar todos os elementos de um array, possvel aplicar o comando for com uma sintaxe
um pouco diferente.
1 void imprimeArray ( int [] numeros ) {
2
for ( int numero : numeros ) {
3
System . out . println ( numero ) ;
4
}
5 }
Cdigo Java 4.10: Percorrendo um array com foreach
Operaes
Nas bibliotecas da plataforma Java, existem mtodos que realizam algumas tarefas teis relacionadas a arrays. Veremos esses mtodos a seguir.
Ordenando um Array
Considere um array de String criado para armazenar nomes de pessoas. Podemos ordenar esses
nomes atravs do mtodo Arrays.sort().
1
2
3
4
5
6
String [] nomes = new String []{ " rafael cosentino " , " jonas hirata " , " marcelo martins " };
Arrays . sort ( nomes ) ;
for ( String nome : nomes ) {
System . out . println ( nome ) ;
}
Cdigo Java 4.11: Ordenando um array
Duplicando um Array
Para copiar o contedo de um array para outro com maior capacidade, podemos utilizar o mtodo Arrays.copyOf().
1 String [] nomes = new String [] { " rafael " , " jonas " , " marcelo " };
2 String [] nomesDuplicados = Arrays . copyOf ( nomes , 10) ;
Cdigo Java 4.12: Duplicando
Preenchendo um Array
Podemos preencher todas as posies de um array com um valor especfico utilizando o mtodo
Arrays.fill().
1 int [] numeros = new int [10];
2 java . util . Arrays . fill ( numeros , 5) ;
Cdigo Java 4.13: Preenchendo um array com um valor especfico
Exerccios de Fixao
64
www.k19.com.br
65
A RRAYS
Para no confundir, feche o projeto OrientacaoAObjetos clicando com o boto direito do mouse
sobre esse projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os
exerccios desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo
correspondente e siga a imagem abaixo.
1
Crie um programa que exiba no Console os argumentos passados na linha de comando para o
mtodo main. Faa uma classe chamada ExibeArgumentos com o seguinte contedo.
2
www.facebook.com/k19treinamentos
65
A RRAYS
66
Execute a classe ExibeArgumentos e observe que nada exibido no Console j que nenhum parmetro foi passado para o mtodo main.
Defina os parmetros que devem ser passados para o mtodo main da classe ExibeArgumentos.
Digite CTRL + 3 e pesquise por Run Configurations. Selecione a opo correspondente e siga as
imagens abaixo.
3
66
www.k19.com.br
67
A RRAYS
Observe os parmetros exibidos no Console. Repita o processo algumas vezes para passar parmetros diferentes para o mtodo main da classe ExibeArgumentos.
Faa um programa que ordene o array de strings passado para o mtodo main. Crie uma classe
chamada OrdenaArgumentos com o seguinte contedo.
4
Execute a classe OrdenaArgumentos e observe que nada exibido no Console j que nenhum
parmetro foi passado para o mtodo main.
Defina os parmetros que devem ser passados para o mtodo main da classe OrdenaArgumentos.
Digite CTRL + 3 e pesquise por Run Configurations. Selecione a opo correspondente e siga as
imagens abaixo.
5
www.facebook.com/k19treinamentos
67
A RRAYS
68
Observe os parmetros exibidos no Console. Repita o processo algumas vezes para passar parmetros diferentes para o mtodo main da classe OrdenaArgumentos.
Exerccios Complementares
Faa um programa que calcule a mdia dos parmetros passados para o mtodo main. Crie uma
classe chamada Media para implementar esse programa. Dica: para converter strings para double
utilize o mtodo parseDouble()
1
Faa um programa que encontre o maior nmero entre os parmetros passados para o mtodo
main. Crie uma classe chamada Maior para implementar esse programa.
68
www.k19.com.br
CAPTULO
Atributos Estticos
Num sistema bancrio, provavelmente, criaramos uma classe para especificar os objetos que
representariam os funcionrios do banco.
1 class Funcionario {
2
String nome ;
3
double salario ;
4
5
void aumentaSalario ( double aumento ) {
6
this . salario += aumento ;
7
}
8 }
Cdigo Java 5.1: Funcionario.java
Suponha que o banco paga aos seus funcionrios um valor padro de vale refeio por dia trabalhado. O sistema do banco precisa guardar esse valor. Poderamos definir um atributo na classe
Funcionario para tal propsito.
1 class Funcionario {
2
String nome ;
3
double salario ;
4
double valeRefeicaoDiario ;
5
6
void aumentaSalario ( double aumento ) {
7
this . salario += aumento ;
8
}
9 }
Cdigo Java 5.2: Funcionario.java
FUNCIONARIO
nome = Jonas Hirata
valeRefeicaoDiario = 15
FUNCIONARIO
nome = Marcelo Martins
valeRefeicaoDiario = 15
69
70
devemos torn-lo um atributo de classe ao invs de um atributo de instncia. Para isso, devemos
aplicar o modificador static na declarao do atributo.
1 class Funcionario {
2
String nome ;
3
double salario ;
4
static double valeRefeicaoDiario ;
5
6
void aumentaSalario ( double aumento ) {
7
this . salario += aumento ;
8
}
9 }
Cdigo Java 5.3: Funcionario.java
Um atributo de classe deve ser acessado atravs do nome da classe na qual ele foi definido.
1 Funcionario . valeRefeicaoDiario = 15;
Cdigo Java 5.4: Acessando um atributo de classe
valeRefeicaoDiario = 15
FUNCIONARIO
nome = Rafael Cosentino
FUNCIONARIO
nome = Jonas Hirata
FUNCIONARIO
nome = Marcelo Martins
Mtodos Estticos
Definimos mtodos para implementar as lgicas que manipulam os valores dos atributos de instncia. Podemos fazer o mesmo para os atributos de classe.
Suponha que o banco tenha um procedimento para reajustar o valor do vale refeio baseado em
uma taxa. Poderamos definir um mtodo na classe Funcionario para implementar esse reajuste.
1 void reajustaValeRefeicaoDiario ( double taxa ) {
2
Funcionario . valeRefeicaoDiario += Funcionario . valeRefeicaoDiario * taxa ;
70
www.k19.com.br
71
3 }
Um mtodo de classe deve ser chamado atravs do nome da classe na qual ele foi definido.
1 Funcionario . reajustaValeRefeicaoDiario (0.1) ;
Exerccios de Fixao
1
Para no confundir, feche o projeto Arrays clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
www.facebook.com/k19treinamentos
71
72
Crie uma classe chamada Conta no projeto Static. Defina um atributo para contabilizar o nmero de objetos instanciados a partir da classe Conta. Esse atributo deve ser incrementado toda vez
que um objeto criado. Utilize um construtor para fazer esse incremento.
2
3
Faa um teste criando dois objetos da classe Conta. Exiba o valor do atributo contador depois
da criao de cada objeto. Crie uma classe chamada TestaContador com o seguinte contedo.
72
www.k19.com.br
73
2
public static void main ( String [] args ) {
3
Conta c1 = new Conta () ;
4
5
System . out . println ( " Contador : " + c1 . contador ) ;
6
7
Conta c2 = new Conta () ;
8
9
System . out . println ( " Contador : " + c2 . contador ) ;
10
}
11 }
Cdigo Java 5.11: TestaContador.java
4
Altere a classe Conta. O atributo contador deve ser um atributo de classe. Ento, adicione
o modificador static nesse atributo. Alm disso, no construtor, acesse o atributo contador com o
nome da classe e no com a varivel this.
O contador de contas pode ser utilizado para gerar um nmero nico para cada conta. Acrescente na classe Conta um atributo de instncia para guardar os nmeros das contas. Implemente no
construtor a lgica para gerar esses nmeros de forma nica atravs do contador de contas.
6
www.facebook.com/k19treinamentos
73
74
4
int numero ;
5
6
Conta () {
7
Conta . contador ++;
8
this . numero = Conta . contador ;
9
}
10 }
Cdigo Java 5.14: Conta.java
74
www.k19.com.br
75
16
}
17 }
Cdigo Java 5.17: TestaContador.java
Exerccios Complementares
Crie uma classe chamada Funcionario para modelar os funcionrios do banco. Considere que
esses funcionrios possuem nome e salrio. Defina nessa classe um atributo para armazenar o valor
do vale refeio dirio pago aos funcionrios. Considere que esse valor igual para todos os funcionrios.
1
2
Faa um teste para verificar o funcionamento do atributo que armazena o valor do vale refeio dos funcionrios. Altere e exiba no Console o valor desse atributo. Crie uma classe chamada
TestaValeRefeicao.
Defina um mtodo de classe na classe Funcionario para reajustar o vale refeio dirio a partir
de uma taxa.
3
www.facebook.com/k19treinamentos
75
76
76
www.k19.com.br
CAPTULO
E NCAPSULAMENTO
Atributos Privados
No sistema do banco, cada objeto da classe Funcionario possui um atributo para guardar o salrio do funcionrio que ele representa.
1 class Funcionario {
2
double salario ;
3 }
Cdigo Java 6.1: Funcionario.java
O atributo salario pode ser acessado ou modificado por cdigo escrito em qualquer classe que
esteja no mesmo diretrio que a classe Funcionario. Portanto, o controle desse atributo descentralizado.
Para identificar algum erro relacionado a manipulao dos salrios dos funcionrios, necessrio verificar o cdigo de todos os arquivos da pasta onde a classe Funcionario est definida. Quanto
maior o nmero de arquivos, menos eficiente ser a manuteno da aplicao.
Podemos obter um controle centralizado tornando o atributo salario privado e definindo mtodos para implementar todas as lgicas que utilizam ou modificam o valor desse atributo.
1 class Funcionario {
2
private double salario ;
3
4
void aumentaSalario ( double aumento ) {
5
// lgica para aumentar o salrio
6
}
7 }
Cdigo Java 6.2: Funcionario.java
Um atributo privado s pode ser acessado ou alterado por cdigo escrito dentro da classe na
qual ele foi definido. Se algum cdigo fora da classe Funcionario tentar acessar ou alterar o valor do
atributo privado salario, um erro de compilao ser gerado.
Definir todos os atributos como privado e mtodos para implementar as lgicas de acesso e alterao quase uma regra da orientao a objetos. O intuito ter sempre um controle centralizado do
dados dos objetos para facilitar a manuteno do sistema e a deteco de erros.
Mtodos Privados
www.facebook.com/k19treinamentos
77
E NCAPSULAMENTO
78
O papel de alguns mtodos pode ser o de auxiliar outros mtodos da mesma classe. E muitas
vezes, no correto chamar esses mtodos auxiliares de fora da sua classe diretamente.
No exemplo abaixo, o mtodo descontaTarifa() um mtodo auxiliar dos mtodos deposita()
e saca(). Alm disso, ele no deve ser chamado diretamente, pois a tarifa s deve ser descontada
quando ocorre um depsito ou um saque.
1 class Conta {
2
private double saldo ;
3
4
void deposita ( double valor ) {
5
this . saldo += valor ;
6
this . descontaTarifa () ;
7
}
8
9
void saca ( double valor ) {
10
this . saldo -= valor ;
11
this . descontaTarifa () ;
12
}
13
14
void descontaTarifa () {
15
this . saldo -= 0.1;
16
}
17 }
Cdigo Java 6.3: Conta.java
Para garantir que mtodos auxiliares no sejam chamados por cdigo escrito fora da classe na
qual eles foram definidos, podemos torn-los privados, acrescentando o modificador private.
1 private void descontaTarifa () {
2
this . saldo -= 0.1;
3 }
Cdigo Java 6.4: Mtodo privado descontaTarifa()
Qualquer chamada ao mtodo descontaTarifa() realizada fora da classe Conta gera um erro de
compilao.
Mtodos Pblicos
Os mtodos que devem ser chamados a partir de qualquer parte do sistema devem possuir o
modificador de visibilidade public.
1 class Conta {
2
private double saldo ;
3
4
public void deposita ( double valor ) {
5
this . saldo += valor ;
6
this . descontaTarifa () ;
7
}
8
9
public void saca ( double valor ) {
10
this . saldo -= valor ;
11
this . descontaTarifa () ;
12
}
13
14
private descontaTarifa () {
15
this . saldo -= 0.1;
16
}
78
www.k19.com.br
79
E NCAPSULAMENTO
17 }
Cdigo Java 6.5: Conta.java
Por qu encapsular?
Uma das ideias mais importantes da orientao a objetos o encapsulamento. Encapsular significa esconder a implementao dos objetos. O encapsulamento favorece principalmente dois aspectos de um sistema: a manuteno e o desenvolvimento.
A manuteno favorecida pois, uma vez aplicado o encapsulamento, quando o funcionamento
de um objeto deve ser alterado, em geral, basta modificar a classe do mesmo.
O desenvolvimento favorecido pois, uma vez aplicado o encapsulamento, conseguimos determinar precisamente as responsabilidades de cada classe da aplicao.
O conceito de encapsulamento pode ser identificado em diversos exemplos do cotidiano. Mostraremos alguns desses exemplos para esclarecer melhor a ideia.
79
E NCAPSULAMENTO
80
No contexto da orientao a objetos, aplicamos o encapsulamento para criar objetos mais simples de serem utilizados em qualquer parte do sistema.
Calling Maria
www.k19.com.br
81
E NCAPSULAMENTO
12:30
12:30
81
E NCAPSULAMENTO
82
Aplicando a ideia do encapsulamento, os atributos deveriam ser todos privados. Consequentemente, os atributos no podem ser acessados ou modificados por cdigo escrito fora da classe na
qual eles foram definidos.
Porm, muitas vezes, as informaes armazenadas nos atributos precisam ser consultadas de
qualquer lugar do sistema. Nesse caso, podemos disponibilizar mtodos para consultar os valores
dos atributos.
1 class Cliente {
2
private String nome ;
3
4
public String consultaNome () {
5
return this . nome ;
6
}
7 }
Cdigo Java 6.6: Cliente.java
Da mesma forma, eventualmente, necessrio modificar o valor de um atributo a partir de qualquer lugar do sistema. Nesse caso, tambm poderamos criar um mtodo para essa tarefa.
1 class Cliente {
2
private String nome ;
3
4
public void alteraNome ( String nome ) {
5
this . nome = nome ;
6
}
7 }
Cdigo Java 6.7: Cliente.java
Muitas vezes, necessrio consultar e alterar o valor de um atributo a partir de qualquer lugar do
sistema. Nessa situao, podemos definir os dois mtodos discutidos anteriormente. Mas, o que
melhor? Criar os dois mtodos (um de leitura e outro de escrita) ou deixar o atributo pblico?
Quando queremos consultar a quantidade de combustvel de um automvel, olhamos o painel
ou abrimos o tanque de combustvel?
Quando queremos alterar o toque da campainha de um celular, utilizamos os menus do celular
ou desmontamos o aparelho?
Acessar ou modificar as propriedades de um objeto manipulando diretamente os seus atributos
uma abordagem que normalmente gera problemas. Por isso, mais seguro para a integridade dos
objetos e, consequentemente, para a integridade da aplicao, que esse acesso ou essa modificao
sejas realizados atravs de mtodos do objeto. Utilizando mtodos, podemos controlar como as
alteraes e as consultas so realizadas. Ou seja, temos um controle maior.
Getters e Setters
Na linguagem Java, h uma conveno de nomenclatura para os mtodos que tm como finalidade acessar ou alterar as propriedades de um objeto.
82
www.k19.com.br
83
E NCAPSULAMENTO
Segundo essa conveno, os nomes dos mtodos que permitem a consulta das propriedades de
um objeto devem possuir o prefixo get. Analogamente, os nomes dos mtodos que permitem a alterao das propriedades de um objeto devem possuir o prefixo set.
Na maioria dos casos, muito conveniente seguir essa conveno, pois os desenvolvedores Java
j esto acostumados com essas regras de nomenclatura e o funcionamento de muitas bibliotecas
do Java depende fortemente desse padro.
1 class Cliente {
2
private String nome ;
3
4
public String getNome () {
5
return this . nome ;
6
}
7
8
public void setNome ( String nome ) {
9
this . nome = nome ;
10
}
11 }
Exerccios de Fixao
1
Para no confundir, feche o projeto Static clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
www.facebook.com/k19treinamentos
83
E NCAPSULAMENTO
84
Defina uma classe chamada Funcionario para representar os funcionrios de um banco com
um atributo para guardar os salrios e outro para os nomes.
2
Crie um objeto da classe Funcionario. Altere e exiba os valores dos atribtuos desse objeto.
Adicione uma classe chamada Teste no projeto Encapsulamento.
3
84
www.k19.com.br
85
E NCAPSULAMENTO
6
f . salario = 2000;
7
8
System . out . println ( " Nome : " + f . nome ) ;
9
System . out . println ( " Salrio : " + f . salario ) ;
10
}
11 }
Cdigo Java 6.10: Teste.java
Execute a classe Teste. Observe que essa classe pode acessar e modificar os atributos do objeto
criado com a classe Funcionario.
Aplique a ideia do encapsulamento tornando os atributos definidos na classe Funcionario privados.
4
Observe os erros de compilao na classe Teste. Agora, essa classe no pode mais acessar ou
modificar os atributos do objeto criado com a classe Funcionario.
5
Crie mtodos de acesso com nomes padronizados para os atributos definidos na classe Funcio-
nario.
1 public class Funcionario {
2
private double salario ;
3
private String nome ;
4
5
public double getSalario () {
6
return this . salario ;
7
}
8
9
public String getNome () {
10
return this . nome ;
11
}
12
13
public void setSalario ( double salario ) {
14
this . salario = salario ;
15
}
16
17
public void setNome ( String nome ) {
18
this . nome = nome ;
19
}
20 }
Cdigo Java 6.12: Funcionario.java
7 Altere a classe Teste para que ela utilize os mtodos de acesso ao invs de manipular os atributos
do objeto da classe Funcionario diretamente. Dica: Com o cursor de digitao sobre o primeiro erro
de compilao digite CTRL + 1 e selecione a opo Replace f.nome with setter. Analogamente, o
mesmo processo pode ser utilizado para resolver os outros trs erros de compilao.
www.facebook.com/k19treinamentos
85
E NCAPSULAMENTO
86
9
Gere os getters e setters com os recursos do Eclipse. Digite get ou set seguidos de CTRL +
ESPAO para completar o cdigo.
Outra possibilidade digitar CTRL + 3 e pesquisar por generate getters and setters ou simplesmente ggas.
86
www.k19.com.br
87
E NCAPSULAMENTO
Exerccios Complementares
Implemente uma classe chamada Conta para modelar as contas de um banco. Considere que
toda conta possui nmero, saldo e limite.
1
Adicione mtodos de acesso com nomes padronizados para os atributos da classe Conta.
Crie objetos da classe Conta e utilize os mtodos de acesso para alterar os valores dos atributos.
www.facebook.com/k19treinamentos
87
E NCAPSULAMENTO
88
88
www.k19.com.br
CAPTULO
H ERANA
Reutilizao de Cdigo
Um banco oferece diversos servios que podem ser contratados individualmente pelos clientes.
Quando um servio contratado, o sistema do banco deve registrar quem foi o cliente que contratou
o servio, quem foi o funcionrio responsvel pelo atendimento ao cliente e a data de contratao.
Com o intuito de ser produtivo, a modelagem dos servios do banco deve diminuir a repetio de
cdigo. A ideia reaproveitar o mximo do cdigo j criado. Essa ideia est diretamente relacionada
ao conceito Dont Repeat Yourself. Em outras palavras, devemos minimizar ao mximo a utilizao
do copiar e colar. O aumento da produtividade e a diminuio do custo de manuteno so as
principais motivaes do DRY.
Em seguida, vamos discutir algumas modelagens possveis para os servios do banco. Buscaremos seguir a ideia do DRY na criao dessas modelagens.
Emprstimo
O emprstimo um dos servios que o banco oferece. Quando um cliente contrata esse servio,
so definidos o valor e a taxa de juros mensal do emprstimo. Devemos acrescentar dois atributos
na classe Servico: um para o valor e outro para a taxa de juros do servio de emprstimo.
1 class Servico {
2
// GERAL
3
private Cliente contratante ;
4
private Funcionario responsavel ;
5
private String dataDeContratacao ;
6
7
// EMPRSTIMO
8
private double valor ;
www.facebook.com/k19treinamentos
89
H ERANA
90
9
private double taxa ;
10
11
// mtodos
12 }
Cdigo Java 7.2: Servico.java
Seguro de veculos
Outro servio oferecido pelo banco o seguro de veculos. Para esse servio devem ser definidas
as seguintes informaes: veculo segurado, valor do seguro e a franquia. Devemos adicionar trs
atributos na classe Servico.
1 class Servico {
2
// GERAL
3
private Cliente contratante ;
4
private Funcionario responsavel ;
5
private String dataDeContratacao ;
6
7
// EMPRSTIMO
8
private double valor ;
9
private double taxa ;
10
11
// SEGURO DE VEICULO
12
private Veiculo veiculo ;
13
private double valorDoSeguroDeVeiculo ;
14
private double franquia ;
15
16
// mtodos
17 }
Cdigo Java 7.3: Servico.java
Apesar de seguir a ideia do DRY, modelar todos os servios com apenas uma classe pode dificultar
o desenvolvimento. Supondo que dois ou mais desenvolvedores so responsveis pela implementao dos servios, eles provavelmente modificariam a mesma classe concorrentemente. Alm disso,
os desenvolvedores, principalmente os recm chegados no projeto do banco, ficariam confusos com
o cdigo extenso da classe Servico.
Outro problema que um objeto da classe Servico possui atributos para todos os servios que
o banco oferece. Na verdade, ele deveria possuir apenas os atributos relacionados a um servio. Do
ponto de vista de performance, essa abordagem causaria um consumo desnecessrio de memria.
90
www.k19.com.br
91
H ERANA
11
12
// mtodos
13 }
1 class Emprestimo {
2
// GERAL
3
private Cliente contratante ;
4
private Funcionario responsavel ;
5
private String dataDeContratacao ;
6
7
// EMPRSTIMO
8
private double valor ;
9
private double taxa ;
10
11
// mtodos
12 }
Criar uma classe para cada servio torna o sistema mais flexvel, pois qualquer alterao em um
determinado servio no causar efeitos colaterais nos outros. Mas, por outro lado, essas classes
teriam bastante cdigo repetido, contrariando a ideia do DRY. Alm disso, qualquer alterao que
deva ser realizada em todos os servios precisa ser implementada em cada uma das classes.
91
H ERANA
92
92
www.k19.com.br
93
H ERANA
A classe genrica denominada super classe, classe base ou classe me. As classes especficas
so denominadas sub classes, classes derivadas ou classes filhas.
Quando o operador new aplicado em uma sub classe, o objeto construdo possuir os atributos
e mtodos definidos na sub classe e na super classe.
EMPRESTIMO
valor
taxa
new Emprestimo()
SERVICO
contratante
responsavel
dataDeContratacao
Preo Fixo
Suponha que todo servio do banco possui uma taxa administrativa que deve ser paga pelo cliente que contratar o servio. Inicialmente, vamos considerar que o valor dessa taxa igual para todos
os servios do banco.
Neste caso, poderamos implementar um mtodo na classe Servico para calcular o valor da taxa.
Este mtodo ser reaproveitado por todas as classes que herdam da classe Servico.
1 class Servico {
2
// ATRIBUTOS
3
4
public double calculaTaxa () {
5
return 10;
6
}
7 }
Cdigo Java 7.10: Servico.java
1
2
3
4
5
6
7
Reescrita de Mtodo
Suponha que o valor da taxa administrativa do servio de emprstimo diferente dos outros
servios, pois ele calculado a partir do valor emprestado ao cliente. Como esta lgica especfica
www.facebook.com/k19treinamentos
93
H ERANA
94
para o servio de emprstimo, devemos acrescentar um mtodo para implementar esse clculo na
classe Emprestimo.
1 class Emprestimo extends Servico {
2
// ATRIBUTOS
3
4
public double calculaTaxaDeEmprestimo () {
5
return this . valor * 0.1;
6
}
7 }
Cdigo Java 7.12: Emprestimo.java
Os mtodos das classes especficas tm prioridade sobre os mtodos das classes genricas. Em
outras palavras, se o mtodo chamado existe na classe filha ele ser chamado, caso contrrio o mtodo ser procurado na classe me.
Quando definimos um mtodo com a mesma assinatura na classe base e em alguma classe derivada, estamos aplicando o conceito de Reescrita de Mtodo.
Fixo + Especfico
Suponha que o preo de um servio a soma de um valor fixo mais um valor que depende do tipo
do servio. Por exemplo, o preo do servio de emprstimo 5 reais mais uma porcentagem do valor
emprestado ao cliente. O preo do servio de seguro de veculo 5 reais mais uma porcentagem do
valor do veculo segurado. Em cada classe especfica, podemos reescrever o mtodo calculaTaxa().
1 class Emprestimo extends Servico {
2
// ATRIBUTOS
3
4
public double calculaTaxa () {
5
return 5 + this . valor * 0.1;
6
}
7 }
94
www.k19.com.br
95
H ERANA
Se o valor fixo dos servios for atualizado, todas as classes especficas devem ser modificadas. Outra alternativa seria criar um mtodo na classe Servico para calcular o valor fixo de todos os servios
e cham-lo dos mtodos reescritos nas classes especficas.
1 class Servico {
2
public double calculaTaxa () {
3
return 5 ;
4
}
5 }
Cdigo Java 7.16: Servico.java
Dessa forma, quando o valor padro do preo dos servios alterado, basta modificar o mtodo
na classe Servico.
Construtores e Herana
Quando temos uma hierarquia de classes, as chamadas dos construtores so mais complexas
do que o normal. Pelo menos um construtor de cada classe de uma mesma sequncia hierrquica
deve ser chamado ao instanciar um objeto. Por exemplo, quando um objeto da classe Emprestimo
criado, pelo menos um construtor da prpria classe Emprestimo e um da classe Servico devem ser
executados. Alm disso, os construtores das classes mais genricas so chamados antes dos construtores das classes especficas.
1 class Servico {
2
// ATRIBUTOS
3
4
public Servico () {
5
System . out . println ( " Servico " ) ;
6
}
7 }
Cdigo Java 7.18: Servico.java
www.facebook.com/k19treinamentos
95
H ERANA
96
Por padro, todo construtor chama o construtor sem argumentos da classe me se no existir
nenhuma chamada de construtor explcita.
Exerccios de Fixao
1
Para no confundir, feche o projeto Encapsulamento clicando com o boto direito do mouse
sobre esse projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os
exerccios desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo
correspondente e siga a imagem abaixo.
96
www.k19.com.br
97
H ERANA
Defina uma classe chamada Funcionario para modelar os funcionrios de um banco. Sabendo
que todo funcionrio possui nome e salrio, inclua os getters e setters dos atributos.
2
Crie uma classe para cada tipo especfico de funcionrio herdando da classe Funcionario. Considere apenas trs tipos especficos de funcionrios: gerentes, telefonistas e secretarias. Os gerentes
possuem um nome de usurio e uma senha para acessar o sistema do banco. As telefonistas possuem
um cdigo de estao de trabalho. As secretarias possuem um nmero de ramal.
3
www.facebook.com/k19treinamentos
97
H ERANA
98
Teste o funcionamento dos trs tipos de funcionrios criando um objeto de cada uma das classes:
98
www.k19.com.br
99
H ERANA
Altere a classe TestaFuncionarios para exibir a bonificao de cada funcionrio, alm dos
dados que j foram impressos. Depois, execute o teste novamente.
6
99
H ERANA
100
Suponha que os gerentes recebam uma bonificao maior que os outros funcionrios. Reescreva
o mtodo calculaBonificacao() na classe Gerente.
7
Exerccios Complementares
Reescreva o mtodo mostraDados nas classes Gerente, Telefonista e Secretaria para acrescentar os dados especficos de cada tipo de funcionrio.
2
100
www.k19.com.br
CAPTULO
P OLIMORFISMO
Controle de Ponto
O sistema do banco deve possuir um controle de ponto para registrar a entrada e sada dos funcionrios. O pagamento dos funcionrios depende dessas informaes. Podemos definir uma classe
para implementar o funcionamento de um relgio de ponto.
1 class ControleDePonto {
2
3
public void registraEntrada ( Gerente g ) {
4
SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ;
5
Date agora = new Date () ;
6
7
System . out . println ( " ENTRADA : " + g . getCodigo () ) ;
8
System . out . println ( " DATA : "
+ sdf . format ( agora ) ) ;
9
}
10
11
public void registraSaida ( Gerente g ) {
12
SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ;
13
Date agora = new Date () ;
14
15
System . out . println ( " SADA : " + g. getCodigo () ) ;
16
System . out . println ( " DATA : " + sdf . format ( agora ) ) ;
17
}
18 }
Cdigo Java 8.1: ControleDePonto.java
A classe acima possui dois mtodos: o primeiro para registrar a entrada e o segundo para registrar
a sada dos gerentes do banco. Contudo, esses dois mtodos no so aplicveis aos outros tipos de
funcionrios.
Seguindo essa abordagem, a classe ControleDePonto precisaria de um par de mtodos para cada
cargo. Ento, a quantidade de mtodos dessa classe seria igual a quantidade de cargos multiplicada por dois. Imagine que no banco exista 30 cargos distintos. Teramos 60 mtodos na classe
ControleDePonto.
Os procedimentos de registro de entrada e sada so idnticos para todos os funcionrios. Consequentemente, qualquer alterao na lgica desses procedimentos implicaria na modificao de
todos os mtodos da classe ControleDePonto.
Alm disso, se o banco definir um novo tipo de funcionrio, dois novos mtodos praticamente
idnticos aos que j existem teriam de ser adicionados na classe ControleDePonto. Analogamente,
se um cargo deixar de existir, os dois mtodos correspondentes da classe ControleDePonto devero
ser retirados.
www.facebook.com/k19treinamentos
101
P OLIMORFISMO
102
SECRETRIAS
TELEFONISTAS
SECRETRIAS
TELEFONISTAS
GERENTES
GERENTES
UM (extends)
102
www.k19.com.br
103
P OLIMORFISMO
Alm de gerar reaproveitamento de cdigo, a utilizao de herana permite que objetos criados
a partir das classes especficas sejam tratados como objetos da classe genrica.
Em outras palavras, a herana entre as classes que modelam os funcionrios permite que objetos criados a partir das classes Gerente ou Telefonista sejam tratados como objetos da classe
Funcionario.
No cdigo da classe Gerente utilizamos a palavra extends. Ela pode ser interpretada como a
expresso: UM ou UMA.
1 class Gerente extends Funcionario
2 // TODO Gerente UM Funcionario
Cdigo Java 8.5: Gerente.java
Como est explcito no cdigo que todo gerente um funcionrio ento podemos criar um objeto
da classe Gerente e trat-lo como um objeto da classe Funcionario tambm.
1
2
3
4
5
Em alguns lugares do sistema do banco ser mais vantajoso tratar um objeto da classe Gerente
como um objeto da classe Funcionario.
www.facebook.com/k19treinamentos
103
P OLIMORFISMO
104
15
System . out . println ( " SADA : " + f . getCodigo () ) ;
16
System . out . println ( " DATA : " + sdf . format ( agora ) ) ;
17
}
18 }
FUNCIONRIOS
TELEFONISTAS
GERENTES
SECRETRIAS
FUNCIONRIOS
Exerccios de Fixao
1
Para no confundir, feche o projeto Heranca clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
104
www.k19.com.br
105
P OLIMORFISMO
Defina duas classes especficas para dois tipos de contas do banco: poupana e corrente.
www.facebook.com/k19treinamentos
105
P OLIMORFISMO
106
1
2
3
4
5
6
7
8
9
10
11
12
13
Exerccios Complementares
106
Implemente duas classes especficas para modelar dois tipos particulares de funcionrios do
www.k19.com.br
107
P OLIMORFISMO
Implemente o controle de ponto dos funcionrios. Crie uma classe com dois mtodos: o primeiro para registrar a entrada dos funcionrios e o segundo para registrar a sada.
3
4
Teste a lgica do controle de ponto, registrando a entrada e a sada de um gerente e de uma
telefonista.
www.facebook.com/k19treinamentos
107
P OLIMORFISMO
108
108
www.k19.com.br
CAPTULO
C LASSES A BSTRATAS
Classes Abstratas
No banco, todas as contas so de um tipo especfico. Por exemplo, conta poupana, conta corrente ou conta salrio. Essas contas poderiam ser modeladas atravs das seguintes classes utilizando
o conceito de herana:
1 class Conta {
2
// Atributos
3
// Construtores
4
// Mtodos
5 }
Cdigo Java 9.1: Conta.java
Para cada conta do domnio do banco devemos criar um objeto da classe correspondente ao tipo
da conta. Por exemplo, se existe uma conta poupana no domnio do banco devemos criar um objeto
da classe ContaPoupanca.
1 ContaPoupanca cp = new ContaPoupanca () ;
Cdigo Java 9.4: Criando um objeto da classe ContaPoupanca
Faz sentido criar objetos da classe ContaPoupanca pois existem contas poupana no domnio do
banco. Dizemos que a classe ContaPoupanca uma classe concreta pois criaremos objetos a partir
dela.
Por outro lado, a classe Conta no define uma conta que de fato existe no domnio do banco. Ela
apenas serve como base para definir as contas concretos.
www.facebook.com/k19treinamentos
109
C LASSES A BSTRATAS
110
No faz sentido criar um objeto da classe Conta pois estaramos instanciado um objeto que no
suficiente para representar uma conta que pertena ao domnio do banco. Mas, a princpio, no h
nada proibindo a criao de objetos dessa classe. Para adicionar essa restrio no sistema, devemos
tornar a classe Conta abstrata.
Uma classe concreta pode ser diretamente utilizada para instanciar objetos. Por outro lado, uma
classe abstrata no pode. Para definir uma classe abstrata, basta adicionar o modificador abstract.
1 abstract class Conta {
2
// Atributos
3
// Construtores
4
// Mtodos
5 }
Cdigo Java 9.5: Conta.java
Todo cdigo que tenta criar um objeto de uma classe abstrata no compila.
1 // Erro de compilao
2 Conta c = new Conta () ;
Cdigo Java 9.6: Erro de compilao
Mtodos Abstratos
Suponha que o banco oferea extrato detalhado das contas e para cada tipo de conta as informaes e o formato desse extrato detalhado so diferentes. Alm disso, a qualquer momento o banco
pode mudar os dados e o formato do extrato detalhado de um dos tipos de conta.
Neste caso, parece no fazer sentido ter um mtodo na classe Conta para gerar extratos detalhados pois ele seria reescrito nas classes especficas sem nem ser reaproveitado.
Poderamos, simplesmente, no definir nenhum mtodo para gerar extratos detalhados na classe
Conta. Porm, no haveria nenhuma garantia que as classes que derivam direta ou indiretamente da
classe Conta implementem mtodos para gerar extratos detalhados.
Mas, mesmo supondo que toda classe derivada implemente um mtodo para gerar os extratos
que desejamos, ainda no haveria nenhuma garantia em relao as assinaturas desses mtodos. As
classes derivadas poderiam definir mtodos com nomes ou parmetros diferentes. Isso prejudicaria
a utilizao dos objetos que representam as contas devido a falta de padronizao das operaes.
Para garantir que toda classe concreta que deriva direta ou indiretamente da classe Conta tenha
uma implementao de mtodo para gerar extratos detalhados e alm disso que uma mesma assinatura de mtodo seja utilizada, devemos utilizar o conceito de mtodos abstratos.
Na classe Conta, definimos um mtodo abstrato para gerar extratos detalhados. Um mtodo
abstrato no possui corpo (implementao).
1 abstract class Conta {
2
// Atributos
3
// Construtores
4
// Mtodos
5
6
public abstract void imprimeExtratoDetalhado () ;
110
www.k19.com.br
111
C LASSES A BSTRATAS
7 }
As classes concretas que derivam direta ou indiretamente da classe Conta devem possuir uma
implementao para o mtodo imprimeExtratoDetalhado().
1 class ContaPoupanca extends Conta {
2
private int diaDoAniversario ;
3
4
public void imprimeExtratoDetalhado () {
5
System . out . println ( " EXTRATO DETALHADO DE CONTA POUPANA " ) ;
6
7
SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ;
8
Date agora = new Date () ;
9
10
System . out . println ( " DATA : " + sdf . format ( agora ) ) ;
11
System . out . println ( " SALDO : " + this . getSaldo () ) ;
12
System . out . println ( " ANIVERSRIO : " + this . diaDoAniversario ) ;
13
}
14 }
Se uma classe concreta derivada da classe Conta no possuir uma implementao do mtodo
imprimeExtratoDetalhado() ela no compilar.
1 // ESSA CLASSE NO COMPILA
2 class ContaPoupanca extends Conta {
3
4 }
Exerccios de Fixao
1
Para no confundir, feche o projeto Polimorfismo clicando com o boto direito do mouse sobre esse projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os
exerccios desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo
correspondente e siga a imagem abaixo.
www.facebook.com/k19treinamentos
111
C LASSES A BSTRATAS
112
112
www.k19.com.br
113
C LASSES A BSTRATAS
8
}
9 }
Cdigo Java 9.11: TestaConta.java
www.facebook.com/k19treinamentos
113
C LASSES A BSTRATAS
114
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
10
Exerccios Complementares
Crie um objeto da classe Funcionario e utilize os mtodos de acesso com nomes padronizados
para alterar os valores dos atributos desse objeto. Faa uma classe chamada TestaFuncionario. Por
fim, execute essa classe.
2
3
Adicione o modificador abstract na classe Funcionario. Verifique o erro de compilao na
classe TestaFuncionario.
114
Defina uma classe chamada Gerente para modelar os gerentes do banco. Considere que os
www.k19.com.br
115
C LASSES A BSTRATAS
gerentes possuem um nome de usurio e uma senha para acessar o sistema do banco. Alm disso,
considere que todo gerente um funcionrio.
Altere a classe TestaFuncionario e crie um objeto da classe Gerente no lugar do objeto da classe
Funcionario. Por fim, execute a classe TestaFuncionario.
5
8
Implemente o mtodo calculaBonificacao na classe Gerente. Considere que a bonificao
dos gerentes 20% do salrio mais 300 reais.
www.facebook.com/k19treinamentos
115
C LASSES A BSTRATAS
116
116
www.k19.com.br
CAPTULO
I NTERFACES
10
Padronizao
No dia a dia, estamos acostumados a utilizar aparelhos que dependem de energia eltrica. Esses
aparelhos possuem um plugue que deve ser conectado a uma tomada para obter a energia necessria.
Diversas empresas fabricam aparelhos eltricos com plugues. Analogamente, diversas empresas
fabricam tomadas eltricas. Suponha que cada empresa decida por conta prpria o formato dos
plugues ou das tomadas que fabricar. Teramos uma infinidade de tipos de plugues e tomadas que
tornaria a utilizao dos aparelhos eltricos uma experincia extremamente desagradvel.
Inclusive, essa falta de padro pode gerar problemas de segurana aos usurios. Os formatos dos
plugues ou das tomadas pode aumentar o risco de uma pessoa tomar um choque eltrico.
Com o intuito de facilitar a utilizao dos consumidores e aumentar a segurana dos mesmos,
o governo atravs dos rgos responsveis estabelece padres para os plugues e tomadas. Esses
padres estabelecem restries que devem ser respeitadas pelos fabricantes dos aparelhos e das tomadas.
Em diversos contextos, padronizar pode trazer grandes benefcios. Inclusive, no desenvolvimento de aplicaes. Mostraremos como a ideia de padronizao pode ser contextualizada nos conceitos de orientao a objetos.
Contratos
Num sistema orientado a objetos, os objetos interagem entre si atravs de chamadas de mtodos
www.facebook.com/k19treinamentos
117
I NTERFACES
118
(troca de mensagens). Podemos dizer que os objetos se encaixam atravs dos mtodos pblicos
assim como um plugue se encaixa em uma tomada atravs dos pinos.
Para os objetos de uma aplicao conversarem entre si mais facilmente importante padronizar o conjunto de mtodos oferecidos por eles. Assim como os plugues encaixam nas tomadas mais
facilmente graas aos padres definidos pelo governo.
Um padro definido atravs de especificaes ou contratos. Nas aplicaes orientadas a objetos, podemos criar um contrato para definir um determinado conjunto de mtodos que deve ser
implementado pelas classes que assinarem este contrato. Em orientao a objetos, um contrato
chamado de interface. Um interface composta basicamente por mtodos abstratos.
Exemplo
No sistema do banco, podemos definir uma interface (contrato) para padronizar as assinaturas
dos mtodos oferecidos pelos objetos que representam as contas do banco.
1 interface Conta {
2
void deposita ( double valor ) ;
3
void saca ( double valor ) ;
4 }
Cdigo Java 10.1: Conta.java
As classes concretas que implementam uma interface so obrigadas a possuir uma implementao para cada mtodo declarado na interface. Caso contrrio, ocorrer um erro de compilao.
118
www.k19.com.br
119
I NTERFACES
A primeira vantagem de utilizar uma interface a padronizao das assinaturas dos mtodos oferecidos por um determinado conjunto de classes. A segunda vantagem garantir que determinadas
classes implementem certos mtodos.
Polimorfismo
Se uma classe implementa uma interface, podemos aplicar a ideia do polimorfismo assim como
quando aplicamos herana. Dessa forma, outra vantagem da utilizao de interfaces o ganho do
polimorfismo.
Como exemplo, suponha que a classe ContaCorrente implemente a interface Conta. Podemos
guardar a referncia de um objeto do tipo ContaCorrente em uma varivel do tipo Conta.
1 Conta c = new ContaCorrente () ;
Cdigo Java 10.5: Polimorfismo
Alm disso, podemos passar uma varivel do tipo ContaCorrente para um mtodo que o parmetro seja do tipo Conta.
1 class GeradorDeExtrato {
2
public void geraExtrato ( Conta c ) {
3
// implementao
4
}
5 }
Cdigo Java 10.6: GeradorDeExtrato.java
O mtodo geraExtrato() pode ser utilizado para objetos criados a partir de classes que implementam direta ou indiretamente a interface Conta.
Interface e Herana
As vantagens e desvantagens entre interface e herana, provavelmente, um dos temas mais
discutido nos blogs, fruns e revistas que abordam desenvolvimento de software orientado a objetos.
Muitas vezes, os debates sobre este assunto se estendem mais do que a prpria importncia desse
www.facebook.com/k19treinamentos
119
I NTERFACES
120
tpico. Muitas pessoas se posicionam de forma radical defendendo a utilizao de interfaces ao invs
de herana em qualquer situao.
Normalmente, esses debates so direcionados na anlise do que melhor para manuteno das
aplicaes: utilizar interfaces ou aplicar herana.
A grosso modo, priorizar a utilizao de interfaces permite que alteraes pontuais em determinados trechos do cdigo fonte sejam feitas mais facilmente pois diminui as ocorrncias de efeitos
colaterais indesejados no resto da aplicao. Por outro lado, priorizar a utilizao de herana pode
diminuir a quantidade de cdigo escrito no incio do desenvolvimento de um projeto.
Algumas pessoas propem a utilizao de interfaces juntamente com composio para substituir
totalmente o uso de herana. De fato, esta uma alternativa interessante pois possibilita que um
trecho do cdigo fonte de uma aplicao possa ser alterado sem causar efeito colateral no restante
do sistema alm de permitir a reutilizao de cdigo mais facilmente.
Em Java, como no h herana mltipla, muitas vezes, interfaces so apresentadas como uma
alternativa para obter um grau maior de polimorfismo.
Por exemplo, suponha duas rvores de herana independentes.
Suponha que os gerentes e as empresas possam acessar o sistema do banco com um nome de
usurio e uma senha. Seria interessante utilizar um nico mtodo para implementar a autenticao
desses dois tipos de objetos. Mas, qual seria o tipo de parmetro deste mtodo? Lembrando que ele
deve aceitar gerentes e empresas.
1 class AutenticadorDeUsuario {
2
public boolean autentica (??? u ) {
3
// implementao
4
}
5 }
Cdigo Java 10.8: AutenticadorDeUsuario.java
www.k19.com.br
121
I NTERFACES
deveramos coloc-las na mesma rvore de herana. Mas, isso no faz sentido pois uma empresa
no um funcionrio e o gerente no cliente. Neste caso, a soluo utilizar interfaces para obter
o polimorfismo desejado.
Agora, conseguimos definir o que o mtodo autentica() deve receber como parmetro para trabalhar tanto com gerentes quanto com empresas. Ele deve receber um parmetro do tipo Usuario.
1 class AutenticadorDeUsuario {
2
public boolean autentica ( Usuario u ) {
3
// implementao
4
}
5 }
Exerccios de Fixao
1
Para no confundir, feche o projeto Abstract clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
www.facebook.com/k19treinamentos
121
I NTERFACES
122
2
Defina uma interface chamada Conta para padronizar as assinaturas dos mtodos das contas
de um banco.
122
www.k19.com.br
123
I NTERFACES
5
6
7
8
9
10
11
12
13
14
15
16 }
Crie um gerador de extratos com um mtodo que pode trabalhar com todos os tipos de conta.
www.facebook.com/k19treinamentos
123
I NTERFACES
124
Teste o gerador de extrato. Crie uma classe chamada TestaGeradorDeExtrato para isso.
124
www.k19.com.br
CAPTULO
PACOTES
11
Organizao
O cdigo fonte de uma aplicao definido em diversos arquivos. Conforme a quantidade de
arquivos cresce surge a necessidade de algum tipo de organizao para poder encontrar os arquivos
rapidamente quando for necessrio modific-los.
A ideia para organizar logicamente os arquivos de uma aplicao bem simples e as pessoas
que utilizam computadores j devem estar familiarizadas. Os arquivos so separados em pastas ou
diretrios.
O comando package
Na terminologia do Java, as pastas nas quais so organizadas as classes e interfaces de uma aplicao so chamadas de pacotes.
Para colocar uma classe ou interface em um pacote, devemos realizar dois passos:
1. Utilizar o comando package na primeira linha de cdigo do arquivo contendo a classe ou interface que desejamos colocar em um determinado pacote.
1 package sistema ;
2
3 class Conta {
4
// corpo da classe
5 }
Cdigo Java 11.1: Conta.java
2. O segundo passo salvar o arquivo dentro de uma pasta com mesmo nome do pacote definido
no cdigo fonte.
K19 / workspace / Pacotes / src / sistema$ ls
Conta . java
A declarao das classes ou interfaces deve aparecer aps a declarao de pacote caso contrrio
ocorrer um erro de compilao.
sub-pacotes
www.facebook.com/k19treinamentos
125
PACOTES
126
Podemos criar pacotes dentro de pacotes. No cdigo fonte os sub-pacotes so definidos com o
operador ..
1
2
3
4
5
6
Alm disso, devemos criar uma estrutura de pastas que reflita os sub-pacotes definidos no cdigo
fonte.
K19 / workspace / Pacotes / src / sistema / contas$ ls
Conta . java
126
www.k19.com.br
127
PACOTES
Observe que a classe ContaPoupanca utiliza o nome simples da classe Conta para acess-la.
Por outro lado, duas classes de pacotes diferentes precisam utilizar o nome completo de cada
uma delas para conversar entre si. Alm disso, a classe que ser utilizada por classes de outro
pacote deve ser pblica. O mesmo vale para interfaces. Como exemplo suponha as seguintes classes:
K19 / workspace / Pacotes / src / sistema$ ls
contas clientes
K19 / workspace / Pacotes / src / sistema$ ls contas /
Conta . java
K19 / workspace / Pacotes / src / sistema$ ls clientes /
Cliente . java
Import
Para facilitar a escrita do cdigo fonte, podemos utilizar o comando import para no ter que
repetir o nome completo de uma classe ou interface vrias vezes dentro do mesmo arquivo.
1 // Arquivo : Cliente . java
2 package sistema . clientes ;
3
4 import sistema . contas . Conta ;
5
www.facebook.com/k19treinamentos
127
PACOTES
128
6 class Cliente {
7
private Conta conta ;
8 }
Cdigo Java 11.8: Cliente.java
Conflito de nomes
A reutilizao um dos principais argumentos para utilizao do modelo orientado a objetos e da
plataforma Java. H muitas bibliotecas disponveis para utilizarmos em nossas aplicaes. Contudo,
certos cuidados com os nomes dos pacotes so necessrios para evitar conflito entre as classes e
interfaces das nossas aplicaes e as classes e interfaces das bibliotecas.
Com o intuito de resolver esse problema, h uma conveno para a definio dos nomes dos
pacotes. Essa conveno anloga aos domnios da internet.
1 package br . com . k19 . sistema . contas ;
Cdigo Java 11.9: Padro de nomenclatura de pacotes
Nveis de visibilidade
No Java, h quatro nveis de visibilidade: privado, padro, protegido e pblico. Podemos definir
os nveis privado, protegido e pblico com os modificadores private, protected e public respectivamente. Quando nenhum modificador de visibilidade utilizado o nvel padro aplicado.
Privado
O nvel privado aplicado com o modificador private.
O que pode ser privado? Atributos, construtores, mtodos, classes aninhadas ou interfaces aninhadas.
Os itens em nvel de visibilidade privado s podem ser acessados por cdigo escrito na mesma
classe na qual eles foram declarados.
Padro
O nvel padro aplicado quando nenhum modificador utilizado.
O que pode ser padro? Atributos, construtores, mtodos, classes de todos os tipos e interfaces
de todos os tipos.
Os itens em nvel de visibilidade padro s podem ser acessados por cdigo escrito em classes
do mesmo pacote da classe na qual eles foram declarados.
128
www.k19.com.br
129
PACOTES
Protegido
Pblico
Exerccios de Fixao
1
Para no confundir, feche o projeto Interfaces clicando com o boto direito do mouse sobre
esse projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo
correspondente e siga a imagem abaixo.
www.facebook.com/k19treinamentos
129
PACOTES
130
3
Faa uma classe chamada Conta para modelar as contas de um banco. Essa classe deve ser
colocada no pacote br.com.k19.banco.sistema.
130
www.k19.com.br
131
4
1
2
3
4
5
6
7
8
9
10
11
PACOTES
Retire o modificador public da classe Conta e observe o erro de compilao na classe Teste.
Depois, faa a classe Conta ser pblica novamente.
5
www.facebook.com/k19treinamentos
131
PACOTES
132
132
www.k19.com.br
CAPTULO
E XCEPTIONS
12
Como erros podem ocorrer durante a execuo de uma aplicao, devemos definir como eles
sero tratados. Tradicionalmente, cdigos de erro so utilizados para lidar com falhas na execuo
de um programa. Nesta abordagem, os mtodos devolveriam nmeros inteiros para indicar o tipo
de erro que ocorreu.
1 int deposita ( double valor ) {
2
if ( valor < 0) {
3
return 107; // cdigo de erro para valor negativo
4
} else {
5
this . saldo += valor ;
6
return 0; // sucesso
7
}
8 }
Cdigo Java 12.1: Utilizando cdigos de erro
Utilizar cdigos de erro exige uma vasta documentao dos mtodos para explicar o que cada cdigo significa. Alm disso, esta abordagem gasta o retorno do mtodo impossibilitando que outros
tipos de dados sejam devolvidos. Em outras palavras, ou utilizamos o retorno para devolver cdigos
de erro ou para devolver algo pertinente a lgica natural do mtodo. No possvel fazer as duas
coisas sem nenhum tipo de gambiarra.
1 ??? geraRelatorio () {
2
if (...) {
3
return 200; // cdigo de erro tipo1
4
} else {
5
Relatorio relatorio = ...
6
return relatorio ;
7
}
8 }
Cdigo Java 12.2: Cdigo de erro e retorno lgico
Observe que no cdigo do mtodo geraRelatorio() seria necessrio devolver dois tipos de dados incompatveis: int e referncias de objetos da classe Relatorio. Porm, no possvel definir
dois tipos distintos como retorno de um mtodo.
A linguagem Java tem uma abordagem prpria para lidar com erros de execuo. Na abordagem
do Java no so utilizados cdigos de erro ou os retornos lgicos dos mtodos.
Errors vs Exceptions
O primeiro passo para entender a abordagem do Java para lidar com os erros de execuo saber
classific-los. A classe Throwable modela todos os tipos de erros de execuo.
www.facebook.com/k19treinamentos
133
E XCEPTIONS
134
H duas subclasses de Throwable: Error e Exception. A subclasse Error define erros que no
devem ser capturados pelas aplicaes pois representam erros graves que no permitem que a execuo continue de maneira satisfatria. A subclasse Exception define erros para os quais as aplicaes normalmente tm condies de definir um tratamento.
Checked e Unchecked
As exceptions so classificadas em checked e unchecked. Para identificar o tipo de uma exception, devemos considerar a rvore de herana da classe Exception.
As classes que esto na rvore da classe Exception mas no esto na rvore da RuntimeException
so as chamadas checked exceptions. Por outro lado, as classes que esto na rvore da RuntimeException
so as chamadas unchecked exceptions.
www.k19.com.br
135
E XCEPTIONS
Capturando exceptions
Quando queremos capturar exceptions, devemos utilizar o comando try-cacth.
1 class Teste {
2
public static void main ( String [] args ) {
3
Conta c = new Conta () ;
4
5
try {
6
c . deposita (100) ;
7
} catch ( IllegalArgumentException e ) {
8
System . out . println ( " Houve um erro ao depositar " ) ;
9
}
10
}
11 }
Cdigo Java 12.5: Capturando um tipo de exceptions
Podemos encadear vrios blocos catch para capturar exceptions de classes diferentes.
1 class Teste {
2
public static void main ( String [] args ) {
3
Conta c = new Conta () ;
4
5
try {
www.facebook.com/k19treinamentos
135
E XCEPTIONS
136
6
c . deposita (100) ;
7
} catch ( IllegalArgumentException e ) {
8
System . out . println ( " Houve uma IllegalArgumentException ao depositar " ) ;
9
} catch ( SQLException e ) {
10
System . out . println ( " Houve uma SQLException ao depositar " ) ;
11
}
12
}
13 }
Cdigo Java 12.6: Capturando dois tipos de exceptions
Exerccios de Fixao
Para no confundir, feche o projeto Pacotes clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
1
136
www.k19.com.br
137
2
E XCEPTIONS
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
www.facebook.com/k19treinamentos
137
E XCEPTIONS
138
138
www.k19.com.br
CAPTULO
O BJECT
13
Polimorfismo
Aproveitando o polimorfismo gerado pela herana da classe Object, possvel criar uma classe
para armazenar objetos de qualquer tipo como se fosse um repositrio de objetos.
1 class Repositorio {
2
// codigo da classe
3 }
Cdigo Java 13.1: Repositorio.java
Um array de objetos pode ser utilizado como estrutura bsica para manter os objetos no repositrio.
1 class Repositorio {
2
private Object [] objetos = new Object [100];
3 }
Cdigo Java 13.2: Repositorio.java
Alguns mtodos podem ser criados para formar a interface do repositrio. Por exemplo, mtodos
para adicionar, retirar e pesquisar elementos.
www.facebook.com/k19treinamentos
139
O BJECT
140
1 class Repositorio {
2
private Object [] objetos = new Object [100];
3
4
public void adiciona ( Object o ) {
5
// implementacao
6
}
7
8
public void remove ( Object o ) {
9
// implementacao
10
}
11
12
public Object pega ( int posicao ) {
13
// implementacao
14
}
15 }
Cdigo Java 13.3: Repositorio.java
Com esses mtodos o repositrio teria a vantagem de armazenar objetos de qualquer tipo. Porm, na compilao, no haveria garantia sobre os tipos especficos. Em outras palavras, j que objetos de qualquer tipo podem ser armazenados no repositrio ento objetos de qualquer tipo podem
sair dele.
1 Repositorio repositorio = new Repositorio () ;
2 repositorio . adiciona ( " Rafael " ) ;
3 Object o = repositorio . pega (0) ;
Cdigo Java 13.4: Utilizando o repositrio
Por outro lado, na maioria dos casos, os programadores criam repositrios para armazenar objetos de um determinado tipo. Por exemplo, uma repositrio para armazenar somente nomes de
pessoas, ou seja, para armazenar objetos do tipo String. Nesse caso, em tempo de compilao
possvel forar o compilador a tratar os objetos como string atravs de casting de referncia.
1
2
3
4
O mtodo toString()
s vezes, necessrio trabalhar com uma descrio textual de determinados objetos. Por exemplo, suponha a seguinte classe:
1 class Conta {
2
private int numero ;
3
private double saldo ;
4
5
// GETTERS E SETTERS
6 }
Cdigo Java 13.6: Conta.java
www.k19.com.br
141
O BJECT
dessa classe.
1 class Conta {
2
private int numero ;
3
private double saldo ;
4
5
public String geraDescricao () {
6
return " Conta nmero : " + this . numero + " possui saldo igual a " + this . saldo ;
7
}
8
9
// GETTERS E SETTERS
10 }
Cdigo Java 13.7: Conta.java
A utilizao do mtodo que gera a descrio textual das contas seria mais ou menos assim:
1 Conta conta = ...
2 String descricao = conta . geraDescrica () ;
3 System . out . println ( descricao ) ;
Cdigo Java 13.8: Utilizando o mtodo geraDescricao()
Contudo, a classe Object possui um mtodo justamente com o mesmo propsito do geraDescricao()
chamado toString(). Como todas as classes derivam direta ou indiretamente da classe Object, todos os objetos possuem o mtodo toString().
A implementao padro do mtodo toString() monta uma descrio genrica baseada no
nome da classe mais especfica e no hash code dos objetos.
1 Conta conta = ...
2 String descricao = conta . toString () ;
3 System . out . println ( descricao ) ;
Cdigo Java 13.9: Utilizando o mtodo toString()
No cdigo acima, a descrio gerada pelo mtodo toString() definido na classe Object algo
semelhante string: Conta@4d5ef.
Para alterar o comportamento do mtodo toString(), basta reescrev-lo na classe Conta.
1 class Conta {
2
private int numero ;
3
private double saldo ;
4
5
public String toString () {
6
return " Conta nmero : " + this . numero + " possui saldo igual a " + this . saldo ;
7
}
8
9
// GETTERS E SETTERS
10 }
Cdigo Java 13.10: Conta.java
www.facebook.com/k19treinamentos
141
O BJECT
142
Outra vantagem em optar pelo mtodo toString() que ferramentas de desenvolvimento como
o eclipse oferecem recursos para que esse mtodo seja reescrito automaticamente.
1 class Conta {
2
private int numero ;
3
private double saldo ;
4
5
// mtodo gerado pelo eclipse
6
public String toString () {
7
return " Conta [ numero = " + numero + " , saldo = " + saldo + " ] " ;
8
}
9
10
// GETTERS E SETTERS
11 }
Cdigo Java 13.12: Conta.java
142
www.k19.com.br
143
O BJECT
O mtodo equals()
Para verificar se os valores armazenados em duas variveis de algum tipo primitivo so iguais,
deve ser utilizado o operador == . Esse operador tambm pode ser aplicado em variveis de tipos
no primitivos.
1 Conta c1 = ...
2 Conta c2 = ...
3
4 System . out . println ( c1 == c2 ) ;
Cdigo Java 13.13: Comparando com
O operador ==, aplicado variveis no primitivas, verifica se as referncias armazenadas nessas variveis apontam para o mesmo objeto na memria. Esse operador no compara o contedo
dos objetos correspondentes s referncias armazenadas nas variveis submetidas comparao.
Para comparar o contedo de objetos, necessrio utilizar mtodos. Podemos implementar um
mtodo de comparao na classe Conta.
1 class Conta {
2
private int numero ;
3
private double saldo ;
4
5
public boolean compara ( Conta outra ) {
6
return this . numero == outra . numero ;
7
}
8
9
// GETTERS E SETTERS
10 }
Cdigo Java 13.14: Conta.java
Contudo, na classe Object, j existe um mtodo com o mesmo propsito. O mtodo ao qual nos
referimos o equals(). A implementao padro do mtodo equals() na classe Object delega a
comparao ao operador ==. Dessa forma, o contedo dos objetos no comparado. Podemos
rescrever o mtodo equals() para alterar esse comportamento e passar a considerar o contedo dos
objetos na comparao.
1 class Conta {
2
private int numero ;
3
private double saldo ;
4
5
public boolean equals ( Object obj ) {
6
Conta outra = ( Conta ) obj ;
7
return this . numero == outra . numero ;
8
}
9
www.facebook.com/k19treinamentos
143
O BJECT
144
10
// GETTERS E SETTERS
11 }
Cdigo Java 13.16: Conta.java
Porm, a reescrita do mtodo equals() deve respeitar diversas regras definidas na documentao da classe Object(http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html).
Para no infringir nenhuma das regras de reescrita do mtodo equals(), podemos utilizar recursos do eclipse para gerar esse mtodo automaticamente.
1 class Conta {
2
private int numero ;
3
private double saldo ;
4
5
// mtodo gerado pelo eclipse
6
public int hashCode () {
7
final int prime = 31;
8
int result = 1;
9
result = prime * result + numero ;
10
return result ;
11
}
12
13
// mtodo gerado pelo eclipse
14
public boolean equals ( Object obj ) {
15
if ( this == obj ) {
16
return true ;
17
}
144
www.k19.com.br
145
O BJECT
18
if ( obj == null ) {
19
return false ;
20
}
21
if (!( obj instanceof Conta ) ) {
22
return false ;
23
}
24
Conta other = ( Conta ) obj ;
25
if ( numero != other . numero ) {
26
return false ;
27
}
28
return true ;
29
}
30
31
// GETTERS E SETTERS
32 }
Exerccios de Fixao
1
Para no confundir, feche o projeto Exceptions clicando com o boto direito do mouse sobre
esse projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo
correspondente e siga a imagem abaixo.
www.facebook.com/k19treinamentos
145
O BJECT
146
146
www.k19.com.br
147
O BJECT
4
5 public class TestaFuncionario {
6
public static void main ( String [] args ) {
7
Funcionario f = new Funcionario () ;
8
9
f . setNome ( " Jonas Hirata " ) ;
10
f . setSalario (3000) ;
11
12
System . out . println ( f ) ;
13
}
14 }
6
Apague o toString() implementando anteriormente. Utilize os recursos do eclipse para reescrever esse mtodo automaticamente na classe Funcionario. Selecione a classe Funcionario, digite
CTRL + 3 e pesquise por Generate toString(). Selecione a opo correspondente e siga a imagem
abaixo.
www.facebook.com/k19treinamentos
147
O BJECT
148
Crie dois objetos da classe Funcionario. Utilize o operador == e o mtodo equals() para
compar-los. Adicione uma classe chamada TestaEquals.
8
148
www.k19.com.br
149
O BJECT
15
f2 . setSalario (3000) ;
16
17
System . out . println ( f1 == f2 ) ;
18
System . out . println ( f1 . equals ( f2 ) ) ;
19
}
20 }
Cdigo Java 13.21: TestaEquals.java
Utilize os recursos do eclipse para gerar o mtodo equals() na classe Funcionario. Selecione a
classe Funcionario, digite CTRL + 3 e pesquise por Generate hashCode() and equals(). Selecione
a opo correspondente e siga a imagem abaixo.
9
10
www.facebook.com/k19treinamentos
149
O BJECT
150
150
www.k19.com.br
CAPTULO
S TRING
14
Pool de Strings
A maneira mais simples para criar ou obter um objeto da classe String definir diretamente o
seu contedo no cdigo fonte com ".
1 String nome = " Rafael Cosentino " ;
Cdigo Java 14.1: string literal
As strings criadas ou obtidas de forma literal so mantidas dentro da classe String no chamado
Pool de Strings. Dentro do Pool de Strings, no h strings repetidas, ou seja, no h dois objetos
com o mesmo contedo. Esse aspecto da linguagem Java tem por objetivo diminuir o consumo de
memria.
Para comparar o contedo de duas strings que esto dentro do Pool de Strings, podemos utilizar
o operador == ou o mtodo equals().
1
2
3
4
5
6
7
Quando criamos strings atravs dos construtores da classe String, elas no so mantidas no Pool
de Strings. Portanto, no podemos comparar o contedo delas atravs do operador ==. Nesse caso,
devemos utilizar o mtodo equals().
1 String nome1 = new String ( " Rafael Cosentino " ) ;
2 String nome2 = new String ( " Rafael Cosentino " ) ;
3
4 // imprime false
www.facebook.com/k19treinamentos
151
S TRING
152
Imutabilidade
Uma caracterstica fundamental dos objetos da classe String que eles so imutveis. Em outras
palavras, o contedo de uma string no altera.
Alguns mtodos das strings podem dar a impresso errada de que o contedo do objeto ser
alterado. Por exemplo, o mtodo toUpperCase() que utilizado para obter uma string com letras
maisculas. Esse mtodo no altera a string original, ele cria uma nova string com o contedo diferente.
1
2
3
4
5
6
1
2
3
4
5
6
Mais Sobre
Podemos alterar o contedo de qualquer objeto Java de forma invasiva utilizando reflection. No seria uma boa prtica utilizar esses mecanismos para forar modificaes
nos objetos da classe String pois os efeitos colaterais causados no restante do cdigo podem
ser drsticos.
Mtodos principais
Todos os mtodos da classe String podem ser consultados na url http://docs.oracle.com/
javase/7/docs/api/java/lang/String.html. Discutiremos aqui o funcionamento dos principais
mtodos dessa classe.
length()
O mtodo length() devolve a quantidade de caracteres de uma string.
152
www.k19.com.br
153
S TRING
toUpperCase()
O mtodo toUpperCase() utilizado para obter uma cpia de uma string com letras maisculas.
1
2
3
4
5
6
toLowerCase()
O mtodo toLowerCase() utilizado para obter uma cpia de uma string com letras minsculas.
1
2
3
4
5
6
trim()
O mtodo trim() utilizado para obter uma cpia de uma string sem os espaos em branco do
incio e do final.
1
2
3
4
5
6
";
split()
O mtodo split() divide uma string em vrias de acordo com um delimitador e devolve um
array com as strings obtidas.
1
2
3
4
5
6
7
www.facebook.com/k19treinamentos
153
S TRING
8
9
10
11
12
13
14
15
16
17
18
154
// imprime K12
System . out . println ( cursos [1]) ;
// imprime K21
System . out . println ( cursos [2]) ;
// imprime K22
System . out . println ( cursos [3]) ;
// imprime K23
System . out . println ( cursos [4]) ;
replaceAll()
O mtodo replaceAll() cria uma cpia de uma string substituindo pedaos internos por outro
contedo.
1
2
3
4
5
6
String texto = " Curso de Java da K19 , Curso de JSF da K19 " ;
String textoAlterado = texto . replaceAll ( " Curso " ," Treinamento " ) ;
// imprime Treinamento de Java da K19 , Treinamento de JSF da K19
System . out . println ( textoAlterado ) ;
Exerccios de Fixao
1
Para no confundir, feche o projeto Object clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
154
www.k19.com.br
155
S TRING
Crie uma classe para testar o Pool de Strings e a comparao com == e com equals().
www.facebook.com/k19treinamentos
155
S TRING
156
21 }
Cdigo Java 14.13: TestaPoolDeStrings.java
156
www.k19.com.br
CAPTULO
E NTRADA E S ADA
15
Quando falamos em entrada e sada, estamos nos referindo a qualquer troca de informao entre
uma aplicao e o seu exterior.
A leitura do que o usurio digita no teclado, o contedo obtido de um arquivo ou os dados recebidos pela rede so exemplos de entrada de dados. A impresso de mensagens no console, a escrita
de texto em um arquivo ou envio de dados pela rede so exemplos de sada de dados.
A plataforma Java oferece diversas classes e interfaces para facilitar o processo de entrada e sada.
Byte a Byte
Em determinadas situaes, necessrio que uma aplicao faa entrada e sada byte a byte. As
classes da plataforma Java responsveis pela leitura e escrita byte a byte so InputStream e OutputStream
respectivamente. Essas duas classes esto no pacote java.io.
Veja um exemplo de leitura do teclado:
1
2
3
4
5
6
7
8
O fluxo de entrada associado ao teclado representado pelo objeto referenciado pelo atributo
esttico System.in. O mtodo read() faz a leitura do prximo byte da entrada.
Veja um exemplo de escrita no console:
1
2
3
4
5
6
O fluxo de sada associado ao console representado pelo objeto referenciado pelo atributo esttico System.out. O mtodo write() armazena um byte(um valor entre 0 e 255) no buffer de sada.
O mtodo flush() libera o contedo do buffer para a sada.
www.facebook.com/k19treinamentos
157
E NTRADA E S ADA
158
A classe InputStream genrica e modela um fluxo de entrada sem uma fonte especfica definida. Diversas classes herdam direta ou indiretamente da classe InputStream para especificar um
determinado tipo de fonte de dados.
Eis algumas classes que derivam da classe InputStream:
AudioInputStream
FileInputStream
ObjectInputStream
A classe OutputStream genrica e modela um fluxo de sada sem um destino especfico definido. Diversas classes herdam direta ou indiretamente da classe OutputStream para especificar um
determinado tipo de destino de dados.
Eis algumas classes que derivam da classe OutputStream:
ByteArrayOutputStream
FileOutputStream
ObjectOutputStream
Scanner
Nem sempre necessrio fazer entrada byte a byte. Nestes casos, normalmente, mais simples
utilizar a classe Scanner do pacote java.util do Java. Essa classe possui mtodos mais sofisticados
para obter os dados de uma entrada.
Veja um exemplo de leitura do teclado com a classe Scanner:
1
2
3
4
5
6
7
PrintStream
158
www.k19.com.br
159
E NTRADA E S ADA
Nem sempre necessrio fazer sada byte a byte. Nestes casos, normalmente, mais simples utilizar a classe PrintStream do pacote java.io do Java. Essa classe possui mtodos mais sofisticados
para enviar dados para uma sada.
Veja um exemplo de escrita no console com a classe PrintStream:
1 OutputStream console = System . out ;
2 PrintStream printStream = new PrintStream ( console ) ;
3
4 printStream . println ( " Curso de Java e Orientao da K19 " ) ;
Exerccios de Fixao
1
Para no confundir, feche o projeto String clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
www.facebook.com/k19treinamentos
159
E NTRADA E S ADA
Crie um teste para recuperar e exibir no Console o contedo digitado pelo usurio no teclado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
160
160
www.k19.com.br
161
E NTRADA E S ADA
OBS: Para finalizar o fluxo de entrado do teclado digite CTRL+D no Linux ou CTRL+Z no Windows.
Crie um teste para recuperar e exibir no Console o contedo de um arquivo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
java . io . FileInputStream ;
java . io . IOException ;
java . io . InputStream ;
java . util . Scanner ;
OBS: O arquivo entrada.txt deve ser criado no diretrio raiz do projeto IO.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
OBS: O projeto IO deve ser atualizado para que o arquivo saida.txt seja mostrado no eclipse.
Exerccios Complementares
www.facebook.com/k19treinamentos
161
E NTRADA E S ADA
162
Crie um teste que faa a leitura do contedo de um arquivo e grave em outro arquivo.
162
www.k19.com.br
CAPTULO
C OLLECTIONS
16
Quando uma aplicao precisa manipular uma quantidade grande de dados, ela deve utilizar
alguma estrutura de dados. Podemos dizer que a estrutura de dados mais bsica do Java so os
arrays.
Muitas vezes, trabalhar diretamente com arrays no simples dado as diversas limitaes que
eles possuem. A limitao principal a capacidade fixa, um array no pode ser redimensionado. Se
todas as posies de um array estiverem ocupadas no podemos adicionar mais elementos. Normalmente, criamos um outro array com maior capacidade e transferimos os elementos do array antigo
para o novo.
Alm disso, adicionar ou remover elementos provavelmente gera a necessidade de deslocar parte
do contedo do array.
As dificuldades do trabalho com array podem ser superadas com estruturas de dados mais sofisticadas. Na biblioteca do Java, h diversas estruturas de dados que facilitam o trabalho do desenvolvedor.
Listas
As listas so estruturas de dados de armazenamento sequencial assim como os arrays. Mas, diferentemente dos arrays, as listas no possuem capacidade fixa o que facilita bastante o trabalho.
List a interface Java que define os mtodos que uma lista deve implementar. As principais implementaes da interface List so: ArrayList, LinkedList e Vector. Cada implementao possui
suas caractersticas sendo apropriadas para contextos diferentes.
1 ArrayList arrayList = new ArrayList () ;
Cdigo Java 16.1: ArrayList
Podemos aplicar o polimorfismo e referenciar objetos criados a partir das classes: ArrayList,
www.facebook.com/k19treinamentos
163
C OLLECTIONS
164
Mtodo: add(Object)
O mtodo add(Object) adiciona uma referncia no final da lista e aceita referncias de qualquer
tipo.
1
2
3
4
5
6
Mtodo: size()
O mtodo size() informa a quantidade de elementos armazenado na lista.
1
2
3
4
5
6
7
8
9
Mtodo: clear()
O mtodo clear() remove todos os elementos da lista.
164
www.k19.com.br
165
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C OLLECTIONS
Mtodo: contains(Object)
Para verificar se um elemento est contido em uma lista podemos utilizar o mtodo contains(Object)
1
2
3
4
5
6
7
8
9
10
Mtodo: remove(Object)
Podemos retirar elementos de uma lista atravs do mtodo remove(Object). Este mtodo remove a primeira ocorrncia do elemento passado como parmetro.
1
2
3
4
5
6
7
8
9
10
11
Mtodo: remove(int)
Outra forma de retirar elementos de uma lista atravs do mtodo remove(int).
1 List list = ...
2
3 list . add ( " Jonas Hirata " ) ;
4
5 // x = true
www.facebook.com/k19treinamentos
165
C OLLECTIONS
6
7
8
9
10
11
166
Mtodo: get(int)
Para recuperar um elemento de uma determinada posio de uma lista podemos utilizar o mtodo get(int).
1
2
3
4
5
6
Mtodo: indexOf(Object)
Para descobrir o ndice da primeira ocorrncia de um determinado elemento podemos utilizar o
mtodo indexOf(Object).
1
2
3
4
5
6
Benchmarking
As trs principais implementaes da interface List (ArrayList, LinkedList e Vector) possuem
desempenho diferentes para cada operao. O desenvolvedor deve escolher a implementao de
acordo com a sua necessidade.
Operao
Adicionar ou Remover do final da lista
Adicionar ou Remover do comeo da
lista
Acessar elementos pela posio
ArrayList
LinkedList
,
/
,
,
Os mtodos da classe Vector possui desempenho um pouco pior do que os da classe ArrayList.
Porm, a classe Vector implementa lgica de sincronizao de threads.
Exerccios de Fixao
166
www.k19.com.br
167
C OLLECTIONS
Para no confundir, feche o projeto IO clicando com o boto direito do mouse sobre esse projeto
e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios desse
captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente
e siga a imagem abaixo.
1
1
2
3
4
5
6
7
8
9
10
11
12
13
www.facebook.com/k19treinamentos
167
C OLLECTIONS
168
14
15
tempo = TestaAdicionaNoFinal . adicionaNoFinal ( linkedList ) ;
16
System . out . println ( " LinkedList : " + tempo + " ms " ) ;
17
18
}
19
20
public static long adicionaNoFinal ( List lista ) {
21
long inicio = System . currentTimeMillis () ;
22
23
int size = 100000;
24
25
for ( int i = 0; i < size ; i ++) {
26
lista . add ( i ) ;
27
}
28
29
long fim = System . currentTimeMillis () ;
30
31
return fim - inicio ;
32
}
33 }
Cdigo Java 16.16: TestaAdicionaNoFinal.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1
2
3
4
5
6
7
8
9
168
www.k19.com.br
169
C OLLECTIONS
10
LinkedList linkedList = new LinkedList () ;
11
12
long tempo = TestaGet . get ( arrayList ) ;
13
System . out . println ( " ArrayList : " + tempo + " ms " ) ;
14
15
tempo = TestaGet . get ( linkedList ) ;
16
System . out . println ( " LinkedList : " + tempo + " ms " ) ;
17
18
}
19
20
public static long get ( List lista ) {
21
22
int size = 100000;
23
24
for ( int i = 0; i < size ; i ++) {
25
lista . add ( i ) ;
26
}
27
28
long inicio = System . currentTimeMillis () ;
29
30
for ( int i = 0; i < size ; i ++) {
31
lista . get ( i ) ;
32
}
33
34
long fim = System . currentTimeMillis () ;
35
36
return fim - inicio ;
37
}
38 }
Conjuntos
Os conjuntos diferem das listas pois no permitem elementos repetidos e no possuem ordem.
Como os conjuntos no possuem ordem as operaes baseadas em ndice que existem nas listas no
aparecem nos conjuntos.
Set a interface Java que define os mtodos que um conjunto deve implementar. As principais
implementaes da interface Set so: HashSet e TreeSet. Cada implementao possui suas caractersticas sendo apropriadas para contextos diferentes.
Colees
H semelhanas conceituais entre os conjuntos e as listas por isso existe uma super interface
chamada Collection para as interfaces List e Set.
www.facebook.com/k19treinamentos
169
C OLLECTIONS
170
Exerccios de Fixao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
170
www.k19.com.br
171
C OLLECTIONS
35
36
return fim - inicio ;
37
}
38 }
Cdigo Java 16.19: TestaContains.java
Lao foreach
As listas podem ser iteradas com um lao for tradicional.
1 List lista = ...
2
3 for ( int i = 0; i < lista . size () ; i ++) {
4
Object x = lista . get ( i ) ;
5 }
Cdigo Java 16.20: for tradicional
Porm, como os conjuntos no so baseados em ndice eles no podem ser iterados com um
lao for tradicional. Alm disso, mesmo para as listas o for tradicional nem sempre eficiente pois
o mtodo get() para determinadas implementaes de lista lento (ex: LinkedList).
A maneira mais eficiente para percorrer uma coleo utilizar um lao foreach.
1 Collection colecao = ...
2
3 for ( Object x : colecao ) {
4
5 }
Cdigo Java 16.21: foreach
Generics
As colees armazenam referncias de qualquer tipo. Dessa forma, quando recuperamos um
elemento de uma coleo temos que trabalhar com referncias do tipo Object.
1
2
3
4
5
6
7
Porm, normalmente, precisamos tratar os objetos de forma especfica pois queremos ter acesso
aos mtodos especficos desses objetos. Nesses casos, devemos fazer casting de referncias.
1 Collection colecao = ...
2
3 colecao . add ( " Rafael Cosentino " ) ;
4
www.facebook.com/k19treinamentos
171
C OLLECTIONS
172
O casting de referncia arriscado pois em tempo de compilao no temos garantia que ele est
correto. Dessa forma, corremos o risco de obter um erro de execuo.
Para ter certeza da tipagem dos objetos em tempo de compilao, devemos aplicar o recurso do
Generics. Com este recurso podemos determinar o tipo de objeto que queremos armazenar em uma
coleo no momento em que ela criada. A partir da, o compilador no permitir que elementos
no compatveis com o tipo escolhido sejam adicionados na coleo. Isso garante o tipo do elemento
no momento em que ele recuperado da coleo e elimina a necessidade de casting.
1
2
3
4
5
6
7
Collection < String > colecao = new HashSet < String >() ;
colecao . add ( " Rafael Cosentino " ) ;
for ( String x : colecao ) {
System . out . println ( x . toUpperCase () ) ;
}
Cdigo Java 16.24: Coleo com Generics
Exerccios de Fixao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
172
www.k19.com.br
173
C OLLECTIONS
30
long fim = System . currentTimeMillis () ;
31
32
return fim - inicio ;
33
}
34
35
public static long foreach ( List < Integer > lista ) {
36
long inicio = System . currentTimeMillis () ;
37
38
for ( int x : lista ) {
39
40
}
41
42
long fim = System . currentTimeMillis () ;
43
44
return fim - inicio ;
45
}
46 }
Cdigo Java 16.25: TestaForeach.java
www.facebook.com/k19treinamentos
173
C OLLECTIONS
174
174
www.k19.com.br
APNDICE
D OCUMENTAO
175
D OCUMENTAO
176
Podemos gerar uma documentao que segue essa estrutura padro do Java para as nossas classes e interfaces.
A ferramenta javadoc
Com o intuito de padronizar a estrutura e o visual das documentaes das bibliotecas Java, no
JDK (Java Development Kit), h uma ferramenta chamada javadoc que extrai comentrios especias
contidos no cdigo fonte Java e gera a documentao das classes e interfaces.
Comentrios javadoc
Os comentrios extrados do cdigo fonte pela ferramenta javadoc devem iniciar com /**.
1 /* *
2 *
3 * Comentrio javadoc
4 *
5 */
Cdigo Java A.1: Comentrio javadoc
176
www.k19.com.br
177
D OCUMENTAO
5 */
6 package br . com . k19 . contas ;
Cdigo Java A.2: package-info.java
Podemos definir os autores de uma classe ou interface, atravs da tag @author. A verso pode
ser declarada com a tag @version.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Documentando um atributo
Para documentar um atributo, basta adicionar um comentrio javadoc imediatamente acima da
declarao do atributo que desejamos documentar.
1 /* *
2 *
3 * Documentacao do atributo numero
4 *
5 */
6 private int numero ;
Cdigo Java A.5: Documentando um atributo
www.facebook.com/k19treinamentos
177
D OCUMENTAO
178
Documentando um construtor
Para documentar um construtor, basta adicionar um comentrio javadoc imediatamente acima
da declarao do construtor que desejamos documentar.
Os parmetros de um construtor podem ser documentados atravs da tag @param. As exceptions que podem ser lanadas por um construtor podem ser documentadas atravs da tag @throws.
Essas duas tags podem se repetir no comentrio javadoc caso o construtor tenha mais do que um
parmetro ou lance mais do que uma exception.
1 /* *
2 *
3 * Documentacao do construtor
4 *
5 * @param numero
6 *
documentao do parmetro numero
7 *
8 * @throws IllegalArgumentException
9 *
documentao da situao que gera a exception IllegalArgumentException
10 */
11 public Conta ( int numero ) {
12
if ( numero < 0) {
13
throw new IllegalArgumentException ( " nmero negativo " ) ;
14
}
15
this . numero = numero
16 }
Cdigo Java A.6: Documentando um construtor
Documentando um mtodo
Para documentar um mtodo, basta adicionar um comentrio javadoc imediatamente acima da
declarao do mtodo que desejamos documentar.
Os parmetros de um mtodo podem ser documentados atravs da tag @param. As exceptions
que podem ser lanadas por um mtodo podem ser documentadas atravs da tag @throws. O valor
de retorno de um mtodo pode ser documentado atravs da tag @return.
1 /* *
2 *
3 * Documentacao do mtodo calculaTaxaDeEmprestimo
4 *
5 * @param valor
6 *
documentao do parmetro valor
7 *
8 * @throws IllegalArgumentException
9 *
documentao da situao que gera a exception IllegalArgumentException
10 *
11 * @return documentao do valor de retorno no mtodo
12 */
13 public double calculaTaxaDeEmprestimo ( double valor ) {
14
// corpo do mtodo
15 }
Cdigo Java A.7: Documentando um mtodo
Exerccios de Fixao
178
www.k19.com.br
179
D OCUMENTAO
Para no confundir, feche o projeto Collections clicando com o boto direito do mouse sobre
esse projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo
correspondente e siga a imagem abaixo.
1
1 /* *
2 * Documentao do pacote br . com . k19 . banco . contas
3 */
4 package br . com . k19 . banco . contas ;
Cdigo Java A.8: package-info.java
www.facebook.com/k19treinamentos
179
D OCUMENTAO
180
1 /* *
2 * Documentao do pacote br . com . k19 . banco . funcionarios
3 */
4 package br . com . k19 . banco . funcionarios ;
Cdigo Java A.9: package-info.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
180
Gere a documentao do projeto. Digite CTRL + 3 e pesquise por generate javadoc. Selecione
www.k19.com.br
181
D OCUMENTAO
www.facebook.com/k19treinamentos
181
D OCUMENTAO
182
182
www.k19.com.br
APNDICE
S WING
A plataforma Java oferece recursos sofisticados para construo de interfaces grficas de usurio
GUI. Esses recursos fazem parte do framework Java Foundation Classes (JFC). Eis uma viso
geral do JFC:
Java Web Start: Permite que aplicaes Java sejam facilmente implantadas nas mquinas dos usurios.
Java Plug-In: Permite que applets executem dentro dos principais navegadores.
Java 2D: Possibilita a criao de imagens e grficos 2D.
Java 3D: Possibilita a manipulao de objetos 3D.
Java Sound: Disponibiliza a manipulao de sons para as aplicaes Java.
AWT (Abstract Window Toolkit): Conjunto bsico de classes e interfaces que definem os componentes de uma janela desktop. AWT a base para Java Swing API.
Swing: Conjunto sofisticado de classes e interfaces que definem os componentes visuais e servios
necessrios para construir uma interface grfica de usurio.
Componentes
Os itens que aparecem em uma interface grfica de usurio (janelas, caixas de texto, botes, listas, caixas de seleo, entre outros) so chamados de componentes. Alguns componentes podem ser
colocados dentro de outros componentes, por exemplo, uma caixa de texto dentro de uma janela.
O primeiro passo para construir uma interface grfica de usurio conhecer os principais componentes do Java Swing API.
JFrame
A classe JFrame define janelas com ttulo, borda e alguns itens definidos pelo sistema operacional
como boto para minimizar ou maximizar.
1 JFrame frame = new JFrame ( " K19 - Java OO " ) ;
2 frame . setSize (300 , 200) ;
3 frame . setVisible ( true ) ;
Cdigo Java B.1: Criando uma Janela
www.facebook.com/k19treinamentos
183
S WING
184
Por padro, o visual das janelas utiliza o estilo definido pelo sistema operacional. Mas, podemos
alterar esse comportamento padro.
JPanel
A classe JPanel define um componente que basicamente utilizado para agrupar nas janelas
outros componentes como caixas de texto, botes, listas, entre outros.
Normalmente, criamos um objeto da classe JPanel e associamos a um objeto da classe JFrame
para agrupar todo o contedo da janela.
1 JFrame frame = new JFrame ( " K19 - Java OO " ) ;
2
3 JPanel panel = new JPanel () ;
4
5 frame . setContentPane ( panel ) ;
Cdigo Java B.3: JPanel
JTextField e JLabel
A classe JTextField define os campos de texto que podem ser preenchidos pelo usurio. A classe
JLabel define rtulos que podem ser utilizados por exemplo em caixas de texto.
1
2
3
4
5
6
7
184
www.k19.com.br
185
8
9
10
11
12
13
14
15
16
S WING
JTextArea
Para textos maiores podemos aplicar o componente definido pela classe JTextArea.
1 JTextArea textArea = new JTextArea (10 , 20) ;
Cdigo Java B.5: JTextArea
JPasswordField
Em formulrios que necessitam de caixa de texto para digitar senhas, podemos aplicar o componente definido pela classe JPasswordField. O contedo digitado na caixa de texto gerado pelo
componente da classe JPasswordField no apresentado ao usurio.
1 JPasswordField passwordField = new JPasswordField (20) ;
Cdigo Java B.6: JPasswordField
JButton
Os botes que permitem que os usurios indiquem quais aes ele deseja que a aplicao execute
podem ser criados atravs do componente definido pela classe JButton.
www.facebook.com/k19treinamentos
185
S WING
186
JCheckBox
Podemos criar formulrios com checkboxs utilizando o componente da classe JCheckBox.
1 JCheckBox checkBox1 = new JCheckBox ( " Rafael Cosentino " ) ;
2
3 JCheckBox checkBox2 = new JCheckBox ( " Jonas Hirata " ) ;
4
5 JCheckBox checkBox3 = new JCheckBox ( " Marcelo Martins " ) ;
Cdigo Java B.8: JCheckBox
JComboBox
Podemos criar formulrios com comboboxs utilizando o componente da classe JComboBox.
1
2
3
4
5
6
String []
items [0]
items [1]
items [2]
Layout Manager
186
www.k19.com.br
187
S WING
Muitas pessoas consideram que uma das tarefas mais complicadas quando se utiliza a Java Swing
API o posicionamento e o tamanho dos componentes. Posicionamento e tamanho dos componentes Java Swing so controlados por Layout Managers.
Um Layout Manager um objeto Java associado a um componente Java Swing que na maioria
dos casos um componente de background como uma janela ou um painel. Um Layout Manager
controla os componentes que esto dentro do componente ao qual ele est associado.
Os quatro principais Layout Managers do Java Swing so:
FlowLayout: Esse Layout Manager arranja os componentes da esquerda para direita e quando o
tamanho horizontal no suficiente ele pula para a prxima linha. O FlowLayout no altera
o tamanho preferencial dos componentes. O FlowLayout o Layout Manager padro de um
JPanel.
BoxLayout: Esse Layout Manager arranja os componentes de cima para baixo quebrando linha
a cada componente adicionado. O BoxLayout no altera o tamanho preferencial dos componentes.
GridLayout: Esse Layout Manager divide a rea de um componente de background em clulas semelhantemente a uma tabela. As clulas possuem o mesmo tamanho.
www.facebook.com/k19treinamentos
187
S WING
188
Exemplo
Vamos criar um listener para executar quando o usurio clicar em um boto. O primeiro passo
definir uma classe que implemente ActionListener.
1 class MeuListener implements ActionListener {
2
public void actionPerformed ( ActionEvent e ) {
3
JButton button = ( JButton ) e . getSource () ;
4
button . setText ( " clicado " ) ;
5
}
6 }
Cdigo Java B.10: MeuListener.java
O mtodo actionPerformed() dever ser executado quando algum boto for clicado pelo usurio. Perceba que este mtodo recebe um referncia de um objeto da classe ActionEvent que representa o evento que ocorreu. Atravs do objeto que representa o evento do clique do usurio em
algum boto podemos recuperar a fonte do evento que no caso o prprio boto com o mtodo
getSource() e alterar alguma caracterstica da fonte.
O segundo passo associar esse listener aos botes desejados.
1 JButton button1 = new JButton ( " ACAO1 " ) ;
2 JButton button2 = new JButton ( " ACAO2 " ) ;
3
188
www.k19.com.br
189
S WING
Exerccios de Fixao
Para no confundir, feche o projeto Documentacao clicando com o boto direito do mouse
sobre esse projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os
exerccios desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo
correspondente e siga a imagem abaixo.
1
www.facebook.com/k19treinamentos
189
S WING
190
Crie uma tela de login com caixas de texto e rtulos para o nome de usurio e senha e um boto
para logar.
2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Altere o Layout Manager do painel utilizado na tela de login para GridLayout adicionando a
linha a seguir logo aps a criao do JPanel.
4
Execute a classe Teste. Depois, tente redimensionar a tela para observar o comportamento.
5
Observando a tela obtida no exerccio anterior, verificamos que o boto colocado na primeira
coluna do grid gerado pelo GridLayout. Tente fazer o boto aparecer na segunda coluna.
190
www.k19.com.br
APNDICE
E MPACOTAMENTO
Para distribuir uma aplicao ou biblioteca Java, devemos utilizar a ferramenta jar (Java Archive
Tool) para empocatar o cdigo compilado. Essa ferramenta faz parte do JDK (Java Development Kit).
O empacotamento gera um arquivo com a extenso .jar. Esse arquivo pode ser adicionado no
classpath de uma aplicao.
Exerccios de Fixao
Para no confundir, feche o projeto Swing clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
1
www.facebook.com/k19treinamentos
191
E MPACOTAMENTO
192
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
1
2
3
4
5
6
7
8
9
10
11
12
192
www.k19.com.br
193
E MPACOTAMENTO
www.facebook.com/k19treinamentos
193
E MPACOTAMENTO
194
194
www.k19.com.br
APNDICE
T HREADS
Se pensarmos nos programas que utilizamos comumente no dia a dia, conseguiremos chegar
a seguinte concluso: um programa executa um conjunto de tarefas relativamente independentes
entre si. Por exemplo, um navegador pode baixar vrios arquivos diferentes alm de permitir a navegao. Um software de visualizao de vdeos alm de reproduzir imagens tambm reproduzir
sons.
Se pensarmos em sistemas corporativos, tambm chegamos na mesma concluso: um sistema
corporativo executa um conjunto de tarefas relativamente independentes entre si. Por exemplo, dois
ou mais usurios acessando o mesmo sistema para fazer coisas diferentes.
J que um programa ou um sistema corporativo executa tarefas relativamente independentes entre si podemos pensar em execut-las simultaneamente. A primeira grande limitao para executar
tarefas simultaneamente a quantidade de unidades de processamento (cpus) disponveis.
Em geral, a regra para saber quantas tarefas podemos executar simultaneamente bem simples:
se temos N unidades de processamento podemos executar no mximo N tarefas. Uma exceo a
essa regra ocorre quando a tecnologia hyperthreading aplicada. Essa tecnologia permite o aproveitamento do tempo ocioso de uma cpu.
Geralmente, a quantidade de tarefas que desejamos executar maior do que a quantidades de
cpus. Supondo que as tarefas sejam executadas sem interrupo do comeo at o fim ento com alta
probabilidade teramos constantemente um cenrio com todas as cpus ocupadas com tarefas grandes e demoradas e diversas tarefas menores que poderiam ser executadas rapidamente esperando
em uma fila. Esse cenrio no adequado para sistema com alta interatividade com usurios pois
diminui a sua responsividade (o efeito de uma ao do usurio demora).
Para aumentar a responsividade das aplicaes, o sistema operacional faz um revezamento das
tarefas que precisam executar. Isso evita que tarefas demoradas travem a utilizao das cpus tornando a interatividade mais satisfatria.
O trabalho do desenvolvedor definir quais so as tarefas que uma aplicao deve realizar e
determinar quando elas devem executar.
195
T HREADS
196
Executando Tarefas
As tarefas so executadas dentro de objetos da classe Thread. Para cada tarefa que desejamos
executar, devemos criar um objeto da classe Thread e associ-lo ao objeto que define a tarefa.
1
2
3
4
5
6
7
Depois de associar uma tarefa (objeto de uma classe que implementa Runnable) a um objeto da
classe Thread, devemos disparar a execuo da thread atravs do mtodo start().
1 TarefaImprimeOi tarefa = new TarefaImprimeOi () ;
2 Thread thread = new Thread ( tarefa ) ;
3 thread . start () ;
Cdigo Java D.4: Executando uma thread
Podemos disparar diversas threads e elas podero ser executadas simultaneamente de acordo
com o revezamento que a mquina virtual e o sistema operacional aplicarem.
Exerccios de Fixao
Para no confundir, feche o projeto Empacotamento clicando com o boto direito do mouse
sobre esse projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os
1
196
www.k19.com.br
197
T HREADS
exerccios desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo
correspondente e siga a imagem abaixo.
www.facebook.com/k19treinamentos
197
T HREADS
198
sleep()
Durante a execuo de uma thread, se o mtodo sleep() for chamado a thread ficar sem executar pelo menos durante a quantidade de tempo passada como parmetro para este mtodo.
1 // Faz a thread corrente dormir por 3 segundos
2 Thread . sleep (3000) ;
Cdigo Java D.7: Sleep
InterruptedException
Uma thread que est dormindo pode ser interrompida por outra thread. Quando isso ocorrer,
a thread que est dormindo recebe uma InterruptedException.
1 try {
2
Thread . sleep (3000) ;
3 } catch ( InterruptedException e ) {
4
198
www.k19.com.br
199
T HREADS
5 }
Cdigo Java D.8: Sleep
join()
Uma thread pode pedir para esperar o trmino de outra thread para continuar a execuo atravs do mtodo join(). Esse mtodo tambm pode lanar uma InterruptedException.
1
2
3
4
5
6
7
8
9
Exerccios de Fixao
4
Altere a classe TarefaExibeMensagens do projeto Thread, adicionando uma chamada ao mtodo sleep().
www.facebook.com/k19treinamentos
199
T HREADS
200
200
www.k19.com.br
APNDICE
S OCKET
Os computadores ganham muito mais importncia quando conectados entre si para trocar informaes. A troca de dados entre computadores de uma mesma rede realizada atravs de sockets.
Um socket permite que um computador receba ou envie dados para outros computadores da mesma
rede.
Socket
A classe Socket define o funcionamento dos sockets em Java.
1 Socket socket = new Socket ( " 184.72.247.119 " , 1000) ;
Cdigo Java E.1: Abrindo um socket
Um dos construtores da classe Socket recebe o ip e a porta da mquina que queremos nos
conectar. Aps a conexo atravs do socket ser estabelecida, podemos criar um objeto da classe
PrintStream e outro da classe Scanner associados ao socket para facilitar o envio e o recebimento
dados respectivamente.
1 Socket socket = new Socket ( " 184.72.247.119 " , 1000) ;
2
3 PrintStream saida = new PrintStream ( socket . getOutputStream () ) ;
4
5 Scanner entrada = new Scanner ( socket . getInputStream () ) ;
Cdigo Java E.2: Associando scanners e printstreams a sockets
ServerSocket
Um server socket um tipo especial de socket. Ele deve ser utilizado quando desejamos que
uma aplicao seja capaz de aguardar que outras aplicaes possivelmente em outras mquinas se
conectem a ela.
A classe ServerSocket define o funcionamento de um server socket.
1 ServerSocket severSocket = new ServerSocket (1000) ;
2
3 Socket socket = serverSocket . accept () ;
Cdigo Java E.3: Aguardando uma conexo
www.facebook.com/k19treinamentos
201
S OCKET
202
Um dos construtores da classe ServerSocket recebe a porta que ser utilizada pelas aplicaes
que querem estabelecer uma conexo com a aplicao do server socket.
O mtodo accept() espera alguma aplicao se conectar na porta do server socket. Quando
isso acontecer, o mtodo accept() cria um novo socket em outra porta associado aplicao que se
conectou para realizar a troca de dados e liberar a porta do server socket para outras aplicaes que
desejem se conectar.
Se uma aplicao deseja permitir que diversas aplicao se conectem a ela ento necessrio
chamar vrias vezes o mtodo accept(). Este mtodo pode ser colocado em um lao.
1 ServerSocket severSocket = new ServerSocket (1000) ;
2
3 while ( true ) {
4
Socket socket = serverSocket . accept () ;
5
6 }
Cada iterao do lao acima estabelece uma conexo nova com uma aplicao cliente.
Exerccios de Fixao
1
Para no confundir, feche o projeto Thread clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
202
www.k19.com.br
203
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
S OCKET
java . io . IOException ;
java . io . PrintStream ;
java . net . ServerSocket ;
java . net . Socket ;
www.facebook.com/k19treinamentos
203
S OCKET
204
21
}
22 }
Cdigo Java E.5: Servidor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Abra um terminal, entre na pasta bin do projeto Sockets e execute a classe Servidor.
K19 / Rafael / workspace / Socket / bin$ java br . com . k19 . testes . Servidor
Abra outro terminal, entre na pasta bin do projeto Sockets e execute a classe Cliente.
K19 / Rafael / workspace / Socket / bin$ java br . com . k19 . testes . Servidor
Um cliente chegou !
K19 / Rafael / workspace / Socket / bin$
K19 / Rafael / workspace / Socket / bin$ java br . com . k19 . testes . Cliente
Voc se conectou ao servidor da K19 !
K19 / Rafael / workspace / Socket / bin$
204
www.k19.com.br
APNDICE
C HAT K19
Arquitetura do Sistema
O sistema de chat da K19 dividido em aplicao servidora e aplicao cliente. A aplicao servidora no possuir interface grfica e sua principal tarefa distribuir as mensagens enviadas pelos
usurios. A aplicao cliente possuir interface grfica que permita que um usurio envie e receba
mensagens.
Criaremos neste captulo um esqueleto de cada uma das principais classes do sistema de chat da
K19.
Aplicao servidora
Registrador
Na aplicao servidora, um objeto registrador deve esperar novos usurios do chat da K19 e realizar todo processo de registro de novos usurios quando algum chegar.
1 public class Registrador {
2
public void aguardaUsuario () {
3
4
}
5 }
Cdigo Java F.1: Registrador.java
Receptor
Para cada usurio cadastrado no chat da K19 deve ser criado um objeto da classe Receptor. A
tarefa de um objeto da classe Receptor aguardar as mensagens enviadas pelo usurio correspondente.
1 public class Receptor {
2
public void aguardaMensagens () {
3
4
}
5 }
Cdigo Java F.2: Receptor
Emissor
Para cada usurio cadastrado no chat da K19 deve ser criado um objeto da classe Emissor. A
tarefa de um objeto da classe Emissor enviar as mensagens do chat para o usurio correspondente.
www.facebook.com/k19treinamentos
205
C HAT K19
206
Distribuidor
Na aplicao servidora, deve existir um objeto da classe Distribuidor que tem como tarefa receber as mensagens dos receptores e repass-las para os emissores.
1 public class Distribuidor {
2
public void distribuiMensagem ( String mensagem ) {
3
4
}
5 }
Cdigo Java F.4: Distribuidor.java
Aplicao cliente
EmissorDeMensagem
Na aplicao cliente, deve existir um objeto da classe EmissorDeMensagem que envia as mensagens digitadas pelo usurio para a aplicao servidora.
1 public class EmissorDeMensagem {
2
public void enviaMensagem ( String mensagem ) {
3
4
}
5 }
Cdigo Java F.5: EmissorDeMensagem.java
ReceptorDeMensagem
Na aplicao cliente, deve existir um objeto da classe ReceptorDeMensagem que aguarda as mensagens enviadas pela aplicao servidora e as apresenta par o usurio.
1 public class ReceptorDeMensagem {
2
public void aguardaMensagem () {
3
4
}
5 }
Cdigo Java F.6: ReceptorDeMensagem.java
Exerccios de Fixao
206
www.k19.com.br
207
C HAT K19
Para no confundir, feche o projeto Socket clicando com o boto direito do mouse sobre esse
projeto e selecionando a opo Close Project. Em seguida, crie um novo projeto para os exerccios
desse captulo. Digite CTRL + 3 e pesquise por Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
1
www.facebook.com/k19treinamentos
207
C HAT K19
208
14
this . saida . println ( mensagem ) ;
15
}
16 }
Cdigo Java F.7: Emissor.java
Cada emissor possui uma sada de dados relacionada a um cliente conectado ao chat. Para criao de um emissor, a sada deve ser passada como parmetro atravs do construtor.
Quando alguma mensagem de algum cliente conectado ao chat chegar no servidor, o distribuidor chamar o mtodo envia() passando a mensagem para o emissor envi-la ao cliente correspondente.
Crie uma classe para definir o distribuidor de mensagens.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
O distribuidor possui uma coleo de emissores, um emissor para cada cliente conectado.
Quando um novo cliente se conecta ao chat, o mtodo adicionaEmissor() permite que um novo
emissor seja adicionada na coleo do distribuidor.
Quando algum cliente envia uma mensagem, o mtodo distribuiMensagem() permite que a
mesma seja enviada para todos os clientes conectados.
208
www.k19.com.br
209
C HAT K19
15
while ( this . entrada . hasNextLine () ) {
16
String mensagem = this . entrada . nextLine () ;
17
this . distribuidor . distribuiMensagem ( mensagem ) ;
18
}
19
}
20 }
Cdigo Java F.9: Receptor.java
Cada receptor possui uma entrada de dados relacionada a um cliente conectado ao chat e o distribuidor. Para criao de um receptor, devem ser passados a entrada relacionada a um cliente e o
distribuidor atravs do construtor.
Como o servidor de chat precisa receber simultaneamente as mensagens de todos os clientes,
cada receptor ser executado em uma thread por isso a classe Receptor implementa a interface
Runnable.
No mtodo run(), o receptor entra em um lao esperando que uma mensagem seja enviada pelo
seu cliente para repass-la ao distribuidor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
java . io . IOException ;
java . io . PrintStream ;
java . net . ServerSocket ;
java . net . Socket ;
java . util . Scanner ;
www.facebook.com/k19treinamentos
209
C HAT K19
210
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Crie mais um novo projeto para os exerccios desse captulo. Digite CTRL + 3 e pesquise por
Create a Java project. Selecione a opo correspondente e siga a imagem abaixo.
7
210
www.k19.com.br
211
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C HAT K19
www.facebook.com/k19treinamentos
211
C HAT K19
No projeto Chat-Client, crie uma classe para definir a tela em Java Swing do chat.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
212
final
final
final
final
final
final
final
JFrame frame ;
JPanel panel ;
JScrollPane scrollPane ;
JTextArea textArea1 ;
JLabel label1 ;
JTextField textField ;
JButton button ;
212
www.k19.com.br
213
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
C HAT K19
11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
www.facebook.com/k19treinamentos
213
C HAT K19
214
214
www.k19.com.br
APNDICE
Q UIZZES
Quiz 1
Considere o trecho de cdigo em Java a seguir:
1 int i = 10;
2 boolean resultado = i ++ < 10 & i ++ < 20;
3 System . out . println ( i ++) ;
a) 10
b) 11
c) 12
d) 13
Na linha 1, a varivel i inicializada com o valor 10.
Na linha 2, as duas comparaes da expresso booleana i++ < 10 & i++ < 20 so processadas
pois utilizamos o operador lgico &. Portanto, a varivel i incrementada duas vezes, assumindo
o valor 12.
Na linha 3, como o operador ++ foi aplicado direita da varivel i, o incremento ocorre depois
da impresso. Dessa forma, o valor 12 impresso na tela, ou seja, a resposta correta a c.
Obs: Se o operador && tivesse sido utilizado na linha 2 no lugar do operador &, o valor impresso
seria 11. Com o operador && a segunda comparao da expresso booleana i++ < 10 & i++ <
20 no seria processada porque o resultado da primeira comparao false. Dessa forma, a
varivel i seria incrementada apenas uma vez na linha 2.
www.facebook.com/k19treinamentos
215
QUIZZES
216
216
www.k19.com.br
APNDICE
R ESPOSTAS
www.facebook.com/k19treinamentos
217
R ESPOSTAS
218
9
for ( int contador = 0; contador < 28; contador ++) {
10
int proximo = penultimo + ultimo ;
11
System . out . println ( proximo ) ;
12
13
penultimo = ultimo ;
14
ultimo = proximo ;
15
}
16
}
17 }
Cdigo Java 2.24: Fibonacci.java
218
www.k19.com.br
219
R ESPOSTAS
www.facebook.com/k19treinamentos
219
R ESPOSTAS
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
}
29 }
220
220
www.k19.com.br
221
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
}
38 }
R ESPOSTAS
System . out . println ( " Srie : " + t . serie ) ;
System . out . println ( " Sigla : " + t . sigla ) ;
System . out . println ( " Tipo de ensino : " + t . tipoDeEnsino ) ;
System . out . println ( " ----------------------------------------" ) ;
System . out . println ( " Dados do aluno " ) ;
System . out . println ( " Nome : " + a . nome ) ;
System . out . println ( " Data de nascimento : " + a . dataNascimento ) ;
System . out . println ( " RG : " + a . rg ) ;
System . out . println ( " ----------------------------------------" ) ;
a . turma = t ;
System . out . println ( " Dados da turma obtidos atravs do aluno " ) ;
System . out . println ( " Perodo : " + a . turma . periodo ) ;
System . out . println ( " Srie : " + a . turma . serie ) ;
System . out . println ( " Sigla : " + a . turma . sigla ) ;
System . out . println ( " Tipo de ensino : " + a . turma . tipoDeEnsino ) ;
www.facebook.com/k19treinamentos
221
R ESPOSTAS
222
15
}
16 }
Cdigo Java 3.43: TestaMetodosFuncionario.java
Execute a classe Media e observe que a mdia no exibida no Console j que nenhum parmetro
foi passado para o mtodo main.
Defina os parmetros que devem ser passados para o mtodo main da classe Media. Para isso,
digite CTRL + 3 e pesquise por Run Configurations.
Execute a classe Maior e observe que a mdia no exibida no Console j que nenhum parmetro
foi passado para o mtodo main.
Defina os parmetros que devem ser passados para o mtodo main da classe Maior. Para isso,
digite CTRL + 3 e pesquise por Run Configurations.
www.k19.com.br
223
R ESPOSTAS
1 class TestaValeRefeicao {
2
public static void main ( String [] args ) {
3
System . out . println ( Funcionario . valeRefeicaoDiario ) ;
4
Funcionario . valeRefeicaoDiario = 15;
5
System . out . println ( Funcionario . valeRefeicaoDiario ) ;
6
7
Funcionario . reajustaValeRefeicaoDiario (0.1) ;
8
System . out . println ( Funcionario . valeRefeicaoDiario ) ;
9
}
10 }
www.facebook.com/k19treinamentos
223
R ESPOSTAS
224
224
www.k19.com.br
225
R ESPOSTAS
www.facebook.com/k19treinamentos
225
R ESPOSTAS
226
www.k19.com.br
227
R ESPOSTAS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
www.facebook.com/k19treinamentos
227
R ESPOSTAS
228
www.k19.com.br
229
R ESPOSTAS
www.facebook.com/k19treinamentos
229
R ESPOSTAS
230
1
2
3
4
5
6
7
8
9
10
11
12
13
14
java . io . FileInputStream ;
java . io . FileOutputStream ;
java . io . IOException ;
java . io . InputStream ;
java . io . PrintStream ;
java . util . Scanner ;
230
www.k19.com.br
231
R ESPOSTAS
15
16
17
18
19
20
21
22
23
24
25
}
26 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
java . io . FileOutputStream ;
java . io . IOException ;
java . io . InputStream ;
java . io . PrintStream ;
java . util . Scanner ;
www.facebook.com/k19treinamentos
231