Escolar Documentos
Profissional Documentos
Cultura Documentos
Programacao Orientada A Objetos
Programacao Orientada A Objetos
5 de janeiro de 2012
Sumrio Sobre a K19 Seguro Treinamento Termo de Uso Cursos 1 Introduo 1.1 Objetivo . . . . . . . . . . . . . . . . . . . . 1.2 Orientao a Objetos . . . . . . . . . . . . 1.3 Plataforma Java . . . . . . . . . . . . . . . 1.4 Plataforma Java VS Orientao a Objetos Lgica 2.1 O que um Programa? . . . . . . 2.2 Linguagem de Mquina . . . . . 2.3 Linguagem de Programao . . . 2.4 Compilador . . . . . . . . . . . . . 2.5 Mquinas Virtuais . . . . . . . . . 2.6 Exemplo de programa Java . . . . 2.7 Mtodo Main - Ponto de Entrada 2.8 Exerccios de Fixao . . . . . . . 2.9 Variveis . . . . . . . . . . . . . . 2.10 Operadores . . . . . . . . . . . . . 2.11 IF-ELSE . . . . . . . . . . . . . . . 2.12 WHILE . . . . . . . . . . . . . . . . 2.13 FOR . . . . . . . . . . . . . . . . . 2.14 Exerccios de Fixao . . . . . . . 2.15 Exerccios Complementares . . . Orientao a Objetos
www.k19.com.br
i 1 2 3 4 1 1 1 2 2 3 3 3 4 4 4 7 8 9 9 12 15 15 16 16 18 21
i
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
S UMRIO
ii
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 3.20 3.21 4
Domnio e Aplicao . . . . . . . . . . . . . . . . . . . . . Objetos, Atributos e Mtodos . . . . . . . . . . . . . . . . Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . Manipulando Atributos . . . . . . . . . . . . . . . . . . . . Valores Padro . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . Exerccios Complementares . . . . . . . . . . . . . . . . . Relacionamentos: Associao, Agregao e Composio Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . Exerccios Complementares . . . . . . . . . . . . . . . . . Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . Exerccios Complementares . . . . . . . . . . . . . . . . . Sobrecarga (Overloading) . . . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . Construtores . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . Referncias como parmetro . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . Exerccios Complementares . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
21 22 24 27 28 28 29 32 33 34 36 36 38 39 39 40 41 44 46 47 47 49 49 50 50 51 51 52 53 54 55 55 56 56 57 58 59 61 62 62 63 63 64
Arrays 4.1 Criando um array . . . . . . . . . . . . 4.2 Modicando 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 . . . . . . Eclipse 5.1 workspace . . . . . . . . 5.2 welcome . . . . . . . . . 5.3 perspectives . . . . . . . 5.4 views . . . . . . . . . . . . 5.5 Criando um projeto java 5.6 Criando uma classe . . . 5.7 Gerando o mtodo main 5.8 Executando uma classe . 5.9 Corrigindo erros . . . . . 5.10 Atalhos teis . . . . . . . 5.11 Save Actions . . . . . . . 5.12 Refatorao . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
Atributos e Mtodos de Classe 67 6.1 Atributos Estticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6.2 Mtodos Estticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 6.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
www.k19.com.br
ii
iii
S UMRIO
6.4 7
Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71 73 73 73 74 75 75 75 76 77 78 78 79 81 83 83 83 84 85 87 87 88 89 90 92 93 93 94 95 95 96 97
Encapsulamento 7.1 Atributos Privados . . . . . . . . . . . . . . . . . . . 7.2 Mtodos Privados . . . . . . . . . . . . . . . . . . . 7.3 Mtodos Pblicos . . . . . . . . . . . . . . . . . . . 7.4 Implementao e Interface de Uso . . . . . . . . . 7.5 Por qu encapsular? . . . . . . . . . . . . . . . . . . 7.6 Celular - Escondendo a complexidade . . . . . . . 7.7 Carro - Evitando efeitos colateiras . . . . . . . . . 7.8 Mquinas de Porcarias - Aumentando o controle . 7.9 Acessando ou modicando atributos . . . . . . . . 7.10 Getters e Setters . . . . . . . . . . . . . . . . . . . . 7.11 Exerccios de Fixao . . . . . . . . . . . . . . . . . 7.12 Exerccios Complementares . . . . . . . . . . . . . Herana 8.1 Reutilizao de Cdigo . . . . . . . . . . 8.2 Uma classe para todos os servios . . . 8.3 Uma classe para cada servio . . . . . . 8.4 Uma classe genrica e vrias especcas 8.5 Preo Fixo . . . . . . . . . . . . . . . . . . 8.6 Reescrita de Mtodo . . . . . . . . . . . 8.7 Fixo + Especco . . . . . . . . . . . . . . 8.8 Construtores e Herana . . . . . . . . . . 8.9 Exerccios de Fixao . . . . . . . . . . . 8.10 Exerccios Complementares . . . . . . . Polimorsmo 9.1 Controle de Ponto . . . . . . . . . 9.2 Modelagem dos funcionrios . . 9.3 UM (extends) . . . . . . . . . . . 9.4 Melhorando o controle de ponto 9.5 Exerccios de Fixao . . . . . . . 9.6 Exerccios Complementares . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
10 Classes Abstratas 10.1 Classes Abstratas . . . . . . . 10.2 Mtodos Abstratos . . . . . . 10.3 Exerccios de Fixao . . . . 10.4 Exerccios Complementares 11 Interfaces 11.1 Padronizao . . . . . 11.2 Contratos . . . . . . . 11.3 Exemplo . . . . . . . . 11.4 Polimorsmo . . . . . 11.5 Interface e Herana . 11.6 Exerccios de Fixao
www.k19.com.br
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
99 . 99 . 100 . 101 . 103 105 105 105 106 107 107 109
iii
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
S UMRIO
iv
12 Pacotes 12.1 Organizao . . . . . . . . . . . . . . . . . . 12.2 O comando package . . . . . . . . . . . . . . 12.3 sub-pacotes . . . . . . . . . . . . . . . . . . . 12.4 Unqualied Name vs Fully Qualied Name 12.5 Classes ou Interfaces pblicas . . . . . . . . 12.6 Import . . . . . . . . . . . . . . . . . . . . . . 12.7 Conito de nomes . . . . . . . . . . . . . . . 12.8 Nveis de visibilidade . . . . . . . . . . . . . 12.9 Exerccios de Fixao . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
113 113 113 113 114 114 115 116 116 117
13 Documentao 119 13.1 A ferramenta javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 13.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 14 Exceptions 14.1 Errors vs Exceptions . . . . . . . . . . . 14.2 Checked e Unchecked . . . . . . . . . 14.3 Lanando uma unchecked exception . 14.4 Lanando uma checked exception . . 14.5 Capturando exceptions . . . . . . . . . 14.6 Exerccios de Fixao . . . . . . . . . . 15 Object 15.1 Polimorsmo . . . . . 15.2 O mtodo toString() . 15.3 O mtodo equals() . . 15.4 Exerccios de Fixao 16 String 16.1 Pool de Strings . . . . 16.2 Imutabilidade . . . . 16.3 Mtodos principais . 16.4 Exerccios de Fixao 127 127 128 128 129 129 130 131 131 132 134 136 141 141 142 142 144 147 147 148 148 149 150 151 151 155 156 157 157 158 158
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
17 Entrada e Sada 17.1 Byte a Byte . . . . . . . . . . 17.2 Scanner . . . . . . . . . . . . 17.3 PrintStream . . . . . . . . . . 17.4 Exerccios de Fixao . . . . 17.5 Exerccios Complementares 18 Collections 18.1 Listas . . . . . . . . . 18.2 Exerccios de Fixao 18.3 Conjuntos . . . . . . . 18.4 Colees . . . . . . . 18.5 Exerccios de Fixao 18.6 Lao foreach . . . . . 18.7 Generics . . . . . . . .
iv
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
www.k19.com.br
S UMRIO
18.8 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 A Swing A.1 Componentes . . . . . . . A.2 Layout Manager . . . . . . A.3 Events, Listeners e Sources A.4 Exerccios de Fixao . . . 161 161 165 166 167 169 169 169 169 171 171 172 172 173 174 177 177 177 178 181 181 181 182 183 189
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
B Empacotamento B.1 Empacotando uma biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.2 Empacotando uma applicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C Threads C.1 Denindo Tarefas - (Runnables) . . . C.2 Executando Tarefas . . . . . . . . . . C.3 Exerccios de Fixao . . . . . . . . . C.4 Controlando a Execuo das Tarefas C.5 Exerccios de Fixao . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
D Socket D.1 Socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D.2 ServerSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E Chat K19 E.1 Arquitetura do Sistema E.2 Aplicao servidora . . E.3 Aplicao cliente . . . . E.4 Exerccios de Fixao . Respostas
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
www.k19.com.br
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 prossionais formados em Cincia da Computao pela Universidade de So Paulo (USP) e que possuem vasta experincia em treinamento de prossionais para rea de TI. O principal objetivo da K19 oferecer treinamentos de mxima qualidade que relacionados s principais tecnologias utilizadas pelas empresas. Atravs desses treinamentos, seus alunos se tornam 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.k19.com.br
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.k19.com.br
S UMRIO
TR
www.k19.com.br/cursos
www.k19.com.br
CAPTULO
IGLU
Figura 1.1: Moradias
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 eciente, 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
Para entender melhor o que so os modelos de programao, podemos compar-los com padres arquiteturais utilizados por diferentes povos para construo de casas. As caractersticas ambientais denem quais tcnicas devem ser adotadas para a construo das moradias. Analogamente, devemos escolher o modelo de programao mais adequado s necessidades da aplicao que queremos desenvolver.
M A D K P B 0O K X E 8 T 80 E 1 B Y K 19
CABANA DE NDIO
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 especcos. Normalmente, o principal benefcio desejado facilitar a manuteno das aplicaes.
www.k19.com.br
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
www.k19.com.br
CAPTULO
Figura 2.1: Cdigo de Mquina.
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 eciente. Porm, eles no possuem a inteligncia necessria para denir quais instrues devem ser executadas para resolver uma determinada tarefa. Por outro lado, os seres humano possuem essa inteligncia. Dessa forma, uma pessoa precisa denir 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.
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.k19.com.br
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. Conra um trecho de um cdigo escrito com a linguagem de programao Java:
1 2 3 4 5 class OlaMundo { public static void main ( String [] args ) { System . out . println ( " Ol Mundo " ) ; } }
Cdigo Java 2.1: OlaMundo.java
Por enquanto voc pode no entender muito do que est escrito, porm ca bem claro que um programa escrito dessa forma ca 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 denem 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
NO EXECUTA
CDIGO FONTE
COMPILADOR
CDIGO DE MQUINA
PROCESSADOR
EXECUTA
Mquinas Virtuais
4
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 denida pela arquitetura do processador desse computador. H diversas arquiteturas diferentes (Intel, ARM, PowerPC, etc) e cada uma delas dene 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 especcas 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 especco.
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 nanceiro nessa empresa que inviabiliza o negcio.
www.k19.com.br
L GICA
Para tentar resolver o problema do desenvolvimento de aplicaes multiplataforma, surgiu o conceito de mquina virtual. Uma mquina virtual funciona como uma camada a mais entre o cdigo compilado e a plataforma. Quando compilamos um cdigo fonte, estamos criando um executvel que a mquina virtual saber interpretar e ela quem dever traduzir as instrues do seu programa para a plataforma.
MQUINA VIRTUAL 1 PLATAFORMA 1 EXECUTA
PROGRAMA
MQUINA VIRTUAL 2
PLATAFORMA 2
EXECUTA
MQUINA VIRTUAL 3
PLATAFORMA 3
EXECUTA
Tudo parece estar perfeito agora. Porm, olhando atentamente a gura 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 identicam os trechos do programa que esto sendo mais chamados
6
www.k19.com.br
L GICA
em um determinado momento da execuo para traduzi-los para a linguagem de mquina do computador. 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 eciente 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.k19.com.br
L GICA
Importante
Antes de compilar e executar um programa escrito em Java, necessrio que voc tenha instalado e congurado 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.
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 2 3 4 5 6 7 class Programa { public static void main ( String [] args ) { for ( int i = ; i < args . length ; i ++) { System . out . println ( args [ i ]) ; } } }
Cdigo Java 2.4: Imprimindo os parmetros da linha de comando
Os parmetros devem ser passados imediatamente aps o nome do programa. A execuo do programa mostrada na gura abaixo.
K19$ ls Programa . class Programa . java K19$ java Programa K19 Java Rafael Cosentino K19
www.k19.com.br
9
Java Rafael Cosentino
L GICA
Exerccios de Fixao
Abra um terminal e crie uma pasta com o seu nome. Voc deve salvar os seus exerccios nessa pasta.
1
K19$ mkdir Rafael K19$ cd Rafael K19 / Rafael$
2 Dentro da sua pasta de exerccios, crie uma pasta para os arquivos desenvolvidos nesse captulo chamada logica.
K19 / Rafael$ mkdir logica K19 / Rafael$ ls logica
3 Crie um programa que imprima uma mensagem na tela. Adicione o seguinte arquivo na pasta logica.
1 2 3 4 5
class OlaMundo { public static void main ( String [] args ) { System . out . println ( " Ol Mundo " ) ; } }
Cdigo Java 2.5: OlaMundo.java
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
www.k19.com.br
L GICA
10
Declarao
Na linguagem de programao Java, as variveis devem ser declaradas para que possam ser utilizadas. A declarao de uma varivel envolve denir um nome nico (identicador) 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 // Uma varivel do tipo int chamada numeroDaConta . int numeroDaConta ; // Uma varivel do tipo double chamada precoDoProduto . double precoDoProduto ;
Cdigo Java 2.6: Declarao de Variveis
Mais Sobre
Uma linguagem de programao dita estaticamente tipada quando ela exige que os tipos das variveis sejam denidos 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.
Mais Sobre
Em geral, as linguagens de programao possuem convenes para denir 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 // Declarao com Inicializao int numero = 1 ; // Uso da varivel System . out . println ( numero ) ; // Outra Declarao com Inicializao double preco = 137.6;
10
www.k19.com.br
11
9 1 11
L GICA
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 = 1 ; // Erro de Compilao int numero = 1 ;
Cdigo Java 2.8: 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 6 7 8 9 1 11 12 // Declaraes int numero ; double preco ; // Inicializao numero = 1 ; // Uso Correto System . out . println ( numero ) ; // Erro de compilao System . out . println ( preco ) ;
Cdigo Java 2.9: Inicializao
Tipos Primitivos
A linguagem Java dene 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 oat 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 utuante entre 1, 40129846432481707 1045 e 3, 40282346638528860 1038 (positivo ou negativo)
www.k19.com.br
11
L GICA
12
Descrio Valor com ponto utuante 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)
Tabela 2.1: Tipos primitivos de dados em Java.
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 (=, +=, -=, *=, /=, %=) Relacional (==, !=, <, <=, >, >=) Lgico (&&, ||)
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 int int int int int x = x = umMaisUm = 1 + 1; // umMaisUm = 2 tresVezesDois = 3 * 2; // tresVezesDois = 6 quatroDivididoPor2 = 4 / 2; // quatroDivididoPor2 = 2 seisModuloCinco = 6 % 5; // seisModuloCinco = 1 x = 7; x + 1 * 2; // x = 14 x - 4; // x = 1
12
www.k19.com.br
13
8 x = x / (6 - 2 + (3*5) /(16 -1) ) ; // x = 2
Cdigo Java 2.10: Exemplo de uso dos operadores aritmticos.
L GICA
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 -= 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
www.k19.com.br
13
L GICA
14
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
= = = = = =
Lgico
A linguagem Java permite vericar 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 int valor = 3 boolean teste teste = valor teste = valor teste = valor teste = valor teste = valor ; = < < > > <
// // // // //
= = = = =
14
www.k19.com.br
15
L GICA
IF-ELSE
O comportamento de uma aplicao pode ser inuenciado por valores denidos 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 vericar a data de vencimento do boleto para aplicar ou no uma multa por atraso. Para vericar uma determinada condio e decidir qual bloco de instrues deve ser executado, devemos aplicar o comando if.
1 2 3 4 5 if ( preco < ) { System . out . println ( " O preo do produto no pode ser negativo " ) ; } else { System . out . println ( " Produto cadastrado com sucesso " ) ; }
Cdigo Java 2.15: 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:
1 System . out . println ( " Bom Dia " ) ;
Cdigo Java 2.16: Bom Dia
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 denir quantas vezes um determinado trecho de cdigo deve ser executado pelo computador.
1 2 3 4 5 6 int contador = ;
while ( contador < 1 ) { System . out . println ( " Bom Dia " ) ; contador ++; }
www.k19.com.br
15
L GICA
16
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 2 3 for ( int contador = ; contador < 1 System . out . println ( " Bom Dia " ) ; } ; contador ++) {
Exerccios de Fixao
4
Imprima na tela o seu nome 100 vezes. Adicione na pasta logica o seguinte arquivo.
class ImprimeNome { public static void main ( String [] args ) { for ( int contador = ; contador < 1 ; contador ++) { System . out . println ( " Rafael Cosentino " ) ; } } }
Cdigo Java 2.19: ImprimeNome.java
1 2 3 4 5 6 7
1 2 3 4 5 6 7
.
www.k19.com.br
17
K19 / Rafael / logica$ javac ImprimeAte1 K19 / Rafael / logica$ java ImprimeAte1 . java
L GICA
6 Faa um programa que percorra todos os nmero de 1 at 100. Para os nmeros mpares, deve ser impresso um *, e para os nmeros pares, deve ser impresso dois **. Veja o exemplo abaixo:
* ** * ** * **
Faa um programa que percorra todos os nmero de 1 at 100. Para os nmeros mltiplos de 4, imprima a palavra PI, e para os outros, imprima o prprio nmero. Veja o exemplo abaixo:
7
1 2 3 PI 5 6 7 PI
17
L GICA
1 2 3 4 5 6 7 8 9 1 11 12 class ImprimePadrao2 { public static void main ( String [] args ) { for ( int contador = 1; contador <= 1 ; contador ++) { int resto = contador % 4; if ( resto == ) { System . out . println ( " PI " ) ; } else { System . out . println ( contador ) ; } } } }
Cdigo Java 2.22: ImprimePadrao2.java
18
Exerccios Complementares
1
Crie um programa que imprima na tela vrios tringulos de *. Observe o padro abaixo.
19
L GICA
Crie um programa para imprimir os 30 primeiros nmeros da sequncia de Fibonacci. Use seus conhecimentos para criar um programa que mostre um menu de atalho para os 5 padres que acabamos de fazer. Exemplo:
4
K19$ java GeradorDePadroes Gerador de Padres Escolha a opo desejada : 1- Padro 2- Padro 3- Padro 4- Padro 5- Padro - Sair
Se digitar o numero 1, ele automaticamente tem de executar o cdigo para o padro 1, e assim sucessivamente. Abaixo est o esqueleto da sua classe:
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 // Vamos aprender nos prximos capitulos para que serve o import . import java . io . IOException ; import java . io . InputStream ; import java . util . Scanner ; class GeradorDePadroes { public static void main ( String [] args ) { int opc =1; // Temos que atribuir o valor 1 na varivel , para poder entrar no lao de repetio while ( opc != ) { // Coloque o cdigo do menu aqui . Scanner scanner = new Scanner ( System . in ) ; // Vamos aprender mais pra frente que esses so os String valorTela = scanner . nextLine () ; // comandos para receber e guardar algum valor da opc = Integer . parseInt ( valorTela ) ; // tela . if ( opc ==1) { // Cdigo para o Padro 1 } else if ( opc ==2) { // Cdigo para o Padro } else if ( opc ==3) { // Cdigo para o Padro } else if ( opc ==4) { // Cdigo para o Padro } else if ( opc ==5) { // Cdigo para o Padro } } } }
Cdigo Java 2.26: GeradorDePadroes.java
2 3 4 5
www.k19.com.br
19
L GICA
20
20
www.k19.com.br
CAPTULO
CONTA DO JOS FUNCIONRIO MARCELO CLIENTE JOO FUNCIONRIO RAFAEL
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 reexo de um domnio. Para exemplicar, suponha que estamos interessados em desenvolver uma aplicao para facilitar as tarefas do cotidiano de um banco. Podemos identicar clientes, funcionrios, agncias e contas como entidades desse domnio. Assim como podemos identicar as informaes e os processos relacionados a essas entidades.
CONTA DA MARIA
CLIENTE MARIA
CONTA DO JOO
DOMNIO BANCRIO
Figura 3.1: Domnio bancrio
www.k19.com.br
21
O RIENTAO A O BJETOS
22
Mais Sobre
A identicao 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 eciente o entendimento dos domnios para os quais eles devem desenvolver aplicaes.
23
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 FUNCIONRIO MARCELO FUNCIONRIO RAFAEL nome = Rafael Cosentino codigo = 1 salario = 1000 tiraFerias aumentaSalario mudaHorario
CONTA DA MARIA CONTA DO JOS CONTA DO JOO Conta saldo = 2000 numero = 1 deposita saca geraExtrato
Cliente nome = Maria do Bairro codigo = 3 Cliente nome = Jos do Caixo codigo = 2 mudaEndereco fazEmprestimo
mudaEndereco fazEmprestimo
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.k19.com.br
23
O RIENTAO A O BJETOS
24
Classes
Antes de um objeto ser criado, devemos denir quais sero os seus atributos e mtodos. Essa denio 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 dene. 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
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.
M A D K P B 0O K X E 8 T 80 E 1 B Y K 19
24
www.k19.com.br
25
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 2 3 4 5 class Conta { double saldo ; double limite ; int numero ; }
Cdigo Java 3.1: Conta.java
www.k19.com.br
25
O RIENTAO A O BJETOS
26
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 estaticamente tipada, os tipos dos atributos so denidos 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 C# devem seguir o padro Camel Case com a primeira letra maiscula.
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 2 3 4 5 6 7 8 class TestaConta { public static void main ( String [] args ) { // criando trs objetos new Conta () ; new Conta () ; new Conta () ; } }
Cdigo Java 3.3: TestaConta.java
Analogia
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.
M A D K P B 0O K X E 8 T 80 E 1 B Y K 19
26
www.k19.com.br
27
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
A princpio, podemos comparar a referncia de um objeto com o endereo de memria desse objeto. De fato, essa comparao simplica o aprendizado. Contudo, o conceito de referncia mais amplo. Uma referncia o elemento que permite que um determinado objeto seja acessado. Uma referncia est para um objeto assim como um controle remoto est para um aparelho de TV. Atravs do controle remoto de uma TV voc pode aumentar o volume ou trocar de canal. Analogamente, podemos controlar um objeto atravs da referncia do mesmo.
M A D K P B 0O K X E 8 T 80 E 1 B Y K 19
1 4 7
-/--
2 5 3 6 9
CH
8 0
www.k19.com.br
27
O RIENTAO A O BJETOS
28
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 signica 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 especco da linguagem Java, a sintaxe para acessar um atributo utiliza o operador ".".
1 2 3 4 5 6 7 8 9 Conta referecia = new Conta () ; referecia . saldo = 1 . ; referecia . limite = 5 . ; referecia . numero = 1; System . out . println ( referecia . saldo ) ; System . out . println ( referecia . limite ) ; System . out . println ( referecia . numero ) ;
Cdigo Java 3.5: Alterando e acessando os atributos de um objeto.
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 2 3 class Conta { double limite ; }
Cdigo Java 3.6: Conta.java
28
www.k19.com.br
29
1 2 3 4 5 6 7 8 class TestaConta { public static void main ( String [] args ) { Conta conta = new Conta () ; // imprime System . out . println ( conta . limite ) ; } }
Cdigo Java 3.7: TestaConta.java
O RIENTAO A O BJETOS
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 denir esse valor como padro para o atributo limite.
1 2 3 class Conta { double limite = 5 } ;
1 2 3 4 5 6 7 8
class TestaConta { public static void main ( String [] args ) { Conta conta = new Conta () ; // imprime 5 System . out . println ( conta . limite ) ; } }
Cdigo Java 3.9: TestaConta.java
Exerccios de Fixao
Dentro da sua pasta de exerccios, crie uma pasta chamada orientacao-a-objetos para os arquivos desenvolvidos neste captulo.
1
K19 / Rafael$ mkdir orientacao -a - objetos K19 / Rafael$ ls logica orietacao -a - objetos
Implemente uma classe para denir os objetos que representaro os clientes de um banco. Essa classe deve declarar dois atributos: um para os nomes e outro para os cdigos dos clientes. Adicione o seguinte arquivo na pasta orientacao-a-objetos.
2
1 2 3 4
www.k19.com.br
29
O RIENTAO A O BJETOS
3
30
Faa um teste criando dois objetos da classe Cliente. Adicione o seguinte arquivo na pasta orientacao-a-objetos.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 class TestaCliente { public static void main ( String [] args ) { Cliente c1 = new Cliente () ; c1 . nome = " Rafael Cosentino " ; c1 . codigo = 1; Cliente c2 = new Cliente () ; c2 . nome = " Jonas Hirata " ; c2 . codigo = 2; System . out . println ( c1 . nome ) ; System . out . println ( c1 . codigo ) ; System . out . println ( c2 . nome ) ; System . out . println ( c2 . codigo ) ; } }
Cdigo Java 3.11: TestaCliente.java
1 2 3 4
Faa um teste criando dois objetos da classe CartaoDeCredito. Altere e imprima os atributos desses objetos. Adicione o seguinte arquivo na pasta orientacao-a-objetos.
5
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17
class TestaCartaoDeCredito { public static void main ( String [] args ) { CartaoDeCredito cdc1 = new CartaoDeCredito () ; cdc1 . numero = 111111; cdc1 . dataDeValidade = " 1/ 1/2 13 " ; CartaoDeCredito cdc2 = new CartaoDeCredito () ; cdc2 . numero = 222222; cdc2 . dataDeValidade = " 1/ 1/2 14 " ; System . out . println ( cdc1 . numero ) ; System . out . println ( cdc1 . dataDeValidade ) ; System . out . println ( cdc2 . numero ) ; System . out . println ( cdc2 . dataDeValidade ) ; } }
Cdigo Java 3.13: TestaCartaoDeCredito.java
As agncias do banco possuem nmero. Crie uma classe para denir os objetos que representawww.k19.com.br
30
31
O RIENTAO A O BJETOS
ro as agncias.
1 2 3 class Agencia { int numero ; }
Cdigo Java 3.14: Agencia.java
7 Faa um teste criando dois objetos da classe Agencia. Altere e imprima os atributos desses objetos. Adicione o seguinte arquivo na pasta orientacao-a-objetos.
1 2 3 4 5 6 7 8 9 1 11 12 13
class TestaAgencia { public static void main ( String [] args ) { Agencia a1 = new Agencia () ; a1 . numero = 1234; Agencia a2 = new Agencia () ; a2 . numero = 5678; System . out . println ( a1 . numero ) ; System . out . println ( a2 . numero ) ; } }
Cdigo Java 3.15: TestaAgencia.java
1 2 3 4 5
Faa um teste criando dois objetos da classe Conta. Altere e imprima os atributos desses objetos. Adicione o seguinte arquivo na pasta orientacao-a-objetos.
9
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21
class TestaConta { public static void main ( String [] args ) { Conta c1 = new Conta () ; c1 . numero = 1234; c1 . saldo = 1 ; c1 . limite = 5 ; Conta c2 = new Conta () ; c2 . numero = 5678; c2 . saldo = 2 ; c2 . limite = 25 ; System . out . println ( c1 . numero ) ; System . out . println ( c1 . saldo ) ; System . out . println ( c1 . limite ) ; System . out . println ( c2 . numero ) ; System . out . println ( c2 . saldo ) ; System . out . println ( c2 . limite ) ; } }
www.k19.com.br
31
O RIENTAO A O BJETOS
32
Faa um teste que imprima os atributos de um objeto da classe Conta logo aps a sua criao.
class TestaValoresPadrao { public static void main ( String [] args ) { Conta c = new Conta () ; System . out . println ( c . numero ) ; System . out . println ( c . saldo ) ; System . out . println ( c . limite ) ; } }
Cdigo Java 3.18: TestaValoresPadrao.java
1 2 3 4 5 6 7 8 9
Compile e execute a classe TestaValoresPadrao. Altere a classe Conta para que todos os objetos criados a partir dessa classe possuam R$ 100 de limite inicial.
1 2 3 4 5 class Conta { int numero ; double saldo ; double limite = 1 }
11
Exerccios Complementares
Implemente uma classe chamada Aluno na pasta orientacao-a-objetos para denir os objetos que representaro os alunos de uma escola. Essa classe deve declarar trs atributos: o primeiro para o nome, o segundo para o RG e o terceiro para a data de nascimento dos alunos.
1 2 Faa uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles. A classe tambm deve mostrar na tela as informaes desses objetos.
Em uma escola, alm dos alunos temos os funcionrios, que tambm precisam ser representados em nossa aplicao. Ento implemente outra classe na pasta orientacao-a-objetos chamada Funcionario que contenha dois atributos: o primeiro para o cargo e o segundo para o salrio dos funcionrios.
3
Faa uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles. Mostre na tela as informaes desses objetos.
4
Em uma escola, os alunos precisam ser divididos por turmas, que devem ser representadas dentro da aplicao. Implemente na pasta orientacao-a-objetos um classe chamada Turma que contenha quatro atributos: o primeiro para o perodo, o segundo para denir a srie, o terceiro para sigla
5
32
www.k19.com.br
33
O RIENTAO A O BJETOS
e o quarto para o tipo de ensino. Faa uma classe chamada TestaTurma para criar dois objetos da classe Turma. Adicione informaes a eles e depois mostre essas informaes na tela.
6
DEBIT
DEBIT
DEBIT
Duas classes deveriam ser criadas: uma para denir 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 2 3 class Cliente { String nome ; }
Cdigo Java 3.26: Cliente.java
1 2 3 4 5
Esse tipo de relacionamento chamado de Agregao. H uma notao grca na linguagem UML para representar uma agregao. Veja o diagrama abaixo.
www.k19.com.br
33
O RIENTAO A O BJETOS
34
No relacionamento entre carto de crdito e cliente, um carto de crdito s pode se relacionar com um nico cliente. Por isso, no diagrama acima, o nmero 1 colocado ao lado da classe Cliente. Por outro lado, um cliente pode se relacionar com muitos cartes de crdito. Por isso, no diagrama acima, o caractere * colocado ao lado da classe CartaoDeCredito. O relacionamento entre um objeto da classe Cliente e um objeto da classe CartaoDeCredito s concretizado quando a referncia do objeto da classe Cliente armazenada no atributo cliente do objeto da classe CartaoDeCredito. Depois de relacionados, podemos acessar, indiretamente, os atributos do cliente atravs da referncia do objeto da classe CartaoDeCredito.
1 2 3 4 5 6 7 8 9 // Criando um objeto de cada classe CartaoDeCredito cdc = new CartaoDeCredito () ; Cliente c = new Cliente () ; // Ligando os objetos cdc . cliente = c ; // Acessando o nome do cliente cdc . cliente . nome = " Rafael Cosentino " ;
Cdigo Java 3.28: Concretizando uma agregao
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
Dena 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.
1 2 3 class CartaoDeCredito { int numero ; String dataDeValidade ;
12
34
www.k19.com.br
35
4 5 Cliente cliente ; }
Cdigo Java 3.29: CartaoDeCredito.java
O RIENTAO A O BJETOS
13
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17
Compile e execute a classe TestaClienteECartao. Dena um vnculo entre os objetos que representam as agncias e os objetos que representam os contas. Para isso, voc deve alterar a classe Conta.
1 2 3 4 5 6 class Conta { int numero ; double saldo ; double limite = 1 Agencia agencia ; }
14
15
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17
www.k19.com.br
35
O RIENTAO A O BJETOS
36
Exerccios Complementares
7
Dena um vnculo entre os alunos e as turmas, criando na classe Aluno um atributo do tipo
Turma.
Teste o relacionamento entre os alunos e as turmas, criando um objeto de cada classe e atribuindo valores a eles. Exiba na tela os valores que esto nos atributos da turma atravs do objeto da classe Aluno.
8
Mtodos
No banco, possvel realizar diversas operaes em uma conta: depsito, saque, transferncia, consultas e etc. Essas operaes podem modicar ou apenas acessar os valores dos atributos dos objetos que representam as contas. Essas operaes so realizadas em mtodos denidos na prpria classe Conta. Por exemplo, para realizar a operao de depsito, podemos acrescentar o seguinte mtodo na classe Conta.
1 2 3 void deposita ( double valor ) { // implementao }
Cdigo Java 3.35: Denindo um mtodo
Nome: utilizado para chamar o mtodo. Na linguagem Java, uma boa prtica denir os nomes dos mtodos utilizando a conveno Camel Case com a primeira letra minscula.
Lista de Parmetros: Dene os valores que o mtodo deve receber. Mtodos que no devem receber nenhum valor possuem a lista de parmetros vazia.
Retorno: A resposta que ser devolvida ao nal do processamento do mtodo. Quando um mtodo no devolve nenhuma resposta, ele deve ser marcado com a palavra reservada void.
36
www.k19.com.br
37
O RIENTAO A O BJETOS
Retorno
Nome
Lista de parmetros
void }
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 (1 );
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 2 3 void deposita ( double valor ) { this . saldo += valor ; }
Cdigo Java 3.37: Utilizando o this para acessar e/ou modicar um atributo
O mtodo deposita() no possui nenhum retorno lgico. Por isso, foi marcado com void. Mas, para outros mtodos, pode ser necessrio denir um tipo de retorno especco. 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.
1 2 3 double consultaSaldoDisponivel () { return this . saldo + this . limite ; }
Cdigo Java 3.38: Mtodo com retorno double
www.k19.com.br
37
O RIENTAO A O BJETOS
38
Ao chamar o mtodo consultaSaldoDisponivel() a resposta pode ser armazenada em uma varivel do tipo double.
1 2 3 4 5 6 7 Conta c = new Conta () ; c . deposita (1 ); // Armazenando a resposta de um mtodo em uma varivel double saldoDisponivel = c . consultaSaldoDisponivel () ; System . out . println ( " Saldo Disponvel : " + this . saldoDisponivel ) ;
Cdigo Java 3.39: Armazenando a resposta de um mtodo
Exerccios de Fixao
Acrescente alguns mtodos na classe Conta para realizar as operaes de deposito, saque, impresso de extrato e consulta do saldo disponvel.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 class Conta { int numero ; double saldo ; double limite = 1 Agencia agencia ;
16
// ADICIONE OS MTODOS ABAIXO void deposita ( double valor ) { this . saldo += valor ; } void saca ( double valor ) { this . saldo -= valor ; } void imprimeExtrato () { System . out . println ( " SALDO : " + this . saldo ) ; } double consultaSaldoDisponivel () { return this . saldo + this . limite ; } }
Cdigo Java 3.40: Conta.java
17
1 2 3 4 5 6 7 8 9 1 11 12 13 14
38
www.k19.com.br
39
O RIENTAO A O BJETOS
Exerccios Complementares
9 Sabendo que qualquer empresa possui funcionrios, crie uma classe chamada Funcionario para represent-los. Acrescente os atributos nome e salario a essa classe. Alm disso, voc deve criar dois mtodos: um para aumentar o salrio e outro para consultar os dados dos funcionrios. 10
Crie uma classe chamada TestaFuncionario para testar os mtodos de um objeto da classe
Funcionario.
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 2 3 4 5 6 7 8 class Conta { double saldo ; double limite ; void imprimeExtrato ( int dias ) { // extrato } }
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 xa de dias.
1 2 3 4 5 6 7 8 9 1 11 12 class Conta { double saldo ; double limite ; void imprimeExtrato () { // extrato dos ltimos 15 dias } void imprimeExtrato ( int dias ) { // extrato } }
Cdigo Java 3.45: Conta.java
O primeiro mtodo no recebe parmetros pois ele utilizar uma quantidade de dias padro denida pelo banco para gerar os extratos (15 dias).
www.k19.com.br
39
O RIENTAO A O BJETOS
40
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 denidos 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 2 3 4 5 6 7 8 9 1 class Conta { void imprimeExtrato () { this . imprimeExtrato (15) ; } void imprimeExtrato ( int dias ) { // extrato } }
Cdigo Java 3.46: Conta.java
Exerccios de Fixao
Crie uma classe chamada Gerente para denir os objetos que representaro os gerentes do banco. Dena dois mtodos de aumento salarial nessa classe. O primeiro deve aumentar o salrio com uma taxa xa de 10%. O segundo deve aumentar o salrio com uma taxa varivel.
1 2 3 4 5 6 7 8 9 1 11 12 class Gerente { String nome ; double salario ; void aumentaSalario () { this . aumentaSalario ( .1) ; } void aumentaSalario ( double taxa ) { this . salario += this . salario * taxa ; } }
Cdigo Java 3.47: Gerente.java 18
19
1 2 3 4 5 6 7 8 9 1 11 12
40
www.k19.com.br
41
13 14 15 16 17 18 System . out . println ( " Aumentando o salrio em 3 % " ) ; g . aumentaSalario ( .3) ; System . out . println ( " Salrio : " + g . salario ) ; } }
Cdigo Java 3.48: TestaGerente.java
O RIENTAO A O BJETOS
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 denir um valor para o atributo numero. De maneira semelhante, podemos denir um nmero para um objeto da classe Agencia e uma agncia para um objeto da classe Conta.
1 2 CartaoDeCredito cdc = new CartaoDeCredito () ; cdc . numero = 12345;
Cdigo Java 3.49: Denindo um nmero para um carto de crdito
1 2
1 2
Denir 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 denido.
1 2 3 4 5 6 7 class CartaoDeCredito { int numero ; CartaoDeCredito ( int numero ) { this . numero = numero ; } }
Cdigo Java 3.52: CartaoDeCredito.java
www.k19.com.br
41
O RIENTAO A O BJETOS
1 2 3 4 5 6 7 class Agencia { int numero ; Agencia ( int numero ) { this . numero = numero ; } }
Cdigo Java 3.53: Agencia.java
42
1 2 3 4 5 6 7
class Conta { Agencia agencia ; Conta ( Agencia agencia ) { this . agencia = agencia ; } }
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 denido 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 // Passando corretamente os parmetros para os construtores CartaoDeCredito cdc = new CartaoDeCredito (1111) ; Agencia a = new Agencia (1234) ; Conta c = new Conta ( a ) ;
Cdigo Java 3.55: Construtores
1 2 3 4 5 6 7 8
// ERRO DE COMPILAO CartaoDeCredito cdc = new CartaoDeCredito () ; // ERRO DE COMPILAO Agencia a = new Agencia () ; // ERRO DE COMPILAO 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 denido 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 denir pelo menos um construtor explicitamente. Portanto, para instanciar uma classe que no possui construtores denidos no cdigo fonte, devemos utilizar o construtor padro, j que este inserido automaticamente pelo compilador.
1 2 class Conta {
42
www.k19.com.br
43
3 }
Cdigo Java 3.57: Conta.java
O RIENTAO A O BJETOS
1 2
Lembrando que o construtor padro s ser inserido pelo compilador se nenhum construtor for denido 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 2 3 4 5 6 7 class Agencia { int numero ; Agencia ( int numero ) { this . numero = numero ; } }
Cdigo Java 3.59: Agencia.java
1 2
Sobrecarga de Construtores
O conceito de sobrecarga de mtodos pode ser aplicado para construtores. Dessa forma, podemos denir diversos construtores na mesma classe.
1 2 3 4 5 6 7 8 9 1 11 12 class Pessoa { String rg ; int cpf ; Pessoa ( String rg ) { this . rg = rg ; } Pessoa ( int cpf ) { this . cpf = cpf ; } }
Cdigo Java 3.61: Pessoa.java
Quando dois construtores so denidos, h duas opes no momento de utilizar o comando new.
1 2 3 4 5 // Chamando o primeiro construtor Pessoa p1 = new Pessoa ( " 123456 X " ) ; // Chamando o segundo construtor Pessoa p2 = new Pessoa (123456789) ;
Cdigo Java 3.62: Utilizando dois construtores diferentes
www.k19.com.br
43
O RIENTAO A O BJETOS
44
Exerccios de Fixao
20
1 2 3 4 5 6 7
21 22
Altere o cdigo da classe TestaContaEAgencia para que o erro de compilao seja resolvido. Substitua linhas semelhantes a
1 Agencia a = new Agencia () ;
Cdigo Java 3.65: Cdigo antigo
tro.
1 2 class CartaoDeCredito { int numero ;
44
www.k19.com.br
45
3 4 5 6 7 8 9 1 String dataDeValidade ; Cliente cliente ; CartaoDeCredito ( int numero ) { this . numero = numero ; } }
Cdigo Java 3.67: CartaoDeCredito.java
O RIENTAO A O BJETOS
Tente compilar novamente os arquivos TestaCartaoDeCredito e TestaClienteECartao. Observe os erros de compilao. Altere o cdigo das classes TestaCartaoDeCredito e TestaClienteECartao para que os erros de compilao sejam resolvidos. Substitua trechos de cdigo semelhantes ao trecho abaixo:
1 2 CartaoDeCredito cdc = new CartaoDeCredito () ; cdc . numero = 111111;
Cdigo Java 3.68: Cdigo antigo 25
24
Acrescente um construtor na classe Conta para receber uma referncia como parmetro.
class Conta { int numero ; double saldo ; double limite = 1 Agencia agencia ;
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24
Conta ( Agencia agencia ) { this . agencia = agencia ; } void deposita ( double valor ) { this . saldo += valor ; } void saca ( double valor ) { this . saldo -= valor ; } void imprimeExtrato () { System . out . println ( " SALDO : " + this . saldo ) ; } double consultaSaldoDisponivel () { return this . saldo + this . limite ; } }
Cdigo Java 3.70: Conta.java
www.k19.com.br
45
O RIENTAO A O BJETOS
27
46
Tente compilar novamente os arquivos TestaContaEAgencia, TestaMetodosConta e TestaValoresPadrao. Observe os erros de compilao. Altere o cdigo das classes TestaContaEAgencia, TestaMetodosConta e TestaValoresPadrao para que o erros de compilao sejam resolvidos. Substitua trechos de cdigo semelhantes ao trecho abaixo:
1 2 Agencia a = new Agencia (1234) ; Conta c = new Conta () ;
Cdigo Java 3.71: Cdigo antigo 28
Na chamada do mtodo transfere(), devemos ter duas referncias de contas: uma para chamar o mtodo e outra para passar como parmetro.
46
www.k19.com.br
47
1 2 3 4 5 6 Conta origem = new Conta () ; origem . saldo = 1 ; Conta destino = new Conta () ; origem . transfere ( destino , 5 );
O RIENTAO A O BJETOS
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
Acrescente um mtodo na classe Conta para implementar a lgica de transferncia de valores entre contas.
1 2 3 4 void transfere ( Conta destino , double valor ) { this . saldo -= valor ; destino . saldo += valor ; }
29
30
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16
System . out . println ( origem . saldo ) ; System . out . println ( destino . saldo ) ; } }
Exerccios Complementares
www.k19.com.br
47
O RIENTAO A O BJETOS
48
Crie uma pasta chamada complementar dentro da pasta orientacao-a-objetos. Os arquivos a seguir devem ser salvos nessa pasta. Crie uma classe que represente as contas do banco. Essa classe deve conter trs atributos: numero, limite e saldo. Crie uma classe chamada TestaConta. Dentro dessa classe, crie um objeto do tipo Conta. Receba do teclado os valores para os atributos numero, saldo e limite. Depois crie um lao que permita que o usurio escolha a operao que ele deseja realizar. As operaes que ele pode realizar so: depositar, sacar e imprimir extrato.
14 13 12
11
Crie uma classe que represente os funcionrios do banco. Essa classe deve conter dois atributos:
48
www.k19.com.br
CAPTULO
Cdigo Java 4.1: Uma varivel para cada nmero de conta
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 ; ...
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 identicao.
0
Figura 4.1: Analogia de array.
Criando um array
Em Java, os arrays so criados atravs do comando new.
1 int [] numeros = new int [1 ];
Cdigo Java 4.2: Criando um array com capacidade para 100 valores do tipo int
www.k19.com.br
49
A RRAYS
50
A varivel numeros armazena a referncia de um array criado na memria do computador atravs do comando new. Na memria, o espao ocupado por esse array est dividido em 100 pedaos iguais numerados de 0 at 99. Cada pedao pode armazenar um valor do tipo int.
TIPO DE DADO QUE SER ARMAZENADO PELO ARRAY IDENTIFICADOR DA VARIVEL INFORMA O TIPO DO NOVO OBJETO
int[]
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 denir os valores de cada posio de um array no momento da sua criao utilizando as sintaxes abaixo:
1 int [] numeros = new int [2]{1 ,87};
,87};
int [] numeros = {1
,87};
Cdigo Java 4.6: Inicializando o contedo de um array
51
1 2 3 int [] numeros = {1 ,87}; System . out . println ( numeros [ ]) ; System . out . println ( numeros [1]) ;
Cdigo Java 4.7: Acessando o contedo das posies 0 e 1
A RRAYS
Importante
Acessar posies fora do intervalo de ndices de um array gera erro de execuo. Mais especicamente, 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 2 3 4 int [] numeros = new int [1 ]; for ( int i = ; i < 1 ; i ++) { numeros [ i ] = i ; }
Cdigo Java 4.8: Percorrendo um array
Para percorrer um array, necessrio saber a quantidade de posies do mesmo. Essa quantidade denida 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 2 3 void imprimeArray ( int [] numeros ) { // implementao }
Cdigo Java 4.9: Mtodo que deve imprimir o contedo de um array de int
foreach
www.k19.com.br
51
A RRAYS
52
Para acessar todos os elementos de um array, possvel aplicar o comando for com uma sintaxe um pouco diferente.
1 2 3 4 5 void imprimeArray ( int [] numeros ) { for ( int numero : numeros ) { System . out . println ( numero ) ; } }
Cdigo Java 4.11: 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.12: 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 2 String [] nomes = new String [] { " rafael " , " jonas " , " marcelo " }; String [] nomesDuplicados = Arrays . copyOf ( nomes , 1 ) ;
Cdigo Java 4.13: Duplicando
Preenchendo um Array
Podemos preencher todas as posies de um array com um valor especco utilizando o mtodo
Arrays.fill().
52
www.k19.com.br
53
1 2 int [] numeros = new int [1 ]; java . util . Arrays . fill ( numeros , 5) ;
Cdigo Java 4.14: Preenchendo um array com um valor especco
A RRAYS
Exerccios de Fixao
1 Dentro da sua pasta de exerccios crie uma pasta chamada arrays para os arquivos desenvolvidos nesse captulo.
K19 / Rafael$ mkdir arrays K19 / Rafael$ ls logica orietacao -a - objetos arrays
Crie um programa que imprima na tela os argumentos passados na linha de comando para o mtodo main.
2
1 2 3 4 5 6 7
class ImprimeArgumentos { public static void main ( String [] args ) { for ( String arg : args ) { System . out . println ( arg ) ; } } }
Cdigo Java 4.15: ImprimeArgumentos.java
Compile e execute a classe ImprimeArgumentos. Na execuo, no esquea de passar alguns parmetros na linha de comando.
K19 / Rafael / arrays$ java ImprimeArgumentos Rafael Marcelo Jonas Rafael Marcelo Jonas
1 2 3 4 5 6 7 8 9
Compile e execute a classe Ordena. Na execuo, no esquea de passar alguns parmetros na linha de comando.
K19 / Rafael / arrays$ java Ordena rafael solange marcelo jonas jonas
www.k19.com.br
53
A RRAYS
marcelo rafael solange
54
Exerccios Complementares
Faa um programa que calcule a mdia dos elementos recebidos na linha de comando. Dica: para converter strings para double utilize o mtodo parseDouble()
1
1 2
Crie um programa que encontre o maior nmero entre os valores passados na linha de comando.
54
www.k19.com.br
CAPTULO
Figura 5.1: Selecionando uma workspace
E CLIPSE
Na prtica, alguma ferramenta de desenvolvimento adotada para aumentar a produtividade. Essas ferramentas so chamadas IDE (Integrated Development Environment - Ambiente de Desenvolvimento Integrado). Uma IDE uma ferramenta que prov facilidades para o desenvolvedor realizar as principais tarefas relacionadas ao desenvolvimento de um software. No caso especco da plataforma Java, a IDE mais utilizada o Eclipse. Essa ferramenta bem abrangente e oferece recursos sosticados para o desenvolvimento de uma aplicao Java. Alm disso, ela gratuita. As diversas distribuies do Eclipse podem ser obtidas atravs do site http://www.eclipse.
org/.
Importante
Para instalar o Eclipse, consulte o artigo da K19:
http://www.k19.com.br/
artigos/instalando-eclipse/
workspace
Uma workspace uma pasta que normalmente contm projetos e conguraes do Eclipse. Quando executado, o Eclipse permite que o usurio selecione uma pasta como workspace.
Podemos ter vrias workspaces para organizar conjuntos de projetos e conguraes independentemente.
www.k19.com.br
55
E CLIPSE
56
welcome
A primeira tela do Eclipse (welcome) mostra links para alguns exemplos, tutorias, viso geral da ferramenta e novidades.
Na tela de welcome, podemos ir para a rea de trabalho do Eclipse clicando no cone Workbench ou simplesmente fechando a tela welcome.
perspectives
O Eclipse oferece vrios modos de trabalho ao desenvolvedor. Cada modo de trabalho adequado para algum tipo de tarefa. Esses modos de trabalhos so chamados de perspectives (perspectivas). Podemos abrir uma perspectiva atravs do cone no canto superior direito da workbench.
56
www.k19.com.br
57
E CLIPSE
views
As telas que so mostradas na workbench so chamadas de views. O desenvolvedor pode abrir, fechar ou mover qualquer view ao seu gosto e necessidade. Uma nova view pode ser aberta atravs do menu Window->Show View->Other.
www.k19.com.br
57
E CLIPSE
58
Na tela de criao de novo projeto java, devemos escolher um nome para o projeto.
58
www.k19.com.br
59
E CLIPSE
A estrutura do projeto pode ser vista atravs da view Navigator que pode ser aberta com Quick Acess.
59
E CLIPSE
60
Um arquivo com o esqueleto da classe criado na pasta src e automaticamente o Eclipse compila e salva o cdigo compilado na pasta bin.
60
www.k19.com.br
61
E CLIPSE
Dentro do mtodo main, podemos gerar o cdigo necessrio para imprimir uma mensagem na tela com o Content Assist. Basta digitar sys seguido de CTRL+ESPACO e escolher a sugesto adequada.
www.k19.com.br
61
E CLIPSE
62
Corrigindo erros
62
www.k19.com.br
63
E CLIPSE
Erros de compilao podem ser corrigidos com o Quick Fix atravs do atalho CTRL+1. O Eclipse oferece sugestes para consertar um cdigo com erros.
No exemplo, o Quick Fix gera uma varivel local chamada nome. Depois, basta denir um valor para essa varivel.
Atalhos teis
CTRL+1 (Quick Fix) : Lista sugestes para consertar erros. CTRL+3 (Quick Acess) : Lista para acesso rpido a comandos ou menus. CTRL+ESPACO (Content Assist) : Lista sugestes para completar cdigo. CTRL+SHIFT+F : Formata o cdigo. CTRL+\ : Comenta o cdigo selecionado.
Save Actions
www.k19.com.br
63
E CLIPSE
64
Podemos escolher algumas aes para serem executadas no momento em que um arquivo com cdigo java salvo. Uma ao muito til a de formatar o cdigo.
Refatorao
64
www.k19.com.br
65
E CLIPSE
Muitas vezes, desejamos realizar alteraes na organizao de uma aplicao sem afetar o seu funcionamento. O exemplo mais simples dessa situao ocorre quando mudamos o nome de uma varivel. Em geral, modicaes desse tipo afetam vrios pontos do cdigo fonte. O Eclipse possuir recursos para facilitar a refatorao do cdigo de forma automatica. Considere a seguinte classe:
1 2 3 4 5 6 7 8 9 1 11 public class Conta { double sld ; void depositaValor ( double v ) { this . sld = v ; } void sacaDinheiro ( double v ) { this . sld -= v ; } }
Cdigo Java 5.1: Conta.java
Em algum momento, podemos considerar que o nome do atributo que guarda o saldo das contas deveria ser saldo ao invs de sld, pois o entendimento do cdigo est prejudicado. Essa modicao afetaria diversos pontos do cdigo. Contudo, o eclipse facilita essa alterao. Basta selecionar alguma ocorrncia do atributo sld ou simplesmente deixar o cursor de digitao sobre a ocorrncia e utilizar o menu Refactor.
www.k19.com.br
65
E CLIPSE
66
Quando as ocorrncias do atributo sld estiverem com borda, podemos modicar o seu nome e no nal basta apertar Enter para conrmar a alterao. Todos as ocorrncias sero atualizadas automaticamente. De maneira anloga, podemos alterar o nome das variveis locais, dos mtodos e das classes.
66
www.k19.com.br
CAPTULO
FUNCIONARIO
Atributos Estticos
Num sistema bancrio, provavelmente, criaramos uma classe para especicar os objetos que representariam os funcionrios do banco.
1 2 3 4 5 6 7 8 class Funcionario { String nome ; double salario ; void aumentaSalario ( double aumento ) { this . salario += aumento ; } }
Cdigo Java 6.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 denir um atributo na classe Funcionario para tal propsito.
1 2 3 4 5 6 7 8 9 class Funcionario { String nome ; double salario ; double valeRefeicaoDiario ; void aumentaSalario ( double aumento ) { this . salario += aumento ; } }
Cdigo Java 6.2: Funcionario.java
O atributo valeRefeicaoDiario de instncia, ou seja, cada objeto criado a partir da classe Funcionario teria o seu prprio atributo valeRefeicaoDiario. Porm, no faz sentido ter esse valor repetido em todos os objetos, j que ele nico para todos os funcionrios.
FUNCIONARIO
nome = Rafael Cosentino valeRefeicaoDiario = 15
FUNCIONARIO
nome = Jonas Hirata valeRefeicaoDiario = 15
67
68
devemos torn-lo um atributo de classe ao invs de um atributo de instncia. Para isso, devemos aplicar o modicador static na declarao do atributo.
1 2 3 4 5 6 7 8 9 class Funcionario { String nome ; double salario ; static double valeRefeicaoDiario ; void aumentaSalario ( double aumento ) { this . salario += aumento ; } }
Cdigo Java 6.3: Funcionario.java
Um atributo de classe deve ser acessado atravs do nome da classe na qual ele foi denido.
1 Funcionario . valeRefeicaoDiario = 15;
Cdigo Java 6.4: Acessando um atributo de classe
Podemos acessar um atributo de classe atravs de uma referncia de um objeto da classe na qual o atributo foi denido. Contudo, no seria a maneira conceitualmente correta j que o atributo pertence a classe e no ao objeto.
1 2 3 Funcionario f = new Funcionario () ; // Vlido , mas conceitualmente incorreto f . valeRefeicaoDiario = 15;
Cdigo Java 6.5: Acessando um atributo de classe
valeRefeicaoDiario = 15
FUNCIONARIO
nome = Rafael Cosentino
FUNCIONARIO
nome = Jonas Hirata
FUNCIONARIO
nome = Marcelo Martins
Mtodos Estticos
Denimos 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 denir um mtodo na classe Funcionario para implementar esse reajuste.
1 void reajustaValeRefeicaoDiario ( double taxa ) {
68
www.k19.com.br
69
2 3
O mtodo reajustaValeRefeicaoDiario() de instncia. Consequentemente, ele deve ser chamado a partir da referncia de um objeto da classe Funcionario. Contudo, como o reajuste do valor do vale refeio no depende dos dados de um funcionrio em particular, no faz sentido precisar de uma referncia de um objeto da classe Funcionario para poder fazer esse reajuste. Neste caso, poderamos denir o reajustaValeRefeicaoDiario() como mtodo de classe ao invs de mtodo de instncia. Aplicando o modicador static nesse mtodo, ele se tornar um mtodo de classe. Dessa forma, o reajuste poderia ser executado independentemente da existncia de objetos da classe Funcionario.
1 2 3 static void reajustaValeRefeicaoDiario ( double taxa ) { Funcionario . valeRefeicaoDiario += Funcionario . valeRefeicaoDiario * taxa ; }
Cdigo Java 6.7: Mtodo que reajusta o valor do vale refeio
Um mtodo de classe deve ser chamado atravs do nome da classe na qual ele foi denido.
1 Funcionario . reajustaValeRefeicaoDiario ( .1) ;
Cdigo Java 6.8: Chamando um mtodo de classe
Podemos chamar um mtodo de classe atravs de uma referncia de um objeto da classe na qual o mtodo foi denido. Contudo, no seria a maneira conceitualmente correta j que o mtodo pertence a classe e no ao objeto.
1 2 3 Funcionario f = new Funcionario () ; // Vlido , mas conceitualmente incorreto f . reajustaValeRefeicaoDiario ( .1) ;
Cdigo Java 6.9: Chamando um mtodo de classe
Exerccios de Fixao
1
2 Crie uma classe chamada Conta no projeto Static. Dena um atributo de classe para contabilizar o nmero de objetos instanciados a partir da classe Conta. Esse atributo deve ser incrementado toda vez que um objeto criado. Voc pode utilizar construtores para fazer o incremento.
1 2 3 4 5 6 7 8
public class Conta { // ATRIBUTO DE CLASSE static int contador ; // CONSTRUTOR Conta () { Conta . contador ++; }
www.k19.com.br
69
70
Faa um teste criando dois objetos da classe Conta. Imprima o valor do contador de contas antes e depois da criao de cada objeto.
3
1 2 3 4 5 6 7 8 9
public class Testa { public static void main ( String [] args ) { System . out . println ( " Contador : " + Conta . contador ) ; new Conta () ; System . out . println ( " Contador : " + Conta . contador ) ; new Conta () ; System . out . println ( " Contador : " + Conta . contador ) ; } }
Cdigo Java 6.11: Testa.java
4 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 o nmero das contas. Implemente no construtor a lgica para gerar esses nmeros de forma nica atravs do contador de contas.
1 2 3 4 5 6 7 8 9 1 11 12 13
public class Conta { // ATRIBUTO DE CLASSE static int contador ; // ATRIBUTO DE INSTANCIA int numero ; // CONSTRUTOR Conta () { Conta . contador ++; this . numero = Conta . contador ; } }
Cdigo Java 6.12: Conta.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15
Adicione um mtodo de classe na classe Conta para zerar o contador e imprimir o total de contas anterior.
6
70
www.k19.com.br
71
1 2 3 4 5 static void zeraContador () { System . out . println ( " Contador : " + Conta . contador ) ; System . out . println ( " Zerando o contador de contas ... " ) ; Conta . contador = ; }
Cdigo Java 6.14: Mtodo zeraContador()
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16
Exerccios Complementares
1 Crie uma classe para modelar os funcionrios do banco. Dena nessa classe um atributo para armazenar o valor do vale refeio dirio pago aos funcionrios. 2 3 4
Faa um teste para vericar o funcionamento do vale refeio. Dena um mtodo para reajustar o vale refeio dirio a partir de uma taxa. Faa um teste para vericar o funcionamento do reajuste do vale refeio.
www.k19.com.br
71
72
72
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 2 3 class Funcionario { double salario ; }
Cdigo Java 7.1: Funcionario.java
O atributo salario pode ser acessado ou modicado por cdigo escrito em qualquer classe que esteja no mesmo diretrio que a classe Funcionario. Portanto, o controle desse atributo descentralizado. Para identicar algum erro relacionado a manipulao dos salrios dos funcionrios, necessrio vericar o cdigo de todos os arquivos da pasta onde a classe Funcionario est denida. Quanto maior o nmero de arquivos, menos eciente ser a manuteno da aplicao. Podemos obter um controle centralizado tornando o atributo salario privado e denindo mtodos para implementar todas as lgicas que utilizam ou modicam o valor desse atributo.
1 2 3 4 5 6 7 class Funcionario { private double salario ; void aumentaSalario ( double aumento ) { // lgica para aumentar o salrio } }
Cdigo Java 7.2: Funcionario.java
Um atributo privado s pode ser acessado ou alterado por cdigo escrito dentro da classe na qual ele foi denido. Se algum cdigo fora da classe Funcionario tentar acessar ou alterar o valor do atributo privado salario, um erro de compilao ser gerado. Denir 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
O papel de alguns mtodos pode ser o de auxiliar outros mtodos da mesma classe. E muitas
www.k19.com.br
73
E NCAPSULAMENTO
74
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 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 class Conta { private double saldo ; void deposita ( double valor ) { this . saldo += valor ; this . descontaTarifa () ; } void saca ( double valor ) { this . saldo -= valor ; this . descontaTarifa () ; } void descontaTarifa () { this . saldo -= .1; } }
Cdigo Java 7.3: Conta.java
Para garantir que mtodos auxiliares no sejam chamados por cdigo escrito fora da classe na qual eles foram denidos, podemos torn-los privados, acrescentando o modicador private.
1 2 3 private void descontaTarifa () { this . saldo -= .1; }
Cdigo Java 7.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 modicador de visibilidade public.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 class Conta { private double saldo ; public void deposita ( double valor ) { this . saldo += valor ; this . descontaTarifa () ; } public void saca ( double valor ) { this . saldo -= valor ; this . descontaTarifa () ; } private descontaTarifa () { this . saldo -= .1; } }
74
www.k19.com.br
75
E NCAPSULAMENTO
Por qu encapsular?
Uma das ideias mais importantes da orientao a objetos o encapsulamento. Encapsular signica 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 modicar 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 identicado em diversos exemplos do cotidiano. Mostraremos alguns desses exemplos para esclarecer melhor a ideia.
75
E NCAPSULAMENTO
76
No contexto da orientao a objetos, aplicamos o encapsulamento para criar objetos mais simples de serem utilizados em qualquer parte do sistema.
Calling Maria
77
E NCAPSULAMENTO
12:30
= =
Figura 7.2: Substituio de um volante por um joystick
12:30
www.k19.com.br
77
E NCAPSULAMENTO
78
Da mesma forma, eventualmente, necessrio modicar o valor de um atributo a partir de qualquer lugar do sistema. Nesse caso, tambm poderamos criar um mtodo para essa tarefa.
1 2 3 4 5 6 7 class Cliente { private String nome ; public void alteraNome ( String nome ) { this . nome = nome ; } }
Cdigo Java 7.7: Cliente.java
Muitas vezes, necessrio consultar e alterar o valor de um atributo a partir de qualquer lugar do sistema. Nessa situao, podemos denir 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 modicar 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 modicao 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 nali78
www.k19.com.br
79
E NCAPSULAMENTO
dade acessar ou alterar as propriedades de um objeto. Segundo essa conveno, os nomes dos mtodos que permitem a consulta das propriedades de um objeto devem possuir o prexo get. Analogamente, os nomes dos mtodos que permitem a alterao das propriedades de um objeto devem possuir o prexo 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 2 3 4 5 6 7 8 9 1 11 class Cliente { private String nome ; public String getNome () { return this . nome ; } public void setNome ( String nome ) { this . nome = nome ; } }
Cdigo Java 7.8: Cliente.java
Exerccios de Fixao
1
2 Dena uma classe para representar os funcionrios do banco com um atributo para guardar os salrios e outro para os nomes.
1 2 3 4
1 2 3 4 5 6 7 8 9 1 11
Compile a classe Teste e perceba que ela pode acessar ou modicar os valores dos atributos de um objeto da classe Funcionario. Execute o teste e observe o console.
4 5
79
E NCAPSULAMENTO
80
vados.
1 2 3 4 class Funcionario { private double salario ; private String nome ; }
Cdigo Java 7.11: Funcionario.java
6 Tente compilar novamente a classe Teste. Observe os erros de compilao. Lembre-se que um atributo privado s pode ser acessado por cdigo escrito na prpria classe do atributo. 7
Crie mtodos de acesso com nomes padronizados para os atributos denidos na classe Funcionario.
class Funcionario { private double salario ; private String nome ; public double getSalario () { return this . salario ; } public String getNome () { return this . nome ; } public void setSalario ( double salario ) { this . salario = salario ; } public void setNome ( String nome ) { this . nome = nome ; } }
Cdigo Java 7.12: Funcionario.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2
Altere a classe Teste para que ela utilize os mtodos de acesso ao invs de manipular os atributos do objeto da classe Funcionario diretamente.
8
1 2 3 4 5 6 7 8 9 1 11
class Teste { public static void main ( String [] args ) { Funcionario f = new Funcionario () ; f . setNome ( " Rafael Cosentino " ) ; f . setSalario (2 ); System . out . println ( f . getNome () ) ; System . out . println ( f . getSalario () ) ; } }
Cdigo Java 7.13: Teste.java
81
E NCAPSULAMENTO
Outra possibilidade utilizar o Quick Acess para executar o comando generate getters and setters
Exerccios Complementares
1
2 Adicione mtodos de acesso com nomes padronizados para os atributos da classe que modela as contas do banco.
Crie objetos da classe que modela as contas do banco e utilize os mtodos de acesso para alterar os valores dos atributos.
3 4
www.k19.com.br
E NCAPSULAMENTO
82
82
www.k19.com.br
CAPTULO
Cdigo Java 8.1: Servico.java
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 denidos 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 2 3 4 5 class Servico { // GERAL private Cliente contratante ; private Funcionario responsavel ; private String dataDeContratacao ;
www.k19.com.br
83
H ERANA
6 7 8 9 1 11 12
84
Seguro de veculos
Outro servio oferecido pelo banco o seguro de veculos. Para esse servio devem ser denidas as seguintes informaes: veculo segurado, valor do seguro e a franquia. Devemos adicionar trs atributos na classe Servico.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 class Servico { // GERAL private Cliente contratante ; private Funcionario responsavel ; private String dataDeContratacao ; // EMPRSTIMO private double valor ; private double taxa ; // SEGURO DE VEICULO private Veiculo veiculo ; private double valorDoSeguroDeVeiculo ; private double franquia ; // mtodos }
Cdigo Java 8.3: Servico.java
Apesar de seguir a ideia do DRY, modelar todos os servios com apenas uma classe pode dicultar o desenvolvimento. Supondo que dois ou mais desenvolvedores so responsveis pela implementao dos servios, eles provavelmente modicariam a mesma classe concorrentemente. Alm disso, os desenvolvedores, principalmente os recm chegados no projeto do banco, cariam 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.
84
www.k19.com.br
85
6 7 8 9 1 11 12 13
H ERANA
// SEGURO DE VEICULO private Veiculo veiculo ; private double valorDoSeguroDeVeiculo ; private double franquia ; // mtodos }
1 2 3 4 5 6 7 8 9 1 11 12
class Emprestimo { // GERAL private Cliente contratante ; private Funcionario responsavel ; private String dataDeContratacao ; // EMPRSTIMO private double valor ; private double taxa ; // mtodos }
Criar uma classe para cada servio torna o sistema mais exvel, 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.
85
H ERANA
86
Os objetos das classes especcas Emprestimo e SeguroDeVeiculo possuiriam tanto os atributos e mtodos denidos nessas classes quanto os denidos na classe Servico.
1 2 3 4 5 6 7 Emprestimo e = new Emprestimo () ; // Chamando um mtodo da classe Servico e . setDataDeContratacao ( " 1 /1 /2 1 " ) ; // Chamando um mtodo da classe Emprestimo e . setValor (1 );
Cdigo Java 8.6: Chamando mtodos da classe genrica e da especca
As classes especcas so vinculadas a classe genrica utilizando o comando extends. No necessrio redenir o contedo j declarado na classe genrica.
1 2 3 4 5 class Servico { private Cliente contratante ; private Funcionario responsavel ; private String dataDeContratacao ; }
Cdigo Java 8.7: Servico.java
1 2 3 4
class Emprestimo extends Servico { private double valor ; private double taxa ; }
Cdigo Java 8.8: Emprestimo.java
1 2 3 4 5
class SeguroDeVeiculo extends Servico { private Veiculo veiculo ; private double valorDoSeguroDeVeiculo ; private double franquia ; }
Cdigo Java 8.9: SeguroDeVeiculo.java
86
www.k19.com.br
87
H ERANA
A classe genrica denominada super classe, classe base ou classe me. As classes especcas so denominadas sub classes, classes derivadas ou classes lhas. Quando o operador new aplicado em uma sub classe, o objeto construdo possuir os atributos e mtodos denidos na sub classe e na super classe.
EMPRESTIMO
new Emprestimo()
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 2 3 4 5 6 7 class Servico { // ATRIBUTOS public double calculaTaxa () { return 1 ; } }
Cdigo Java 8.10: Servico.java
1 2 3 4 5 6 7
Emprestimo e = new Emprestimo () ; SeguroDeVeiculo sdv = new SeguroDeVeiculo () ; System . out . println ( " Emprestimo : " + e . calculaTaxa () ) ; System . out . println ( " SeguroDeVeiculo : " + sdv . calculaTaxa () ) ;
Cdigo Java 8.11: Chamando o mtodo calculaTaxa()
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 especca
www.k19.com.br
87
H ERANA
88
para o servio de emprstimo, devemos acrescentar um mtodo para implementar esse clculo na classe Emprestimo.
1 2 3 4 5 6 7 class Emprestimo extends Servico { // ATRIBUTOS public double calculaTaxaDeEmprestimo () { return this . valor * .1; } }
Cdigo Java 8.12: Emprestimo.java
Para os objetos da classe Emprestimo, devemos chamar o mtodo calculaTaxaDeEmprestimo(). Para todos os outros servios, devemos chamar o mtodo calculaTaxa(). Mesmo assim, nada impediria que o mtodo calculaTaxa() fosse chamado em um objeto da classe Emprestimo, pois ela herda esse mtodo da classe Servico. Dessa forma, existe o risco de algum erroneamente chamar o mtodo incorreto. Seria mais seguro substituir a implementao do mtodo calculaTaxa() herdado da classe Servico na classe Emprestimo. Para isso, basta escrever o mtodo calculaTaxa() tambm na classe Emprestimo com a mesma assinatura que ele possui na classe Servico.
1 2 3 4 5 6 7 class Emprestimo extends Servico { // ATRIBUTOS public double calculaTaxa () { return this . valor * .1; } }
Cdigo Java 8.13: Emprestimo.java
Os mtodos das classes especcas tm prioridade sobre os mtodos das classes genricas. Em outras palavras, se o mtodo chamado existe na classe lha ele ser chamado, caso contrrio o mtodo ser procurado na classe me. Quando denimos um mtodo com a mesma assinatura na classe base e em alguma classe derivada, estamos aplicando o conceito de Reescrita de Mtodo.
Fixo + Especco
Suponha que o preo de um servio a soma de um valor xo 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 especca, podemos reescrever o mtodo calculaTaxa().
1 2 3 4 5 6 7 class Emprestimo extends Servico { // ATRIBUTOS public double calculaTaxa () { return 5 + this . valor * .1; } }
88
www.k19.com.br
89
H ERANA
1 2 3 4 5 6 7
class SeguraDeVeiculo extends Servico { // ATRIBUTOS public double calculaTaxa () { return 5 + this . veiculo . getTaxa () * } }
Cdigo Java 8.15: SeguraDeVeiculo.java
. 5;
Se o valor xo dos servios for atualizado, todas as classes especcas devem ser modicadas. Outra alternativa seria criar um mtodo na classe Servico para calcular o valor xo de todos os servios e cham-lo dos mtodos reescritos nas classes especcas.
1 2 3 4 5 class Servico { public double calculaTaxa () { return 5 ; } }
Cdigo Java 8.16: Servico.java
1 2 3 4 5 6 7
class Emprestimo extends Servico { // ATRIBUTOS public double calculaTaxa () { return super . calculaTaxa () + this . valor * } }
Cdigo Java 8.17: Emprestimo.java
.1;
Dessa forma, quando o valor padro do preo dos servios alterado, basta modicar 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 especcas.
1 2 3 4 5 6 7 class Servico { // ATRIBUTOS public Servico () { System . out . println ( " Servico " ) ; } }
Cdigo Java 8.18: Servico.java
www.k19.com.br
89
H ERANA
1 2 3 4 5 6 7 class Emprestimo extends Servico { // ATRIBUTOS public Emprestimo () { System . out . println ( " Emprestimo " ) ; } }
Cdigo Java 8.19: Emprestimo.java
90
Por padro, todo construtor chama o construtor sem argumentos da classe me se no existir nenhuma chamada de construtor explcita.
Exerccios de Fixao
1
2 Dena uma classe para modelar os funcionrios do banco. Sabendo que todo funcionrio possui nome e salrio, inclua os getters e setters dos atributos.
1 2 3 4 5 6
class Funcionario { private String nome ; private double salario ; // GETTERS AND SETTERS }
Cdigo Java 8.20: Funcionario.java
3 Crie uma classe para cada tipo especco de funcionrio herdando da classe Funcionario. Considere apenas trs tipos especcos 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.
1 2 3 4 5 6
class Gerente extends Funcionario { private String usuario ; private String senha ; // GETTERS AND SETTERS }
Cdigo Java 8.21: Gerente.java
1 2 3 4 5
class Telefonista extends Funcionario { private int estacaoDeTrabalho ; // GETTERS AND SETTERS }
Cdigo Java 8.22: Telefonista
1 2 3 4 5
class Secretaria extends Funcionario { private int ramal ; // GETTERS AND SETTERS }
Cdigo Java 8.23: Secretaria.java
90
www.k19.com.br
91
4
H ERANA
Teste o funcionamento dos trs tipos de funcionrios criando um objeto de cada uma das classes: Gerente, Telefonista e Secretaria.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 class TestaFuncionarios { public static void main ( String [] args ) { Gerente g = new Gerente () ; g . setNome ( " Rafael Cosentino " ) ; g . setSalario (2 ); g . setUsuario ( " rafael . cosentino " ) ; g . setSenha ( " 12345 " ) ; Telefonista t = new Telefonista () ; t . setNome ( " Carolina Mello " ) ; t . setSalario (1 ); t . setEstacaoDeTrabalho (13) ; Secretaria s = new Secretaria () ; s . setNome ( " Tatiane Andrade " ) ; s . setSalario (15 ) ; s . setRamal (198) ; System . out . println ( " GERENTE " ) ; System . out . println ( " Nome : " + g . getNome () ) ; System . out . println ( " Salrio : " + g . getSalario () ) ; System . out . println ( " Usurio : " + g . getUsuario () ) ; System . out . println ( " Senha : " + g . getSenha () ) ; System . out . println ( " TELEFONISTA " ) ; System . out . println ( " Nome : " + t . getNome () ) ; System . out . println ( " Salrio : " + t . getSalario () ) ; System . out . println ( " Estacao de trabalho : " + t . getEstacaoDeTrabalho () ) ; System . out . println ( " SECRETARIA " ) ; System . out . println ( " Nome : " + s . getNome () ) ; System . out . println ( " Salrio : " + s . getSalario () ) ; System . out . println ( " Ramal : " + s . getRamal () ) ; } }
Cdigo Java 8.24: TestaFuncionarios.java
Execute o teste!
5 Suponha que todos os funcionrios recebam uma bonicao de 10% do salrio. Acrescente um mtodo na classe Funcionario para calcular essa bonicao.
1 2 3 4 5 6 7 8 9 1
class Funcionario { private String nome ; private double salario ; public double calculaBonificacao () { return this . salario * .1; } // GETTERS AND SETTERS }
Cdigo Java 8.25: Funcionario.java
Altere a classe TestaFuncionarios para imprimir a bonicao de cada funcionrio, alm dos dados que j foram impressos. Depois, execute o teste novamente.
6
1 2 3
class TestaFuncionarios { public static void main ( String [] args ) { Gerente g = new Gerente () ;
www.k19.com.br
91
H ERANA
4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 36 37 38 g . setNome ( " Rafael Cosentino " ) ; g . setSalario (2 ); g . setUsuario ( " rafael . cosentino " ) ; g . setSenha ( " 12345 " ) ; Telefonista t = new Telefonista () ; t . setNome ( " Carolina Mello " ) ; t . setSalario (1 ); t . setEstacaoDeTrabalho (13) ; Secretaria s = new Secretaria () ; s . setNome ( " Tatiane Andrade " ) ; s . setSalario (15 ) ; s . setRamal (198) ; System . out . println ( " GERENTE " ) ; System . out . println ( " Nome : " + g . getNome () ) ; System . out . println ( " Salrio : " + g . getSalario () ) ; System . out . println ( " Usurio : " + g . getUsuario () ) ; System . out . println ( " Senha : " + g . getSenha () ) ; System . out . println ( " Bonificao : " + g . calculaBonificacao () ) ; System . out . println ( " TELEFONISTA " ) ; System . out . println ( " Nome : " + t . getNome () ) ; System . out . println ( " Salrio : " + t . getSalario () ) ; System . out . println ( " Estacao de trabalho : " + t . getEstacaoDeTrabalho () ) ; System . out . println ( " Bonificao : " + t . calculaBonificacao () ) ; System . out . println ( " SECRETARIA " ) ; System . out . println ( " Nome : " + s . getNome () ) ; System . out . println ( " Salrio : " + s . getSalario () ) ; System . out . println ( " Ramal : " + s . getRamal () ) ; System . out . println ( " Bonificao : " + s . calculaBonificacao () ) ; } }
Cdigo Java 8.26: TestaFuncionarios.java
92
Suponha que os gerentes recebam uma bonicao maior que os outros funcionrios. Reescreva o mtodo calculaBonificacao() na classe Gerente. Depois, compile e execute o teste novamente.
7
1 2 3 4 5 6 7 8 9 1
class Gerente extends Funcionario { private String usuario ; private String senha ; public double calculaBonificacao () { return this . getSalario () * .6 + 1 } // GETTERS AND SETTERS }
Cdigo Java 8.27: Gerente.java
Exerccios Complementares
Dena na classe Funcionario um mtodo para imprimir na tela o nome, salrio e bonicao dos funcionrios.
1
Reescreva o mtodo que imprime os dados dos funcionrios nas classes Gerente, Telefonista e Secretaria para acrescentar a impresso dos dados especcos de cada tipo de funcionrio.
2 3
92
CAPTULO
Cdigo Java 9.1: ControleDePonto.java
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 denir uma classe para implementar o funcionamento de um relgio de ponto.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 class ControleDePonto { public void registraEntrada ( Gerente g ) { SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ; Date agora = new Date () ; System . out . println ( " ENTRADA : " + g . getCodigo () ) ; System . out . println ( " DATA : " + sdf . format ( agora ) ) ; } public void registraSaida ( Gerente g ) { SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ; Date agora = new Date () ; System . out . println ( " SADA : " + g . getCodigo () ) ; System . out . println ( " DATA : " + sdf . format ( agora ) ) ; } }
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 modicao de todos os mtodos da classe ControleDePonto. Alm disso, se o banco denir 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.k19.com.br
93
P OLIMORFISMO
94
TELEFONISTAS
SECRETRIAS
TELEFONISTAS
SECRETRIAS
GERENTES
GERENTES
1 2 3 4 5 6
class Gerente extends Funcionario { private String usuario ; private String senha ; // GETTERS AND SETTERS }
Cdigo Java 9.3: Gerente.java
1 2 3 4 5
class Telefonista extends Funcionario { private int ramal ; // GETTERS AND SETTERS }
Cdigo Java 9.4: Telefonista.java
94
www.k19.com.br
95
P OLIMORFISMO
UM (extends)
Alm de gerar reaproveitamento de cdigo, a utilizao de herana permite que objetos criados a partir das classes especcas 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 2 class Gerente extends Funcionario // TODO Gerente UM Funcionario
Cdigo Java 9.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 // Criando um objeto da classe Gerente Gerente g = new Gerente () ; // Tratando um gerente como um objeto da classe Funcionario Funcionario f = g ;
Cdigo Java 9.6: Generalizando
Em alguns lugares do sistema do banco ser mais vantajoso tratar um objeto da classe Gerente como um objeto da classe Funcionario.
www.k19.com.br
95
P OLIMORFISMO
12 13 14 15 16 17 18 SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ; Date agora = new Date () ; System . out . println ( " SADA : " + f . getCodigo () ) ; System . out . println ( " DATA : " + sdf . format ( agora ) ) ; } }
Cdigo Java 9.7: ControleDePonto.java
96
Os mtodos registraEntrada() e registraSaida() recebem referncias de objetos da classe Funcionario como parmetro. Consequentemente, podem receber referncias de objetos de qualquer classe que deriva direta ou indiretamente da classe Funcionario. A capacidade de tratar objetos criados a partir das classes especcas como objetos de uma classe genrica chamada de polimorsmo. Aplicando a ideia do polimorsmo no controle de ponto, facilitamos a manuteno da classe
FUNCIONRIOS
TELEFONISTAS
GERENTES
SECRETRIAS
FUNCIONRIOS
Exerccios de Fixao
1 2
Crie um projeto no Eclipse chamado Polimorsmo. Dena uma classe genrica para modelar as contas do banco.
class Conta { private double saldo ; // GETTERS AND SETTERS }
Cdigo Java 9.8: Conta.java
1 2 3 4 5
96
www.k19.com.br
97
3
P OLIMORFISMO
Dena duas classes especcas para dois tipos de contas do banco: poupana e corrente.
class ContaPoupanca extends Conta { private int diaDoAniversario ; // GETTERS AND SETTERS }
Cdigo Java 9.9: ContaPoupanca.java
1 2 3 4 5
1 2 3 4 5
class ContaCorrente extends Conta { private double limite ; // GETTERS AND SETTERS }
Cdigo Java 9.10: ContaCorrente.java
1 2 3 4 5 6 7 8 9 1 11 12 13
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15
Exerccios Complementares
97
www.k19.com.br
P OLIMORFISMO
98
1 2
Implemente duas classes especcas para modelar dois tipos particulares de funcionrios do banco: os gerentes e as telefonistas. 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.
98
www.k19.com.br
CAPTULO
C LASSES A BSTRATAS
10
Classes Abstratas
No banco, todas as contas so de um tipo especco. Por exemplo, conta poupana, conta corrente ou conta salrio. Essas contas poderiam ser modeladas atravs das seguintes classes utilizando o conceito de herana:
1 2 3 4 5 class Conta { // Atributos // Construtores // Mtodos }
Cdigo Java 10.1: Conta.java
1 2 3 4 5
1 2 3 4 5
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 10.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 dene uma conta que de fato existe no domnio do banco. Ela apenas serve como base para denir as contas concretos.
www.k19.com.br
99
C LASSES A BSTRATAS
100
No faz sentido criar um objeto da classe Conta pois estaramos instanciado um objeto que no suciente 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 denir uma classe abstrata, basta adicionar o modicador abstract.
1 2 3 4 5 abstract class Conta { // Atributos // Construtores // Mtodos }
Cdigo Java 10.5: Conta.java
Todo cdigo que tenta criar um objeto de uma classe abstrata no compila.
1 2 // Erro de compilao Conta c = new Conta () ;
Cdigo Java 10.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 especcas sem nem ser reaproveitado. Poderamos, simplesmente, no denir 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 denir 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, denimos um mtodo abstrato para gerar extratos detalhados. Um mtodo abstrato no possui corpo (implementao).
1 2 3 4 5 6 abstract class Conta { // Atributos // Construtores // Mtodos public abstract void imprimeExtratoDetalhado () ;
100
www.k19.com.br
101
7 }
Cdigo Java 10.7: Conta.java
C LASSES A BSTRATAS
As classes concretas que derivam direta ou indiretamente da classe Conta devem possuir uma implementao para o mtodo imprimeExtratoDetalhado().
1 2 3 4 5 6 7 8 9 1 11 12 13 14 class ContaPoupanca extends Conta { private int diaDoAniversario ; public void imprimeExtratoDetalhado () { System . out . println ( " EXTRATO DETALHADO DE CONTA POUPANA " ) ; SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ; Date agora = new Date () ; System . out . println ( " DATA : " + sdf . format ( agora ) ) ; System . out . println ( " SALDO : " + this . getSaldo () ) ; System . out . println ( " ANIVERSRIO : " + this . diaDoAniversario ) ; } }
Cdigo Java 10.8: ContaPoupanca.java
Se uma classe concreta derivada da classe Conta no possuir uma implementao do mtodo imprimeExtratoDetalhado() ela no compilar.
1 2 3 4 // ESSA CLASSE NO COMPILA class ContaPoupanca extends Conta { }
Cdigo Java 10.9: ContaPoupanca.java
Exerccios de Fixao
1 2
Crie um projeto no eclipse chamado Classes-Abstratas. Dena uma classe genrica para modelar as contas do banco.
class Conta { private double saldo ; // GETTERS AND SETTERS }
Cdigo Java 10.10: Conta.java
1 2 3 4 5
1 2 3 4 5 6 7 8 9
www.k19.com.br
101
C LASSES A BSTRATAS
102
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7
8 9
O que acontece com a classe ContaPoupanca? Dena uma implementao do mtodo imprimeExtratoDetalhado() na classe ContaPoupanca.
import java . text . SimpleDateFormat ; import java . util . Date ; class ContaPoupanca extends Conta { private int diaDoAniversario ; public void imprimeExtratoDetalhado () { System . out . println ( " EXTRATO DETALHADO DE CONTA POUPANA " ) ;
1 2 3 4 5 6 7 8 9
102
www.k19.com.br
103
1 11 12 13 14 15 16 17 SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ; Date agora = new Date () ; System . out . println ( " DATA : " + sdf . format ( agora ) ) ; System . out . println ( " SALDO : " + this . getSaldo () ) ; System . out . println ( " ANIVERSRIO : " + this . diaDoAniversario ) ; } }
Cdigo Java 10.16: ContaPoupanca
C LASSES A BSTRATAS
10
1 2 3 4 5 6 7 8 9
c . imprimeExtratoDetalhado () ; } }
Cdigo Java 10.17: TestaConta.java
Exerccios Complementares
1 2
Crie um objeto da classe que modela os funcionrios do banco e utilize os mtodos de acesso com nomes padronizados para alterar os valores dos atributos. Torne a classe que modela os funcionrios do banco abstrata e verique o que acontece na classe de teste.
3 4 5 6
Dena uma classe para modelar os gerentes do nosso banco. Altere a classe de teste e crie um objeto da classe que modela os gerentes.
Dena um mtodo abstrato na classe que modela os funcionrios para calcular a bonicao dos colaboradores.
7 8
O que acontece com a classe que modela os gerentes? Implemente o mtodo que calcula a bonicao na classe que modela os gerentes.
9 Altere a classe de teste para que o mtodo que calcula a bonicao seja chamada e o valor seja impresso na tela.
www.k19.com.br
103
C LASSES A BSTRATAS
104
104
www.k19.com.br
CAPTULO
Figura 11.1: Tomadas despadronizadas
I NTERFACES
11
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 innidade 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.k19.com.br
105
I NTERFACES
106
(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 denidos pelo governo. Um padro denido atravs de especicaes ou contratos. Nas aplicaes orientadas a objetos, podemos criar um contrato para denir 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 denir uma interface (contrato) para padronizar as assinaturas dos mtodos oferecidos pelos objetos que representam as contas do banco.
1 2 3 4 interface Conta { void deposita ( double valor ) ; void saca ( double valor ) ; }
Cdigo Java 11.1: Conta.java
Os mtodos de uma interface no possuem corpo (implementao) pois sero implementados nas classes vinculadas a essa interface. Todos os mtodos de uma interface devem ser pblicos e abstratos. Os modicadores public e abstract so opcionais. As classes que denem os diversos tipos de contas que existem no banco devem implementar (assinar) a interface Conta.
1 2 3 4 5 6 7 8 class ContaPoupanca implements Conta { public void deposita ( double valor ) { // implementacao } public void saca ( double valor ) { // implementacao } }
Cdigo Java 11.2: ContaPoupanca.java
1 2 3 4 5 6 7 8
class ContaCorrente implements Conta { public void deposita ( double valor ) { // implementacao } public void saca ( double valor ) { // implementacao } }
Cdigo Java 11.3: ContaCorrente.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.
106
www.k19.com.br
107
1 2 3 4 5 6 // Esta classe no compila porque ela no implementou o mtodo saca () class ContaCorrente implements Conta { public void deposita ( double valor ) { // implementacao } }
Cdigo Java 11.4: ContaCorrente.java
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.
Polimorsmo
Se uma classe implementa uma interface, podemos aplicar a ideia do polimorsmo assim como quando aplicamos herana. Dessa forma, outra vantagem da utilizao de interfaces o ganho do polimorsmo. 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 11.5: Polimorsmo
Alm disso, podemos passar uma varivel do tipo ContaCorrente para um mtodo que o parmetro seja do tipo Conta.
1 2 3 4 5 class GeradorDeExtrato { public void geraExtrato ( Conta c ) { // implementao } }
Cdigo Java 11.6: GeradorDeExtrato.java
1 2 3
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.k19.com.br
107
I NTERFACES
108
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 polimorsmo. 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 2 3 4 5 class AutenticadorDeUsuario { public boolean autentica (??? u ) { // implementao } }
Cdigo Java 11.8: AutenticadorDeUsuario.java
109
I NTERFACES
classe Empresa. Para obter polimorsmo entre os objetos dessas duas classes somente com herana, 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 polimorsmo desejado.
Agora, conseguimos denir 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 2 3 4 5 class AutenticadorDeUsuario { public boolean autentica ( Usuario u ) { // implementao } }
Cdigo Java 11.9: AutenticadorDeUsuario.java
Exerccios de Fixao
1 2
Crie um projeto no eclipse chamado Interfaces. Dena uma interface para padronizar as assinaturas dos mtodos das contas do banco.
interface Conta { void deposita ( double valor ) ; void saca ( double valor ) ; double getSaldo () ; }
Cdigo Java 11.10: Conta.java
1 2 3 4 5
1 2 3
www.k19.com.br
109
I NTERFACES
4 5 6 7 8 9 1 11 12 13 14 15 16
110
public void deposita ( double valor ) { this . saldo += valor - this . taxaPorOperacao ; } public void saca ( double valor ) { this . saldo -= valor + this . taxaPorOperacao ; } public double getSaldo () { return this . saldo ; } }
Cdigo Java 11.11: ContaCorrente.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15
class ContaPoupanca implements Conta { private double saldo ; public void deposita ( double valor ) { this . saldo += valor ; } public void saca ( double valor ) { this . saldo -= valor ; } public double getSaldo () { return this . saldo ; } }
Cdigo Java 11.12: ContaPoupanca.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15
5 Altere a assinatura do mtodo deposita() na classe ContaCorrente. Voc pode acrescentar um r no nome do mtodo. O que acontece? Obs: desfaa a alterao depois deste exerccio. 6
Crie um gerador de extratos com um mtodo que pode trabalhar com todos os tipos de conta.
class GeradorDeExtrato { public void geraExtrato ( Conta c ) { System . out . println ( " EXTRATO " ) ; System . out . println ( " SALDO : " + c . getSaldo () ) ; } }
1 2 3 4 5 6
110
www.k19.com.br
111
I NTERFACES
1 2 3 4 5 6 7 8 9 1 11 12 13
www.k19.com.br
111
I NTERFACES
112
112
www.k19.com.br
CAPTULO
Cdigo Java 12.1: Conta.java Terminal 12.1: Salvando o arquivo na pasta com o mesmo do pacote
PACOTES
12
Organizao
O cdigo fonte de uma aplicao denido 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 modic-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 2 3 4 5 package sistema ; class Conta { // corpo da classe }
2. O segundo passo salvar o arquivo dentro de uma pasta com mesmo nome do pacote denido 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.k19.com.br
113
PACOTES
114
Podemos criar pacotes dentro de pacotes. No cdigo fonte os sub-pacotes so denidos com o operador ..
1 2 3 4 5 6 // Arquivo : Conta . java package sistema . contas ; class Conta { // corpo da classe }
Cdigo Java 12.2: Conta.java
Alm disso, devemos criar uma estrutura de pastas que reita os sub-pacotes denidos no cdigo fonte.
K19 / workspace / Pacotes / src / sistema / contas$ ls Conta . java
114
www.k19.com.br
115
1 2 3 4 5 package sistema . contas ; class Conta { // corpo da classe }
Cdigo Java 12.4: Conta.java
PACOTES
1 2 3 4 5
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
1 2 3 4 5
1 2 3 4 5
package sistema . clientes ; class Cliente { private sistema . contas . Conta conta ; }
Cdigo Java 12.7: 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 2 3 4 5 6 // Arquivo : Cliente . java package sistema . clientes ; import sistema . contas . Conta ; class Cliente {
www.k19.com.br
115
PACOTES
7 8 private Conta conta ; }
Cdigo Java 12.8: Cliente.java
116
Podemos importar vrias classes ou interfaces no mesmo arquivo. As declaraes de importe devem aparecer aps a declarao de pacote e antes das declaraes de classes ou interfaces.
Conito 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 conito 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 denio dos nomes dos pacotes. Essa conveno anloga aos domnios da internet.
1 package br . com . k19 . sistema . contas ;
Cdigo Java 12.9: Padro de nomenclatura de pacotes
Nveis de visibilidade
No Java, h quatro nveis de visibilidade: privado, padro, protegido e pblico. Podemos denir os nveis privado, protegido e pblico com os modicadores private, protected e public respectivamente. Quando nenhum modicador de visibilidade utilizado o nvel padro aplicado.
Privado
O nvel privado aplicado com o modicador 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 modicador 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.
116
www.k19.com.br
117
PACOTES
Protegido
O nvel protegido aplicado com o modicador protected. O que pode ser protegido? Atributos, construtores, mtodos, classes aninhadas ou interfaces aninhadas. Os itens em nvel de visibilidade protegido s podem ser acessados por cdigo escrito em classes do mesmo pacote da classe na qual eles foram declarados ou por classes derivadas.
Pblico
O nvel pblico aplicado quando o modicador public utilizado. O que pode ser pblico? Atributos, construtores, mtodos, classes de todos os tipos e interfaces de todos os tipos. Os itens em nvel de visibilidade pblico podem ser acessados de qualquer lugar do cdigo da aplicao.
Exerccios de Fixao
1 2 3
Crie um projeto no eclipse chamado Pacotes. Crie um pacote chamado sistema e outro chamado testes. Faa uma classe para modelar as contas no pacote sistema.
package sistema ; public class Conta { private double saldo ; public void deposita ( double valor ) { this . saldo += valor ; } // GETTERS AND SETTERS }
Cdigo Java 12.10: Conta.java
1 2 3 4 5 6 7 8 9 1 11
1 2 3 4 5 6 7 8 9 1 11
www.k19.com.br
117
PACOTES
118
5 Retire o modicador public da classe Conta e observe o erro de compilao na classe Teste. Importante: faa a classe Conta ser pblica novamente.
118
www.k19.com.br
CAPTULO
Figura 13.1: Documentao Java SE 7
D OCUMENTAO
13
Na plataforma Java SE 7, h cerca de 4000 classes e interfaces disponveis para utilizarmos em nossas aplicaes. Podemos visualizar a documentao dessas classes e interfaces na seguinte url http://docs.oracle.com/javase/7/docs/api/.
No necessrio car assustado com a quantidade de classes e interfaces contidas na plataforma Java SE 7. Na prtica, utilizamos diretamente apenas uma pequena parte dessa gigantesca biblioteca no desenvolvimento de uma aplicao. Alm das bibliotecas da plataforma Java SE 7, h vrias outras bibliotecas que podemos utilizar em nossas aplicaes. Por exemplo, algumas aplicaes utilizam a biblioteca JFreeChart para gerar grcos prossionais. Essa biblioteca tambm possui uma documentao com a mesma estrutura da documentao da plataforma Java SE 7. Consulte a url http://www.jfree.org/jfreechart/ api/javadoc/index.html.
www.k19.com.br
119
D OCUMENTAO
120
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 4 5 /* * * * Comentrio javadoc * */
Cdigo Java 13.1: Comentrio javadoc
121
1 2 3 4 5 6 /* * * * Documentao do pacote br . com . k19 . contas * */ package br . com . k19 . contas ;
Cdigo Java 13.2: package-info.java
D OCUMENTAO
Podemos denir 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 1 11 12 13 14 15 16 17 18 package br . com . k19 . contas ; /* * * * Documentacao da classe br . com . k19 . contas . Conta * * @author Rafael Cosentino * * @author Jonas Hirata * * @author Marcelo Martins * * @version 1. * */ public class Conta { // corpo da classe }
Cdigo Java 13.4: Documentacao.java
Documentando um atributo
Para documentar um atributo, basta adicionar um comentrio javadoc imediatamente acima da declarao do atributo que desejamos documentar.
1 /* *
www.k19.com.br
121
D OCUMENTAO
2 3 4 5 6 * * Documentacao do atributo numero * */ private int numero ;
Cdigo Java 13.5: Documentando um atributo
122
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 4 5 6 7 8 9 1 11 12 13 14 15 16 /* * * * Documentacao do construtor * * @param numero * documentao do parmetro numero * * @throws IllegalArgumentException * documentao da situao que gera a exception IllegalArgumentException */ public Conta ( int numero ) { if ( numero < ) { throw new IllegalArgumentException ( " nmero negativo " ) ; } this . numero = numero }
Cdigo Java 13.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 4 5 6 7 8 9 1 /* * * * Documentacao do mtodo calculaTaxaDeEmprestimo * * @param valor * documentao do parmetro valor * * @throws IllegalArgumentException * documentao da situao que gera a exception IllegalArgumentException *
122
www.k19.com.br
123
11 12 13 14 15 * @return documentao do valor de retorno no mtodo */ public double calculaTaxaDeEmprestimo ( double valor ) { // corpo do mtodo }
Cdigo Java 13.7: Documentando um mtodo
D OCUMENTAO
Exerccios de Fixao
1
2 Adicione um pacote chamado br.com.k19.contas e outro chamado br.com.k19.funcionarios no projeto Documentacao. 3 Crie um arquivo no pacote br.com.k19.contas chamado package-info.java com o seguinte contedo.
1 2 3 4
1 2 3 4
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23
www.k19.com.br
123
D OCUMENTAO
24 25 26 27 28 29 3 31 32 33 34 35 36 37 38 39 4 41 42 43 44 45 * documentao do atributo numero * * @throws IllegalArgumentException * documentao da situao que gera a exception * IllegalArgumentException */ public Conta ( int numero ) { if ( numero < ) { throw new IllegalArgumentException ( " nmero negativo " ) ; } this . numero = numero ; } /* * * Documentao do mtodo getNumero * * @return documentao do valor de retorno */ public int getNumero () { return numero ; } }
124
124
www.k19.com.br
125
D OCUMENTAO
www.k19.com.br
125
D OCUMENTAO
126
126
www.k19.com.br
CAPTULO
Cdigo Java 14.1: Utilizando cdigos de erro Cdigo Java 14.2: Cdigo de erro e retorno lgico
E XCEPTIONS
14
Como erros podem ocorrer durante a execuo de uma aplicao, devemos denir 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 2 3 4 5 6 7 8 int deposita ( double valor ) { if ( valor < ) { return 1 7; // cdigo de erro para valor negativo } else { this . saldo += valor ; return ; // sucesso } }
Utilizar cdigos de erro exige uma vasta documentao dos mtodos para explicar o que cada cdigo signica. 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 2 3 4 5 6 7 8 ??? geraRelatorio () { if (...) { return 2 ; // cdigo de erro tipo1 } else { Relatorio relatorio = ... return relatorio ; } }
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 denir 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 classic-los. A classe Throwable modela todos os tipos de erros de execuo.
www.k19.com.br
127
E XCEPTIONS
128
H duas subclasses de Throwable: Error e Exception. A subclasse Error dene 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 dene erros para os quais as aplicaes normalmente tm condies de denir um tratamento.
Checked e Unchecked
As exceptions so classicadas em checked e unchecked. Para identicar 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.
129
1 2 3 4 5 6 7 8 public void deposita ( double valor ) { if ( valor < ) { IllegalArgumentException erro = new IllegalArgumentException () ; throw erro ; } else { ... } }
Cdigo Java 14.3: Lanado uma unchecked exception
E XCEPTIONS
Capturando exceptions
Quando queremos capturar exceptions, devemos utilizar o comando try-cacth.
1 2 3 4 5 6 7 8 9 1 11 class Teste { public static void main ( String [] args ) { Conta c = new Conta () ; try { c . deposita (1 ) ; } catch ( IllegalArgumentException e ) { System . out . println ( " Houve um erro ao depositar " ) ; } } }
Cdigo Java 14.5: Capturando um tipo de exceptions
Podemos encadear vrios blocos catch para capturar exceptions de classes diferentes.
1 2 3 4 5 class Teste { public static void main ( String [] args ) { Conta c = new Conta () ; try {
www.k19.com.br
129
E XCEPTIONS
6 7 8 9 1 11 12 13 c . deposita (1 ) ; } catch ( IllegalArgumentException e ) { System . out . println ( " Houve uma IllegalArgumentException ao depositar " ) ; } catch ( SQLException e ) { System . out . println ( " Houve uma SQLException ao depositar " ) ; } } }
Cdigo Java 14.6: Capturando dois tipos de exceptions
130
Exerccios de Fixao
1 2
Crie um projeto no eclipse chamado Exceptions. Crie uma classe para modelar os funcionrios do sistema do banco.
class Funcionario { private double salario ; public void aumentaSalario ( double aumento ) { if ( aumento < ) { IllegalArgumentException erro = new IllegalArgumentException () ; throw erro ; } } }
Cdigo Java 14.7: Funcionario.java
1 2 3 4 5 6 7 8 9 1
1 2 3 4 5 6
1 2 3 4 5 6 7 8 9 1 11
130
www.k19.com.br
CAPTULO
Figura 15.1: A classe Object Cdigo Java 15.1: Repositorio.java
O BJECT
15
Todas as classes derivam direta ou indiretamente da classe Object. Consequentemente, todo contedo denido nessa classe estar presente em todos os objetos. Alm disso, qualquer referncia pode ser armazenada em uma varivel do tipo Object. Ou seja, a ideia do polimorsmo pode ser aplicada para criar mtodos genricos que trabalham com objetos de qualquer classe.
Polimorsmo
Aproveitando o polimorsmo gerado pela herana da classe Object, possvel criar uma classe para armazenar objetos de qualquer tipo como se fosse um repositrio de objetos.
1 2 3 class Repositorio { // codigo da classe }
Um array de objetos pode ser utilizado como estrutura bsica para manter os objetos no repositrio.
1 2 3 class Repositorio { private Object [] objetos = new Object [1 } ];
Alguns mtodos podem ser criados para formar a interface do repositrio. Por exemplo, mtodos para adicionar, retirar e pesquisar elementos.
www.k19.com.br
131
O BJECT
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 class Repositorio { private Object [] objetos = new Object [1 public void adiciona ( Object o ) { // implementacao } public void remove ( Object o ) { // implementacao } public Object pega ( int posicao ) { // implementacao } }
Cdigo Java 15.3: Repositorio.java
132
];
Com esses mtodos o repositrio teria a vantagem de armazenar objetos de qualquer tipo. Porm, na compilao, no haveria garantia sobre os tipos especcos. Em outras palavras, j que objetos de qualquer tipo podem ser armazenados no repositrio ento objetos de qualquer tipo podem sair dele.
1 2 3 Repositorio repositorio = new Repositorio () ; repositorio . adiciona ( " Rafael " ) ; Object o = repositorio . pega ( ) ;
Cdigo Java 15.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 Repositorio repositorio = new Repositorio () ; repositorio . adiciona ( " Rafael " ) ; Object o = repositorio . pega ( ) ; String s = ( String ) o ;
Cdigo Java 15.5: Casting de referncia
O mtodo toString()
s vezes, necessrio trabalhar com uma descrio textual de determinados objetos. Por exemplo, suponha a seguinte classe:
1 2 3 4 5 6 class Conta { private int numero ; private double saldo ; // GETTERS E SETTERS }
Cdigo Java 15.6: Conta.java
Queremos gerar um documento no qual deve constar as informaes de determinadas contas. Podemos implementar um mtodo, na classe Conta, que gere uma descrio textual dos objetos
132
www.k19.com.br
133
O BJECT
dessa classe.
1 2 3 4 5 6 7 8 9 1 class Conta { private int numero ; private double saldo ; public String geraDescricao () { return " Conta nmero : " + this . numero + " possui saldo igual a " + this . saldo ; } // GETTERS E SETTERS }
Cdigo Java 15.7: Conta.java
A utilizao do mtodo que gera a descrio textual das contas seria mais ou menos assim:
1 2 3 Conta conta = ... String descricao = conta . geraDescrica () ; System . out . println ( descricao ) ;
Cdigo Java 15.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 especca e no hash code dos objetos.
1 2 3 Conta conta = ... String descricao = conta . toString () ; System . out . println ( descricao ) ;
Cdigo Java 15.9: Utilizando o mtodo toString()
No cdigo acima, a descrio gerada pelo mtodo toString() denido na classe Object algo semelhante string: Conta@4d5ef. Para alterar o comportamento do mtodo toString(), basta reescrev-lo na classe Conta.
1 2 3 4 5 6 7 8 9 1 class Conta { private int numero ; private double saldo ; public String toString () { return " Conta nmero : " + this . numero + " possui saldo igual a " + this . saldo ; } // GETTERS E SETTERS }
Cdigo Java 15.10: Conta.java
A vantagem em reescrever o mtodo toString() ao invs de criar um outro mtodo com o mesmo propsito que diversas classes das bibliotecas do Java utilizam o mtodo toString(). Inclusive, quando passamos uma varivel no primitiva para o mtodo println(), o toString() chamado internamente para denir o que deve ser impresso na tela.
www.k19.com.br
133
O BJECT
1 2 3 Conta conta = ... // o mtodo toString () ser chamado internamente no println () System . out . println ( conta ) ;
Cdigo Java 15.11: Utilizando o mtodo toString()
134
Outra vantagem em optar pelo mtodo toString() que ferramentas de desenvolvimento como o eclipse oferecem recursos para que esse mtodo seja reescrito automaticamente.
1 2 3 4 5 6 7 8 9 1 11
class Conta { private int numero ; private double saldo ; // mtodo gerado pelo eclipse public String toString () { return " Conta [ numero = " + numero + " , saldo = " + saldo + " ] " ; } // GETTERS E SETTERS }
Cdigo Java 15.12: Conta.java
O mtodo equals()
Para vericar 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 2 3 4 Conta c1 = ... Conta c2 = ... System . out . println ( c1 == c2 ) ;
Cdigo Java 15.13: Comparando com
134
www.k19.com.br
135
O BJECT
O operador ==, aplicado variveis no primitivas, verica 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 2 3 4 5 6 7 8 9 1 class Conta { private int numero ; private double saldo ; public boolean compara ( Conta outra ) { return this . numero == outra . numero ; } // GETTERS E SETTERS }
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 2 3 4 5 6 7 8 9 1 11 class Conta { private int numero ; private double saldo ; public boolean equals ( Object obj ) { Conta outra = ( Conta ) obj ; return this . numero == outra . numero ; } // GETTERS E SETTERS }
Porm, a reescrita do mtodo equals() deve respeitar diversas regras denidas 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.
www.k19.com.br
135
O BJECT
136
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32
class Conta { private int numero ; private double saldo ; // mtodo gerado pelo eclipse public int hashCode () { final int prime = 31; int result = 1; result = prime * result + numero ; return result ; } // mtodo gerado pelo eclipse public boolean equals ( Object obj ) { if ( this == obj ) { return true ; } if ( obj == null ) { return false ; } if (!( obj instanceof Conta ) ) { return false ; } Conta other = ( Conta ) obj ; if ( numero != other . numero ) { return false ; } return true ; } // GETTERS E SETTERS }
Exerccios de Fixao
136
www.k19.com.br
137
O BJECT
1 2
Crie um projeto no eclipse chamado Object. Adicione no projeto Object uma classe para modelar os funcionrios do banco.
class Funcionario { private String nome ; private double salario ; // GETTERS E SETTERS }
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8 9 1
Reescreva o mtodo toString() na classe Funcionario para alterar a descrio textual dos objetos que representam os funcionrios.
4
1 2 3 4 5 6 7 8 9 1 11
class Funcionario { private String nome ; private double salario ; public String toString () { return " Funcionrio : " + this . nome + " - Salrio : " + this . salario ; } // GETTERS E SETTERS }
6 Apague o toString() implementando anteriormente. Utilize os recursos do eclipse para reescrever esse mtodo automaticamente na classe Funcionario.
www.k19.com.br
137
O BJECT
138
138
www.k19.com.br
139
7
O BJECT
8 Crie dois objetos da classe Funcionario. Utilize o operador == e o mtodo equals() para compar-los.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17
class TestaFuncionario2 { public static void main ( String [] args ) { Funcionario f1 = new Funcionario () ; f1 . setNome ( " Jonas Hirata " ) ; f1 . setSalario (3 ); Funcionario f2 = new Funcionario () ; f2 . setNome ( " Jonas Hirata " ) ; f2 . setSalario (3 );
www.k19.com.br
139
O BJECT
140
10
140
www.k19.com.br
CAPTULO
Cdigo Java 16.1: string literal Cdigo Java 16.2: Comparando strings do Pool de Strings Cdigo Java 16.3: strings no literais
S TRING
16
A classe String utilizada em praticamente todas as aplicaes Java. Consequentemente, os programadores Java devem conhecer bem o funcionamento dela. A documentao da classe String pode ser consultada na url http://docs.oracle.com/javase/7/docs/api/java/lang/String.html.
Pool de Strings
A maneira mais simples para criar ou obter um objeto da classe String denir diretamente o seu contedo no cdigo fonte com ".
1 String nome = " Rafael Cosentino " ;
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 String nome1 = " Rafael Cosentino " ; String nome2 = " Rafael Cosentino " ; // imprime true System . out . println ( nome1 == nome2 ) ; // imprime true System . out . println ( nome1 . equals ( nome2 ) ) ;
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 2 3 4 String nome1 = new String ( " Rafael Cosentino " ) ; String nome2 = new String ( " Rafael Cosentino " ) ; // imprime false
www.k19.com.br
141
S TRING
5 6 7 System . out . println ( nome1 == nome2 ) ; // imprime true System . out . println ( nome1 . equals ( nome2 ) ) ;
Cdigo Java 16.4: Comparando strings fora do Pool de Strings
142
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 String nome = " Rafael Cosentino " ; nome . toUpperCase () ; // imprime Rafael Cosentino System . out . println ( nome ) ;
Cdigo Java 16.5: Pegadinha. . .
1 2 3 4 5 6
String nome = " Rafael Cosentino " ; String nomeAlterado = nome . toUpperCase () ; // imprime RAFAEL COSENTINO System . out . println ( nomeAlterado ) ;
Cdigo Java 16.6: Guardando o resultado do toUpperCase()
Mais Sobre
Podemos alterar o contedo de qualquer objeto Java de forma invasiva utilizando reection. No seria uma boa prtica utilizar esses mecanismos para forar modicaes 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.
142
www.k19.com.br
143
1 2 3 4 String nome = " K19 Treinamentos " ; // imprime 16 System . out . println ( nome . length () ) ;
Cdigo Java 16.7: length()
S TRING
toUpperCase()
O mtodo toUpperCase() utilizado para obter uma cpia de uma string com letras maisculas.
1 2 3 4 5 6 String nome = " Rafael Cosentino " ; String nomeAlterado = nome . toUpperCase () ; // imprime RAFAEL COSENTINO System . out . println ( nomeAlterado ) ;
Cdigo Java 16.8: toUpperCase()
toLowerCase()
O mtodo toLowerCase() utilizado para obter uma cpia de uma string com letras minsculas.
1 2 3 4 5 6 String nome = " Rafael Cosentino " ; String nomeAlterado = nome . toLowerCase () ; // imprime rafael cosentino System . out . println ( nomeAlterado ) ;
Cdigo Java 16.9: toLowerCase()
trim()
O mtodo trim() utilizado para obter uma cpia de uma string sem os espaos em braco do incio e do nal.
1 2 3 4 5 6 String nome = " Formao Desenvolvedor Java ";
String nomeAlterado = nome . trim () ; // imprime Formao Desenvolvedor Java System . out . println ( nomeAlterado ) ;
Cdigo Java 16.10: trim()
split()
O mtodo split() divide uma string em vrias de acordo com um delimitador e devolve um array com as strings obtidas.
www.k19.com.br
143
S TRING
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 String texto = " K11 , K12 , K21 , K22 , K23 " ; String [] cursos = texto . split ( " ," ) ; // imprime K11 System . out . println ( cursos [ ]) ; // 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]) ;
Cdigo Java 16.11: split()
144
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 ) ;
Cdigo Java 16.12: replaceAll()
Exerccios de Fixao
1 2
Crie um projeto no eclipse chamado String. Crie uma classe para testar o Pool de Strings e a comparao com == e com equals().
public class TestaPoolDeStrings { public static void main ( String [] args ) { String nome1 = " Rafael Cosentino " ; String nome2 = " Rafael Cosentino " ; // imprime true System . out . println ( nome1 == nome2 ) ; // imprime true System . out . println ( nome1 . equals ( nome2 ) ) ; String nome3 = new String ( " Rafael Cosentino " ) ; String nome4 = new String ( " Rafael Cosentino " ) ; // imprime false System . out . println ( nome3 == nome4 ) ; // imprime true System . out . println ( nome3 . equals ( nome4 ) ) ;
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18
144
www.k19.com.br
145
19 2 } }
Cdigo Java 16.13: TestaPoolDeStrings.java
S TRING
1 2 3 4 5 6 7 8 9 1 11 12 13 14
www.k19.com.br
145
S TRING
146
146
www.k19.com.br
CAPTULO
E NTRADA E S ADA
17
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 InputStream entrada = System . in ; int i ; do { i = entrada . read () ; System . out . println ( " valor lido : " + i ) ; } while ( i != -1) ;
Cdigo Java 17.1: Leitura byte a byte do teclado
O uxo 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 OutputStream saida = System . out ; saida . write (1 7) ; saida . write (49) ; saida . write (57) ; saida . flush () ;
Cdigo Java 17.2: Escrita byte a byte no console
O uxo 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.k19.com.br
147
E NTRADA E S ADA
148
A classe InputStream genrica e modela um uxo de entrada sem uma fonte especca denida. Diversas classes herdam direta ou indiretamente da classe InputStream para especicar 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 uxo de sada sem um destino especco denido. Diversas classes herdam direta ou indiretamente da classe OutputStream para especicar 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 sosticados 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 InputStream entrada = System . in ; Scanner scanner = new Scanner ( entrada ) ; while ( scanner . hasNextLine () ) { String linha = scanner . nextLine () ; System . out . println ( linha ) ; }
Cdigo Java 17.3: Leitura utilizando a classe Scanner
PrintStream
148
www.k19.com.br
149
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 sosticados para enviar dados para uma sada. Veja um exemplo de escrita no console com a classe PrintStream:
1 2 3 4 OutputStream console = System . out ; PrintStream printStream = new PrintStream ( console ) ; printStream . println ( " Curso de Java e Orientao da K19 " ) ;
Cdigo Java 17.5: Escrita utilizando PrintStream
Exerccios de Fixao
1 2
Crie um projeto no eclipse chamado EntradaSaida. Crie um teste para recuperar e imprimir na tela o contedo digitado pelo usurio no teclado.
import java . io . IOException ; import java . io . InputStream ; import java . util . Scanner ; public class LeituraDoTeclado { public static void main ( String [] args ) throws IOException { InputStream teclado = System . in ; Scanner scanner = new Scanner ( teclado ) ; while ( scanner . hasNextLine () ) { String linha = scanner . nextLine () ; System . out . println ( linha ) ; } } }
Cdigo Java 17.7: LeituraDoTeclado.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15
OBS: Para nalizar o uxo de entrado do teclado digite CTRL+D no Linux ou CTRL+Z no Windows.
3
1 2 3 4 5 6 7
public class LeituraDeArquivo { public static void main ( String [] args ) throws IOException {
www.k19.com.br
149
E NTRADA E S ADA
8 9 1 11 12 13 14 15 16 InputStream arquivo = new FileInputStream ( " entrada . txt " ) ; Scanner scanner = new Scanner ( arquivo ) ; while ( scanner . hasNextLine () ) { String linha = scanner . nextLine () ; System . out . println ( linha ) ; } } }
Cdigo Java 17.8: LeituraDeArquivo.java
150
OBS: O arquivo entrada.txt deve ser criado no diretrio raiz do projeto EntradaSaida.
4
1 2 3 4 5 6 7 8 9 1 11 12 13 14
OBS: O projeto EntradaSaida deve ser atualizado para que o arquivo saida.txt seja mostrado no eclipse.
Exerccios Complementares
1 2
Crie um teste que faa a leitura do contedo de um arquivo e grave em outro arquivo. Crie um teste que faa a leitura do teclado e grave em arquivo.
150
www.k19.com.br
CAPTULO
Cdigo Java 18.1: ArrayList Cdigo Java 18.2: LinkedList Cdigo Java 18.3: Vector
C OLLECTIONS
18
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 xa, 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 diculdades do trabalho com array podem ser superadas com estruturas de dados mais sosticadas. 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 xa o que facilita bastante o trabalho.
List a interface Java que dene 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 () ;
Podemos aplicar o polimorsmo e referenciar objetos criados a partir das classes: ArrayList,
www.k19.com.br
151
C OLLECTIONS
152
Mtodo: add(Object)
O mtodo add(Object) adiciona uma referncia no nal da lista e aceita referncias de qualquer tipo.
1 2 3 4 5 6 List list = ... list . add (258) ; list . add ( " Rafael Cosentino " ) ; list . add (1575.76) ; list . add ( " Marcelo Martins " ) ;
Cdigo Java 18.7: Adicionando elementos em uma lista
Mtodo: size()
O mtodo size() informa a quantidade de elementos armazenado na lista.
1 2 3 4 5 6 7 8 9 List list = ... list . add ( " Jonas Hirata " ) ; list . add ( " Rafael Cosentino " ) ; list . add ( " Marcelo Martins " ) ; list . add ( " Thiago Thies " ) ; // quantidade = 4 int quantidade = list . size () ;
Cdigo Java 18.9: Recuperando a quantidade de elementos de uma lista
152
www.k19.com.br
153
C OLLECTIONS
Mtodo: clear()
O mtodo clear() remove todos os elementos da lista.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 List list = ... list . add ( " Jonas Hirata " ) ; list . add ( " Rafael Cosentino " ) ; list . add ( " Marcelo Martins " ) ; list . add ( " Thiago Thies " ) ; // quantidade = 4 int quantidade = list . size () ; list . clear () ; // quantidade = quantidade = list . size () ;
Cdigo Java 18.10: Removendo todos os elementos de uma lista
Mtodo: contains(Object)
Para vericar se um elemento est contido em uma lista podemos utilizar o mtodo contains(Object)
1 2 3 4 5 6 7 8 9 1 List list = ... list . add ( " Jonas Hirata " ) ; list . add ( " Rafael Cosentino " ) ; // x = true boolean x = list . contains ( " Jonas Hirata " ) ; // x = false x = list . contains ( " Daniel Machado " ) ;
Cdigo Java 18.11: Vericando se um elemento est contido em uma lista
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 1 11 List list = ... list . add ( " Jonas Hirata " ) ; // x = true boolean x = list . contains ( " Jonas Hirata " ) ; list . remove ( " Jonas Hirata " ) ; // x = false x = list . contains ( " Jonas Hirata " ) ;
Cdigo Java 18.12: Removendo a primeira ocorrncia de um elemento em uma lista
www.k19.com.br
153
C OLLECTIONS
154
Mtodo: remove(int)
Outra forma de retirar elementos de uma lista atravs do mtodo remove(int).
1 2 3 4 5 6 7 8 9 1 11 List list = ... list . add ( " Jonas Hirata " ) ; // x = true boolean x = list . contains ( " Jonas Hirata " ) ; list . remove ( ) ; // x = false x = list . contains ( " Jonas Hirata " ) ;
Cdigo Java 18.13: Removendo um elemento pela sua posio em uma lista
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 List list = ... list . add ( " Jonas Hirata " ) ; // nome = " Jonas Hirata " String nome = list . get ( ) ;
Cdigo Java 18.14: Recuperando o elemento de uma determinada posio de uma lista
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 List list = ... list . add ( " Jonas Hirata " ) ; // indice = int indice = list . indexOf ( " Jonas Hirata " ) ;
Cdigo Java 18.15: Descobrindo o ndice da primeira ocorrncia de um elemento em uma lista
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.
154
www.k19.com.br
155
C OLLECTIONS
Operao Adicionar ou Remover do nal 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
1 2
Crie um projeto no eclipse chamado Collections. Vamos calcular o tempo das operaes principais das listas.
import java . util . ArrayList ; import java . util . LinkedList ; import java . util . List ; public class TestaAdicionaNoFinal { public static void main ( String [] args ) { ArrayList arrayList = new ArrayList () ; LinkedList linkedList = new LinkedList () ; long tempo = TestaAdicionaNoFinal . adicionaNoFinal ( arrayList ) ; System . out . println ( " ArrayList : " + tempo + " ms " ) ; tempo = TestaAdicionaNoFinal . adicionaNoFinal ( linkedList ) ; System . out . println ( " LinkedList : " + tempo + " ms " ) ; } public static long adicionaNoFinal ( List lista ) { long inicio = System . currentTimeMillis () ; int size = 1 ;
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31
for ( int i = ; i < size ; i ++) { lista . add ( i ) ; } long fim = System . currentTimeMillis () ; return fim - inicio ; } }
Cdigo Java 18.16: TestaAdicionaNoFinal.java
1 2 3 4 5 6 7 8 9 1 11 12
import java . util . ArrayList ; import java . util . LinkedList ; import java . util . List ; public class TestaAdicionaNoComeco { public static void main ( String [] args ) { ArrayList arrayList = new ArrayList () ; LinkedList linkedList = new LinkedList () ; long tempo = TestaAdicionaNoComeco . adicionaNoComeco ( arrayList ) ; System . out . println ( " ArrayList : " + tempo + " ms " ) ;
www.k19.com.br
155
C OLLECTIONS
13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 tempo = TestaAdicionaNoComeco . adicionaNoComeco ( linkedList ) ; System . out . println ( " LinkedList : " + tempo + " ms " ) ; } public static long adicionaNoComeco ( List lista ) { long inicio = System . currentTimeMillis () ; int size = 1 ;
156
for ( int i = ; i < size ; i ++) { lista . add ( , i ) ; } long fim = System . currentTimeMillis () ; return fim - inicio ; } }
Cdigo Java 18.17: TestaAdicionaNoComeco.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 36
import java . util . ArrayList ; import java . util . LinkedList ; import java . util . List ; public class TestaGet { public static void main ( String [] args ) { ArrayList arrayList = new ArrayList () ; LinkedList linkedList = new LinkedList () ; long tempo = TestaGet . get ( arrayList ) ; System . out . println ( " ArrayList : " + tempo + " ms " ) ; tempo = TestaGet . get ( linkedList ) ; System . out . println ( " LinkedList : " + tempo + " ms " ) ; } public static long get ( List lista ) { int size = 1 ;
for ( int i = ; i < size ; i ++) { lista . add ( i ) ; } long inicio = System . currentTimeMillis () ; for ( int i = ; i < size ; i ++) { lista . get ( i ) ; } long fim = System . currentTimeMillis () ; return fim - inicio ; } }
Cdigo Java 18.18: TestaGet.java
Conjuntos
156
www.k19.com.br
157
C OLLECTIONS
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 dene 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.
Exerccios de Fixao
4
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15
www.k19.com.br
157
C OLLECTIONS
16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 36 } public static long contains ( Collection colecao ) { int size = 1 ;
158
for ( int i = ; i < size ; i ++) { colecao . add ( i ) ; } long inicio = System . currentTimeMillis () ; for ( int i = ; i < size ; i ++) { colecao . contains ( i ) ; } long fim = System . currentTimeMillis () ; return fim - inicio ; } }
Cdigo Java 18.19: TestaContains.java
Lao foreach
As listas podem ser iteradas com um lao for tradicional.
1 2 3 4 5 List lista = ... for ( int i = ; i < lista . size () ; i ++) { Object x = lista . get ( i ) ; }
Cdigo Java 18.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 eciente pois o mtodo get() para determinadas implementaes de lista lento (ex: LinkedList). A maneira mais eciente para percorrer uma coleo utilizar um lao foreach.
1 2 3 4 5 Collection colecao = ... for ( Object x : colecao ) { }
Cdigo Java 18.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 Collection colecao = ...
158
www.k19.com.br
159
3 4 5 6 7 colecao . add ( " Rafael Cosentino " ) ; for ( Object x : colecao ) { System . out . println ( x ) ; }
Cdigo Java 18.22: Coleo de elementos genricos
C OLLECTIONS
Porm, normalmente, precisamos tratar os objetos de forma especca pois queremos ter acesso aos mtodos especcos desses objetos. Nesses casos, devemos fazer casting de referncias.
1 2 3 4 5 6 7 8 Collection colecao = ... colecao . add ( " Rafael Cosentino " ) ; for ( Object x : colecao ) { String s = ( String ) x ; System . out . println ( s . toUpperCase () ) ; }
Cdigo Java 18.23: Aplicando casting de referncias
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 18.24: Coleo com Generics
Exerccios de Fixao
5
1 2 3 4 5 6 7 8 9 1 11 12 13 14
www.k19.com.br
159
C OLLECTIONS
15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 36 37 38 39 4 41 42 43 44
160
tempo = TestaContains . foreach ( linkedList ) ; System . out . println ( " Foreach : " + tempo + " ms " ) ; } public static long forTradicional ( List < Integer > lista ) { long inicio = System . currentTimeMillis () ; for ( int i = ; i < lista . size () ; i ++) { int x = lista . get ( i ) ; } long fim = System . currentTimeMillis () ; return fim - inicio ; } public static long foreach ( List < Integer > lista ) { long inicio = System . currentTimeMillis () ; for ( int x : lista ) { } long fim = System . currentTimeMillis () ; return fim - inicio ; } }
Cdigo Java 18.25: TestaContains.java
160
www.k19.com.br
APNDICE
Cdigo Java A.1: Criando uma Janela
S WING
A plataforma Java oferece recursos sosticados para construo de interfaces grcas 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 grcos 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 denem os componentes de uma janela desktop. AWT a base para Java Swing API. Swing: Conjunto sosticado de classes e interfaces que denem os componentes visuais e servios necessrios para construir uma interface grca de usurio.
Componentes
Os itens que aparecem em uma interface grca 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 grca de usurio conhecer os principais componentes do Java Swing API.
JFrame
A classe JFrame dene janelas com ttulo, borda e alguns itens denidos pelo sistema operacional como boto para minimizar ou maximizar.
1 2 3 JFrame frame = new JFrame ( " K19 - Java OO " ) ; frame . setSize (3 , 2 ) ; frame . setVisible ( true ) ;
www.k19.com.br
161
S WING
162
DO_NOTHING_ON_CLOSE: No faz nada. HIDE_ON_CLOSE: Esconde a janela (Padro no JFrame). DISPOSE_ON_CLOSE: Fecha a janela (Mais utilizado em janelas internas). EXIT_ON_CLOSE: Fecha a aplicao (System.exit(0)).
Por padro, o visual das janelas utiliza o estilo denido pelo sistema operacional. Mas, podemos alterar esse comportamento padro.
JPanel
A classe JPanel dene 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 2 3 4 5 JFrame frame = new JFrame ( " K19 - Java OO " ) ; JPanel panel = new JPanel () ; frame . setContentPane ( panel ) ;
Cdigo Java A.3: JPanel
JTextField e JLabel
A classe JTextField dene os campos de texto que podem ser preenchidos pelo usurio. A classe JLabel dene rtulos que podem ser utilizados por exemplo em caixas de texto.
1 2 JFrame frame = new JFrame ( " K19 - Java OO " ) ; frame . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ;
162
www.k19.com.br
163
3 4 5 6 7 8 9 1 11 12 13 14 15 16
S WING
JPanel panel = new JPanel () ; JLabel rotulo = new JLabel () ; rotulo . setText ( " Nome : " ) ; panel . add ( rotulo ) ; JTextField textField = new JTextField (4 ) ; panel . add ( textField ) ; frame . setContentPane ( panel ) ; frame . pack () ; frame . setVisible ( true ) ;
Cdigo Java A.4: JTextField
JTextArea
Para textos maiores podemos aplicar o componente denido pela classe JTextArea.
1 JTextArea textArea = new JTextArea (1 , 2 ) ;
Cdigo Java A.5: JTextArea
JPasswordField
Em formulrios que necessitam de caixa de texto para digitar senhas, podemos aplicar o componente denido 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 (2 ) ;
Cdigo Java A.6: JPasswordField
www.k19.com.br
163
S WING
164
JButton
Os botes que permitem que os usurios indiquem quais aes ele deseja que a aplicao execute podem ser criados atravs do componente denido pela classe JButton.
1 2 3 4 5 JButton button1 = new JButton ( " SIM " ) ; JButton button2 = new JButton ( " NO " ) ; JButton button3 = new JButton ( " CANCEL " ) ;
Cdigo Java A.7: JButton
JCheckBox
Podemos criar formulrios com checkboxs utilizando o componente da classe JCheckBox.
1 2 3 4 5 JCheckBox checkBox1 = new JCheckBox ( " Rafael Cosentino " ) ; JCheckBox checkBox2 = new JCheckBox ( " Jonas Hirata " ) ; JCheckBox checkBox3 = new JCheckBox ( " Marcelo Martins " ) ;
Cdigo Java A.8: JCheckBox
JComboBox
Podemos criar formulrios com comboboxs utilizando o componente da classe JComboBox.
1 2 3 4 5 6 String [] items [ ] items [1] items [2] items = new String [3]; = " Rafael Cosentino " ; = " Jonas Hirata " ; = " Marcelo Martins " ;
164
www.k19.com.br
165
S WING
Layout Manager
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:
BorderLayout: Esse Layout Manager divide a rea de um componente de background em cinco regies (norte, sul, leste, oeste e centro). Somente um componente pode ser adicionado em cada regio. Eventualmente, o BorderLayout altera o tamanho preferencial dos componentes para torn-los compatveis com o tamanho das regies. O BorderLayout o Layout Manager padro de um JFrame.
FlowLayout: Esse Layout Manager arranja os componentes da esquerda para direita e quando o tamanho horizontal no suciente ele pula para a prxima linha. O FlowLayout no altera o tamanho preferencial dos componentes. O FlowLayout o Layout Manager padro de um JPanel.
www.k19.com.br
165
S WING
166
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.
ActionListener: Essa interface deve ser implementada quando desejamos tratar eventos como por exemplo cliques em botes, seleo de items de um menu ou teclar enter dentro de uma caixa de texto. MouseListener: Essa interface deve ser implementada quando desejamos tratar eventos como clique dos botes do mouse. KeyListener: Essa interface deve ser implementada quando desejamos tratar eventos de pressionar ou soltar teclas do teclado.
Exemplo
Vamos criar um listener para executar quando o usurio clicar em um boto. O primeiro passo denir uma classe que implemente ActionListener.
166
www.k19.com.br
167
1 2 3 4 5 6 class MeuListener implements ActionListener { public void actionPerformed ( ActionEvent e ) { JButton button = ( JButton ) e . getSource () ; button . setText ( " clicado " ) ; } }
Cdigo Java A.10: MeuListener.java
S WING
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 2 3 4 5 6 7 JButton button1 = new JButton ( " ACAO1 " ) ; JButton button2 = new JButton ( " ACAO2 " ) ; MeuListener listener = new MeuListener () ; button1 . addActionListener ( listener ) ; button2 . addActionListener ( listener ) ;
Cdigo Java A.11: Associando listeners e botes
Exerccios de Fixao
1
2 Crie uma tela de login com caixas de texto e rtulos para o nome de usurio e senha e um boto para logar.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26
public class Teste { public static void main ( String [] args ) { JFrame frame = new JFrame ( " K19 - Login " ) ; frame . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ; JPanel panel = new JPanel () ; JLabel label1 = new JLabel ( " Usurio : " ) ; JTextField textField = new JTextField (2 ) ; JLabel label2 = new JLabel ( " Senha : " ) ; JPasswordField passwordField = new JPasswordField (2 ) ; JButton button = new JButton ( " Logar " ) ; panel . add ( label1 ) ; panel . add ( textField ) ; panel . add ( label2 ) ; panel . add ( passwordField ) ; panel . add ( button ) ; frame . setContentPane ( panel ) ; frame . pack () ;
www.k19.com.br
167
S WING
27 28 29 frame . setVisible ( true ) ; } }
Cdigo Java A.12: Teste.java
168
Redimensione a janela e observe o que ocorre com os elementos e pense o que determina o comportamento observado.
3 4 Altere o Layout Manager do painel utilizado na tela de login para GridLayout adicionando a linha a seguir logo aps a criao do JPanel.
Execute novamente o teste e observe o resultado. Depois tente redimensionar a tela para observar o comportamento. Observando a tela obtida no exerccio anterior, vericamos que o boto colocado na primeira coluna do grid gerado pelo GridLayout. Tente fazer o boto aparecer na segunda coluna.
5
168
www.k19.com.br
APNDICE
Terminal B.1: Criando um biblioteca Cdigo Java B.1: MANIFEST.MF Terminal B.2: Criando um Aplicao
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.
Atravs da ferramenta jar, podemos determinar o valor da propriedade Main-Class. O arquivo MANIFEST.MF gerado automaticamente.
K19$ jar cfe app . jar br . com . k19 . App *
Exerccios de Fixao
1 2
Crie um projeto no eclipse chamado Empacotamento. Adicione no projeto Empacotamento uma pacote chamado br.com.k19 com a seguinte classe.
public class App {
www.k19.com.br
169
E MPACOTAMENTO
2 3 4 5 6 7 8 public static void main ( String [] args ) { JFrame janela = new JFrame ( " K19 - Empacotamento " ) ; janela . setSize (3 , 3 ) ; janela . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ; janela . setVisible ( true ) ; } }
Cdigo Java B.2: App.java
170
170
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 m 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 la. 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 denir quais so as tarefas que uma aplicao deve realizar e determinar quando elas devem executar.
171
T HREADS
1 2 3 4 5 6 7 class TarefaImprimeOi implements Runnable { public void run () { for ( int i = ; i < 1 ; i ++) { System . out . println ( " OI " ) ; } } }
Cdigo Java C.1: TarefaImprimeOi.java
172
1 2 3 4 5 6 7 8 9
class TarefaSomaAte1 implements Runnable { public void run () { int soma = ; for ( int i = 1; i <= 1 ; i ++) { soma += i ; } System . out . println ( soma ) ; } }
Cdigo Java C.2: TarefaSomaAte100.java
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 dene a tarefa.
1 2 3 4 5 6 7 TarefaImprimeOi tarefa1 = new TarefaImprimeOi () ; TarefaImprimeOi tarefa2 = new TarefaImprimeOi () ; TarefaSomaAte1 tarefa3 = new TarefaSomaAte1 () ; Thread thread1 = new Thread ( tarefa1 ) ; Thread thread2 = new Thread ( tarefa2 ) ; Thread thread3 = new Thread ( tarefa3 ) ;
Cdigo Java C.3: Associando tarefas e threads
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 2 3 TarefaImprimeOi tarefa = new TarefaImprimeOi () ; Thread thread = new Thread ( tarefa ) ; thread . start () ;
Cdigo Java C.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
1 2
Crie um projeto no eclipse chamado Threads. Dena uma tarefa para imprimir mensagens na tela.
172
www.k19.com.br
173
1 2 3 4 5 6 7 8 9 1 11 12 13 14 class TarefaImprimeMensagens implements Runnable { private String msg ; public TarefaImprimeMensagens ( String msg ) { this . msg = msg ; } public void run () { for ( int i = ; i < 1 ; i ++) { System . out . println ( i + " : " + this . msg ) ; } } }
Cdigo Java C.5: TarefaImprimeMensagens.java
T HREADS
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15
Thread thread1 = new Thread ( tarefa1 ) ; Thread thread2 = new Thread ( tarefa2 ) ; Thread thread3 = new Thread ( tarefa3 ) ; thread1 . start () ; thread2 . start () ; thread3 . start () ; } }
Cdigo Java C.6: Teste.java
Execute o teste!
sleep()
Durante a execuo de uma thread, se o mtodo sleep() for chamado a thread car sem executar pelo menos durante a quantidade de tempo passada como parmetro para este mtodo.
1 2 // Faz a thread corrente dormir por 3 segundos Thread . sleep (3 );
Cdigo Java C.7: Sleep
www.k19.com.br
173
T HREADS
174
InterruptedException Uma thread que est dormindo pode ser interrompida por outra thread. Quando isso ocorrer, a thread que est dormindo recebe uma InterruptedException.
1 2 3 4 5 try { Thread . sleep (3 ); } catch ( InterruptedException e ) { }
Cdigo Java C.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 TarefaImprimeMensagens tarefa = new TarefaImprimeMensagens ( " K19 " ) ; Thread thread = new Thread ( tarefa ) ; thread . start () ; try { thread . join () ; } catch ( InterruptedException e ) { }
Cdigo Java C.9: Join
Exerccios de Fixao
Altere a classe TarefaImprimeMensagens do projeto Threads, adicionando uma chamada ao mtodo sleep().
4
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22
class TarefaImprimeMensagens implements Runnable { private String msg ; public TarefaImprimeMensagens ( String msg ) { this . msg = msg ; } public void run () { for ( int i = ; i < 1 ; i ++) { System . out . println ( i + " : " + this . msg ) ; if ( i % 1 == ) { try { Thread . sleep (1 ) ; } catch ( InterruptedException e ) { } } } } }
174
www.k19.com.br
175
T HREADS
www.k19.com.br
175
T HREADS
176
176
www.k19.com.br
APNDICE
);
Cdigo Java D.1: Abrindo um socket
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 envia dados para outros computadores da mesma rede.
Socket
A classe Socket dene o funcionamento dos sockets em Java.
1 Socket socket = new Socket ( " 184.72.247.119 " , 1
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 2 3 4 5 Socket socket = new Socket ( " 184.72.247.119 " , 1 );
PrintStream saida = new PrintStream ( socket . getOutputStream () ) ; Scanner entrada = new Scanner ( socket . getInputStream () ) ;
Cdigo Java D.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 dene o funcionamento de um server socket.s
1 2 3 ServerSocket severSocket = new ServerSocket (1 Socket socket = serverSocket . accept () ;
Cdigo Java D.3: Aguardando uma conexo
);
www.k19.com.br
177
S OCKET
178
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 2 3 4 5 6 ServerSocket severSocket = new ServerSocket (1 while ( true ) { Socket socket = serverSocket . accept () ; }
Cdigo Java D.4: Aguardando conexes
);
Cada iterao do lao acima estabelece uma conexo nova com uma aplicao cliente.
Exerccios de Fixao
1 2
Crie um projeto no eclipse chamado Sockets. Crie o cdigo de uma aplicao servidora.
public class Servidor { public static void main ( String [] args ) throws IOException { ServerSocket serverSocket = new ServerSocket (1 ); Socket socket = serverSocket . accept () ; PrintStream saida = new PrintStream ( socket . getOutputStream () ) ; saida . println ( " Voc se conectou ao servidor da K19 ! " ) ; } }
Cdigo Java D.5: Servidor.java
1 2 3 4 5 6 7 8 9 1 11
1 2 3 4 5 6 7 8 9 1 11
178
www.k19.com.br
179
4
S OCKET
Abra um terminal, entre na pasta bin do projeto Sockets e execute a classe Servidor.
K19 / Rafael / workspace / Socket / bin$ java Servidor
Abra outro terminal, entre na pasta bin do projeto Sockets e execute a classe Cliente.
K19 / Rafael / workspace / Socket / bin$ java Servidor Um cliente chegou ! K19 / Rafael / workspace / Socket / bin$
K19 / Rafael / workspace / Socket / bin$ java Cliente Voc se conectou ao servidor da K19 ! K19 / Rafael / workspace / Socket / bin$
www.k19.com.br
179
S OCKET
180
180
www.k19.com.br
APNDICE
Cdigo Java E.1: Registrador.java Cdigo Java E.2: Receptor
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 grca e sua principal tarefa distribuir as mensagens enviadas pelos usurios. A aplicao cliente possuir interface grca 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 2 3 4 5 public class Registrador { public void aguardaUsuario () { } }
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 2 3 4 5 public class Receptor { public void aguardaMensagens () { } }
www.k19.com.br
181
C HAT K19
182
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.
1 2 3 4 5 public class Emissor { public void envia ( String mensagem ) { } }
Cdigo Java E.3: Emissor.java
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 2 3 4 5 public class Distribuidor { public void distribuiMensagem ( String mensagem ) { } }
Cdigo Java E.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 2 3 4 5 public class EmissorDeMensagem { public void enviaMensagem ( String mensagem ) { } }
Cdigo Java E.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 2 3 4 public class ReceptorDeMensagem { public void aguardaMensagem () { }
182
www.k19.com.br
183
5 }
Cdigo Java E.6: ReceptorDeMensagem.java
C HAT K19
Exerccios de Fixao
1 2 3
Crie um projeto no eclipse chamado K19-chat-server. Crie um projeto no eclipse chamado K19-chat-client. No projeto K19-chat-server crie uma classe para denir os emissores.
import java . io . PrintStream ; public class Emissor { private PrintStream saida ; public Emissor ( PrintStream saida ) { this . saida = saida ; } public void envia ( String mensagem ) { this . saida . println ( mensagem ) ; } }
Cdigo Java E.7: Emissor.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14
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.
4
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16
O distribuidor possui uma coleo de emissores, um emissor para cada cliente conectado.
www.k19.com.br
183
C HAT K19
184
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.
5
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18
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.
6
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21
public class Registrador implements Runnable { private Distribuidor distribuidor ; private ServerSocket serverSocket ; public Registrador ( Distribuidor distribuidor , ServerSocket serverSocket ) { this . distribuidor = distribuidor ; this . serverSocket = serverSocket ; } public void run () { while ( true ) { try { Socket socket = this . serverSocket . accept () ;
184
www.k19.com.br
185
22 23 24 25 26 27 28 29 3 31 32 33 34 35 36 37 38 39
C HAT K19
Scanner entrada = new Scanner ( socket . getInputStream () ) ; PrintStream saida = new PrintStream ( socket . getOutputStream () ) ; Receptor receptor = new Receptor ( entrada , this . distribuidor ) ; Thread pilha = new Thread ( receptor ) ; pilha . start () ; Emissor emissor = new Emissor ( saida ) ; this . distribuidor . adicionaEmissor ( emissor ) ; } catch ( IOException e ) { System . out . println ( " ERRO " ) ; } } } }
Cdigo Java E.10: Registrador.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14
Registrador registrador = new Registrador ( distribuidor , serverSocket ) ; Thread pilha = new Thread ( registrador ) ; pilha . start () ; } }
Cdigo Java E.11: Server
1 2 3 4 5 6 7 8 9 1 11 12 13
No projeto K19-chat-client crie uma classe para denir a tela em Java Swing do chat.
import java . awt . event . ActionEvent ; import java . awt . event . ActionListener ; import javax . swing . JButton ; import javax . swing . JFrame ; import javax . swing . JLabel ;
1 2 3 4 5 6
www.k19.com.br
185
C HAT K19
7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 36 37 38 39 4 41 42 43 44 45 46 47 48 49 5 51 52 53 54 55 56 57 58 59 6 61 62 import import import import javax . swing . JPanel ; javax . swing . JScrollPane ; javax . swing . JTextArea ; javax . swing . JTextField ;
186
public class TelaK19Chat { private private private private private private private final final final final final final final JFrame frame ; JPanel panel ; JScrollPane scrollPane ; JTextArea textArea1 ; JLabel label1 ; JTextField textField ; JButton button ;
private final EmissorDeMensagem emissorDeMensagem ; public TelaK19Chat ( EmissorDeMensagem emissor ) { this . emissorDeMensagem = emissor ; this . frame = new JFrame ( " K19 - Chat " ) ; this . panel = new JPanel () ; this . textArea1 = new JTextArea (1 , 6 ) ; this . textArea1 . setEditable ( false ) ; this . scrollPane = new JScrollPane ( this . textArea1 ) ; this . label1 = new JLabel ( " Digite uma mensagem ... " ) ; this . textField = new JTextField (6 ) ; this . button = new JButton ( " Enviar " ) ; this . frame . setContentPane ( this . panel ) ; this . panel . add ( this . scrollPane ) ; this . panel . add ( this . label1 ) ; this . panel . add ( this . textField ) ; this . panel . add ( button ) ; class EnviaMensagemListener implements ActionListener { public void actionPerformed ( ActionEvent e ) { emissorDeMensagem . envia ( textField . getText () ) ; textField . setText ( " " ) ; } } this . button . addActionListener ( new EnviaMensagemListener () ) ; this . frame . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ; this . frame . setSize (7 , 3 ) ; this . frame . setVisible ( true ) ; } public void adicionaMensagem ( String mensagem ) { this . textArea1 . append ( mensagem + " \ n " ) ; } }
Cdigo Java E.13: TelaK19Chat.java
10
1 2 3 4 5 6 7
186
www.k19.com.br
187
8 9 1 11 12 13 14 15 16 17 18 19 public ReceptorDeMensagem ( Scanner entrada , TelaK19Chat telaK19Chat ) { this . entrada = entrada ; this . telaK19Chat = telaK19Chat ; } public void run () { while ( this . entrada . hasNextLine () ) { String mensagem = this . entrada . nextLine () ; this . telaK19Chat . adicionaMensagem ( mensagem ) ; } } }
Cdigo Java E.14: ReceptorDeMensagem.java
C HAT K19
11
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23
PrintStream saida = new PrintStream ( socket . getOutputStream () ) ; Scanner entrada = new Scanner ( socket . getInputStream () ) ; EmissorDeMensagem emissor = new EmissorDeMensagem ( saida ) ; TelaK19Chat telaK19Chat = new TelaK19Chat ( emissor ) ; ReceptorDeMensagem receptor = new ReceptorDeMensagem ( entrada , telaK19Chat ) ; Thread pilha = new Thread ( receptor ) ; pilha . start () ; } }
Cdigo Java E.15: Client.java
www.k19.com.br
187
C HAT K19
188
188
www.k19.com.br
APNDICE
Cdigo Java 2.23: ImprimePadrao3.java Terminal 2.10: Padro 3 Cdigo Java 2.24: ImprimePadrao4.java
R ESPOSTAS
www.k19.com.br
189
R ESPOSTAS
190
; contador ++) {
190
www.k19.com.br
191
21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 36 37 38 39 4 41 42 43 44 45 46 47 48 49 5 51 52 53 54 55 56 57 58 59 6 61 62 63 64 65 66 System . out . println ( " ** " ) ; } } } else if ( opc ==2) { for ( int contador = 1; contador <= 1 ; contador ++) { int resto = contador % 4; if ( resto == ) { System . out . println ( " PI " ) ; } else { System . out . println ( contador ) ; } } } else if ( opc ==3) { String linha = " * " ; for ( int contador = 1; contador <= 1 ; contador ++) { System . out . println ( linha ) ; linha += " * " ; } } else if ( opc ==4) { String linha = " * " ; for ( int contador = 1; contador <= 1 ; contador ++) { System . out . println ( linha ) ; int resto = contador % 4; if ( resto == ) { linha = " * " ; } else { linha += " * " ; } } } else if ( opc ==5) { int penultimo = ; int ultimo = 1; System . out . println ( penultimo ) ; System . out . println ( ultimo ) ; for ( int contador = ; contador < 28; contador ++) { int proximo = penultimo + ultimo ; System . out . println ( proximo ) ; penultimo = ultimo ; ultimo = proximo ; } } } System . out . println ( " Operao finalizada " ) ; } }
Cdigo Java 2.27: GeradorDePadroes.java
R ESPOSTAS
Compile e execute a classe GeradorDePadroes Resposta do Complementar 3.1 Adicione o seguinte arquivo na pasta orientacao-a-objetos:
1 2 3 4 5 class Aluno { String nome ; String rg ; String dataNascimento ; }
Cdigo Java 3.20: Aluno.java
191
R ESPOSTAS
192
TestaAluno.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 class TestaAluno { public static void main ( String [] args ) { Aluno a1 = new Aluno () ; a1 . nome = " Marcelo Martins " ; a1 . rg = " 33333333 -3 " ; a1 . dataNascimento = " 2/ 4/1985 " ; Aluno a2 = new Aluno () ; a2 . nome = " Rafael Cosentino " ; a2 . rg = " 222222222 -2 " ; a2 . dataNascimento = " 3 /1 /1984 " ; System . out . println ( a1 . nome ) ; System . out . println ( a1 . rg ) ; System . out . println ( a1 . dataNascimento ) ; System . out . println ( a2 . nome ) ; System . out . println ( a2 . rg ) ; System . out . println ( a2 . dataNascimento ) ; } }
Cdigo Java 3.21: TestaAluno.java
Resposta do Complementar 3.4 Adicione o seguinte arquivo na pasta orientacao-a-objetos. Depois compile e execute a classe TestaFuncionario.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 class TestaFuncionario { public static void main ( String [] args ) { Funcionario f1 = new Funcionario () ; f1 . nome = " Marcelo Martins " ; f1 . cargo = " Diretor " ; f1 . salario = 1.8 ; Funcionario f2 = new Funcionario () ; f2 . nome = " Rafael Cosentino " ; f2 . cargo = " Professor " ; f2 . salario = 2. ; System . out . println ( f1 . nome ) ; System . out . println ( f1 . cargo ) ; System . out . println ( f1 . salario ) ;
192
www.k19.com.br
193
16 17 18 19 2 21
R ESPOSTAS
System . out . println ( f2 . nome ) ; System . out . println ( f2 . cargo ) ; System . out . println ( f2 . salario ) ; } }
Cdigo Java 3.23: TestaFuncionario.java
Resposta do Complementar 3.6 Adicione o seguinte arquivo na pasta orientacao-a-objetos. Depois compile e execute a classe TestaTurma.
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25
class TestaTurma { public static void main ( String [] aseries ) { Turma t1 = new Turma () ; t1 . periodo = " Tarde " ; t1 . serie = 8; t1 . sigla = " A " ; t1 . tipoDeEnsino = " Fundamental " ; Turma t2 = new Turma () ; t2 . periodo = " Manha " ; t2 . serie = 5; t2 . sigla = " B " ; t2 . tipoDeEnsino = " Fundamental " ; System . out . println ( t1 . periodo ) ; System . out . println ( t1 . serie ) ; System . out . println ( t1 . sigla ) ; System . out . println ( t1 . tipoDeEnsino ) ; System . out . println ( t2 . periodo ) ; System . out . println ( t2 . serie ) ; System . out . println ( t2 . sigla ) ; System . out . println ( t2 . tipoDeEnsino ) ; } }
Cdigo Java 3.25: TestaTurma.java
www.k19.com.br
193
R ESPOSTAS
1 2 3 4 5 6 class Aluno { String nome ; String rg ; String dataNascimento ; Turma turma ; }
Cdigo Java 3.33: Aluno.java
194
1 2 3 4 5 6 7 8 9 1 11 12 13 14
class TestaAlunoTurma { public static void main ( String [] args ) { Aluno a = new Aluno () ; Turma t = new Turma () ; a . nome = " Rafael Cosentino " ; t . periodo = " Tarde " ; a . turma = t ; System . out . println ( a . nome ) ; System . out . println ( a . turma . periodo ) ; } }
Cdigo Java 3.34: TesteAlunoTurma
Resposta do Complementar 3.9 Crie uma classe chamada Funcionario como no cdigo abaixo.
1 2 3 4 5 6 7 8 9 1 11 12 class Funcionario { String nome ; double salario ; void aumentaSalario ( double valor ) { this . salario += valor ; } String consultaDados () { return " Nome : " + this . nome + " \ nSalrio : " + this . salario ; } }
Cdigo Java 3.42: Funcionario.java
Resposta do Complementar 3.10 Crie uma classe chamada TestaFuncionario como no cdigo abaixo.
1 2 3 4 class TestaFuncionario { public static void main ( String [] args ) { Funcionario f1 = new Funcionario () ;
194
www.k19.com.br
195
5 6 7 8 9 1 11 12 13 14 15 // Cadastrando Funcionrio f1 . nome = " Rafael Cosentino " ; f1 . salario = 1 ; // Aumentando em 1 f1 . aumentaSalario (1 reais o salrio do funcionrio );
R ESPOSTAS
Resposta do Complementar 3.12 Crie uma classe chamada Conta como a do cdigo abaixo.
1 2 3 4 5 class Conta { int numero ; double limite ; double saldo ; }
Cdigo Java 3.79: Conta.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32
import java . util . Scanner ; class TestaConta { public static void main ( String [] args ) { Conta c1 = new Conta () ; // Criando uma conta Scanner scanner = new Scanner ( System . in ) ; System . out . println ( " --------------- Criando Conta - - - - - - - - - - - - - - -\ n \ n " ) ; System . out . println ( " Digite o numero da conta : " ) ; // Recebendo o valor digitado String valorTela = scanner . nextLine () ; // Convertendo para int int numero = Integer . parseInt ( valorTela ) ; // Armazenando o valor recebido da tela no atributo do objeto conta c1 . numero = numero ; System . out . println ( " Digite o limite da conta : " ) ; valorTela = scanner . nextLine () ; double limite = Double . parseDouble ( valorTela ) ; c1 . limite = limite ; System . out . println ( " Digite o saldo inicial da conta : " ) ; valorTela = scanner . nextLine () ; int saldo = Integer . parseInt ( valorTela ) ; c1 . saldo = saldo ; int opc = 1; while ( opc !=
) {
www.k19.com.br
195
R ESPOSTAS
33 34 35 36 37 38 39 4 41 42 43 44 45 46 47 48 49 5 51 52 53 54 55 56 57 58 59 6 61 62 63 64 65 66 67 68 69 7 71 72 73 74 75 76 System . out . println ( " \ n \ n " ) ; System . out . println ( " Operaes bancrias " ) ; System . out . println ( " Escolha a opo desejada : " ) ; System . out . println ( " - Sair " ) ; System . out . println ( " 1 - Depositar " ) ; System . out . println ( " 2 - Sacar " ) ; System . out . println ( " 3 - Extrato " ) ; System . out . println ( " \ n \ n " ) ; valorTela = scanner . nextLine () ; opc = Integer . parseInt ( valorTela ) ; if ( opc == 1) { System . out . println ( " Digite o valor para depositar : " ) ; valorTela = scanner . nextLine () ; int deposito = Integer . parseInt ( valorTela ) ; // Se o valor for menor que zero vai dar erro if ( deposito <= ) { System . out . println ( " ERRO " ) ; } else { c1 . saldo += deposito ; System . out . println ( " Deposito efetuado com sucesso " ) ; } } else if ( opc == 2) { System . out . println ( " Digite o valor para saque : " ) ; valorTela = scanner . nextLine () ; int saque = Integer . parseInt ( valorTela ) ;
196
// Se o valor for maior do que o saldo mais o limite ou menor que zero vai dar erro if ( saque > ( c1 . saldo + c1 . limite ) || ( saque <= ) ) { System . out . println ( " ERRO " ) ; } else { c1 . saldo -= saque ; System . out . println ( " Saque efetuado com sucesso " ) ; } } else if ( opc == 3) { System . out . println ( " Numero : " + c1 . numero ) ; System . out . println ( " Limite : " + c1 . limite ) ; System . out . println ( " Saldo : " + c1 . saldo ) ; } } } }
Cdigo Java 3.80: Main.java
Resposta do Complementar 3.14 Crie uma classe chamada Funcionario como a do cdigo abaixo.
1 2 3 4 5 6 7 8 class Funcionario { String nome ; double salario ; Funcionario ( double salario ) { this . salario = salario ; } }
Cdigo Java 3.81: Funcionario.java
197
R ESPOSTAS
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 36 37 38 39 4 41 42 43 44 45 46 47 48 49 5 51 52
import java . util . Scanner ; class TestaFuncionario { public static void main ( String [] args ) { Funcionario f = new Funcionario (2 ) ; Scanner scanner = new Scanner ( System . in ) ; System . out . println ( " Digite o nome do funcionrio : " ) ; String nome = scanner . nextLine () ; f . nome = nome ; int opc = 1; while ( opc != ) { System . out . println ( " \ n \ n " ) ; System . out . println ( " Escolha a opo desejada : " ) ; System . out . println ( " - Sair " ) ; System . out . println ( " 1 - Aumentar salrio " ) ; System . out . println ( " 2 - Corrigir nome do funcionrio " ) ; System . out . println ( " 3 - Imprimir dados " ) ; System . out . println ( " \ n \ n " ) ; String valorTela = scanner . nextLine () ; opc = Integer . parseInt ( valorTela ) ; if ( opc == 1) { System . out . println ( " Digite o quanto voc deseja aumentar : " ) ; valorTela = scanner . nextLine () ; int aumentar = Integer . parseInt ( valorTela ) ; if ( aumentar < ) { System . out . println ( " ERRO " ) ; } else { f . salario += aumentar ; System . out . println ( " Aumento efetuado com sucesso " ) ; } } else if ( opc == 2) { System . out . println ( " Nome atual : " + f . nome ) ; System . out . println ( " Digite o novo nome . " ) ; valorTela = scanner . nextLine () ; f . nome = valorTela ; System . out . println ( " Substituio feita com sucesso . " ) ; } else if ( opc == 3) { System . out . println ( " Dados atuais " ) ; System . out . println ( " Nome : " + f . nome ) ; System . out . println ( " Salrio : " + f . salario ) ; } } } }
Cdigo Java 3.82: Main2.java
1 2 3 4
class Media { public static void main ( String [] args ) { double soma = ; for ( String arg : args ) {
www.k19.com.br
197
R ESPOSTAS
5 6 7 8 9 1 double d = Double . parseDouble ( arg ) ; soma += d ; } System . out . println ( soma / args . length ) ; } }
Cdigo Java 4.18: Media.java
198
1 2 3 4 5 6 7 8 9 1 11 12
class Maior { public static void main ( String [] args ) { double maior = Double . parseDouble ( args [ ]) ; for ( int i = 1; i < args . length ; i ++) { double d = Double . parseDouble ( args [ i ]) ; if ( maior < d ) { maior = d ; } } System . out . println ( maior ) ; } }
Cdigo Java 4.19: Maior.java
199
R ESPOSTAS
1 2 3
1 2 3 4 5 6 7 8 9 1 11
class Conta { private double limite ; public double getLimite () { return this . limite ; } public void setLimite ( double limite ) { this . limite = limite ; } }
www.k19.com.br
199
R ESPOSTAS
200
1 2 3 4 5 6 7 8 9
class TestaConta { public static void main ( String [] args ) { Conta c = new Conta () ; c . setLimite (1 );
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16
class Funcionario { private String nome ; private double salario ; public double calculaBonificacao () { return this . salario * .1; } public void mostraDados () { System . out . println ( " Nome : " + this . nome ) ; System . out . println ( " Salrio : " + this . salario ) ; System . out . println ( " Bonificao : " + this . calculaBonificacao () ) ; } // GETTERS AND SETTERS }
Cdigo Java 8.28: Funcionario.java
1 2 3 4 5 6 7 8 9 1 11
class Gerente extends Funcionario { private String usuario ; private String senha ; public double calculaBonificacao () { return this . getSalario () * .6 + 1 }
public void mostraDados () { super . mostraDados () ; System . out . println ( " Usurio : " + this . usuario ) ;
200
www.k19.com.br
201
12 13 14 15 16 System . out . println ( " Senha : " + this . senha ) ; } // GETTERS AND SETTERS }
Cdigo Java 8.29: Gerente.java
R ESPOSTAS
1 2 3 4 5 6 7 8 9 1
class Telefonista extends Funcionario { private int estacaoDeTrabalho ; public void mostraDados () { super . mostraDados () ; System . out . println ( " Estao de Trabalho " + this . estacaoDeTrabalho ) ; } // GETTERS AND SETTERS }
Cdigo Java 8.30: Telefonista
1 2 3 4 5 6 7 8 9 1
class Secretaria extends Funcionario { private int ramal ; public void mostraDados () { super . mostraDados () ; System . out . println ( " Ramal " + this . ramal ) ; } // GETTERS AND SETTERS }
Cdigo Java 8.31: Secretaria.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26
class TestaFuncionarios { public static void main ( String [] args ) { Gerente g = new Gerente () ; g . setNome ( " Rafael Cosentino " ) ; g . setSalario (2 ); g . setUsuario ( " rafael . cosentino " ) ; g . setSenha ( " 12345 " ) ; Telefonista t = new Telefonista () ; t . setNome ( " Carolina Mello " ) ; t . setSalario (1 ); t . setEstacaoDeTrabalho (13) ; Secretaria s = new Secretaria () ; s . setNome ( " Tatiane Andrade " ) ; s . setSalario (15 ) ; s . setRamal (198) ; System . out . println ( " GERENTE " ) ; g . mostraDados () ; System . out . println ( " TELEFONISTA " ) ; t . mostraDados () ; System . out . println ( " SECRETARIA " ) ; s . mostraDados () ;
www.k19.com.br
201
R ESPOSTAS
27 28 } }
Cdigo Java 8.32: TestaFuncionarios.java
202
1 2 3 4 5
1 2 3 4 5 6
class Gerente extends Funcionario { private String usuario ; private String senha ; // GETTERS AND SETTERS }
Cdigo Java 9.14: Gerente.java
1 2 3 4 5
class Telefonista extends Funcionario { private int ramal ; // GETTERS AND SETTERS }
Cdigo Java 9.15: Telefonista.java
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15
class ControleDePonto { public void registraEntrada ( Funcionario f ) { SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ; Date agora = new Date () ; System . out . println ( " ENTRADA : " + f . getCodigo () ) ; System . out . println ( " DATA : " + sdf . format ( agora ) ) ; } public void registraSaida ( Funcionario f ) { SimpleDateFormat sdf = new SimpleDateFormat ( " dd / MM / yyyy HH : mm : ss " ) ; Date agora = new Date () ; System . out . println ( " SADA : " + f . getCodigo () ) ;
202
www.k19.com.br
203
16 17 18 System . out . println ( " DATA : " } }
Cdigo Java 9.16: ControleDePonto.java
R ESPOSTAS
+ sdf . format ( agora ) ) ;
1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2
class TestaControleDePonto { public static void main ( String [] args ) { Gerente g = new Gerente () ; g . setCodigo (1) ; g . setUsuario ( " rafael . cosentino " ) ; g . setSenha ( " 12345 " ) ; Telefonista t = new Telefonista () ; t . setCodigo (2) ; t . setRamal (13) ; ControleDePonto cdp = new ControleDePonto () ; cdp . registraEntrada ( g ) ; cdp . registraEntrada ( t ) ; cdp . registraSaida ( g ) ; cdp . registraSaida ( t ) ; } }
Cdigo Java 9.17: TestaControleDePonto.java
1 2 3 4 5
1 2 3 4 5 6 7 8 9
class TestaFuncionario { public static void main ( String [] args ) { Funcionario f = new Funcionario () ; f . setSalario (3 );
www.k19.com.br
203
R ESPOSTAS
204
1 2 3 4 5
1 2 3 4 5 6
class Gerente extends Funcionario { private String usuario ; private String senha ; // GETTERS E SETTERS }
Cdigo Java 10.21: Gerente.java
1 2 3 4 5 6 7 8 9
class TestaFuncionario { public static void main ( String [] args ) { Funcionario f = new Gerente () ; f . setSalario (3 );
1 2 3
204
www.k19.com.br
205
4 5 6 7 public abstract double calculaBonificacao () ; // GETTERS AND SETTERS }
Cdigo Java 10.23: Funcionario.java
R ESPOSTAS
1 2 3 4 5 6 7 8 9 1
class Gerente extends Funcionario { private String usuario ; private String senha ; public double calculaBonificacao () { return this . getSalario () * .2 + 3 } // GETTERS E SETTERS }
Cdigo Java 10.24: Gerente.java
1 2 3 4 5 6 7 8 9 1 11
class TestaFuncionario { public static void main ( String [] args ) { Funcionario f = new Gerente () ; f . setSalario (3 );
1 2 3 4 5
public class ArquivoParaArquivo { public static void main ( String [] args ) throws IOException { InputStream arquivo1 = new FileInputStream ( " entrada . txt " ) ; Scanner scanner = new Scanner ( arquivo1 ) ;
www.k19.com.br
205
R ESPOSTAS
6 7 8 9 1 11 12 13 14 FileOutputStream arquivo2 = new FileOutputStream ( " saida . txt " ) ; PrintStream printStream = new PrintStream ( arquivo2 ) ; while ( scanner . hasNextLine () ) { String linha = scanner . nextLine () ; printStream . println ( linha ) ; } } }
Cdigo Java 17.10: ArquivoParaArquivo.java
206
1 2 3 4 5 6 7 8 9 1 11 12 13 14
public class TecladoParaArquivo { public static void main ( String [] args ) throws IOException { InputStream teclado = System . in ; Scanner scanner = new Scanner ( teclado ) ; FileOutputStream arquivo = new FileOutputStream ( " saida . txt " ) ; PrintStream printStream = new PrintStream ( arquivo ) ; while ( scanner . hasNextLine () ) { String linha = scanner . nextLine () ; printStream . println ( linha ) ; } } }
Cdigo Java 17.11: TecladoParaArquivo.java
206
www.k19.com.br