Sei sulla pagina 1di 237

Material sugerido para as disciplinas Programao Orientada a Objetos I e Programao Orientada a Objetos II dos cursos de Cincia da Computao e Engenharia

da Computao da Faculdade de Cincia da Computao da Universidade do Vale do Paraba

29 de maio de 2000

Sumrio
1 Sobre este livro 1.1 O que este livro ? . . . . . . . . . . . . . . . . . . . . . . . 1.2 Como usar este livro . . . . . . . . . . . . . . . . . . . . . . 1.3 Sobre a organizao deste livro . . . . . . . . . . . . . . . . . 1.3.1 Planos para futuras verses deste livro . . . . . . . . . 1.3.2 Convenes usadas neste livro . . . . . . . . . . . . . 1.3.2.1 Convenes para os exerccios propostos . . 1.4 Porqu Java ? . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1 Tipos de Programas em Java . . . . . . . . . . . . . . 1.5 Informaes para alunos da FCC/Univap . . . . . . . . . . . . 1.5.1 Sobre a disciplina Programao Orientada a Objetos I 1.5.2 Sobre a disciplina Programao Orientada a Objetos II 1.6 Agradecimentos . . . . . . . . . . . . . . . . . . . . . . . . . Introduo a Programao Orientada a Objetos 2.1 O que so modelos ? . . . . . . . . . . . . . 2.2 O que POO ? . . . . . . . . . . . . . . . . 2.3 Classes, Objetos e Instncias . . . . . . . . . 2.4 Encapsulamento . . . . . . . . . . . . . . . . 2.5 Mais Exemplos de Classes e Objetos . . . . . 2.6 Exerccios do captulo 2 . . . . . . . . . . . . 1 1 2 2 3 3 3 4 5 5 5 6 6 7 7 8 8 10 10 14 17 17 17 19 21 23 28 33 33 33 34 36 36 37 40

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

Criando Classes em Java 3.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Criando Classes em Java . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Atributos e dados so tipos nativos ou instncias de outras classes 3.2.2 Operaes ou funes so Mtodos . . . . . . . . . . . . . . . . 3.3 Exemplos de Classes em Java . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Exerccios do captulo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . Criando Programas em Java 4.1 Introduo . . . . . . . . . . . . . . . . . . . 4.2 Criando Programas em Java . . . . . . . . . 4.2.1 Exemplos de programas em Java . . . 4.3 A palavra-chave new . . . . . . . . . . . . . 4.4 Processando argumentos da linha de comando 4.5 Subrotinas em Programas em Java . . . . . . 4.6 Exerccios do captulo 4 . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

ii 5 Herana 5.1 Introduo . . . . . . . . . . . . . . . . . . 5.2 O mecanismo de sobrecarga . . . . . . . . 5.3 Herana de variveis e mtodos privados . . 5.4 Outros exemplos e mecanismos de herana 5.5 Exerccios do captulo 5 . . . . . . . . . . . Polimorsmo 6.1 Introduo . . . . . . . . . . . . 6.2 Regras de polimorsmo . . . . . 6.3 Mais exemplos de polimorsmo 6.4 Exerccios do captulo 6 . . . . . 43 43 46 48 50 53 57 57 60 61 64 67 67 69 71 73 74 78 78 78 80 82 85 86 88 89 91 92 99 99 99 101 103 105 105 106 116 116 117 123 124 126 127 131

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Construtores 7.1 Introduo . . . . . . . . . . . . . . . 7.1.1 O construtor default . . . . . 7.2 Construtores, herana e polimorsmo 7.3 O mtodo toString() . . . . . . . . . . 7.4 Exerccios do captulo 7 . . . . . . . . Estruturas de Deciso e Controle 8.1 Introduo . . . . . . . . . . . . 8.2 Operadores lgicos . . . . . . . 8.3 A estrutura de deciso if/else . . 8.4 A estrutura de deciso switch . . 8.5 Estruturas de repetio . . . . . 8.6 A estrutura de repetio while . 8.7 A estrutura de repetio do-while 8.8 A estrutura de repetio for . . . 8.9 Os comandos break e continue . 8.10 Exerccios do captulo 8 . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

A Classe String 9.1 Introduo . . . . . . . . . . . . . . 9.2 Mtodos bsicos da classe String . 9.3 Mtodos para comparao de Strings 9.4 Mtodos para modicao de Strings 9.5 Mtodos para seleo em Strings . . 9.6 Mtodos para procura em Strings . . 9.7 Exerccios do captulo 9 . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

10 Arrays em Java 10.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Arrays de tipos nativos . . . . . . . . . . . . . . . . . 10.2.1 Caso especial: Processando a linha de comando 10.3 Arrays Multidimensionais . . . . . . . . . . . . . . . 10.3.1 Arrays Irregulares . . . . . . . . . . . . . . . 10.4 Arrays de instncias de classes . . . . . . . . . . . . . 10.5 Exerccios do captulo 10 . . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

iii 11 Funes Matemticas 11.1 Funes Matemticas em Java . . . . . . . 11.2 Constantes . . . . . . . . . . . . . . . . . . 11.3 Mtodos de comparao e arredondamento 11.4 Mtodos trigonomtricos . . . . . . . . . . 11.5 Mtodos exponenciais . . . . . . . . . . . 11.6 Outros mtodos . . . . . . . . . . . . . . . 11.7 Exerccios do captulo 11 . . . . . . . . . . 142 142 142 142 143 144 145 146 149 149 151 153 154 158 159 159 160 161 161 162 165 167 167 169 172

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

12 Excees 12.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 O que so excees ? . . . . . . . . . . . . . . . . . . . . . 12.2.1 Tipos de excees . . . . . . . . . . . . . . . . . . 12.3 Usando excees em classes desenvolvidas pelo programador 12.4 Exerccios do captulo 12 . . . . . . . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

13 Entrada e Sada usando Arquivos 13.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1.1 Acesso a arquivos em Java . . . . . . . . . . . . . . . . . . . 13.1.2 Sobre os arquivos usados neste captulo . . . . . . . . . . . . 13.2 Arquivos Sequenciais para Strings . . . . . . . . . . . . . . . . . . . 13.2.1 Leitura em arquivos sequenciais para Strings . . . . . . . . . 13.2.2 Gravao em arquivos sequenciais para Strings . . . . . . . . 13.3 Arquivos Sequenciais para Tipos Nativos . . . . . . . . . . . . . . . 13.3.1 Leitura em arquivos sequenciais para dados de tipos nativos . 13.3.2 Gravao em arquivos sequenciais para dados de tipos nativos 13.4 Exerccios do captulo 13 . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

14 Estruturas de Dados Bsicas em Java 177 14.1 A classe Vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 14.2 A classe Hashtable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 A Tipos de Dados em Java A.1 Tipos de dados nativos em Java . . . . . . . . . . . . A.1.1 O tipo bsico byte . . . . . . . . . . . . . . A.1.2 O tipo bsico char . . . . . . . . . . . . . . A.1.3 O tipo bsico short . . . . . . . . . . . . . . A.1.4 O tipo bsico int . . . . . . . . . . . . . . . A.1.5 O tipo bsico long . . . . . . . . . . . . . . A.1.6 O tipo bsico oat . . . . . . . . . . . . . . A.1.7 O tipo bsico double . . . . . . . . . . . . . A.1.8 O tipo bsico boolean . . . . . . . . . . . . . A.2 Classes para representao de dados . . . . . . . . . A.2.1 A classe String . . . . . . . . . . . . . . . . A.2.2 Classes para encapsulamento de tipos nativos A.2.2.1 A classe Byte . . . . . . . . . . . A.2.2.2 A classe Character . . . . . . . . . A.2.2.3 A classe Short . . . . . . . . . . . A.2.2.4 A classe Integer . . . . . . . . . . A.2.2.5 A classe Long . . . . . . . . . . . 178 178 178 180 181 182 183 184 185 186 187 187 190 191 192 193 195 196

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

iv A.2.2.6 A.2.2.7 A.2.2.8 A classe Float . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 A classe Double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 A classe Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 201 201 201 202 202 203 203 204 205 205 206 206 207 210 217 217 217 217 218 218 218 218 218 218 219 221 221 221 221 221 221 222 222 222 222 222

B A Classe Keyboard B.1 A classe Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.1.1 Usando a classe Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.1.1.1 Usando a classe Keyboard para leitura de valores tipo boolean . . . . B.1.1.2 Usando a classe Keyboard para leitura de valores tipo byte . . . . . B.1.1.3 Usando a classe Keyboard para leitura de valores tipo char . . . . . B.1.1.4 Usando a classe Keyboard para leitura de valores tipo short . . . . . B.1.1.5 Usando a classe Keyboard para leitura de valores tipo int . . . . . . B.1.1.6 Usando a classe Keyboard para leitura de valores tipo long . . . . . B.1.1.7 Usando a classe Keyboard para leitura de valores tipo oat . . . . . B.1.1.8 Usando a classe Keyboard para leitura de valores tipo double . . . . B.1.1.9 Usando a classe Keyboard para leitura de instncias da classe String B.2 Outros exemplos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.3 Cdigo fonte da classe Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C Usando o Java Development Kit C.1 Sobre o Java Development Kit (JDK) . . . . . . . . . . . . . . . . . C.1.1 Obtendo e Instalando o JDK . . . . . . . . . . . . . . . . . C.2 Como um programa em Java compilado e executado . . . . . . . . C.3 Usando o JDK no Linux . . . . . . . . . . . . . . . . . . . . . . . C.3.1 Compilando e Executando Programas em Java no Linux . . C.4 Usando o JDK no Windows . . . . . . . . . . . . . . . . . . . . . . C.4.1 Editores de Texto para o Windows . . . . . . . . . . . . . . C.4.2 Compilando e Executando Programas em Java no Windows C.5 Esclarecimentos Sobre Nomes de Classes e Arquivos . . . . . . . . C.6 Possveis Erros de Compilao e Execuo . . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

D Usando o Sistema Operacional Linux D.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D.2 A estrutura de arquivos e diretrios do Linux . . . . . . . . . . . . . . . . D.3 Uma introduo aos comandos bsicos do Linux . . . . . . . . . . . . . . . D.3.1 Executando comandos no Linux . . . . . . . . . . . . . . . . . . . D.3.2 Comandos de listagem de diretrios e arquivos . . . . . . . . . . . D.3.3 Comandos de criao, remoo e modicao de diretrios . . . . . D.3.4 Comandos de cpia, remoo e modicao de arquivos e diretrios D.3.5 Comandos de exibio do contedo de arquivos . . . . . . . . . . . D.3.6 Editores de Texto para o Linux . . . . . . . . . . . . . . . . . . . . D.3.6.1 Xemacs e Emacs . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

Lista de Figuras
2.1 2.2 2.3 2.4 2.5 2.6 10.1 10.2 10.3 10.4 Uma classe veculo e vrios objetos desta classe. . . . Uma lmpada, seus atributos e operaes . . . . . . . Uma data, seus atributos e operaes . . . . . . . . . . Um registro de aluno, seus atributos e operaes . . . . Um modelo de computador, seus atributos e operaes Uma conta bancria, seus atributos e operaes . . . . Exemplo de arrays . . . . . . . . . . . . Exemplo de arrays multidimensionais . . Exemplo de arrays irregulares . . . . . . Exemplo de arrays de instncias de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 10 11 12 13 13 116 125 127 128

13.1 Encapsulamento de arquivos por classes . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 13.2 Funcionamento de ponteiros em arquivos sequenciais de texto . . . . . . . . . . . . . . . 161 13.3 Funcionamento de ponteiros em arquivos sequenciais binrios . . . . . . . . . . . . . . . 167 C.1 Como um programa em Java compilado e executado . . . . . . . . . . . . . . . . . . . . 217 D.1 Interface grca do Xemacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 D.2 Interface grca do Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

vi

Lista de Listagens
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 Uma classe vazia em Java . . . . . . . . . . . . . . . . . . Criao e inicializao de variveis de tipos nativos em Java Exemplo de alguns mtodos em Java . . . . . . . . . . . . A classe Lampada (primeira verso) . . . . . . . . . . . . . A classe Data (primeira verso) . . . . . . . . . . . . . . . A classe RegistroDeAluno (primeira verso) . . . . . . . A classe ModeloDeComputador (primeira verso) . . . . . A classe ContaBancaria (primeira verso) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 20 22 23 23 25 26 27 34 34 35 36 37 38 38 39 39 43 44 45 45 46 47 48 49 51 51 52 57 58 58 59 60 61 61 63 63

Um programa mnimo em Java: HelloWorld.java . . . . . . . . . . . . . . . . . Um programa que usa instncias da classe Lampada . . . . . . . . . . . . . . . . . Um programa que usa instncias da classe Data . . . . . . . . . . . . . . . . . . . Um programa que conta quantos argumentos foram passados pela linha de comando Uma classe com o mtodo main e uma subrotina . . . . . . . . . . . . . . . . . . . Uma classe cujas subrotinas chamam uma outra . . . . . . . . . . . . . . . . . . Uma classe com variveis estticas . . . . . . . . . . . . . . . . . . . . . . . . . . Uma classe com algumas variveis e mtodos estticos . . . . . . . . . . . . . . . . Um programa que usa a classe com algumas variveis e mtodos estticos . . . . . . A classe Veiculo . . . . . . . . . . . . . . . . . . . . . . . . Criao de instncias da classe Veiculo . . . . . . . . . . . . A classe VeiculoTerrestre . . . . . . . . . . . . . . . . . . Criao de instncias da classe Veiculo e VeiculoTerrestre A classe VeiculoTerrestre, segunda verso . . . . . . . . . Problemas com sobrecarga de variveis . . . . . . . . . . . . . Exemplo de problemas com variveis privadas e herana . . . . Soluo do problema de variveis privadas e herana . . . . . . A classe Aluno (verso simples) . . . . . . . . . . . . . . . . . A classe AlunoMestrado (primeira verso) . . . . . . . . . . . A classe AlunoMestrado (segunda verso) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

A classe Hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Um programa que demonstra usos da classe Hora . . . . . . . . . . . . . . . . . . . A classe Hora, com mtodos polimrcos . . . . . . . . . . . . . . . . . . . . . . . Um programa que demonstra usos da classe Hora que contm mtodos polimrcos A classe Terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A classe Livro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A classe LivroComSoftware, herdeira da classe Livro . . . . . . . . . . . . . . . A classe MatBasica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Um programa que demonstra a classe MatBasica . . . . . . . . . . . . . . . . . .

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

vii 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 8.10 8.11 8.12 8.13 8.14 8.15 8.16 8.17 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11 Um programa que usa instncias da classe RegistroDeAluno . . . . . . . . . . . . . . . A classe Lampada, com um construtor . . . . . . . . . . . . . . . . . . . . . . . . . . . . Classe que usa instncias da classe Lampada com construtor . . . . . . . . . . . . . . . . A classe Data com um construtor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Classe que usa instncias da classe Data com construtor . . . . . . . . . . . . . . . . . . A classe Veiculo com construtores polimrcos . . . . . . . . . . . . . . . . . . . . . . A classe VeiculoTerrestre com construtores polimrcos . . . . . . . . . . . . . . . . Uma classe que usa instncias da classe VeiculoTerrestre com construtores polimrcos Uma classe que demonstra o uso implcito dos mtodos toString . . . . . . . . . . . . . A classe Data com um construtor e o mtodo toString() . . . . . . . . . . . . . . . . . Um programa que demonstra os operadores de comparao numrica de Java Um programa que demonstra combinaes de operadores lgicos . . . . . . Um programa que demonstra as estruturas if e else . . . . . . . . . . . . . Um programa que demonstra aninhamento de if e else . . . . . . . . . . . Uma classe que usa estruturas if e else cascateadas . . . . . . . . . . . . . Trecho de programa que demonstra a estrutura switch . . . . . . . . . . . . Um programa que demonstra a estrutura switch . . . . . . . . . . . . . . . Uma classe que usa a estrutura switch . . . . . . . . . . . . . . . . . . . . Uma classe com mtodo main que usa o lao while . . . . . . . . . . . . . A classe Escolha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplos de uso do lao while como contador . . . . . . . . . . . . . . . . Uma classe com mtodo main que usa o lao do-while . . . . . . . . . . . Uma classe cujo construtor usa o lao do-while . . . . . . . . . . . . . . . Uma classe com mtodo main que usa o lao for . . . . . . . . . . . . . . . A classe ProbabilidadeBasica . . . . . . . . . . . . . . . . . . . . . . . Uma classe cujo construtor usa o lao while e o comando break . . . . . . Exemplo de uso do comando continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 68 69 69 70 71 72 72 73 74 79 79 80 81 82 83 83 84 86 87 87 88 89 90 90 91 91 99 100 101 102 102 103 104 105 106 117 118 118 119 120 121 121 122 123 124 125

Clculo do comprimento de uma String (mtodo length()) . . . . . . . . . . . . . . Extrao de caracteres (mtodo charAt()) . . . . . . . . . . . . . . . . . . . . . . . Comparaes entre Strings (mtodos equals() e equalsIgnoreCase()) . . . . . . . Comparaes entre Strings (mtodo compareTo()) . . . . . . . . . . . . . . . . . . . Comparaes entre Strings (mtodos startsWith() e endsWith()) . . . . . . . . . Modicao de caracteres (mtodos replace(), toLowerCase() e toUpperCase()) Modicao de caracteres de Strings (mtodos concat() e trim()) . . . . . . . . . Seleo de trechos de Strings (mtodo substring()) . . . . . . . . . . . . . . . . . Procura de substrings em Strings (mtodos indexOf() e lastIndexOf()) . . . . . . Um programa que cria e popula um array de inteiros . . . . . . . . . . . . . . . . . Demonstrao da inicializao imediata de arrays . . . . . . . . . . . . . . . . . . Um programa que demonstra a passagem de arrays como argumentos para mtodos Um programa que mostra que arrays se comportam como referncias . . . . . . . . Um programa que demonstra erros potenciais relacionados ndices de arrays . . . A classe ArrayDeQuadrados, que encapsula um array . . . . . . . . . . . . . . . . Um programa que usa a classe ArrayDeQuadrados . . . . . . . . . . . . . . . . . A classe ArrayDeFloats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Um programa que usa instncias da classe ArrayDeFloats . . . . . . . . . . . . . Um programa que demonstra usos da linha de comando . . . . . . . . . . . . . . . Um programa que demonstra o uso de arrays multidimensionais . . . . . . . . . . . . . . . . . . . . . .

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

viii 10.12 10.13 10.14 10.15 10.16 10.17 Uma classe que encapsula um tabuleiro de jogo de damas . . . . . . . . . Um programa que demonstra o uso de arrays multidimensionais irregulares A classe Pessoa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uma classe que usa arrays de instncias da classe Pessoa . . . . . . . . . Uma classe que encapsula arrays de instncias da classe Pessoa . . . . . . Uma classe que demonstra o uso da classe ListaDePessoas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 127 128 129 129 130 142 143 144 145 145 149 150 150 151 152 152 154 155 155 156 157 157

11.1 Um programa que demonstra usos das constantes da classe Math . . . . . . . . . . . . . . 11.2 Um programa que demonstra usos de mtodos de comparao e arredondamento da classe Math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 Um programa que demonstra usos de mtodos trigonomtricos da classe Math . . . . . . 11.4 Um programa que demonstra usos de mtodos exponenciais da classe Math . . . . . . . . 11.5 Um programa que demonstra usos do mtodo random da classe Math . . . . . . . . . . . 12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9 12.10 12.11 12.12 13.1 13.2 13.3 13.4 13.5 13.6 13.7 13.8 A.1 A.2 A.3 A.4 A.5 A.6 A.7 A.8 A.9 A.10 A.11 A.12 A.13 Vrios erros de sintaxe em um programa exemplo . . . . . . . . . . . . . . . . . . . . . Erros em potencial de um programa exemplo . . . . . . . . . . . . . . . . . . . . . . . . Correo dos erros em potencial de um programa exemplo . . . . . . . . . . . . . . . . . Estrutura de um bloco try/catch/finally . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de programa que processa erros atravs de excees . . . . . . . . . . . . . . . Outro exemplo de programa que processa erros atravs de excees . . . . . . . . . . . . A classe ArrayDeFloats com mtodos que lanam excees . . . . . . . . . . . . . . . Uma classe que representa uma exceo . . . . . . . . . . . . . . . . . . . . . . . . . . . A classe ArrayDeFloats com mtodos que lanam excees ExcecaoDeArray . . . . . Uma classe que representa uma exceo que deve ser pega . . . . . . . . . . . . . . . . . A classe ArrayDeFloats com mtodos que lanam excees ExcecaoRigorosaDeArray Um programa que usa a classe ArrayDeFloats com excees que devem obrigatoriamente ser pegas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Um programa que l as linhas de um arquivo como Strings . . . . . . . . . . . . . . . . . 162 Listagem parcial do arquivo que contm informaes sobre livros de uma livraria . . . . . 163 Classe que representa um Livro de Livraria . . . . . . . . . . . . . . . . . . . . . . . . . 164 Programa que usa a classe LivroLivraria e l os dados de um arquivo . . . . . . . . . . 164 Um programa que grava Strings em um arquivo . . . . . . . . . . . . . . . . . . . . . . . 166 Um programa que l valores do tipo oat de um arquivo . . . . . . . . . . . . . . . . . . 168 A classe ContaBancaria que faz operaes de gravao e leitura em um arquivo . . . . . 170 Programa que usa instncias da classe ContaBancaria (inicializadas a partir de um arquivo)171 Programa que demonstra usos do tipo byte . . . . . . . Programa que demonstra usos incorretos do tipo byte . Programa que demonstra cast (converso) de tipos . . . Programa que demonstra usos do tipo char . . . . . . . Programa que demonstra usos incorretos do tipo char . Programa que demonstra usos do tipo short . . . . . . Programa que demonstra usos incorretos do tipo short Programa que demonstra usos do tipo int . . . . . . . Programa que demonstra usos incorretos do tipo int . . Programa que demonstra usos do tipo long . . . . . . . Programa que demonstra usos incorretos do tipo long . Programa que demonstra usos do tipo float . . . . . . Programa que demonstra usos incorretos do tipo float . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 179 179 180 180 181 182 182 182 183 183 184 185

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

ix A.14 A.15 A.16 A.17 A.18 A.19 A.20 A.21 A.22 A.23 A.24 A.25 A.26 A.27 A.28 A.29 A.30 A.31 A.32 A.33 A.34 A.35 A.36 B.1 B.2 B.3 B.4 B.5 B.6 B.7 B.8 B.9 B.10 B.11 B.12 B.13 Programa que demonstra usos do tipo double . . . . . . . . . . Programa que demonstra usos incorretos do tipo double . . . . . Programa que demonstra usos do tipo boolean . . . . . . . . . . Programa que demonstra usos incorretos do tipo boolean . . . . Programa que demonstra usos da classe String . . . . . . . . . Programa que demonstra usos de concatenao da classe String Programa que demonstra usos incorretos da classe String . . . . Programa que demonstra usos da classe Byte . . . . . . . . . . . Programa que demonstra usos incorretos da classe Byte . . . . . Programa que demonstra usos da classe Character . . . . . . . Programa que demonstra usos incorretos da classe Character . . Programa que demonstra usos da classe Short . . . . . . . . . . Programa que demonstra usos incorretos da classe Short . . . . Programa que demonstra usos da classe Integer . . . . . . . . . Programa que demonstra usos incorretos da classe Integer . . . Programa que demonstra usos da classe Long . . . . . . . . . . . Programa que demonstra usos incorretos da classe Long . . . . . Programa que demonstra usos da classe Float . . . . . . . . . . Programa que demonstra usos incorretos da classe Float . . . . Programa que demonstra usos da classe Double . . . . . . . . . Programa que demonstra usos incorretos da classe Double . . . . Programa que demonstra usos da classe Boolean . . . . . . . . . Programa que demonstra usos incorretos da classe Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 186 186 187 188 189 189 191 191 192 193 193 194 195 196 196 197 197 198 199 199 200 200 202 203 203 204 204 205 206 206 207 207 208 209 210

Exemplo de uso da classe Keyboard para leitura de valores tipo boolean . . . . Exemplo de uso da classe Keyboard para leitura de valores tipo byte . . . . . . Exemplo de uso da classe Keyboard para leitura de valores tipo char . . . . . . Exemplo de uso da classe Keyboard para leitura de valores tipo short . . . . . Exemplo de uso da classe Keyboard para leitura de valores tipo int . . . . . . . Exemplo de uso da classe Keyboard para leitura de valores tipo long . . . . . . Exemplo de uso da classe Keyboard para leitura de valores tipo float . . . . . Exemplo de uso da classe Keyboard para leitura de valores tipo double . . . . . Exemplo de uso da classe Keyboard para leitura de instncias da classe String Mais exemplos de usos da classe Keyboard . . . . . . . . . . . . . . . . . . . . Exemplo de uso da classe Keyboard na classe Aluno . . . . . . . . . . . . . . . Exemplo de uso da classe Aluno com instncias da classe Keyboard . . . . . . A classe Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

Lista de Tabelas
3.1 Tipos bsicos de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

A.1 Combinaes especiais de caracteres e resultados em Strings . . . . . . . . . . . . . . . . 188 C.1 Exemplos de nomes de arquivos e classes geradas pelo compilador . . . . . . . . . . . . . 219 C.2 Alguns erros de compilao e execuo, suas causas e possveis solues . . . . . . . . . . 220 D.1 Comandos bsicos de teclado para o Emacs/Xemacs . . . . . . . . . . . . . . . . . . . . . 224

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

Captulo 1 Sobre este livro


1.1 O que este livro ?

Este livro contm o material sugerido para as disciplinas Programao Orientada a Objetos I e Programao Orientada a Objetos II dos cursos de Cincia da Computao e Engenharia da Computao oferecidos pela Faculdade de Cincia da Computao da Universidade do Vale do Paraba (UNIVAP). Ao desenvolver este livro, as motivaes principais foram apresentar os conceitos de programao orientada a objetos com clareza e simplicidade, mostrando exemplos e sugerindo problemas prticos e ilustrativos dos conceitos. Muitos livros de programao orientada a objetos, especialmente usando a linguagem Java, concentram-se em aspectos visuais, deixando a teoria necessria para melhor compreenso das tcnicas de lado. Na maioria dos casos, demonstraes das capacidades da linguagem so apresentadas desde cedo, sem as explicaes necessrias para compreenso do que acontece nos programas-exemplo. Em contraste, este livro concentra-se nas tcnicas de programao orientada a objetos, deixando a parte visual para os ltimos captulos. Espera-se que com isto os alunos estejam mais confortveis com os conceitos de classes e objetos quando forem utiliz-los em aplicaes grcas. Este livro tambm pode ser usado por outros estudantes interessados em tcnicas de programao orientada a objetos e na linguagem Java, e possivelmente por turmas inteiras, se o professor da disciplina correspondente estiver interessado. Em qualquer caso, por favor informe o autor por e-mail (rafael@univap.br), para comentrios, correes, sugestes e/ou incentivo melhorias. Este livro denitivamente no um guia completo linguagem Java ou orientao a objetos - vrios conceitos tericos e detalhes prticos da linguagem sero deixados de lado. O enfoque dado aos aspectos bsicos e mais prticos. Material complementar este livro pode ser encontrado na pgina http://www1.univap.br/rafael, assim como novas verses e ltimas notcias. Eventualmente um manual do instrutor com todas as respostas aos exerccios propostos ser colocado disposio de instrutores interessados em adotar o livro para seus cursos. Adicionalmente, um site de suporte com exemplos, perguntas e respostas e listas de discusso (ainda em desenvolvimento) ser colocado disposio de usurios, dependendo do interesse e do feedback deste livro para o autor. Esta verso do livro est sendo colocada disposio dos interessados como uma cortesia da Faculdade de Cincia da Computao da Universidade do Vale do Paraba. Ningum tem o direito de cobrar pelo acesso ou cpias deste livro sem a permisso expressa da Faculdade de Cincia da Computao e do autor do livro - em caso de dvida, consulte o autor por e-mail (rafael@univap.br).
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

As verses do livro so identicadas por sua data - esta verso foi compilada em 29 de maio de 2000, e contm 164 programas e 326 exerccios, sendo que 132 so de uma estrela, 106 so de duas estrelas, 62 so de trs estrelas, 19 so de quatro estrelas e 7 so de cinco estrelas. Verique regularmente a pgina http://www1.univap.br/rafael para novas verses, anncios e informaes.

1.2 Como usar este livro


Esta verso deste livro est disponibilizada como um livro digital, no formato PDF, que pode ser lido pelo software Adobe Acrobat Reader. Este software distribudo gratuitamente pela Adobe, e pode ser copiado do site da Adobe (http://www.adobe.com), onde verses para diversos sistemas operacionais podem ser encontradas. Para usar este livro na sua forma eletrnica, basta copi-lo para um computador com o Acrobat Reader instalado e abri-lo usando o Acrobat Reader. O livro tambm pode ser impresso atravs do Adobe Acrobat Reader, mas vrias das caractersticas interessantes disponveis na verso digital (links diretos para sees, listagens e guras, ndices que funcionam como links, etc.) sero, evidentemente, perdidas. Adicionalmente, novas verses com correes e modicaes podem estar sendo liberadas brevemente, invalidando impresses anteriores. FCC/UNIVAP Usurios de computadores que rodam Linux nos laboratrios da FCC podem acessar a ltima verso deste livro diretamente dos seus terminais com o comando acroread -geometry 800x555 POO/POO.pdf. O parmetro -geometry 800x555 faz com que a tela no aparea maximizada, garantindo a visibilidade dos menus e barra da janela do acroread.

1.3

Sobre a organizao deste livro

Cada captulo deste livro dedicado a um tema especco que pode ser coberto em uma ou mais aulas tericas e de laboratrio. Os captulos (presentes nesta verso) e seu contedo so: Captulo 2: Introduo a Programao Orientada a Objetos apresenta conceitos bsicos de programao orientada a objetos, esclarecendo as diferenas e relaes entre modelos, classes, objetos e instncias. Neste captulo, os conceitos apresentados so puramente tericos, mas essenciais para a compreenso dos princpios bsicos de orientao a objetos. Captulo 3: Criando Classes em Java mostra como criamos classes em Java usando os tipos de dados e mecanismos de criao de mtodos. Apndice A: Tipos de Dados em Java apresenta os diferentes tipos de dados e classes bsicas da linguagem Java, incluindo caractersticas e problemas relacionados representao de tipos e classes nativas em Java e vrios programas-exemplo. Apndice B: A classe Keyboard apresenta a classe Keyboard, adaptada do livro An Introduction to Computer Science Using Java, de Samuel N. Kamin, M. Dennis Mickunas e Edward M. Reingold, que permite a leitura de valores de tipos nativos do teclado, adicionando exibilidade aos programas.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

1.3.1 Planos para futuras verses deste livro


Futuras verses deste livro contero material sobre: Interfaces e mecanismo de herana com interfaces e implementaes. O modicador final e suas aplicaes.

1.3.2 Convenes usadas neste livro


Para simplicar a leitura deste livro, fontes diferentes sero usadas para destacar alguns elementos do texto. Nomes de classes, mtodos, pacotes, comandos, etc. sero mostrados em fonte proporcional. Conceitos apresentados pela primeira vez sero mostrados em fonte itlica. Adicionalmente, programas includos no texto sero mostrados com diferentes cores para facilitar a leitura: comentrios em vermelho, conjuntos de caracteres em cinza, palavras reservadas em diferentes cores de acordo com sua categoria. As linhas dos programas tambm sero numeradas para fcil referncia. Alguns tpicos, exerccios, arquivos, ferramentas, etc. mencionados neste livro esto disponveis somente para alunos da Faculdade de Cincia da Computao da Universidade do Vale do Paraba. Estes tpicos estaro marcados com FCC/UNIVAP.

1.3.2.1 Convenes para os exerccios propostos Ao nal de cada captulo, alguns exerccios sero apresentados. Estes exerccios sero marcados com um nmero de estrelas que indicam a sua diculdade: Uma estrela ( ): Exerccios tericos ou prticos que podem ser resolvidos rapidamente, geralmente atravs de consultas a programas mostrados ou respostas de outros exerccios, e modicao de exemplos ou outras respostas. Em muitos casos podem ser resolvidos mentalmente, isto , sem a necessidade de escrever, compilar e executar programas. Duas estrelas ( ): Exerccios tericos ou prticos que exigem um pouco mais de raciocnio e modicaes ligeiras de exemplos apresentados. Exerccios desta categoria geralmente precisaro ser compilados e executados para vericao dos resultados. Trs estrelas ( ): Exerccios que requerem compreenso mais completa dos conceitos envolvidos, mas mesmo assim podem ser resolvidos com base em exemplos ou respostas a outros exerccios. Quatro estrelas ( ): Exerccios que requerem compreenso mais profunda dos conceitos e que geralmente no podem ser resolvidos tomando como base exemplos ou respostas a outros exerccios. Cinco estrelas ( ): Exerccios que requerem a soluo de um problema mais completo e complexo, envolvendo vrios conceitos diferentes da disciplina. Estes exerccios podem servir como base para projetos mais interessantes. FCC/UNIVAP Alguns exerccios esto marcados com Novo ! : estes exerccios foram includos nos captulos algum tempo depois da disponibilizao ocial dos mesmos. Estes novos exerccios no sero usados para criao das provas, mas devem ser feitos para aumentar a compreenso dos tpicos relacionados.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

1.4

Porqu Java ?

Existem diversas linguagens de programao orientadas a objeto, cada uma com diferentes caractersticas e apelos de mercado, educacionais ou acadmicos. Nesta seo, as razes da escolha de Java sobre outras possveis linguagens (C++, Eiffel, Smalltalk) sero apresentadas. Java obrigatoriamente orientada a objetos. Algumas linguagens permitem que objetos e variveis existam em diversos pontos de um programa, como se estivessem desatreladas de qualquer estrutura exceto funes. Em Java, todas as variveis e mtodos devem estar localizados dentro de classes, forando o uso de orientao a objetos at mesmo em tarefas simples. Dessa forma, o estudante de programao orientada a objetos que esteja usando Java estar usando mais as tcnicas de POO. Java simples. A estrutura de programas e classes em Java segue a organizao de linguagens tradicionais como C e C++, mas sem elementos que tornam programas e programao mais complexos. Aps o aprendizado dos conceitos bsicos de programao orientada a objetos, o estudante da linguagem pode comear a criar aplicativos teis e complexos. A simplicidade se reete tambm na maneira com que arquivos contendo programas em Java so compilados e executados: se as recomendaes bsicas forem seguidas, o compilador se encarregar de compilar todas as classes necessrias em uma aplicao automaticamente, sem necessidade de arquivos adicionais de congurao e incluso de bibliotecas. Java porttil. O cdigo-fonte de um programa ou classe em Java pode ser compilado em qualquer computador, executando qualquer sistema operacional, que tenha uma mquina virtual Java adequada (veja o apndice C). Adicionalmente, as classes criadas podem ser copiadas e executadas em qualquer computador nas mesmas condies, aumentando a utilidade da linguagem atravs da independncia de plataformas. Java gratuita. A mquina virtual Java, mencionada acima, est disposio para cpia no site da Sun e em vrios outros. Compiladores simples, de linha de comando (sem interfaces visuais elaboradas) fazem parte do JDK, o ambiente de desenvolvimento gratuito de Java. Aplicaes em Java precisam de uma mquina virtual para sua execuo, mas no existem sequer royalties de distribuio, fazendo de Java uma plataforma extremamente econmica para desenvolvedores e usurios nais. Java robusta. Administrao de memria (alocao e liberao) e o uso de ponteiros, duas das fontes de erros e bugs mais frequentes em programas em C e C++, so administrados internamente na linguagem, de forma transparente para o programador. De maneira geral, programas em Java tem restries no acesso memria que resultam em maior segurana para os programas sem diminuir a utilidade dos mesmos. Java tambm tem um poderoso mecanismo de excees que permitem melhor tratamento de erros em tempo de execuo dos programas. Java tem bibliotecas prontas para diversas aplicaes. As bibliotecas de classes de Java contm vrias classes que implementam diversos mecanismos de entrada e sada, acesso Internet, manipulao de Strings de alto nvel, poderosas estruturas de dados, utilitrios diversos e um conjunto completo de classes para implementao de interfaces grcas. Vale a pena relembrar que estas bibliotecas so padro de Java - qualquer mquina virtual Java permite o uso destas bibliotecas, sem a necessidade de instalar pacotes adicionais, e quemesmo que o compilador usado no tenha interface grca similar de linguagens visuais, os programas criados com este compilador podem ter interfaces grcas complexas.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

1.4.1 Tipos de Programas em Java


Existem basicamente trs tipos de programas que podem ser criados em Java: Classes para representao de modelos. Classes so usadas para representar, em linguagem de programao, modelos e abstraes de dados como os mostrados no captulo 2. Classes no podem ser executadas diretamente, mas instncias destas classes podem ser usadas dentro de aplicaes e applets. Criao de classes em Java ser vista na seo 3.2. Classes como conjuntos de rotinas. Classes podem conter somente mtodos (rotinas) ao invs de representar dados. Estas classes funcionam como uma biblioteca de mtodos ou funes que tem algo em comum. A criao deste tipo de classes ser vista na seo 4.5 (listagem 4.8). Aplicaes ou Programas. Aplicaes ou programas podem ser executadas a partir de um terminal do Linux ou da janela do MS-DOS, podendo envolver ou no maior interao com o usurio, e podendo ou no ter uma interface grca. Criao de programas em Java ser coberta no captulo 4. Applets. Applets so programas executveis em Java que podem ser embutidos em pginas da Internet. Sua execuo controlada pelo navegador que est sendo usado para ler as pginas. Por razes de segurana, applets so limitadas nas tarefas que podem fazer, e obrigatoriamente devem ter interface grca. Para este curso, somente sero criadas e usadas classes e programas, dada a sua simplicidade e abrangncia de aplicaes.

1.5

Informaes para alunos da FCC/Univap

Esta seo contm informaes sobre o uso deste livro na FCC/Univap nas disciplinas Programao Orientada a Objetos I e Programao Orientada a Objetos II.

1.5.1

Sobre a disciplina Programao Orientada a Objetos I

A disciplina Programao Orientada a Objetos I visa levar os estudantes a: Compreender a metodologia de programao orientada a objetos; Compreender os conceitos e aplicaes de encapsulamento, herana, polimorsmo e sobrecarga; Entender como os conceitos podem ser usados para criao de programas orientados a objetos na linguagem Java; Entender os conceitos e funcionamento de algumas das classes mais comuns de Java. As unidades da disciplina Programao Orientada a Objetos I (com os captulos correspondentes neste livro) so: 1. Introduo aos conceitos de Programao Orientada a Objetos e comparao com Programao Procedural. 2. Fundamentos do Paradigma Programao Orientada a Objetos: Tipos Abstratos de Dados, Classes e Objetos (Captulo 2), Encapsulamento (Captulo 2), Herana, Polimorsmo e Sobrecarga. Implementao dos conceitos em Java. 3. Programao em Java: Conceitos Bsicos, Comandos de Iterao, Comandos de Deciso, Vetores de Dados. 4. Classes e Mtodos para Entrada e Sada.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

1.5.2 Sobre a disciplina Programao Orientada a Objetos II


A disciplina Programao Orientada a Objetos II visa levar os estudantes a: Compreender as vantagens e problemas da extenso de classes nativas de Java; Conhecer e ser capaz de criar programas com interfaces grcas em Java; Compreender os mecanismos e a implementao de programas com eventos; Conhecer ferramentas da linguagem Java para interao pela Internet. As unidades da disciplina Programao Orientada a Objetos II (com os captulos correspondentes neste livro) so: Introduo classes de estruturas de dados genricas de Java: String, Vector, Hashtable, Classes que representam tipos nativos. Programao usando sockets e usando URLs para obter dados via Internet. Programao de aplicaes com interfaces grcas: o Abstract Windowing Toolkit. Programao com uxo linear e programao com eventos: registrando e processando eventos.

1.6

Agradecimentos

Este livro no teria sido possvel sem o incentivo e pacincia da minha esposa, Yukari, qual sou grato por muitas outras coisas. Agradeo tambm colegas da Univap pelo incentivo criao deste livro, e aos alunos que colaboraram de uma forma ou de outra.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

Captulo 2 Introduo a Programao Orientada a Objetos


2.1 O que so modelos ?

Modelos so representaes simplicadas de objetos, pessoas, itens, tarefas, conceitos, idias, etc., usados comumente por pessoas no seu dia-a-dia, independente do uso de computadores. A simplicao inerente aos modelos nos permite armazenar, representar, processar e trocar informaes de maneira eciente. Muitas vezes a simplicao necessria para que no tenhamos que representar informaes inteis em determinado contexto. Por exemplo, consideremos a tarefa de representar os dados relativos uma pessoa: se estamos pensando em uma pessoa que faz parte de uma folha de pagamento de empregados, representaremos o nome, o cargo e o salrio desta pessoa. Se estamos considerando que esta pessoa faz parte do banco de dados de pacientes de um mdico, representaremos o nome, o sexo, a idade, a altura, o peso e o histrico de consultas desta pessoa. Ainda, se queremos representar os dados de um amigo ou conhecido na nossa lista telefnica particular, usaremos o seu nome, seu endereo e seu telefone. Podemos notar que os trs modelos citados representam, cada um a seu modo, uma pessoa, e no existe necessidade nem sentido em criar um super modelo capaz de representar cada dado relativo uma pessoa e usar este modelo em cada ocasio em que se faz necessrio: seria absurdo ou ao menos sem propsito representarmos o histrico de consultas de uma pessoa em uma lista telefnica pessoal ou representarmos o salrio na nossa lista telefnica. Modelos, alm de conterem dados necessrios para representar um objeto ou conceito qualquer, podem conter operaes relativas aos dados contidos neles. Por exemplo, no modelo pessoa-paciente descrito acima, poderamos ter as operaes adiciona-informao-ao-histrico, que adicionaria informaes recentes ao histrico do paciente, ou verifica-obesidade, que usaria os dados sexo, idade, altura e peso para vericar se aquela pessoa est com o peso ideal para sua categoria. Similarmente, podemos imaginar uma operao calcula-horas-extras no modelo pessoa-empregado. Estas operaes tem sentido somente para os modelos que representam dados que podem ser processados por eles: no h sentido em termos a operao verifica-obesidade disponvel para uso na nossa lista telefnica. Modelos podem ser reutilizados innitamente para representar diferentes objetos, pessoas ou itens: nos exemplos mostrados acima, o modelo adequado seria usado para cada pessoa distinta na lista telefnica ou na folha de pagamento. Considere a representao dos dados dos livros em uma biblioteca: um modelo que contenha os dados ttulo, autor, nmero-de-registro, editora e outros poderia ser usado para representar os livros, mas cada um dos livros ter um ttulo, autor, etc. diferente dos outros.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

Modelos podem tambm conter outros modelos: se resolvermos representar os dados de uma data usando um modelo chamado, por exemplo, data-de-calendrio que contenha valores para representar dia, ms e ano, podemos, sempre que a representao de uma data for necessria, usar o modelo criado ao invs de representarmos separadamente o dia, ms e ano desta data. Em outras palavras, ao invs de separadamente usarmos valores para dia, ms e ano em outros modelos, podemos usar o data-de-calendrio que foi criado anteriormente. Por exemplo, em um modelo mais completo para os livros da biblioteca, poderamos incluir a data-de-aquisio que seria baseada no modelo data-de-calendrio (contendo os dados deste). Em resumo, a criao e uso de modelos uma tarefa natural e a extenso desta abordagem programao deu origem ao paradigma Programao Orientada a Objetos.

2.2

O que Programao Orientada a Objetos ?

Programao Orientada a Objetos ou, abreviadamente, POO, um paradigma de programao onde se usam objetos, criados a partir dos modelos descritos anteriomente, para representar e processar dados usando programas de computadores. Em Programao Orientada a Objetos, os dados pertencentes aos modelos so representados por tipos de dados nativos, caractersticos da linguagem de programao, ou de outros modelos criados pelo programador. As principais diferenas entre os modelos naturais descritos na seo 2.1 e os articiais 1 criados em programas orientados a objetos so a limitao nas tarefas que um computador pode executar e a limitao da prpria linguagem de programao. Como exemplo das diferenas entre modelos do mundo real e os implementados em linguagens de programao, consideremos a operao adiciona-informao-ao-histrico, do modelo pessoa-paciente, descrito anteriormente. Podemos imaginar que no mundo real esta operao se resume a escrever em uma cha prpria as informaes adicionais, que provavelmente estaro juntas s informaes prvias (em uma cha, por exemplo). A implementao deste modelo e operao em programas de computador provavelmente ter que ser feita usando arquivos para armazenar as informaes, e provavelmente existiro restries quanto ao tipo e tamanho das informaes a serem adicionadas - possivelmente somente informaes textuais podero ser armazenadas, mas no grcos. Modelagem dos dados e operaes nestes dados em um programa de computador, apesar das limitaes, permite processamento de dados de forma mais coesa, natural e menos suscetvel erros de programao. Por outro lado, mais ateno tem que ser dada ao design dos modelos que sero implementados. Os detalhes de implementao de modelos em Java sero dados no captulo 3, mas antes alguns detalhes tericos precisam ser elucidados.

2.3 Classes, Objetos e Instncias


Embora o paradigma seja conhecido como Programao Orientada a Objetos, programadores que o usam criam classes, que so relacionadas diretamente com os modelos descritos anteriormente.
modelo, por se tratar de uma simplicao do mundo real, um pouco articial. Os termos natural e articial so usados para distinguir a linguagem usada para descrever os modelos: nos modelos imaginrios apresentados nesta seo podemos usar palavras para descrever os atributos e as operaes em cada modelo, mas quando usamos uma linguagem de programao estamos limitados ao vocabulrio articial desta, da os termos usados na distino.
1 Todo

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

Classes so escritas com os recursos da linguagem de programao orientada a objetos para implementao dos modelos, mas elas no podem ser utilizadas diretamente nos programas - classes so somente moldes ou formas que representam os modelos abstratamente. Nos modelos e classes, sabemos que o dado endereo do modelo lista-telefnica representa o endereo, mas no h como determinar de quem o endereo, ou seja, o dado representa uma informao genrica e no uma informao sobre uma pessoa cujos dados so usados no modelo. Para que possamos representar dados especcos usando classes necessrio que criemos objetos, instncias, exemplos ou amostras desta classe. Um objeto ou instncia (termos mais comumente usados) uma materializao da classe, e pode ser usado para representar dados. Para cada item que queiramos representar no nosso programa, devemos criar um objeto da classe adequada. Um exemplo mais detalhado dado na gura 2.1.

Objeto Automvel
Nmero de passageiros: 5 Velocidade Mxima: 200 km/h areo ?: no terrestre ?: sim

Objeto Jato Comercial

Classe Veculo
Nmero de passageiros Velocidade Mxima areo ? terrestre ?

Nmero de passageiros: 260 Velocidade Mxima: 950 km/h areo ?: sim terrestre ?: no

Objeto Motocicleta
Nmero de passageiros: 2 Velocidade Mxima: 250 km/h areo ?: no terrestre ?: sim

Objeto Navio
Nmero de passageiros: 450 Velocidade Mxima: 90 km/h areo ?: no terrestre ?: no

Figura 2.1: Uma classe veculo e vrios objetos desta classe. Na gura 2.1 temos uma classe Veculo e quatro objetos desta classe. Cada objeto um veculo, ento cada objeto ter as mesmas informaes (Nmero de passageiros, areo, etc.), mas os valores destas informaes (suas caractersticas) sero diferentes para cada objeto. Podemos dizer que a classe representa todos os objetos de maneira abstrata, sem entrar em detalhes de cada um. Nota-se que neste exemplo a classe Veculo contm somente valores ou atributos, mas no operaes.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

10

2.4

Encapsulamento

Nos exemplos descritos at agora, os dados relativos um modelo qualquer foram agrupados ou encapsulados em uma classe. O encapsulamento de dados em uma classe uma das caractersticas mais importantes e teis de Programao Orientada a Objetos. O encapsulamento dos dados e operaes para processamento destes dados nos garante que, ao criarmos instncias ou objetos desta classe, todos os dados e operaes necessrios para representar o objeto e processar seus dados estaro presentes. Outra funo importante do encapsulamento a ocultao de informao: se uma classe bem preparada, ela pode ter operaes que permitam a um programador modicar e ler os dados representados, mas no diretamente, para garantir a integridade destes dados. Toda a manipulao dos dados seria feita atravs de interfaces que seriam operaes especcas para manipulao dos dados das classes. Como exemplo, consideremos a classe Data, que implementa o modelo de mesmo nome, descrito anteriormente. Esta classe conteria valores para representar o dia, ms e ano da data. Se um programador fosse usar um objeto desta classe em um programa e tivesse livre acesso aos dados encapsulados, ele ou ela poderia tentar colocar valores invlidos nos dados, como por exemplo, 45 no valor que representa o dia. Seria desejvel que o valor que representa o dia casse escondido dentro da classe, e que a nica maneira de modicar este valor fosse atravs de uma operao que vericaria se o valor passado vlido.

2.5

Mais Exemplos de Classes e Objetos

Para exemplicar melhor os conceitos de modelos, classes, objetos, encapsulamento e operaes, veremos alguns exemplos mais detalhados nesta seo. Exemplo 1: Uma Lmpada Incandescente Consideremos um modelo para uma lmpada incandescente comum - este modelo tem alguns atributos e operaes que so ilustrados pela gura 2.2.

Atributos
Estado (ligada ou desligada)

Operaes
Ligar Desligar

Figura 2.2: Uma lmpada, seus atributos e operaes Uma lmpada incandescente comum tem um estado, que pode ser ligada ou desligada. Este estado pode ser modicado atravs das operaes ligar e desligar. Desta forma, todo o mecanismo de funcionamento de lmpadas estaria encapsulado na classe mostrado na gura 2.2. Instncias da classe lmpada
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

11 poderiam ser usadas para representar lmpadas especcas, que a qualquer momento podem ter estados diferentes (uma lmpada pode estar ligada e outra, desligada). Uma classe que representasse este modelo poderia, atravs do encapsulamento, garantir que um programador que usasse instncias da classe lmpada poderia modicar seu estado acesa/apagada somente atravs das operaes ligar/desligar. Desta forma, quando vrias instncias ou objetos da classe lmpada forem criados (por exemplo, lmpada_sala, lmpada_quarto, etc.) cada uma ter seu atributo acesa/apagada e poder ser ligada/desligada atravs da suas operaes ligar/desligar. Nota-se que alguns atributos bvios que denem uma lmpada incandescente foram deixados de lado, como consumo em watts, tamanho e cor do bulbo. A deciso sobre o que deve ou no pertencer um objeto um pouco arbitrria, e dependente da aplicao - para um exemplo simples, os dados mostrados na gura 2.2 bastam, enquanto que para uma aplicao real de controle de qualidade, por exemplo, dados como nmero do lote, data de fabricao e unidade produtora seriam necessrios. Exemplo 2: Uma data Consideremos o exemplo de uma data simples (como a de um evento como aniversrio, etc.) - esta data tem alguns atributos e operaes que so mostrados na gura 2.3.

Atributos
Dia Ms Ano

March 2000

Operaes
Ajusta dia Ajusta ms Ajusta ano Ajusta simultaneamente dia, ms e ano Imprime data

Figura 2.3: Uma data, seus atributos e operaes Uma data conforme o modelo acima tem os atributos dia, ms e ano, que representam valores distintos com faixas de valores aceitveis distintas. O ms pode ser representado por um valor numrico de 1 a 12 ou pelos nomes dos meses (Janeiro, Fevereiro, etc.). Pode-se imaginar que algumas das operaes da classe que implementa o modelo data so redundantes para que ajustar ou inicializar os valores dia, ms e ano atravs de operaes quando podemos fazer isto diretamente ? A resposta simples: quando a classe for implementada em uma linguagem de programao, os atributos sero representados por tipos de dados dependentes da linguagem de programao. Por exemplo, o valor dia ser representado por um valor numrico, que pode representar valores numa faixa muito mais ampla do que o necessrio para representar um dia. Isso signica que um usurio da classe data poderia, por desateno, atribuir o valor 45 ao dia. Para impedir que valores indevidos sejam colocados nos atributos, podemos fazer com que eles passem por um ltro, que so operaes que, antes de atribuir valores atributos, vericam se estes valores so
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

12 realmente vlidos. Uma verso simplicada da operao ajusta_dia2 na classe data poderia vericar se um valor passado pelo usurio adequado, e caso no seja, mostre uma mensagem de erro. As operaes consideradas neste exemplo permitem que valores sejam atribudos separadamente para os atributos dia, ms e ano, ou todos de uma vez atravs da operao ajusta_dia_ms_ano. posvel tambm solicitar s instncias da classe data que imprimam os valores atravs da operao imprime_data. Exemplo 3: Um registro acadmico de aluno O modelo do prximo exemplo representa uma registro acadmico simplicado de um aluno em uma faculdade. Esta cha contm os atributos nome, nmero_de_matrcula, data_de_nascimento, ano (em que se encontra no curso), turma e _bolsista. Podemos pensar neste registro como um formulrio a ser preenchido com os valores acima. A gura 2.4 mostra os atributos e operaes de uma classe que implementa este registro.

Atributos
Nome Nmero de Matrcula Data de Nascimento Ano Turma Tem bolsa de estudos ?

Operaes
Entra os dados Imprime os dados Calcula a mensalidade

Figura 2.4: Um registro de aluno, seus atributos e operaes Na gura 2.4, alm dos atributos descritos anteriormente, temos as operaes entra_dados, que seria encarregada de vericar se dados passados por um usurio so condizentes com os esperados dentro da classe, e a operao imprime_dados que poderia imprimir os dados da classe formatados como um relatrio. Uma operao interessante que pode ser denida nesta classe a calcula_mensalidade que, a partir dos valores dos atributos ano (em que se encontra no curso) e _bolsista de uma instncia da classe, calcule o valor da mensalidade a ser paga. Este mais um exemplo de uso das operaes embutidas em um objeto - ao invs de entrarmos o valor da mensalidade manualmente em um registro acadmico de aluno (no modelo do mundo real), possibilitamos que valores da mensalidade sejam calculados pela classe (usando uma linguagem de programao e o conceito de operaes). Exemplo 4: Um modelo de computador (para compra em loja virtual) Consideremos o seguinte exemplo: uma empresa de computadores pessoais oferece, via uma loja virtual na Internet ou um catlogo de vendas por encomenda, a possibilidade do usurio escolher a congurao exata do computador que quer comprar. Para isto, criou uma classe para representar os computadores, mostrada na gura 2.5.
nomes dados s operaes so diferentes dos mostrados nas guras dos exemplos: os nomes mostrados nos textos seguem regras das linguagens de programao enquanto os das guras so mais descritivos.
2 Os

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

13

Atributos
Processador MB de memria RAM GB de disco Tamanho do monitor

Operaes
Entra os dados Imprime os dados Calcula o preo

Figura 2.5: Um modelo de computador, seus atributos e operaes Na gura 2.5 temos todos os atributos necessrios para congurar o computador, alm das operaes entra_dados, usada para que um cliente entre os dados do computador que quer, imprime_dados, para impresso de um relatrio de compras ou nota scal e calcula_preo para que o preo seja calculado de acordo com a congurao escolhida. Da mesma maneira que com a classe data mostrada no exemplo 2, poderamos dispensar as operaes entra_dados e imprime_dados, mas poderamos ter um problema similar: considerando que cada modelo de computador tem uma limitao na quantidade de memria RAM que pode ter, seria imprudente deixar que um usurio entrasse um valor arbitrrio no campo quantidade_memria_RAM. Da mesma maneira, existem apenas poucos tipos de monitores de vdeo, e o usurio no deveria escolher vontade, mas somente um dos tipos disponveis. A garantia de que somente valores vlidos sero entrados nos atributos pode ser feita atravs de operaes que vericam os valores entrados, ltrando os no-vlidos. Exemplo 5: Uma conta bancria simplicada Como ltimo exemplo nesta seo, consideremos um modelo de uma conta bancria simples, que tem somente um correntista e no tem outras contas vinculadas. A gura 2.6 mostra um modelo grco deste modelo, com os atributos e operaes considerados importantes para ele.

Atributos
Nome do correntista Nmero da conta Data de abertura Saldo conta especial ?

Operaes
Abre a conta (entra os dados) Retira valor Deposita valor Imprime o saldo

Figura 2.6: Uma conta bancria, seus atributos e operaes Na gura 2.6 temos os atributos que denem uma conta bancria e algumas operaes que so variaes de outras j vistas em outros exemplos nesta seo. Duas operaes interessantes so deposita_valor e retira_valor: a primeira adiciona um valor ao atributo saldo enquanto que a segunda subtrai, mas ambas devem implementar mecanismos que garantam o funcionamento correto da classe: devem proibir
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

14 o depsito de valores negativos e retirada de valores acima do saldo, exceto quando a conta for especial (atributo _conta_especial).

2.6

Exerccios do captulo 2

Para os exerccios deste captulo, considere que as classes que so pedidas precisam apenas ter o nome e a descrio de seus atributos e operaes, conforme mostrado nas guras dos exemplos da seo 2.5. Exerccio 2.1: Considere a classe lmpada mostrado no exemplo 1 da seo 2.5 (gura 2.2). Considere que uma lmpada possa ter um terceiro estado, queimada. Que atributos e operaes deveriam ser ento representados pela classe ? Exerccio 2.2: Escreva uma classe que represente uma hora (incluindo minutos e segundos). Dica: use o exemplo 2 da seo 2.5 (gura 2.3) como referncia. Exerccio 2.3: Usando a classes criada no exerccio 2.2 e a classe data mostrada no exemplo 2 da seo 2.5, crie uma classe datahora que represente simultaneamente uma data e uma hora. Dica: no necessrio reescrever classes, basta aproveitar classes j existentes nas que sero criadas (veja o exemplo 3 da seo 2.5 e a gura 2.4). Exerccio 2.4: Escreva uma classe que represente um livro, do ponto de vista de uma biblioteca. Que atributos e operaes devem ser representados pela classe ? (veja tambm o exerccio 2.5). Exerccio 2.5: Escreva uma classe que represente um livro, do ponto de vista de uma livraria. Que atributos e operaes devem ser representados pela classe ? (veja tambm o exerccio 2.4). Exerccio 2.6: Usando como base os exerccios 2.4 ou 2.5, escreva uma classe dicionrio para representar dicionrios de lnguas (ex. portugus-ingls, latim-aramaico, etc.) Que atributos e operaes devem ser representados pela classe ? Quais as diferenas entre a classe usada como referncia e a classe dicionrio ? Exerccio 2.7: Escreva uma classe professor, nos moldes da classe registro_acadmico (veja o exemplo 3 da seo 2.5 e gura 2.4) que contenha dados relativos um professor de uma disciplina qualquer. Exerccio 2.8: Neste captulo vimos algumas classes que contm atributos e operaes ou somente atributos, mas tambm possvel o desenvolvimento e uso de classes que contenham somente operaes. Escreva uma classe arremesso_de_dado, que modele o resultado de um dado arremessado (ou seja, um valor aleatrio), usando somente operaes (no necessrio armazenar os resultados, somente imprim-los).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

15

Exerccio 2.9: Considerando o exerccio 2.8, imagine uma classe variante da classe arremesso_de_dado, que armazene quantas vezes um nmero saiu a cada vez que o dado foi arremessado. Para isto, alguns atributos e operaes devero ser criados. Crie esta classe variante da classe arremesso_de_dado. Exerccio 2.10: Crie uma classe carta_de_baralho. Dica: como supomos que instncias desta classe no devero mudar seus atributos depois de criadas, esta classe dever ter atributos (em contraste com a classe arremesso_de_dado do exerccio 2.8). Exerccio 2.11: Escreva uma classe que represente um time_de_futebol. Que atributos e operaes devem ser representados pela classe ? Exerccio 2.12: Escreva uma classe que represente uma msica (para uso em um banco de dados sobre msicas, por exemplo). Que atributos e operaes devem ser representados pela classe ? Exerccio 2.13: Escreva uma classe que represente um ponto no espao cartesiano de duas dimenses. Dica: imagine um grco no qual voc tenha que marcar ou desenhar pontos, que sero instncias desta classe ponto. Que atributos e operaes devem ser representados por esta classe ? Exerccio 2.14: Escreva uma classe relgio_despertador que use duas instncias da classe hora (exerccio 2.2) para representar a hora atual e a hora em que o despertador dever tocar. Que atributos e operaes devem ser representados por esta classe ? Exerccio 2.15: Considerando o exerccio 2.13, escreva uma classe linha que una duas instncias da classe ponto. Que atributos e operaes devem ser representados por esta classe ? Exerccio 2.16: Escreva uma classe que represente um polgono. Que atributos e operaes devem ser representados pela classe ? Inclua operaes para calcular alguns associados ao polgono (rea, permetro, etc.). Quais seriam as diferenas entre as instncias quadrado e tringulo da classe polgono ? Exerccio 2.17: Considere a gura 2.1. Nela, vrios tipos de veculos esto representados, mas podemos ver que os exemplos fazem parte de duas categorias principais: veculo_areo e veculo_terrestre. Escreva as classes veculo_areo e veculo_terrestre, comentando as diferenas e pontos comuns entre as classes.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

16

Exerccio 2.18: Considere a classe criada no exerccio 2.11. Escreva uma classe partida_de_futebol usando dois time_de_futebol. Que atributos e operaes adicionais seriam necessrios para a classe partida_de_futebol ? Dica: evite reescrever a classe time_de_futebol. Exerccio 2.19: Escreva uma classe que represente um CD_de_msica, usando vrias instncias da classe msica (desenvolvida no exerccio 2.12). Considere que diversas instncias desta classe podem ser criadas, e algumas instncias da classe CD_de_msica podem conter somente uma ou duas instncias de msica, outras podem conter mais de vinte instncias de msica. Como resolver este problema ? Exerccio 2.20: Escreva uma classe que represente uma equao do segundo grau. Que atributos e operaes devem ser denidos nesta classe ? Como fazer com que a classe represente as trs possibilidades de soluo destas equaes ( < 0, = 0 e > 0) ?

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

17

Captulo 3 Criando Classes em Java


3.1 Introduo

No captulo 2 vimos como programao orientada a objetos pode ser usada para modelagem de objetos reais ou no para representao em programas de computador. Este captulo apresenta a complementao prtica terica, atravs da explicao dos conceitos relativos implementao de classes e objetos em Java. Para melhor aproveitamento destas aulas voc deve ter acesso a um computador com o compilador e interpretador Java instalados e um editor de textos apropriado. Veja no apndice C informaes sobre onde o ambiente gratuito de desenvolvimento pode ser encontrado para download ou cpia. FCC/UNIVAP Alunos da FCC/Univap j tem o JDK instalado e pronto para o uso: uma verso atual do JDK e do editor de textos sugerido j est instalada nos computadores rodando Linux ou terminais que possibilitem o acesso contas no Linux nos laboratrios de informtica da Faculdade de Cincia da Computao.

3.2

Criando Classes em Java

Para criar uma classe voc primeiramente precisar edit-la em um editor de textos de sua preferncia. Este editor de textos deve ser capaz de gravar arquivos em formato ASCII - editores como Microsoft Word no so aconselhveis, uma vez que os arquivos criados so gravados em formato binrio. Verique o apndice C para informaes sobre editores de texto sugeridos para uso em Windows e Unix e maiores informaes. Ao digitar uma classe ou programa em Java, alguns cuidados devem ser tomados: Ao gravar o arquivo que contm a classe, a extenso dada deve ser .java - em sistemas operacionais que fazem distino entre nomes e extenses maisculas e minsculas, a extenso deve ser em minsculas. Cuidado especial deve ser tomado com editores de texto que tentam colocar extenses prprias nos arquivos gravados por eles. Java considera que caracteres maisculos e minsculos so diferentes em programas: nomes dos identicadores nos programas so considerados diferentes se qualquer dos seus caracteres for diferente. Por exemplo, os identicadores nome, Nome, NOME e NoMe so considerados diferentes, e uso indiscriminado das diversas formas pode gerar erros de compilao.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

18 Em muitas estruturas de classes e programas, chaves ({ e }) so usadas para marcar blocos dos programas. Para cada smbolo { deve haver um smbolo } correspondente, caso contrrio erros de compilao podem ocorrer. Todos os comandos em Java (declaraes, chamadas de mtodos, etc.) so terminados por pontos-evirgulas (;), mas algumas denies (nomes das classes, nomes e argumentos dos mtodos, declaraes de laos, etc.) no devem ser terminados por pontos-e-virgulas - descuido na colocao dos pontos-e-virgulas pode levar a erros de compilao e execuo. extremamente aconselhvel que se coloque cada classe em Java em um arquivo separado, ou seja, que se evite colocar todos os programas e classes em um nico arquivo. Adicionalmente, colocar cada classe em um arquivo com o nome da classe tambm aconselhvel - por exemplo, uma classe chamada aluno deve ser escrita no arquivo aluno.java. A estrutura bsica de uma classe mostrada na listagem 3.1. Esta classe est completamente vazia, mas sua sintaxe est correta, e ela pode ser compilada pelo compilador sem problemas. Listagem 3.1: Uma classe vazia em Java
1 2 3 4 5 6 7 8

/* Esta a nossa primeira classe, que deve estar muito bem documentada. Autor: Rafael Santos Data: 10 de Maro de 2000 */ class NomeDaClasse { // Tudo o que estiver entre as duas chaves pertencer classe } // fim da classe NomeDaClasse

Algumas caractersticas importantes que podemos notar na listagem 3.1 so: Toda classe em Java comea com a palavra mgica class, que deve ser digitada totalmente em letras minsculas (linha 5 da listagem 3.1). Aps a palavra class, o nome da classe deve ser digitado. Este nome no pode conter espaos, deve comear com uma letra, podendo ter nmeros e o caracter sublinhado (_) em seu nome (linha 5 da listagem 3.1). Tradicionalmente os primeiros caracteres de cada palavra do nome da classe so em caracteres maisculos, como, por exemplo, NomeDaClasse, IdentificaoDoAluno, UmNomeDeClasseExcessivamenteLongo ou Data, mas basta que as regras sejam seguidas para que seja um nome de classe vlido. O corpo de uma classe comea com o caracter { (linha 6 da listagem 3.1) e termina com o caracter } (linha 8 da listagem 3.1) - o que estiver entre estes dois caracteres ser parte da classe. Comentrios podem aparecer livremente em qualquer parte do arquivo que contm as classes. Comentrios sero ignorados pelo compilador, mas, quando bem escritos, servem para dar valiosas informaes sobre o cdigo. Existem dois tipos de comentrios mais usados em Java: comentrios em uma linha so comentrios que comeam com os caracteres //, e so ignorados pelo compilador at o nal da linha onde aparecem (linha 3 da listagem 3.1), e comentrios em mltiplas linhas, que so comentrios que so iniciados com os caracteres /* e se extendem at a prxima ocorrncia dos caracteres */ (linhas 1 a 4 da listagem 3.1). No existe uma obrigatoriedade nos espaamentos e tabulaes das linhas e comandos dos programas, embora estas sejam importantes para a clareza do programa.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

19 De posse destas informaes bsicas a respeito da criao de classes, e conhecendo a estrutura bsica de uma classe, vamos implementar a teoria do captulo 2 em Java. Para isto precisamos entender como podemos implementar os atributos e operaes dos modelos em Java.

3.2.1

Atributos e dados so tipos nativos ou instncias de outras classes

Os atributos de uma classe, descritos no captulo 2, so representados em Java por tipos nativos ou instncias de outras classes j existentes. Para cada atributo da classe devemos escolher qual o tipo nativo ou classe adequada e criar uma varivel ou instncia deste tipo ou classe para represent-lo. Uma diferena fundamental entre a teoria mostrada no captulo 2 e a prtica (implementao das classes em Java) que precisamos escolher entre um nmero limitado de tipos de dados, que tem caractersticas bem denidas, e que so dependentes da linguagem. Para referncia rpida, a tabela 3.1 sumariza os tipos bsicos de dados de Java com alguns exemplos. O apndice A apresenta mais detalhes sobre os tipos bsicos e algumas classes padro de Java. Vale a pena lembrar que um dos conceitos bsicos de programao orientada a objetos a criao de novas classes que modelam entidades diferentes, e instncias destas novas classes podem ser usadas em outras classes e programas. Algumas informaes sobre variveis em Java so mostradas abaixo: Variveis em Java so declaradas como modificador tipo-da-varivel nome-da-varivel; note o ponto-e-vrgula ao nal da declarao. O formato de declarao de variveis que so instncias de classes modificador nome-da-classe nome-da-varivel = new nome-da-classe(); - note o ponto-e-vrgula ao nal da declarao. O comando new ser visto com mais detalhes neste e no prximo captulo. O controle de acesso as variveis pode ser feito pelos modicadores private e public. Estes modicadores implementam a ocultao de informaes vista na seo 2.4: variveis que so declaradas como public podem ser manipuladas (acessadas e modicadas) diretamente por programas que usam a classe que contm esta varivel, enquanto que variveis que so declaradas como private s podem ser manipuladas por mtodos da classe que as contm. Os nomes de variveis devem ser formados da mesma maneira que os nomes das classes: espaos no so permitidos, os nomes devem comear com um caracter alfabtico, e podem conter o caracter sublinhado (_). Ao contrrio dos nomes das classes, os nomes de variveis podem conter acentos sem restries. Para declararmos vrias variveis do mesmo tipo ao mesmo tempo, podemos usar modificador tipo-da-varivel nome1, nome2, nome3; - note que os diferentes nomes das variveis so separados por vrgulas, e que existe um ponto-e-vrgula no nal da declarao. No existem limites no nmero de variveis que podem ser declaradas em uma nica linha, mas muitas variveis em uma linha podem comprometer a clareza e legibilidade do programa. possvel criar e colocar valores ao mesmo tempo nas variveis com uma declarao modificador tipo-da-varivel nome-da-varivel = valor; Variveis podem ser criadas em qualquer ponto de um programa, classe ou rotina, mas algumas regras devem ser observadas: Variveis criadas dentro de uma classe mas fora dos mtodos (como nos exemplos que sero mostrados abaixo) podem ser vistas e modicadas de dentro de todos os mtodos da classe.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

20 Tipo byte char Faixa de valores


-128 a 127 0 a 65535

Exemplos
byte byte char char char char x1 x2 c1 c2 c3 c4 = = = = = = -1; 123-2; a; !; ; ;

Notas
Inteiro de 8 bits de preciso, com sinal. Veja a seo A.1.1 no apndice A. Caracteres representados em 16 bits, com suporte multilngue, podendo ser usados como tipos inteiros de 16 bits, com sinal. Veja a seo A.1.2 no apndice A. Inteiro de 16 bits de preciso, com sinal. Veja a seo A.1.3 no apndice A.

short

-32768 a 32767

int

-2147483648 a 2147483647

long

-9223372036854775808 9223372036854775807

float

1.40129846432481707e-45 a 3.40282346638528860e+38

double

4.94065645841246544e-324 a 1.79769313486231570e+308

String

Tamanho limitado memria disponvel.

short s1 = -130; short s2 = 32000; short s3 = 20*30; short s4 = 0; int i1 = 0; int i2 = 1000*1000; int i3 = -999*999; int i4 = 123456789; long l1 = 0; long l2 = -1; long l3 = -12345*67890; long l4 = 100000-99999; float f1 = 0.0; float f2 = 3.1416; float f3 = -123.0/124.0; float f4 = 2e5*3.2/2.7; double d1 = 0.0; double d2 = 3.141592654; double d3 = 0.01/1.07; double d4 = 2e+32*7e+18; String s1 = ""; String s2 = " "; String s3 = "3.1416"; String s4 = "nova\nlinha\n";

Inteiro de 32 bits de preciso, com sinal. Veja a seo A.1.4 no apndice A.

Inteiro de 64 bits de preciso, com sinal. Veja a seo A.1.5 no apndice A. Ponto utuante de preciso simples, armazenados em 32 bits, com sinal. Veja a seo A.1.6 no apndice A. Ponto utuante de preciso dupla, armazenados em 64 bits, com sinal. Veja a seo A.1.7 no apndice A. Cadeia de caracteres que usam dois bytes por caracter. Strings podem ser vazias (zero caracteres) e conter qualquer tipo de caracteres. Veja a seo A.2.1 no apndice A.

Tabela 3.1: Tipos bsicos de Java Variveis passadas como argumentos para os mtodos s so vlidas dentro dos mtodos. aconselhvel que o nome das variveis represente de forma sumarizada o seu signicado no programa, para maior clareza. Alguns exemplos de criao de variveis podem ser vistos no trecho de cdigo na listagem 3.2.

Listagem 3.2: Criao e inicializao de variveis de tipos nativos em Java


1 2 3 4 5 6

private boolean resultado; // // resultado = true; // // int idade = 28; // //

Declaro que a varivel resultado ser do tipo boolean e que ela s poder ser acessada de dentro da classe que a contm Digo que o valor da varivel resultado ser true - s podemos atribuir valores variveis depois que as declararmos. Declaro a varivel idade como do tipo int, e atribuo o valor 28 ela. Como esta varivel no foi declarada com modificadores,

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

21
// // // // // // // // // ela ser public, podendo ser acessada de dentro e de fora da classe que a implementa. Declaro letra como sendo varivel do tipo char, podendo ser acessada de dentro e de fora da classe que a contm A atribuo o valor S varivel letra Posso mudar o valor das variveis depois Declaro palavra como sendo instncia da classe String que s poder ser acessada de dentro da classe que a contm Coloco um valor na varivel palavra

7 8 9 10 11 12 13 14 15

public char letra; letra = S; letra = Y; private String palavra; palavra = "teste";

importante lembrar que o trecho de cdigo na listagem 3.2 no pode ser compilado, porque deveria estar dentro de uma classe como a mostrada na listagem 3.1). Muitos outros exemplos de declarao, atribuio e uso de variveis em Java podem ser vistos no apndice A.

3.2.2

Operaes ou funes so Mtodos

Conforme visto no captulo 2, classes representam modelos que tem atributos e operaes. Os tipos de dados servem para representar os atributos das classes, mas para representar (e implementar) as operaes nas classes, precisaremos criar estruturas chamadas Mtodos, apresentadas nesta seo. Mtodos so blocos de cdigo, presentes dentro das classes, que podem processar dados desta classe e dados que so passados como argumentos para os mtodos. Algumas informaes sobre mtodos em Java so mostradas abaixo: O formato de declarao de mtodos modificador tipo-de-retorno nome-do-mtodo(lista-de-argumentos). Note que o pontoe-vrgula no colocado no nal da declarao. Assim como as variveis, o controle de acesso aos mtodos de uma classe pode ser feito pelos modicadores private e public. Mtodos que so declaradas como public podem ser executados diretamente por classes e programas que usam a classe que contm este mtodo, enquanto que mtodos declarados como private s podem ser executados por mtodos da classe que os contm. Os nomes dos mtodos podem ser formados da mesma maneira que os nomes das variveis: espaos no so permitidos, os nomes devem comear com um caracter alfabtico, podem conter o caracter sublinhado (_) e podem conter acentos sem restries. Um mtodo pode receber diversos argumentos de diferentes tipos: caso haja mais de um argumento na lista de argumentos, cada argumento dever ser precedido de seu tipo. Um mtodo pode e deve retornar somente um nico valor. Alternativamente, podemos ter mtodos que no retornam valores, devemos declarar o tipo de retorno destes mtodos como void. Um mtodo que retorne algum valor diferente de void deve conter em seu corpo o comando return seguido de uma varivel ou constante de tipo compatvel com o tipo de retorno esperado. Tradicionalmente os nomes dos mtodos comeam com caracteres minsculos, alternando a cada palavra diferente. Alguns exemplos de nomes de mtodos que seguem este estilo so calcula, retornaValor, nomeDeMtodoMuitoComprido. Mtodos no podem ser criados dentro de mtodos, nem fora de classes. aconselhvel que o nome dos mtodos represente de forma sumarizada a sua funo no programa, para maior clareza.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

22 Alguns exemplos de mtodos podem ser vistos no trecho de cdigo na listagem 3.3.

Listagem 3.3: Exemplo de alguns mtodos em Java


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

/* Este mtodo no recebe argumentos, retorna um valor do tipo void e no faz absolutamente nada. Como no tem modificadores, considerado como public, podendo ser chamado de dentro e de fora da classe que o contm. */ void mtodoVazio() { } /* Este mtodo no recebe argumentos, retorna um valor do tipo double constante com o valor de PI - a palavra-chave return fora a interrupo do mtodo, retornando o seu argumento. Como o mtodo private, ele s poder ser chamado de dentro da classe que o contm, por outros mtodos. */ private double valorDePi() { return 3.14159265358979; } /* Este mtodo recebe um argumento do tipo byte mas no retorna nenhum valor. Quando o tipo de retorno do mtodo void, o comando return opcional. Como o mtodo foi declarado como sendo public, poder ser chamado de dentro e de fora da classe que o contm. */ public void imprimeIdade(byte idade) { System.out.println("A idade "+idade); } /* Este mtodo recebe um argumento tipo int e retorna um valor do tipo double. A converso feita atravs da multiplicao por 1.0. Um valor temporrio de tipo compatvel com o corpo do mtodo declarado e retornado. Como no tem modificadores, considerado como public. */ double converteParaDouble(int valor) { double temp = 1.0*valor; return temp; } /* Este mtodo recebe dois argumentos que so instncias da classe String e retorna uma instncia da classe String (concatenao dos dois argumentos). Note que preciso declarar o tipo de cada um dos argumentos quando existem vrios. O mtodo considerado public. */ String concatenaStrings(String a,String b) { return a+b; } /* Este mtodo recebe cinco argumentos do tipo float e retorna a soma deles, que ser de tipo compatvel com o declarado pelo mtodo. Como o mtodo private, ele s poder ser chamado de dentro da classe que o contm, por outros mtodos da mesma classe. */ private float somaCincoFloats(float f1,float f2,float f3,float f4,float f5) { return f1+f2+f3+f4+f5; }

importante lembrar que o trecho de cdigo na listagem 3.3 no pode ser compilado, porque deveria estar dentro de uma classe como a mostrada na listagem 3.1).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

23

3.3

Exemplos de Classes em Java

Para exemplicar a transformao de um modelo em uma classe em Java, incluindo a seleo de tipos de dados e mtodos que podem ser usados, vamos usar os modelos mostrados na seo 2.5 do captulo 2. Exemplo 1: Uma Lmpada Incandescente Considerando a gura 2.2 da seo 2.5, vemos que temos que representar um estado de uma lmpada, que pode ser ou apagada ou acesa. Java (e outras linguagens de programao) no tem como representar os conceitos aceso e apagado, mas podemos usar um valor tipo booleano para indicar se a lmpada est acesa ou apagada. Para modelar as operaes que acendem e apagam a lmpada, criamos mtodos correspondentes que mudam o estado (varivel booleana). A primeira verso da classe Lampada mostrada na listagem 3.4.

Listagem 3.4: A classe Lampada (primeira verso)


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

/* Esta a classe Lmpada (note que o nome da classe no contm acentos). */ class Lampada { /* Uma lmpada pode estar ligada ou desligada, ou seja, o atributo "ligada" pode ser true ou false. Usamos um valor booleano para representar o estado. Declaramos a varivel como sendo private para evitar o acesso direto ela. */ private boolean ligada; /* Este mtodo acende a lmpada, independente de seu estado atual */ void acende() { ligada = true; } /* Este mtodo apaga a lmpada, independente de seu estado atual */ void apaga() { ligada = false; } } // fim da classe Lampada

Exemplo 2: Uma data Considerando a gura 2.3 da seo 2.5, vemos que temos que representar os valores dia, ms e ano como componentes de uma data. Dia e ms podem ser representados por um byte cada (uma vez que os valores vlidos para o dia e o ms podem ser confortavelmente representados na faixa dos valores do byte, -128 a 127), e ano pode ser representado por um valor do tipo short (permitindo assim a representao de anos de -32768 a 32767). Para modelar as operaes que ajustam e imprimem a data, criamos mtodos correspondentes. A primeira verso da classe Data mostrada na listagem 3.5.

Listagem 3.5: A classe Data (primeira verso)


1 2 3 4

/* Esta a classe Data */ class Data { /* Uma data contm dia, ms e ano. Dias e meses podem ser representados por bytes, mas o ano Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

24
deve ser representado por um short para permitir representao de anos completos (1999, 2000, etc). Note que as variveis so private e s podero ser manipuladas pelos mtodos desta classe. */ private byte dia,ms; private short ano; /* Este mtodo permite que ajustemos o dia da data. Basicamente ele passa varivel dia da classe o argumento passado ao mtodo. */ void ajustaDia(byte d) { dia = d; } /* Este mtodo permite que ajustemos o ms da data. Basicamente ele passa varivel ms da classe o argumento passado ao mtodo. */ void ajustaMs(byte m) { ms = m; } /* Este mtodo permite que ajustemos o ano da data. Basicamente ele passa varivel ano da classe o argumento passado ao mtodo. */ void ajustaAno(short a) { ano = a; } /* Este mtodo permite que ajustemos simultaneamente o dia, ms e ano da data. Este mtodo chama os outros mtodos declarados anteriormente, para simplificar. */ void ajustaData(byte d,byte m,short a) { ajustaDia(d); // chama o mtodo ajustaDia com o argumento d ajustaMs(m); // chama o mtodo ajustaMs com o argumento m ajustaAno(a); // chama o mtodo ajustaAno com o argumento a } /* Este mtodo imprime a data. */ void imprime() { System.out.print("Dia:"+dia+" "); System.out.print("Ms:"+ms+" "); System.out.println("Ano:"+ano); } /* Este mtodo retorna a data formatada como uma String. */ String formata() { String temporria = "Dia:"+dia+" Ms:"+ms+" Ano:"+ano; return temporria; } } // fim da classe Data

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

Na classe na listagem 3.5 (linhas 39 a 41) dois mtodos chamados System.out.print e System.out.println so usados. Estes mtodos imprimem no terminal os valores dos argumentos passados, como instncias da classe String. A diferena entre os dois mtodos que o segundo imprime, alm dos argumentos, uma quebra de linha (caracter de controle \n). Caso existam mais do que um argumento para estes mtodos, eles devem ser concatenados com o sinal +, de acordo com as regras explicadas na seo A.2.1 (veja o programa na listagem A.19 para mais informaes e exemplos). Exemplo 3: Um registro acadmico de aluno Considerando a gura 2.4 da seo 2.5, vemos que temos que representar vrios dados relativos um registro acadmico de aluno, de diferentes tipos, em uma classe. Um destes dados (a data de nascimento) pode ser representado pela classe Data, descrita anteriomente, e os outros podem ser representados por tipos nativos de Java. Para modelar as operaes que preenchem os dados e os imprimem, criamos mtodos correspondentes.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

25 Tambm criamos um mtodo que calcula e retorna a mensalidade devida por este aluno. A primeira verso da classe RegistroDeAluno mostrada na listagem 3.6.

Listagem 3.6: A classe RegistroDeAluno (primeira verso)


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

/* Esta a classe RegistroDeAluno */ class RegistroDeAluno { /* Um Registro de Aluno contm o nome do aluno (que deve ser representado por uma String), um nmero de matrcula (que pode ser um int), uma data de nascimento (que pode ser uma instncia da classe Data previamente construda), o ano no qual o aluno entrou no curso (que pode ser um short, e independente da data de nascimento), uma turma (que pode ser representada por um char) e um valor para representar se o aluno ou no bolsista (que pode ser um booleano). Todas as variveis so declaradas como private para evitar que sejam usadas diretamente fora da classe. */ private String nome; private int nmero; private Data nascimento = new Data(); // Note que a declarao de uma instncia diferente da // de uma varivel de tipo nativo ! private short ano; private char turma; private boolean Bolsista; /* Este mtodo permite que inicializemos os valores da classe. */ void entraDados(String n,int num,Data nasc,short a,char t,boolean eb) { nome = n; /* inicializa o nome */ nmero = num; /* inicializa o nomero de matrcula */ nascimento = nasc; /* inicializa a data de nascimento */ ano = a; /* inicializa o ano */ turma = t; /* inicializa a turma */ Bolsista = eb; /* inicializa o booleano Bolsista */ } /* Este mtodo imprime os valores da classe. Note que os valores de tipos nativos so impressos com o mtodo System.out.println, mas como nascimento uma instncia da classe Data, simplesmente pegamos a data formatada (mtodo formata da classe Data) ao invs de imprimirmos o valor direto da varivel nascimento, que iria dar resultados inesperados. Note tambm o tratamento especial dado varivel booleana Bolsista. */ void imprime() { System.out.println("O nome do aluno "+nome); System.out.println("O nmero de matrcula "+nmero); System.out.println("A data de nascimento "+nascimento.formata()); System.out.println("O ano em que o aluno est "+ano); System.out.println("A turma em que o aluno est "+turma); if (Bolsista) System.out.println("O aluno bolsista."); else System.out.println("O aluno no bolsista."); } /* Este mtodo calcula e retorna a mensalidade do aluno baseado em seus dados. Note que nenhum argumento passado ao mtodo uma vez que todos os dados que so necessrios */ float calculaMensalidade() { float mensalidade = 400; // mensalidade quatrocentos reais para cada aluno. if (Bolsista) mensalidade = mensalidade/2; // mas para bolsistas reduzida metade return mensalidade; // retorna o valor da mensalidade } } // fim da classe RegistroDeAluno

Na listagem 3.6, linhas 40 e 41 e linhas 48 e 49 vamos a estrutura de tomada de decises if/else, que ser esclarecida no captulo 8, seo 8.3. Exemplo 4: Um modelo de computador (para compra em loja virtual)

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

26 Considerando a gura 2.5 da seo 2.5, vemos que os atributos que denem um modelo de computador so seu processador, sua memria, o tamanho de seu disco e monitor. Alm de criar estas variveis na classe que representar o modelo de computador, devemos criar mtodos para inicializar os dados (ou congurar o computador), imprimir a congurao e calcular o preo daquela congurao. A primeira verso da classe ModeloDeComputador mostrada na listagem 3.7.

Listagem 3.7: A classe ModeloDeComputador (primeira verso)


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

/* Esta a classe ModeloDeComputador */ class ModeloDeComputador { /* Um Modelo de Computador composto do tipo de processador (que deve ser uma String, j que existem diversos tipos de diversos fabricantes), de uma quantidade de memria RAM expressa em megabytes, que pode ser representada por um short, de um disco rgido cujo tamanho expresso em gigabytes e pode ser representado por um float, e de um tamanho de monitor em polegadas, que pode ser representado por um byte. Todas as variveis sero private para que s possam ser manipuladas pelos mtodos desta classe. */ private String processador; private short memriaRAM; private float disco; private byte tamanhoMonitor; /* Este mtodo permite a inicializao dos valores da classe. */ void configura(String p,short r,float d,byte t) { processador = p; // inicializa o processador memriaRAM = r; // inicializa a memria RAM disco = d; // inicializa o disco tamanhoMonitor = t; // inicializa o tamanho do monitor } /* Este mtodo imprime a configurao do computador */ void imprime() { System.out.println("A configurao do computador :"); System.out.println("- Processador "+processador+"."); System.out.println("- "+memriaRAM+" megabytes de RAM."); System.out.println("- "+disco+" gigabytes de disco."); System.out.println("- Monitor de "+tamanhoMonitor+" polegadas."); } /* Este mtodo calcula o preo do computador */ float calculaPreo() { float preo = 200; // preo inicial 200 reais (gabinete, etc.) // Dependendo do tipo de processador, acrescento seu custo ao preo if (processador.equals("Pentium II 400")) preo = preo + 500; if (processador.equals("Pentium III 500")) preo = preo + 700; // Dependendo do tamanho da memria, acrescento seu custo ao preo if (memriaRAM == 64) preo = preo + 200; if (memriaRAM == 128) preo = preo + 400; if (memriaRAM == 256) preo = preo + 800; // Dependendo do tamanho do disco, acrescento seu custo ao preo if (disco == 6.4) preo = preo + 250; if (disco == 8.0) preo = preo + 350; if (disco == 12.0) preo = preo + 450; // Dependendo do tamanho do monitor, acrescento seu custo ao preo if (tamanhoMonitor == 14) preo = preo + 120; if (tamanhoMonitor == 15) preo = preo + 160; if (tamanhoMonitor == 17) preo = preo + 320; // retorno o valor calculado return preo; } } // fim da classe ModeloDeComputador

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

27 Nas linhas 36 e 37 da listagem 3.7 vemos o uso do mtodo equals da classe String. Este mtodo compara duas Strings, retornando true se elas forem iguais. Este e outros mtodos da classe String so apresentados no captulo 9. Nas linhas 39 a 41, 43 a 45 e 47 a 49 da listagem 3.7 vemos como valores e variveis de tipos nativos em Java podem ser comparados usando o sinal ==. Mais informaes sobre comparaes podem ser vistas no captulo 8. Exemplo 5: Uma conta bancria simplicada Considerando a gura 2.6 da seo 2.5, vemos que temos que representar os atributos nome, nmero da conta, saldo, especial e data de abertura, juntamente com mtodos que nos permitam a inicializao dos dados da conta, impresso dos mesmos e retiradas e depsitos da conta. A primeira verso da classe ContaBancaria mostrada na listagem 3.8. Listagem 3.8: A classe ContaBancaria (primeira verso)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

/* Esta a classe ContaBancaria - note que no usamos acentos nos nomes de classes */ class ContaBancaria { /* Uma conta bancria simplificada contm o nome do correntista (uma String), um nmero da conta (que pode ser um int), a data de abertura (que pode ser uma instncia da classe Data como visto no exemplo do Registro de Aluno), um saldo (que pode ser float para simplificar), e um valor booleano que determina se a conta especial ou no. As variveis vo ser todas private para garantir que somente os mtodos da classe sero capazes de mudar seus valores. */ private String nome; private int nmero; private Data abertura = new Data(); // Note a maneira de declarar e inicializar // instncias de classes ! private float saldo; private boolean Especial; /* Este mtodo permite a inicializao dos valores da classe. */ void abreConta(String n,int num,Data a,float s,boolean e) { nome = n; // inicializa o nome nmero = num; // inicializa o nmero da conta abertura = a; // inicializa a data de abertura saldo = s; // inicializa o saldo Especial = e; // inicializa o booleano Especial } /* Este mtodo imprime os dados da conta */ void imprime() { System.out.println("Dados da conta nmero "+nmero+":"); System.out.println("Nome do correntista: "+nome); System.out.println("Data de abertura da conta: "+abertura.formata()); System.out.println("Saldo: "+saldo); if (Especial) System.out.println("A conta especial"); } /* Este mtodo deposita um valor na conta bancria, acumulando o valor na varivel saldo */ void deposita(float valor) { saldo = saldo + valor; } /* Este mtodo retira um valor da conta bancria, descontando o valor da varivel saldo */ void retira(float valor) Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

28
{ saldo = saldo - valor; } /* Este mtodo retorna o saldo da conta bancria, permitindo a "leitura" do valor mas garantindo atravs dos mtodos deposita e retira que modificaes s podero ser feitas controladamente (pela prpria classe). */ float retornaSaldo() { return saldo; } } // fim da classe ContaBancaria

43 44 45 46 47 48 49 50 51 52 53

3.4

Exerccios do captulo 3

Exerccio 3.1: Considerando a tabela 3.1, escolha o tipo de dado ou classe mais adequada para representar: O nmero de dias em um ano. O nmero de bytes em um disco rgido de computador moderno. O nmero de bytes em um disquete de computador. O nmero de municpios de um estado do Brasil. O nome de um estado do Brasil. A populao de um estado do Brasil. A rea do Brasil em km2 . A populao de todo o mundo.

Exerccio 3.2: Considerando a tabela 3.1, escolha o tipo de dado ou classe mais adequada para representar: O resultado do arremesso de uma moeda. O resultado do arremesso de um dado. O naipe de uma carta de baralho. A altura de uma pessoa em metros. O peso de uma pessoa em quilos. A temperatura de uma pessoa. O nmero de andares em um edifcio. O nmero de pginas em um livro.

Exerccio 3.3: Modique a classe Lampada, descrita no exemplo 1 da seo 2.5 e implementada na listagem 3.4 para que este tambm represente o nmero de watts da lmpada.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

29

Exerccio 3.4: Modique a classe Lampada, descrita no exemplo 1 da seo 2.5 e implementada na listagem 3.4 para que esta tenha mtodos de sada e impresso do estado da lmpada (veja tambm a listagem 3.5, mtodos imprime e formata.) Exerccio 3.5: Escreva uma classe LampadaFluorescente que alm dos atributos da classe Lampada (seo 2.5), represente o tamanho (comprimento) da lmpada. Exerccio 3.6: O que aconteceria se todos os mtodos da classe Data (listagem 3.5) fossem private ? Exerccio 3.7: Modique a classe Data (listagem 3.5) para que esta contenha mtodos que permitam o acesso s variveis dia, ms e ano. Estes mtodos devem retornar o valor das variveis. Exerccio 3.8: Modique a classe Data (listagem 3.5) para que esta represente o ms com Strings ao invs de valores numricos. Exerccio 3.9: Escreva um mtodo para a classe Data (listagem 3.5) que formate os valores da classe como DD/MM/AAAA onde DD o dia, MM o ms e AAAA o ano. No se preocupe com o nmero de posies que cada varivel pode ocupar, o importante que estejam separados por barras. Este mtodo deve ter um nome diferente de formata. Exerccio 3.10: O mtodo calculaPreo da classe ModeloDeComputador (listagem 3.7) reconhece somente alguns modelos de processador, quantidade de memria e disco e tamanhos de monitor. Modique este mtodo para que mais alguns modelos de processador e opes de memria, disco e monitor sejam reconhecidos. Exerccio 3.11: Escreva uma classe Contador que encapsule um valor usado para contagem de itens. Esta classe deve ter os mtodos incrementa (que incrementa o valor do contador em um) e reseta (que zera o contador). Exerccio 3.12: Escreva uma classe Hora que represente, em Java, o modelo do exerccio 2.2. Crie ao menos dois mtodos na classe, um para inicializar os dados e outro para imprimi-los. Exerccio 3.13: Escreva uma classe LivroBiblioteca que represente, em Java, o modelo do exerccio 2.4. Exerccio 3.14: Escreva uma classe LivroLivraria que represente, em Java, o modelo do exerccio 2.5.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

30

Exerccio 3.15: Escreva uma classe PontoCartesiano que represente, em Java, o modelo do exerccio 2.13. Que variveis e mtodos esta classe deve ter ? Inclua tambm mtodos que permitam a um programa ou classe recuperar as coordenadas dos pontos (veja a listagem 3.8, mtodo retornaSaldo, como exemplo). Exerccio 3.16: Escreva uma classe AutomovelUsado que encapsule os dados de um automvel usado venda (modelo, marca, cor, ano, quilmetros rodados, preo, se a lcool ou gasolina, etc) - que tipos de dados ou instncias de classes devem ser usados para representar estes dados ? Crie ao menos dois mtodos na classe, um para inicializar os dados e outro para imprimi-los. Exerccio 3.17: Escreva uma classe Pais que represente, em Java, os dados de um pas (nome, rea, populao, nome da moeda corrente e outros dados relativos um pas). Que variveis e mtodos esta classe deve ter ? Exerccio 3.18: Escreva uma classe AgendaTelefonica que represente, em Java, as entradas em uma agenda telefnica, com o nome, endereo, telefone, e-mail, etc. de uma pessoa. Que variveis e mtodos esta classe deve ter ? Exerccio 3.19: Identique, explique e corrija trs erros na classe abaixo.
1 2 3 4 5 6 7 8 9 10 11 12

class Lampada Errada { private boolean acesa; private void acende() { acesa = 1; } private void apaga() { acesa = 0; } }

Exerccio 3.20: Identique, explique e corrija trs erros na classe abaixo.


1 2 3 4 5 6 7 8 9 10 11 12

class Livro { private string ttulo,autor; void inicializa(string t) { ttulo = t1; void inicializa(String a) { autor = a; } } }

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

31

Exerccio 3.21: Modique a classe Lampada (listagem 3.4) para que esta tambm seja capaz de armazenar em um valor inteiro o nmero de vezes que foi acesa. Onde voc modicaria este valor ? Exerccio 3.22: Modique a classe Data (listagem 3.5) para que os mtodos ajustaDia, ajustaMs e ajustaAno veriquem se os dados passados so ao menos coerentes: os mtodos s devem alterar os valores da classe caso o dia esteja entre 1 e 31, o ms esteja entre 1 e 12 e o ano, positivo. Caso um valor errado seja passado para os mtodos, estes devem imprimir uma mensagem de erro. Exerccio 3.23: Modique a classe RegistroDeAluno (listagem 3.6) para que esta contenha um atributo adicional que represente o curso do aluno. Que tipo de dado ou classe ser apropriado para representar o curso ? Modique todos os mtodos que recebem e imprimem dados para que este novo atributo seja levado em considerao. Exerccio 3.24: Considerando o exerccio 3.23, modique novamente a classe RegistroDeAluno (listagem 3.6) para que o clculo da mensalidade leve em conta o curso no qual o aluno est matriculado. Use como referncia o mtodo calculaPreo da classe ModeloDeComputador (listagem 3.7). Invente uns trs ou quatro cursos, cada um com um valor de mensalidade diferente, para que o exerccio que mais interessante. Exerccio 3.25: Usando a classe RegistroDeAluno (listagem 3.6) como referncia, crie a classe Professor que deve representar um professor usando os atributos: nome, nmero de registro, idade, data de admisso, nome da faculdade, salrio. Exerccio 3.26: O mtodo calculaPreo da classe ModeloDeComputador (listagem 3.7) reconhece algumas variaes nos componentes do computador, mas o mtodo configura da mesma classe permite que qualquer valor seja aceito. Modique o mtodo configura para que este somente aceite as variaes reconhecidas. Veja tambm o exerccio 3.10. Exerccio 3.27: Valores de ponto utuante podem, dependendo de algumas operaes efetuadas com eles, perder parte de sua preciso (veja a seo A.1.6 e a listagem A.13). Considerando isto, modique a classe ContaBancaria (listagem 3.8) para que esta represente o saldo da conta em centavos ao invs de reais, usando um tipo inteiro apropriado. Modique o mtodo imprime para que este imprima o valor em reais e no centavos. Exerccio 3.28: Escreva uma classe DataHora que represente, em Java, o modelo do exerccio 2.3. Crie ao menos dois mtodos na classe, um para inicializar os dados e outro para imprimi-los. Para ambos, reutilize os mtodos j existentes nas classes Data e Hora.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

32

Exerccio 3.29: Escreva uma classe Musica que represente, em Java, o modelo do exerccio 2.12. Entre outros atributos, represente a durao da msica usando uma instncia da classe Hora, feita no exerccio 3.12. Exerccio 3.30: Escreva uma classe LinhaCartesiana que represente, em Java, o modelo do exerccio 2.15. Que variveis e mtodos esta classe deve ter ? Use a classe PontoCartesiano, desenvolvida no exerccio 3.15 como base. Exerccio 3.31: Usando os exerccios 3.15 e 3.30 como base, crie a classe Retangulo que usa dois pontos para representar um retngulo. Exerccio 3.32: Como voc poderia modicar a classe Lampada (listagem 3.4) para que esta tambm representasse o estado queimada ? Reescreva a classe de maneira que os mtodos acende e apaga sejam executados de maneira diferente caso a lmpada esteja queimada. Exerccio 3.33: Considerando o exerccio 3.24, modique novamente a classe RegistroDeAluno (listagem 3.6) de forma que o mtodo entraDados imprima uma mensagem de erro caso seja chamado com um curso no reconhecido passado como argumento. Exerccio 3.34: Os mtodos deposita e retira da classe ContaBancaria (listagem 3.8) podem ser usados incorretamente - algum pode tentar depositar um valor negativo, ou retirar mais dinheiro do que existente na conta bancria. Se a conta for especial (de acordo com a varivel Especial) mais dinheiro do que existe na conta pode ser retirado, at um limite de 100 reais. Modique os mtodos deposita e retira da classe ContaBancaria para que corrijam este problema. Exerccio 3.35: Usando os exerccio 3.31 como base, adicione mtodos que calculem e retornem a rea e permetro do retngulo representado na classe. Exerccio 3.36: Novo ! Um nmero complexo formado de uma parte real e uma imaginria. Sua notao , de forma geral, a + bi onde a a parte real e b a imaginria. A soma de dois nmeros complexos dada por (a + bi) + (c + di) = (a + c) + (b + d)i. A subtrao de dois nmeros complexos dada por (a + bi) (c + di) = (a c) + (b d)i. A multiplicao de dois nmeros complexos dada por (a + bi) (c + di) = (ac bd) + (ad + bc)i. A diviso de dois nmeros complexos dada por (a+bi) = ac+bd + bcad i. (c+di) c2 +d 2 c2 +d 2 Escreva uma classe em Java que represente um nmero complexo, e contenha quatro mtodos que recebam instncias de nmeros complexos para as quatro operaes simples. Estes mtodos devem retornar instncias da classe que representa os nmeros complexos. O mtodo soma deve ser declarado como NumeroComplexo soma(NumeroComplexo y) e deve somar os dados da classe com os da instncia y.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

33

Captulo 4 Criando Programas em Java


4.1 Introduo

No captulo anterior, vimos como podemos criar classes em Java que representam modelos. Embora as classes criadas nos exemplos e exerccios anteriores possam ser compiladas, estas no podem ser executadas. Neste captulo veremos como criar mtodos especiais nas classes que permitam a execuo de programas em Java.

4.2

Criando Programas em Java

Para que uma classe em Java possa ser executada como um programa, ela deve ter um ponto de entrada, que um mtodo com nome, modicadores e argumentos especiais. O nome deste mtodo deve ser main, e com seus modicadores e argumentos, deve ser escrito como public static void main(String args[]). O modicador public j foi visto na seo 3.2.2: o uso deste modicador garantir que o mtodo poder ser usado de fora da classe que o contm, o que uma exigncia da mquina virtual Java para a execuo do mtodo. O modicador static permite que usemos mtodos de classes sem que seja preciso criar instncias destas classes. A maioria dos programas que criaremos sero classes que contero somente o mtodo main, e no ser necessria a criao de instncias destas classes. A seo 4.5 mostrar outros usos do modicador static. O mtodo main tem void como tipo de retorno, ou seja, nenhum valor retornado. Os argumentos String args[] representam um array de Strings que sero passados para o mtodo main. Um array uma forma conveniente de armazenarmos vrios valores do mesmo tipo em uma nica varivel, que usar um ndice para que os diferentes valores sejam acessados. Arrays so descritos no captulo 10. O array passado para o mtodo main ser composto dos valores passados pela linha de comando, conforme ser demonstrado na seo 4.4. possvel criarmos o mtodo main nas prprias classes que representam modelos (como por exemplo, as classes Data e ContaBancaria), mas alm de confuso, esta abordagem no demonstra as possibilidades de uso de instncias de diversas classes em programas. Para mais clareza e melhor entendimento dos conceitos de programao orientada a objetos, sugerido que o mtodo main no seja colocado nas classes

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

34 usadas para representar modelos, e sim em classes separadas, que provavelmente contero somente este mtodo, como mostrado nos exemplos na prxima seo.

4.2.1 Exemplos de programas em Java


Programa mnimo: HelloWorld.java Esta seo mostra um programa mnimo em Java, o tradicional hello world. O programa na listagem 4.1 imprime no console a mensagem Al, Mundo !.

Listagem 4.1: Um programa mnimo em Java: HelloWorld.java


1 2 3 4 5 6 7 8 9 10

/* Esta a classe HelloWorld, que no contm nenhum dado, somente o mtodo main. */ class HelloWorld { /* Este o mtodo main, que ser o ponto de entrada na execuo do programa. O mtodo imprime uma mensagem simples. */ public static void main(String argumentos[]) { System.out.println("Al, Mundo !"); } } // fim da classe HelloWorld

Alguns pontos de interesse do programa na listagem 4.1 so mostrados na lista abaixo: absolutamente necessria a incluso do mtodo main em uma classe, na listagem de exemplo, a classe HelloWorld (linhas 2 e 10). O mtodo main deve ser declarado com os modicadores public static e o tipo de retorno void (linha 6). O argumento passado para o mtodo main deve ser um array de Strings (linha 6). Somente o que est contido dentro do mtodo main (linhas 6 a 9) ser executado, no caso, somente a linha 8, que imprime a mensagem. Programa que usa instncia da classe Lampada Um outro exemplo de classe que pode ser executada por conter um mtodo main com os modicadores, valor de retorno e argumentos apropriados mostrado no programa na listagem 4.2). O programa cria alguma instncias da classe Lampada (listagem 3.4) e modica estado das instncias. Os comentrios do programa explicam o que est sendo feito, linha a linha.

Listagem 4.2: Um programa que usa instncias da classe Lampada


1 2 3 4 5 6 7 8 9

/* Esta a classe TesteLampada, que demonstrar como classes escritas anteriormente podem ser usadas (instanciadas) em programas (classes com o mtodo main). Este programa criar vrias instncias da classe Lampada e as usar. */ class TesteLampada { /* Este o mtodo main, que ser o ponto de entrada na execuo do programa. */ public static void main(String args[]) { // Criamos trs instncias da classe Lampada chamadas lmpadaDaSala, lmpadaDoQuarto Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

35
// e lmpadaDaCozinha. Note que necessrio criar uma referncia para a instncia // com a palavra-chave new. Lampada lmpadaDaSala = new Lampada(); Lampada lmpadaDoQuarto = new Lampada(); Lampada lmpadaDaCozinha = new Lampada(); // Acendo as trs lmpadas lmpadaDaSala.acende(); lmpadaDoQuarto.acende(); lmpadaDaCozinha.acende(); // Apago a do quarto lmpadaDoQuarto.apaga(); } } // fim da classe TesteLampada

10 11 12 13 14 15 16 17 18 19 20 21 22

Programa que usa instncias da classe Data Um outro exemplo de classe que pode ser executada mostrado na listagem 4.3). O programa desta listagem cria alguma instncias da classe Data (listagem 3.5) e as usa para inicializao e impresso. Os comentrios do programa explicam o que est sendo feito, linha a linha.

Listagem 4.3: Um programa que usa instncias da classe Data


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

/* Esta a classe TesteData, que demonstrar como classes escritas anteriormente podem ser usadas (instanciadas) em programas (classes com o mtodo main). Este programa criar vrias instncias da classe Data e as usar. */ class TesteData { /* Este o mtodo main, que ser o ponto de entrada na execuo do programa. */ public static void main(String args[]) { // Criamos uma instncia da classe Data chamada hoje. Note que necessrio // criar uma referncia para a instncia com a palavra-chave new. Data hoje = new Data(); // Chamamos o mtodo ajustaData da classe Data (objeto hoje) com os argumentos // 27, 3 e 1999. Note que j que os valores sero considerados como tipo int pelo // compilador, necessrio o cast (converso forada) para os tipos esperados // pelo mtodo ajustaData, que so byte, byte e short. hoje.ajustaData((byte)27,(byte)3,(short)2000); // Criamos uma instncia da classe Data chamada nascimento. Note que // necessrio criar uma referncia para a instncia com a palavra-chave new. Data nascimento = new Data(); // Chamamos o mtodo ajustaDia da classe Data (objeto nascimento) com o argumento // 30 - o valor deve ser convertido para byte para satisfazer o mtodo. nascimento.ajustaDia((byte)30); // Chamamos o mtodo ajustaMs da classe Data (objeto nascimento) com o argumento // 7 - o valor deve ser convertido para byte para satisfazer o mtodo. nascimento.ajustaMs((byte)7); // Chamamos o mtodo ajustaAno da classe Data (objeto nascimento) com o argumento // 1958 - o valor deve ser convertido para short para satisfazer o mtodo. nascimento.ajustaAno((short)1958); // Peo que o objeto hoje chame seu mtodo imprime - imprimir os dados do objeto. hoje.imprime(); // Mesmo para o objeto nascimento - resultados sero diferentes porque o contedo // dos objetos diferente. nascimento.imprime(); // Imprimo uma mensagem System.out.print("A data de hoje, formatada, "); // e imprimo o resultado do mtodo formata da classe Data, que uma String System.out.println(hoje.formata()); } } // fim da classe TesteData

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

36

4.3

A palavra-chave new

Nas listagens 4.2 e 4.3 pudemos notar que as instncias das classes so criadas de maneira diferente das variveis simples: necessrio que referncias s instncias sejam criadas com a palavra-chave new conforme visto nas linhas 12 a 14 na listagem 4.2 e linhas 11 e 19 na listagem 4.3. Alm de criar referncias para instncias das classes e alocar memria para estas, a palavra-chave new chama um de alguns mtodos especiais da classe que est sendo referenciada. Estes mtodos so conhecidos como construtores e so explicados com detalhes no captulo 7.

4.4 Processando argumentos da linha de comando


O argumento passado para o mtodo main (um array de Strings) conter os dados passados na linha de comando para o programa em Java. Por exemplo, caso a classe TesteLampada seja executada como java TesteLampada uma string duas strings, o array args (argumento do mtodo main) conter quatro Strings: uma, string, duas e strings. Estes valores so passados para o programa, que pode ou no us-los. Caso o programa seja chamado sem argumentos (por exemplo, java TesteLampada) o array de Strings ser vazio. Valores da linha de comando so passados para o programa como Strings, mesmo que aparentemente representem valores inteiros, booleanos ou de ponto utuante. Um programa chamado como java NomeDaClasse 1 3.1416 true passar para o array de Strings que argumento do mtodo main trs Strings: 1, 3.1416 e true. Podemos contar quantos elementos existem em um array (e consequentemente quantos argumentos foram passados pela linha de comando para um programa em Java) usando o atributo length dos arrays. O programa na listagem 4.4 mostra como podemos contar o nmero de argumentos passados. Mais detalhes sobre processamento de arrays sero mostrados no captulo 10.

Listagem 4.4: Um programa que conta quantos argumentos foram passados pela linha de comando
1 2 3 4 5 6 7 8 9 10 11 12

/* Classe executvel que mostra quantos argumentos foram passados pela linha de comando */ class LinhaDeComando { /* Mtodo main que possibilita a execuo da classe */ public static void main(String parmetros[]) { // Imprime mensagem com o nmero de argumentos passados. System.out.println("Foram passados "+parmetros.length+" argumentos."); if (parmetros.length > 1) System.out.println("O primeiro argumento "+parmetros[0]+"."); } } // fim da classe LinhaDeComando

O programa na listagem 4.4, quando executado, mostra o nmero de argumentos passados pela linha de comando, e caso ao menos um argumento tenha sido passado, imprime o primeiro argumento.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

37

4.5

Subrotinas em Programas em Java

O modicador static permite que o mtodo main seja chamado nas classes mostradas como exemplo neste captulo sem que seja necessrio criarmos instncias destas classes. Qualquer mtodo que for declarado com o modicador static seguir as mesmas regras. Duas aplicaes desta regra so a criao de subrotinas dentro de uma classe que ser executvel e a criao de classes que no precisam ser instanciadas para que seus mtodos sejam usados. A primeira aplicao pode ser demonstrada com um programa que necessita, de seu mtodo main, chamar vrias vezes um trecho de cdigo que pode ser transformado em uma subrotina. Esta subrotina (e qualquer outra que deva ser chamada do mtodo main sem ser via uma instncia de uma classe) deve ser declarada com o modicador static. Um exemplo de classe com subrotina mostrada na listagem 4.5. Listagem 4.5: Uma classe com o mtodo main e uma subrotina
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

/* Classe executvel que contm uma subrotina. */ class DemoSubrotinas { /* Mtodo que possibilita a execuo da classe */ public static void main(String argumentos[]) { // Declaro duas variveis do tipo double e guardo valores nelas double x,y; x = 9.15; y = 9.12; // Imprimo os valores atravs de uma subrotina imprimeValores(x,y); // Modifico os valores atravs de uma conta qualquer x = x/2+x/3; y = y/2-y/3; // Imprimo os valores atravs de uma subrotina imprimeValores(x,y); } /* Este mtodo a nossa subrotina. Note que ele deve ser decladaro static, e nesse caso retorna void (ou seja, nada). O mtodo somente imprime as variveis passadas para ele. */ static void imprimeValores(double x,double y) { System.out.println("O valor de X "+x); System.out.println("O valor de Y "+y); } } // fim da classe DemoSubrotinas

Alguns pontos importantes sobre a criao de subrotinas em programas em Java so: Subrotinas podem ser declaradas antes ou depois do mtodo main, e no precisam de prottipos como em C ou C++. Subrotinas que sero chamadas de dentro do mtodo main devem ser declaradas como static. Subrotinas so mtodos, ento seguem as mesmas regras de nomes e declaraes mostradas na seo 3.2.2. Mtodos estticos (subrotinas) podem ser chamados de outros mtodos estticos, mas cuidado especial deve ser tomado para que as chamadas no se tornem recursivamente innitas, como no programa na listagem 4.6. Neste caso, um mtodo chama o outro que chama o primeiro innitamente (embora a mquina virtual Java indique um erro de estouro de pilha).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

38 possvel a declarao de variveis estticas: se declaradas dentro da classe mas fora de todos os mtodos, estas variveis sero visveis de todos os mtodos ou subrotinas de uma classe. Podemos declarar variveis estticas para servirem de variveis globais dentro da classe, mas esta prtica no recomendada (veja o exerccio 4.10). O programa na listagem 4.7 mostra a declarao e uso de variveis estticas.

Listagem 4.6: Uma classe cujas subrotinas chamam uma outra


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

/* Classe executvel que contm uma subrotina. */ class RecursivoInfinito { /* Este mtodo chama o mtodo pong */ static void ping() { pong(); } /* Este mtodo chama o mtodo ping */ static void pong() { ping(); } /* Mtodo que possibilita a execuo da classe */ public static void main(String parmetros[]) { // Aqui comea o ping-pong infinito ! ping(); } } // fim da classe RecursivoInfinito

Listagem 4.7: Uma classe com variveis estticas


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

/* Classe executvel que contm uma subrotina. */ class DemoSubrotinas { // Declaro as variveis onde qualquer mtodo possa v-las - neste caso devem // ser declaradas como static para uso dentro do mtodo main static double x,y; /* Mtodo que possibilita a execuo da classe */ public static void main(String argumentos[]) { // Guardo alguns valores nas variveis globais do mtodo x = 9.15; y = 9.12; // Imprimo os valores atravs de uma subrotina imprimeValores(); // Modifico os valores atravs de uma conta qualquer x = x/2+x/3; y = y/2-y/3; // Imprimo os valores atravs de uma subrotina imprimeValores(); } /* Este mtodo a nossa subrotina. Note que ele deve ser decladaro static, e nesse caso retorna void (ou seja, nada). O mtodo somente imprime as variveis x e y, que foram declaradas como sendo globais. */ static void imprimeValores() { System.out.println("O valor de X "+x); System.out.println("O valor de Y "+y); } } // fim da classe DemoSubrotinas

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

39 possvel criar classes compostas inteiramente de variveis e mtodos estticos. Esta classe no precisaria ser instanciada para que suas variveis e mtodos fossem utilizados em outras classes e programas. Estas classes puramente estticas podem ser usadas como bibliotecas de constantes e funes, como mostrado na classe na listagem 4.8.

Listagem 4.8: Uma classe com algumas variveis e mtodos estticos


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/* Uma classe simples, que contm algumas constantes e mtodos estticos. Esta classe pode ser considerada como uma biblioteca - no precisamos criar instncias desta classe para usar suas variveis e mtodos. Para maior utilidade, suas variveis j recebem valores. */ class BibliotecaDeConstantes { // Declaro e inicializo duas constantes: "pi" e "e". static double pi = 3.14159265358979; static double e = 2.718281828459045; // Declaro uma constante baseada em um valor "e" j declarado. static double eQuadrado = e*e; // Declaro um mtodo que retorna um valor ("pi" dividido pelo argumento passado). static double piDivididoPor(double valor) { return pi/valor; } // Declaro outro mtodo que retorna um valor ("pi" multiplicado pelo argumento passado). static double piMultiplicadoPor(double valor) { return pi*valor; } } // fim da classe BibliotecaDeConstantes

O programa na listagem 4.9 usa variveis e mtodos da classe BibliotecaDeConstantes (listagem 4.8). Nota-se que em nenhum momento instncias da classe BibliotecaDeConstantes so criadas - suas variveis e mtodos so usados diretamente.

Listagem 4.9: Um programa que usa a classe com algumas variveis e mtodos estticos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

/* Esta classe usa as constantes e mtodos estticos na classe BibliotecaDeConstantes. */ class TesteBibliotecaDeConstantes { /* Este o mtodo main, que ser o ponto de entrada na execuo do programa. */ public static void main(String args[]) { // crio uma varivel que valer (pi * e) e a imprimo double meuvalor = BibliotecaDeConstantes.pi * BibliotecaDeConstantes.e; System.out.println("Pi * e = "+meuvalor); // imprimo algumas operaes com pi System.out.println("Pi/2="+BibliotecaDeConstantes.piDivididoPor(2)); System.out.println("Pi/3="+BibliotecaDeConstantes.piDivididoPor(3)); System.out.println("Pi/Pi="+BibliotecaDeConstantes.piDivididoPor(BibliotecaDeConstantes.pi)); } } // fim da classe TesteBibliotecaDeConstantes

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

40

4.6

Exerccios do captulo 4

Exerccio 4.1: O programa abaixo apresentar erros de compilao. Explique porqu.


1 2 3 4 5 6 7 8

public static void main(String parmetros[]) { float x,y; x = 12; y = x*x; System.out.println("O quadrado de "+x+" "+y); }

Exerccio 4.2: O programa abaixo apresentar erros de compilao. Explique porqu.


1 2 3 4 5 6 7

class Programa public static void main(String argumentos[]) { String nome = "Pablo Picasso"; System.out.println("Meu nome "+nome); }

Exerccio 4.3: O programa abaixo apresentar erros de compilao. Explique porqu.


1 2 3 4 5 6 7 8 9 10 11

class Nome da Classe { public static void main(String parmetros[]) { int i = 1000; int j = 33; System.out.print("O resultado da diviso inteira de "+i); System.out.print(" por "+j+" "); System.out.println(i/j); } }

Exerccio 4.4: O programa abaixo poder ser compilado mas no executado. Explique porqu.
1 2 3 4 5 6 7 8 9 10

class TestePrograma { public static void main() { boolean d; d = (2 > 3); System.out.println("A expresso (2 > 3) "+d); } }

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

41

Exerccio 4.5: O programa abaixo poder ser compilado mas no executado. Explique porqu.
1 2 3 4 5 6 7 8 9 10

class Programa { void main(String parmetros[]) { char a,b,c; a = A; b = B; c = C; System.out.println(""+a+b+c); } }

Exerccio 4.6: Escreva um programa que contenha o mtodo main e crie algumas instncias da classe ModeloDeComputador (listagem 3.7). Exerccio 4.7: Ache e explique o erro no programa abaixo.
1 2 3 4 5 6 7 8 9 10

class Demo { public static void main(String params[]) { Data hoje,amanh; hoje = new Data(); hoje.ajustaData((byte)5,(byte)10,(short)1999); amanh.ajustaData((byte)6,(byte)10,(short)1999); } }

Exerccio 4.8: Ache e explique o erro no programa abaixo.


1 2 3 4 5 6 7 8 9

class Demo { public static void main(String params[]) { Data hoje; hoje = new RegistroDeAluno(); hoje.ajustaData((byte)17,(byte)3,(short)1954); } }

Exerccio 4.9: O programa da listagem 4.2, ao ser executado, no imprimir nada no terminal, porque no existem mtodos de sada ou impresso na classe Lampada (listagem 3.4). Modique a classe Lampada conforme pedido no exerccio 3.4 e o programa na listagem 4.2 para que este mostre o estado das lmpadas ao nal do programa. Exerccio 4.10: O que aconteceria no programa na listagem 4.7 se declarssemos, dentro do mtodo main, duas variveis do tipo double chamadas x e y ?

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

42

Exerccio 4.11: O que aconteceria no programa na listagem 4.7 se no declarssemos as duas variveis x e y como sendo static na linha 5 ? Exerccio 4.12: O que acontecer se colocarmos uma linha lmpadaDoQuarto.ligada = true; no mtodo main do programa na listagem 4.2 ? Exerccio 4.13: Escreva um programa que contenha o mtodo main e crie algumas instncias da classe RegistroDeAluno (listagem 3.6). Exerccio 4.14: Escreva um programa que contenha o mtodo main e crie algumas instncias da classe ContaBancaria (listagem 3.8). Exerccio 4.15: Reescreva a classe BibliotecaDeConstantes (listagem 4.8) para que nada nela seja esttico. Modique tambm o programa na listagem 4.9 para que este use a classe no-esttica. Exerccio 4.16: Novo ! Escreva uma classe Conversao que contenha vrios mtodos para converso entre medidas de comprimento, rea e volume usadas no Brasil e nos Estados Unidos. Cada mtodo deve receber um valor de ponto utuante e retornar o valor convertido para a unidade desejada. Por exemplo, um mtodo double PolegadaParaCentmetros(double pol) deve retornar o valor da varivel pol convertida para centmetros. Considere a lista de medidas abaixo como referncia. 1 polegada = 2,54 cm 1 p = 30,48 cm 1 milha = 1,609 km 1 metro quadrado = 10,76 ps quadrados 1 milha quadrada = 640 acres 1 acre = 43.560 ps quadrados 1 metro cbico = 1000 litros = 35,32 ps cbicos 1 galo americano = 3,785 litros

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

43

Captulo 5 Herana
5.1 Introduo

Em alguns exemplos e exerccios dados at agora vimos que s vezes necessria a criao de duas classes distintas mas com muitas caractersticas em comum. Ao invs de criarmos estas classes e praticamente duplicarmos suas variveis e mtodos, podemos usar um conceito de Programao Orientada a Objetos chamado herana que permite que uma classe herde de outra algumas variveis e mtodos, reduzindo a necessidade de duplicao. Herana entre classes em Java declarada usando a palavra-chave extends. Para que uma classe D herde as variveis e mtodos da classe C, declaramos a classe D como class D extends C. S permitida a herana de uma classe para outra (ou seja, no existem mecanismos diretos para herana mltipla em Java), mas possvel termos classes que herdam indiretamente de outras atravs da herana em cascata: a classe E pode herdar das classes C e D se a classe E herdar da D e esta, por sua vez, herdar da classe C. Herana de classes funciona em um sentido somente: A classe Filho pode herdar da classe Pai e acrescentar mtodos e variveis prprias, mas estas somente valero para a classe Filho - a classe Pai no sofrer modicaes nem poder usar o que foi declarado dentro da classe Filho. Para demonstrar o conceito de herana atravs de alguns exemplos, vamos criar uma classe Veiculo (listagem 5.1).

Listagem 5.1: A classe Veiculo


1 2 3 4 5 6 7 8 9 10 11 12 13 14

/* Uma classe que representa um veculo genrico de transporte de passageiros. */ class Veiculo { // Os atributos do veculo genrico, representados por variveis. // Primeiro, a identificao do veculo. String nome; // Alguns dados do veculo short nmeroDePassageiros; byte nmeroDeRodas; short velocidadeMdia; // Algumas variveis booleanos para classificao do tipo do veculo. boolean Areo; boolean Terrestre; boolean Aqutico; Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

44
/* Um mtodo para inicializar alguns valores do veculo genrico. */ void inicializa(String n,short np,byte nr,short vm) { nome = n; nmeroDePassageiros = np; nmeroDeRodas = nr; velocidadeMdia = vm; } /* Um mtodo para imprimir os dados do veculo genrico. */ void imprime() { // Imprime os dados de identificao System.out.println("O veculo "+nome); System.out.println("- carrega "+nmeroDePassageiros+" passageiros"); System.out.println("- tem "+nmeroDeRodas+" rodas"); System.out.println("- tem velocidade mdia "+velocidadeMdia+" km/h"); // Imprime seletivamente informaes sobre tipo if (Areo) System.out.println("- areo"); if (Terrestre) System.out.println("- terrestre"); if (Aqutico) System.out.println("- aqutico"); } } // fim da classe Veculo

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

Uma classe executvel que cria vrias instncias da classe Veiculo mostrada na listagem 5.2. Listagem 5.2: Criao de instncias da classe Veiculo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

/* Classe executvel que cria instncias da classe Veiculo */ class TesteVeiculo { /* Mtodo que faz com que a classe seja executvel */ public static void main(String args[]) { // Crio e inicializo uma instncia para representar um jatinho Learjet Veiculo learjet = new Veiculo(); learjet.inicializa("Jatinho Learjet",(short)16,(byte)6,(short)900); learjet.Areo = true; learjet.Terrestre = false; learjet.Aqutico = false; // imprimo os dados da instncia learjet learjet.imprime(); // Crio e inicializo uma instncia para representar uma lambreta Veiculo lambreta = new Veiculo(); lambreta.inicializa("Lambreta",(short)2,(byte)2,(short)40); lambreta.Areo = false; lambreta.Terrestre = true; lambreta.Aqutico = false; // imprimo os dados da instncia lambreta lambreta.imprime(); // Crio e inicializo uma instncia para representar um navio de passageiros Veiculo navio = new Veiculo(); navio.inicializa("Navio de Passageiros",(short)600,(byte)0,(short)80); navio.Areo = false; navio.Terrestre = false; navio.Aqutico = true; // imprimo os dados da instncia navio navio.imprime(); // Crio e inicializo uma instncia para representar uma Fusca 66 Veiculo fusca66 = new Veiculo(); fusca66.inicializa("Fusca 66",(short)5,(byte)4,(short)60); fusca66.Areo = false; fusca66.Terrestre = true; fusca66.Aqutico = false; // imprimo os dados da instncia fusca66 Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

45
fusca66.imprime(); } } // fim da classe TesteVeiculo

38 39 40

Alguns pontos interessantes das listagens 5.1 e 5.2 so: Para simplicar os exemplos, a classe Veiculo no apresenta variveis privadas. O mtodo inicializa da classe Veiculo inicializa somente os atributos bsicos de uma instncia detalhes so inicializados pelo acesso direto s variveis das classes (por exemplo, nas linhas 18 a 20 da listagem 5.2). No programa na listagem 5.2 podemos notar que algumas instncias tem muitos dados em comum, particularmente as instncias lambreta e fusca66. Estas instncias, por sua vez, tem muitos dados diferentes das outras na listagem. Considerando as similaridades e diferenas entre as instncias no programa na listagem 5.2, podemos considerar a criao de uma classe especca para representar veculos terrestres. Esta classe teria os mesmos dados da classe Veculo mas algumas de suas variveis j estariam com valores denidos que reetiriam detalhes particulares da classe herdeira. Uma primeira abordagem para a criao de uma classe especca para veculos terrestres mas que herde da classe Veiculo mostrada na listagem 5.3. Listagem 5.3: A classe VeiculoTerrestre
1 2 3 4 5 6

/* Uma classe que representa um veculo terrestre de transporte de passageiros. */ class VeiculoTerrestre extends Veiculo { /* No necessrio declarar nenhuma varivel nesta classe: todas so herdadas da classe Veiculo. Da mesma maneira no necessrio declarar nenhum mtodo. */ } // fim da classe VeculoTerrestre

Embora a classe VeiculoTerrestre na listagem 5.3 esteja aparentemente vazia, ela tem a mesma funcionalidade da classe Veiculo uma vez que todos os dados da classe Veiculo foram herdados pela classe VeiculoTerrestre. Para conrmar, podemos criar instncias das duas classes e comparar os resultados, como mostrado no programa na listagem 5.4. Listagem 5.4: Criao de instncias da classe Veiculo e VeiculoTerrestre
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

/* Classe executvel que cria instncias das classes Veiculo e VeiculoTerrestre */ class TesteVeiculo { /* Mtodo que faz com que a classe seja executvel */ public static void main(String args[]) { // Crio e inicializo uma instncia da classe Veiculo para representar um nibus Veiculo onibus = new Veiculo(); onibus.inicializa("nibus de Passageiros",(short)50,(byte)6,(short)90); onibus.Areo = false; onibus.Terrestre = true; onibus.Aqutico = false; // imprimo os dados da instncia onibus onibus.imprime(); // Crio e inicializo uma instncia da classe VeiculoTerrestre para representar Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

46
// outro nibus de passageiros VeiculoTerrestre outronibus = new VeiculoTerrestre(); outronibus.inicializa("Outro nibus de Passageiros",(short)42,(byte)6,(short)80); outronibus.Areo = false; outronibus.Terrestre = false; outronibus.Aqutico = true; // imprimo os dados da instncia outronibus outronibus.imprime(); } } // fim da classe TesteVeiculo

16 17 18 19 20 21 22 23 24 25

O resultado do programa na listagem 5.4 mostra que para todos os efeitos as duas classes so idnticas, mas no demonstra nenhuma vantagem em criar classes herdeiras - no existe diferena no tratamento das instncias das classes pai ou ancestral (Veiculo) e herdeira (VeiculoTerrestre). Uma vantagem por enquanto no aproveitada de termos as classes separadas seria inicializar alguns dados de instncias da classe VeiculoTerrestre com valores que raramente mudariam. Nos exemplos acima, as variveis Areo, Terrestre e Aqutico tem valores diferentes para instncias da classe Veiculo, mas podemos considerar que seus valores para instncias da classe VeiculoTerrestre seriam sempre false, true e false, respectivamente. Estes valores poderiam ser inicializados automaticamente pelo mtodo inicializa, herdado da classe Veiculo. A prxima seo mostrar como podemos modicar um mtodo herdado.

5.2 O mecanismo de sobrecarga


Frequentemente teremos a necessidade de modicar um mtodo de uma classe herdeira para que este faa algo especco para a classe herdeira que no foi previsto na classe pai. O exemplo mostrado at agora sugere que o mtodo inicializa deva funcionar de maneira diferente para as classes Veiculo e VeiculoTerrestre. Poderamos adicionar classe VeiculoTerrestre um mtodo novo que inicializasse as variveis Areo, Terrestre e Aqutico de forma padro, mas teramos que chamar este mtodo e o mtodo inicializa sempre que formos criar instncias da classe VeiculoTerrestre. Uma soluo melhor seria usar o mecanismo de sobrecarga de programao orientada a objetos, que permite que um mtodo com o mesmo nome, tipo de retorno e argumentos substitua ou sobreescreva o mtodo herdado da classe pai ou ancestral. A classe VeiculoTerrestre, modicada para ter o mtodo inicializa modicado, mostrada na listagem 5.5.

Listagem 5.5: A classe VeiculoTerrestre, segunda verso


1 2 3 4 5 6 7 8 9 10 11 12 13

/* Uma classe que representa um veculo terrestre de transporte de passageiros (segunda verso).*/ class VeiculoTerrestre extends Veiculo { /* No necessrio declarar nenhuma varivel nesta classe: todas so herdadas da classe Veiculo, mas reescreveremos o mtodo inicializa para que este predefina os valores de algumas variveis. Parte do mtodo exatamente igual ao mtodo inicializa da classe Veiculo. */ void inicializa(String n,short np,byte nr,short vm) { nome = n; nmeroDePassageiros = np; nmeroDeRodas = nr;

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

47
velocidadeMdia = vm; // Esta parte torna o mtodo inicializa especfico para a classe VeiculoTerrestre Areo = false; Terrestre = true; Aqutico = false; } } // fim da classe VeculoTerrestre

14 15 16 17 18 19 20

Usando a classe VeiculoTerrestre mostrada na listagem 5.5, poderamos eliminar as linhas 19 a 21 do programa na listagem 5.4, mostrando algumas vantagens do mecanismo de herana - a classe herdeira mais especca do que a Veculo, e seu uso mais simples. Alguns pontos importantes relativos ao mecanismo de sobrecarga so: A sobrecarga dos mtodos somente feita caso o mtodo tenha o mesmo nome e os valores passados como argumentos para este mtodo tenham o mesmo tipo. Caso haja alguma diferena entre o nmero e tipo de argumentos do mtodo, o mtodo da classe ancestral no ser sobreescrito ou sobrecarregado - continuar sendo um mtodo vlido, e dois mtodos com o mesmo nome mas tipo ou nmero de argumentos diferentes estaro presentes na classe herdeira. O captulo 6 tratar deste fato com mais detalhes, e a seo 5.3 mostra alguns exemplos onde a no-sobreescrita de mtodos til e desejvel.. Variveis de uma classe podem ser sobreescritas, bastando para isto redeclarar a varivel com um tipo novo na classe herdeira. Desta forma, uma classe Ancestral pode ter uma varivel boolean valor; e a classe Descendente, que herda da Ancestral pode redeclarar esta varivel como String valor;. Um problema srio pode ocorrer no caso de sobrecarga de variveis: os mtodos herdados que no forem sobreescritos continuaro a considerar a varivel da classe ancestral como sendo a vlida. Este problema exemplicado nas classes da listagem 5.6 onde a classe IdentificacaoNumerica sobreescreve uma varivel da classe Identificacao. Se instncias da classe IdentificacaoNumerica forem criadas, os mtodos qualIdent destas instncias sempre retornaro o valor nulo (null) por no estarem preparadas para retornar o valor do tipo long que sobreescreveu a String. A soluo neste caso sobreescrever todos os mtodos que processam a varivel sobreescrita, o que pouco prtico. No possvel a criao de um mtodo em uma classe herdeira que tenha o mesmo nome, tipos de argumentos e tipo de retorno diferente (um erro de compilao gerado).

Listagem 5.6: Problemas com sobrecarga de variveis


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

/* Classe que representa uma identificao de uma pessoa */ class Identificacao { // String com a identificao String ident; /* Mtodo para inicializar */ void inicializa(String id) { ident = id; } /* Mtodo para imprimir */ void imprime() { System.out.println("Identificao:"+ident); } /* Mtodo que permite a leitura da varivel ident */ Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

48
String qualIdent() { return ident; } } // fim da classe Identificacao /* Classe que representa uma identificao numrica */ class IdentificacaoNumerica extends Identificacao { long ident; // Note que este sobreescreve a String ident da classe Identificacao ! } // fim da classe IdentificacaoNumerica

17 18 19 20 21 22 23 24 25 26 27

5.3

Herana de variveis e mtodos privados

Um problema que enfrentamos quando usamos o mecanismo de herana que variveis e mtodos privados no podem ser usados como mostrado at agora - mtodos e variveis privadas so herdados por classes herdeiras, mas no podem ser acessados pela classe herdeira porque so privados da classe ancestral. Um exemplo deste problema mostrado nas classes na listagem 5.7.

Listagem 5.7: Exemplo de problemas com variveis privadas e herana


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

/* Classe que representa um ponto em duas dimenses */ class Ponto2D { // Variveis privadas private short x,y; /* Mtodo para inicializar */ void inicializa(short _x,short _y) { x = _x; y = _y; } /* Mtodo para imprimir */ void imprime() { System.out.println("("+x+","+y+")"); } /* Mtodo que permite a leitura da varivel x */ short qualX() { return x; } /* Mtodo que permite a leitura da varivel y */ short qualY() { return y; } } // fim da classe Ponto2D /* Classe que representa um ponto em trs dimenses, baseada na classe Ponto2D */ class Ponto3D extends Ponto2D { // Variveis privadas private short z; /* Mtodo para inicializar */ void inicializa(short _x,short _y,short _z) { x = _x; y = _y; z = _z; Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

49
} /* Mtodo para imprimir */ void imprime() { System.out.println("("+x+","+y+","+z+")"); } /* Mtodo que permite a leitura da varivel z */ short qualZ() { return z; } } // fim da classe Ponto3D

40 41 42 43 44 45 46 47 48 49 50 51

O compilador Java reclamar que as variveis x e y no so acessveis na classe Ponto3D na listagem 5.7, impossibilitando o seu uso. Existem duas maneiras de evitar este problema: a primeira seria evitar o uso de variveis e mtodos privados em classes que podero eventualmente ter herdeiras. Este mtodo no recomendvel porque alm de ser recomendvel o uso de variveis privadas em classes, no to simples determinar se a classe que est sendo criada ter ou no herdeiras. A segunda soluo usa um conceito j apresentado anteriormente: Como no podemos acessar variveis privadas de classes, pedimos mtodos da prpria classe que as acessem. Para o exemplo em questo, quando formos inicializar as variveis x e y, ao invs de tentarmos acessar as variveis diretamente, pediremos ao mtodo void inicializa(short _x,short _y), que foi herdado da classe Ponto2D, que inicialize as variveis, conforme mostrado nas classes na listagem 5.8 Listagem 5.8: Soluo do problema de variveis privadas e herana
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

/* Classe que representa um ponto em duas dimenses */ class Ponto2D { // Variveis privadas private short x,y; /* Mtodo para inicializar */ void inicializa(short _x,short _y) { x = _x; y = _y; } /* Mtodo para imprimir */ void imprime() { System.out.println("("+x+","+y+")"); } /* Mtodo que permite a leitura da varivel x */ short qualX() { return x; } /* Mtodo que permite a leitura da varivel y */ short qualY() { return y; } } // fim da classe Ponto2D /* Classe que representa um ponto em trs dimenses, baseada na classe Ponto2D */ class Ponto3D extends Ponto2D { Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

50
// Variveis privadas private short z; /* Mtodo para inicializar */ void inicializa(short _x,short _y,short _z) { // Chama o mtodo herdado da classe Ponto2D inicializa(_x,_y); z = _z; } /* Mtodo para imprimir */ void imprime() { System.out.println("("+qualX()+","+qualY()+","+z+")"); } /* Mtodo que permite a leitura da varivel z */ short qualZ() { return z; } } // fim da classe Ponto3D

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

Alguns pontos de interesse nas classes da listagem 5.8 so: Ambas as classes Ponto2D e Ponto3D na listagem 5.8 implementam mtodos que permitem o acesso variveis privadas para leitura ou recuperao, no caso, os mtodos qualX, qualY e qualZ. A implementao deste tipo de mtodo bastante til, pois no s permite a criao de variveis que podem ser lidas livremente mas modicadas somente por mtodos especcos quanto tambm permite que estes mtodos sejam herdados e possam ser utilizados por classes herdeiras. A classe Ponto3D herdou todos os mtodos da classe Ponto2D, inclusive o mtodo inicializa com dois argumentos (linhas 7 a 11 da listagem 5.8). Como este mtodo tem nmero de argumentos diferentes do mtodo inicializa com trs argumentos (linhas 35 a 40), ele no sobreescrito - os dois mtodos existem na classe Ponto3D, e podemos inclusive chamar um deles de dentro do outro, como na linha 38 da listagem 5.8, o que possibilita o acesso s variveis x e y. possvel tambm chamarmos o mtodo inicializa com dois argumentos a partir de instncias da classe Ponto3D. Detalhes sobre a possibilidade de termos vrios mtodos com o mesmo nome numa mesma classe sero mostrados no captulo 6. Uma vez que o mtodo imprime da classe Ponto3D deve imprimir os valores das trs variveis, ele teve que ser reescrito. Como este mtodo no pode acessar as variveis x e y herdadas da classe Ponto2D, os mtodos qualX e qualY foram chamados. O exemplo mostrado na listagem 5.8 demonstra que uma classe pode herdar todas as variveis e mtodos de outra e acrescentar suas prprios variveis e mtodos - esta forma de herana, onde uma classe efetivamente aumenta as capacidades de outra, a mais comum.

5.4 Outros exemplos e mecanismos de herana


Nesta seo veremos alguns exemplos mais detalhados de herana e dos mecanismos relacionados. Como mais exemplo de herana, considere a classe Aluno mostrada na listagem 5.9, que representa de maneira simples os dados de um aluno de um curso superior.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

51

Listagem 5.9: A classe Aluno (verso simples)


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

/* Esta classe representa os dados de um aluno de forma simples */ class Aluno { // Algumas variveis para representar os dados do aluno private String nome; private long matrcula; private float mensalidade; /* O mtodo que inicializa */ void inicializa(String n,long m) { nome = n; matrcula = m; inicializaMensalidade(400); // mensalidade fixa para os alunos - veja abaixo } /* Um mtodo para inicializar s a mensalidade - pode ser que queiramos cham-lo separadamente do mtodo inicializa, e este mtodo tambm poder ser herdado. */ void inicializaMensalidade(float m) { mensalidade = m; } /* O mtodo que imprime os dados */ void imprime() { System.out.println("Dados do aluno "+matrcula); System.out.println("Nome: "+nome); System.out.println("Mensalidade: "+mensalidade); } /* Mtodo para retornar o nome do aluno */ String qualNome() { return nome; } /* Mtodo para retornar o nmero de matrcula do aluno */ long qualMatrcula() { return matrcula; } /* Mtodo para retornar o valor da mensalidade */ float qualMensalidade() { return mensalidade; } } // fim da classe Aluno

A classe Aluno, mostrada na listagem 5.9, tem vrios mtodos que permitem o acesso e modicao de suas variveis, que so todas privadas. A classe AlunoMestrado, mostrada na listagem 5.10, usa a classe Aluno como base e adiciona algumas variveis e mtodos atravs do mecanismo de herana.

Listagem 5.10: A classe AlunoMestrado (primeira verso)


1 2 3 4 5 6

/* Esta classe representa os dados de um aluno de mestrado, herdando o que j existe na classe Aluno */ class AlunoMestrado extends Aluno { // Variveis adicionais para representar os dados do aluno private String rea; // a rea de especializao Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

52
private String tese; // o ttulo da tese /* O mtodo que inicializa */ void inicializa(String n,long m,String a,String t) { inicializa(n,m); // chama mtodo que pode acessar nome e matrcula rea = a; tese = t; inicializaMensalidade(200); // mensalidade fixa para os alunos de mestrado } /* O mtodo que imprime - note que como no podemos acessar as variveis diretamente, usamos mtodos que as acessam. */ void imprime() { System.out.println("Dados do aluno "+qualMatrcula()); System.out.println("Nome: "+qualNome()); System.out.println("Mensalidade: "+qualMensalidade()); System.out.println("rea de especializao: "+rea); System.out.println("Ttulo da tese: "+tese); } /* Mtodo para retornar a rea de especializao */ String qualrea() { return rea; } /* Mtodo para retornar o ttulo da tese */ String qualTese() { return tese; } } // fim da classe AlunoMestrado

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

Apesar de boa parte da classe AlunoMestrado ter sido herdada da classe Aluno, vemos que em alguns casos ainda temos que repetir partes dos mtodos. Nos exemplos mostrados, especicamente, temos que reescrever e repetir boa parte do mtodo imprime na classe AlunoMestrado. Uma maneira de economizar ainda mais a tarefa de reescrever classes usar a referncia super. Esta referncia funciona como uma instncia da classe ancestral que pode ser usada de dentro da classe herdeira e que permite o acesso s variveis e mtodos no-privados da classe ancestral. Uma aplicao da referncia super na classe mostrada na listagem 5.10 seria no mtodo imprime - as trs primeiras linhas deste mtodo so idnticas ao contedo do mtodo imprime na classe Aluno (listagem 5.9), e podem ser reaproveitadas, bastando chamar o mtodo imprime da classe Aluno de dentro do mtodo imprime da classe AlunoMestrado. A classe AlunoMestrado modicada mostrada na listagem 5.11.

Listagem 5.11: A classe AlunoMestrado (segunda verso)


1 2 3 4 5 6 7 8 9 10 11 12

/* Esta classe representa os dados de um aluno de mestrado, herdando o que j existe na classe Aluno */ class AlunoMestrado extends Aluno { // Variveis adicionais para representar os dados do aluno private String rea; // a rea de especializao private String tese; // o ttulo da tese /* O mtodo que inicializa */ void inicializa(String n,long m,String a,String t) { inicializa(n,m); // chama mtodo que pode acessar nome e matrcula rea = a; Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

53
tese = t; inicializaMensalidade(200); // mensalidade fixa para os alunos de mestrado } /* O mtodo que imprime - note que como no podemos acessar as variveis diretamente, usamos mtodos que as acessam. */ void imprime() { super.imprime(); System.out.println("rea de especializao: "+rea); System.out.println("Ttulo da tese: "+tese); } /* Mtodo para retornar a rea de especializao */ String qualrea() { return rea; } /* Mtodo para retornar o ttulo da tese */ String qualTese() { return tese; } } // fim da classe AlunoMestrado

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Note que seria impossvel chamar o mtodo imprime da classe Aluno, uma vez que este foi sobreescrito pelo mtodo de mesmo nome e tipos de parmetros na classe AlunoMestrado. Alm da referncia super temos tambm a referncia this, que aponta para a prpria classe.

5.5

Exerccios do captulo 5

Nem todos os exerccios apresentados nesta seo so diretamente relacionados com herana. Alguns servem para xar os conceitos apresentados em captulos anteriores. Exerccio 5.1: Modique o mtodo imprime da classe Veiculo (listagem 5.1) para que caso o veculo no tenha rodas, nada seja impresso (veja o resultado do programa na listagem 5.2). Exerccio 5.2: Modique as variveis da classe Veiculo (listagem 5.1) para que todos sejam private. Modique tambm o mtodo inicializa para tratar dos dados que no so mais acessveis de fora da classe. Exerccio 5.3: Escreva uma classe Automovel que herde as varivels e mtodos da classe VeiculoTerrestre (listagem 5.3), mas que considere constante os valores nmeroDePassageiros, nmeroDeRodas e velocidadeMdia. Escreva tambm um programa que use instncias da classe Automovel.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

54

Exerccio 5.4: As classes abaixo contm 3 erros. Indique e explique os erros.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

class Pai { private char x,y; } class Filho extends Pai { char z; void imprime() { System.out.println("X "+x); System.out.println("Y "+y); System.out.println("Z "+z); } } class Teste { Pai p = new Pai(); p.x = N; Filho f = new Filho(); f.z = C; p.imprime(); f.imprime(); }

Exerccio 5.5: O que acontecer quando a classe Executavel da listagem abaixo for executada ? Que valores sero impressos, e porqu ? Como corrigir o problema existente nestas classes ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

class Pai { int x; void imprime() { System.out.println("Valor "+x); } } class Filho extends Pai { boolean x; } class Executavel { public static void main(String params[]) { Pai p = new Pai(); p.x = 12345; p.imprime(); Filho f = new Filho(); f.x = false; f.imprime(); } }

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

55

Exerccio 5.6: Crie uma classe Ponto4D que extenda a classe Ponto3D (listagem 5.8). inicializa da nova classe ? Exerccio 5.7: A classe abaixo contm 3 erros. Indique e explique os erros.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Como caria o mtodo

class Pontos { public static void main(String params[]) { Ponto2D p1,p2; p2 = new Ponto2D(); Ponto3D p3,p4; p3 = new Ponto3D(); p4 = new Ponto3D(); p1.inicializa((short)10,(short)12); p2.inicializa((short)27,(short)-5); System.out.println("Coordenada Z de p2 "+p2.qualZ()); p3.inicializa((short)80,(short)-45); p4.x = 16; } }

Exerccio 5.8: Indique e explique o erro existente nas classes abaixo.


1 2 3 4 5 6 7 8 9 10 11 12

class Pai { private int x; } class Filho extends Pai { void inicializa(int _x) { super.x = _x; } }

Exerccio 5.9: O que aconteceria se removssemos a palavra-chave super da linha 20 da listagem 5.11 ? Explique. Exerccio 5.10: Seguindo o exemplo mostrado na listagem 5.5, crie as classes VeiculoAereo e VeiculoAquatico, todas descendentes da classe Veiculo. Exerccio 5.11: Considerando o exerccio 3.5, crie uma classe LampadaFluorescente que herde variveis e mtodos da classe Lampada (listagem 3.4) e acrescente uma varivel para representar o comprimento da lmpada e mtodos para inicializar e imprimir os valores.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

56

Exerccio 5.12: Usando as classes criadas no exerccio 5.10, escreva um programa em Java que crie as instncias avioAJato, jetski, txi, lancha, miniVan, bicicleta e tecoTeco. Estas instncias devem ser criadas a partir das classes mais adequadas. Exerccio 5.13: Considere os exerccios 2.4 e 2.5 e escreva uma classe Livro que represente um livro genrico, e duas classes LivroBiblioteca e LivroLivraria que herdem da classe Livro. Exerccio 5.14: Usando a classe RegistroDeAluno (listagem 3.6) como base, crie a classe herdeira RegistroDeAlunoDeMestrado que conter duas Strings adicionais: uma para representar o seu tema de pesquisa e outra para representar seu orientador. Exerccio 5.15: Usando a classe ContaBancaria (listagem 3.8) como base, crie a classe herdeira ContaPoupana que contm uma varivel do tipo byte dia, que deve ser inicializada com os outros dados da classe ContaPoupana. O mtodo retira da classe deve ser sobreescrito de forma que a retirada s possa ser feita se um valor do tipo byte hoje, passado como argumento para o mtodo retira, for igual ao valor da varivel dia. Exerccio 5.16: Crie uma classe Presidente que contenha o nome do presidente, partido poltico de liao e nome do pas que este governa. Crie nesta classe mtodos bsicos para inicializao, impresso e recuperao dos valores. Crie a classe Governador que herde tudo da classe Presidente e adicione uma varivel para representar qual estado governado. Crie tambm uma classe Prefeito que herde da classe Governador e contenha o nome do municpio que governado pelo prefeito. Use os mecanismos de herana mostrados neste captulo.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

57

Captulo 6 Polimorsmo
6.1 Introduo

Linguagens de programao orientadas a objeto permitem a criao de mtodos com o mesmo nome em uma mesma classe, graas a um mecanismo chamado polimorsmo. Os mtodos podem ter o mesmo nome, mas devem ser diferenciados pelo nmero e tipo de argumentos que recebem. Mtodos polimrcos podem ser usados quando queremos criar vrias opes para que a mesma tarefa seja feita por um mtodo. Para exemplicar, consideremos a classe Hora mostrada na listagem 6.1, que dene um nico mtodo ajusta, que recebe trs argumentos para inicializao dos dados das instncias da classe Hora.

Listagem 6.1: A classe Hora


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

/* Esta classe representa uma hora (tempo) simples. */ class Hora { // Trs variveis para representar as horas, minutos e segundos private byte horas; private byte minutos; private byte segundos; /* Este mtodo ajusta a hora com os valores passados */ void ajusta(byte phoras,byte pminutos,byte psegundos) { horas = phoras; minutos = pminutos; segundos = psegundos; } /* Este mtodo imprime a hora formatada */ void imprime() { System.out.println(horas+":"+minutos+":"+segundos); } } // fim da classe Hora

A classe TesteHora, que contm um mtodo main e mostrada na listagem 6.2, demonstra o uso de instncias da classe Hora. Vrias instncias com valores diferentes para cada hora, minuto e segundo representados na classe so criadas.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

58

Listagem 6.2: Um programa que demonstra usos da classe Hora


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/* Esta classe demonstra usos da classe Hora */ class TesteHora { /* Este mtodo faz com que a classe possa ser executada */ public static void main(String args[]) { // crio algumas instncias e inicializo-as Hora agora = new Hora(); agora.ajusta((byte)22,(byte)53,(byte)41); Hora meianoite = new Hora(); meianoite.ajusta((byte)0,(byte)0,(byte)0); Hora meiodia = new Hora(); meiodia.ajusta((byte)12,(byte)0,(byte)0); Hora onzeemeia = new Hora(); onzeemeia.ajusta((byte)11,(byte)30,(byte)0); // peo s instncias que se imprimam agora.imprime(); meianoite.imprime(); meiodia.imprime(); onzeemeia.imprime(); } } // fim da classe TesteHora

Podemos ver na listagem 6.2 que quando chamamos o mtodo ajusta das instncias da classe Hora, o valor dos segundos (terceiro argumento passado) , em muitos casos, zero, mas devido s regras da linguagem, deve sempre ser passado. Usando polimorsmo, podemos criar mtodos em uma classe que aceitem nmeros de argumentos diferentes, que reitam o nvel de detalhe que o usurio da classe quer utilizar. Para possibilitar ao usurio da classe a escolha sobre passar ou no o nmero de segundos para uma instncia da classe Hora pelo mtodo ajusta basta a criao de um ou mais mtodos com o mesmo nome que aceitem nmeros de argumentos diferentes e os processem corretamente, conforme mostrado na classe Hora na listagem 6.3.

Listagem 6.3: A classe Hora, com mtodos polimrcos


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/* Esta classe representa uma hora (tempo) simples, e apresenta alguns mtodos polimrficos. */ class Hora { // Trs variveis para representar as horas, minutos e segundos private byte horas; private byte minutos; private byte segundos; /* Este mtodo ajusta a hora, usando horas, minutos e segundos */ void ajusta(byte phoras,byte pminutos,byte psegundos) { horas = phoras; minutos = pminutos; segundos = psegundos; } /* Este mtodo ajusta a hora, usando somente horas e minutos e considerando segundos como zero */ void ajusta(byte phoras,byte pminutos) { horas = phoras; minutos = pminutos; segundos = 0; // consideramos segundos como zero }

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

59
/* Este mtodo ajusta a hora, usando somente horas e considerando minutos e segundos como zero */ void ajusta(byte phoras) { horas = phoras; minutos = 0; // consideramos minutos como zero segundos = 0; // consideramos segundos como zero } /* Este mtodo ajusta as variveis horas, minutos e segundos como sendo zero */ void ajusta() { horas = 0; // consideramos horas como zero minutos = 0; // consideramos minutos como zero segundos = 0; // consideramos segundos como zero } /* Este mtodo imprime a hora formatada */ void imprime() { System.out.println(horas+":"+minutos+":"+segundos); } } // fim da classe Hora

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

A classe Hora na listagem 6.3 contm quatro mtodos ajusta, cada um com o nmero de argumentos diferentes, que podem ser chamados de acordo com a necessidade ou desejo do usurio da classe. A classe TesteHora pode ser reescrita de forma a passar o nmero de minutos e segundos somente quando isto for desejado pelo usurio da classe, conforme mostrado na listagem 6.4.

Listagem 6.4: Um programa que demonstra usos da classe Hora que contm mtodos polimrcos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/* Esta classe demonstra usos da classe Hora com os mtodos polimrficos */ class TesteHora { /* Mtodo que possibilita a execuo da classe */ public static void main(String args[]) { // crio algumas instncias e inicializo-as Hora agora = new Hora(); agora.ajusta((byte)22,(byte)53,(byte)41); // primeiro mtodo usado Hora meianoite = new Hora(); meianoite.ajusta(); // quarto mtodo usado Hora meiodia = new Hora(); meiodia.ajusta((byte)12); // terceiro mtodo usado Hora onzeemeia = new Hora(); onzeemeia.ajusta((byte)11,(byte)30); // segundo mtodo usado // peo s instncias que se imprimam agora.imprime(); meianoite.imprime(); meiodia.imprime(); onzeemeia.imprime(); } } // fim da classe TesteHora

Na listagem 6.4 vemos que podemos inicializar os valores de uma instncia da classe Hora passando os valores das horas, minutos e segundos (linha 9), somente das horas e minutos (linha 15), somente das horas (linha 13) e sem nenhum argumento (linha 11). Poderimos ter criado quatro mtodos com nomes ligeiramente diferentes para ajustar os valores da classe, sem usar o polimorsmo, mas a vantagem do uso deste que o mesmo nome de mtodo usado para tarefas bem parecidas - o programador que usar a classe no precisar se preocupar com nomes diferentes para mtodos cuja nalidade praticamente igual.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

60

6.2

Regras de polimorsmo

As regras para criao de mtodos polimrcos so realmente simples: mtodos polimrcos podem ser criados se o nmero e tipo de argumentos passados aos mtodos so diferentes - desta forma o compilador sabe que mtodo ser chamado atravs da avaliao do nmero e tipos de dados. Para exemplicar as regras de polimorsmo, consideremos a classe Terminal na listagem 6.5. Esta classe implementa vrios mtodos polimrcos, todos estticos, permitindo assim o uso dos mtodos da classe sem a necessidade de criao de uma instncia desta.

Listagem 6.5: A classe Terminal


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

/* Classe que demonstra alguns mtodos polimrficos para esclarecer os conceitos de polimorfismo. A classe contm somente mtodos estticos, significando que no ser precisa a criao de instncias desta classe para usar seus mtodos. A classe serve como substituta do mtodo System.out.println. */ class Terminal { /* Mtodo que recebe uma String */ static void print(String a) { System.out.println(a); } /* Mtodo que recebe duas Strings */ static void print(String a,String b) { System.out.println(a+" "+b); } /* Mtodo que recebe trs Strings */ static void print(String a,String b,String c) { System.out.println(a+" "+b+" "+c); } /* Mtodo que recebe um boolean */ static void print(boolean a) { System.out.println(a); } /* Mtodo que recebe um int */ static void print(int a) { System.out.println(a); } /* Mtodo que recebe uma String e um double */ static void print(String a,double b) { System.out.println(a+" "+b); } /* Mtodo que recebe um double e uma String */ static void print(double a,String b) { System.out.println(a+" "+b); } /* Mtodo que recebe uma String e um int */ static String print(String a,int b) { return a+" "+b; } } // fim da classe Terminal

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

61 A classe Terminal (listagem 6.5) contm oito mtodos chamados print, sendo que todos tem nmero e tipos diferentes de argumentos. Podemos inclusive ter mtodos que retornam tipos diferentes, contanto que o nmero e tipos de argumentos seja diferente, conforme mostrado no ltimo mtodo print da classe Terminal - este retorna uma String, enquanto os outros mtodos com o mesmo nome retornam void. Modicadores e nomes de variveis so completamente ignorados pela linguagem quando esta considera os nomes dos mtodos em uma mesma classe: desta maneira static void print(int a) e void print(int z) so consideradas iguais. Uma regra simples para vericar se os mtodos sero considerados como iguais (portanto quebrando as regras do polimorsmo) considerar os nomes dos mtodos sem modicadores como public, private, etc. e sem os nomes das variveis, ou seja, considerar somente o nome simplicado do mtodo. Desta forma, os dois mtodos apresentados como exemplo teriam os nomes simplicados void print(int) e void print(int), sendo considerados iguais e no podendo estar presentes na mesma classe.

6.3 Mais exemplos de polimorsmo


Mtodos polimrcos podem ser criados na classe e herdado de outras, contanto que as regras bsicas mostradas na seo 6.1 sejam seguidas. Para demonstrar o uso de polimorsmo e herana, consideremos a classe Livro (listagem 6.6) e a classe LivroComSoftware, herdeira de Livro, mostrada na listagem 6.7. Listagem 6.6: A classe Livro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

/* Esta a classe Livro, que representa dados simples sobre um livro. */ class Livro { private String ttulo; // O ttulo do livro private String autor; // O nome do autor do livro private String editora; // O nome da editora do livro private short nmeroDePginas; // O nmero de pginas do livro /* Este mtodo inicializa os quatro atributos do livro, passando-os como argumentos */ void inicializa(String t,String a,String e,short np) { ttulo = t; autor = a; editora = e; nmeroDePginas = np; } /* Este mtodo imprime o contedo da classe de forma organizada */ void imprime() { System.out.println("Ficha do livro "+ttulo+":"); System.out.println("Nome do Autor:"+autor); System.out.println("Editora:"+editora); System.out.println(nmeroDePginas+" pginas"); } } // fim da classe Livro

Listagem 6.7: A classe LivroComSoftware, herdeira da classe Livro


1 2 3 4 5

/* Esta a classe LivroComSoftware, que herda de classe Livro. Esta classe representa um livro que vem acompanhado de software. */ class LivroComSoftware extends Livro { /* Alm das varivels herdadas da classe Livro, esta classe define o nome do software que Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

62
acompanha o livro e um valor booleano que indica se a mdia do software CD ou no. */ private String software; private boolean CD; /* O mtodo inicializa desta classe leva em considerao os dados herdados e os declarados na prpria classe */ void inicializa(String t,String a,String e,short np,String s,boolean cd) { super.inicializa(t,a,e,np); // Alguns dados podem ser inicializados pelo mtodo // inicializa da classe super (Livro). software = s; // Os outros so inicializados no prprio mtodo inicializa CD = cd; } /* O mtodo imprime deve imprimir todos os atributos: os herdados e os declarados na prpria classe */ void imprime() { super.imprime(); // Os atributos herdados podem ser impressos pelo mtodo imprime // da classe super (Livro). // Os outros so impressos aqui mesmo. System.out.print("Inclui o software "+software+" "); if (CD) System.out.println("em CD-ROM"); else System.out.println("em disquetes"); } } // fim da classe LivroComSoftware

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

A classe LivroComSoftware contm um mtodo cujo nome simplicado void inicializa(String, String, String, short, String, boolean) (linha 11 da listagem 6.7), e herda da classe Livro o mtodo void inicializa(String, String, String, short np) (linha 9 da listagem 6.6). O mtodo inicializa da classe LivroComSoftware chama, atravs da referncia super (que aponta para a classe ancestral), o mtodo inicializa da classe Livro (linha 13 da listagem 6.7). Na verdade, neste caso o uso da referncia super opcional, uma vez que a classe LivroComSoftware contm o mtodo void inicializa(String, String, String, short np) - herdado da classe Livro. Como um mtodo pode chamar outro da mesma classe diretamente, podemos tranquilamente reescrever a linha 13 da listagem 6.7 como inicializa(t,a,e,np);. importante notar que se o mtodo inicializa da classe Livro fosse declarado como private, ele no poderia ser chamado de dentro da classe LivroComSoftware, mesmo se a referncia super fosse utilizada - ele estaria invisvel para a classe LivroComSoftware. tambm importante notar que em alguns casos o uso do super se faz necessrio, apesar do exemplo dado acima. Na classe LivroComSoftware temos um mtodo void imprime() que chama o mtodo imprime da classe Livro atravs da referncia super (linha 22 da listagem 6.7). Caso retirssemos a referncia super desta linha, o mtodo que seria chamado seria o mtodo imprime da prpria classe LivroComSoftware, uma vez que ele sobreescreveu o mtodo imprime herdado da classe Livro. Neste caso, o mtodo estaria se chamando recursivamente, criando uma volta ou lao recursivamente innito, que causaria um erro de execuo no programa. A nica maneira de evitar este lao innito seria garantir que o mtodo imprime da classe LivroComSoftware estaria chamando o mtodo imprime da classe Livro, atravs da referncia super. Um exemplo diferente de uso de polimorsmo mostrado na classe MatBasica (listagem 6.8). Esta classe contm vrios mtodos estticos (que podem ser usados sem necessidade de instanciao da classe) que calculam duas funes matemticas, mdia e maior. Estes mtodos so polimrcos de forma que podemos chamar ambos com dois ou trs argumentos do tipo double, como mostrado na classe TesteMatBasica (listagem 6.9).
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

63

Listagem 6.8: A classe MatBasica


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

/* A classe MatBasica contm alguns mtodos estticos para clculos matemticos bsicos */ class MatBasica { /* Mtodo que calcula e retorna a mdia de dois valores */ static double mdia(double a,double b) { return (a+b)/2; } /* Mtodo que calcula e retorna a mdia de trs valores */ static double mdia(double a,double b,double c) { return (a+b+c)/3; } /* Mtodo que calcula e retorna o maior de dois valores */ static double maior(double a,double b) { if (a >= b) return a; else return b; } /* Mtodo que calcula e retorna o maior de trs valores */ static double maior(double a,double b,double c) { double maiorAtAgora = maior(a,b); if (maiorAtAgora >= c) return maiorAtAgora; else return c; } } // fim da classe MatBasica

Listagem 6.9: Um programa que demonstra a classe MatBasica


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

/* Classe que demonstra a classe MatBasica */ class TesteMatBasica { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { // Calculamos e imprimimos algumas mdias de dois e trs valores System.out.println(MatBasica.mdia(1,4)); System.out.println(MatBasica.mdia(1,2.2)); System.out.println(MatBasica.mdia(1.3,1.2,1.1)); System.out.println(MatBasica.mdia((byte)9,(short)9,(long)3)); // Calculamos e imprimimos os maiores valores de dois e trs valores passados System.out.println(MatBasica.maior(1,2L)); System.out.println(MatBasica.maior(3/7,4/9)); } } // fim da classe TesteMatBasica

Alguns pontos interessantes das classes MatBasica e TesteMatBasica.java so: Na linha 8 da listagem 6.9 estamos passando valores inteiros para o mtodo mdia, mas no ocorrem erros de compilao porque o compilador aceita valores inteiros como argumentos para mtodos que esperam valores do tipo double. Isto somente ocorre porque valores de tipo inteiro podem ser representados por valores do tipo double, ainda que alguma preciso se perca. O mesmo ocorre na linha 11, uma vez que os valores dos tipos byte, short e long sero convertidos automaticamente para double para uso pelo mtodo mdia. Na linha 9 da listagem 6.9 um valor do tipo int e outro do tipo double, o do tipo int (primeiro argumento) ser convertido automaticamente para double para uso pelo mtodo mdia. O mesmo ocorre na linha 13.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

64 O resultado da linha 14 da listagem 6.9 zero, uma vez que os valores passados como argumentos para o mtodo maior so resultados das divises de valores inteiros (ambos iguais a zero). Um ponto importante a ser considerado com mtodos polimrcos que aceitam valores numricos que tipos de dados menores podem ser aceitos por mtodos que esperam tipos de dados maiores - no exemplo mostrado nas listagens 6.8 e 6.9, os mtodos esperavam valores do tipo double mas aceitaram valores do tipo int, pois a converso feita automaticamente. O inverso no ocorre - se o mtodo espera um tipo int e um valor double passado, o compilador gerar uma mensagem de erro. Detalhes sobre tipos de dados e converses so mostrados no apndice A.

6.4 Exerccios do captulo 6


Nem todos os exerccios apresentados nesta seo so diretamente relacionados com polimorsmo. Alguns servem para xar os conceitos apresentados em captulos anteriores. Exerccio 6.1: Reescreva a classe Lampada (listagem 3.4) para que esta tenha dois mtodos polimrcos de inicializao: um ao qual se passa o valor booleano correspondente ao estado (acesa ou apagada) como argumento e outro ao qual no se passam argumentos, desta maneira considerando-se a lmpada como acesa. Exerccio 6.2: Crie mais mtodos polimrcos na classe MatBasica para clculo da mdia de quatro valores, e para clculo dos menores valores de dois e trs valores passados como argumentos. Exerccio 6.3: Ache e explique os dois erros no programa abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

class Teste { int soma(int a,int b) { return a+b; } int soma(int c,int d) { return c+d; } float soma(float e,float f) { return e+f; } float soma(int g,int h) { return g+h; } }

Exerccio 6.4: Os mtodos ajusta da classe Hora (listagem 6.3) recebem somente variveis tipo byte, obrigando o programador que usa as classes a usar o cast (converso) quando chama os mtodos, como mostrado nas linhas 9, 13 e 15 da listagem 6.4. Crie mtodos polimrcos adicionais na classe Hora que permitam ao usurio passar valores do tipo int, dispensando o cast. Que problema pode ocorrer por causa desta mudana ?

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

65

Exerccio 6.5: Considere a classe Terminal na listagem 6.5 e os nomes de mtodos abaixo. Quais destes mtodos podem pertencer classe Terminal (seguindo as regras de polimorsmo) e quais no podem ? Explique, caso a caso. Os mtodos somente contm o cabealho, para simplicao. static void print(String b) void print() static int print() static void print(double a,double b) void print(String a, int b) String print(int omega) boolean print(boolean funciona) static void imprime(int a)

Exerccio 6.6: Crie mais mtodos mdia e maior, usando polimorsmo, na classe MatBasica (listagem 6.8). Estes mtodos devem tratar somente com valores do tipo inteiro. Exerccio 6.7: Considerando as classes Livro (listagem 6.6) e LivroComSoftware (listagem 6.7), o que acontecer com as instncias do programa abaixo ? Explique.
1 2 3 4 5 6 7 8 9 10 11 12 13

class TesteLivros { public static void main(String z[]) { LivroComSoftware l1 = new LivroComSoftware(); l1.inicializa("O Grande Livro das Mentiras","Kung Pao","Marmora Editora",(short)459); LivroComSoftware l2 = new LivroComSoftware(); l2.inicializa("O Grande Livro das Mentiras","Kung Pao","Marmora Editora",(short)459, "Lie Detector 1.0",true); l1.imprime(); l2.imprime(); } }

Exerccio 6.8: Usando mtodos polimrcos j existentes, pode-se criar novos mtodos que retornem os maiores ou menores valores de quatro, cinco, seis, etc. valores passados como argumentos. Crie estes mtodos na classe MatBasica (listagem 6.8). Exerccio 6.9: Modique o mtodo ajusta da classe Hora (listagem 6.3) que no recebe argumentos. Considere que se nenhum argumento passado, o mtodo deve ler os valores do teclado. Use o mtodo readByte da classe Keyboard (apndice B) para ler os valores do teclado.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

66

Exerccio 6.10: Considere a classe Qual e a classe Teste na listagem abaixo. Quando as chamadas aos mtodos forem feitas (linhas 29 a 36), quais mtodos sero executados para cada linha ? Explique.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

class Qual { static void mtodo(int a,int b) { System.out.println("Primeiro mtodo !"); } static void mtodo(double a,double b) { System.out.println("Segundo mtodo !"); } static void mtodo(int a,double b) { System.out.println("Terceiro mtodo !"); } static void mtodo(double a,int b) { System.out.println("Quarto mtodo !"); } } class Teste { public static void main(String args[]) { byte umByte = 1; int umInt = 17; long umLong = 100L; double umDouble = 1.3; Qual.mtodo(umByte,umLong); Qual.mtodo(umLong,umInt); Qual.mtodo(umDouble,umLong); Qual.mtodo(umDouble,umByte); Qual.mtodo(umInt,umLong); Qual.mtodo(umByte,umInt); Qual.mtodo(umLong,umLong); Qual.mtodo(umByte,umByte); } }

Exerccio 6.11: Modique a classe Data (listagem 3.5) para que esta tenha dois outros mtodos chamados ajustaData usando polimorsmo. Um destes mtodos receber uma instncia da classe Data como argumento, e usar os valores contidos nesta instncia para inicializar a data. Outro mtodo no receber argumentos e ler os dados do teclado usando a classe Keyboard (apndice B).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

67

Captulo 7 Construtores
7.1 Introduo

As classes para representao de dados criadas at agora seguem um padro: as variveis das classes so declaradas como private, e devem ser manipuladas por mtodos que inicializam e imprimem estes valores. Adicionalmente podemos ter mtodos que podem calcular ou modicar os valores da classe. S podemos chamar os mtodos de uma instncia de uma classe depois que esta for inicializada atravs da palavra-chave new. Mesmo assim, ainda no existem garantias de que os valores contidos na instncia estaro inicializados, e em alguns casos estaremos chamando mtodos que trataro ou mostraro dados sem sentido. Um exemplo deste problema mostrado no programa na listagem 7.1.

Listagem 7.1: Um programa que usa instncias da classe RegistroDeAluno


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

/* Esta a classe TesteRegistroDeAluno, que demonstrar o uso de instncias da classe RegistroDeAluno */ class TesteRegistroDeAluno { /* Mtodo que permite a execuo da classe */ public static void main(String params[]) { // Criamos uma instncia da classe RegistroDeAluno RegistroDeAluno ana = new RegistroDeAluno(); // calculamos a mensalidade do alnno representado por esta instncia float mensalidade = ana.calculaMensalidade(); // imprimimos os dados deste aluno ana.imprime(); } } // fim da classe TesteRegistroDeAluno

No programa na listagem 7.1 uma instncia da classe RegistroDeAluno (mostrada na listagem 3.6) criada atravs da palavra-chave new (linha 9). Na linha 11 usamos o mtodo calculaMensalidade que calcular a mensalidade sem que um valor para a varivel de classe Bolsista tenha sido explicitamente inicializada, e na linha 13 usamos o mtodo imprime que imprimir valores no inicializados (Strings sero consideradas como null, valores numricos como zero, etc.). No programa na listagem 7.1 esperava-se que aps a criao da instncia com a palavra-chave new e antes do uso dos mtodos desta instncia, o mtodo entraDados (que permite que passemos valores s variveis internas da classe RegistroDeAluno) fosse chamado, mas no existe um mecanismo implcito da linguagem Java que garanta a chamada de mtodos em uma ordem particular - isto obrigao do programador
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

68 que usa as classes. possvel, no entanto, garantir que um mtodo ser chamado antes de qualquer outro mtodo em uma classe. Este mtodo conhecido como construtor daquela classe. Este mtodo pode executar qualquer tarefas relativa classe que o implementa, mas frequentemente usado para inicializar os dados das instncias das classes. Mtodos sero considerados como construtores se todas as seguintes regras forem cumpridas: Construtores devem ter o mesmo nome da classe, inclusive em relao caracteres maisculos e minsculos. Construtores no podem retornar nenhum valor, nem mesmo void - so declarados somente com o nome da classe e os valores passados como argumentos. Construtores no devem ter modicadores como static, private, public, etc. Construtores, apesar de serem mtodos, no podem ser chamados diretamente de programas ou de dentro de outros mtodos da mesma classe - a nica maneira de executar o cdigo contido em um construtor atravs da palavra-chave new, que automaticamente chamar o construtor. Isto garante que o construtor ser o primeiro mtodo executado de cada classe. Um exemplo de classe com construtor mostrada na listagem 7.2. Instncias desta classe so mostradas no programa na listagem 7.3.

Listagem 7.2: A classe Lampada, com um construtor


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

/* Esta a classe Lmpada (note que o nome da classe no contm acentos). Esta segunda verso contm um construtor para inicializao da classe. */ class Lampada { /* Os estados "ligado" e "desligado" so representados por um valor booleano true corresponde a "ligado" e false a "desligado". */ private boolean ligada; /* O construtor da classe Lampada - deve ter o mesmo nome, nenhum valor de retorno e nenhum modificador. Recebe como argumento um estado inicial. */ Lampada(boolean estado) { ligada = estado; } /* Este mtodo acende a lmpada, independente de seu estado atual */ void acende() { ligada = true; } /* Este mtodo apaga a lmpada, independente de seu estado atual */ void apaga() { ligada = false; } /* Este mtodo imprime o estado da lmpada */ void imprime() { if (ligada) System.out.println("ligada"); else System.out.println("desligada"); } } // fim da classe Lampada

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

69

Listagem 7.3: Classe que usa instncias da classe Lampada com construtor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/* Esta classe demonstra instncias da classe Lampada (usando construtores) */ class TesteLampada { /* Este mtodo permite a execuo da classe */ public static void main(String args[]) { // Criamos trs instncias da classe Lampada e passamos para o construtor // um estado inicial para cada. Lampada lmpadaDaSala = new Lampada(true); // ligada Lampada lmpadaDoQuarto = new Lampada(false); // desligada Lampada lmpadaDaCozinha = new Lampada(true); // ligada // Apago a luz da sala lmpadaDaSala.apaga(); // Imprimo o estado de cada uma delas System.out.print("A lmpada da sala est "); lmpadaDaSala.imprime(); System.out.print("A lmpada da quarto est "); lmpadaDoQuarto.imprime(); System.out.print("A lmpada da cozinha est "); lmpadaDaCozinha.imprime(); } } // fim da classe TesteLampada

Na linha 10 da listagem 7.2 vemos o construtor para a classe Lampada o mtodo que ser automaticamente chamado pela palavra-chave new nas linhas 10, 11 e 12 da listagem 7.3.

7.1.1

O construtor default

Toda classe criada em Java j tem um construtor default, que no recebe nenhum argumento. O uso deste construtor pode ser visto na linha 9 da listagem7.1 - a palavra-chave new chamar um construtor sem argumentos da classe RegistroDeAluno. Este construtor vazio dado automaticamente pela linguagem para as classes que no tem nenhum construtor. Se qualquer construtor for criado explicitamente para a classe, o construtor default vazio no ser criado automaticamente, e no poder ser usado por outras classes, a no ser que um dos construtores criados para a classe tenha a mesma forma do construtor default (vazio, ou sem argumentos). Construtores podem chamar outros mtodos da classe, mas os outros mtodos no podem chamar construtores. Exemplos destas duas caractersticas so mostrados nas classes das listagens 7.4 e 7.5.

Listagem 7.4: A classe Data com um construtor


1 2 3 4 5 6 7 8 9 10 11 12

/* Esta a classe Data, com um construtor */ class Data { private byte dia,ms; // dia e ms da data private short ano; // ano da data /* Este mtodo ajusta o dia da data */ void ajustaDia(byte d) { dia = d; } /* Este mtodo ajusta o ms da data */ void ajustaMs(byte m) Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

70
{ ms = m; } /* Este mtodo ajusta o ano da data */ void ajustaAno(short a) { ano = a; } /* Este mtodo ajusta simultaneamente o dia, ms e ano da data, chamando os outros mtodos declarados anteriormente */ void ajustaData(byte d,byte m,short a) { ajustaDia(d); // chama o mtodo ajustaDia com o argumento d ajustaMs(m); // chama o mtodo ajustaMs com o argumento m ajustaAno(a); // chama o mtodo ajustaAno com o argumento a } /* Este o construtor da classe Data, que inicializar os valores atravs de uma chamada ao mtodo ajustaData */ Data(byte d,byte m,short a) { ajustaData(d,m,a); } /* Este mtodo imprime a data. */ void imprime() { System.out.print("Dia:"+dia+" "); System.out.print("Ms:"+ms+" "); System.out.println("Ano:"+ano); } /* Este mtodo retorna a data formatada como uma String. */ String formata() { String temporria = "Dia:"+dia+" Ms:"+ms+" Ano:"+ano; return temporria; } } // fim da classe Data

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

Listagem 7.5: Classe que usa instncias da classe Data com construtor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

/* Esta a classe TesteData, que criar instncias da classe Data usando seu construtor. */ class TesteData { /* Este o mtodo main, que permite a execuo da classe */ public static void main(String args[]) { // Crio uma instncia da classe Data Data hoje = new Data((byte)2,(byte)4,(short)2000); // Crio outra instncia da classe Data, que ser inicializada com uma data Data nascimento = new Data((byte)3,(byte)2,(short)1939); // Modifico a data da instncia nascimento nascimento.ajustaData((byte)3,(byte)10,(short)1962); // Imprimo as instncias da classe Data hoje.imprime(); nascimento.imprime(); } } // fim da classe TesteData

Na classe Data, mostrada na listagem 7.4, temos o construtor na linha 31 que chama o mtodo ajustaData (linha 23), passando para este os valores passados como argumento. Desta forma as funes do mtodo ajustaData e do construtor so as mesmas, mas possibilitamos que uma data seja inicializada com valores quando instanciada com a palavra-chave new e tambm que uma data seja instanciada e depois seus valores
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

71 modicados, como mostrado nas linhas 10 e 12 da listagem 7.5. importante notar que uma vez que criamos um construtor para a classe Data (listagem 7.4), no podemos mais criar instncias da classe atravs da palavra-chave new como Data instncia = new Data() pois o construtor default no ser criado automaticamente, e no existe um construtor sem argumentos para a classe Data que possa ser chamado no lugar do construtor default.

7.2 Construtores, herana e polimorsmo


As mesmas regras de polimorsmo e herana que se aplicam mtodos se aplicam aos construtores, com poucas diferenas. Usando as regras de polimorsmo podemos criar vrios construtores, s que estes no retornam nenhum valor (nem mesmo void) nas suas declaraes. Alguns detalhes sobre as regras de polimorsmo e herana aplicadas aos construtores so mostradas nos comentrios sobre as classes nas listagens 7.6, 7.7 e 7.8.

Listagem 7.6: A classe Veiculo com construtores polimrcos


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

/* Uma classe que representa um veculo genrico de transporte de passageiros, com construtor */ class Veiculo { private String nome; // O nome do veculo private short nmeroDePassageiros; // Nmero de passageiros private byte nmeroDeRodas; // Nmero de rodas private short velocidadeMdia; // Velocidade Mdia private boolean Areo; // true se o veculo voa private boolean Terrestre; // true se o veculo terrestre private boolean Aqutico; // true se o veculo aqutico /* O construtor para inicializar todos os valores do veculo genrico */ Veiculo(String n,short np,byte nr,short vm,boolean ear,boolean ete,boolean eaq) { nome = n; nmeroDePassageiros = np; nmeroDeRodas = nr; velocidadeMdia = vm; Areo = ear; Terrestre = ete; Aqutico = eaq; } /* Um construtor mais simples que pressupe veculos terrestres */ Veiculo(String n,short np,byte nr,short vm) { nome = n; nmeroDePassageiros = np; nmeroDeRodas = nr; velocidadeMdia = vm; Areo = false; Terrestre = true; Aqutico = false; } /* Um mtodo para imprimir os dados do veculo genrico. */ void imprime() { // Imprime os dados de identificao System.out.println("O veculo "+nome); System.out.println("- carrega "+nmeroDePassageiros+" passageiros");

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

72
System.out.println("- tem "+nmeroDeRodas+" rodas"); System.out.println("- tem velocidade mdia "+velocidadeMdia+" km/h"); // Imprime seletivamente informaes sobre tipo if (Areo) System.out.println("- areo"); if (Terrestre) System.out.println("- terrestre"); if (Aqutico) System.out.println("- aqutico"); } } // fim da classe Veculo

39 40 41 42 43 44 45 46

Listagem 7.7: A classe VeiculoTerrestre com construtores polimrcos


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

/* Uma classe que representa um veculo terrestre de transporte de passageiros (com herana e construtores polimrficos) */ class VeiculoTerrestre extends Veiculo { /* Este o construtor da classe VeiculoTerrestre */ VeiculoTerrestre(String n,short np,byte nr,short vm) { // Chamamos o construtor da classe super (Veiculo) super(n,np,nr,vm); // todos os dados so inicializados } /* Este outro construtor da classe VeiculoTerrestre, com menos argumentos */ VeiculoTerrestre(String n,short vm) { // Consideraremos o nmero de passageiros constante e igual a cinco, e o // nmero de rodas constante e igual a 4 // Chamamos o construtor da classe super (Veiculo) super(n,(short)5,(byte)4,vm); } } // fim da classe VeculoTerrestre

Listagem 7.8: Uma classe que usa instncias da classe VeiculoTerrestre com construtores polimrcos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

/* Classe executvel que cria instncias das classes Veiculo e VeiculoTerrestre */ class TesteVeiculo { /* Mtodo que faz com que a classe seja executvel */ public static void main(String args[]) { // Crio e inicializo uma instncia da classe Veiculo para representar um nibus VeiculoTerrestre onibus = new VeiculoTerrestre("nibus de Passageiros", (short)50,(byte)6,(short)90); // Crio e inicializo uma instncia da classe Veiculo para representar um fusca VeiculoTerrestre fusca = new VeiculoTerrestre("Fusca",(short)65); // imprimo os dados das instncias onibus.imprime(); fusca.imprime(); } } // fim da classe TesteVeiculo

Algumas regras que se aplicam construtores, herana e polimorsmo esto listadas abaixo: O construtor da classe ancestral pode ser chamado atravs da referncia super sem o nome do mtodo, como mostrado na linha 9 da listagem 7.7. Quando uma classe que no possui o construtor default (como a classe Veculo, na listagem 7.6) usada como classe ancestral de outra, o construtor da classe descendente deve chamar o construtor da classe ancestral explicitamente atravs da referncia super, que neste caso deve corresponder uma das formas polimrcas explcitas dos construtores da classe ancestral.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

73 Se a classe ancestral possuir o construtor default, este ser chamado automaticamente de todos os construtores da classe descendente que no chamarem o construtor explicitamente atravs da referncia super. Construtores so herdados, mas no podem ser chamados como mtodos comuns. Para chamar um construtor da classe ancestral, devemos sempre usar o super(). Somente construtores podem chamar construtores. Se o construtor da classe ancestral for chamado de dentro do construtor da classe descendente, o super deve ser o primeiro comando a ser executado no construtor da classe descendente. Quando a classe possui vrios construtores, as regras de polimorsmo (exemplicadas pelas listagens 6.8 e 6.9) decidiro qual deles ser chamado: nos exemplos nesta seo, a palavra-chave new na linha 8 da listagem 7.8 chamar o construtor na linha 6 da listagem 7.7 enquanto a palavra-chave new na linha 11 da listagem 7.8 chamar o construtor na linha 12 da listagem 7.7. A referncia this pode ser usada para chamar um construtor dentro de outro da mesma classe. A linha 17 da listagem 7.7 poderia ser escrita como this(n,(short)5,(byte)4,vm); - neste caso o construtor sendo chamado seria o da mesma classe (linha 6) ao invs do da classe ancestral, mas o resultado seria o mesmo.

7.3

O mtodo toString()

Todas as classes em Java que no tem classe ancestral (ou seja, as classes que no usam herana) so mesmo assim descendentes, implicitamente, de uma classe bsica de Java chamada Object. Todas as classes criadas em Java tem, herdadas da classe Object, um mtodo chamado toString(), que converte uma instncia da classe para uma String, para ns de impresso. O mtodo toString() chamado automaticamente quando tentamos passar uma instncia de classe para o comando de impresso System.out.println ou quando tentamos concatenar uma String uma instncia de classe com o sinal +. Nas classes desenvolvidas at agora o mtodo toString() (que deve ser declarado obrigatoriamente como public, e no recebe nenhum argumento) no foi sobreescrito, sendo herdado diretamente da classe ancestral (na maior parte dos casos, Object). Este mtodo, quando no-sobreescrito, simplesmente imprime o nome da classe e alguns valores, como mostrado no resultado do programa na listagem 7.9.

Listagem 7.9: Uma classe que demonstra o uso implcito dos mtodos toString
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

/* Esta a classe TesteToString, que demonstrar os resultados das chamadas aos mtodos toString de algumas classes. */ class TesteToString { /* Este o mtodo main, que permite a execuo da classe */ public static void main(String args[]) { // Uma instncia da classe Data... Data hoje = new Data((byte)27,(byte)3,(short)2000); System.out.println(hoje); // Deve imprimir "Data@..." // Uma instncia da classe Veiculo... Veiculo carro = new Veiculo("Automvel",(short)5,(byte)4,(short)110); System.out.println(carro); // Deve imprimir "Veiculo@..." } } // fim da classe TesteToString

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

74 Para que possamos usar o mtodo toString() em uma classe, basta a sua criao. Este mtodo deve retornar uma String contendo os valores da classe, da forma que o programador quiser coloc-los. Para exemplicar, uma verso simplicada da classe Data mostrada na listagem 7.10.

Listagem 7.10: A classe Data com um construtor e o mtodo toString()


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

/* Verso simplificada da classe Data, com um construtor e o mtodo toString */ class Data { private byte dia,ms; // dia e ms da data private short ano; // ano da data /* O construtor que recebe os trs argumentos e inicializa os valores */ Data(byte d,byte m,short a) { dia = d; ms = m; ano = a; } /* Este mtodo retorna a data formatada como uma String. */ public String toString() { String temporria = "Dia:"+dia+" Ms:"+ms+" Ano:"+ano; return temporria; } } // fim da classe Data

Devemos observar que o mtodo toString() mostrado na linha 14 da listagem 7.10 declarado como public, no recebe nenhum tipo de argumento e retorna uma String. Chamadas diretas este mtodo ou indiretas atravs de System.out.println ou concatenao de Strings com o sinal + retornaro os valores da classe Data formatados como desejado.

7.4 Exerccios do captulo 7


Nem todos os exerccios apresentados nesta seo so diretamente relacionados construtores. Alguns servem para xar os conceitos apresentados em captulos anteriores. Exerccio 7.1: Complete a classe Lampada (listagem 3.4) com construtores e o mtodo toString. Exerccio 7.2: Complete a classe RegistroDeAluno (listagem 3.6) com construtores e o mtodo toString. Exerccio 7.3: Complete a classe ModeloDeComputador (listagem 3.7) com construtores e o mtodo toString. Exerccio 7.4: Complete a classe ContaBancaria (listagem 3.8) com construtores e o mtodo toString.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

75

Exerccio 7.5: Crie uma classe NomeETelefone que conter o nome e o telefone de uma pessoa. Crie ao menos um construtor para esta classe e escreva seu mtodo toString. Exerccio 7.6: Dos mtodos na classe Contador mostrada abaixo, quais so construtores e quais no so ? Explique.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

class Contador { private int valor; void Contador(int v) { valor = v; } private void Contador(int v) { valor = v; } private Contador(int v) { valor = v; } Contador() { valor = 0; } contador() { valor = 0; } }

Exerccio 7.7: Considerando a classe Lampada da listagem 7.2, qual o erro do programa na listagem abaixo ? Explique.
1 2 3 4 5 6 7 8 9

class TesteLampada { public static void main(String args[]) { Lampada lmpada1 = new Lampada(); lmpada1.acende(); lmpada1.imprime(); } }

Exerccio 7.8: Crie um construtor que no recebe argumentos para a classe RegistroDeAluno. Escreva este construtor de forma que se ele for chamado, os dados do aluno sero lidos do teclado. Use mtodos da classe Keyboard (apndice B) para ler os dados. Exerccio 7.9: Crie uma classe SiteNaInternet que represente um site na internet atravs da sua URL, seu ttulo, uma categoria e subcategoria (como usado nos principais sites de busca). Crie ao menos um construtor e o mtodo toString().

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

76

Exerccio 7.10: Considerando as regras de herana e construtores, quais so os trs erros do programa na listagem abaixo ? Explique.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

class Ponto2D { private int x,y; Ponto2D(int _x,int _y) { x = _x; y = _y; } } class Ponto3D extends Ponto2D { int z; Ponto3D(int _x,int _y,int _z) { Ponto3D(_x,_y); z = _z; } void inicializa(int _x,int _y,int _z) { super(_x,_y); z = _z; } } class Pontos { public static void main(String p[]) { Ponto3D a = new Ponto3D(1,2,-5); Ponto3D b = new Ponto3D(-8,8); } }

Exerccio 7.11: Considerando o exerccio 5.10, recrie as classes VeiculoAereo e VeiculoAquatico, descendentes da classe Veiculo, com construtores e mtodos toString(). Exerccio 7.12: Modique as classes Ponto2D e Ponto3D (listagem 5.8) para que estas tenham construtores apropriados e mtodos toString(). Dica: crie um construtor que recebe valores e um construtor que no recebe valores, neste caso as variveis da classe sero inicializadas com zeros. Exerccio 7.13: Crie uma classe NumeroComplexo que represente as partes real e imaginria de um nmero complexo. Crie trs construtores para esta classe: um que recebe os dois valores como argumento, um que recebe somente a parte real e considera a imaginria como zero e um que no recebe nenhum argumento e considera as duas partes como zero. Crie tambm um mtodo toString() apropriado. Exerccio 7.14: Considerando o exerccio 5.13, crie as classes LivroBiblioteca e LivroLivraria que herdem da classe Livro, com construtores apropriados e mtodos toString().

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

77

Exerccio 7.15: Usando o exerccio 5.16 como base, crie as classes Presidente, Governador e Prefeito com os construtores adequados e mtodos toString(). Exerccio 7.16: Crie um construtor para a classe Data que receba uma instncia da prpria classe Data para sua inicializao.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

78

Captulo 8 Estruturas de Deciso e Controle


8.1 Introduo

Neste captulo veremos as estruturas de deciso e controle que permitem que programas e classes executem trechos ou mtodos inteiros condicionalmente, isto , que sero ou no executados dependendo de condies. Veremos tambm estruturas que permitem que partes de programas sejam executadas repetidamente.

8.2

Operadores lgicos

Todas as estruturas de controle so baseadas em operadores lgicos: estruturas de deciso executaro parte do cdigo se uma condio ocorrer ou no, e estruturas de repetio repetiro trechos de cdigo at que uma condio seja cumprida ou enquanto uma condio for vlida. Operadores lgicos para controle destas estruturas so operadores de comparao. Nesta seo veremos quais so os operadores de comparao de Java e como eles podem ser usados. Os operadores de comparao para dados dos tipos numricos e booleanos so denidos como valor sinal valor, onde os valores podem ser variveis, constantes ou resultados de operaes e o sinal pode ser um dos abaixo: == retorna o valor booleano true se os dois valores forem exatamente iguais e false se forem diferentes. != retorna o valor booleano true se os dois valores forem diferentes e false se forem exatamente iguais (inverso do caso anterior). > retorna o valor booleano true se o valor esquerda do sinal for maior do que o valor direita do sinal, e false caso for menor ou igual. < retorna o valor booleano true se o valor esquerda do sinal for menor do que o valor direita do sinal, e false caso for maior ou igual. <= retorna o valor booleano true se o valor esquerda do sinal for menor ou igual do que o valor direita do sinal, e false se for maior. >= retorna o valor booleano true se o valor esquerda do sinal for maior ou igual do que o valor direita do sinal, e false se for menor. O programa mostrado na listagem 8.1 demonstra alguns usos dos operadores mostrados acima, com valores numricos do tipo inteiro. Os operadores podem ser usados tambm com outros tipos de dados nativos.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

79

Listagem 8.1: Um programa que demonstra os operadores de comparao numrica de Java


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

/* O programa nesta classe demonstra alguns operadores lgicos usados em comparaes. Note que aps cada String dos comandos System.out.println, existe uma operao lgica entre parnteses, cujo valor (true ou false) ser concatenado String para impresso. Os resultados das comparaes so mostrados em comentrio ao final de cada linha. */ class DemoComparacoes { /* Este mtodo permite a execuo da classe */ public static void main(String argumentos[]) { System.out.println("2 igual a (3-1) ? "+ (2 == (3-1)) ); // true System.out.println("2 igual a (1-3) ? "+ (2 == (1-3)) ); // false System.out.println("2 diferente de (3-1) ? "+ (2 != (3-1)) ); // false System.out.println("2 diferente de (1-3) ? "+ (2 != (1-3)) ); // true System.out.println("8 maior que 7 ? "+ (8 > 7) ); // true System.out.println("8 maior que 12 ? "+ (8 > 12) ); // false System.out.println("8 menor que 7 ? "+ (8 < 7) ); // false System.out.println("8 menor que 12 ? "+ (8 < 12) ); // true System.out.println("7+2 maior ou igual a 12-4 ? "+ (7+2 >= 12-4) ); // true System.out.println("7+2 maior ou igual a 9 ? "+ (7+2 >= 9) ); // true System.out.println("7+2 maior ou igual a 15-4 ? "+ (7+2 >= 15-4) ); // false System.out.println("5-1 menor ou igual a 1+2 ? "+ (5-1 <= 1+2) ); // false System.out.println("5-1 menor ou igual a 4 ? "+ (5-1 <= 4) ); // true System.out.println("5-1 menor ou igual a 1+5 ? "+ (5-1 <= 1+5) ); // true } // fim do mtodo main } // fim da classe DemoComparacoes

Operadores lgicos e valores booleanos podem ser combinados entre si para a criao de operadores mais complexos. As combinaes so feitas com trs operadores na forma valor sinal valor (vrios valores podem ser combinados de uma vez, contanto que existem sinais entre uns e outros), onde os valores so constantes ou expresses que retornam valores booleanos e o sinal pode ser um dos abaixo: && retorna o valor booleano true se e somente se os dois valores ( esquerda e direita do sinal) valerem true. Este o operador booleano AND (E). || retorna o valor booleano true se ao menos um dos dois valores ( esquerda e direita do sinal) valerem true. Este o operador booleano OR (OU). Note que o sinal usado a barra vertical e no o sinal de exclamao (!). Existe tambm o sinal da negao (NOT, NO), que transforma um valor booleano true em false e viceversa: este sinal a exclamao (!) e deve preceder um valor ou operador booleano. Alguns exemplos de operadores e combinaes so mostrados no programa da listagem 8.2.

Listagem 8.2: Um programa que demonstra combinaes de operadores lgicos


1 2 3 4 5 6 7 8 9 10 11 12 13

/* O programa nesta classe demonstra algumas combinaes de operadores lgicos. Note que aps cada String dos comandos System.out.println, existe uma operao lgica entre parnteses, cujo valor (true ou false) ser concatenado String para impresso. Os resultados das comparaes so mostrados em comentrio ao final de cada linha. */ class DemoCombinacoes { /* Este mtodo permite a execuo da classe */ public static void main(String parmetros[]) { // Primeiro demonstraremos as combinaes entre as constantes booleanas System.out.println("true and true ? "+ (true && true) ); // true System.out.println("true and false ? "+ (true && false) ); // false Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

80
System.out.println("false and true ? "+ (false && true) ); // false System.out.println("false and false ? "+ (false && false) ); // false System.out.println("true or true ? "+ (true || true) ); // true System.out.println("true or false ? "+ (true || false) ); // true System.out.println("false or true ? "+ (false || true) ); // true System.out.println("false or false ? "+ (false || false) ); // false System.out.println("not true ? "+ (!true) ); // false System.out.println("not false ? "+ (!false) ); // true // Agora demonstraremos combinaes de comparaes int a = 17; char b = J; double c = 1023.17; System.out.println("a == 17 or b == J ? "+ ((a==17)||(b==J))); // true System.out.println("a > 3 or c < 2000 ? "+ ((a>3)||(c<2000)) ); // true System.out.println("a > 80 or c > 2000 ? "+ ((a>80)||(c>2000)) ); // false System.out.println("a == 17 and b == J ? "+((a>17)&&(b==J)) ); // false System.out.println("a == 17 and b == K ? "+((a==17)&&(b==K))); // false System.out.println("a >= 17 and b <= J ? "+((a<=17)&&(b<=J))); // true // Notem que em alguns casos foi necessrio o uso de vrios nveis de parnteses // para evitar erros de sintaxe. O uso de parnteses para agrupar expresses booleanas // sempre aconselhvel. } // fim do mtodo main } // fim da classe DemoCombinacoes

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

8.3

A estrutura de deciso if/else

A estrutura de deciso mais simples a if, que permite execuo de um comando ou bloco de comandos somente se a o operador ou expresso lgica avaliada tiver true como resultado. A forma de uso da estrutura de deciso if if (operador_lgico) comando_ou_bloco;, onde o operador_lgico pode ser qualquer operao, varivel, constante ou combinao como as mostradas na seo 8.2 e comando_ou_bloco pode ser um nico comando, que deve ser terminado com um ponto-e-vrgula, ou um bloco de comandos, que deve ser cercado por chaves ({ e }) e no precisa ser terminado com um ponto-evrgula. A estrutura de deciso if pode ser seguida opcionalmente da palavra-chave else. A palavra-chave else deve ser seguida por um comando ou bloco de comandos da mesma forma que a palavra-chave if. O comando ou bloco de comandos associados ao else ser executado caso o operador lgico avaliado pelo comando if tenha resultado false. Em outras palavras, a execuo dos comandos e/ou blocos em uma estrutura if-else mutuamente exclusiva. A listagem 8.3 mostra uma classe executvel que demonstra o uso das estruturas if e else. Listagem 8.3: Um programa que demonstra as estruturas if e else
1 2 3 4 5 6 7 8 9 10 11 12

/* Esta classe demonstra os comandos if/else. O preo de uma entrada de cinema calculado da seguinte maneira: - Se a pessoa tem menos de 14 ou mais de 65 anos, paga meia entrada (4 reais), caso contrrio paga 8 reais. - Se o dia da semana for tera, quarta ou quinta, todos podem pagar meia entrada. Para executar este programa voc precisar da classe Keyboard. */ class Demoif { /* Este mtodo garante a execuo da classe */ public static void main(String argumentos[]) { short idade; // a idade da pessoa Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

81
byte diasemana; // o dia da semana, de 1 a 7 float preo; // o preo a ser pago pelo ingresso // Peo para que digite a idade System.out.print("Entre a sua idade:"); idade = Keyboard.readShort(); // Peo para que digite o dia da semana System.out.print("Entre o dia da semana (1=domingo, 2=segunda... 6=sexta, 7=sbado:"); diasemana = Keyboard.readByte(); // Se o dia da semana entre 3 e 5, todo mundo paga meia if ((diasemana >= 3) && (diasemana <= 5)) preo = 4; else // ento outro dia da semana, vamos ver de acordo com a idade { if ((idade <= 14) || (idade >= 65)) preo = 4; else preo = 8; } // fim do else do dia da semana System.out.println("Voc deve pagar "+preo+" reais"); } // fim do mtodo main } // fim da classe Demoif

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

possvel e comum termos blocos de if e else aninhados, ou seja, uns dentro de outros, como mostrado na listagem 8.3. Neste caso, o if da linha 26 s ser executado caso o if da linha 22 no for executado (fazendo com que o bloco de comandos associados ao else da linha 24 seja executado). Quando blocos de if e else aninhados so usados, necessrio tomar cuidado com que bloco else ser associado aos blocos if - a regra bsica que blocos else so associados aos blocos if mais prximos que no estejam delimitados pelas chaves ({ e }). O programa na listagem 8.4 demonstra esta regra.

Listagem 8.4: Um programa que demonstra aninhamento de if e else


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

/* Uma classe que demonstra o aninhamento de blocos if/else */ class DemoIfElse { /* O mtodo main permite a execuo de uma classe */ public static void main(String args[]) { boolean A=false,B=false; // Declaramos duas variveis do tipo booleano /* Neste bloco de if/else, o else est associado ao if mais prximo, que o if (B) */ if (A) if (B) System.out.println("A e B so verdadeiros.") else System.out.println("A verdadeiro mas B falso"); /* Neste bloco de if/else, o else est associado ao if mais prximo, que o if (A), porque o if (B) pertence a um bloco de comandos */ if (A) { if (B) System.out.println("A e B so verdadeiros."); } else System.out.println("A no verdadeiro"); } // fim do mtodo main } // fim da classe DemoIfElse

Tambm possvel o encadeamento de if e else em cascata, aonde a cada else se segue um outro if. Neste tipo de construo de comandos, a primeira condio avaliada, e somente caso o resultado da avaliao seja false a segunda condio ser avaliada, e assim sucessivamente. O uso de if e else em cascata mostrado no mtodo calculaPreo() da classe AparelhoDeTV na listagem 8.5.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

82

Listagem 8.5: Uma classe que usa estruturas if e else cascateadas


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

/* Uma classe que representa um aparelho de TV com algumas caractersticas */ class AparelhoDeTV { /* Algumas variveis relativas uma TV */ private byte polegadas; // O nmero de polegadas da TV private boolean SAP; // A TV tem Second Audio Program ? private boolean PIP; // A TV tem Picture in Picture ? /* O construtor que inicializar os valores */ AparelhoDeTV(byte p,boolean sap,boolean pip) { polegadas = p; SAP = sap; PIP = pip; } /* O mtodo toString que permite a impresso formatada dos valores */ public String toString() { String resultado = "Televiso de "+polegadas+" polegadas"; if (SAP) resultado = resultado + " com SAP"; if (PIP) resultado = resultado + " com PIP"; return resultado; } /* O mtodo calculaPreo calcula o preo de uma TV */ float calculaPreo() { float preo = 0; // necessria a inicializao desta varivel // calcula um preo baseado no nmero de polegadas if (polegadas == 14) preo = 320; else if (polegadas == 21) preo = 660; else if (polegadas == 29) preo = 810; else if (polegadas == 34) preo = 1290; if (SAP) preo = preo + 120; // 120 reais adicionais pelo SAP if (PIP) preo = preo + 200; // 200 reais adicionais pelo PIP return preo; } } // fim da classe AparelhoDeTV

8.4

A estrutura de deciso switch

possvel fazermos a avaliao de vrios casos possveis usando os encadeamento dos comandos if e else, mas em casos onde existem muitas opes o cdigo pode se tornar complexo e pouco legvel. A estrutura de deciso switch permite que uma expresso do tipo inteiro seja avaliada e a partir do valor desta expresso, um de vrios blocos de comandos seja executado, emulando de forma diferente a estrutura de if e else encadeados, mas com algumas diferenas bsicas: A estrutura switch deve ser acompanhada de uma ou mais clusulas case, que identicaro o bloco de comandos a ser executado caso o nmero que acompanha o case seja o resultado da avaliao do switch. A forma geral da estrutura switch mostrada no programa na listagem 8.6. No podemos ter duas clusulas case com valores iguais, mas no necessrio que os valores das clusulas sejam contguos ou mesmo que estejam na ordem numrica. Ao nal de cada bloco de comando em cada clusula case devemos usar o comando break para que este transra a execuo do programa para o m do switch. Isto deve ser feito porque o comando switch simplesmente transfere a execuo do programa para a linha que contm o case correspondente, e continua o processamento a partir de l. Sem os comandos break, todos os blocos de
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

83 comandos subsequentes seriam executados, mesmo se o valor do case for diferente do resultado do switch. A estrutura switch avalia dados do tipo int, signicando que dados dos tipos byte, char e short sero convertidos automaticamente para int. O tipo long pode ser usado com converso explcita (cast), mas por causa dos possveis erros de arredondamento seu uso no aconselhvel. A estrutura switch no pode avaliar dados de outros tipos de dados, como boolean, nem instncias de outras classes, como String.

Listagem 8.6: Trecho de programa que demonstra a estrutura switch


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

/* Este somente um trecho de programa para demonstrao switch(valor) { // o bloco switch comea aqui case 1: { // cdigo a ser executado caso a varivel valor valha break; // vai para o fim do bloco switch } case 2: { // cdigo a ser executado caso a varivel valor valha break; // vai para o fim do bloco switch } case 3: { // cdigo a ser executado caso a varivel valor valha break; // vai para o fim do bloco switch } default: { // cdigo a ser executado caso a varivel valor valha // que no seja os previstos acima } } // o bloco switch termina aqui

da estrutura switch */

qualquer valor

O uso principal da estrutura switch o encaminhamento da execuo do programa ou classe a um ponto. Uma diferena essencial da estrutura switch para if e else encadeados que a expresso que determinar que trechos do programa sero executadas avaliada s uma vez (no caso do switch), enquanto que para cada if encadeado uma expresso ser avaliada. A classe na listagem 8.7 contm um mtodo main que demostra um uso do comando switch.

Listagem 8.7: Um programa que demonstra a estrutura switch


1 2 3 4 5 6 7 8 9 10 11 12 13

/* Esta classe demonstra os comandos switch/case/default. O usurio deve entrar um cdigo que ser avaliado pelo comand switch. Para executar este programa voc precisar da classe Keyboard. */ class DemoSwitch { public static void main(String argumentos[]) { System.out.println("Enter um cdigo de disciplina:"); System.out.println("1. Matemtica:"); System.out.println("2. Fsica:"); System.out.println("3. Biologia:"); byte entrada = Keyboard.readByte(); switch(entrada) Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

84
{ case 1: { System.out.println("Voc break; } // fim do case 1 case 2: { System.out.println("Voc break; } // fim do case 2 case 3: { System.out.println("Voc break; } // fim do case 3 default: { System.out.println("Voc } // fim do default } // fim do switch } // fim do mtodo main } // fim da classe DemoSwitch

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

escolheu Matemtica.");

escolheu Fsica.");

escolheu Biologia.");

no escolheu nenhuma das disciplinas.");

Assim como a estrutura de comandos if, a estrutura switch pode ser usada dentro de mtodos de classes que implementam modelos, como mostrado no mtodo toString() da classe na listagem 8.8. Listagem 8.8: Uma classe que usa a estrutura switch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

/* Esta classe representa os dados de um aluno de forma simples */ class Aluno { // Algumas variveis para representar os dados do aluno private String nome; private short curso; // curso ser representado por um valor numrico /* O construtor, que inicializar os dados */ Aluno(String n,short c) { nome = n; curso = c; } /* O mtodo que formata os dados e os retorna em uma String */ public String toString() { String dados = ""; // no incio ela est vazia dados = dados + "Dados do aluno "+nome+"\n"; // concatena o nome // Ao invs de simplesmente concatenar o cdigo numrico do curso vamos // concatenar o nome do curso, que ser decidido a partir do cdigo switch(curso) { case 23: // cdigo para Engenharia Civil { dados = dados + "curso: Engenharia Civil\n"; break; } case 27: // cdigo para Arquitetura { dados = dados + "curso: Arquitetura\n"; break; } case 34: // cdigo para Cincia da Computao { dados = dados + "curso: Cincia da Computao\n"; break; Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

85
} case 39: // cdigo para Engenharia da Computao { dados = dados + "curso: Engenharia da Computao\n"; break; } case 42: // cdigo para Biologia { dados = dados + "curso: Biologia\n"; break; } case 51: // cdigo para Cincias Contbeis { dados = dados + "curso: Cincias Contbeis\n"; break; } default: // se no foi nenhum dos acima... { dados = dados + "curso no reconhecido !\n"; } } // fim do switch return dados; // retorna os valores da classe, formatados } // fim do mtodo toString } // fim da classe Aluno

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

8.5

Introduo s estruturas de repetio

As estruturas de controle if/else e switch permitem que parte de um programa ou mtodo sejam executadas dependendo de uma condio, mas de maneira genrica elas somente mudam o uxo do programa de um ponto para outro, no servindo para que trechos de programas ou mtodos sejam repetidos. A capacidade de repetio de trechos de programas ou mtodos uma das caractersticas de linguagens de programao que tornam os computadores mais teis: dada uma tarefa ou rotina, esta pode ser repetida inmeras vezes de forma automtica. Considere a tarefa de somar muitos valores ou procurar palavras em um texto longo ou pesquisar vrios registros de um banco de dados - tarefas tediosas se feitas por um ser humano, mas que podem ser facilmente implementadas e repetidas por um computador. As estruturas de repetio em Java so chamadas coletivamente de laos. Em suas formas bsicas elas consideram uma condio que determine se o lao deve ser executado ou no, e executam um ou mais comandos enquanto a condio especicada for vlida ou verdadeira. Uma tarefa inerente execuo de laos em Java a modicao de variveis que controlam a execuo dos laos (chamadas variveis de controle). Frequentemente teremos que alterar o valor de uma varivel atravs da soma, subtrao, multiplicao ou diviso desta mesma varivel com outro valor. Java tem alguns operadores que podem ser usados em variveis dos tipos inteiros e de ponto utuante que so descritas na lista abaixo.

++ Este operador, quando aplicado uma varivel dos tipos inteiros ou ponto utuante, incrementar o valor da varivel em um. Exemplo: ao nal do cdigo double a = 12.5; a++; a varivel a valer 13.5. O comando a++ poderia ser escrito como a = a + 1. -- Este operador, quando aplicado uma varivel, decrementar o valor da varivel em um. Exemplo: ao nal do cdigo int z = 1982; z--; a varivel z valer 1981. O comando z-- poderia ser escrito como z = z - 1.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

86 += Este operador, quando aplicado uma varivel, incrementar o valor da varivel usando o argumento para o incremento. Exemplo: ao nal do cdigo short val = 800; val += 200; a varivel val valer 1000. O comando val += 200 poderia ser escrito como val = val + 200. -= Este operador, quando aplicado uma varivel, decrementar o valor da varivel usando o argumento para o incremento. Exemplo: ao nal do cdigo float med = 49.5f; med -= 11.04; a varivel med valer 38.46. O comando med -= 11.04 poderia ser escrito como med = med 11.04. *= Este operador, quando aplicado uma varivel, multiplicar o valor presente da varivel pelo argumento passado, colocando o resultado na varivel. Exemplo: ao nal do cdigo double j = 732.5; j *= 4; a varivel j valer 2930. O comando j *= 4 poderia ser escrito como j = j * 4. /= Este operador, quando aplicado uma varivel, dividir o valor presente da varivel pelo argumento passado, colocando o resultado na varivel. Exemplo: ao nal do cdigo int o = 2000; o /= 12; a varivel o valer 166 (note que a diviso foi feita com nmeros inteiros). O comando o /= 12 poderia ser escrito como o = o / 12.

8.6

A estrutura de repetio while

Uma das estruturas que permite repetio em programas e classes em Java a estrutura while, que tem como forma bsica while(condio) comando_ou_bloco;. A condio deve ser um valor ou expresso booleana, e o comando_ou_bloco associado ao lao pode ser um nico comando, que deve ser terminado com um ponto-e-vrgula, ou um bloco de comandos, que deve ser cercado por chaves ({ e }) e no precisa ser terminado com um ponto-e-vrgula. O bloco ou comando associado ao lao ser repetido enquanto o valor booleano for verdadeiro. Se a condio for inicialmente false, o comando ou bloco de comandos associado no ser executado nem mesmo uma vez. Um exemplo de lao while mostrado na classe DemoWhile, na listagem 8.9. Neste programa, um lao while ser repetido at que um valor maior do que 1000 seja entrado via teclado.

Listagem 8.9: Uma classe com mtodo main que usa o lao while
1 2 3 4 5 6 7 8 9 10 11 12 13

/* Uma classe com mtodo main que demonstra a estrutura de controle while */ class DemoWhile { public static void main(String par[]) { int valor = 0; // um valor para entrada e comparao - deve ser inicializado ! while(valor < 1000) // enquanto o valor for menor que mil { System.out.print("Entre um valor maior ou igual a 1000:"); valor = Keyboard.readInt(); // lemos o valor do teclado } // fim do while } // fim do mtodo main } // fim da classe DemoWhile

Um exemplo mais complexo do uso do lao while mostrado na classe Escolha, na listagem 8.10. Esta classe permite que uma faixa de valores do tipo short seja especicada e um valor que deve ser maior ou igual ao limite inferior e menor ou igual ao limite superior seja entrado. Enquanto o valor entrado no mtodo escolhe() estiver fora da faixa o programa perguntar novamente. O controle do lao feito por uma varivel booleana, que somente valer true quando as condies forem satisfeitas.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

87

Listagem 8.10: A classe Escolha


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

/* Uma classe que permite a escolha de nmeros em uma faixa */ class Escolha { private short incio,fim; // a faixa de valores das quais poderemos escolher /* O construtor (que receber os valores que definem a faixa da escolha */ Escolha(short i,short f) { incio = i; fim = f; } /* Um mtodo que permite a escolha de um valor, via teclado, dentro da faixa dos valores especificados. */ short escolhe() { short valorEntrado = 0; // devemos inicializar esta varivel com qualquer valor boolean valorOK = false; // inicialmente consideraremos que o valor entrado no est OK while(!valorOK) // enquanto o valor entrado no estiver OK { System.out.print("Entre um valor entre "+incio+" e "+fim+":"); valorEntrado = Keyboard.readShort(); if ((valorEntrado >= incio) && (valorEntrado <= fim)) // se estiver na faixa de valores valorOK = true; // o valor ser reconhecido como OK } return valorEntrado; // retornamos o valor entrado } // fim do mtodo escolhe } // fim da classe Escolha

O lao while pode ser usado para tarefas que envolvem contagem, como mostrado no programa da listagem 8.11. Neste caso, importante que veriquemos os valores iniciais das variveis de controle, a sua modicao e a condio de continuao dos laos, para evitar laos que no so executados ou que so executados innitamente. Em especial, devemos ter cuidado com o uso de laos contadores que comparem valores para ver se so exatamente iguais ou diferentes de um valor: possvel que esta comparao no retorne true.

Listagem 8.11: Exemplos de uso do lao while como contador


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/* Uma classe que demonstra o uso do lao while como contador */ class Contador { public static void main(String argumentos[]) { int valor; // uma varivel que ser usada para contagem // contaremos de 1 at 20 valor = 1; while(valor <= 20) { System.out.print(valor+" "); // imprimimos o valor do contador valor++; } System.out.println(); // quebra de linha // contaremos de 100 at 200, de 5 em 5 valor = 100; while(valor <= 200) { System.out.print(valor+" "); // imprimimos o valor do contador valor += 5; } System.out.println(); // quebra de linha

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

88
// contaremos de 1200 at 0, de 40 em 40 (regressivamente) valor = 1200; while(valor >= 0) { System.out.print(valor+" "); // imprimimos o valor do contador valor -= 40; } System.out.println(); // quebra de linha // contaremos de 1 at 100000, multiplicando o contador por dois a cada iterao valor = 1; while(valor <= 100000) { System.out.print(valor+" "); // imprimimos o valor do contador valor *= 2; } System.out.println(); // quebra de linha } // fim do mtodo main } // fim da classe Contador

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Podemos notar, na listagem 8.11, que o quarto lao (linhas 32 a 38) terminar quando a varivel valor valer 131072, mas somente os valores menores do que 100000 sero impressos.

8.7 A estrutura de repetio do-while


Outra das estruturas que permitem repetio em programas e classes em Java a estrutura do-while, cuja como forma bsica do comando_ou_bloco while(condio);. A condio deve ser um valor ou expresso booleana, e o comando_ou_bloco associado ao lao pode ser um nico comando, que deve ser terminado com um ponto-e-vrgula, ou um bloco de comandos, que deve ser cercado por chaves ({ e }) e no precisa ser terminado com um ponto-e-vrgula. A clusula while deve sempre ser seguida de um ponto-e-vrgula. O bloco ou comando associado ao lao ser repetido enquanto o valor booleano for verdadeiro. A diferena bsica entre o lao while e o do-while que o bloco de comandos associado ao lao do-while ser executado ao menos uma vez antes que a condio seja vericada, enquanto que o bloco de comandos associado ao lao while poder nem ser executado dependendo da primeira avaliao da condio. Um exemplo de lao do-while mostrado na classe DemoDoWhile, na listagem 8.12. A funo deste programa a mesma da classe DemoWhile, na listagem 8.9. Listagem 8.12: Uma classe com mtodo main que usa o lao do-while
1 2 3 4 5 6 7 8 9 10 11 12 13

/* Uma classe com mtodo main que demonstra a estrutura de controle do-while */ class DemoDoWhile { public static void main(String args[]) { int valor; // desta vez no necessria a inicializao do { System.out.print("Entre um valor maior ou igual a 1000:"); valor = Keyboard.readInt(); // lemos o valor do teclado } while(valor < 1000); } // fim do mtodo main } // fim da classe DemoDoWhile

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

89 Como outro exemplo, a listagem 8.13 mostra a classe Agenda que usa o lao do-while em seu construtor para garantir que um valor no vazio ser passado para algumas variveis.

Listagem 8.13: Uma classe cujo construtor usa o lao do-while


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

/* Uma classe para guardar o nome e e-mail de uma pessoa. */ class Agenda { private String nome; // varivel para guardar o nome private String email; // varivel para guardar o e-mail /* Este o construtor vazio. Caso seja chamado, este construtor ir perguntar o nome e e-mail da classe via teclado, e no aceitar respostas em branco. */ Agenda() { do // pergunta o nome at que seja dado um que no seja vazio { System.out.print("Entre o nome:"); nome = Keyboard.readString(); } while(nome.equals("")); do // pergunta o e-mail at que seja dado um que no seja vazio { System.out.print("Entre o e-mail:"); email = Keyboard.readString(); } while(email.equals("")); } /* Este construtor receber argumentos passados e inicializar as variveis internas com eles */ Agenda(String n,String e) { nome = n; email = e; } /* Mtodo que formata o contedo da classe e retorna como uma String */ public String toString() { return "Nome "+nome+" e-mail "+email+"\n"; } } // fim da classe Agenda

Vemos nas linhas 14 e 19 da listagem 8.13 o mtodo equals, que compara Strings - o operador == no pode ser usado com Strings. Mais detalhes sobre os mtodos de comparao de Strings so mostrados na seo 9.3.

8.8

A estrutura de repetio for

Muitas vezes usaremos estruturas de laos para contagem ou repetio com um nmero denido de passos. Embora os laos while e do-while possam ser usados nestes casos, temos que tomar cuidado com a inicializao e atualizao dos valores das variveis de controle e com as condies de parada. A estrutura de repetio for facilita a criao de laos com nalidade de contagem. Sua forma bsica for(inicializao; verificao_de_condies; atualizao) comando_ou_bloco;. A inicializao ser executada uma vez antes do incio do lao, a vericao de condies a cada vez que o comando ou bloco for executado e a atualizao depois de cada execuo do comando ou bloco. O comando_ou_bloco associado ao lao pode ser um nico comando, que deve ser terminado com um ponto-e-vrgula, ou um bloco de comandos, que deve ser cercado por chaves ({ e }) O bloco ou comando
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

90 associado ao lao for ser repetido enquanto a condio for verdadeira. possvel termos mais de um comando na inicializao ou na atualizao, se estes forem separados por vrgulas. O uso do lao for como um contador simples tem a forma for(varivel = valor_inicial; varivel < valor_final; varivel++) comando_ou_bloco;. Um exemplo de lao for mostrado na classe DemoFor, na listagem 8.14. O programa mostrado desenhar um retngulo composto de asteriscos no terminal, com 32 asteriscos de lado e 8 de altura.

Listagem 8.14: Uma classe com mtodo main que usa o lao for
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

/* Uma classe com mtodo main que demonstra a estrutura de controle for */ class DemoFor { public static void main(String args[]) { byte largura = 32; byte altura = 8; for(int a=0;a<altura;a++) { for(int l=0;l<largura;l++) { System.out.print("*"); } // fim do lao for com varivel de controle l System.out.println(); } // fim do lao for com varivel de controle a } // fim do mtodo main } // fim da classe DemoFor

Para exemplicar outro uso do lao for criaremos uma classe com mtodos estticos. A listagem 8.15 mostra a classe ProbabilidadeBasica, que usa as frmulas comb = x!/(y!(x y)!) para calcular o nmero comb de combinaes que se pode ter tendo x valores e tomando-se y valores de cada vez e perm = x!/(xy)! para calcular o nmero de permutaes perm que se pode ter tendo x valores e tomandose y valores de cada vez. A classe tambm implementa o clculo do fatorial, necessrio s equaes, usando um lao for.

Listagem 8.15: A classe ProbabilidadeBasica


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

/* A classe ProbabilidadeBasica contm alguns mtodos estticos para clculos bsicos de probabilidades */ class ProbabilidadeBasica { /* Mtodo que calcula e retorna o fatorial de um valor */ static double fatorial(int val) { double f = 1; for(int i=1;i<=val;i++) f *= i; return f; } /* Mtodo que calcula e retorna o nmero de combinaes usando dois valores */ static double combinaes(int quantos,int tomados) { return fatorial(quantos)/(fatorial(tomados)*fatorial(quantos-tomados)); } /* Mtodo que calcula e retorna o nmero de permutaes usando dois valores */ static double permutaes(int quantos,int tomados) {

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

91
return fatorial(quantos)/fatorial(quantos-tomados); } } // fim da classe ProbabilidadeBasica

20 21 22

8.9

Os comandos break e continue

possvel interrompermos o uxo normal de laos while, do-while e for usando os comandos break e continue. Estes comandos, geralmente executados atravs de um if dentro dos laos, interrompem o lao, mudando a execuo do programa ou mtodo para o nal do lao (no caso do comando break) ou para a prxima iterao do lao (no caso do comando continue). A classe Agenda, mostrada na listagem 8.16, modica o comportamento do construtor mostrado na listagem 8.13: este repetir para sempre a leitura de dados atravs do comando while(true), e s sair deste lao innito se algo diferente de uma String em branco for digitada.

Listagem 8.16: Uma classe cujo construtor usa o lao while e o comando break
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

/* Uma classe para guardar o nome e e-mail de uma pessoa. */ class Agenda { private String nome; // varivel para guardar o nome private String email; // varivel para guardar o e-mail /* Este o construtor vazio. Caso seja chamado, este construtor ir perguntar o nome e e-mail da classe via teclado, e no aceitar respostas em branco. */ Agenda() { while(true) // pergunta "para sempre" o nome at que seja dado um que no seja vazio { System.out.print("Entre o nome:"); nome = Keyboard.readString(); if (!nome.equals("")) break; // se o nome no for igual a "" sai do lao } while(true) // pergunta "para sempre" o e-mail at que seja dado um que no seja vazio { System.out.print("Entre o e-mail:"); email = Keyboard.readString(); if (!email.equals("")) break; // se o e-mail no for igual a "" sai do lao } } /* Mtodo que formata o contedo da classe e retorna como uma String */ public String toString() { return "Nome "+nome+" e-mail "+email+"\n"; } } // fim da classe Agenda

O comando continue pode servir para que somente partes de um lao sejam executadas, como mostrado no exemplo da listagem 8.17. Este programa ler cinco valores do teclado, mas somente calcular o fatorial dos valores positivos.

Listagem 8.17: Exemplo de uso do comando continue


1 2

/* Uma classe com mtodo main que demonstra o comando continue */ class DemoContinue Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

92
{ public static void main(String args[]) { int valor; for(int contador=0;contador<5;contador++) // o valor ser perguntado cinco vezes... { valor = Keyboard.readInt(); if (valor < 0) continue; // mas se for menor que zero o seu fatorial no ser calculado System.out.println("O fatorial de "+valor+" "+ProbabilidadeBasica.fatorial(valor)); } } // fim do mtodo main } // fim da classe DemoContinue

3 4 5 6 7 8 9 10 11 12 13 14

8.10

Exerccios do captulo 8

Exerccio 8.1: Modique o programa na listagem 8.3 para que este verique tambm que horas so, e cobre somente meia entrada caso sejam antes das 4 horas da tarde. Exerccio 8.2: O programa mostrado na listagem 8.3 no muito inteligente - se a idade for maior do que 65 ou menor que 14, no existe necessidade de se perguntar o dia da semana, e se o dia da semana for tera, quarta ou quinta, no existe necessidade de se perguntar a idade. Para tornar o programa mais inteligente ser necessrio modicar a ordem das decises e colocar blocos if dentro dos blocos de comandos de outros if. Dica: tente resolver este exerccio usando o exerccio 8.1 como base. Note que existe mais de uma soluo para este problema ! Exerccio 8.3: O que acontecer se retirarmos todos os comandos else do mtodo calculaPreo() da classe AparelhoDeTV mostrada na listagem 8.5 ? Existe alguma vantagem em faz-lo ? Exerccio 8.4: Reescreva o construtor da classe Aluno para que este receba o curso como uma String e calcule, atravs de comparaes, o valor da varivel curso (por exemplo, se o valor passado for Engenharia da Computao, o valor do curso ser 39). Quais as vantagens e desvantagens desta abordagem ? Use a listagem 8.8 como referncia. Exerccio 8.5: Reescreva o mtodo calculaPreo da classe AparelhoDeTV (listagem 8.5) para que um switch seja usado ao invs de um bloco de ifs encadeados. Exerccio 8.6: Reescreva o mtodo main da classe DemoSwitch (listagem 8.7) para que um bloco de ifs encadeados seja usado ao invs de um switch. Exerccio 8.7: Reescreva o mtodo toString da classe Aluno (listagem 8.8) para que um bloco de ifs encadeados seja usado ao invs de um switch.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

93

Exerccio 8.8: Modique o mtodo retira da classe ContaBancaria (veja listagem 3.8) para que este somente efetue a retirada se o valor da retirada for menor ou igual ao saldo corrente. Exerccio 8.9: Escreva um programa em Java que conte de um at cem usando um bloco while. Exerccio 8.10: Escreva um programa em Java que conte de um at cem usando um bloco do-while. Exerccio 8.11: O que aconteceria se a varivel valor valesse inicialmente 2000, na classe DemoWhile (listagem 8.9) ? Exerccio 8.12: O programa abaixo poder ser compilado mas seus laos contm erros de lgica. Localize e explique os erros.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

class ContadorComErros { public static void main(String argumentos[]) { int valor; valor = 100; while(valor <= 0) { System.out.print(valor+" "); valor++; } System.out.println(); valor = 100; while(valor >= 100) { System.out.print(valor+" "); valor += 5; } valor = 997; while(valor != 1000) { System.out.print(valor+" "); valor += 2; } System.out.println(valor); } }

Exerccio 8.13: Crie uma classe Histograma5 que contenha 5 valores inteiros, passados via um mtodo ou construtor. Esta classe deve ter um mtodo imprime que recebe um caracter como argumento, e imprime histogramas baseados nos cinco valores e caracter passado. Se para uma instncia desta classe os valores 7, 2, 10, 3 e 12 fossem passados, e o caracter * fosse passado para o mtodo imprime, este deveria imprimir o histograma como mostrado abaixo: ******* ** ********** *** ************

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

94

Exerccio 8.14: Escreva um programa em Java (com o mtodo main) que crie e use instncias da classe Escolha (listagem 8.10). Exerccio 8.15: Modique a classe Escolha (listagem 8.10) para que um lao do-while seja usado ao invs de um lao while no mtodo escolhe. Exerccio 8.16: Escreva uma classe Tabuada com um mtodo esttico que imprima a tabuada de um valor passado para este mtodo como argumento. Use a estrutura de repetio mais apropriada. Exerccio 8.17: Escreva uma classe TesteTabuada que imprima as tabuadas de um a dez, usando o mtodo Tabuada (exerccio 8.16). Exerccio 8.18: O valor de xy pode ser calculado como sendo x multiplicado por si mesmo y vezes (se y for inteiro). Escreva um programa em Java que leia os valores de x e y do teclado e calcule xy . Exerccio 8.19: Escreva um programa em Java com um lao que leia uma String do teclado e somente saia do lao se a String for igual uma palavra-chave qualquer (que deve ser declarada dentro do programa). Use o mtodo equals da classe String para fazer a comparao (veja linhas 14 e 19 da listagem 8.13). Exerccio 8.20: Escreva um programa completo em Java que imprima todos os resultados da soma X + Y onde X e Y variam de um a vinte e a soma seja igual 21. Dica: dois laos podem ser usados, e o comando continue pode ltrar os resultados indesejados. Exerccio 8.21: Escreva um programa em Java que aceite dois valores inteiros via teclado: um multiplicador e um valor mximo, e mostre todos os mltiplos do multiplicador que sejam menores do que o valor mximo. Exerccio 8.22: Novo ! Escreva uma classe Loteria que tenha mtodos estticos para imprimir os cartes da Mega Sena e Lotomania (somente os nmeros de um carto em branco, respeitando o nmero de linhas e colunas nos cartes em papel). Exerccio 8.23: Instncias da classe Aluno (mostrada na listagem 8.8), quando inicializadas, pedem uma String para o nome e um short para o curso. possvel criar uma instncia desta classe que receba um valor errado para o curso - qualquer valor diferente de 23, 27, 34, 39, 42 ou 51 no ser reconhecido pelo mtodo toString() como vlido. Reescreva o construtor da classe para que se o valor passado for invlido, o construtor imprima uma mensagem de erro e considere o curso como sendo zero.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

95

Exerccio 8.24: Crie a classe ContaBancariaEspecial que herda da classe ContaBancaria (listagem 3.8). A classe ContaBancariaEspecial deve conter um valor booleano Especial, que indicar se a conta especial ou no. Se a conta for especial, o cliente pode retirar dinheiro da conta at car com 1000 reais de saldo negativo. Altere o mtodo retira para permitir isto. Exerccio 8.25: Um problema potencial da classe Escolha (listagem 8.10) que seu construtor no verica se o valor inicial menor do que o nal - se uma instncia for construda com os valores(1000,-1000), o mtodo escolhe nunca terminar ! Reescreva o construtor de forma que se o valor inicial da faixa for maior do que o nal, o construtor trocar os valores, fazendo com que o nal vire o inicial e vice-versa. Exerccio 8.26: Escreva um programa em Java que simule uma calculadora bem simples. Este programa deve ler dois valores de ponto utuante do teclado, escolher uma operao (+, -, * ou /), calcular a operao e imprimir o resultado. O programa deve considerar divises por zero como sendo erros, e imprimir uma mensagem adequada. Exerccio 8.27: Reescreva o programa do exerccio 8.19 de forma que o usurio do programa somente tenha trs tentativas para entrar a senha. Se em nenhuma das trs tentativas o usurio acertar a senha, o programa mostra uma mensagem de erro correspondente. Use um lao para isto. Exerccio 8.28: Crie um mtodo Igual() na classe Ponto2D (listagem 5.8) que receba, como argumento, uma instncia da prpria classe Ponto2D e retorne um valor booleano que ser true se os valores x e y da instncia presente e da passada forem iguais, e false se forem diferentes. Exerccio 8.29: Usando a classe Retangulo criada no exerccio 3.31, crie nela um mtodo contmPonto() que recebe uma instncia da classe Ponto2D (listagem 5.8) e retorna um valor booleano que ser true se a instncia da classe Ponto2D estiver dentro do retngulo. Exerccio 8.30: Usando um programa em Java, mostre que a sequncia innita Exerccio 8.31: Usando um programa em Java, mostre que a sequncia innita Exerccio 8.32: Usando um programa em Java, mostre que a sequncia innita

1 12

1 1 1 1 + 22 + 32 + 42 + 52 + equivale a

2 6.

1 14

1 1 1 1 + 24 + 34 + 44 + 54 + equivale a

4 90 .

1 12

1 1 1 1 + 32 + 52 + 72 + 92 + equivale a

2 8.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

96

Exerccio 8.33: Usando um programa em Java, mostre que a sequncia innita 1/2. Exerccio 8.34: Usando um programa em Java, mostre que a sequncia innita 3/4.

1 13

1 1 1 + 35 + 57 + 79 + equivale a

1 13

1 1 1 + 24 + 35 + 46 + equivale a

Exerccio 8.35: Usando um programa em Java, mostre que a sequncia innita 1 1 + 1 1 + 1 1 + equivale a ln(2) 1 2 3 4 5 6 (0.6931471805599453). Exerccio 8.36: Novo ! Escreva um programa em Java que imprima a srie de Fibonacci at o N-simo elemento. A srie de Fibonacci dada por 1, 1, 2, 3, 5, 8, 11, onde cada valor dado pela soma dos dois valores anteriores. O nmero de elementos pode ser lido do teclado. Exerccio 8.37: Escreva uma classe Lanchonete em Java que represente o menu de uma lanchonete. Crie o mtodo imprime() que imprima o menu desta lanchonete (com um nmero associado a cada pedido), e o mtodo seleciona() que pergunta ao usurio qual opo do menu ele/a deseja comprar (perguntando o nmero do pedido). Escreva tambm um programa que use uma instncia desta classe. Exerccio 8.38: Escreva uma classe RetanguloNaTela que represente retngulos que podem ser desenhados na tela (atravs de chamadas System.out.print e System.out.println, como na listagem 8.14). Os retngulos devem ter variveis para representar a largura e altura, o caracter que vai ser usado para desenhar a borda, o caracter de preenchimento e um valor booleano que diz se o retngulo vai ser preenchido ou no. A classe deve ter construtores e um mtodo desenha que desenhar o retngulo. Como exemplo, se uma instncia da classe com o tamanho 12x5 fosse criada com o caracter x para borda, o caracter . para preenchimento e o retngulo fosse preenchido, o resultado seria o mostrado abaixo: xxxxxxxxxxxx x..........x x..........x x..........x xxxxxxxxxxxx Exerccio 8.39: Crie um programa em Java que implemente um jogo simplicado de senha. Neste jogo, o usurio ter 10 chances para acertar o valor de um nmero inteiro entre 0 e 2000 atravs de tentativa e erro. A cada chance, o usurio deve entrar um valor pelo teclado, e o programa deve dizer se o valor entrado maior ou menor do que o valor secreto. O jogo termina quando as chances acabam (derrota) ou quando o usurio entra um valor igual ao valor secreto (vitria). Para simplicar, considere o valor secreto como sendo constante no programa.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

97

Exerccio 8.40: O valor de pode ser calculado pela srie innita 4 1 1 + 1 1 + 1 , e pode ser calculado usando 1 3 5 7 9 um lao e um if dentro do lao. Este lao no pode ser innito, devendo terminar depois de N iteraes. Escreva uma classe Matematica em Java que contenha o mtodo esttico calculaPi() que recebe um valor N como argumento e retorna o valor calculado de . Exerccio 8.41: O valor de tambm pode ser calculado pela srie innita 2 2 2 4 4 6 6 , e pode ser 1 3 3 5 5 7 calculado usando um lao e um if dentro do lao. Este lao no pode ser innito, devendo terminar depois de N iteraes. Escreva um mtodo esttico na classe Matematica (veja exerccio 8.40) chamado calculaPiDeOutraForma() que recebe um valor N como argumento e retorna o valor calculado de . Exerccio 8.42: 2 O valor ex (onde e a base dos logaritmos naturais) pode ser calculado pela srie innita 1 + x + x + 2! x3 x4 x5 3! + 4! + 5! + . Escreva um mtodo esttico na classe Matematica (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. O fatorial de um nmero pode ser calculado usando o mtodo fatorial na classe ProbabilidadeBasica (listagem 8.15). Veja tambm o exerccio 8.18. Exerccio 8.43: x2 x2 x2 O seno de um ngulo x pode ser calculado pela srie innita x (1 2 ) (1 42 ) (1 92 ) (1 Escreva um mtodo esttico na classe Matematica (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. O valor de pode ser obtido pelo mtodo calculaPi() criado no exerccio 8.40. Exerccio 8.44: 3 5 7 9 O seno de um ngulo x tambm pode ser calculado pela srie innita x x + x x + x . Escreva 3! 5! 7! 9! um mtodo esttico na classe Matematica (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. O fatorial de um nmero pode ser calculado usando o mtodo fatorial na classe ProbabilidadeBasica (listagem 8.15). Veja tambm o exerccio 8.18. Exerccio 8.45: 2 4x2 4x2 O coseno de um ngulo x pode ser calculado pela srie innita x (1 4x2 ) (1 92 ) (1 252 )
4x (1 492 ) . Escreva um mtodo esttico na classe Matematica (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. O valor de pode ser obtido pelo mtodo calculaPi() criado no exerccio 8.40.
2

x2 ) . 162

Exerccio 8.46: 2 4 6 8 O coseno de um ngulo x tambm pode ser calculado pela srie innita 1 x + x x + x . Escreva 2! 4! 6! 8! um mtodo esttico na classe Matematica (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. O fatorial de um nmero pode ser calculado usando o mtodo fatorial na classe ProbabilidadeBasica (listagem 8.15). Veja tambm o exerccio 8.18.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

98

Exerccio 8.47: x x x x x O valor sin(x) pode ser calculado pela srie innita cos( 2 ) cos( 4 ) cos( 8 ) cos( 16 ) cos( 32 ) . x Escreva um programa em Java que utilize os mtodos que calculam o seno e coseno na classe Matematica e verique esta igualdade. Exerccio 8.48: A tangente de um ngulo x pode ser calculado pela srie innita 8x 1 1 + 92 4x2 + 2521 2 + 4921 2 . Escreva um mtodo esttico na classe Matematica 2 4x2 4x 4x (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. O valor de pode ser obtido pelo mtodo calculaPi() criado no exerccio 8.40. Exerccio 8.49: A cotangente
1 x2 2 1 x2 42

de

um

ngulo
1 x2 162

pode

ser

calculado

pela

srie

innita

1 x

2x + + + + Escreva um mtodo esttico na classe Matematica (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. O valor de pode ser obtido pelo mtodo calculaPi() criado no exerccio 8.40. Exerccio 8.50: A secante de um ngulo x pode ser calculado pela srie innita 4 1 3 92 4x2 + 2525 2 4927 2 . Escreva um mtodo esttico na classe Matematica 2 4x2 4x 4x (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. O valor de pode ser obtido pelo mtodo calculaPi() criado no exerccio 8.40. Exerccio 8.51: A cosecante de

1 x2 92

um

ngulo

pode

ser

calculado

pela

srie

innita

1 x

1 1 1 1 2x x2 2 x2 42 x2 92 x2 162 . Escreva um mtodo esttico na classe Matematica (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. O valor de pode ser obtido pelo mtodo calculaPi() criado no exerccio 8.40.

Exerccio 8.52: O arcoseno de um ngulo x pode ser calculado pela srie innita x +
1357 x9 2468 9

1 x3 2 3

13 x5 24 5

135 x7 246 7

+ . Escreva um mtodo esttico na classe Matematica (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos. Exerccio 8.53: 1 O logaritmo natural de um nmero x pode ser calculado pela srie innita 2 { 1
1 5 x1 5 +1 x+1 7 x1 7 + } x+1

x1 x+1

+1 3

x1 3 + x+1

se x > 0. Escreva um mtodo esttico na classe Matematica (veja exerccio 8.40) que receba um valor inteiro N e um de ponto utuante x e calcule a srie considerando somente os N primeiros termos.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

99

Captulo 9 A Classe String


9.1 Introduo

Em diversos programas e classes at agora, usamos instncias da classe String para criar variveis capazes de representar cadeias de caracteres. Embora a classe String possa ser usada para criar instncias simples, por ser uma classe ela contm muitos mtodos teis. Nesta captulo veremos os mtodos mais teis da classe e exemplos de seu uso. Um conceito importante sobre Strings que instncias desta classe so compostas de zero ou mais caracteres (valores do tipo char) enleirados em ordem. Por exemplo, a String Java composta dos caracteres J, a, v e a. O comprimento da String dado pelo nmero de caracteres que esta contm: no exemplo anterior, a String contm quatro caracteres. O ndice de cada um dos caracteres indica a posio deste na String: este ndice pode valer entre zero e o valor do comprimento da String menos um. Por exemplo, a posio do caracter J na String Java zero, e do caracter v na mesma String dois. Os ndices na String podem estar entre zero e trs. Tentativas de acessar caracteres ou trechos de uma String usando ndices fora da faixa de valores vlidos (0 length() 1) causaro uma exceo chamada java.lang.StringIndexOutOfBoundsException (excees so categorias especiais de erros em Java, e sero vistas com detalhes no captulo 12). Nestes casos o programa em Java ser terminado imediatamente.

9.2 Mtodos bsicos da classe String


Um mtodo muito usado em Strings o mtodo length() que no recebe argumentos e retorna o nmero de caracteres naquela instncia da classe String, ou seja, o seu comprimento em caracteres. Alguns exemplos de uso deste mtodo so mostrados na listagem 9.1.

Listagem 9.1: Clculo do comprimento de uma String (mtodo length())


1 2 3 4 5 6 7 8 9

/* Esta classe demonstra o mtodo length para clculo do nmero de caracteres de Strings e comparao */ class DemoStrings { /* Este o mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos quatro Strings para comparao String s1 = "string curta"; Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

100
String s2 = "string pouco mais comprida"; String s3 = "string to mais comprida do que as outras acima\nque ocupa duas linhas!"; // Imprimimos o comprimento destas Strings System.out.println("Comprimento de "+s1+" "+s1.length()); // 12 System.out.println("Comprimento de "+s2+" "+s2.length()); // 26 System.out.println("Comprimento de "+s3+" "+s3.length()); // 70 // Pode ser usado tambm com "constantes" de Strings System.out.println(" Uma constante da classe String ".length()); // 36 } } // fim da classe DemoStrings

10 11 12 13 14 15 16 17 18 19

O mtodo length() conta o nmero total de caracteres na String, mesmo espaos, caracteres que no sejam letras e dgitos e caracteres de controle (caracteres usados para efeitos como quebra de linha, tabulao, etc.): a String 1\n2 contm trs caracteres. Os caracteres de controle mais usados so mostrados na tabela A.1 na seo A.2.1. Outro mtodo bsico da classe String o mtodo charAt(), que recebe um nico valor inteiro e retorna o caracter cujo ndice o argumento passado. Este mtodo retorna variveis do tipo char, e no instncias da classe String. Exemplos de uso do mtodo charAt() so mostrados no programa na listagem 9.2.

Listagem 9.2: Extrao de caracteres (mtodo charAt())


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

/* Esta classe demonstra usos do mtodo charAt() para extrao de caracteres individuais de Strings. */ class DemoStrings { /* Este o mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos uma longa String String s1 = "Mquinas tem menos problemas. Eu gostaria de ser uma mquina. "+ " -- Andy Warhol"; // Imprimimos o primeiro caracter da String System.out.println(s1.charAt(0)); // Imprimimos o ltimo caracter da String System.out.println(s1.charAt(s1.length()-1)); // Notem a subtrao de 1 do comprimento // Outros caracteres da String so: System.out.println(s1.charAt(9)); // t System.out.println(s1.charAt(45)); // s // Criamos uma String temporria para montagem com caracteres String temp; // E colocamos nela alguns caracteres da String longa. Note que a concatenao deve // comear com uma String vazia ("") para garantir que o resultado ser uma String temp = ""+s1.charAt(7)+s1.charAt(36)+s1.charAt(38)+ s1.charAt(39)+s1.charAt(15)+s1.charAt(33); System.out.println(temp); // imprimimos a String montada // Usamos um lao for para imprimir os caracteres da posio 19 a 27 for(int i=19;i<28;i++) System.out.print(s1.charAt(i)); System.out.println(); // Imprimimos uma quebra de linha /* As linhas abaixo causaro erros de execuo (excees) do tipo java.lang.StringIndexOutOfBoundsException ! */ char c = s1.charAt(-1); // Deve ser maior ou igual a zero char d = s1.charAt(2048); // Deve ser menor que o tamanho da String } } // fim da classe DemoStrings

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

101

9.3

Mtodos para comparao de Strings

Instncias da classe String no podem ser comparadas com o sinal de igual (=). Para comparao entre duas Strings, existem dois mtodos que podem ser usados: equals() e equalsIgnoreCase(). Ambos devem ser chamados como mtodos de uma instncia da classe String e recebem outra instncia da classe como argumento. Estes mtodos retornam um valor booleano, true se a String passada como argumento igual instncia da classe String cujo mtodo foi chamado, e false caso contrrio. A diferena entre os dois mtodos que o mtodo equals() considera que caracteres maisculos e minsculos que representam a mesma letra so diferentes, enquanto que o mtodo equalsIgnoreCase() no considera diferenas entre caracteres maisculos e minsculos. Resultados de comparao de Strings so mostrados no programa na listagem 9.3: Listagem 9.3: Comparaes entre Strings (mtodos equals() e equalsIgnoreCase())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

/* Esta classe demonstra os mtodos equals e equalsIgnoreCase de comparao de Strings */ class DemoStrings { /* Este o mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos trs Strings para comparao String s1 = "programao"; String s2 = "Programao"; String s3 = "PROGRAMAO"; System.out.println(s1+" igual a "+s1+"?:"+s1.equals(s1)); // true System.out.println(s1+" igual a "+s2+"?:"+s1.equals(s2)); // false System.out.println(s1+" igual a "+s3+"?:"+s1.equals(s3)); // false System.out.println(s1+" igual (sem considerar maisculas/minsculas) a "+s1+"?:"+ s1.equalsIgnoreCase(s1)); // true System.out.println(s1+" igual (sem considerar maisculas/minsculas) a "+s2+"?:"+ s1.equalsIgnoreCase(s2)); // true System.out.println(s1+" igual (sem considerar maisculas/minsculas) a "+s3+"?:"+ s1.equalsIgnoreCase(s3)); // true // Comparao pode ser feita com "constantes" de Strings ! boolean resultado; resultado = "PROGRAMAO".equals(s3); // true resultado = "uma String".equalsIgnoreCase("Uma String"); // true } } // fim da classe DemoStrings

Outra maneira de compararmos Strings usando o mtodo compareTo() que deve ser chamado a partir de uma instncia de uma String, recebe uma String como argumento e retorna um valor inteiro correspondente ordenao das duas Strings. As regras que determinam o resultado do mtodo so: Quando a instncia da classe String comea com a String passada como argumento, o valor ser a diferena (positiva) entre os comprimentos das Strings. Quando a String passada como argumento comea com a instncia da classe String, o valor ser a diferena (negativa) entre os comprimentos das Strings. Quando as Strings forem exatamente iguais, o valor ser zero. Quando as Strings no comearem uma com a outra, o valor ser a diferena dos valores Unicode dos primeiros caracteres diferentes das Strings. Quando uma das Strings for vazia, o valor ser a diferena entre os comprimentos das Strings. Exemplos de uso do mtodo compareTo() so mostrados na listagem 9.4.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

102

Listagem 9.4: Comparaes entre Strings (mtodo compareTo())


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

/* Esta classe demonstra o mtodo compareTo de comparao de Strings */ class DemoStrings { /* Este o mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos quatro Strings para comparao String s1 = "teste de Strings"; String s2 = "teste de strings"; String s3 = "teste de comparao de Strings"; String s4 = "teste"; System.out.println("Comparao entre "+s1+" e "+s1+": "+ s1.compareTo(s1)); // 0: strings so iguais System.out.println("Comparao entre "+s1+" e "+s2+": "+ s1.compareTo(s2)); // -32: diferena entre S e s System.out.println("Comparao entre "+s1+" e "+s3+": "+ s1.compareTo(s3)); // -16: diferena entre S e c System.out.println("Comparao entre "+s1+" e "+s4+": "+ s1.compareTo(s4)); // 11: diferena de comprimento System.out.println("Comparao entre "+s2+" e "+s3+": "+ s2.compareTo(s3)); // 16: diferena entre s e c System.out.println("Comparao entre "+s2+" e "+s4+": "+ s2.compareTo(s4)); // 11: diferena de comprimento System.out.println("Comparao entre "+s3+" e "+s4+": "+ s3.compareTo(s4)); // 25: diferena de comprimento // Comparao pode ser feita com "constantes" de Strings ! int resultado; resultado = "teste de comparacao".compareTo(s3); // -132: diferena entre c e resultado = "test string".compareTo("bem diferente"); // 18: diferena entre t e b resultado = "xxxx".compareTo("yy"); // -1: diferena entre x e y resultado = " ".compareTo(""); // 1: diferena de comprimento } } // fim da classe DemoStrings

Dois mtodos podem ser usados para vericar se Strings so iniciadas ou terminadas com outra String: o mtodo startsWith() recebe uma String como argumento e retorna o valor booleano true se a String que chama o mtodo comea com a String que foi passada como argumento, e false se no. O mtodo endsWith() recebe uma String como argumento e retorna o valor booleano true se a String que chama o mtodo termina com a String que foi passada como argumento, e false se no. Os dois mtodos so demonstados no programa da listagem 9.5. Listagem 9.5: Comparaes entre Strings (mtodos startsWith() e endsWith())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

/* Esta classe demonstra os mtodos startsWith e endsWith para comparao de Strings */ class DemoStrings { /* Este o mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos trs Strings para verificao String s1 = "Rio de Janeiro"; String s2 = "Rio Claro"; String s3 = "Juazeiro"; // Que strings comeam com "Rio" ? System.out.println(s1.startsWith("Rio")); // true System.out.println(s2.startsWith("Rio")); // true System.out.println(s3.startsWith("Rio")); // false // Que strings terminam com "eiro" ? System.out.println(s1.endsWith("eiro")); // true System.out.println(s2.endsWith("eiro")); // false Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

103
System.out.println(s3.endsWith("eiro")); // true // Outro exemplo: algoritmo simples e altamente falvel para determinar // atravs do nome de uma pessoa se esta pessoa do sexo feminino. System.out.print("Entre uma String:"); // Pergunto ao usurio String nome = Keyboard.readString(); // Leio a String que ele/a digitar if (nome.endsWith("a")) // Se esta String termina com "a" ento... System.out.println(" possivelmente feminino !"); } } // fim da classe DemoStrings

18 19 20 21 22 23 24 25 26

9.4

Mtodos para modicao de Strings

Podemos modicar o contedo de uma String de diversas maneiras: modicando seus caracteres, adicionando caracteres s Strings, extraindo trechos das Strings, etc. Alguns dos mtodos da classe String que permitem modicaes so mostrados nesta seo. importante levar em considerao que quando uma String modicada, seja atravs dos mtodos mostrados nesta seo ou atravs da concatenao com o sinal +, uma nova instncia da classe String criada, o que representa um certo esforo computacional adicional. No existem mtodos que modiquem a instncia da classe String que os chama: todos estes mtodos mantm a String original inalterada e retornam uma nova instncia modicada. Existem trs mtodos na classe String que permitem a modicao direta de seus caracteres: o mtodo replace() que substituir todas as ocorrncias de um caracter em uma String por outro caracter, o mtodo toLowerCase() que transformar todos os caracteres maisculos em uma String em minsculos, e o mtodo toUpperCase() que transformar todos os caracteres minsculos em uma String em maisculos. Estes trs mtodos so demonstrados no programa na listagem 9.6.

Listagem 9.6: Modicao de caracteres (mtodos replace(), toLowerCase() e toUpperCase())


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

/* Esta classe demonstra os mtodos replace, toLowerCase e toUpperCase para troca de caracteres de Strings */ class DemoStrings { /* Este o mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos trs Strings para modificao String s1 = "teste de modificao de strings"; String s2 = "String com diversos caracteres: 123#%[]{}()"; String s3 = "uma string com diversos espaos em branco"; // Trocamos os caracteres e por E na primeira e imprimimos System.out.println(s1.replace(e,E)); // Trocamos os caracteres a por . na segunda e imprimimos System.out.println(s2.replace(a,.)); // O resultado de um mtodo replace uma String, ento podemos fazer o replace // nela tambm, de forma encadeada: vamos trocar todas as vogais minsculas System.out.println(s2.replace(a,.).replace(e,.). replace(i,.).replace(o,.).replace(u,.)); // Trocamos todos os espaos por sinais + System.out.println(s3.replace( ,+)); // Trocamos os caracteres minsculos da primeira String por maisculos e imprimimos System.out.println(s1.toUpperCase()); // Trocamos os caracteres maisculos da segunda String por minsculos e imprimimos System.out.println(s2.toLowerCase()); // Mudamos permanentemente os caracteres da terceira String para maisculos Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

104
s3 = s3.toUpperCase(); System.out.println(s3); // modificao pode ser feita com "constantes" de Strings ! System.out.println("palavras".replace(a,o).replace(a,x)); } } // fim da classe DemoStrings

27 28 29 30 31 32

Algumas notas importantes sobre modicao de caracteres: Os trs mtodos ( replace(),toLowerCase() e toUpperCase()) retornam novas instncias da classe String modicadas de acordo com o mtodo - as instncias originais no so modicadas pela simples execuo do mtodo. O mtodo replace() recebe dois caracteres, e no possvel passarmos Strings para trocar conjuntos de caracteres por conjuntos de caracteres: chamar o mtodo como replace("no","sim") no possvel, assim como no possvel especicar caracteres vazios (). O mtodo replace() considera caracteres maisculos e minsculos como sendo diferentes. Os mtodos toLowerCase() e toUpperCase() somente agem sobre caracteres que representam letras, e consideram caracteres acentuados normalmente. Todos os mtodos da classe String que retornam Strings podem ser usados de forma encadeada, como mostrado nas linhas 18 e 19 do programa na listagem 9.6: desta forma, o resultado de uma chamada ao mtodo ser uma String, que pode ter outro mtodo chamado. No caso de mtodos encadeados, as operaes so executadas da esquerda para a direita: na linha 30 da listagem 9.6 os caracteres a sero trocados primeiramente pelos caracteres o e o resultado da troca ter seus caracteres a trocados por x - uma troca sem efeito uma vez que j no existem caracteres a na String. Outros mtodos para modicao de Strings so o mtodo concat(), que recebe uma String como argumento e concatena esta String String que chamou o mtodo, e trim(), sem argumentos, que elimina espaos em branco no incio e m de uma String e retorna a String sem estes espaos. Exemplos de uso destes mtodos so mostrados na listagem 9.7.

Listagem 9.7: Modicao de caracteres de Strings (mtodos concat() e trim())


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/* Esta classe demonstra o mtodo concat() para concatenao de Strings e o mtodo trim() para eliminao de espaos em branco no incio e fim de uma String.*/ class DemoStrings { /* Este o mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos trs Strings para concatenao String s1 = "Uma das vantagens menos apreciadas de computadores que "; String s2 = "se eles fazem besteira, no existe nenhuma lei contra "; String s3 = "bater neles um pouco -- Joe Martin"; // E uma nova String para conter todas elas String s4; // Concatenamos a segunda na primeira, e a terceira ao resultado s4 = s1.concat(s2).concat(s3); System.out.println(s4); // Outra String para concatenao... String s5 = s1+s2+s3; System.out.println(s4.equals(s5)); // resultados da concatenao so iguais (true) // Demonstramos tambm o uso do mtodo trim() String s6 = " Uma string com espaos no incio e fim "; String s7 = s6.trim(); // a mesma mas com os espaos iniciais e finais cortados Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

105
System.out.println(s6.length()); // comprimento 48 System.out.println(s7.length()); // comprimento 38 } } // fim da classe DemoStrings

23 24 25 26

Podemos notar o encadeamento dos mtodos na linha 14 do programa na listagem 9.7 - a ordem de concatenao da esquerda para a direita. O resultado da execuo deste mtodo igual ao da concatenao com o sinal +, como mostrado pela linha 18 da listagem.

9.5 Mtodos para seleo em Strings


Em algumas rotinas e aplicaes pode ser desejvel o processamento de apenas parte de uma String, ou dos caracteres individuais que a compe. O mtodo substring() retorna trechos de uma String, compostos de um ou mais caracteres, como uma nova instncia da classe String. Este mtodo polimrco: em uma forma deste, passamos um valor inteiro como argumento, e o mtodo recortar da String que o chama os caracteres cujo ndice for maior do que o valor passado como argumento, e retornar esta String recortada. A segunda verso do mtodo aceita dois valores inteiros e retorna os caracteres da String cujos ndices sejam maiores ou iguais ao primeiro argumento e menores do que o segundo argumento. Exemplos de uso do mtodo substring() (inclusive as verses polimrcas) so mostrados no programa na listagem 9.8.

Listagem 9.8: Seleo de trechos de Strings (mtodo substring())


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

/* Esta classe demonstra usos do mtodo substring() para seleo de trechos de Strings. */ class DemoStrings { /* Este o mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos uma longa String String s1 = "Existem dois tipos de tolos: os que nunca escalaram o Monte Fuji "+ "e os que o escalaram duas vezes - antigo provrbio japons"; // Vamos extrair algumas substrings desta String System.out.println(s1.substring(99)); // Da posio 99 at o final da String System.out.println(s1.substring(116)); // Da posio 115 at o final da String String s2 = s1.substring(54,64); // Da posio 54 at a posico 63 System.out.println(s2); String s3 = s1.substring(1,2); // Da posio 1 at a posico 2 System.out.println(s3); /* As linhas abaixo causaro erros de execuo (excees) do tipo java.lang.StringIndexOutOfBoundsException ! */ System.out.println(s1.substring(-1)); // Deve ser maior ou igual a zero System.out.println(s1.substring(20,18)); // Segundo valor deve ser maior do que o primeiro System.out.println(s1.substring(32,32)); // Segundo valor deve ser maior do que o primeiro } } // fim da classe DemoStrings

9.6

Mtodos para procura em Strings

A ltima categoria de mtodos neste captulo servem para procura de Strings dentro de Strings. Estes mtodos retornam um valor inteiro que a posio da String procurada ou 1 se nada for encontrado.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

106 Existem dois mtodos polimrcos para procura de Strings: indexOf(), que recebe uma String como argumento em uma das suas formas e retorna a posio da String passada dentro da String que chamou o mtodo ou o valor 1 se nada for encontrado. A segunda forma do mtodo recebe uma String e um valor inteiro, e procura a String a partir da posio passada. O segundo mtodo de procura chamado lastIndexOf(), e em sua primeira forma recebe uma String e retorna a posio daquela String ou 1 se nada for encontrado. A diferena entre este mtodo e o indexOf() que o indexOf() procura a partir da primeira posio na String sendo procurada, enquanto o lastIndexOf() procura a partir da ltima posio. A segunda forma do mtodo lastIndexOf() tambm recebe uma String e um valor numrico, e efetua a procura a partir da posio especicada pelo valor numrico. Exemplos de usos dos dois mtodos so mostrados no programa na listagem 9.9.

Listagem 9.9: Procura de substrings em Strings (mtodos indexOf() e lastIndexOf())


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

/* Esta classe demonstra usos do mtodo indexOf() e lastIndexOf() para procura em Strings. */ class DemoStrings { /* Este o mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos uma longa String String s1 = "Em trs a oito anos ns teremos uma mquina com a inteligncia "+ "de um ser humano mdio ... a mquina ir comear a se educar com "+ "uma velocidade fantstica ... em alguns meses ela estar no nvel "+ "de gnios e alguns meses depois seus poderes sero incalculveis. "+ " -- Marvin Minsky, 1970"; // Procuraremos algumas substrings na String longa System.out.println(s1.indexOf("mquina")); // 36 System.out.println(s1.indexOf("mquina",40)); // 92 System.out.println(s1.indexOf("mquina",125)); // -1 System.out.println(s1.indexOf("computador")); // -1 System.out.println(s1.indexOf("")); // String vazia: 0 // Procuraremos algumas substrings na String longa (a partir do fim) System.out.println(s1.lastIndexOf("meses")); // 213 System.out.println(s1.lastIndexOf("meses",200)); // 168 System.out.println(s1.lastIndexOf("meses",40)); // -1 System.out.println(s1.lastIndexOf("semanas")); // -1 System.out.println(s1.lastIndexOf("")); // String vazia: 283 } } // fim da classe DemoStrings

9.7

Exerccios do captulo 9

Exerccio 9.1: Escreva um programa em Java que pea ao usurio que digite uma String, e s aceite Strings cujo comprimento seja maior ou igual a 10 caracteres. Dica: use um lao while. Exerccio 9.2: O que acontecer qualquer String quando chamarmos de modo encadeado o mtodo trim() duas vezes como no exemplo String a; a = a.trim().trim(); ?

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

107

Exerccio 9.3: Escreva um programa em Java que leia uma String do teclado e imprima seus caracteres, um por um. Exerccio 9.4: Escreva um programa em Java que receba uma String e um valor numrico N do teclado, e imprima somente os primeiros N caracteres da String. O programa deve vericar se N um valor vlido (menor que o comprimento da String). Exerccio 9.5: Escreva um programa em Java que leia uma String do teclado e imprima seus caracteres, um por um, na ordem reversa (do ltimo caracter para o primeiro). Exerccio 9.6: Escreva um programa em Java que leia uma String do teclado e troque todas as vogais no acentuadas da String pelo caracter ?. Exerccio 9.7: Escreva um programa em Java que ltre uma String, de forma que a partir de uma String lida do teclado, o programa crie uma nova String contendo somente os valores numricos da String entrada. Por exemplo, se a String entrada for 1a2b09cd, a String resultante deve ser 1209. Dica: voc pode usar o mtodo esttico isDigit() da classe Character (seo A.2.2.2) Exerccio 9.8: Escreva um programa em Java que tenha um mtodo chamado URL que recebe uma String como argumento e retorna o valor booleano true se esta String comea com http: ou ftp:. Exerccio 9.9: Escreva um programa em Java que tenha um mtodo chamado Grfico que recebe uma String como argumento e retorna o valor booleano true se esta String termina com .gif, .jpg ou .jpeg. Exerccio 9.10: Escreva um programa em Java que tenha um mtodo chamado qualLing que recebe uma String como argumento e retorna uma String correspondente linguagem de programao correspondente aos ltimos caracteres da String passada como argumento. Por exemplo, se a String passada como argumento terminar com .c ou .h o mtodo dever retornar a String C. Se a String passada como argumento terminar com .pas, o mtodo dever retornar a String Pascal. Se a String passada como argumento terminar com .java, o mtodo dever retornar a String Java. Exerccio 9.11: Escreva uma classe em Java que represente o nome completo de uma pessoa, composto de trs Strings (nome prprio, nome do meio e nome da famlia). Escreva nessa classe o mtodo rubrica() que retorna somente as iniciais do nome completo em caracteres minsculos, e o mtodo assinatura() que retorna as iniciais dos nomes prprio e do meio (com pontos) e o nome de famlia completo. Por exemplo, se o nome da pessoa representado por esta classe for Richard Langton Gregory, o mtodo rubrica() deve retornar rlg e o mtodo assinatura() deve retornar R.L.Gregory. Para facilitar, considere armazenar os trs nomes em Strings separadas.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

108

Exerccio 9.12: Escreva uma classe StringUtils com mtodos estticos. Escreva, nesta classe, vrios mtodos polimrcos para comparao entre Strings (baseados nos mtodos equals() e equalsIgnoreCase()), que recebam duas ou mais Strings e retornem true se todas forem iguais e false se ao menos uma for diferente das outras. Exerccio 9.13: Escreva na classe StringUtils (veja exerccio 9.12) um mtodo que receba uma String como argumento, conte e retorne o nmero de caracteres de uma String que so iguais a espaos. Exerccio 9.14: Escreva na classe StringUtils (veja exerccio 9.12) um mtodo que receba uma String como argumento, substitua todos os espaos desta String pelo caracter + e retorne a String nova. Exerccio 9.15: Escreva na classe StringUtils (veja exerccio 9.12) um mtodo que receba uma como argumento e desacentue esta String, isto , troque todos os caracteres acentuados por caracteres correspondentes sem acentos ( por A, por c, etc), considerando todos os caracteres acentuados, maisculos e minsculos. Exerccio 9.16: Escreva na classe StringUtils (veja exerccio 9.12) um mtodo que reverta a ordem dos caracteres de uma String passada como argumento e retorne a String revertida. Um exemplo: se a String Java for passada para este mtodo, ele deve retornar a String avaJ. Dica: Use um lao for ou while e o mtodo charAt(). Exerccio 9.17: Uma String dita palndroma se ela pode ser lida da esquerda para a direita ou da direita para a esquerda da mesma forma. As Strings radar, asa e O breve verbo so palndromas. Escreva um mtodo esttico na classe StringUtils (veja exerccio 9.12) que retorne true se uma String passada como argumento for palndromas e false se no for. Dica: use o exerccio 9.16 como base. Exerccio 9.18: Escreva na classe StringUtils (veja exerccio 9.12) um mtodo que conte quantas ocorrncias de um caracter existem em uma String. Dica: este mtodo receber uma String e um caracter como argumentos e retornar um inteiro. Exerccio 9.19: Escreva um programa em Java que receba uma String pelo teclado e conte quantas consoantes existem nesta String. Dica: existem vrias maneiras de resolver este problema - pense em ao menos duas e considere qual a mais simples. Exerccio 9.20: Escreva um programa em Java que receba uma String pelo teclado e imprima todas as ocorrncias de duas letras iguais uma aps a outra. Por exemplo, se este programa receber a String irrepreensvel, dever imprimir como resultado rr e ee. Dica: use um lao e o mtodo charAt().

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

109

Exerccio 9.21: Escreva um mtodo esttico na classe StringUtils (veja exerccio 9.12) que receba duas Strings e retorne o valor booleano true se a primeira String contiver todos os caracteres da segunda String, em qualquer ordem. Por exemplo, se as Strings Abracadabra e cabra forem passadas como argumentos, o mtodo dever retornar true, mas se as Strings Abracadabra e cobra forem passadas como argumentos, o mtodo dever retornar false. Note que este mtodo diferente do indexOf() porque Abracadabra.indexOf(cabra) equivale a false. Exerccio 9.22: Escreva um programa em Java que receba uma String do teclado, e separe esta String em duas: uma contendo as letras da String entrada e outra contendo os dgitos da String. Por exemplo, se a String abc12d3e4f56 for entrada, o programa deve criar as Strings abcdef e 123456 como sada. Use o exerccio 9.7 como base. Exerccio 9.23: Em um jogo de tabuleiro chamado Palavras Cruzadas, cada palavra formada vale um certo nmero de pontos, que depende das letras usadas. O score para as letras do alfabeto dado por: Para cada letra Q ou Z na palavra, some 10 pontos. Para cada letra J ou X na palavra, some 8 pontos. Para cada letra K na palavra, some 5 pontos. Para cada letra F, H, V, W ou Y na palavra, some 4 pontos. Para cada letra B, C, M ou P na palavra, some 3 pontos. Para cada letra D ou G na palavra, some 2 pontos. Para todas as outras letras, some 1 ponto.

Por exemplo, o score para a palavra Java no jogo ser 8 + 1 + 4 + 1 = 14 pontos. Escreva um programa ou rotina em Java que, a partir de uma String, calcule o score que esta String teria no jogo. Exerccio 9.24: Escreva um mtodo esttico na classe StringUtils (veja exerccio 9.12) que receba que receba uma String e um inteiro como argumentos e centralize a String adicionando espaos no seu incio e m de forma que o comprimento nal da String seja igual ao valor passado como argumento. Por exemplo, se a String Java1 e o valor 20 forem passados como argumento, o mtodo dever adicionar espaos no incio e no m da String at que seu comprimento seja exatamente 20 caracteres. Se o comprimento da String passada j for maior que o valor passado como argumento, o mtodo deve retornar a String inalterada. Exerccio 9.25: O mtodo replace() da classe String somente substitui um nico caracter por vez. Escreva um mtodo esttico replaceMultiple() na classe StringUtils (veja exerccio 9.12) que receba trs Strings como argumentos: a primeira a String que sofrer as modicaes, a segunda String conter os caracteres que sero substitudos pelos caracteres correspondentes na terceira String. A segunda e terceira Strings devem ter exatamente o mesmo nmero de caracteres. Este mtodo retornar uma String. Por exemplo, se o mtodo for chamado como StringUtils.replaceMultiple(Paraleleppedo,alp,xyz) o resultado dever ser Pxrxyeyezzedo (a foram trocados por x, l foram trocados por y e p foram trocados por z).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

110

Exerccio 9.26: Escreva um programa em Java que leia uma String do teclado e remova todas as vogais desta String. No basta simplesmente imprimir somente as consoantes da String - necessrio criar uma nova String que s contenha as consoantes. Exerccio 9.27: Escreva um programa com o mtodo main() em Java que funcione como uma calculadora bem bsica: trs argumentos devem ser passados para o programa, sendo que o primeiro deve ser uma String contendo um valor, o segundo um dos caracteres +, -, * ou /, e o terceiro outra String contendo um valor. O programa deve receber estes trs argumentos e efetuar uma operao neles, de forma que se os argumentos passados forem 12.5 * 4 o programa deve calcular a operao 12.5 4 e imprimir o resultado. O programa deve ser capaz de reconhecer e tratar os erros bsicos (Strings que no contm valores, sinais diferentes dos esperados, divises por zero). Dica: a converso de Strings para valores do tipo double pode ser feita com o mtodo valueOf() da classe Double, descrita na seo A.2.2.7 do captulo A. Exerccio 9.28: Considerando o exerccio 9.27, escreva um programa em Java com o mtodo main() que funcione como uma calculadora para soma e multiplicao somente, mas que aceite vrios valores da linha de comando, onde o primeiro o sinal da operao + ou * e os outros so os valores a serem somados ou multiplicados. Por exemplo, se os argumentos passados na linha de comando forem + 3 8 7 1.6 2.1 o programa deve calcular a soma destes valores e imprimir o resultado (neste caso, 21.7). Dica: a converso de Strings para valores do tipo double pode ser feita com o mtodo valueOf() da classe Double, descrita na seo A.2.2.7 do captulo A. Exerccio 9.29: O algoritmo rot13 de ofuscao de Strings um dos mtodos mais simples (e menos ecientes) de criptograa de Strings que existe: para cada caracter na String que seja uma letra de A a Z, o algoritmo substitui este caracter por uma treze posies depois: A trocada por N, m trocada por z, R trocada por E, etc. (as letras so consideradas cclicas, isto , depois do Z vem o A, etc.). Um ponto interessante deste algoritmo que o mesmo pode ser usado para codicar e decodicar Strings: quando o algoritmo usado em uma String, por exemplo, Java, o resultado ser Wnin, e quando a String Wnin for codicada pelo algoritmo, o resultado ser Java. Escreva um mtodo esttico na classe StringUtils (veja exerccio 9.12) que implemente o algoritmo rot13, recebendo uma String como argumento e retornando outra String criptografada. Este mtodo deve considerar que somente as letras no-acentuadas devem ser criptografadas, as letras acentuadas, nmeros, espaos e outros smbolos devem continuar como esto.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

111

Exerccio 9.30: O Algoritmo de Csar de criptograa de Strings uma verso melhorada do algoritmo rot13 (veja exerccio 9.29): o seu funcionamento o mesmo, s que em vez de substituir cada caracter por um caracter treze posies depois, o algoritmo de Csar recebe um valor chamado chave, e usa este valor como o nmero de posies que devem ser puladas para a criptograa. Por exemplo, se a chave for 1 o algoritmo pular uma posio ao codicar as letras, ento se a String passada for Java, o resultado ser Kbwb. O algoritmo de decodicao deve receber a mesma chave s que deve substituir os caracteres da String por valores em posies anteriores. Escreva um mtodo esttico na classe StringUtils (veja exerccio 9.12) que implemente o Algoritmo de Csar, recebendo uma String e uma chave (valor numrico) como argumento e retornando outra String criptografada. Este mtodo deve considerar que somente as letras no-acentuadas devem ser criptografadas, as letras acentuadas, nmeros, espaos e outros smbolos devem continuar como esto. Dica: Para simplicar o algoritmo, considere que o valor da chave s pode estar entre 1 e 25. Exerccio 9.31: Escreva uma classe StringDNA que seja capaz de processar uma String de DNA. Strings de DNA so Strings que so formadas exclusivamente pelos caracteres A, C, G e T - nenhum outro caracter permitido. Esta classe deve encapsular uma String e conter ao menos os seguintes mtodos: Construtor, que recebe uma String normal como argumento e copia-a para a String encapsulada pela classe se a passada por argumento estiver dentro dos parmetros exigidos (isto , se a String passada for CATGATTAG, a String encapsulada ser CATGATTAG, mas se a String passada for JAVA, a String encapsulada ser vazia). toString(), que retorna a String encapsulada, charAt(), que retorna o caracter na posio que for passada como argumento, quantosA(), quantosC(), quantosG() e quantosT(), que retornam, respectivamente, quantos caracteres A, C, G e T existem na String encapsulada, length(), que retorna o comprimento da String encapsulada. Exerccio 9.32: Crie, na classe StringDNA (veja exerccio 9.31), o mtodo compara() que recebe uma instncia da prpria classe StringDNA para comparao e retorna um valor inteiro, calculado com o seguinte algoritmo: Se o comprimento das Strings for diferente, retorne 1. Se o comprimento das Strings for igual, faa os seguintes passos: Coloque o valor zero em um valor acumulador, Para cada posio nas duas Strings, compare os dois caracteres na posio, Se os caracteres forem exatamente iguais, some +3 pontos ao valor, Se os caracteres forem as combinaes A e T ou T e A, some +1 ponto ao acumulador, Se os caracteres forem as combinaes C e G ou G e C, some +1 ponto ao acumulador, Quando terminarem os caracteres das Strings, o valor acumulado ser o valor a ser retornado pelo mtodo. Exemplo: Se a instncia da classe StringDNA conter a String ACATTG e para o mtodo compara() for passada a String ATTCCG, o valor a ser retornado ser 3 + 0 + 1 + 0 + 0 + 3 = 7.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

112

Exerccio 9.33: O mtodo replace() da classe String considera caracteres maisculos e minsculos como sendo diferentes: o resultado de AbracadabrA.replace(a,o) ser AbrocodobrA e no ObrocodobrO. Escreva um mtodo esttico replaceIgnoreCase() na classe StringUtils (veja exerccio 9.12) que faa a troca de caracteres maisculos e minsculos simultaneamente, de forma que quando chamarmos o mtodo atravs de StringUtils.replaceIgnoreCase(AbracadabrA,a,o) o resultado seja ObrocodobrO. Dica: Basta fazer um replace() duas vezes dentro do mtodo, uma para o caracter maisculo e uma para o minsculo. Voc pode passar um caracter de maisculo para minsculo convertendo-o para uma String, usado o mtodo toUpperCase() ou toLowerCase() e extraindo o caracter da String com o mtodo charAt(). Exerccio 9.34: Escreva um mtodo esttico removeMultipleSpaces() na classe StringUtils (veja exerccio 9.12) que, recebendo uma String como argumento, remova espaos mltiplos na String e retorne a String resultante. Por exemplo, se a String Uma String com muitos espaos redundantes for passada, o mtodo deve retornar a String Uma String com muitos espaos redundantes. Exerccio 9.35: Escreva um mtodo esttico subtractChars() na classe StringUtils (veja exerccio 9.12) que, recebendo duas Strings como argumentos, retorne uma String que a subtrao dos caracteres da segunda String passada como argumento dos caracteres da primeira String. O mtodo deve considerar caracteres maisculos e minsculos como sendo iguais. Por exemplo, se as Strings Abracadabra e cabra forem passadas como argumentos, o algoritmo deve remover uma de cada uma das letras de cabra da palavra Abracadabra, resultando em adabra. Se algum caracter da segunda String no existir na primeira, o mtodo deve retornar uma String vazia (exemplo: se a segunda String for praxe e a primeira for paraleleppedo, a subtrao no poder ser efetuada.) Exerccio 9.36: Escreva uma classe Formata que contenha vrios mtodos estticos para formatao de valores dos tipos int, long, oat e double para impresso. Estes mtodos devem receber os valores como argumentos e retornam Strings contendo os valores formatados. Os mtodos para impresso de valores dos tipos int e long devem receber um valor inteiro adicional que representa o nmero de casas que se deseja na impresso - neste caso, o nmero de dgitos que se deseja representar. Os mtodos para impresso de valores dos tipos oat e double devem receber dois valores inteiros adicionais, um para representar o nmero total de dgitos para impresso e outro para representar o nmero de valores aps o ponto decimal. Estes mtodos devem prever e tratar o caso de valores de ponto utuante que usem a notao cientca, como por exemplo 1.34e12. Dicas: voc pode usar polimorsmo para ter mtodos com o mesmo nome mas que sero chamados de acordo com os tipos de dados passados. Um valor de qualquer dos tipos previstos pode ser transformado em uma String atravs da adio de um espao vazio ao valor. Exemplo: se a varivel a conter o valor inteiro 12345, ela pode ser convertida para uma String atravs da operao +a.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

113

Exerccio 9.37: Escreva um programa em Java com uma rotina que converta Strings de caracteres para Strings em cdigo morse e vice-versa. No cdigo morse, caracteres so representados por pontos (correspondentes a um impulso eltrico curto) e traos (correspondentes a um impulso eltrico longo). Os caracteres bsicos e seus correspondentes em cdigo morse so mostrados abaixo: a h o v ..... -...b i p w -... .. .-. .c j q x -.-. .--.-..d k r y -.. -..-. -.e l s z . .-.. ... -.. f ..-. m t ponto .-.-.g -. n -. u ..vrgula -..-

A cada caracter que for codicado, um espao deve ser adicionado String de sada. A rotina deve considerar caracteres maisculos e minsculos como sendo equivalentes, e ignorar outros smbolos. Exemplo: se uma String Farfalhar for passada para a rotina, esta deve retornar ..-. .- .-. ..-. .- .-.. .... .- .-.. Dica: para decodicao de cdigo morse para caracteres, use os espaos que devem existir na String codicada como delimitadores dos caracteres do cdigo morse. Se algum cdigo morse no tiver caracter correspondente (exemplo, ---), use o caracter ? para sada. Exerccio 9.38: Escreva, na classe StringUtils (veja exerccio 9.12), vrios mtodos polimrcos chamados ordena() que recebem diferentes nmeros de argumentos, todos Strings, e imprimam estas Strings ordenadas. Por exemplo, uma chamada ao mtodo StringUtils.ordena(alface,alfabeto,alforria) deve imprimir alfabeto alface alforria como resultado. Dica: use os mtodos length() e compareTo() da classe String para efetuar as comparaes. Exerccio 9.39: Uma String contendo RNA composta somente dos caracteres A, C, G e U - nenhum outro caracter permitido. Escreva uma classe StringRNA que herde da classe StringDNA (exerccio 9.31) e implemente os mesmos mtodos da classe StringDNA. Quais mtodos devem ser sobreescritos ? Exerccio 9.40: O Algoritmo de Csar (veja o exerccio 9.30) pode ser implementado de maneira mais eciente, se ao invs de uma nica chave, vrias forem usadas. O primeiro caracter da String ser codicado com a primeira chave, o segundo caracter com a segunda chave, etc. Quando as chaves acabarem, a primeira ser reutilizada, at o nal da String a ser codicada. A chave pode ser especicada por outra String, onde cada caracter tem um valor numrico correspondente, de forma que a String AEIY corresponde a quatro chaves 1, 5, 9, 25. Desta forma, se a String Programa fosse codicada com a chave aeb (correspondente aos valores 1, 5 e 2, o resultado seria Qwqhwcnf (P foi adicionada a 1 e o resultado Q, r foi adicionada a 5 e o resultado w, o foi adicionada a 2 e o resultado q, g foi adicionada a 1 e o resultado h, r foi adicionada a 5 e o resultado w, etc.) - notem o uso cclico dos valores da chave. Escreva um mtodo esttico na classe StringUtils (veja exerccio 9.12) que implemente o Algoritmo de Csar modicado, recebendo uma String e uma chave (outra String) como argumento e retornando outra String criptografada. Este mtodo deve considerar que somente as letras no-acentuadas devem ser criptografadas, as letras acentuadas, nmeros, espaos e outros smbolos devem continuar como esto. Dica: Para simplicar o algoritmo, considere que o valor da chave s pode estar entre 1 e 26, ou seja, as letras A a Z. O algoritmo de codicao deve vericar se a String passada como chave vlida, ou seja, se ela contm somente caracteres maisculos na faixa prevista.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

114

Exerccio 9.41: O Algoritmo fatiado de codicao recebe uma String como argumento e produz uma outra String como resultado, e pode ser descrito da seguinte forma: enquanto a String de entrada tiver caracteres, remova o primeiro e o ltimo caracteres da String de entrada e os coloque na String de sada. Desta forma, se a String Programao em Java for entrada no algoritmo, este mostrar como sada a String ParvoagJr ammea o. A decodicao de uma String pode ser feita da seguinte forma: crie duas Strings temporrias, e para cada par de caracteres extrados da String codicada de entrada adicione o primeiro no m da primeira String e o segundo no incio da segunda String. A concatenao das duas Strings o resultado da decodicao. Escreva uma classe em Java com mtodos estticos para codicar e decodicar uma String usando este argumento. Escreva tambm um programa que demonstre usos desta classe. Exerccio 9.42: Escreva um programa que leia uma String do teclado e converta esta String para o alfabeto braille A gura abaixo mostra o alfabeto braille simplicado, onde um crculo preenchido signica uma marca em relevo no papel. Cada letra maiscula que aparecer no texto deve ser precedida pelo caracter maisculo do alfabeto braille. Cada dgito que aparecer no texto deve ser precedido pelo caracter dgito do alfabeto braille. No caso dos dgitos, os caracteres braille correspondentes a a, b, c ... i, j so usados para representar os dgitos 1, 2, 3 ... 9, 0. Para simplicar, considere que as Strings a serem convertidas no contm acentos nem smbolos, e que um espao em braille pode ser representado por um caracter braille sem nenhuma marca em relevo.
a b c d e f g h i

maisculo dgito

A sada do programa pode ser feita usando os caracteres de texto X para representar uma marca em relevo, . para representar uma posio onde no h marca em relevo, e o espao para separar uma letra do alfabeto braille de outra. Assim, se a String Java 123 for entrada, a sada dever ser: .. .X X. X. X. .. .X X. .X X. .X XX .. XX .. X. .. .. .X .. .X X. .X .. .X .. .. XX .. .. XX .. XX .. XX .. Dica: Para cada String entrada, trs Strings devero ser criadas na sada, cada uma com uma linha de pontos dos caracteres braille. O comprimento destas trs Strings igual, mas deve ser calculado vericando-se se a String de entrada tem caracteres maisculos e dgitos.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

115

Exerccio 9.43: Aminocidos so denidos por conjuntos de trs caracteres em Strings de RNA, sendo que cada aminocido pode ter mais do que um conjunto de trs caracteres correspondentes. Existem vinte aminocidos, mas algumas combinaes de trs caracteres formam um sinal de trmino. Os vinte aminocidos e o sinal de trmino, seus smbolos (entre parnteses) e as combinaes correspondentes so: Alanine (A): GCU, GCC, GCA e GCG Arginine (R): CGU, CGC, CGA, CGG, AGA e AGG Aspartic Acid (D): GAU e GAC Arparginine (N): AAU e AAC Cysteine (C): UGU e UGC Glutamic acid (E): GAA e GAG Glutamine (Q): CAA e CAG Glycine (G): GGU, GGC, GGA e GGG Histine (H): CAU e CAC Isoleucine (I): AUU, AUC e AUA Leucine (L): UUA, UUG, CUU, CUC, CUA e CUG Lysine (K): AAA e AAG Methionine (M): AUG Phenylalanine (F): UUU e UUC Proline (P): CCU, CCC, CCA e CCG Serine (S): AGU, AGC, UCU, UCC, UCA e UCG Threonine (T): ACU, ACC, ACA e ACG Tryptophan (W): UGG Tyrosine (X): UAU e UAC Valine (V): GUU, GUC, GUA e GUG Sinais de trmino (.): UAA, UAG e UGA Considerando a lista acima, escreva na classe StringRNA (exerccio 9.39) um mtodo que a partir da String contendo RNA encapsulada na classe, varra a String de trs em trs caracteres e imprima o aminocido correspondente. Escreva tambm um mtodo que varra a String de trs em trs caracteres e ao nal retorne uma outra String contendo os smbolos dos aminocidos: se a String encapsulada fosse CUGUAAGGGCCA este mtodo retornaria L.GP. Ambos os mtodos devem desconsiderar restos de Strings que no formem trs caracteres: uma String de oito caracteres corresponder dois aminocidos e dois caracteres sobraro. Dica: existe mais de uma maneira de calcular o aminocido a partir das trincas de caracteres. Qual a mais simples ?

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

116

Captulo 10 Arrays em Java


10.1 Introduo

Arrays 1 so estruturas de dados em Java que permitem o armazenamento de vrias variveis de um mesmo tipo ou instncias de uma mesma classe sob o mesmo nome. Cada um dos valores individuais (ou elementos do array) ser acessado atravs de um ndice, mas sob certas condies o array pode ser processado como uma nica entidade, simplicando bastante programas e classes que tem necessidade de vrias variveis ou instncias. A maior vantagem do uso de arrays que estes dispensam a necessidade de declarao de vrias variveis individuais quando necessrio. Por exemplo, em um programa ou classe onde fosse necessrio o armazenamento de cem variveis do mesmo tipo que representam de alguma forma o mesmo tipo de dado, seria complicado e sujeito a erros a representao destes dados um em cada varivel do tipo necessrio. Similarmente, ao representar uma turma de 45 alunos seria muito complicado e trabalhoso criar 45 instncias diferentes da classe Aluno e manipul-las uma a uma. Alguns exemplos ilustrativos de arrays so mostrados na gura 10.1.

0 1

1 4

2 2

3 5

4 0

5 9

6 7

7 2

0 1 2

"Programao" "Encapsulamento" "Polimorfismo"

Figura 10.1: Exemplo de arrays Na gura 10.1, esquerda, vemos um array de oito valores numricos, que pode ser representado por uma nica varivel. Acima dos valores nas caixas vemos valores inteiros que representam os ndices, que sempre so comeados por zero. direita vemos um array de Strings com trs Strings, com os ndices 0, 1 e 2 apontando para diferentes Strings. Java permite a criao de arrays de tipos nativos (como int, short, double, etc.) e de instncias de classes j existentes ou criadas pelo programador. Arrays podem ter uma ou mais dimenses: um array de uma dimenso pode ser comparado com um vetor matemtico, um array de duas dimenses com uma matriz.
tambm so conhecidos como vetores, mas como existe uma classe chamada Vector em Java (que ser vista na seo 14.1), usaremos a palavra array para denotar o tipo de estrutura vista neste captulo.
1 Arrays

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

117

10.2

Arrays de tipos nativos

A declarao de arrays em Java feita usando colchetes: uma varivel chamada nmeros declarada como nmeros[] ser automaticamente considerada um array. Antes de usarmos arrays, eles deve ter memria alocada para os dados que iro conter. Isto feito atravs da palavra-chave new, na seguinte forma: tipo_da_varivel nome_da_varivel[] = new tipo_da_varivel[nmero_de_posies];. Esta forma de declarao e alocao pode ser quebrada em duas partes, a primeira contendo a declarao tipo_da_varivel nome_da_varivel[]; e a segunda contendo a alocao, onde a varivel que j foi declarada deve aparecer de maneira ligeiramente diferente, como: nome_da_varivel = new tipo_da_varivel[nmero_de_posies]; (note que o nome da varivel no tem colchetes, mas a varivel j deve ter sido declarada como array). Variveis do tipo array somente podem conter um tipo de dados: se o array declarado como array de booleanos, todos os elementos deste array sero booleanos: no podemos misturar valores booleanos, inteiros e outros no mesmo array. Similarmente, no podemos declarar o array como sendo de um tipo de dados e aloc-lo como sendo de outro tipo: o tipo de declarao e de alocao deve ser obrigatoriamente o mesmo. O valor colocado entre os colchetes quando o array alocado ir especicar o nmero de posies no array, ou seja, quantos valores diferentes podero ser armazenados na mesma varivel. Os ndices que sero usados para acessar os valores individuais dos arrays devero estar na faixa 0 N 1 onde N o nmero de posies. Somente valores inteiros podem ser usados como ndices para os arrays. Desta forma, o valor nmeros[8] corresponde nona posio do array nmeros. Depois que o array alocado, no possvel modicar o nmero de posies que ele contm. importante reconhecer que o valor que indica qual elemento do array est sendo processado, e que passado entre os colchetes, no precisa ser necessariamente uma constante, podendo ser uma varivel ou mesmo o resultado de uma expresso. Como um array geralmente usado para representar vrios valores em uma nica varivel, muito comum usarmos um lao para iterar entre todos os elementos do array. Similarmente, o nmero de elementos de um array (especicado quando alocamos memria para ele) no precisa ser uma constante, podendo ser uma varivel de tipo inteiro ou mesmo o resultado de uma expresso, mas deve ser obrigatoriamente um nmero inteiro positivo, caso contrrio um tipo de erro especial de Java, chamado exceo, ir ocorrer. Excees so explicadas com detalhes no captulo 12. No caso especco de valores negativos passados usados para especicar o nmero de elementos do array, a exceo java.lang.NegativeArraySizeException ir ocorrer e o programa ir parar na linha do erro. A listagem 10.1 mostra um programa em Java que declara, aloca e popula um array. Os valores so entrados em um array atravs de um lao for que far com que cada valor do array seja lido do teclado. Aps a leitura os valores sero impressos.

Listagem 10.1: Um programa que cria e popula um array de inteiros


1 2 3 4 5 6 7 8 9 10

/* Esta classe demonstra o uso de um array de valores do tipo int - voc precisar da classe Keyboard para executar este programa. */ class DemoArray { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Declaro e ao mesmo tempo aloco um array chamado valores que conter 10 ints int valores[] = new int[10]; // Um lao de zero a nove ler os valores do array Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

118
for(int contador=0;contador<10;contador++) // a varivel contador s valer dentro do for ! { System.out.print("Entre o valor "+(contador+1)+":"); // note o (contador+1) para impresso valores[contador] = Keyboard.readInt(); // de valores na faixa 1-10 } // os valores j foram lidos, vamos imprimi-los for(int contador=0;contador<10;contador++) // a varivel contador deve ser redeclarada ! System.out.println("O valor "+(contador+1)+" "+valores[contador]); } } // fim da classe DemoArray

11 12 13 14 15 16 17 18 19 20

Existe outra forma alternativa de alocao e inicializao de arrays, que pode ser usada quando o array tiver valores iniciais default e poucos elementos. Esta forma recebe como argumento adicional os valores que sero colocados no array, separados por vrgulas e colocados entre chaves. Desta forma no necessrio informar diretamente ao compilador Java quantos elementos o array deve conter, nem usar a palavra-chave new para alocar memria para o array. Esta forma demonstrada no programa na listagem 10.2.

Listagem 10.2: Demonstrao da inicializao imediata de arrays


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

/* Esta classe demonstra a inicializao imediata de arrays */ class DemoArray { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Declaro, aloco e inicializo ao mesmo tempo um array de valores inteiros int fibonacci[] = {1, 1, 2, 3, 5, 8, 13, 21, 34}; // nove elementos // Declaro, aloco e inicializo ao mesmo tempo um array de sete Strings String nomes[] = {"Atchim","Dunga","Soneca","Mestre","Dengoso","Feliz","Zangado"}; // Declaro, aloco e inicializo ao mesmo tempo um array de shorts short ndices[] = {911, 912, 913, 914, 915}; // cinco elementos // Os nmeros da srie de Fibonacci for(int contador=0;contador<9;contador++) // a varivel contador s vale no lao ! System.out.println(fibonacci[contador]); // imprime o elemento do array // Os nomes dos sete anes: for(int contador=0;contador<7;contador++) // a varivel contador deve ser redeclarada System.out.println(nomes[contador]); // imprime o elemento do array // Os valores do array de shorts for(int contador=0;contador<5;contador++) // a varivel contador deve ser redeclarada System.out.println(ndices[contador]); // imprime o elemento do array } } // fim da classe DemoArray

A forma de inicializao de arrays mostrada nas linhas 8, 10 e 12 da listagem 10.2 s pode ser usada se declararmos e inicializarmos os arrays com o mesmo comando: no podemos declarar os arrays e depois, em outro comando, inicializ-los diretamente. Arrays em Java contm uma varivel interna chamada length que indica quantas posies o array tem. Esta varivel interna bastante usada quando queremos passar um array como argumento para uma funo ou mtodo, como visto no exemplo na listagem 10.3 (linha 7). Listagem 10.3: Um programa que demonstra a passagem de arrays como argumentos para mtodos
1 2 3 4

/* Esta classe demonstra a passagem de arrays como argumentos para mtodos */ class DemoArray { /* Mtodo que imprime um array de longs */ Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

119
static void imprimeArrayDeLongs(long esteArray[]) { int nmeroDePosies = esteArray.length; for(int contador=0;contador<nmeroDePosies;contador++) System.out.println("O valor "+(contador+1)+" "+esteArray[contador]); } /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { int tam1,tam2; // tamanhos dos arrays // pergunto os tamanhos dos arrays System.out.print("Entre o tamanho do primeiro array:"); tam1 = Keyboard.readInt(); System.out.print("Entre o tamanho do segundo array:"); tam2 = Keyboard.readInt(); // Declaro e ao mesmo tempo aloco dois arrays de longs long v1[] = new long[tam1]; long v2[] = new long[tam2]; // Um lao ler os valores do array v1 for(int contador=0;contador<tam1;contador++) // a varivel contador s valer { System.out.print("Entre o valor "+(contador+1)+":"); // note o (contador+1) v1[contador] = Keyboard.readInt(); // de valores na faixa } // Um lao ler os valores do array v2 for(int contador=0;contador<tam2;contador++) // a varivel contador s valer { System.out.print("Entre o valor "+(contador+1)+":"); // note o (contador+1) v2[contador] = Keyboard.readInt(); // de valores na faixa } // os valores j foram lidos, vamos imprimi-los imprimeArrayDeLongs(v1); imprimeArrayDeLongs(v2); } } // fim da classe DemoArray

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

dentro do for ! para impresso 1-tam1 dentro do for ! para impresso 1-tam2

Na listagem 10.3 vemos que o tamanho do array que passado para um mtodo indiferente, o que importa o tipo do array que passado. Arrays se comportam internamente como referncias objetos, signicando que se zermos cpias dos arrays atravs da atribuio de variveis, qualquer modicao feita cpia ser reetida no array original, e vice-versa. Esta caracterstica demonstrada no programa na listagem 10.4. Listagem 10.4: Um programa que mostra que arrays se comportam como referncias
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

/* Esta classe demonstra que arrays so referncias a objetos */ class DemoArray { /* Este mtodo inicializa os valores de um array com zeros */ static void zeraArrayDeDoubles(double umArray[]) { for(int contador=0;contador<umArray.length;contador++) // para todos elementos do array umArray[contador] = 0; // zeramos o elemento } /* Mtodo que permite a execuo da classe */ public static void main(String parmetros[]) { // declaramos e alocamos espao para um array de 5 posies de doubles double meuArray[] = new double[5]; // preenchemos ele com alguns valores meuArray[0] = 9; meuArray[1] = 8; meuArray[2] = 3; meuArray[3] = 1; meuArray[4] = 5; // declaramos (sem alocar !) um outro array de doubles Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

120
double outroArray[]; // criamos uma cpia do array atravs de atribuio simples de variveis outroArray = meuArray; // chamamos o mtodo zeraArrayDeDoubles com meuArray como argumento zeraArrayDeDoubles(meuArray); // imprimimos o contedo do meuArray for(int i=0;i<meuArray.length;i++) System.out.print(meuArray[i]+" "); System.out.println(); // imprimimos o contedo do outroArray for(int i=0;i<outroArray.length;i++) System.out.print(outroArray[i]+" "); System.out.println(); } } // fim da classe DemoArray

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

Ao executarmos o programa na listagem 10.4, vericaremos que ao nal do programa o array meuArray estar com os elementos zerados, pois uma cpia deste foi criada e manipulada quando passamos o array como argumento para o mtodo zeraArrayDeDoubles. O array outroArray tambm estar zerado pois ele somente uma referncia ao array meuArray. Os ndices para os arrays devem estar entre os valores 0 e N 1, onde N o tamanho do array (nmero de elementos que ele contm), caso contrrio uma exceo ir ocorrer e o programa ir parar na linha do erro. A listagem 10.5 mostra um programa onde este tipo de erro pode ocorrer.

Listagem 10.5: Um programa que demonstra erros potenciais relacionados ndices de arrays
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

/* Esta classe demonstra erros possveis relativos aos ndices dos arrays */ class ErroArray { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Declaro e ao mesmo tempo aloco um array chamado quadrados que conter 100 doubles double quadrados[] = new double[100]; // Um lao de 0 a 99 calcular os quadrados e popular o array for(int contador=0;contador<=99;contador++) // a varivel contador s valer dentro do for ! quadrados[contador] = contador*contador; // cada elemento conter o quadrado do seu ndice // os valores j foram lidos, vamos entrar em um lao boolean continua = true; while(continua) // enquanto a varivel continua for verdadeira { System.out.print("Entre um nmero de 0 a 99:"); // imprime a pergunta int valor = Keyboard.readInt(); // declaro a varivel, que receber a resposta // imprimo o valor entrado e seu quadrado System.out.println("O quadrado de "+valor+" "+quadrados[valor]); System.out.print("Quer continuar ? (S/N):"); // imprime a pergunta continua = Keyboard.readBoolean(); // recebe a resposta na varivel continua } // fim do while } // fim do mtodo main } // fim da classe ErroArray

O problema do programa na listagem 10.5 que nada impede o usurio de digitar valores fora da faixa 0 99, e caso um valor fora da faixa seja entrado, o programa ser interrompido com uma mensagem dizendo que houve uma exceo do tipo java.lang.ArrayIndexOutOfBoundsException (tentativa de acesso elemento do array fora da faixa de valores vlidos).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

121 Uma maneira de evitar este problema usando orientao a objetos encapsular o array em uma classe, e s permitir o acesso aos dados do array atravs de mtodos desta classe, como mostrado na listagem 10.6.

Listagem 10.6: A classe ArrayDeQuadrados, que encapsula um array


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

/* Esta classe encapsula um array de quadrados */ class ArrayDeQuadrados { private double quadrados[]; // somente declaramos o array aqui /* Construtor, aceita um argumento que o tamanho do array a ser alocado e calculado */ ArrayDeQuadrados(int nmero) { quadrados = new double[nmero]; // aloco memria para o array declarado anteriormente // O construtor o mtodo mais adequado para a inicializao dos valores do array. for(int contador=0;contador<nmero;contador++) quadrados[contador] = contador*contador; // cada elemento conter o quadrado do seu ndice } /* Um mtodo que permite o acesso s variveis do array encapsulado */ double quadrado(int posio) { if ((posio >= 0) && // se a posio especificada for maior ou igual a zero e (posio < quadrados.length)) // for menor do que o nmero de elementos... return quadrados[posio]; // retorna o elemento desejado do array else // imprimo uma mensagem de erro { System.out.print("Erro: no posso calcular o quadrado de "+posio); System.out.println("(somente de 0 a "+(quadrados.length-1)+")."); System.out.println("O valor retornado est incorreto !"); return -1; // retorna um valor qualquer - ainda no a melhor soluo ! } } // fim do mtodo quadrado } // fim da classe ArrayDeQuadrados

Esta classe pode ser usada em um programa, como mostrado na listagem 10.7.

Listagem 10.7: Um programa que usa a classe ArrayDeQuadrados


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

/* Esta classe usa uma instncia da classe ArrayDeQuadrados */ class DemoArrayDeQuadrados { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Crio a instncia do array de quadrados, com 1000 elementos ArrayDeQuadrados aq = new ArrayDeQuadrados(1000); // Fazemos um lao para leitura e exibio dos valores boolean continua = true; while(continua) // enquanto a varivel continua for verdadeira { System.out.print("Entre um nmero de 0 a 999:"); // imprime a pergunta int valor = Keyboard.readInt(); // declaro a varivel, que receber a resposta // imprimo o valor entrado e seu quadrado - note que simplesmente chamo o mtodo System.out.println("O quadrado de "+valor+" "+aq.quadrado(valor)); System.out.print("Quer continuar ? (S/N):"); // imprime a pergunta continua = Keyboard.readBoolean(); // recebe a resposta na varivel continua } // fim do while } // fim do mtodo main } // fim da classe ErroArray

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

122 O encapsulamento do array em uma classe (listagens 10.6 e 10.7) oferece as seguintes vantagens, quando comparado com o uso direto (listagem 10.5): O array alocado e seus valores inicializados em uma nica operao, no construtor da classe. Usurios do array no podem modicar seus valores, j que o array declarado como privado da classe. Seu acesso somente pode ser feito para leitura, atravs do mtodo quadrado(). Se fosse necessrio, outros mtodos poderiam possibilitar o acesso para modicao dos elementos do array. O mtodo de acesso quadrado() implementa um mecanismo simples de tratamento de erros (evitando a ocorrncia da exceo java.lang.ArrayIndexOutOfBoundsException). O encapsulamento de arrays dentro de classes traz ainda outras vantagens em potencial: podemos criar nas classes mtodos que faam operaes teis ou necessrias no array, como demonstrado pelos mtodos maiorValor() e menorValor() da classe ArrayDeFloats, mostrada na listagem 10.8.

Listagem 10.8: A classe ArrayDeFloats


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

/* Esta classe encapsula um array de floats */ class ArrayDeFloats { private float array[]; // declarao do array que ser encapsulado /* Construtor, aceita um argumento que o nmero de floats a serem armazenados */ ArrayDeFloats(int nmero) { array = new float[nmero]; // aloco memria para o array declarado anteriormente } /* Mtodo que retorna o tamanho do array encapsulado */ int tamanho() { return array.length; } /* Mtodo que retorna o array, formatado como uma String */ public String toString() { String resultado = "O array tem "+array.length+" elementos:\n"; for(int c=0;c<array.length;c++) // para cada elemento resultado += array[c]+" "; // concatena no resultado return resultado; // retorna a String criada } /* Mtodo que seta o valor na posio especificada */ void seta(int posio,float valor) { if ((posio >= 0) && (posio < array.length)) // somente se estiver na faixa de ndices array[posio] = valor; // vlidos o valor ser modificado } /* Mtodo que permite o acesso um dos valores do array */ float valor(int posio) { if ((posio >= 0) && (posio < array.length)) return array[posio]; else return 0; // valor qualquer a ser retornado } /* Mtodo que retorna o menor dos elementos do array */ float menorValor() { float menorAtAgora = array[0]; // o primeiro achado o menor at agora for(int c=1;c<array.length;c++) // verifica dentre os outros if (array[c] < menorAtAgora) // se um deles menor do que o menor at agora menorAtAgora = array[c]; // o menor at agora passa a ser aquele elemento return menorAtAgora; } Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

123
/* Mtodo que retorna o maior dos elementos do array */ float maiorValor() { float maiorAtAgora = array[0]; // o primeiro achado o maior at agora for(int c=1;c<array.length;c++) // verifica dentre os outros if (array[c] > maiorAtAgora) // se um deles maior do que o maior at agora maiorAtAgora = array[c]; // o maior at agora passa a ser aquele elemento return maiorAtAgora; } } // fim da classe ArrayDeFloats

45 46 47 48 49 50 51 52 53 54

O programa mostrado na listagem 10.9 exemplica o uso da classe ArrayDeFloats criando duas instncias da classe e usando seus diversos mtodos. Listagem 10.9: Um programa que usa instncias da classe ArrayDeFloats
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

/* Esta classe demonstra o uso da classe ArrayDeFloats */ class DemoArrayDeFloats { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Crio duas instncias da classe ArrayDeFloats ArrayDeFloats af1 = new ArrayDeFloats(10); ArrayDeFloats af2 = new ArrayDeFloats(200); // Populo a instncia af1 (somente alguns de seus elementos) af1.seta(0,3.141592f); // veja que os segundos argumentos so floats ! af1.seta(3,-9.8f); af1.seta(4,1.3e25f); af1.seta(-100,1.3e25f); // este comando no tem efeito ! // Populo a instncia af2 atravs de um lao for(int i=0;i<af2.tamanho();i++) af2.seta(i,(float)((i-1.)/(i+1.))); // frmula para popular o array // Qual so os maiores e menores valores de cada array ? System.out.println("O menor valor do primeiro array "+af1.menorValor()); System.out.println("O maior valor do primeiro array "+af1.maiorValor()); System.out.println("O menor valor do segundo array "+af2.menorValor()); System.out.println("O maior valor do segundo array "+af2.maiorValor()); // Imprimo o primeiro array System.out.println(af1); } // fim do mtodo main } // fim da classe DemoArrayDeFloats

10.2.1 Caso especial: Processando a linha de comando


Em diversos programas em Java (classes que implementam o mtodo main()) vimos que para este mtodo um nico argumento obrigatoriamente passado, e este argumento um array de Strings. Os valores contidos neste array so criados pela mquina virtual Java quando esta tenta executar um programa, usando os argumentos passados na linha de comando do sistema operacional em que esta mquina virtual esteja sendo executado. Como exemplo, considere uma classe Teste (que contenha o mtodo main()). Quando esta classe for executada com o comando java Teste, o array de Strings declarado dentro do mtodo main() ter comprimento zero, ou seja, ser vazio. Se a mesma classe for executada com o comando java Teste a1 b2 3 4 5, o array de Strings declarado dentro do mtodo main() ter comprimento 5, e seus elementos sero a1, b2, 3, 4 e 5 (todos so instncias da classe String).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

124 A linha de comando um mecanismo muito prtico e eciente para que usurios passem valores diretamente para o programa sem precisar que este interrompa a execuo para pedir valores pelo teclado, especialmente til para trabalhos em lote. A listagem 10.10 demonstra o processamento do array que o argumento do mtodo main().

Listagem 10.10: Um programa que demonstra usos da linha de comando


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

/* Esta classe demonstra o uso do array definido como argumento para a linha de comando */ class DemoLinhaDeComando { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Algum valor foi passado para a linha de comando ? if (argumentos.length == 0) System.out.println("Nenhum argumento foi passado."); else // existe alguma coisa no array ! { for(int u=0;u<argumentos.length;u++) // imprime todos os argumentos System.out.println("Argumento :"+(u+1)+":"+argumentos[u]); } } // fim do mtodo main } // fim da classe DemoLinhaDeComando /* Para java java java */ testar este programa, execute-o com os seguintes comandos: DemoLinhaDeComando DemoLinhaDeComando 1 DemoLinhaDeComando a b c

10.3

Arrays Multidimensionais

Os exemplos de arrays vistos at agora so unidimensionais: um nico ndice usado para determinar qual dos elementos do array ser acessado. Podemos tambm construir arrays multidimensionais, onde para acessarmos um elemento precisaremos de mais do que um ndice para identic-lo. Alguns exemplos simples de arrays multidimensionais so matrizes matemticas, tabuleiros de xadrez e jogos de palavras cruzadas. Estes exemplos podem ser representados por arrays bidimensionais. Um exemplo de array tridimensional seria um endereo de apartamento dentro de um bloco de prdios: o primeiro ndice indicaria em qual prdio o apartamento est localizado, o segundo indicaria o andar e o terceiro o apartamento dentro do andar. Arrays de dimenses superiores so frequentemente necessrios para clculos matemticos e simulaes. A gura 10.2 mostra alguns exemplos ilustrativos de arrays multidimensionais. Na gura10.2 vemos, esquerda, um array de caracteres de duas dimenses, cujo tamanho 9 3. direita vemos uma representao de um array de trs dimenses, onde cada elemento deve ser indicado por trs valores. A criao de arrays multidimensionais em Java simples: basta que para cada dimenso tenhamos um par de colchetes, tanto para declarar o array, quanto para alocar memria para o mesmo e acessar seus elementos. O processo de declarao, alocao e uso demonstrado pelo programa na listagem 10.11.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

125

a p c t z f l m c 6 x w 9 @ e k o n ! u 1 $ j y / I

Figura 10.2: Exemplo de arrays multidimensionais Listagem 10.11: Um programa que demonstra o uso de arrays multidimensionais
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

/* Esta classe demonstra usos de arrays multidimensionais */ class DemoArraysMultidimensionais { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Declaramos um array de doubles duas dimenses, tamanho ainda desconhecido double matriz[][]; int larg; // largura do array int alt; // altura do array // Lemos as dimenses do teclado System.out.print("Entre a largura do array:"); larg = Keyboard.readInt(); System.out.print("Entre a altura do array:"); alt = Keyboard.readInt(); // Aqui alocamos memria para o array - note que cada dimenso tem um par // de colchetes correspondentes matriz = new double[alt][larg]; // Faremos uma iterao em todos os elementos do array para entrar seus dados for(int linha=0; linha<alt; linha++) for(int coluna=0; coluna<larg; coluna++) { // Uma mensagem formatada para que os ndices aparecam de forma "natural" System.out.print("Entre o valor ["+(linha+1)+"]["+(coluna+1)+"]:"); matriz[linha][coluna] = Keyboard.readDouble(); } // fim dos laos // Podemos imprimir o array com um lao duplo semelhante ao acima: for(int linha=0; linha<alt; linha++) { for(int coluna=0; coluna<larg; coluna++) // Imprimimos o dado e uma tabulao System.out.print(matriz[linha][coluna]+"\t"); System.out.println(); // Ao fim de cada coluna, quebramos a linha } // fim do lao para as linhas } // fim do mtodo main } // fim da classe DemoArraysMultidimensionais

Arrays multidimensionais esto sujeitos s mesmas regras que arrays unidimensionais: suas dimenses devem ser valores inteiros positivos maiores do que zero, tentativas de acesso usando ndices fora dos valores permitidos resultaro em excees, etc. Assim como pode ser feito com os arrays unidimensionais, os arrays multidimensionais podem ser encapsulados em classes, facilitando o seu uso determinando exatamente que dados podem ser acessados nos arrays e de que forma podem ser acessados. Um exemplo mostrado na classe JogoDeDamas, que prov alguns mtodos para que um jogo de damas seja feito, mostrada na listagem 10.12.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

126

Listagem 10.12: Uma classe que encapsula um tabuleiro de jogo de damas


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

/* Esta classe encapsula o comportamento bsico de um jogo de damas */ class JogoDeDamas { private char tabuleiro[][]; /* Construtor, que aloca memria para o tabuleiro e inicializa as casas */ JogoDeDamas() { // Alocao simples, o tabuleiro tem sempre 8x8 posies tabuleiro = new char[8][8]; // Para ter certeza, vamos inicializar todas as peas do tabuleiro for(int l=0;l<8;l++) for(int c=0;c<8;c++) tabuleiro[l][c] = .; // inicializadas com pontos // Inicialmente, todas as peas esto em posies pr-definidas: for(int l=0;l<=1;l++) for(int c=0;c<8;c++) tabuleiro[l][c] = o; // peas normais de um jogador for(int l=6;l<=7;l++) for(int c=0;c<8;c++) tabuleiro[l][c] = x; // peas normais do outro jogador } // fim do construtor /* Mtodo que retorna uma String representando o tabuleiro. Esta String ter vrias linhas, para que a impresso fique decente. */ public String toString() { String resultado = ""; // deve ser inicializada ! for(int l=0;l<8;l++) { for(int c=0;c<8;c++) resultado += tabuleiro[l][c]; // o tabuleiro naquela posio // Incluimos uma quebra de linha no final de cada linha do tabuleiro resultado += "\n"; } return resultado; } // fim do mtodo toString } // fim da classe JogoDeDamas

10.3.1 Arrays Irregulares


Uma caracterstica interessante da maneira em que arrays multidimensionais so implementados em Java que os arrays no precisam ter o mesmo nmero de valores para cada dimenso, ou seja, possvel declararmos arrays que sejam irregulares. Por exemplo, um array irregular bidimensional poderia ter cinco linhas, e cada linha pode ter um nmero diferente de colunas - no obrigatrio que cada linha tenha o mesmo nmero de colunas. Esta caracterstica deve-se ao fato que Java trata arrays multidimensionais como arrays de arrays: desta forma um array bidimensional pode ser considerado um array unidimensional onde cada elemento outro array unidimensional que contm valores de determinado tipo. Um exemplo ilustrativo de array irregular mostrado na gura 10.3. A coluna esquerda da gura 10.3 representa o ndice da primeira dimenso do array - cada posio na primeira dimenso aponta para um array de valores inteiros. Um array irregular pode ser declarado da mesma forma que um array multidimensional regular, mas a sua alocao deve ser feita em vrios passos separados, um para cada dimenso do array. Um exemplo de uso

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

127

0 1 2 3 4

7 1 5 11 7 12 7 6 9

5 8 3 6 2 6 9 4 5 5 10 4 1

Figura 10.3: Exemplo de arrays irregulares de arrays irregulares mostrado na listagem 10.13.

Listagem 10.13: Um programa que demonstra o uso de arrays multidimensionais irregulares


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

/* Esta classe demonstra usos de arrays irregulares */ class DemoArraysIrregulares { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Declaramos um array de doubles duas dimenses, tamanho ainda desconhecido int mi[][]; int linhas; // Varivel para conter o nmero de linhas no array // Lemos as dimenses do teclado System.out.print("Entre o nmero de linhas do array:"); linhas = Keyboard.readInt(); // Aqui alocamos memria para o array, mas somente para o nmero de linhas // pedidas - para cada linha, um nmero diferente de colunas ser usado mi = new int[linhas][]; // Faremos uma iterao em todas as linhas do array para alocar um certo // nmero de colunas for(int linha=0; linha<linhas; linha++) { mi[linha] = new int[linha+1]; // Agora que a linha est alocada completamente, vamos inicializr os valores for(int coluna=0; coluna<linha+1; coluna++) mi[linha][coluna] = coluna; } // Faremos uma iterao em todos os elementos do array para entrar seus dados for(int linha=0; linha<linhas; linha++) { // Imprimimos informaes gerais sobre a linha do array irregular: note que // podemos usar a varivel interna length da forma abaixo: System.out.println("A linha "+linha+" tem "+mi[linha].length+" colunas."); System.out.print("Os valores so: "); // Para cada linha, imprimimos as colunas for(int coluna=0; coluna<linha+1; coluna++) System.out.print(mi[linha][coluna]+"\t"); System.out.println(); // Quebra de linha ao final da impresso da linha } } // fim do mtodo main } // fim da classe DemoArraysIrregulares

10.4

Arrays de instncias de classes

Assim como arrays podem representar vrias variveis de um mesmo tipo em uma nica estrutura com um nico nome, podemos representar vrias instncias de uma classe em um array. Um exemplo ilustrativo de
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

128 array de instncias de classes (considerando uma classe que contenha os dados nome, idade e telefone mostrado na gura 10.4.

0 1 2 3

{nome:"Jos" {nome:"Maria" {nome:"Ilich" {nome:"Helga"

idade:25 idade:22 idade:31 idade:21

telefone:5552010} telefone:5124005} telefone:8493819} telefone:6495032}

Figura 10.4: Exemplo de arrays de instncias de classes Arrays de instncias de classes devem ser inicializados da mesma maneira que arrays de tipos nativos. A diferena principal entre seu uso que um array de tipos nativos pode ser usado imediatamente aps alocado, enquanto que no caso de um array de instncias de classes, todas as instncias devem ser inicializadas atravs da palavra-chave new - a inicializao do array corresponde declarao de vrias variveis que so instncias da classe, mas estas ainda devem ser inicializadas. O processo mostrado nas listagens 10.14 e 10.15. Listagem 10.14: A classe Pessoa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

/* Classe que representa os dados de uma pessoa em uma agenda */ class Pessoa { // Variveis representadas pela classe private String nome; private byte idade; private int telefone; /* Um construtor vazio - veremos a necessidade dele quando formos criar um array de instncias desta classe */ Pessoa() { } /* Um construtor que inicializa todos os dados da classe atravs do mtodo inicializa */ Pessoa(String n,byte i,int t) { inicializa(n,i,t); } /* Um mtodo para inicializar os dados diretamente */ void inicializa(String n,byte i,int t) { nome = n; idade = i; telefone = t; } /* Um mtodo para retornar o contedo da classe como uma String */ public String toString() { String x = "Nome:"+nome; x += " idade:"+idade; x += " telefone:"+telefone; return x; } } // fim da classe Pessoa

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

129

Listagem 10.15: Uma classe que usa arrays de instncias da classe Pessoa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

/* Esta classe demonstra o uso de um array de instncias da classe Pessoa */ class DemoArrayPessoas { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Declaramos e ao mesmo tempo aloco um array que conter 8 instncias da classe Pessoa Pessoa lista[] = new Pessoa[8]; // Neste ponto do programa, nenhuma das instncias da classe foi inicializada ! Devemos // inicializar todas. for(int p=0;p<8;p++) lista[p] = new Pessoa(); // o construtor vazio usado // E agora podemos usar as instncias normalmente lista[3].inicializa("Jos da Silva",(byte)38,3092908); lista[7].inicializa("Maria da Silva",(byte)34,3092912); // Imprimimos alguns dos elementos String res = lista[3].toString(); // converto a instncia lista[3] para String System.out.println(res); // e imprimo System.out.println(lista[7]); // converto a instncia lista[7] para String e imprimo } } // fim da classe DemoArrayPessoas

Alguns pontos interessantes das classes nas listagens 10.14 e 10.15 so: A classe Pessoa (listagem 10.14) implementa um construtor vazio para que a inicializao de suas instncias possa ser feita em blocos, por um lao, como feito nas linhas 11 e 12 da listagem 10.15. Se somente existisse um construtor que aceitasse valores, este deveria ser chamado na linha 12 da listagem 10.15, dicultando ou impossibilitando a criao das instncias contidas no array por um lao. Mesmo com a declarao do array (linha 8 da listagem 10.15), as instncias devem ser individualmente inicializadas: qualquer tentativa de acesso uma instncia no inicializada causar uma exceo java.lang.NullPointerException. Aps a declarao e inicializao do array os elementos do mesmo podem ser usados como se fossem instncias comuns da classe. Da mesma maneira com que arrays unidimensionais e multidimensionais, arrays de instncias de classes tambm podem ser encapsulados em outra classe que facilita a construo e manipulao do array. Esta abordagem permite, em muitos casos, que a complexidade dos arrays seja encapsulada ou escondida dentro das classes, e que um programador que use estas classes somente se preocupe com os mtodos que permitem acesso aos dados encapsulados. Esta abordagem demonstrada pela classe ListaDePessoas, mostrada na listagem 10.16.

Listagem 10.16: Uma classe que encapsula arrays de instncias da classe Pessoa
1 2 3 4 5 6 7 8 9 10

/* Esta classe encapsula um array de instncias da classe Pessoa dentro de outra classe, facilitando o seu uso posterior. */ class ListaDePessoas { // A Lista de Pessoas declarada como um array de instncas private Pessoa lista[]; /* Construtor, que aloca memria para um nmero especficos de instncias */ ListaDePessoas(int quantas) { lista = new Pessoa[quantas]; // aloca memria para o array Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

130
for(int q=0;q<quantas;q++) { lista[q] = new Pessoa(); // aloca usando o construtor vazio } } // fim do construtor /* Mtodo que inicializa certa pessoa na lista. Note que uma instncia da classe Pessoa passada como argumento. O mtodo no permite acessos fora da faixa. */ void setaDados(int qual,Pessoa quem) { if ((qual < 0) || (qual >= lista.length)) // fora da faixa ! { System.out.println("Erro ! Somente existem "+lista.length+ "pessoas na lista"); // imprime mensagem de erro } else // valor do ndice est dentro da faixa lista[qual] = quem; } /* Mtodo que retorna a lista inteira formatada como uma String */ public String toString() { String resultado = ""; // deve ser inicializada ! for(int quem=0;quem<lista.length;quem++) { // Pedimos cada elemento do array, que uma instncia da classe Pessoa, que se // concatene com uma String, chamando implicitamente o mtodo toString da classe Pessoa resultado += "- "+lista[quem]+"\n"; } return resultado; } } // fim da classe ListaDePessoas

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Listagem 10.17: Uma classe que demonstra o uso da classe ListaDePessoas


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

/* Esta classe demonstra o uso da classe ListaDePessoas, que encapsula um array de instncias da classe Pessoa */ class DemoListaDePessoas { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { // Criamos uma instncia da classe ListaDePessoas ListaDePessoas festaDoBolinha = new ListaDePessoas(4); // Criamos e inicializamos quatro instncias da classe Pessoa Pessoa b = new Pessoa("Bolinha",(byte)11,3104972); Pessoa g = new Pessoa("Glorinha",(byte)10,3945123); Pessoa r = new Pessoa("Raposo",(byte)12,6487325); Pessoa l = new Pessoa("Luluzinha",(byte)10,4981027); // Colocamos as quatro instncias da classe Pessoa na instncia da ListaDePessoas. festaDoBolinha.setaDados(0,b); festaDoBolinha.setaDados(1,g); festaDoBolinha.setaDados(2,r); festaDoBolinha.setaDados(3,l); // Imprimimos todo o contedo da instncia System.out.println(festaDoBolinha); } } // fim da classe DemoListaDePessoas

importante notar que, no exemplo mostrado na listagem 10.17, instncias diferentes da classe Pessoa devem ser passadas como argumento para o mtodo setaDados() da classe ListaDePessoas j que estas sero simplesmente copiadas para os elementos do array encapsulado (linha 26 da listagem 10.16).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

131

10.5

Exerccios do captulo 10

Exerccio 10.1: Escreva um programa em Java que crie um array de valores de ponto utuante de 150 posies, calcule o fatorial de cada uma destas posies e guarde o valor do fatorial no elemento correspondente do array. Ao nal do clculo, a posio 0 do array deve conter 0, a posio 1 deve conter 1, a posio 2 deve conter 2, a posio 3 deve conter 6, a posio 4 deve conter 24 (4!), etc. Use a classe ProbabilidadeBasica (listagem 8.15) para os clculos. Exerccio 10.2: O que aconteceria se tentssemos passar um array de inteiros para o mtodo imprimeArrayDeLongs() no programa na listagem 10.3 ? Exerccio 10.3: Corrija o programa mostrado na listagem 10.5 para que o programa mostre o valor quadrado somente se o usurio digitar valores dentro da faixa. Dica: use um while para garantir que o usurio digitou um valor vlido. Exerccio 10.4: Os mtodos setaValor() e pegaValor() na classe ListaDeNomes (listagem 10.6) apresentam erros em potencial: caso um valor maior do que o comprimento do array ou menor do que zero sejam passados para estes mtodos, uma exceo ir ocorrer. Corrija os mtodos de forma que se valores invlidos para as posies dos arrays sejam passados, uma mensagem de erro seja mostrada. Exerccio 10.5: Modique o construtor da classe ArrayDeQuadrados (listagem 10.6) para que o usurio no possa especicar um nmero menor do que um para o construtor. Exerccio 10.6: Modique o programa na listagem 10.11 para que o usurio no possa entrar valores menores do que um para as dimenses da matriz. Exerccio 10.7: Escreva um programa em Java que declare e inicialize um vetor de booleanos (lendo-os do teclado), e calcule quantos elementos so iguais a true. Exerccio 10.8: Escreva um programa em Java que declare um array de inteiros e os popule de forma que o valor do elemento do array seja igual ao dobro do seu ndice (de forma que o elemento 15 do array valha 30). Exerccio 10.9: Escreva uma classe em Java que encapsule um array de 12 bytes, onde cada elemento do array contm o nmero de dias no ms correspondente, desconsiderando se o ano bissexto ou no. Por exemplo, o elemento 0 do array (correspondente a Janeiro) deve valer 31. Escreva um mtodo que retorne o valor encapsulado para determinado ms.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

132

Exerccio 10.10: Escreva um programa em Java que crie um array de Strings e o popule (atravs da leitura dos seus elementos pelo teclado). Aps isto, faa com que o programa calcule e imprima quantas Strings tem menos do que dez caracteres. Exerccio 10.11: Escreva um programa em Java que crie um array de Strings e o popule (atravs da leitura dos seus elementos pelo teclado). Aps isto, faa com que o programa imprima os trs primeiros caracteres de cada String do array. Dica: verique se a String tem trs ou mais caracteres antes de tentar imprimi-los. Exerccio 10.12: Escreva um programa que declare um array bidimensional tabuada de 10 10 posies e popule os elementos do array com os valores da tabuada para aquele elemento, de forma que, por exemplo, o elemento tabuada[7][9] valha 63. Exerccio 10.13: Escreva um programa em Java que crie um array de Strings a partir dos valores passados pela linha de comando. Dica: os dados passados pela linha de comando j so um array, basta declarar um com o mesmo tamanho e copiar elemento por elemento. Exerccio 10.14: Usando o exerccio 10.12 como base, escreva um programa que declare um array de cinco dimenses tabuada de 10 10 10 10 10 posies e popule os elementos do array com os valores da tabuada para aquele elemento, de forma que, por exemplo, o elemento tabuada[6][5][2][1][4] valha 240. Quantas posies este array contm ? Exerccio 10.15: Considere a classe ArrayDeFloats (listagem 10.8). Crie nesta classe mais trs mtodos que podem ser eventualmente teis: quantosZeros() que conta quantos elementos do array encapsulado so iguais a zero, mdia() que calcula a mdia dos elementos no array encapsulado e existe() que recebe um valor do tipo oat e retorna true se este valor existe no array encapsulado ou false se no existir. Exerccio 10.16: Escreva uma classe que represente uma matriz 2 2 usando um array de duas dimenses. Nesta classe, escreva um mtodo que calcule o determinante desta matriz, e um mtodo que permita a impresso formatada dos seus valores (duas linhas com dois valores cada). x00 x01 Se a matriz M dada por: ento o determinante calculado como (x00 x11 ) (x01 x10 ). x10 x11 Exerccio 10.17: Usando o exerccio 10.16 como base, escreva uma classe que represente uma matriz 3 3 usando um array de duas dimenses. Nesta classe, escreva um mtodo que calcule o determinante desta matriz, e um mtodo que permita a impresso formatada dos seus valores (duas linhas com dois valores cada). x00 x01 x02 Se a matriz M dada por: x10 x11 x12 ento o determinante calculado como (x00 x11 x12 ) + x20 x21 x22 (x01 x12 x20 ) + (x02 x10 x21 ) (x00 x12 x21 ) (x01 x10 x22 ) (x02 x11 x20 )

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

133

Exerccio 10.18: Escreva um programa em Java que verique se o usurio usou o argumento -help ou -h na linha de comando. Exerccio 10.19: Escreva uma classe em Java que encapsule um array de caracteres, simulando uma String. Esta classe deve ter um construtor que recebe uma String como argumento - a partir desta String o nmero de elementos do array e os valores de cada elemento podem ser obtidos. Exerccio 10.20: Escreva uma classe que represente uma matriz de caracteres: o construtor desta classe deve receber a largura e altura desta matriz e inicializar os elementos com caracteres aleatrios. A classe deve ter um mtodo para imprimir o array. Dica: caracteres aleatrios podem ser obtidos com a expresso (char)(A+Math.random()*26). Exerccio 10.21: Ao nal da listagem 10.16 foi comentado que instncias diferentes da classe Pessoa devem ser passadas como argumento para o mtodo setaDados() da classe ListaDePessoas. Podemos evitar esta imposio se o mtodo setaDados() receber, ao invs de uma instncia da classe Pessoa, os dados que so representados por esta classe (uma String, um byte e um int). Modique o mtodo setaDados() da classe ListaDePessoas para reetir esta soluo. Exerccio 10.22: Considere o exerccio 8.13. Reescreva a classe Histograma para que esta use um array de inteiros. Os valores podem ser passados um a um para o array, usando um mtodo similar ao seta() na classe ArrayDeFloats (listagem 10.8). Exerccio 10.23: Considere a classe ArrayDeFloats (listagem 10.8). Crie nesta classe o mtodo troca() que recebe dois valores inteiros como argumentos e troca os valores nas posies especicadas pelos argumentos. Por exemplo, se o array encapsulado {3.6, 2.7, 8.0, 9.2, 1.5, 4.1} e o mtodo troca() for chamado com os argumentos 1 e 4, os elementos nestes ndices sero trocados de forma que o array ser {3.6, 1.5 , 8.0, 9.2, 2.7 , 4.1} (note os valores que foram trocados). Dica: s possvel fazer esta troca usando um valor temporrio do tipo oat. Exerccio 10.24: Usando o exerccio 10.23 como base, reescreva o mtodo para que este somente troque os valores caso o valor indicado pelo primeiro ndice passado como argumento seja menor que o valor indicado pelo segundo argumento. Por exemplo, se o array encapsulado for {3.6, 2.7, 8.0, 9.2, 1.5, 4.1}, uma chamada ao mtodo troca(0,1) trocaria os valores nas posies 0 e 1, mas uma chamada ao mtodo troca(1,2) no trocaria os valores de ndices 1 e 2 de posio. Exerccio 10.25: Usando o exerccio 7.2 como base, escreva um programa em Java que crie um array de instncias da classe RegistroDeAluno. Veja tambm a listagem 3.6.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

134

Exerccio 10.26: Crie uma classe em Java que encapsule um array de Strings, e um mtodo nesta classe que retorne o nmero de espaos em todas as Strings do array. Use o exerccio 9.13 como base. Exerccio 10.27: Crie um programa em Java que declare e inicialize trs arrays de valores de ponto utuante, popule os dois primeiros com valores lidos do teclado, e calcule os valores dos elementos do terceiro array com a soma dos elementos correspondentes dos dois primeiros arrays. Por exemplo, se os dois primeiros arrays forem {0, 4, 2, 6} e {9, 2, 1, 1} o terceiro array dever ser {9, 6, 3, 7}. O tamanho dos arrays tambm deve ser lido do teclado. Exerccio 10.28: Usando o exerccio 10.27 como base, escreva um programa em Java que declare quatro arrays, sendo que dois so de entrada (devendo ter seus valores lidos do teclado) e os outros dois vo conter, respectivamente, os maiores e menores valores, tomados elemento a elemento, dos dois arrays de entrada. Por exemplo, se os dois primeiros arrays forem {0, 4, 2, 6} e {9, 2, 1, 1} o terceiro array dever ser {9, 4, 2, 6} e o quarto, {0, 2, 1, 1}. O tamanho dos arrays tambm deve ser lido do teclado. Exerccio 10.29: Escreva uma classe Menu em Java que encapsule um array de Strings. Nesta classe, crie o mtodo escolhe() que mostra as Strings com um nmero na frente, espere o usurio digitar um nmero e retorne a String correspondente quele nmero. Dicas: faa com que o usurio seja impossibilitado de digitar nmeros fora da faixa com um lao while, e faa com que os nmeros a serem impressos antes das Strings sejam mais amigveis do que os ndices - por exemplo, o valor do ndice mais um mais amigvel para usurios. Exerccio 10.30: Reescreva o exerccio 8.26 para que os valores sejam lidos da linha de comando. Dicas: os valores numricos tero que ser convertidos de Strings para valores de ponto utuante: isso pode ser feito com o mtodo valueOf() da classe Double (seo A.2.2.7). O programa deve imprimir mensagens de erro para divises por zero e nmeros de argumentos diferentes de trs. Exerccio 10.31: Crie um programa em Java que declare e inicialize dois arrays unidimensionais do mesmo tamanho, e calcule o produto escalar destes dois arrays. Por exemplo, se os dois arrays forem {9, 2, 6, 7, 0} e {1, 4, 5, 9, 2} o produto escalar ser 9 1 2 4 6 5 + 7 9 + 0 2 = 34.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

135

Exerccio 10.32: Escreva um programa em Java que declare e inicialize dois arrays bidimensionais (matrizes) e multiplique estras matrizes, criando uma terceira matriz como resultado. A multiplicao das matrizes A e B resultando na matriz C pode ser vista como: b11 b12 b13 b21 b22 b23 b31 b32 b33 b41 b42 b43 a11 a12 a13 a14 c11 c12 c13 a21 a22 a23 a24 c21 c22 c23 onde c11 = b11 a11 + b21 a12 + b31 a13 + b41 a14 , c12 = b12 a11 + b22 a12 + b32 a13 + b42 a14 , c13 = b13 a11 + b23 a12 + b33 a13 + b43 a14 , c21 = b11 a21 + b21 a22 + b31 a23 + b41 a24 , c22 = b12 a21 + b22 a22 + b32 a23 + b42 a24 e c23 = b13 a21 + b23 a22 + b33 a23 + b43 a24 . Exerccio 10.33: Considerando o exerccio 10.1, escreva uma classe Fatorial que contenha um construtor e um mtodo valor() que recebe um valor inteiro como argumento e que retorna um valor de ponto utuante. O construtor, quando chamado, dever alocar um array de 150 posies e calcular o fatorial de 0 a 149, guardando os resultados no array. O mtodo valor(), quando chamado, dever retornar o valor do fatorial correspondente ao valor passado como argumento. Exerccio 10.34: O crivo de Eratstenes um algoritmo usado para calcular nmeros primos que primeiro popula um array de valores sequenciais e vai peneirando os valores que so compostos de mltiplos. Implemente um programa em Java que, usado o crivo de Eratstenes, calcule os 10.000 primeiros nmeros primos. O programa pode comear com um array de valores booleanos, que so todos true, e a partir do valor 2 vai peneirando (marcando como false todos os valores mltiplos de 2 maiores que 2, depois mltiplos de 3 maiores que 3, etc. Ao nal do algoritmo, os valores que valerem true no array so nmeros primos. Dica: para entender melhor o algoritmo, rode uma simulao em papel antes. Exerccio 10.35: Escreva um mtodo que retorne true se os valores de um array (numrico) esto em ordem crescente ou false se no estiverem. Veja o mtodo imprimeArrayDeLongs() na classe DemoArray (listagem 10.3) para ver como passar um array para um mtodo. Exerccio 10.36: Considere a classe ArrayDeFloats (listagem 10.8). Escreva nesta classe o mtodo reverte() que reverte a posio dos elementos no array de forma que o primeiro passe a ser o ltimo e vice-versa. Dica: use o exerccio 10.23 como base.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

136

Exerccio 10.37: Considere o exerccio 10.29. Escreva uma classe ItemDeMenu que encapsule uma String com uma descrio de menu de restaurante, e um valor de ponto utuante correspondente ao preo daquele item. Modique a classe Menu do exerccio 10.29 para que esta encapsule um array de instncias da classe ItemDeMenu, e tenha um mtodo que permita ao usurio fazer uma escolha. Dica: veja tambm a listagem 10.16. Exerccio 10.38: Usando o exerccio 10.30 como base, escreva uma calculadora que aceite ao menos dois argumentos da linha de comando, sendo que o primeiro deve ser uma String contendo ou o caracter + ou o caracter *, e o resto da linha de comando devem ser valores de ponto utuante. A primeira String determina a operao que deve ser aplicada aos valores passados, de forma que se o programa for chamado com * 2 8 5 este deve imprimir o resultado 80. Exerccio 10.39: Um algoritmo simples de ordenao de arrays que coloca os valores de um array numrico em ordem crescente pode ser descrito como: Faa um lao do primeiro elemento do array at o penltimo. Use a varivel i para representar o contador deste lao. Faa um lao dentro do anterior que percorra o array do elemento seguinte at o nal do array. Use a varivel j para representar o contador deste lao. Se o valor indicado pelo ndice i for menor do que o valor indicado pelo ndice j, troque os valores do array. Dica: veja os exerccios 10.23 e 10.24. Exerccio 10.40: Crie a classe ArrayDeFloatsUnicos que herda da classe ArrayDeFloats (listagem 10.8). A diferena entre as classes que o mtodo seta() da classe ArrayDeFloats deve ser sobreescrito para somente colocar valores no array encapsulado na classe se este valor no existir ainda, fazendo com que todos os valores do array encapsulado sejam nicos. Por exemplo, se j houver um valor 3.8 no array encapsulado, o mtodo seta() deve retornar sem modicar o array. Exerccio 10.41: Crie uma classe Banco que encapsule um array de instncias da classe ContaBancaria (mostrada na listagem 3.8). Crie nesta classe um mtodo total() que soma o total dos valores depositados nas diversas contas bancrias no banco. Use a listagem 10.16 como referncia.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

137

Exerccio 10.42: Crie uma classe EntradaEmAgenda que contenha os dados necessrios para armazenar uma entrada de agenda (hora, dia, ms, ano, assunto). Crie nesta classe, alm do construtor vazio e um mtodo toString(), um mtodo para inicializar os dados, um mtodo NoDia que recebe valores de dia, ms e ano e retorna true se o dia, ms e ano daquela instncia da classe forem iguais aos argumentos passados. Crie um mtodo similar chamado NoMs que recebe valores de ms e ano somente e retorna true se o ms e ano daquela instncia da classe forem iguais aos argumentos passados. Crie tambm uma classe Agenda que encapsule uma agenda de compromissos, que ser representado por uma rray de instncias da classe EntradaEmAgenda. Crie um mtodo listaDia() que recebe valores de dia, ms e ano e lista todas as instncias de EntradaEmAgenda que caem naquele dia, ms e ano, e um mtodo listaMs() que recebe valores de ms e ano e lista todas as instncias de EntradaEmAgenda que caem naquele ms e ano. Exerccio 10.43: Considere o mtodo existe() na classe ArrayDeFloats (que deve ter sido criado no exerccio 10.15. Este mtodo deve percorrer todo o array para se certicar que o valor passado como argumento existe ou no no array encapsulado. Existe um algoritmo mais eciente de procura de valores em arrays chamado busca binria, que somente funciona em arrays ordenados (veja o exerccio 10.39). Os passos deste algoritmo so: 1. 2. 3. 4. 5. 6. 7. 8. Considere o valor a ser procurado como sendo S. Considere o primeiro valor do array como sendo F e seu ndice iF. Considere o ltimo valor do array como sendo L e seu ndice iL. Localize o elemento cujo ndice esteja no meio do array (exatamente entre as posies iF e iL). Considere este valor como sendo M e seu ndice iM. Se S > M, faa iF = iM, faa F = M e v para o passo 4. Se S < M, faa iL = iM, faa L = M e v para o passo 4. Se S == M, S == F ou S == L termine o algoritmo retornando a posio onde o valor S foi encontrado (respectivamente iM, iF ou iL). Se a diferena entre iF e iL for 1, termine o algoritmo retornando 1 (signicando que o valor no foi encontrado).

Dica: eventualmente no haver um ndice entre F e L (por exemplo, se F=2 e L=5). Neste caso, qualquer uma das alternativas para o ndice do meio pode ser usada. Existem outras variaes que do resultados melhores (buscas mais rpidas, com menos comparaes) - voc consegue imaginar alguma ? Exerccio 10.44: Modique a classe Menu criada no exerccio 10.37 para que alm do array de instncias da classe ItemDeMenu, a classe tambm armazene um array de valores inteiros com o mesmo nmero de elementos do array de instncias de ItemDeMenu. Este array adicional servir para acumular pedidos, ou seja, para cada item que for escolhido pelo mtodo escolhe() o elemento correspondente do array ser incrementado em um. Escreva na classe Menu um mtodo que imprima uma nota scal como as de supermercado, contendo os totais parciais (valor de cada item vezes o preo de cada item escolhido) e o total geral.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

138

Exerccio 10.45: Crie uma classe que represente um jogo da velha, usando uma matriz de duas dimenses para representar as posies do jogo. A matriz deve ser alocada no construtor da classe, ter o tamanho 3 3 e ser de um tipo que suporte trs estados possveis: vazio, preenchido com O e preenchido com X. A classe deve poder ser usada para jogos com dois jogadores. Dica: A classe deve ter os seguintes mtodos: jogaO(), que aceita dois valores que so as coordenadas onde um O ser jogado, e marca na matriz a posio somente se esta estiver livre. jogaX(), que aceita dois valores que so as coordenadas onde um X ser jogado, e marca na matriz a posio somente se esta estiver livre. verifica(), que verica a matriz para ver se existe algum ganhador (este mtodo deve vericar se existem trs marcas iguais que no sejam vazias em uma horizontal, vertical ou diagonal da matriz). imprime(), que imprimir a matriz do jogo com as posies atuais. Escreva tambm um programa que use a classe. Este programa deve executar um lao no qual ca perguntando as posies para os jogadores alternadamente, enquanto no houver vitria, desistncia ou acabarem as posies vazias da matriz. Exerccio 10.46: O jogo japons Go jogado por duas pessoas em um tabuleiro quadrado de tamanho 1919. Cada pessoa recebe um conjunto de peas pretas e brancas que devem ser colocadas alternadamente no tabuleiro, na posio que o jogador desejar. Ganha o jogo o primeiro jogador que conseguir colocar cinco de suas peas em uma linha reta horizontal, vertical ou diagonal. Crie uma classe em Java que represente um jogo de go, usando uma matriz de duas dimenses para representar as posies do jogo. A matriz deve ser alocada no construtor da classe, ter o tamanho 19 19 e ser de um tipo que suporte trs estados possveis: vazio, preenchido com pea preta e preenchido com pea branca. A classe deve poder ser usada para jogos com dois jogadores. A classe deve ter os seguintes mtodos: jogaPreta(), que aceita dois valores que so as coordenadas onde uma pea preta ser jogada, e marca na matriz a posio somente se esta estiver livre. jogaBranca(), que aceita dois valores que so as coordenadas onde uma pea branca ser jogada, e marca na matriz a posio somente se esta estiver livre. verifica(), que verica a matriz para ver se existe algum ganhador (este mtodo deve vericar se existem cinco peas iguais que no sejam vazias em uma horizontal, vertical ou diagonal da matriz, depois de cada jogada feita). imprime(), que imprimir a matriz do jogo com as posies atuais. Dica: O algoritmo do jogo no to diferente do jogo da velha (exerccio 10.45), exceto pelo mtodo verifica(). Este mtodo pode, para cada posio do array bidimensional, ver se existem linhas de cinco peas iguais contadas a partir da posio sendo procurada. O nico cuidado adicional garantir que o algoritmo no procurar peas fora do tabuleiro.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

139

Exerccio 10.47: Escreva uma classe em Java que use um array irregular para representar um Tringulo de Pascal. O tringulo de Pascal uma srie de sries de valores onde cada valor obtido somando-se o valor acima (linha anterior) e o valor esquerda do valor acima. Parte do tringulo de Pascal mostrado abaixo. 1 1 1 1 1 1 1 1 2 3 4 5 6 7 1 3 1 6 4 10 10 15 20 21 35

1 5 15 35

1 6 21

1 7

Dicas: cada linha l do array irregular ter l + 1 colunas. A primeira coluna de cada linha do array vale 1, e a segunda vale o ndice da linha mais um. Cada linha do array reexiva, podendo ser lida da direita para a esquerda ou da esquerda para a direita da mesma forma. Exerccio 10.48: possvel embutir um pouco de Inteligncia Articial no jogo da velha do exerccio 10.45, fazendo com que um jogador jogue contra o computador. Quando for a vez do computador jogar, as coordenadas onde este colocar sua pea no sero entradas via teclado: a prpria classe pode escolher a melhor posio vazia para jogar sua pea baseado na seguinte heurstica (srie de passos que podem levar soluo de um problema): Para cada posio desocupada no tabuleiro, some: Mais dois pontos se a posio for a central, Mais um ponto se a posio for nos quatro cantos da matriz, Menos dois pontos se j houver uma ou mais peas do adversrio na linha, coluna ou diagonal onde a posio se encontra, Mais quatro pontos se a posio impedir a vitria do adversrio, Mais quatro pontos se a posio levar a uma vitria, Ao nal do clculo, escolher a posio que teve maior nmero de pontos. Para exemplicar, considere a matriz abaixo que representa um jogo em andamento, onde o computador joga com as peas O:

X O X

1 2 no 0 0 +2

no 2 no

Neste exemplo, a melhor posio para o computador jogar seria aquela cujo valor +2. As posies marcadas com no j estariam ocupadas. Usando o exerccio 10.45 como base, escreva um mtodo jogaComputador() que calcule a melhor posio para jogo e efetue a jogada. Outras partes da classe devero ser reescritas, por exemplo, para permitir que o usurio decida se vai jogar com os X ou O e quem ser o primeiro a jogar. Dica: a classe pode conter outra matriz, do mesmo tamanho do tabuleiro do jogo da velha, que ser reinicializada e calculada com o algoritmo acima a cada jogada do computador.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

140

Exerccio 10.49: Tambm possvel adaptar a classe criada no exerccio 10.46 para que o computador possa jogar com o usurio, usando alguma inteligncia para decidir onde posicionar suas peas. A heurstica para que o computador decida qual posio melhor para jogar uma pea pode ser: Menos dois pontos para cada pea do adversrio que estiver exer:arrays-menuitem2na vizinhana direta 7 7 e mais dois pontos para cada pea do computador que estiver nesta vizinhana, Menos quatro pontos para cada pea do adversrio que estiver na vizinhana direta 5 5 e mais quatro pontos para cada pea do computador que estiver nesta vizinhana, Menos oito pontos para cada pea do adversrio que estiver na vizinhana direta 3 3 e mais oito pontos para cada pea do computador que estiver nesta vizinhana, Menos um ponto para cada pea do adversrio que estiver na vizinhana indireta 7 7 e mais um ponto para cada pea do computador que estiver nesta vizinhana. A gura abaixo mostra, para uma determinada posio, quais so as posies que correspondem s vizinhanas:
Posio central (sendo considerada) Vizinhana direta 3x3 Vizinhana direta 5x5 Vizinhana direta 7x7 Vizinhana indireta 7x7

Usando o exerccio 10.46 como base, escreva um mtodo jogaComputador() que calcule a melhor posio para jogo e efetue a jogada. Outras partes da classe devero ser reescritas, por exemplo, para permitir que o usurio decida se vai jogar com as peas pretas ou brancas e quem ser o primeiro a jogar. Dica: veja tambm o enunciado do exerccio 10.48. Exerccio 10.50: Adeque o exerccio 10.44 para que este seja capaz de representar uma livraria. A classe Menu pode ser chamar Livraria, e ao invs de usar um array de instncias da classe ItemDeMenu dever usar um array de instncias da classe LivroDeLivraria que deve representar o ttulo do livro, o nome do autor, o preo de revenda, o nmero de livros em estoque, o ISBN (ndice nico) e uma ou mais palavras-chave sobre o tema do livro. A classe LivroDeLivraria deve ter um mtodo onde passamos os dados para encapsulamento, um mtodo toString() e mtodos que permitam a procura por ttulo, nome do autor e palavras-chave (este mtodos devem receber Strings e usar o mtodo substring() para ver se o contedo aproximadamente equivalente). A classe Livraria deve ter um construtor onde passamos o nmero mximo de ttulos de livros que teremos em estoque, e um mtodo para procurar, no array de instncias da classe LivroDeLivraria, livros cujos ttulos, autores ou palavras-chave correspondam a uma String entrada. Esta classe deve ter um mtodo menu que permita ao usurio sair do sistema, comprar um livro, fazer uma procura pelo nome do autor, ttulo ou palavra-chave e vericar sua lista de pedidos. Dica: considere o funcionamento de uma livraria virtual na Internet para criar os mtodos da classe Livraria.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

141

Exerccio 10.51: O Jogo da Vida um algoritmo de simulao com aplicaes e resultados visuais interessantes. Ele simula uma colnia de clulas em uma grade retangular onde cada elemento da grade pode conter ou no uma clula (veja gura abaixo). O jogo se desenvolve em vrias iteraes, onde a cada uma destas iteraes o nmero de vizinhos populados imediatos (numa vizinhana 3 3) de cada clula calculado, e caso este nmero seja exatamente igual a trs (incluindo a prpria clula), uma clula poder existir naquela posio na iterao seguinte.

Situao Inicial
1 2 1 3 3 4 3 3

Primeira Iterao
1 2 2 2 2 2 2 2 2 2

Segunda Iterao
2 2 2 2 2 2 2 2 2

3 3 3 3

3 5 3 5 8 5 3 5 3

3 3 3 3

2 2 2 2

2 2 2

5 3 5 4 4 5 4 3 5 4 5 5 5 3 4 5 4 3

A gura acima mostra trs iteraes do jogo numa rea 11 11, onde para cada clula seu nmero de vizinhos mostrado, para facilitar a compreenso. Na situao inicial, existem quatro grupos distintos de clulas com formatos diferentes. Na primeira iterao, das trs clulas que existiam no canto superior esquerdo, somente a central sobreviveu, pois numa vizinhana 3 3 somente esta tinha 3 vizinhos. No grupo de clulas do canto superior direito, vemos que a clula central, que tinha quatro vizinhos, desapareceu. Na segunda iterao vemos que os grupos acabam se misturando. Uma sequncia mais completa das iteraes mostrada na gura abaixo, que demonstra que eventualmente possvel que a colnia de clulas se estabilize.
Situao inicial Primeira iterao Segunda iterao Terceira iterao Quarta iterao Quinta iterao

Escreva uma classe em Java que simule o jogo da vida para vrias conguraes (tamanho da matriz que representar a colnia de clulas, nmero e posio da populao inicial de clulas). Esta classe deve ter os mtodos sugeridos: construtor, que recebe o tamanho da colnia e inicializa uma matriz do tamanho especicado, popula(), que popula a colnia aleatoriamente com clulas, itera(), que calcula uma iterao da colnia, imprime(), que imprime a situao atual da colnia, usando caracteres * para representar clulas e . para representar espaos em branco. Dicas: O clculo do nmero de vizinhos de uma clula entre uma iterao e outra deve envolver uma matriz intermediria, caso contrrio o nmero de vizinhos de clulas subsequentes sero calculados incorretamente ! O mtodo Math.random() retorna um nmero aleatrio entre zero e um.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

Sexta iterao

Stima iterao

Oitava iterao

Nona iterao

Dcima iterao

Dcimaprimeira iterao

142

Captulo 11 Funes Matemticas


11.1 Funes Matemticas em Java

A classe Math, presente em todas as mquinas virtuais Java, contm algumas constantes e vrios mtodos estticos para clculo de funes matemticas diversas. Por serem estticos, estes mtodos devem ser chamados com o nome da classe, por exemplo, Math.random(). Este captulo apresenta alguns destes mtodos.

11.2

Constantes da classe Math

A constante Math.PI, do tipo double, corresponde ao valor mais prximo de (3.141592653589793) que pode ser representado por um valor do tipo double. A constante Math.E, do tipo double, corresponde ao valor mais prximo de e (a base dos logaritmos naturais, 2.718281828459045) que pode ser representado por um valor do tipo double. Exemplos de uso destas constantes so mostrados no programa na listagem 11.1. Listagem 11.1: Um programa que demonstra usos das constantes da classe Math
1 2 3 4 5 6 7 8 9 10 11 12

/* Uma classe com mtodo main que demonstra as constantes da classe Math */ class DemoMath { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { double pi = Math.PI; double e = Math.E; System.out.println("O valor de pi "+pi); System.out.println("O valor de e "+e); } // fim do mtodo main } // fim da classe DemoMath

11.3

Mtodos de comparao e arredondamento da classe Math

O mtodo max() recebe dois valores como argumentos e retorna o maior dos dois valores. Este mtodo tambm polimrco, aceitando argumentos do tipo int, long, oat e double. O valor retornado ser do tipo mais apropriado: por exemplo, se o mtodo for chamado com um valor do tipo oat e outro do tipo int, o resultado ser do tipo oat.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

143 O mtodo min() recebe dois valores como argumentos e retorna o menor dos dois valores. Este mtodo tambm polimrco, seguindo as mesmas regras mostradas para o mtodo max(). O mtodo abs() retorna o valor absoluto do argumento passado. Se o valor passado x, o valor absoluto corresponde a x se x 0 ou -x se x < 0. Este mtodo polimrco, aceitando argumentos do tipo int, long, oat e double e retornando valores do mesmo tipo do argumento. O mtodo round() retorna o valor inteiro mais prximo do valor de ponto utuante passado como argumento, descartando no processo as casas decimais, e pode ser usado para arredondamento de valores de ponto utuante. Este mtodo tambm polimrco: se um argumento do tipo oat for passado, o mtodo retornar um valor do tipo inteiro, mas se um argumento do tipo double for passado o mtodo retornar um valor do tipo long. O mtodo floor() recebe um valor do tipo double como argumento e retorna um valor do tipo double contendo o valor passado arredondado para baixo (mais prximo de in f ty). O mtodo ceil() recebe um valor do tipo double como argumento e retorna um valor do tipo double contendo o valor passado arredondado para cima (mais prximo de +in f ty). Exemplos de uso destes mtodos so mostrados no programa na listagem 11.2. Listagem 11.2: Um programa que demonstra usos de mtodos de comparao e arredondamento da classe Math
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

/* Uma classe com mtodo main que demonstra os mtodos de comparao e converso da classe Math */ class DemoMath { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { float v1 = 123456.78f; float v2 = -12.34f; System.out.println("max("+v1+","+v2+")="+Math.max(v1,v2)); // 123456.78 System.out.println("min("+v1+","+v2+")="+Math.min(v1,v2)); // -12.34 System.out.println("abs("+v1+")="+Math.abs(v1)); // 123456.78 System.out.println("abs("+v2+")="+Math.abs(v2)); // 12.34 System.out.println("round("+v1+")="+Math.round(v1)); // 123457 System.out.println("round("+v2+")="+Math.round(v2)); // -12 System.out.println("floor("+v1+")="+Math.floor(v1)); // 123456.0 System.out.println("floor("+v2+")="+Math.floor(v2)); // -13.0 System.out.println("ceil("+v1+")="+Math.ceil(v1)); // 123457.0 System.out.println("ceil("+v2+")="+Math.ceil(v2)); // -12.0 } // fim do mtodo main } // fim da classe DemoMath

11.4

Mtodos trigonomtricos da classe Math

O mtodo sin() retorna o valor do seno do ngulo especicado em radianos e passado como argumento para o mtodo. Tanto o valor do ngulo quanto o valor de retorno do mtodo so do tipo double. O mtodo cos() retorna o valor do coseno do ngulo especicado em radianos e passado como argumento para o mtodo. Tanto o valor do ngulo quanto o valor de retorno do mtodo so do tipo double.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

144 O mtodo tan() retorna o valor da tangente do ngulo especicado em radianos e passado como argumento para o mtodo. Tanto o valor do ngulo quanto o valor de retorno do mtodo so do tipo double. Exemplos de uso destes mtodos so mostrados no programa na listagem 11.3. Listagem 11.3: Um programa que demonstra usos de mtodos trigonomtricos da classe Math
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

/* Uma classe com mtodo main que demonstra os mtodos trigonomtricos da classe Math */ class DemoMath { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { double ang0 = 0.; // zero graus = zero radianos double ang45 = Math.PI/4.; // 45 graus = pi/4 radianos double ang90 = Math.PI/2.; // 90 graus = pi/2 radianos double ang135 = 3.*Math.PI/4.; // 135 graus = 3pi/4 radianos System.out.println("seno("+ang0+")="+Math.sin(ang0)); // 0 System.out.println("seno("+ang45+")="+Math.sin(ang45)); // sqrt(2)/2 System.out.println("seno("+ang90+")="+Math.sin(ang90)); // 1 System.out.println("seno("+ang135+")="+Math.sin(ang135)); // sqrt(2)/2 System.out.println("coseno("+ang0+")="+Math.cos(ang0)); // 1 System.out.println("coseno("+ang45+")="+Math.cos(ang45)); // sqrt(2)/2 System.out.println("coseno("+ang90+")="+Math.cos(ang90)); // 0 (quase) System.out.println("coseno("+ang135+")="+Math.cos(ang135)); // -sqrt(2)/2 System.out.println("tangente("+ang0+")="+Math.tan(ang0)); // 0 System.out.println("tangente("+ang45+")="+Math.tan(ang45)); // 1 (quase) System.out.println("tangente("+ang90+")="+Math.tan(ang90)); // infinito (quase) System.out.println("tangente("+ang135+")="+Math.tan(ang135)); // -1 (quase) } // fim do mtodo main } // fim da classe DemoMath

11.5

Mtodos exponenciais da classe Math

O mtodo sqrt() retorna a raiz quadrada do valor passado como argumento. Tanto o valor passado quanto o valor de retorno do mtodo devem ser do tipo double. O mtodo pow() recebe dois valores do tipo double como argumentos e retorna o valor do primeiro elevado ao segundo, como um valor do tipo double. Existem restries aos valores que podem ser passados para este mtodo: se o primeiro valor igual a zero, o segundo deve ser maior do que zero. Se o primeiro valor menor ou igual a zero, o segundo valor no pode ter casas decimais. Caso um destes casos ocorra, o mtodo causar uma exceo java.lang.ArithmeticException. Excees so vistas no captulo 12. O mtodo log() retorna o logaritmo natural (base e) do valor passado como argumento. Tanto o valor passado quanto o valor de retorno do mtodo devem ser do tipo double. Se um valor negativo for passado como argumento, o mtodo retornar a constante especial do tipo double NaN (nmero inexistente). O mtodo exp() retorna o resultado do valor e elevado ao valor passado como argumento. Tanto o valor passado quanto o valor de retorno do mtodo devem ser do tipo double. Exemplos de uso destes mtodos so mostrados no programa na listagem 11.4.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

145

Listagem 11.4: Um programa que demonstra usos de mtodos exponenciais da classe Math
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

/* Uma classe com mtodo main que demonstra os mtodos exponenciais da classe Math */ class DemoMath { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { double v1 = 0.; double v2 = Math.E; double v3 = 49.; double v4 = -1.; double v5 = 1.; System.out.println("sqrt("+v1+")="+Math.sqrt(v1)); // 0.0 System.out.println("sqrt("+v3+")="+Math.sqrt(v3)); // 7.0 System.out.println("pow("+v3+","+0.5+")="+Math.pow(v3,0.5)); // 7.0 System.out.println("pow("+1+","+v2+")="+Math.pow(1.,v2)); // 1.0 System.out.println("log("+v1+")="+Math.log(v1)); // -Infinity System.out.println("log("+v2+")="+Math.log(v2)); // 1.0 System.out.println("log("+v4+")="+Math.log(v4)); // NaN System.out.println("exp("+v1+")="+Math.exp(v1)); // 1.0 System.out.println("exp("+v5+")="+Math.exp(v5)); // Math.E } // fim do mtodo main } // fim da classe DemoMath

11.6

Outros mtodos da classe Math

O mtodo random() retorna um valor pseudo-aleatrio entre zero e um. Exemplos de uso destes mtodos so mostrados no programa na listagem 11.5. Listagem 11.5: Um programa que demonstra usos do mtodo random da classe Math
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/* Uma classe com mtodo main que demonstra o mtodo random da classe Math */ class DemoMath { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { // Imprimimos 10 valores pseudo-aleatrios entre 0 e 9 for(int i=0;i<10;i++) System.out.print(random(10)+" "); System.out.println(); // Imprimimos 10 valores pseudo-aleatrios entre 0 e 59 for(int i=0;i<10;i++) System.out.print(random(60)+" "); System.out.println(); // Imprimimos 10 valores pseudo-aleatrios entre 0 e 99 for(int i=0;i<10;i++) System.out.print(random(100)+" "); System.out.println(); } // fim do mtodo main /* Mtodo que retorna um valor inteiro pseudo-aleatrio entre 0 e max */ static int random(int max) { return (int)(max*Math.random()); } // fim do mtodo random } // fim da classe DemoMath

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

146

11.7

Exerccios do captulo 11

Exerccio 11.1: Escreva um programa que calcule a rea de um crculo, usando o valor constante de e o valor do raio lido do teclado. Exerccio 11.2: Para qualquer tringulo de lados A, B e C, o permetro P calculado como A + B +C e a rea A calculada como P ( P A) ( P B) ( P C). Escreva um programa em Java que receba os valores A, B e C 2 2 2 2 do teclado e calcule os valores P e S. Exerccio 11.3: Escreva uma classe Dado que tenha um mtodo esttico arremesso() que ao ser chamado imprima um valor entre 1 e 6 (veja o exerccio 2.8). Exerccio 11.4: Considere o exerccio 8.31, que calcula usando uma srie innita o valor de 4 /90. Reescreva o programa de forma a calcular a diferena entre o valor calculado com a srie e o calculado com a constante Math.PI. Teste os resultados com vrios valores mximos para a srie. Exerccio 11.5: Considere o exerccio 8.32, que calcula usando uma srie innita o valor de 2 /8. Reescreva o programa de forma a calcular a diferena entre o valor calculado com a srie e o calculado com a constante Math.PI. Teste os resultados com vrios valores mximos para a srie. Exerccio 11.6: Considere o exerccio 8.35, que calcula usando uma srie innita o logaritmo de 2. Reescreva o programa de forma a calcular a diferena entre o valor calculado com a srie e o calculado com o mtodo Math.log. Teste os resultados com vrios valores mximos para a srie. Exerccio 11.7: Escreva um programa que compare o resultado dos mtodos calculaPi() (exerccio 8.40) e calculaPiDeOutraForma() (exerccio 8.41) com o valor da constante Math.PI. Existe uma diferena signicativa entre a constante e os resultados dos mtodos ? Exerccio 11.8: Escreva uma classe Triangulo que encapsule trs valores de ponto utuante correspondentes aos lados do tringulo. Os valores devem ser passados para o construtor da classe. Nesta classe, escreva os mtodos calculaPermetro() e calcularea() que calculam o permetro e rea do tringulo (veja exerccio 11.2). Escreva tambm o mtodo tipo() que retorna 1 se o tringulo for escaleno, 2 se o tringulo for issceles e 3 se for equiltero. Exerccio 11.9: Escreva uma classe em Java que encapsule um array de 360 valores onde cada elemento corresponde ao seno do ngulo daquele elemento, em graus. Os valores do array devem ser preenchidos pelo construtor da classe. Um mtodo deve ser criado para permitir o acesso aos valores do array. Dica: para converter de radianos para graus, multiplique por e divida por 180.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

147

Exerccio 11.10: 2 2 1 b2 O comprimento do arco ABC de uma parbola dada por 2 b2 + 16a2 + 8a + log 4a+ bb +16a , onde a a altura da parbola e b a distncia entre A e C (veja gura abaixo). Escreva um programa em Java que leia os valores a e b e calcule o comprimento do arco da parbola correspondente.

B a

Exerccio 11.11: Usando o exerccio 11.3 como base, crie uma classe DadoComHistorico que seja capaz de armazenar, a cada vez que o dado arremessado, o valor que saiu. Desta forma, depois de vrios arremessos, a qualquer momento possvel vericar quantas vezes cada nmero saiu. Dicas: os mtodos no devem mais ser estticos, use um array de seis posies para acumular os resultados, veja tambm o exerccio 2.9. Exerccio 11.12: Escreva um programa que resolva uma equao do segundo grau. Este programa deve ler os valores A, B e C do teclado, calcular o valor = B2 4AC e as razes x1 = B e x2 = B . Dica: se for 2A 2A menor que zero, no existem razes reais para a equao - o programa deve prever este caso e imprimir uma mensagem correspondente. Exerccio 11.13: O valor ex pode ser calculado com a srie innita mostrada no exerccio 8.42 e com o mtodo Math.exp(). Escreva um programa em Java que compare os resultados das trs abordagens, para vrios valores mximos para a srie innita. Exerccio 11.14: O seno de um ngulo x pode ser calculado usando as sries innitas mostradas nos exerccios 8.43 e 8.44 ou usando o mtodo Math.sin(). Escreva um programa em Java que compare os resultados das trs abordagens, para vrios valores mximos para a srie innita. Exerccio 11.15: O coseno de um ngulo x pode ser calculado usando as sries innitas mostradas nos exerccios 8.45 e 8.46 ou usando o mtodo Math.cos(). Escreva um programa em Java que compare os resultados das trs abordagens, para vrios valores mximos para a srie innita. Exerccio 11.16: A tangente de um ngulo x pode ser calculada usando a srie innita mostrada no exerccio 8.48 ou usando o mtodo Math.tan(). Escreva um programa em Java que compare os resultados das duas abordagens, para vrios valores mximos para a srie innita.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

148

Exerccio 11.17: A cotangente de um ngulo x pode ser calculada usando a srie innita mostrada no exerccio 8.49 ou usando o valor de 1 dividido pelo resultado do mtodo Math.tan(). Escreva um programa em Java que compare os resultados das duas abordagens, para vrios valores mximos para a srie innita. Exerccio 11.18: A secante de um ngulo x pode ser calculada usando a srie innita mostrada no exerccio 8.50 ou usando o valor de 1 dividido pelo resultado do mtodo Math.cos(). Escreva um programa em Java que compare os resultados das duas abordagens, para vrios valores mximos para a srie innita. Exerccio 11.19: A cosecante de um ngulo x pode ser calculada usando a srie innita mostrada no exerccio 8.51 ou usando o valor de 1 dividido pelo resultado do mtodo Math.sin(). Escreva um programa em Java que compare os resultados das duas abordagens, para vrios valores mximos para a srie innita. Exerccio 11.20: O logaritmo natural de um nmero x pode ser calculado usando a srie innita mostrada no exerccio 8.53 ou usando o mtodo Math.log(). Escreva um programa em Java que compare os resultados das duas abordagens, para vrios valores mximos para a srie innita. Exerccio 11.21: Escreva uma classe que represente polgonos regulares. O construtor deve receber o nmero de lados e o comprimento de cada lado. O mtodo rea() deve calcular a rea dos polgonos com a frmula 1 2 cos(/n) 4 nb sin(/n) onde n o nmero de lados e b o comprimento de cada lado, e o mtodo permetro() deve calcular o permetro como n b. Escreva tambm um mtodo que imprima o nome do polgono baseado no seu nmero de lados (ex. quadrado para quatro lados, octgono para oito lados, etc.). Exerccio 11.22: Escreva um programa em Java que sorteie 50 nmeros entre 0 e 99 para jogar na Lotomania. O programa no dever sortear duas vezes o mesmo nmero. Dica: use um array para armazenar os nmeros sorteados, veja o exerccio 10.40. Exerccio 11.23: Outra maneira de resolver o problema do exerccio 11.22 criar um array onde cada elemento vale o valor do seu ndice, escolher dois ndices aleatoriamente e trocar os elementos destes ndices. Se um nmero sucientemente grande de trocas for feito, o array nal estar embaralhado, e basta tomar os cinquenta primeiros elementos para termos cinquenta valores aleatrios distintos. Implemente um programa em Java que usa esta abordagem.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

149

Captulo 12 Excees
12.1 Introduo

altamente desejvel que os programas desenvolvidos em Java, como em qualquer outra linguagem de programao, sejam livres de erros. Erros em programas escritos em Java podem ser divididos em duas categorias bsicas: erros de sintaxe, que ocorrem porque comandos, mtodos ou classes foram escritas de forma incorreta nos programas, e erros de lgica, onde comandos ou classes so usados de forma correta do ponto de vista da sintaxe dos programas mas incorreta quando considerado o que se deseja que o comando, classe, instncia ou mtodo realmente execute. Erros de sintaxe so, em sua quase totalidade, localizados e apontados pelo compilador, que se recusa a terminar a compilao da classe enquanto estes erros no forem corrigidos. Alguns erros de sintaxe so mostrados na listagem 12.1, onde os comentrios descrevem os erros cometidos nas linhas do programa.

Listagem 12.1: Vrios erros de sintaxe em um programa exemplo


1 2 3 4 5 6 7 8 9 10

classe erro; // dois erros: "classe" em vez de "class" e linha terminada com ponto-e-vrgula { public stetic void main(char argc[]) // "stetic" ao invs de "static" e argumentos de tipo // incorreto passados ao mtodo main { For(boolean i=0;i<10;i++) // "For" com "F" maisculo, valores invlidos para booleans println(j); // mtodo println no existe, varivel j tambm no return false; // o mtodo main no pode retornar valores pois declarado como void } // falta fechar a classe com um "}" !

Erros de lgica so, por sua natureza, muito mais difceis de serem corrigidos. Alguns erros de lgica so: laos que no comeam ou terminam, mtodos chamados recursivamente sem um ponto de trmino, overow de variveis, tentativa de acesso elementos de arrays e caracteres de Strings usando ndices fora dos valores vlidos, divises por zero, etc. Vale a pena notar que nem todos os erros de lgica podem resultar em erros mostrados pelo programa quando este executado. Alguns dos erros que podem ser mostrados pelo programa quando executado so mostrados pelo programa na listagem 12.2.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

150

Listagem 12.2: Erros em potencial de um programa exemplo


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

/* Classe que demonstra erros em potencial em um programa exemplo */ class DemoExcecoes { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { // Supomos que quatro argumentos sero passados para o programa, e podemos // transformar estes argumentos em valores inteiros. int a1 = Integer.parseInt(args[0]); int a2 = Integer.parseInt(args[1]); int b1 = Integer.parseInt(args[2]); int b2 = Integer.parseInt(args[3]); // Efetuamos uma operao simples com estes valores. int resultado = a1/a2+b1/b2; System.out.println("O resultado "+resultado); } } // fim da classe DemoExcecoes

O programa na listagem 12.2 espera que quatro valores sejam passados pela linha de comando, que estes valores possam ser transformados em valores inteiros pelo mtodo parseInt() da classe Integer (seo A.2.2.4) e que duas operaes de diviso sejam feitas com estes quatro valores. Como os valores passados pela linha de comando sero convertidos em um array (o declarado como argumento para o mtodo main(), veja a seo 10.2.1), o programa considera que este array ter quatro elementos. Caso um usurio passe menos do que quatro argumentos para o programa, um erro de acesso elemento inexistente do array ocorrer nas linhas 9, 10, 11 ou 12 da listagem 12.2 (dependendo do nmero de argumentos passados para o programa). Outro erro potencial do programa na listagem 12.2 que um ou ambos os valores das variveis a2 e b2 podem ocasionalmente ser iguais a zero, o que causaria um erro de diviso por zero na linha 14 da listagem. Para que o programa funcione de maneira perfeita e prova de erros, estes devem ser previstos. O programa na listagem 12.3 tenta prever a possvel ocorrncia destes erros atravs da execuo condicional de partes do programa. Alguns dos erros mostrados no programa na listagem 12.2 podem ser corrigidos facilmente usando blocos de deciso if/else, como mostrado na listagem 12.3.

Listagem 12.3: Correo dos erros em potencial de um programa exemplo


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

/* Classe que corrige erros em potencial em um programa exemplo */ class DemoExcecoes { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { if (args.length == 4) { // Supomos que quatro argumentos sero passados para o programa, e podemos // transformar estes argumentos em valores inteiros. int a1 = Integer.parseInt(args[0]); int a2 = Integer.parseInt(args[1]); int b1 = Integer.parseInt(args[2]); int b2 = Integer.parseInt(args[3]); if ((a2 != 0) && (b2 != 0)) // ento o erro de diviso no ocorrer { // Efetuamos uma operao simples com estes valores. Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

151
int resultado = a1/a2+b1/b2; System.out.println("O resultado "+resultado); } // fim do if que verifica se a2 ou b2 so iguais a zero else // no podemos dividir, ento imprimimos uma mensagem de erro System.out.println("Erro: impossvel efetuar a diviso dos valores."); } // fim do if que verifica se quatro argumentos foram passados else // no existem quatro argumentos, ento imprimimos uma mensagem de erro System.out.println(args.length+" argumentos foram passados, 4 eram esperados."); } // fim do mtodo main } // fim da classe DemoExcecoes

18 19 20 21 22 23 24 25 26 27

Na listagem 12.3 dois blocos if/else controlam a execuo de trechos do programa que somente sero executados caso no haja nenhum problema em potencial.

12.2

O que so excees ?

Java possibilita o controle de execuo de blocos que contenham erros em potencial de outra maneira, usando excees. Excees so objetos que so criados quando certas situaes (geralmente erros) ocorrem em um programa ou classe quando este executado. Excees no correspondem diretamente erros: possvel usarmos algumas excees para sinalizar condies especiais em rotinas, para que comandos subsequentes possam usar esta informao para tratar estas condies - esta capacidade facilita a separao das classes, de forma que mtodos de uma podem sinalizar outras situaes de erro de forma elegante. O mecanismo de excees permite que trechos do programa ou classe sejam executados, e caso um erro ocorra no trecho, uma exceo correspondente ser lanada ou levantada, e o programa passar o controle para o bloco seguinte, que processar a exceo. Em outras palavras, este mecanismo permite que tentemos (try) a execuo de um bloco de comandos, e caso uma exceo seja lanada, o programa pegar (catch) esta exceo em outro bloco. Opcionalmente temos a possibilidade de ao nal dos blocos acima (nally), executar alguns comandos. Este mecanismo implementado atravs de um bloco try/catch/finally, que mostrado no trecho na listagem 12.4.

Listagem 12.4: Estrutura de um bloco try/catch/finally


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

try { // esta parte do cdigo ser executada, e caso haja alguma exceo ... } catch(ClasseDaExceo1 instncia1) { // esta parte do cdigo ser executada caso a exceo seja da classe especificada } catch(ClasseDaExceo2 instncia2) { // esta parte do cdigo ser executada caso a exceo seja da classe especificada } finally { // esta parte do cdigo ser executada independente da ocorrncia de excees }

Algumas regras e informaes sobre excees so: Blocos try/catch/finally podem aparecer dentro de blocos if/else, while, etc. assim como dentro de subrotinas, mtodos de classes, etc.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

152 Os blocos try, catch e finally devem ser cercados por chaves ({ e }), mesmo que sejam compostos de uma nica linha de programa. O bloco finally opcional, e ser executado independentemente da ocorrncia de excees no bloco try/catch. Podemos ter quantos blocos catch quisermos, mas para cada um deve ser passado como argumento uma instncia de exceo de classes diferentes. Todas as excees descendem da classe Exception - como existe uma hierarquia das excees implementadas atravs do mecanismo de herana, se formos usar mais do que um bloco catch devemos tentar pegar as excees mais especializadas antes das excees mais genricas. O programa mostrado na listagem 12.3 foi reescrito de forma a usar excees, e mostrado na listagem 12.5.

Listagem 12.5: Exemplo de programa que processa erros atravs de excees


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

/* Classe que corrige erros em potencial em um programa exemplo */ class DemoExcecoes { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { try // tentaremos executar o bloco de comandos abaixo { // Supomos que quatro argumentos sero passados para o programa, e podemos // transformar estes argumentos em valores inteiros. int a1 = Integer.parseInt(args[0]); int a2 = Integer.parseInt(args[1]); int b1 = Integer.parseInt(args[2]); int b2 = Integer.parseInt(args[3]); // Efetuamos uma operao simples com estes valores. int resultado = a1/a2+b1/b2; System.out.println("O resultado "+resultado); } // fim do if que verifica se quatro argumentos foram passados catch (Exception e) // se alguma exceo foi jogada, ela ser pega por este bloco { // necessrio passar uma instncia de uma classe de excees ! System.out.println("Uma exceo ocorreu: "+e); } } // fim do mtodo main } // fim da classe DemoExcecoes

Outra maneira de escrevermos o programa na listagem 12.5 usando um bloco catch para cada uma das possveis excees que podem ocorrer no bloco try, como mostrado na listagem 12.6.

Listagem 12.6: Outro exemplo de programa que processa erros atravs de excees
1 2 3 4 5 6 7 8 9 10

/* Classe que corrige erros em potencial em um programa exemplo */ class DemoExcecoes { /* Mtodo que permite a execuo da classe */ public static void main(String args[]) { try // tentaremos executar o bloco de comandos abaixo { // Supomos que quatro argumentos sero passados para o programa, e podemos // transformar estes argumentos em valores inteiros. Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

153
int a1 = Integer.parseInt(args[0]); int a2 = Integer.parseInt(args[1]); int b1 = Integer.parseInt(args[2]); int b2 = Integer.parseInt(args[3]); // Efetuamos uma operao simples com estes valores. int resultado = a1/a2+b1/b2; System.out.println("O resultado "+resultado); } // fim do if que verifica se quatro argumentos foram passados catch (ArrayIndexOutOfBoundsException e) // pega excees de ndices invlidos para arrays { System.out.println("Um ndice fora da faixa vlida foi usado."); System.out.println("A mensagem da exceo "+e); } catch (ArithmeticException e) // pega excees de aritmtica { System.out.println("Um erro de aritmtica ocorreu."); System.out.println("A mensagem da exceo "+e); } } // fim do mtodo main } // fim da classe DemoExcecoes

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Na listagem 12.6 cada tipo de exceo processado separadamente com um bloco catch, possibilitando a gerao de mensagens de erro mais detalhadas. Todas as classes que representam excees possuem o mtodo printStackTrace(), que no recebe argumentos e chamado a partir da instncia da exceo. Este mtodo imprime o histrico das chamadas dos mtodos para facilitar a localizao do erro e de suas causas.

12.2.1

Tipos de excees

Nos exemplos mostrados anteriormente, vemos que existem diversas classes de excees, cujas instncias so criadas dentro dos blocos catch. A linguagem Java fornece vrios tipos de excees, implementados em diferentes classes, que podem ser usados nos programas e classes. Alguns tipos de excees so opcionais: o uso de blocos try/catch no necessrio, e depende do programador decidir entre o uso de blocos if/else ou try/catch para processar eventuais erros de execuo dos trechos de programas ou classes. Outros tipos de exceo so obrigatrias: para uso de algumas classes ou mtodos de classes, estes devem obrigatoriamente ser chamadas de blocos try, e as excees correspondentes devem ser pegas pelos blocos catch. Excees obrigatrias sero vistas no captulo 13. Algumas das classes de excees mais usadas so: ArithmeticException: Esta exceo opcional levantada quando alguns erros de clculos matemticos ocorrem. O mtodo pow() da classe Math pode lanar este erro quando executarmos Math.pow(a,b) com a igual a zero e b menor que zero ou a menor que zero e b no-inteiro. Uma diviso por zero de valores inteiros tambm pode causar esta exceo, como visto na listagem 12.6. Vale a pena notar que em Java, uma diviso por zero de valores de ponto utuante no considerada como um erro, e uma exceo no lanada: divises por zero de valores de ponto utuante so consideradas como innitas e representadas pelo valor especial Infinity, e o valor 0/0 representado pelo valor especial Nan (Not a Number). NumberFormatException: Esta exceo opcional levantada quando tentamos converter uma String para valor numrico usando, por exemplo, os construtores das classes Byte (seo A.2.2.1), Short

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

154 (seo A.2.2.3), Integer (seo A.2.2.4), Long (seo A.2.2.5), Float (seo A.2.2.6) e Double (seo A.2.2.7). Se as Strings passadas para os construtores destas classes no puderem ser convertidas, a exceo ser lanada. ArrayIndexOutOfBoundsException: Esta exceo opcional levantada quando tentamos acessar um elemento em um array atravs de um ndice no-vlido, ou seja, um ndice que menor do que zero ou maior ou igual ao nmero de elementos do array. StringIndexOutOfBoundsException: Esta exceo opcional levantada quando tentamos acessar um caracter ou substring em uma String usando ndices no-vlidos, ou seja, ndices que so menores do que zero ou maiores ou iguais ao nmero de caracteres da String. IllegalArgumentException: Esta exceo opcional levantada quando um argumento no-vlido passado para um mtodo, que no pode ser executado por causa deste erro. RuntimeException: Esta a super-classe (ancestral) de todas as classes que representam excees opcionais, e pode ser usada por programadores para criar excees opcionais atravs de herana. EOFException: Esta exceo lanada quando o nal de um arquivo sendo lido alcanado, e pode ser usada para terminar um bloco de leitura de arquivos. FileNotFoundException: Esta exceo lanada quando tentamos abrir um arquivo com um nome para leitura e o arquivo no encontrado. IOException: Esta a exceo genrica para erros em processamento de arquivos. aconselhvel o uso das classes herdeiras desta, mostradas acima, mas ao menos uma exceo herdeira desta classe deve ser obrigatoriamente usada para processamento de arquivos. Exception: Esta a classe ancestral de todas as excees. Se for usada com outras excees, ela deve ser a ltima exceo a ser pega (deve estar no ltimo bloco catch).

12.3

Usando excees em classes desenvolvidas pelo programador

Mtodos de classes desenvolvidas pelo programador podem lanar excees usando a palavra-chave throw, seguida de uma instncia de uma exceo que pode ser criada com a palavra-chave new - quando uma situao que gera excees ocorrer, a exceo lanada para que o cdigo que chamou o mtodo tome conhecimento da situao. Isto demonstrado na classe ArrayDeFloats da listagem 12.7. Listagem 12.7: A classe ArrayDeFloats com mtodos que lanam excees
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

/* Esta classe encapsula um array de floats */ class ArrayDeFloats { private float array[]; // declarao do array que ser encapsulado /* Construtor, aceita um argumento que o nmero de floats a serem armazenados. */ ArrayDeFloats(int nmero) { // Se o usurio passar um valor menor do que zero, criamos uma exceo if (nmero < 0) throw new ArrayIndexOutOfBoundsException("Tamanho "+nmero+" menor que zero"); array = new float[nmero]; // aloco memria para o array declarado anteriormente } /* Mtodo que seta o valor na posio especificada */ void seta(int posio,float valor) { if ((posio >= 0) && (posio < array.length)) // somente se estiver na faixa de ndices array[posio] = valor; // vlidos o valor ser modificado else // criamos uma exceo de tentativa de acesso indevido throw new ArrayIndexOutOfBoundsException("Tentativa de setar elemento "+posio+ Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

155
" fora da faixa [0-"+(array.length-1)+"]."); } /* Mtodo que permite o acesso um dos valores do array */ float valor(int posio) { if ((posio >= 0) && (posio < array.length)) return array[posio]; else // criamos uma exceo de tentativa de acesso indevido throw new ArrayIndexOutOfBoundsException("Tentativa de acessar elemento "+posio+ " fora da faixa [0-"+(array.length-1)+"]."); } } // fim da classe ArrayDeFloats

20 21 22 23 24 25 26 27 28 29 30 31

Podemos escrever nossas prprias excees e us-las para documentar erros nas classes em portugus com o nvel de detalhe desejado. Ao escrever nossas prprias excees, elas devem ser herdeiras da classe Exception1 ou de uma das herdeiras desta classe. Para fazer uma exceo opcional, podemos fazer a nossa classe de excees herdar da classe RuntimeException, como visto na listagem 12.8.

Listagem 12.8: Uma classe que representa uma exceo


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

/* Uma classe que representa uma exceo de acesso Arrays. Esta classe herda da classe RuntimeException, indicando uma exceo que pode ser pega opcionalmente. */ class ExcecaoDeArrays extends RuntimeException { /* O construtor da classe recebe uma mensagem que ser mostrada quando a exceo ocorrer. */ ExcecaoDeArrays(String mensagem) { // Chamamos o construtor da classe ancestral... super(); // Imprimimos uma mensagem de erro - note que usamos System.err em vez de // System.out para garantir que a mensagem ser mostrada no terminal System.err.println("Exceo de Arrays: "+mensagem+"."); } } // fim da classe ExcecaoDeArrays

A classe ExcecaoDeArrays, mostrada na listagem 12.8, consiste somente de um construtor que chamar o construtor da classe ancestral atravs do super() e mostrar uma mensagem de erro ao ser chamado, usando a String passada como argumento para o construtor (linha 13). Esta classe pode ser usada no lugar das excees de Java na classe ArrayDeFloats todas as vezes que um erro de ndice de arrays ocorrer, como mostrado na listagem 12.9.

Listagem 12.9: A classe ArrayDeFloats com mtodos que lanam excees ExcecaoDeArray
1 2 3 4 5 6 7 8 9 10 11

/* Esta classe encapsula um array de floats */ class ArrayDeFloats { private float array[]; // declarao do array que ser encapsulado /* Construtor, aceita um argumento que o nmero de floats a serem armazenados. */ ArrayDeFloats(int nmero) { // Se o usurio passar um valor menor do que zero, criamos uma exceo if (nmero <= 0) throw new ExcecaoDeArrays("Tamanho "+nmero+" menor que zero"); array = new float[nmero]; // aloco memria para o array declarado anteriormente
1 Mais

especicamente, da classe Throwable, mas como a classe Exception herda da Throwable podemos simplicar.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

156
} /* Mtodo que seta o valor na posio especificada */ void seta(int posio,float valor) { if ((posio >= 0) && (posio < array.length)) // somente se estiver na faixa de ndices array[posio] = valor; // vlidos o valor ser modificado else // criamos uma exceo de tentativa de acesso indevido throw new ExcecaoDeArrays("Tentativa de setar elemento "+posio+ " fora da faixa [0-"+(array.length-1)+"]."); } /* Mtodo que permite o acesso um dos valores do array */ float valor(int posio) { if ((posio >= 0) && (posio < array.length)) return array[posio]; else // criamos uma exceo de tentativa de acesso indevido throw new ExcecaoDeArrays("Tentativa de acessar elemento "+posio+ " fora da faixa [0-"+(array.length-1)+"]."); } } // fim da classe ArrayDeFloats

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Se um programa ou classe criar instncia da classe ArrayDeFloats (mostrada na listagem 12.9) com valores menores ou iguais a zero passados para o construtor, a exceo ExcecaoDeArrays (mostrada na listagem 12.8) ser levantada. importante notar que como a exceo opcional, se um programa ou classe no pegar a exceo ExcecaoDeArrays em um bloco catch, alm das mensagens da exceo ExcecaoDeArrays outras mensagens podero aparecer. Programadores escrevendo classes podem forar os programadores que usaro estas classes a processarem as excees previstas, usando excees obrigatrias. Para fazer isto, o primeiro passo criar uma classe que representa uma exceo que herde de uma exceo obrigatria, como a classe Exception. Uma classe que herda da classe Exception mostrada na listagem 12.10.

Listagem 12.10: Uma classe que representa uma exceo que deve ser pega
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

/* Uma classe que representa uma exceo de acesso Arrays. Esta classe herda da classe Exception, indicando uma exceo que deve ser obrigatoriamente pega. */ class ExcecaoRigorosaDeArrays extends Exception { /* O construtor da classe recebe uma mensagem que ser mostrada quando a exceo ocorrer. */ ExcecaoRigorosaDeArrays(String mensagem) { // Chamamos o construtor da classe ancestral... super(); // Imprimimos uma mensagem de erro - note que usamos System.err em vez de // System.out para garantir que a mensagem ser mostrada no terminal System.err.println("Exceo de Arrays: "+mensagem+"."); } } // fim da classe ExcecaoRigorosaDeArrays

Para lanarmos excees do tipo ExcecaoRigorosaDeArrays devemos informar ao compilador que mtodos que podem lanar estas excees. Isto feito anexando-se declarao dos mtodos a palavra-chave throws (notem que plural) com o nome da exceo que ser lanada. Vrias excees podem ser lanadas por um mtodo de uma classe, bastando declar-las desta forma, separadas por vrgulas. A classe ArrayDeFloats, modicada para usar excees do tipo ExcecaoRigorosaDeArrays, mostrada na listagem 12.11.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

157

Listagem 12.11: A classe ArrayDeFloats com mtodos que lanam excees ExcecaoRigorosaDeArray
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

/* Esta classe encapsula um array de floats */ class ArrayDeFloats { private float array[]; // declarao do array que ser encapsulado /* Construtor, aceita um argumento que o nmero de floats a serem armazenados. */ ArrayDeFloats(int nmero) throws ExcecaoRigorosaDeArrays { // Se o usurio passar um valor menor do que zero, criamos uma exceo if (nmero < 0) throw new ExcecaoRigorosaDeArrays("Tamanho "+nmero+" menor que zero"); array = new float[nmero]; // aloco memria para o array declarado anteriormente } /* Mtodo que seta o valor na posio especificada */ void seta(int posio,float valor) throws ExcecaoRigorosaDeArrays { if ((posio >= 0) && (posio < array.length)) // somente se estiver na faixa de ndices array[posio] = valor; // vlidos o valor ser modificado else // criamos uma exceo de tentativa de acesso indevido throw new ExcecaoRigorosaDeArrays("Tentativa de setar elemento "+posio+ " fora da faixa [0-"+(array.length-1)+"]."); } /* Mtodo que permite o acesso um dos valores do array */ float valor(int posio) throws ExcecaoRigorosaDeArrays { if ((posio >= 0) && (posio < array.length)) return array[posio]; else // criamos uma exceo de tentativa de acesso indevido throw new ExcecaoRigorosaDeArrays("Tentativa de acessar elemento "+posio+ " fora da faixa [0-"+(array.length-1)+"]."); } } // fim da classe ArrayDeFloats

Como as excees previstas na classe ArrayDeFloats (listagem 12.11) devem ser obrigatoriamente pegas, um programa que use instncias de ArrayDeFloats deve cercar as chamadas aos mtodos das classes que podem levantar as excees (inclusive o construtor de ArrayDeFloats) com um bloco try, e pegar no bloco catch a exceo ExcecaoRigorosaDeArray, como mostrado no programa na listagem 12.12.

Listagem 12.12: Um programa que usa a classe ArrayDeFloats com excees que devem obrigatoriamente ser pegas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

/* Esta classe demonstra o uso da classe ArrayDeFloats */ class DemoArrayDeFloats { /* Mtodo que permite a execuo da classe */ public static void main(String argumentos[]) { ArrayDeFloats af; // Como a classe ArrayDeFloats tem uma exceo que deve obrigatoriamente ser pega, // temos que envolver o uso da classe em um bloco try/catch try // tenta executar os comandos relacionados com ArrayDeFloats... { af = new ArrayDeFloats(10); af.seta(10,3.1416f); } catch(ExcecaoRigorosaDeArrays e) // se houver algum erro, imprima mensagem. { e.printStackTrace(); // imprimimos o histrico de chamadas } System.out.println("Fim do programa"); Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

158
} // fim do mtodo main } // fim da classe DemoArrayDeFloats

20 21

12.4

Exerccios do captulo 12

Exerccio 12.1: Compile e execute o programa mostrado na listagem 12.5. Verique os resultados que o programa dar para a execuo do programa como: java DemoExcecoes 0 1 2 java DemoExcecoes a b c d java DemoExcecoes 0 0 0 0 java DemoExcecoes 0 1 0 1 java DemoExcecoes Exerccio 12.2: Modique o programa na listagem 10.5 para que o acesso ao array seja feito dentro de um bloco try/catch, e que a exceo ArrayIndexOutOfBounds seja pega. Dica: o bloco try/catch pode car dentro do bloco while. Exerccio 12.3: Modique a classe ArrayDeQuadrados (listagem 10.6) para que o mtodo quadrado lane uma exceo ArrayIndexOutOfBounds ao invs de imprimir mensagens de erro e retornar 1. Exerccio 12.4: Modique a classe ListaDePessoas (listagem 10.16) para que o mtodo setaDados lane a exceo ArrayIndexOutOfBounds. Modique tambm o programa na listagem 10.17 para que as chamadas ao mtodo setaDados estejam dentro de um bloco try/catch. Exerccio 12.5: Considere o exerccio 9.27. Reescreva a calculadora bsica de forma que os valores sejam passados pela linha de comando. Alguns dos problemas que podem ocorrer na execuo do programa so a passagem de nmero de argumentos pela linha de comando incompatveis com o esperado e converso de Strings para doubles impossvel. Escreva este programa usando um bloco try/catch que pega estes tipos de erros em potencial.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

159

Captulo 13 Entrada e Sada usando Arquivos


13.1 Introduo

A manipulao de arquivos uma das tarefas mais importantes de um computador, e portanto, de um programa de computador. Arquivos permitem o armazenamento permanente de informaes em discos ou outros dispositivos, fazendo com que um programa (que tambm armazenado em um arquivo) no seja limitado ao processamento de informaes denidas em seu cdigo-fonte ou lidas do teclado. Existem diversos tipos de arquivos, que podem ser categorizados tanto pelo seu contedo quanto pela maneira como este contedo manipulado. Em relao ao contedo, e considerando as caractersticas da linguagem Java, existem trs categorias bsicas de arquivos: Arquivos de texto: Estes tipos de arquivos contm somente texto, que pode ser lido por qualquer editor ou mostrado nos terminais simples dos sistemas operacionais. Alguns exemplos de arquivos de texto so arquivos com cdigo-fonte de linguagens como Java, C, Pascal, Perl; arquivos de congurao de sistemas operacionais, arquivos em HTML (que denem formatao bsica de pginas na WWW), etc. comum o uso de arquivos de texto simples para representar tabelas de bancos de dados em pequenas aplicaes e prottipos de sistemas, o que dispensa um mecanismo de gerenciamento de bancos de dados. Esta abordagem, porm, tem vrias limitaes para aplicaes de mdio e grande porte, em especial, aplicaes comerciais. Em Java, arquivos de texto podem ser lidos e parte ou todo seu contedo podem ser armazenados em Strings. Arquivos binrios: Estes tipos de arquivos contm somente informaes de forma binria, que geralmente representam uma codicao com uma nalidade especca. Para vermos o contedo de arquivos binrios, frequentemente necessrio usarmos um programa especial que decodique os dados do arquivo para mostrar o contedo. Arquivos de imagens, sons, programas compilados, utilitrios de sistemas operacionais, etc. so exemplos de arquivos binrios. Em Java, arquivos que contm valores de tipos nativos so armazenados de forma binria. Arquivos de instncias: Estes tipos de arquivos, particulares de Java, so uma subcategoria de arquivos binrios que representam instncias de classes existentes. Arquivos de instncias de classes permitem a serializao das classes (gravao de estados de instncias para processamento posterior). Arquivos de instncias somente podem ser lidos por mquinas virtuais Java que tenham acesso s classes originais. Para cada categoria de contedo de arquivos mostrada acima, veremos formas de manipular estes arquivos atravs do uso de classes de Java.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

160 Quanto forma de acesso, arquivos podem ser divididos nas seguintes categorias: Arquivos somente para leitura: So arquivos que contm dados que sero lidos do arquivo e processados pelo programa, ou armazenados na memria. Para que os programas que dependem de arquivos de leitura funcionem corretamente, estes arquivos devem existir e estar disponveis para o programa (ser acessveis). Arquivos somente para escrita: So arquivos que sero criados com dados fornecidos pelo programa. Se estes arquivos no existirem, sero criados para uso pelo programa. Arquivos somente podem ser abertos para escrita se o sistema operacional onde a mquina virtual Java estiver sendo executada permitir a operao. Arquivos para leitura e escrita: So arquivos que podero, ao ser abertos, ser usados para leitura e escrita, seguindo as regras acima. Ainda em relao forma de acesso dos arquivos, podemos classic-los em: Arquivos de leitura e escrita sequenciais: Estes arquivos sero lidos em sequncia, ou seja, informao por informao, quer se trate de texto ou dados binrios. Para alcancar determinada posio dos dados no arquivo deveremos ler todos os dados antes daquele. Pode-se pensar em uma analogia com msicas armazenadas em uma ta cassete. Arquivos de leitura e escrita aleatria: Estes arquivos podero ser lidos de maneira aleatria, ou seja, podemos posicionar um ponteiro em qualquer posio existente no arquivo e escrever ou gravar a partir daquela posio, sem necessidade de ler ou escrever dados anteriores1 . As sees seguintes neste captulo tratam de diversas classes em Java que permitem acesso a arquivos nas diferentes formas descritas acima.

13.1.1

Acesso a arquivos em Java

Acesso a arquivos em Java feito atravs da criao de instncias de classes que representem os arquivos e chamando mtodos que permitam a leitura, gravao e manipulao dos arquivos. Desta forma, o acesso direto ao arquivo somente pode ser feito por mtodos especcos da classe, facilitando a interao com o programa e protegendo os dados. Em alguns casos, comum que existam mais de uma camada de classes em volta de um arquivo: uma classe responsvel pela leitura em baixo nvel do arquivo, e a classe que encapsula esta classe responsvel pela traduo dos dados de baixo nvel (caracteres ou bytes) para os dados de nvel mais alto (Strings ou instncias de outras classes). Isto mostrado na gura 13.1.

Classe que encapsula arquivo mtodo mtodo Arquivo Leitura de bytes ou caracteres Gravao de bytes ou caracteres

Classe que encapsula arquivo (nvel mais alto) Classe que encapsula arquivo mtodo mtodo mtodo Arquivo mtodo

Leitura de Strings ou instncias de classes Gravao de Strings ou instncias de classes

Figura 13.1: Encapsulamento de arquivos por classes


que implementam arquivos de acesso aleatrio no sero vistas nesta verso do livro, mas estaro presentes em futuras verses.
1 Classes

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

161 esquerda da gura 13.1 vemos o acesso um arquivo encapsulado por uma classe que permite a leitura e/ou gravao de bytes ou caracteres: as classes que encapsulam arquivos deste tipo possuem mtodos que permitem o acesso aos bytes ou caracteres. direita da gura vemos um caso ligeiramente mais complexo: uma classe que permite o acesso aos bytes ou caracteres do arquivo encapsulada por outra classe que, atravs dos seus mtodos, permite o acesso estruturas mais complexas como Strings e instncias de classes. Todas as vezes que uma destas estruturas mais complexas acessada, os mtodos da classe de nvel mais alto chamam os mtodos da classe de nvel mais baixo, traduzindo os pedidos. As classes que implementam mecanismos de representao e acesso arquivos fazem parte de um pacote ou biblioteca de classes chamada java.io. Para que possamos usar estas classes, devemos incluir no incio de todos os programas que fazem manipulao de arquivos a linha import java.io.*;, que importar todas as classes do pacote java.io. Esta linha deve ser includa antes da declarao das classes. Todas as classes que implementam acesso arquivos em Java contm possibilidades de ocorrncia de excees obrigatrias, que devem ser pegas quando usamos as instncias das classes.

13.1.2

Sobre os arquivos usados neste captulo

Para efeitos de ilustrao e testes, alguns arquivos foram criados para uso nos programas e classes deste captulo. Estes arquivos fazem parte do pacote de distribuio deste documento, e foram compactados juntamente com o arquivo do prprio livro. Verique a distribuio original deste documento. Vale a pena lembrar que a forma de acesso de arquivos diferente para diferentes sistemas operacionais, especialmente se nomes de arquivos que no esto localizados no mesmo diretrio dos programas for usado. Em caso de dvida consulte o guia de uso de seu sistema operacional ou o guru mais prximo. FCC/UNIVAP Todos os arquivos deste captulo podem ser acessados das contas no Linux nos laboratrios da Faculdade de Cincia da Computao, bastando usar o nome completo do arquivo, que composto do prexo /home/tico/POO/ mais o nome do arquivo. Por exemplo, para acessar o arquivo estoquelivraria.dat nos programas desenvolvidos no laboratrio, basta usar o nome completo /home/tico/POO/estoquelivraria.dat quando for referenciar o arquivo.

13.2

Arquivos Sequenciais para Strings

Esta seo descreve as classes que implementam leitura e gravao de arquivos de texto usando Strings para representar as linhas destes arquivos, de forma que a leitura e gravao seja feita sequencialmente. Neste modo de acesso a arquivos, um ponteiro criado e usado pela classe que encapsula o mecanismo de acesso, de forma que depois de cada leitura ou gravao de Strings nos arquivos o ponteiro aponte para a prxima posio de leitura. A gura 13.2 demonstra o funcionamento de ponteiros em um arquivo de leitura.

1 l i n h a

2 1 S o u t r a

3 l i n h a S l t i m a l i n h a S

Figura 13.2: Funcionamento de ponteiros em arquivos sequenciais de texto

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

162 A gura 13.2 representa um arquivo de textos contendo algumas Strings separadas pelos separadores marcados como S (que dependem do sistema operacional sendo usado, podendo ser compostos de um ou dois caracteres). Quando o arquivo aberto, o ponteiro deste aponta para o primeiro caracter do arquivo (posio 1). Aps a leitura da primeira linha como uma String, o ponteiro estar apontando para a posio 2, e aps a leitura da segunda linha, para a posio 3. O programador no tem acesso ou controle ao ponteiro.

13.2.1

Leitura em arquivos sequenciais para Strings

A classe BufferedReader permite a leitura de Strings de arquivos de texto. A classe BufferedReader implementa internamente um buffer de texto para leitura do arquivo: este buffer consiste de uma regio da memria especialmente reservada para minimizar o nmero de vezes que o acesso fsico ao arquivo ser feito: cada vez que for necessrio ler do arquivo, a classe vericar no buffer se a leitura realmente necessria, e ao ler, tentar ler do arquivo um nmero de caracteres sucientemente grande para que nas prximas leituras o acesso seja feito memria e no ao disco. Alguns mtodos teis da classe BufferedReader so: BufferedReader(): o construtor da classe. Este construtor espera um argumento que uma instncia da classe FileReader, que por sua vez ser criada usando um nome de arquivo como argumento. Opcionalmente, podemos especicar um valor inteiro que ser o tamanho para o buffer a ser criado para a leitura dos caracteres: um buffer maior pode fazer com que o acesso s linhas do arquivo seja mais rpido, resultando em um programa mais eciente, mas ao custo de mais memria em uso. O tamanho default do buffer 8192 bytes. readLine(): este mtodo l uma String completa do arquivo encapsulado pela instncia da classe BufferedReader e a retorna como resultado do mtodo. A String ser lida do arquivo at que seja encontrado um caracter de nova linha (\n), retorno de carro (\r), uma combinao dos dois ou o m do arquivo seja encontrado. Quando o mtodo no puder mais ler Strings do arquivo, ele retornar o valor especial null, que pode ser usado para vericao de m de arquivo. O caracter terminador no anexado String. close(): este mtodo fecha o arquivo associado com a instncia da classe BufferedReader, fechando tambm o arquivo associado com a instncia da classe FileReader que foi usada para construir a instncia de BufferedReader. Toda a manipulao das instncias destas classes, inclusive a sua criao, deve estar dentro de um bloco try, e deve existir ao menos um bloco catch para a exceo IOException. O programa na listagem 13.1 mostra como podemos usar uma instncia da classe BufferedReader para ler um arquivo de texto linha por linha, at o m do arquivo, calculando quantas linhas existem no arquivo.

Listagem 13.1: Um programa que l as linhas de um arquivo como Strings


1 2 3 4 5 6 7 8 9

/* Este programa demonstra o uso da classe BufferedReader para ler Strings de um arquivo. */ import java.io.*; // Esta linha obrigatria - permite o uso das classes de I/O class LeituraSequencialDeStrings { /* O mtodo main permite a execuo da classe */ public static void main(String args[]) { Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

163
String arquivo = "linux.words"; // o nome do arquivo representado por uma String int nmeroDeLinhas = 0; // o nmero de linhas do arquivo inicialmente zero try // tenta abrir o arquivo, ler dados e fech-lo { // Criamos uma instncia da classe FileReader FileReader fr = new FileReader(arquivo); // E a usamos como argumento para o construtor da classe BufferedReader BufferedReader br = new BufferedReader(fr); boolean aindaTemMais = true; // enquanto no for fim de arquivo esta varivel ser true while(aindaTemMais) // repetimos a leitura do arquivo enquanto aindaTemMais for true { String linha = br.readLine(); // lemos uma String do arquivo if (linha == null) // se o resultado da leitura for null aindaTemMais = false; // sinal que o arquivo chegou ao fim else // seno, podemos processar a linha lida nmeroDeLinhas++; // incrementamos o nmero de linhas lidas } // quando acabarem as linhas (aindaTemMais for false) samos do lao // Fechamos a instncia da classe BufferedReader, o que fechar automaticamente a // instncia da classe FileReader br.close(); } // fim do bloco try catch (FileNotFoundException e) // Se o arquivo no foi encontrado... { System.out.println("O arquivo no foi encontrado."); } catch (IOException e) // Se houve erros de I/O.. { System.out.println("Houve um erro de leitura do arquivo."); } // Ao final, imprimimos o nmero de linhas lidas System.out.println("O arquivo tem "+nmeroDeLinhas+" linhas."); } } // fim da classe LeituraSequencialDeStrings

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

A criao das instncias das classes FileReader (linha 15) e BufferedReader (linha 17) poderia ser feita de uma s vez, como BufferedReader br = new BufferedReader(new FileReader(arquivo)). Podemos implementar parte das funes de manipulao de arquivos dentro de mtodos nas classes denidas pelo usurio, como no exemplo seguinte. Suponhamos que o estoque de uma livraria contenha, para cada livro, o ttulo do livro, o nome do autor, o nmero de livros em estoque, o preo de compra dos livros (de uma editora, por exemplo) e o preo de venda nal dos livros. Este estoque poderia ser representado por um arquivo onde cada linha conteria informaes sobre um livro, formatados de maneira a podemos cortar a String com o mtodo substring() e recuperar os diversos campos. Parte deste arquivo que contm os dados dos livros mostrado na listagem 13.2.

Listagem 13.2: Listagem parcial do arquivo que contm informaes sobre livros de uma livraria
Dave Barry Talks Back Introduction to Programming Using Java Conectiva Linux Guarani Graphic Java 1.1 Understanding Japanese Information Processing Dave Barry David Arnow, Gerald Weiss Conectiva S.A. David M. Geary Ken Lunde 42 10 9 18 4 21.50 42.50 55.00 70.00 27.50 25.00 58.00 62.00 90.00 32.00

Uma classe que representasse os livros de uma livraria poderia ser capaz de inicializar suas instncias atravs da leitura do arquivo que contm dados desta, e da diviso das linhas de texto nos componentes que representam o livro. A classe LivroLivraria, mostrada na listagem 13.3, mostra como isso pode ser feito.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

164

Listagem 13.3: Classe que representa um Livro de Livraria


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

/* Esta classe representa um livro de livraria. */ import java.io.*; // como vamos acessar mtodos de classes de IO precisamos desta linha ! class LivroLivraria { /* Algumas variveis privadas para representar o livro de livraria */ private String ttulo,autor; // Ttulo do livro e nome do autor private short estoque; // Nmero de livros em estoque private float pCompra,pVenda; // Preo de compra e venda /* O construtor vazio para a classe LivroLivraria. sempre uma boa idia ter este construtor, caso seja necessrio alocar memria para uma instncia sem inicializ-la. */ LivroLivraria() { } /* O construtor para a classe LivroLivraria que recebe variveis para inicializao. */ LivroLivraria(String tit,String aut,short est,float pc,float pv) { ttulo = tit; autor = aut; estoque = est; pCompra = pc; pVenda = pv; } /* O construtor para a classe LivroLivraria que recebe uma instncia da classe BufferedReader como argumento. Este construtor tentar pegar os valores para inicializao da instncia de uma String a ser lida do BufferedReader. Como possvel que no consigamos ler os dados do BufferedReader por alguma razo (arquivo no aberto, ou sem dados), somos obrigados a declarar que o construtor pode repassar a exceo para quem o chamou atravs da clusula throws. Esta clusula faz o compilador esperar que a chamada ao construtor esteja dentro de um bloco try/catch. */ LivroLivraria(BufferedReader br) throws IOException { String registro = br.readLine(); // Lemos uma String do arquivo ttulo = registro.substring(0,49); // "Cortamos" o ttulo do livro da String autor = registro.substring(49,76); // "Cortamos" o nome do autor da String // Para extrair o nmero de livros em estoque, temos que "cortar" a String, // extrair os espaos em branco desnecessrios com o mtodo trim, criar uma instncia // da classe Short para representar o valor e finalmente pegar o valor da instncia. Short tempShort = new Short(registro.substring(76,79).trim()); estoque = tempShort.shortValue(); // Para extrair os preos dos livros efetuamos os mesmos passos mas usando a classe Float Float tempFloatC = new Float(registro.substring(79,86).trim()); pCompra = tempFloatC.floatValue(); Float tempFloatV = new Float(registro.substring(86,93).trim()); pVenda = tempFloatV.floatValue(); } /* Este mtodo permite a impresso de instncias da classe com System.out.println(). */ public String toString() { String res = "Ttulo: \t"+ttulo+"\n"; // Concatenamos os dados da classe em uma String res = res + "Autor: \t"+autor+"\n"; res = res + "Estoque:\t"+estoque+"\n"; res = res + "Preo: \t"+pVenda; return res; // e retornamos esta String } } // Fim da classe LivroLivraria

Com esta classe, podemos implementar programas que abrem um arquivo de texto e usam as linhas do arquivo para inicializar instncias da classe, como o mostrado na listagem 13.4.

Listagem 13.4: Programa que usa a classe LivroLivraria e l os dados de um arquivo


1 2

/* Este programa demonstra o uso da classe BufferedReader para ler instncias da classe LivroLivraria de um arquivo. As instncias sero lidas como Strings e decodificadas Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

165
por um construtor da classe LivroLivraria. */ import java.io.*; // Esta linha obrigatria - permite o uso das classes de I/O class LeituraSequencialDeLivros { /* O mtodo main permite a execuo da classe */ public static void main(String args[]) { // Para evitar erros de escopo, inicializamos a instncia que estaremos usando. LivroLivraria lv = new LivroLivraria(); String arquivo = "estoquelivraria.dat"; // o nome do arquivo representado por uma String try // tenta abrir o arquivo, ler dados e fech-lo { // Criamos uma instncia da classe FileReader e a usamos no construtor da BufferedReader BufferedReader br = new BufferedReader(new FileReader(arquivo)); for(int livro=0;livro<19;livro++) // temos 19 livros no nosso arquivo ! { // Reinicializamos a instncia lv atravs do construtor que aceita uma instncia // da classe BufferedReader lv = new LivroLivraria(br); System.out.println(lv); // Imprimimos a instncia - o mtodo toString ser usado } // Fechamos a instncia da classe BufferedReader br.close(); } // fim do bloco try catch (FileNotFoundException e) // Se o arquivo no foi encontrado... { System.out.println("O arquivo no foi encontrado."); } catch (IOException e) // Se houve erros de I/O.. { System.out.println("Houve um erro de leitura do arquivo."); } } // fim do mtodo main } // fim da classe LeituraSequencialDeStrings

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

13.2.2 Gravao em arquivos sequenciais para Strings


A classe BufferedWriter permite a gravao de Strings em arquivos de texto, de maneira anloga classe BufferedReader. A classe BufferedWriter tambm implementa internamente um buffer de texto para gravao no arquivo: todas as vezes que formos escrever no arquivo, os dados iro para o buffer. que s ser gravado sicamente quando estiver cheio, minimizando o nmero de acessos disco. Alguns mtodos teis da classe BufferedWriter so: BufferedWriter(): o construtor da classe. Este construtor espera um argumento que uma instncia da classe FileWriter, que por sua vez ser criada usando um nome de arquivo como argumento. Opcionalmente, podemos especicar um valor inteiro que ser o tamanho para o buffer a ser criado para a gravao dos caracteres: um buffer maior pode fazer com que o nmero de acessos ao disco seja minimizado, fazendo com que o programa seja executado mais rapidamente, mas ao custo de mais memria em uso. O tamanho default do buffer 8192 bytes. write(): este mtodo grava a String que for passada como argumento para ele no arquivo de sada, respeitando as regras do buffer. Para compatibilidade, nenhum caracter de terminao de linhas (\n, \r, etc.) dever ser usado na String passada como argumento para este mtodo. newLine(): este mtodo sem argumentos grava um terminador de linha (que ser diferente dependendo do sistema operacional sendo usado) no arquivo de sada, respeitando as regras do buffer. A gravao deste terminador no implica no esvaziamento do buffer.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

166 flush(): este mtodo sem argumentos descarrega o buffer no arquivo e esvazia o buffer. Em casos normais (escrita simples em um arquivo) no usado diretamente. close(): este mtodo fecha o arquivo associado com a instncia da classe BufferedWriter, fechando tambm o arquivo associado com a instncia da classe FileWriter que foi usada para construir a instncia de BufferedWriter. Antes de fechar o arquivo, este mtodo executa o mtodo flush() descrito anteriormente. Toda a manipulao das instncias destas classes, inclusive a sua criao, deve estar dentro de um bloco try, e deve existir ao menos um bloco catch para a exceo IOException. O programa na listagem 13.5 mostra como podemos usar uma instncia da classe BufferedWriter para gravar Strings lidas do teclado em um arquivo de texto.

Listagem 13.5: Um programa que grava Strings em um arquivo


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

/* Este programa demonstra o uso da classe BufferedWriter para gravar Strings em um arquivo. */ import java.io.*; // Esta linha obrigatria - permite o uso das classes de I/O class GravacaoSequencialDeStrings { /* O mtodo main permite a execuo da classe */ public static void main(String args[]) { String arquivo = "saida.txt"; // o nome do arquivo representado por uma String System.out.println("Entre vrias palavras, finalizando com uma String vazia"); try // tenta abrir o arquivo, ler dados e fech-lo { // Criamos uma instncia da classe FileWriter FileWriter fw = new FileWriter(arquivo); // E a usamos como argumento para o construtor da classe BufferedWriter BufferedWriter bw = new BufferedWriter(fw); while(true) // em princpio leremos as palavras do teclado para sempre... { String linha = Keyboard.readString(); // lemos uma String do teclado if (linha.equals("")) break; // se for vazia, samos do lao else // a String no vazia, { bw.write(linha); // escrevemos a String na sada bw.newLine(); // escrevemos uma quebra de linha } } // este lao s terminar quando a condio do break ocorrer // Fechamos a instncia da classe BufferedWriter, o que fechar automaticamente a // instncia da classe FileWriter bw.close(); } // fim do bloco try catch (IOException e) // Se houve erros de I/O.. { System.out.println("Houve um erro de leitura do arquivo."); } } } // fim da classe GravacaoSequencialDeStrings

Arquivos tambm podem ser gravados a partir de classes, de forma que o acesso direto aos arquivos que de maneira anloga mostrada no programa na listagem 13.3.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

167

13.3

Arquivos Sequenciais para Tipos Nativos

As classes mostradas na seo anterior implementam leitura e gravao sequencial de Strings de arquivos para que possamos ler e escrever dados de tipos nativos como int, char, double, etc., precisamos converter estes dados de e para Strings. Java tem classes que permitem a gravao e leitura de arquivos sequenciais de tipos nativos, que sero gravados e lidos de arquivos binrios. Neste modo de gravao, ponteiros que apontam para a prxima posio de leitura e gravao tambm so usados, mas diferentemente do caso de arquivos de texto, separadores no so usados, uma vez que cada tipo nativo tem um tamanho denido. Aps cada leitura ou gravao o ponteiro se mover para a prxima posio, que calculada levando em conta o tamanho em bytes dos dados gravados. A gura 13.3 demonstra o funcionamento de ponteiros em um arquivo de leitura.

f f f f i i i i i i i i d d d d d d d d u u u u u u u u u u u u u

um float

um int

outro int

um double

uma String UTF

Figura 13.3: Funcionamento de ponteiros em arquivos sequenciais binrios A gura 13.3 representa um arquivo binrio contendo alguns dados de tipos nativos. No existem separadores entre os dados gravados. Quando o arquivo aberto, o ponteiro deste aponta para o primeiro byte do arquivo (posio 1). Aps a leitura do primeiro dado como um oat (4 bytes), o ponteiro estar apontando para a posio 2. Aps a leitura do segundo dado como um int (4 bytes), o ponteiro estar apontando para a posio 3, e assim sucessivamente. O programador no tem acesso ou controle ao ponteiro. A gura 13.3 mostra, na representao do arquivo, um tipo de dado no visto at agora: uma String UTF (Unicode Transfer Format), que uma representao de Strings que engloba tambm o tamanho da String, dispensando separadores, mas com a limitao de 65535 caracteres. Este tipo de dado til para gravao e leitura em arquivos juntamente de outros tipos nativos. Para os programas, estes tipos sero processados como Strings normais, como ser visto nos exemplos.

13.3.1

Leitura em arquivos sequenciais para dados de tipos nativos

A classe DataInputStream permite a leitura de dados de qualquer tipo nativo a partir de arquivos binrios. Alguns mtodos teis da classe DataInputStream so: DataInputStream(): o construtor da classe. Este construtor espera um argumento que uma instncia da classe FileInputStream, que por sua vez ser criada usando um nome de arquivo como argumento. available(): este mtodo retorna o nmero de bytes que ainda pode lido do arquivo. Este mtodo pode ser usado para vericar o m do arquivo, quando no houverem mais bytes disponveis para leitura. readBoolean(): este mtodo l e retorna um valor do tipo boolean do arquivo. readChar(): este mtodo l e retorna um valor do tipo char do arquivo. readByte(): este mtodo l e retorna um valor do tipo byte do arquivo.
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

168 readUnsignedByte(): este mtodo l e retorna um byte do arquivo, mas considera que este valor no tem sinal (estando na faixa de valores 0 255), e retorna o valor lido como um inteiro. readShort(): este mtodo l e retorna um valor do tipo short do arquivo. readUnsignedShort(): este mtodo l e retorna um short do arquivo, mas considera que este valor no tem sinal (estando na faixa de valores 0 65535), e retorna o valor lido como um inteiro. readInt(): este mtodo l e retorna um valor do tipo int do arquivo. readLong(): este mtodo l e retorna um valor do tipo long do arquivo. readFloat(): este mtodo l e retorna um valor do tipo oat do arquivo. readDouble(): este mtodo l e retorna um valor do tipo double do arquivo. readUTF(): este mtodo l e retorna uma String codicada no formato UTF (Unicode Transfer Format), que representa o tamanho da String junto com a prpria String. Uma String representada no formato UTF deve ter no mximo 65535 caracteres. Este mtodo s deve ser usado para ler Strings se estas forem escritas no formato UTF - veja o mtodo writeUTF da classe DataOutputStream na seo 13.3.2. close(): este mtodo fecha o arquivo associado com a instncia da classe DataInputStream, fechando tambm o arquivo associado com a instncia da classe FileInputStream que foi usada para construir a instncia de DataInputStream. Da mesma forma com que outras classes, toda a manipulao das instncias destas classes, inclusive a sua criao, deve estar dentro de um bloco try, e deve existir ao menos um bloco catch para a exceo IOException. O programa na listagem 13.6 mostra como podemos usar uma instncia da classe DataInputStream para ler um arquivo de valores do tipo oat, um a um, at o m do arquivo, calculando o maior e menor valores no arquivo.

Listagem 13.6: Um programa que l valores do tipo oat de um arquivo


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

/* Este programa demonstra o uso da classe DataInputStream para ler valores de tipos nativos de um arquivo. */ import java.io.*; // Esta linha obrigatria - permite o uso das classes de I/O class LeituraSequencialDeFloats { /* O mtodo main permite a execuo da classe */ public static void main(String args[]) { String arquivo = "floats.dat"; // o nome do arquivo representado por uma String // Inicializamos duas variveis que contero o maior e menor floats que sero lidos // de um arquivo. Para inicializar o algoritmo, usamos os valores contrrios. float maior=Float.MIN_VALUE,menor=Float.MAX_VALUE; try // tenta abrir o arquivo, ler dados e fech-lo { // Criamos uma instncia da classe FileInputStream FileInputStream fis = new FileInputStream(arquivo); // E a usamos como argumento para o construtor da classe DataInputStream DataInputStream dis = new DataInputStream(fis); while(true) // em princpio este lao se repetir para sempre { float valor = dis.readFloat(); // lemos um nico float do arquivo if (dis.available() <= 0) // se depois da leitura no existirem mais bytes disponveis, break; // samos do lao de leitura else // seno, processamos o valor lido { if (valor > maior) maior = valor; // comparamos com o maior, e mudamos se for maior

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

169
if (valor < menor) menor = valor; // comparamos com o menor, e mudamos se for menor } } // sairemos do lao quando no houverem mais bytes a ser lidos // Fechamos a instncia da classe DataInputStream, o que fechar automaticamente a // instncia da classe FileInputStream dis.close(); } // fim do bloco try catch (FileNotFoundException e) // Se o arquivo no foi encontrado... { System.out.println("O arquivo no foi encontrado."); } catch (IOException e) // Se houve erros de I/O.. { System.out.println("Houve um erro de leitura do arquivo."); } // Ao final, imprimimos o maior e o menor valores lidos do arquivo System.out.println("O maior valor foi "+maior); System.out.println("O menor valor foi "+menor); } } // fim da classe LeituraSequencialDeFloats

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

13.3.2 Gravao em arquivos sequenciais para dados de tipos nativos


A classe DataOutputStream permite a gravao de dados de qualquer tipo nativo em arquivos binrios. Alguns mtodos teis da classe DataOutputStream so: DataOutputStream(): o construtor da classe. Este construtor espera um argumento que uma instncia da classe FileOutputStream, que por sua vez ser criada usando um nome de arquivo como argumento. writeBoolean(): este mtodo recebe como argumento e grava um valor do tipo boolean no arquivo. writeChar(): este mtodo recebe como argumento e grava um valor do tipo char no arquivo. writeByte(): este mtodo recebe como argumento e grava um valor do tipo byte no arquivo. writeShort(): este mtodo recebe como argumento e grava um valor do tipo short no arquivo. writeInt(): este mtodo recebe como argumento e grava um valor do tipo int no arquivo. writeLong(): este mtodo recebe como argumento e grava um valor do tipo long no arquivo. writeFloat(): este mtodo recebe como argumento e grava um valor do tipo oat no arquivo. writeDouble(): este mtodo recebe como argumento e grava um valor do tipo double no arquivo. writeUTF(): este mtodo recebe como argumento e grava uma String no arquivo. Esta String estar codicada no formato UTF (Unicode Transfer Format), que representa o tamanho da String junto com a prpria String. Uma String representada no formato UTF deve ter no mximo 65535 caracteres. Este mtodo s deve ser usado para gravar Strings se estas forem lidas posteriormente no formato UTF - veja o mtodo readUTF da classe DataInputStream na seo 13.3.1. flush(): este mtodo sem argumentos fora a gravao de quaisquer valores que ainda no tenham sido gravados no arquivo. close(): este mtodo fecha o arquivo associado com a instncia da classe DataOutputStream, fechando tambm o arquivo associado com a instncia da classe FileOutputStream que foi usada para construir a instncia de DataOutputStream. Antes de fechar o arquivo, este mtodo executa o mtodo flush() descrito anteriormente.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

170 Um exemplo mais elaborado de uso das classes DataOutputStream e DataInputStream ser mostrado a seguir. O programa na listagem 13.7 mostra como podemos encapsular a capacidade de ler e gravar dados de uma classe em um arquivo.

Listagem 13.7: A classe ContaBancaria que faz operaes de gravao e leitura em um arquivo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

import java.io.*; // Esta linha obrigatria - permite o uso das classes de I/O /* Esta a classe ContaBancaria, com funes de entrada e sada dos dados atravs de arquivos */ class ContaBancaria { /* Dados de uma conta bancria simplificada */ private String nome; // nome do correntista private int nmero; // nmero da conta private float saldo; // saldo da conta private boolean Especial; // a conta especial ou no ? /* Construtor vazio - perguntar os dados para o usurio entrar pelo teclado */ ContaBancaria() { System.out.print("Entre o nome do cliente:"); nome = Keyboard.readString(); System.out.print("Entre o nmero da conta:"); nmero = Keyboard.readInt(); System.out.print("Entre o saldo inicial:"); saldo = Keyboard.readFloat(); System.out.print("Entre s para conta especial:"); Especial = Keyboard.readBoolean(); } /* Construtor que inicializa os valores com argumentos */ ContaBancaria(String n,int num,float s,boolean e) { nome = n; // inicializa o nome nmero = num; // inicializa o nmero da conta saldo = s; // inicializa o saldo Especial = e; // inicializa o booleano Especial } /* Construtor que inicializa os valores atravs da leitura de um arquivo */ ContaBancaria(DataInputStream dis) throws IOException { nome = dis.readUTF(); // l o nome nmero = dis.readInt(); // l o nmero da conta saldo = dis.readFloat(); // l o saldo Especial = dis.readBoolean(); // l o booleano Especial } /* Mtodo que grava os valores da classe em um arquivo */ void grava(DataOutputStream dos) throws IOException { dos.writeUTF(nome); // grava o nome dos.writeInt(nmero); // grava o nmero da conta dos.writeFloat(saldo); // grava o saldo dos.writeBoolean(Especial); // grava o booleano Especial } /* Este mtodo deposita um valor na conta bancria */ void deposita(float valor) { saldo = saldo + valor; } /* Este mtodo retira um valor da conta bancria */ void retira(float valor) { if (valor > saldo) // se o valor a retirar maior que o saldo { Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

171
if (Especial) saldo = saldo - valor; // retira o valor } else // o valor no maior que o saldo saldo = saldo - valor; // retira o valor } /* Este mtodo retorna o saldo da conta bancria */ float retornaSaldo() { return saldo; } /* Este mtodo retorna o nmero da conta bancria */ int retornaNmero() { return nmero; } /* Este mtodo concatena os dados da conta bancria em uma String para impresso */ public String toString() { String res = nome+" "+nmero+" "+saldo; if (Especial) res += " (conta especial)"; return res; } } // fim da classe ContaBancaria

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

Instncias desta classe podem ser construdas usando uma instncia da classe DataInputStream, que deve ser criada em um programa ou classe que contenha instncias da classe ContaBancaria, como mostrado no programa da listagem 13.8.

Listagem 13.8: Programa que usa instncias da classe ContaBancaria (inicializadas a partir de um arquivo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

/* Este programa demonstra o uso da classe DataOutputStream para gravar instncias da classe ContaBancaria. Vrias instncias sero criadas com dados lidos do teclado e gravadas em um arquivo. */ import java.io.*; // Esta linha obrigatria - permite o uso das classes de I/O class CriaArqContaBancaria { /* O mtodo main permite a execuo da classe */ public static void main(String args[]) { // Perguntamos em que arquivo devero ser gravadas as instncias de ContaBancaria System.out.print("Nome do arquivo a ser criado:"); String arquivo = Keyboard.readString(); // lemos o nome do arquivo do teclado // Perguntamos quantas contas bancrias sero gravadas no arquivo System.out.print("Quantas contas bancrias sero criadas ?:"); int ncontas = Keyboard.readInt(); // lemos o nmero de contas do teclado try // tenta abrir o arquivo, gravar dados e fech-lo { // Criamos uma instncia da classe FileOutputStream e a // usamos no construtor da DataOutputStream DataOutputStream dos = new DataOutputStream(new FileOutputStream(arquivo)); for(int i=0;i<ncontas;i++) { // O construtor vazio da classe ContaBancaria pede os dados pelo teclado ContaBancaria cb = new ContaBancaria(); // Gravamos os dados no arquivo criado cb.grava(dos); } // Fechamos a instncia da classe BufferedReader dos.close(); Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

172
} // fim do bloco try catch (IOException e) // Se houve erros de I/O.. { System.out.println("Houve um erro de gravao no arquivo."); } } // fim do mtodo main } // fim da classe CriaArqContaBancaria

32 33 34 35 36 37 38

13.4

Exerccios do captulo 13

Exerccio 13.1: Modique o programa na listagem 13.1 para que o nome do arquivo seja passado pela linha de comando. O programa no deve ser executado se nenhum argumento ou mais do que um argumento forem passados pela linha de comando. Exerccio 13.2: Modique o programa na listagem 13.1 para que as Strings lidas sejam impressas no terminal. Exerccio 13.3: Modique o programa na listagem 13.1 para que o total de caracteres seja calculado, ao invs do total de linhas. Dica: use o mtodo length() da classe String. Exerccio 13.4: Modique o programa na listagem 13.1 para que todo o contedo do arquivo seja lido em uma nica String. Faa com que o programa imprima esta String no nal. O resultado da impresso igual ao arquivo original ? Porqu ? Dica: use um arquivo bem menor do que o linux.words para fazer os testes. Exerccio 13.5: Escreva um programa em Java que abra um arquivo de texto para entrada (usando a classe BufferedReader) e um para sada (usando a classe BufferedWriter) e copie todas as linhas do arquivo de entrada para o arquivo de sada. Exerccio 13.6: Escreva um programa em Java que abra um arquivo de texto para entrada (usando a classe BufferedReader) e calcule quantos espaos existem neste arquivo. Dica: use o mtodo charAt() da classe String. Exerccio 13.7: Usando o exerccio 9.15 como base, escreva um programa em Java que desacentue todas as Strings de um arquivo. Exerccio 13.8: Usando o exerccio 9.17 como base, escreva um programa em Java que leia um arquivo linha por linha e imprima somente as linhas que sejam palndromas.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

173

Exerccio 13.9: Escreva um programa em Java que leia um arquivo de texto linha por linha e imprima somente as consoantes do texto contido no arquivo. Exerccio 13.10: Usando o exerccio 9.20 como base, escreva um programa em Java que leia um arquivo linha por linha e imprima somente as linhas que contenham palavras com caracteres repetidos (rr, ee, etc.) Exerccio 13.11: Usando o exerccio 9.23 como base, escreva um programa em Java que leia o arquivo linux.words (seo 13.2.1) e imprima, para cada palavra no arquivo, o nmero de pontos que esta valeria no jogo de palavras cruzadas. Exerccio 13.12: Escreva um programa em Java que receba da linha de comando um nome de arquivo e uma String, abra o arquivo indicado e leia todas as suas linhas, imprimindo somente as linhas que contm a String passada como argumento. Dica: use o mtodo indexOf() da classe String para vericar se a linha do arquivo contm a String especicada. Exerccio 13.13: Modique o programa do exerccio 13.12 para que somente as palavras do arquivo que comeem ou terminem com a String passada como argumento sejam impressas. Por exemplo, se o arquivo linux.words for usado e a String passada for inter, o programa dever imprimir intersect e pointer mas no dever imprimir uninteresting. Exerccio 13.14: Escreva um programa em Java que leia um arquivo de palavras como o linux.words (veja seo 13.2.1) e imprima a palavra mais curta e a mais longa deste arquivo. Exerccio 13.15: Escreva um programa em Java leia um arquivo de palavras como o linux.words (veja seo 13.2.1) e calcule quantas vezes um caracter (que pode ser passado pela linha de comando) ocorre naquele arquivo. Exerccio 13.16: No programa na listagem 13.6 vericamos o m de arquivo vendo quantos bytes ainda podemos ler se no pudermos ler mais nenhum, consideramos que o m do arquivo foi alcanado. Outra maneira de vericar m de arquivo capturando a exceo EOFException em um dos blocos catch, e fechando o arquivo caso esta exceo ocorra. Modique a listagem 13.6 para que use a exceo EOFException para vericar se o m de arquivo foi encontrado. Exerccio 13.17: O programa na listagem 13.6 l um arquivo de dados do tipo oat. Escreva um programa em Java, usando a classe DataOutputStream, que crie um arquivo de 10.000 valores aleatrios do tipo oat, entre 0 e 1000.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

174

Exerccio 13.18: Escreva um programa em Java que abra um arquivo de texto para entrada (usando a classe BufferedReader) e calcule quantos caracteres de cada tipo existem neste arquivo. Considere caracteres maisculos e minsculos como sendo iguais. Considere 27 categorias de caracteres: uma para cada letra e uma categoria outros, que receber todos os caracteres que no so letras. Dicas: use o mtodo charAt() da classe String, e um array de 27 inteiros para receber os caracteres. Veja tambm o exerccio 13.15. Exerccio 13.19: Escreva um programa em Java que leia um arquivo de texto de entrada, transforme todas as Strings deste arquivo usando o algoritmo rot13 e as grave em outro arquivo de sada. Dicas: use o exerccio 9.29 como base, veja tambm o exerccio 13.5. Exerccio 13.20: Escreva um programa em Java que leia dois arquivos de texto simultaneamente e compare os contedos destes arquivos (linha por linha). Se os arquivos forem iguais, uma mensagem apropriada deve ser impressa. Se os arquivos forem diferentes, assim que a diferena for detectada, as linhas diferentes devem ser impressas e o programa deve terminar. Dica: use a classe BufferedReader para ler os arquivos, e compare-os com o mtodo compare da classe String, que retorna zero somente se as Strings sendo comparadas so iguais. Exerccio 13.21: Escreva um programa em Java que leia um arquivo de palavras e crie trs arquivos de sada. As palavras lidas que tiverem menos do que seis caracteres devem ser gravadas no primeiro arquivo de sada, as que tiverem entre seis e dez caracteres devem ser gravadas no segundo arquivo de sada e as que tiverem mais de dez caracteres devem ser gravadas no terceiro arquivo de sada. Ao nal da execuo do programa mostre no terminal quantas palavras foram gravadas em cada um destes arquivos. Exerccio 13.22: Escreva um programa em Java que use o algoritmo de Csar (exerccio 9.30) para codicar um arquivo de texto, linha por linha. Faa com que o usurio possa entrar o nome do arquivo de entrada, o nome do arquivo de sada e a chave a ser usada pela linha de comando. Exerccio 13.23: Modique o programa na listagem 13.4 para que este calcule o lucro total que seria obtido caso todos os livros em estoque fossem vendidos. Para isto, ser necessrio modicar a classe LivroLivraria (listagem 13.3), criando um mtodo que retorne, para uma instncia da classe, o lucro esperado (valor de venda menos o valor de compra multiplicado pelo nmero de livros em estoque). O lucro total ser dado pela soma do lucro esperado de todos os livros. Exerccio 13.24: Modique o programa na listagem 13.6 para que todos os valores do tipo oat sejam lidos do arquivo para um array. Dica: necessrio saber o nmero de posies que o array deve conter, para isso podemos vericar o nmero de bytes que ainda podem ser lidos do arquivo assim que este aberto. Como cada dado do tipo oat ocupa quatro bytes, podemos calcular o tamanho do array necessrio.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

175

Exerccio 13.25: Usando a classe ContaBancaria como base, escreva um programa em Java que abra um arquivo para leitura e dele leia instncias da classe ContaBancaria e imprima-as no terminal. O arquivo tababank.dat pode ser usado para isto (veja seo 13.1.2 para informaes sobre como obter este arquivo). Exerccio 13.26: Usando o exerccio exer:arquivos-lecontas como base, escreva um programa em Java que leia um arquivo contendo dados de contas bancrias e imprima o maior saldo das contas naquele arquivo e a conta que tem o maior saldo. Exerccio 13.27: Modique a classe LivroLivraria (listagem 13.3) para que esta tenha um mtodo grava, que recebendo uma instncia da classe BufferedWriter como argumento, grave os dados do livro na mesma, de forma que outras instncias da classe LivroLivraria possam ler estes dados. Dica: necessrio formatar os dados da instncia de LivroLivraria para que estes ocupem o mesmo tamanho esperado pelo construtor - algumas Strings devero ser completadas com espaos para chegar no tamanho desejado, enquanto outras devero ser cortadas. Alguns valores numricos devero ser transformados em Strings, veja tambm o exerccio 9.36 Exerccio 13.28: Escreva um programa em Java que, a partir de um arquivo de textos de entrada, leia todas as Strings deste arquivo e como resultado imprima o cdigo morse correspondente elas. Use o exerccio 9.37 como base. Exerccio 13.29: O programa da listagem 13.4 considera que existem 19 registros no arquivo de livros, mas raramente este ser o caso. O programa tambm limitado: ele l todos os dados em uma nica instncia da classe LivroLivraria, o que impossibilita processamentos mais elaborados. Para melhorar a funcionalidade do programa, considere que ele deve ler todas as instncias da classe LivroLivraria em um array de instncias, podendo processar todos os livros simultaneamente. Para alocar memria para o array de instncias, necessrio saber quantos livros existem em um arquivo, bastando para isto ler o arquivo uma vez para determinar o nmero de linhas que ele contm. Modique o programa para que ele use um array de instncias da classe LivroLivraria. Dica: use tambm a listagem 13.1 como base. Exerccio 13.30: No possvel, com as classes vistas nesta seo, a abertura de arquivos para leitura e gravao simultnea. Para incluir os dados de uma conta bancria em um arquivo j existente, este arquivo dever ser aberto como um arquivo de leitura, seu contedo copiado em outro arquivo (aberto para gravao) e os novos dados entrados e gravados no arquivo de sada. Escreva um programa em Java que faa isto, usando como argumentos passados pela linha de comando duas Strings, uma contendo o nome do arquivo original e outra contendo o nome do arquivo a ser criado. Aps a cpia dos dados velhos no novo arquivo, este deve ser completado com algumas instncias da classe ContaBancaria. Dica: use a listagem 13.8 como base.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

176

Exerccio 13.31: Escreva um intepretador (programa que l comandos de uma linguagem e os executa um a um) para a linguagem PaleoBasic. Esta linguagem bastante simples serve para efetuarmos operaes com variveis e imprimirmos os resultados no terminal. PaleoBasic reconhece 26 variveis, chamadas a, b, etc., sendo que todas so do tipo double. PaleoBasic reconhece os seguintes comandos: var = valor: coloca o valor valor na varivel var. valor pode ser uma constante, uma outra varivel, ou uma expresso matemtica simples. PaleoBasic somente conhece somas, subtraes, multiplicaes e divises simples (com dois valores). print var: imprime na tela o valor da variavel var. Cada comando em PaleoBasic escrito em uma linha, e o interpretador deve ler estas linhas de um arquivo. Para exemplicar, aqui est um exemplo de programa correto em PaleoBasic:
a = 12 b = 13 c = a + b print c

Outro exemplo correto mostrado abaixo. Este exemplo calcula o valor de delta para a soluo de uma equao do segundo grau:
a = -8 b = 7 c = -4 x = b*b y = 4*a z = y*c d = x-z print d

Um programa em PaleoBasic pode conter erros que devem ser identicados pelo interpretador. O programa abaixo contm erros de sintaxe:
a - 2 b = r = e print

Dicas: em algumas ocasies os espaos em uma String lida de um arquivo devem ser ignoradas. Para vericar se a linha um comando de atribuio, verique se o segundo caracter da linha (aps a remoo de espaos) um sinal =. As variveis podem ser representadas por um array de doubles.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

177

Captulo 14 Estruturas de Dados Bsicas em Java


14.1 14.2 A classe Vector A classe Hashtable

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

178

Apndice A Tipos de Dados em Java


A.1 Tipos de dados nativos em Java

Java possui vrios tipos de dados nativos ou primitivos, que podem ser usados diretamente em programas e classes, tanto para armazenamento de variveis quando para operaes simples. Por no serem implementados como classes, as operaes possveis com estes tipos so pouco exveis mas para compensar estes tipos so ecientes no uso de memria e processamento. Os tipos nativos de Java sero apresentados a seguir.

A.1.1

O tipo bsico byte

Variveis do tipo byte podem representar valores inteiros na faixa -128 a 127, que podem ser atribudos diretamente ou atravs de operaes. Alguns exemplos de uso do tipo bsico byte so mostrados no programa na listagem A.1.

Listagem A.1: Programa que demonstra usos do tipo byte


1 2 3 4 5 6 7 8 9 10 11 12 13

/* Esta classe demonstra usos do tipo byte */ class DemoByte { public static void main(String argumentos[]) { byte b1,b2; // declarao das variveis b1 = -1; // b1 valer -1 b2 = 123-2; // b2 valer 121 byte b3 = 122-123; // b3 valer -1 byte b4 = 12*10; // b4 valer 120 byte b5 = 12/10; // b5 valer 1 (diviso com valores inteiros) } }

Na linha 10 da listagem A.1, somente a parte inteira do resultado foi considerada, j que o tipo nativo byte no pode representar casas decimais. A operao mostrada na linha 9 vlida (no gera erros de compilao nem de execuo) porque o resultado estar na faixa de valores vlidos para o tipo nativo byte e os valores da operao so constantes. Podemos tambm notar que possvel declarar as variveis sem inicializ-las imediatamente (linha 5) e declar-las e inicializ-las ao mesmo tempo (linhas 8 a 10).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

179 Alguns exemplos de uso incorreto do tipo nativo byte so mostrados no programa na listagem A.2, com comentrios indicando o erro. Listagem A.2: Programa que demonstra usos incorretos do tipo byte
1 2 3 4 5 6 7 8 9 10 11 12 13 14

/* Esta classe demonstra usos incorretos do tipo byte */ class DemoByte { public static void main(String argumentos[]) { byte b1,b2,b3; // declarao das variveis b1 = 123456; // ERRO DE COMPILAO: valor fora da faixa vlida para bytes b2 = 1.24; // ERRO DE COMPILAO: valor de ponto flutuante b3 = 12000.24; // ERRO DE COMPILAO: valor de ponto flutuante byte b4 = true; // ERRO DE COMPILAO: constante do tipo boolean byte b5 = 10; // Compilao sem problemas byte b6 = b5*b5; // ERRO DE COMPILAO: resultado da operao * do tipo int } }

Na listagem A.2, vrios erros ocorreram porque tentamos colocar valores incompatveis com a capacidade das variveis tipo byte. Variveis declaradas como sendo do tipo byte no podem receber valores do tipo boolean, de qualquer tipo inteiro diferente de byte ou de qualquer tipo de ponto utuante. possvel converter foradamente valores de outros tipos para o tipo byte: esta operao conhecida como cast, e geralmente envolve alguma perda de preciso. O programa na listagem A.3 mostra exemplos de converso que funcionaro para as linhas 6, 7 e 8, mas no para a linha 9, que ainda gerar um erro de compilao:

Listagem A.3: Programa que demonstra cast (converso) de tipos


1 2 3 4 5 6 7 8 9 10 11 12

/* Esta classe demonstra exemplos de cast (converso) do tipo byte */ class DemoByte { public static void main(String argumentos[]) { byte x1,x2; // declarao das variveis x1 = (byte)123456; // converte 123456 para 64 x2 = (byte)1.24; // converte 1.24 para 1 byte x3 = (byte)12000.24; // converte 12000.24 para -32 byte x4 = (byte)true; // ERRO DE COMPILAO: impossvel converter para byte } }

No exemplo de converso da linha 6 da listagem A.3, o valor inteiro 123456 foi convertido para 64. Vamos examinar esta converso com mais detalhes: um nmero inteiro representado por 32 bits (veja seo A.1.4 abaixo), mas uma varivel do tipo byte somente usa 8 bits, ento os 24 bits superiores so eliminados (zerados), como mostrado abaixo: 123456 em 32 bits: 00000000000000011110001001000000 24 bits superiores eliminados ........................01000000

Resultado: 64

Para a converso mostrada na linha 7 da listagem A.3, Java converter primeiro o valor de ponto utuante para um valor inteiro de 32 bits, e eliminar os 24 bits superiores. Detalhes da converso so mostrados
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

180 abaixo: 12000 em 32 bits: 24 bits superiores eliminados 00000000000000000010111011100000 ........................11100000

Resultado: -32

No exemplo de converso acima, o primeiro bit do valor do tipo byte determina o sinal do valor, atravs da subtrao de 128 do valor expresso pelos sete bits restantes.

A.1.2

O tipo bsico char

O tipo char representa um nico caracter em Java. Diferente de outras linguagens de programao, Java representa um caracter com dois bytes, possibilitando a representao de caracteres em vrias lnguas simultaneamente, no somente como caracteres a serem lidos, processados ou impressos, mas como parte dos prprios programas em Java1 . O suporte para lnguas estrangeiras dado pelo sistema operacional nem todos os caracteres podero ser usados em qualquer sistema. O tipo char equivalente um inteiro de 16 bits sem sinal, capaz de representar valores na faixa 0 a 65535, que podem at mesmo ser usados para operaes simples. O programa na listagem A.4 mostra alguns exemplos vlidos de uso do tipo char, onde vemos caracteres especicados diretamente entre aspas simples () ou por valores numricos inteiros:

Listagem A.4: Programa que demonstra usos do tipo char


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

/* Esta classe demonstra usos do tipo char */ class DemoChar { public static void main(String argumentos[]) { char c1,c2,c3,c4; // declarao das variveis c1 = a; // caracter ASCII normal c2 = !; // caracter ASCII normal (smbolo) c3 = ; // caracter especial (portugus) c4 = ; // caracter especial (alemo) char c5 = a+1; // operao vlida: resultado b char c6 = B-1; // operao vlida: resultado A char c7 = 123; // valor especificado diretamente: caracter { char c8 = 7; // valor especificado diretamente: sinal sonoro char c9 = 7; // caracter ASCII 7 - diferente do sinal sonoro } }

Alguns exemplos de uso incorreto para variveis do tipo char so mostrados no programa na listagem A.5.

Listagem A.5: Programa que demonstra usos incorretos do tipo char


1 2 3 4

/* Esta classe demonstra usos incorretos do tipo char */ class DemoChar { public static void main(String argumentos[]) no-alfanumricos (acentos, letras estrangeiras, smbolos especiais, etc.) podem at aparecer em nomes de classes, mtodos e variveis, mas na prtica deve-se evitar o uso de caracteres no-alfanumricos para nomes de classes para evitar problemas com o sistema de arquivos dos computadores, que podem no reconhecer nomes de arquivos com estes caracteres. Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)
1 Caracteres

181
{ char c1 = c2 = c3 = char char char char char } }

5 6 7 8 9 10 11 12 13 14 15 16

c1,c2,c3; 65536; -1; 3.1416; c4 = false; c5 = ; c6 = AB; c7 = A+$; c8 = "A";

// // // // // // // // //

declarao das variveis ERRO: valor inteiro diferente de char ERRO: valor inteiro com sinal, diferente de char ERRO: valor de ponto flutuante ERRO: constante do tipo boolean ERRO: caracter vazio no pode ser usado ERRO: mais de um caracter entre aspas No um erro, mas resultado e (65+36) ERRO: caracter deve ser especificado com aspas simples

Alguns dos erros do programa na listagem A.5 acima podem ser evitados atravs do cast dos valores, mas mesmo assim perda de preciso pode ocorrer. Se o cast for feito nas linhas 6, 7 e 8 do trecho de programa acima, as variveis c1, c2 e c3 valero respectivamente 0, 65535 e 3. O cast de um valor booleano para a varivel c4 no poder ser feito, assim como o cast de uma String para um nico caracter na linha 13. As linhas 10 e 11 da listagem A.5 apresentam erros de caracteres invlidos (constantes com menos ou mais de um nico caracter). A varivel c7, embora no apresente erros de compilao ou execuo, ter os valores somados ao invs de concatenados. importante lembrar que variveis do tipo bsico char podem representar somente um caracter por vez. Para representao de vrios caracteres (cadeia de caracteres ou Strings), veja a seo A.2.1.

A.1.3

O tipo bsico short

Variveis do tipo short podem representar valores inteiros com 16 bits de preciso, na faixa -32768 a 32767. Variveis deste tipo podem receber valores diretamente ou atravs de operaes, como mostrado no programa na listagem A.6.

Listagem A.6: Programa que demonstra usos do tipo short


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

/* Esta classe demonstra usos do tipo short */ class DemoShort { public static void main(String argumentos[]) { short s1,s2,s3; // declarao das variveis s1 = 1000; // s1 valer 1000 s2 = 1-1000; // s2 valer -999 s3 = 100*100; // s3 valer 10000 short s4 = A; // s4 valer 65 (valor do caracter A) short s5 = s3; // s5 valer 10000 short s6 = 1999/10; // s6 valer 199 (diviso com valores inteiros) short s7 = -A; // no-convencional mas vlido: s7 valer -65. } }

Alguns exemplos de uso incorreto de variveis do tipo short so mostrados no programa na listagem A.7.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

182

Listagem A.7: Programa que demonstra usos incorretos do tipo short


1 2 3 4 5 6 7 8 9 10 11 12 13

/* Esta classe demonstra usos incorretos do tipo short */ class DemoShort { public static void main(String argumentos[]) { short s1,s2; // declarao das variveis s1 = 123456; // ERRO: valor fora da faixa vlida para shorts s2 = 100.1; // ERRO: valor de ponto flutuante short s3 = true; // ERRO: constante de tipo boolean short s4 = "A"; // ERRO: "A" no um caracter, no pode ser convertido short s5 = 999*999; // ERRO: resultado fora da faixa vlida para shorts } }

Todos os erros acima sero indicados pelo compilador. Os erros das linhas 6, 7 e 10 podero ser resolvidos atravs do cast, mas com perda de preciso ou informao.

A.1.4

O tipo bsico int

Variveis do tipo bsico int podem representar valores numricos inteiros que estejam dentro da faixa -2147483648 a 2147483647, usando 4 bytes para represent-los. Alguns exemplos de uso de variveis do tipo int so mostrados no programa na listagem A.8.

Listagem A.8: Programa que demonstra usos do tipo int


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

/* Esta classe demonstra usos do tipo int */ class DemoInt { public static void main(String argumentos[]) { int i1,i2; // declarao das variveis i1 = -1000000; // i1 valer -1000000 i2 = -i1*2; // i2 valer 2000000 int i3 = i1+i2; // i3 valer 1000000 int i4 = 123*200; // i4 valer 24600 int i5 = 123/200; // i5 valer 0 (diviso com valores inteiros) int i6,i7; // declarao das variveis i6 = 123/120; // i6 valer 1 (diviso com valores inteiros) i7 = X; // i7 valer 88 (valor do caracter X) } }

Alguns exemplos de uso incorreto de variveis do tipo int so mostrados no programa na listagem A.9.

Listagem A.9: Programa que demonstra usos incorretos do tipo int


1 2 3 4 5 6 7 8

/* Esta classe demonstra usos incorretos do tipo int */ class DemoInt { public static void main(String argumentos[]) { int i1,i2; // declarao das variveis i1 = 99999*99999; // ERRO GRAVE: Compilador no gerar erro, mas // resultado ser -1409865409 ao invs de 999998000001 Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

183
i2 = 0.00001; int i3 = true; int i4 = "X"; } } // ERRO: valor de ponto flutuante // ERRO: constante do tipo boolean // ERRO: "X" no um caracter, no pode ser convertido

9 10 11 12 13

Um erro particularmente grave mostrado na linha 6: o compilador no indicar que a conta ser calculada incorretamente. Este erro chamado de erro de overow. Todos os outros erros sero indicados pelo compilador, e o da linha 8 pode ser resolvido atravs do cast, mas com perda de preciso ou informao.

A.1.5

O tipo bsico long

Variveis do tipo bsico long podem representar valores numricos inteiros que estejam dentro da faixa de valores -9223372036854775808 a 9223372036854775807, usando 8 bytes para represent-los. Alguns exemplos de uso de variveis do tipo long so mostrados no programa na listagem A.10.

Listagem A.10: Programa que demonstra usos do tipo long


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

/* Esta classe demonstra usos do tipo long */ class DemoLong { public static void main(String argumentos[]) { long l1,l2,l3; // declarao das variveis l1 = 9999999999; // l1 valer 1410065407 l2 = (long)9999999999; // l2 valer 1410065407 (valor considerado inteiro antes do cast) l3 = 9999999999L; // l3 valer 9999999999 (valor considerado long) long l4 = l3*999999; // l4 valer 9999989999000001 long l5 = 1/2; // l5 valer 0 (diviso com valores inteiros) long l6,l7; // declarao das variveis l6 = 13/2; // l6 valer 2 (diviso com valores inteiros) l7 = A*B*C; // l7 valer 287430 (multiplicao dos valores 65,66 e 67) } }

As linhas 6 e 7 da listagem A.10 mostram uma surpresa: mesmo com o cast feito na linha 7 o valor correto (9999999999) no foi aceito pela varivel. A razo que o valor foi considerado constante inteiro (tipo int) antes de ser convertido para o tipo long atravs do cast, que no teve efeito. Para especicar valores do tipo long como constantes em um programa, devemos anexar aos valores a letra L como mostrado na linha 8 da listagem A.10. Na linha 9, como o primeiro valor do tipo long, o cast no necessrio. Alguns exemplos de uso incorreto de variveis do tipo long so mostrados no programa na listagem A.11.

Listagem A.11: Programa que demonstra usos incorretos do tipo long


1 2 3 4 5 6 7 8 9 10

/* Esta classe demonstra usos incorretos do tipo long */ class DemoLong { public static void main(String argumentos[]) { long l1,l2,l3,l4; // declarao das variveis l1 = 3.1415926536; // ERRO: valor de ponto flutuante, cast necessrio. l2 = 10000*10000.1; // ERRO: um dos valores ponto flutuante, cast necessrio. l3 = 9999999999999999L; // l3 valer 9999999999999999 (veja o "L") l4 = l3*l3; // ERRO DE OVERFLOW: l4 valer -8834407033341083647 Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

184
long l5 = l6 = l7 = } } l5,l6,l7; true; "1234567890"; (long)3000000000; // // // // declarao das variveis ERRO: constante boolean, cast no possvel. ERRO: constante String, cast no possvel. ERRO: o compilador no aceita o valor 3000000000, mesmo com o cast

11 12 13 14 15 16

A maioria dos erros na listagem A.11 j foram vistos em exemplos de outros tipos de dados. O erro mais crtico o de overow, que ocorre na linha 9. Vale a pena lembrar que este tipo de erro no registrado em tempo de compilao ou de execuo, e pode ser difcil de ser identicado em um programa. Outro erro interessante mostrado na linha 13: o valor 3000000000 considerado pelo compilador como sendo do tipo int antes da converso pelo cast, gerando um erro de compilao. A soluo neste caso escrever o valor com a letra L anexada, como 3000000000L, para garantir que o compilador aceitar o valor como long.

A.1.6

O tipo bsico float

Variveis do tipo bsico float podem representar valores numricos com ponto utuante que estejam dentro da faixa 1.40129846432481707e-45 a 3.40282346638528860e+38 (positivos e negativos)2 mas sem preciso exata. O tipo bsico float usa a mesma memria do tipo int (4 bytes), mas os valores so arredondados. Alguns exemplos de uso de variveis do tipo float so mostrados no programa na listagem A.12.

Listagem A.12: Programa que demonstra usos do tipo float


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

/* Esta classe demonstra usos do tipo float */ class DemoFloat { public static void main(String argumentos[]) { float f1,f2,f3,f4,f5,f6; // declarao das variveis f1 = (float)3.1415926536; // f1 valer 3.1415927 - note o arredondamento f2 = 3.1415926536F; // f2 valer 3.1415927 - note o arredondamento f3 = f1-f2; // f3 valer 0 f4 = 1/2; // f4 valer 0 ! f5 = 1F/2; // f5 valer 0.5 f6 = 1/2F; // f6 valer 0.5 float f7,f8; // declarao das variveis f7 = A*B*C; // f7 valer 287430.0 (multiplicao dos // valores 65,66 e 67) f8 = 1F/2; // f8 valer 0.02 (divide 1.0 pelo caracter A // que vale 50) } }

Para usar constantes do tipo float em programas, devemos colocar o suxo F (maisculo ou minsculo) aps as constantes, como mostrado na linhas 7, 10, 11 e 14 da listagem A.12. Os valores representados por um float no so exatos, como pode ser visto nos comentrios das linhas 6 e 7. Algumas regras relativas s constantes tambm so vlidas para o tipo float: constantes numricas sem o suxo F nem pontos utuantes so interpretadas como sendo do tipo int e tratadas como tal: a diviso
2 A notao xey onde x e y so valores numricos usada para representar alguns valores de ponto utuante:

xey corresponde

a x 10y . Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

185 mostrada na linha 9 considerada uma diviso de inteiros, e seu resultado zero. Nas linhas 10 e 11, como uma das constantes na diviso de ponto utuante (por causa do suxo F), o resultado considerado como ponto utuante do tipo float. Alguns exemplos de uso incorreto de variveis do tipo float ou usos que podem dar resultados inesperados so mostrados no programa na listagem A.13.

Listagem A.13: Programa que demonstra usos incorretos do tipo float


1 2 3 4 5 6 7 8 9 10 11 12 13

/* Esta classe demonstra usos incorretos do tipo float */ class DemoFloat { public static void main(String argumentos[]) { float f1,f2,f3,f4,f5; // declarao das variveis f1 = 1234567890; // f1 valer 1.23456794E9 - note o arredondamento f2 = 123456.0000000001F; // f2 valer 123456.0 - note o arredondamento f3 = (1f/7)+(1f/7)+(1f/7)-(3f/7); // f3 valer 2.9802322E-8 - note o arredondamento f4 = false; // ERRO: constante um boolean, cast impossvel f5 = "3.1416"; // ERRO: constante uma String, cast impossvel } }

No programa na listagem A.13, temos mais problemas de arredondamento devidos capacidade nita do tipo float de representar dados: nas linhas 6 e 7 vemos o arredondamento dos valores, porque o tipo float incapaz de armazenar grandes valores em detalhes. Vale a pena notar que estes detalhes podem fazer muita diferena - imagine usar um float para armazenar valores monetrios e descobrir que muito dinheiro est sumindo ou aparecendo do valor por causa de erros de arredondamento ! Outro erro de arredondamento ocorre na linha 8: a soma das fraes mostradas deveria ser exatamente zero, mas por causa do arredondamento das fraes, o resultado um valor muito pequeno mas diferente de zero. Este erro pode causar problemas maiores em um programa caso faamos comparaes entre pontos utuantes: se uma comparao entre (1f/7)+(1f/7)+(1f/7) e (3f/7) fosse feita, o resultado ia ser false ! Nas linhas 9 e 10 da listagem A.13 vemos que o tipo float sofre das mesmas restries dos outros tipos de dados em relao aos tipos de variveis que podem ser convertidas atravs do cast para float.

A.1.7

O tipo bsico double

Variveis do tipo bsico double podem representar valores numricos com ponto utuante que estejam dentro da faixa 4.94065645841246544e-324 a 1.79769313486231570e+308 (positivos e negativos) mas sem preciso exata. O tipo bsico double usa a mesma memria do tipo long (8 bytes), mas os valores so arredondados. Alguns exemplos de uso de variveis do tipo double so mostrados no programa na listagem A.14.

Listagem A.14: Programa que demonstra usos do tipo double


1 2 3

/* Esta classe demonstra usos do tipo double */ class DemoDouble {

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

186
public static void main(String argumentos[]) { double d1,d2,d3,d4,d5,d6; // declarao das variveis d1 = 1.2345678901; // d1 valer 1.2345678901 - armazenado exato d2 = 1.234567890123456789; // d2 valer 1.2345678901234567 - armazenado arredondado d3 = d1+999999; // d3 valer 1000000.2345678901 - armazenado arredondado d4 = 1/2; // d4 valer 0! : diviso de inteiros d5 = 1./2; // d5 valer 0.5 d6 = 1/2d; // d6 valer 0.5 double d7,d8,d9; // declarao das variveis d7 = 1./2; // d7 valer 0.02 (divide 1.0 pelo caracter A // que vale 50) d8 = 1e72; // d8 valer 1x10^72 ou 1E72 d9 = 1000000000000000000000000000000000000000000000000000000000000000000000000.; // d9 tambm valer 1x10^72 ou 1E72 } }

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

No programa na listagem A.14 vemos que o tipo double pode representar valores com maior preciso do que o tipo float, apesar de em alguns casos ocorrer o arredondamento, como nas linhas 7 e 8. Constantes do tipo double devem ser escritas usando o suxo D (maisculo ou minsculo) ou um ponto utuante (.). O ponto utuante pode ser usado mesmo em constantes sem casas decimais, como mostrado nas linhas 10, 13 e 15. Constantes com valores muito grandes ou pequenos podem ser escritas com a notao xey ou diretamente, como mostrado nas linhas 15 e 16. Alguns exemplos de uso incorreto de variveis do tipo double ou usos que podem dar resultados inesperados so mostrados no programa na listagem A.15.

Listagem A.15: Programa que demonstra usos incorretos do tipo double


1 2 3 4 5 6 7 8 9 10 11 12 13 14

/* Esta classe demonstra usos incorretos do tipo double */ class DemoDouble { public static void main(String argumentos[]) { double d1,d2,d3,d4; // declarao das variveis d1 = 1000000.000000000001D; // d1 valer 1000000.0 - note o arredondamento d2 = (1/987654.)+(2/987654.)-(3/987654.); // d2 valer 4.2351647362715017E-22 - note o // arredondamento d3 = false; // ERRO: constante um boolean, cast impossvel d4 = "3.1416"; // ERRO: constante uma String, cast impossvel } }

No programa na listagem A.15 temos mais erros de arredondamento, nas linhas 6 e 7, e erros de tipos que no podem ser convertidos, nas linhas 10 e 11.

A.1.8

O tipo bsico boolean

Variveis do tipo bsico boolean podem representar valores booleanos (verdadeiros ou falsos). Java dene duas constantes, true e false, que representam os valores verdadeiro e falso, respectivamente. Alguns exemplos de uso de variveis do tipo double so mostrados no programa na listagem A.16.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

187

Listagem A.16: Programa que demonstra usos do tipo boolean


1 2 3 4 5 6 7 8 9 10 11 12 13 14

/* Esta classe demonstra usos do class DemoBoolean { public static void main(String { boolean b1,b2,b3; b1 = true; b2 = (1>2); b3 = (2+3 == 6); boolean b4 = (1<2) && (3<4); boolean b5 = (1<2) || (3<2); boolean b6 = !(true); } }

tipo boolean */ argumentos[]) // // // // // // // declarao das variveis b1 recebe a constante true valor lgico de uma expresso (false) comparao de expresses (false) "E" lgico de duas expresses (true) "OU" lgico de duas expresses (true) "NO" lgico de uma constante (false)

No programa na listagem A.16 vemos que podemos usar variveis do tipo boolean para receber constantes (linha 6) e resultados de expresses de comparao, que so booleanas por natureza (linhas 7 a 10). Para operaes com valores booleanos, usamos o sinal && para representar a operao booleana E, o sinal || para representar a operao booleana OU e o sinal ! para representar a operao booleana NO. Alguns exemplos de uso incorreto de variveis do tipo boolean so mostrados no programa na listagem A.17.

Listagem A.17: Programa que demonstra usos incorretos do tipo boolean


1 2 3 4 5 6 7 8 9 10 11 12 13 14

/* Esta classe demonstra usos incorretos do tipo boolean */ class DemoBoolean { public static void main(String argumentos[]) { boolean b1,b2,b3; // declarao das variveis b1 = 0; // ERRO: tipo diferente de boolean b2 = (boolean)0; // ERRO: cast de int para boolean impossvel b3 = FALSE; // ERRO: constante no definida boolean b4 = F; // ERRO: tipo diferente de boolean boolean b5 = "FALSE"; // ERRO: tipo diferente de boolean boolean b6 = (boolean)"F"; // ERRO: cast de int para boolean impossvel } }

No programa na listagem A.17, vemos que variveis do tipo boolean no podem receber valores de tipos inteiros ou de ponto utuante, mesmo com cast (linhas 6 e 7). As constantes true e false devem ser escritas com todas as letras minsculas: variaes no so reconhecidas (linha 8). O uso de constantes do tipo char ou da classe String tambm no so aceitas, nem mesmo com o cast (linhas 9 a 11).

A.2
A.2.1

Algumas das classes mais usadas de Java para representao de dados


A classe String

A classe String uma classe de Java que permite a representao de cadeias de caracteres ou Strings de maneira simples3 e eciente. Alguns exemplos de uso de instncias da classe String so mostrados no
3 Apesar

de ser uma classe, no necessrio inicializarmos as instncias da classe String com o comando new.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

188 programa na listagem A.18:

Listagem A.18: Programa que demonstra usos da classe String


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

/* Esta classe demonstra usos da class DemoString { public static void main(String { String s1,s2,s3; // s1 = ""; // s2 = " "; // s3 = " "; // String s4 = "AB"; // String s5 = s4+"C"; // String s6 = "1"+"2"+"3"; // String s7 = "\""; // } }

classe String e suas instncias */ argumentos[]) declarao das variveis s1 valer "" (String vazia) s2 valer " " (espao simples) s3 valer " " (dois espaos simples) s4 valer "AB" s5 valer "ABC" s6 valer "123" (no-numrico) s7 valer """ (um caracter: aspas)

Na linha 6 da listagem A.18, colocamos uma String vazia na instncia s1 - Strings podem ter tamanhos variados, diferente de variveis do tipo char que devem ter sempre um nico caracter. Similarmente, nas linhas 7 e 8 usamos Strings que consistem de um e dois espaos, respectivamente. Vale a pena notar aqui que as instncias s1, s2 e s3 so diferentes, mesmo que aparentemente as Strings estejam vazias. Na linha 9, a instncia recebe um valor constante, e a linha 10 demonstra um dos conceitos mais importantes e usados da classe String: novas instncias da classe podem ser criadas atravs da concatenao de outras Strings, que feita pelo operador +. A linha 11 mostra outro exemplo de concatenao de Strings. A linha 12 do trecho de programa anterior mostra como caracteres especiais podem ser inseridos em Strings, atravs do escape: se colocarmos uma barra (\), tambm conhecida como caracter de escape) dentro de uma String, o caracter imediatamente aps a barra ser combinado com a barra dando um resultado especial, no exemplo acima, a String contendo uma aspa. A tabela A.1 mostra algumas combinaes de caracteres e seus resultados. Combinao \" Resultado Insere uma aspa na String. No podemos simplesmente inserir aspas sem usar a barra porque as aspas so os prprios delimitadores das Strings. Insere uma quebra de linha na String, de forma que quando esta for impressa no terminal ou em um arquivo de texto, os caracteres depois de \n sero impressos em linhas subsequentes. Insere uma tabulao na String. Esta tabulao ser convertida em um nmero adequado de espaos quando for a String for impressa. Insere a prpria barra (\) na String.

\n

\t \\

Tabela A.1: Combinaes especiais de caracteres e resultados em Strings As regras de concatenao de Strings quando existem outros tipos de dados misturados no so muito bvias, e podem levar erros de programao. Alguns exemplos de resultados de concatenao so mostrados no programa na listagem A.19.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

189

Listagem A.19: Programa que demonstra usos de concatenao da classe String


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

/* Esta classe demonstra usos e formas de concatenao da classe String */ class DemoString { public static void main(String argumentos[]) { String s1,s2,s3,s4,s5,s6; // declarao das variveis s1 = 0+""; // s1 valer "0" (no-numrico) s2 = 1+s1; // s2 valer "10" (no-numrico) s3 = 1+2+s1; // s3 valer "30" (no-numrico) - soma primeiro s4 = s1+1+2; // s4 valer "012" (no-numrico) - soma no efetuada s5 = s1+(1+2); // s5 valer "03" (no-numrico) - soma primeiro s6 = (s1+1)+2; // s6 valer "012" (no-numrico) - concatena primeiro String s7,s8,s9,s10,s11; // declarao das variveis s7 = 1+2+3+4+5+6+"7"; // s7 valer "217" (no-numrico) - soma primeiro s8 = ""+1+2+3+4+5+6+"7"; // s8 valer "1234567" (no-numrico) - concatena primeiro s9 = ""+2*3; // s9 valer "6" (no-numrico), multiplicao tem // precedncia sobre concatenao s10 = ""+1./2.+2; // s10 valer "0.52" (no-numrico), diviso // tem precedncia mas concatenao feita antes da soma s11 = 1./2.+2+""; // s11 valer "2.5" (no-numrico), diviso // tem precedncia e soma feita antes da concatenao } }

No programa na listagem A.19, vrias demonstraes de concatenao de Strings so feitas. Nas linhas 6 e 7, valores inteiros so concatenados com Strings, resultado em outras Strings. Na linha 8, a soma dos valores 1 e 2 feita antes da concatenao, e na linha 9 a soma no feita, somente a concatenao. Na linha 10, os parnteses foram a soma antes da concatenao. As linhas restantes do trecho de programa mostram como o resultado pode ser alterado dependendo dos termos da operao. Em resumo, podemos considerar que a concatenao de valores de tipos misturados com Strings feita da esquerda para a direita, exceto quando existem parnteses, e levando sempre em conta a ordem de precedncia dos operadores (* e / antes de + e -, etc). Alguns exemplos de uso incorreto de instncias da classe String so mostrados no programa na listagem A.20:

Listagem A.20: Programa que demonstra usos incorretos da classe String


1 2 3 4 5 6 7 8 9 10 11 12 13 14

/* Esta classe demonstra usos incorretos da classe String e suas instncias */ class DemoString { public static void main(String argumentos[]) { String s1,s2,s3,s4,s5,s6; // declarao das variveis s1 = 1; // ERRO: tipo diferente de String s2 = false; // ERRO: tipo diferente de String s3 = A; // ERRO: tipo diferente de String s4 = (String)3.1416; // ERRO: cast no pode ser feito para String s5 = "Caracter " no meio"; // ERRO: existe uma aspa solta no meio da String s6 = Esta uma String; // ERRO: String deve ser delimitada por aspas } }

No programa na listagem A.20, vemos que no possvel simplesmente atribuir instncias da classe String valores de outros tipos de dado, mesmo com cast (embora seja possvel atribuirmos estes valores
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

190 atravs da concatenao de uma String vazia com o valor em questo). Vemos tambm que as regras de escrita da linguagem exigem que uma String constante seja delimitada por duas aspas e no contenha nenhuma aspa entre as duas, a no ser como uma sequncia como mostrado na tabela A.1. A classe String tem muitos mtodos para processamento de caracteres nas Strings, que so descritos no captulo 9.

A.2.2

Classes para encapsulamento de tipos nativos

Java prov algumas classes que permitem a representao de valores de tipos nativos como instncias de classes. Esta representao tem como vantagem o encapsulamento de mtodos relativos a dados dos tipos nativos (especialmente para converso). A representao de dados nativos como instncias de classes tambm necessria para algumas classes de Java (notadamente, Vector e Hashtable, descritas respectivamente nas sees 14.1 e 14.2). Existe, porm, uma desvantagem: valores representados por instncias destas classes no podem ser usados diretamente para operaes. O uso normal destas classes envolve a criao de instncias, uso dos mtodos das classes pelas instncias e a converso para tipos normais. As classes para representao de valores nativos como instncias tem constantes para representar os valores mnimo e mximo possveis para o tipo de dado correspondente assim como mtodos para converso de Strings e tipos nativos para instncias e vice-versa. Todas as classes mostradas a seguir (exceto as classes Character e Boolean) tem os seguintes mtodos de converso: byteValue(): retorna o valor encapsulado pelas classes em um valor nativo do tipo byte. Se a classe representa um tipo de dado diferente de byte (short, int, long, oat, double), truncamento atravs do cast pode ocorrer. shortValue(): retorna o valor encapsulado pelas classes em um valor nativo do tipo short. Se a classe representa um tipo de dado com mais preciso do que um short (int, long, oat, double), truncamento atravs do cast pode ocorrer. intValue(): retorna o valor encapsulado pelas classes em um valor nativo do tipo int. Se a classe representa um tipo de dado com mais preciso do que um int (long, oat, double), truncamento atravs do cast pode ocorrer. longValue(): retorna o valor encapsulado pelas classes em um valor nativo do tipo long. Se a classe representa um tipo de dado com mais preciso do que um long (oat ou double), truncamento atravs do cast pode ocorrer. floatValue(): retorna o valor encapsulado pelas classes em um valor nativo do tipo oat. Se a classe representa um tipo de dado com mais preciso do que um long (tipo double), perda de preciso atravs do cast pode ocorrer. doubleValue(): retorna o valor encapsulado pelas classes em um valor nativo do tipo double. As classes de representao de valores numricos inteiros tambm implementam o mtodo valueOf() que recebe uma String e um valor inteiro entre 2 e 36 como argumentos, e retornam uma instncia da classe representando o valor numrico (valor passado como String) convertido para a base especicada pelo argumento inteiro. As classes de representao de valores numricos de ponto utuante possuem o mesmo mtodo, mas sem o argumento inteiro opcional, para converso entre Strings e os valores a serem representados pelas classes.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

191 A.2.2.1 A classe Byte

A classe Byte uma classe de Java que encapsula valores nativos do tipo byte. Os construtores da classe permitem a inicializao dos valores encapsulados atravs da especicao de um valor do tipo byte ou de uma String que contenha um valor do tipo byte. Neste segundo caso, a String deve conter somente e exatamente os caracteres necessrios para que um byte seja representado. Alguns exemplos de uso de instncias da classe Byte so mostrados no programa na listagem A.21

Listagem A.21: Programa que demonstra usos da classe Byte


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

/* Esta classe demonstra usos da classe Byte e suas instncias */ class DemoByte { public static void main(String argumentos[]) { Byte b1,b2; // declarao das instncias b1 = new Byte((byte)12); // b1 representar o Byte 12 b2 = new Byte("-45"); // b2 representar o Byte -45 - converso ser feita automaticamente int i = b1.byteValue()+b2.byteValue(); // i ser a soma dos valores de b1 e b2 double d = b1.doubleValue()*b2.doubleValue(); // d ser a multiplicao dos valores de b1 e b2 Byte b3 = Byte.valueOf("7f",16); // b3 representar 127 Byte b4 = Byte.valueOf("00101101",2); // b4 representar 45 System.out.println("Faixa de valores do byte:"+ // impresso dos valores-limite Byte.MIN_VALUE+" a "+ Byte.MAX_VALUE); } } // fim da classe DemoByte

Podemos ver nas linhas 7 e 8 que instncias da classe Byte podem ser inicializadas com valores do tipo byte e Strings que contenham valores compatveis. Nas linhas 9 e 10 vemos exemplos de converso da instncia da classe para tipos nativos. Nas linhas 11 e 12 vemos exemplos de inicializao das classes (sem ser via construtores) usando Strings e bases numricas diferentes de 10, e as linhas 13 a 15 mostram os valores limites para o tipo byte (representados como constantes da classe Byte). Alguns exemplos de uso incorreto da classe so mostrados no programa na listagem A.22.

Listagem A.22: Programa que demonstra usos incorretos da classe Byte


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

/* Esta classe demonstra usos incorretos da classe Byte e suas instncias */ class DemoByte { public static void main(String argumentos[]) { Byte b1,b2,b3,b4; // declarao das instncias b1 = new Byte(200); // erro: o valor passado implicitamente um inteiro b2 = new Byte("-2048"); // erro de execuo: String no contm um byte b3 = new Byte(" 120"); // erro de execuo: String no contm somente um byte b4 = new Byte(1.2); // erro: o valor passado implicitamente um double Byte b5 = Byte.valueOf("ff",16); // erro de execuo: valor fora da faixa de bytes Byte b6 = Byte.valueOf("1a",10); // erro de execuo: valor e base incompatveis Byte b7 = Byte.valueOf("111000111000",2); // erro de execuo: valor incompatvel com byte } } // fim da classe DemoByte

Na linha 7 da listagem A.22 temos um erro porque o valor 200 considerado implicitamente como um valor do tipo inteiro, e no existe um construtor correspondente na classe Byte - necessrio o cast do valor 200
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

192 para o tipo byte. Nas linhas 8 e 9 temos erros de converso (em tempo de execuo) pois as Strings no contm valores vlidos para a converso para bytes. Na linha 10, temos outro erro de converso: no possvel passarmos valores do tipo double para o construtor da classe Byte. Nas linhas 11 e 13 temos erros de converso pois os valores, depois de convertidos uasndo as bases especicadas, estaro fora da faixa de valores vlidos para bytes, enquanto que na linha 12 temos um valor em String incompatvel com a base de converso especicada. A.2.2.2 A classe Character

A classe Character uma classe de Java que encapsula valores nativos do tipo char. O construtor da classe permite a inicializao do valor encapsulado atravs da especicao de um valor do tipo char. A classe Character tem, alm dos mtodos de converso presentes em outras classes, mtodos estticos para converso entre caracteres maisculos e minsculos e mtodos para vericao do tipo do caracter (espao, dgito, letra, etc) - estes mtodos estticos no devem ser chamados como mtodos de instncias da classe Character, e sim diretamente pela classe. Alguns exemplos de uso de instncias da classe Character so mostrados no programa na listagem A.23. Listagem A.23: Programa que demonstra usos da classe Character
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

/* Esta classe demonstra usos da classe Character e suas instncias */ class DemoCharacter { public static void main(String argumentos[]) { Character c1,c2,c3,c4; // declarao das instncias c1 = new Character((char)65); // c1 representar o char 65 = A c2 = new Character(!); // c2 representar o char ! c3 = new Character(); // c3 representar o char c4 = new Character( ); // c4 representar o char espao System.out.println( +" dgito ? "+Character.isDigit( )); // false System.out.println(1+" dgito ? "+Character.isDigit(1)); // true System.out.println(A+" dgito ? "+Character.isDigit(A)); // false System.out.println( +" letra ? "+Character.isLetter( )); // false System.out.println(1+" letra ? "+Character.isLetter(1)); // false System.out.println(A+" letra ? "+Character.isLetter(A)); // true System.out.println(+" letra ? "+Character.isLetter()); // true System.out.println( +" letra ou dgito ? "+Character.isLetterOrDigit( )); // false System.out.println(1+" letra ou dgito ? "+Character.isLetterOrDigit(1)); // true System.out.println(A+" letra ou dgito ? "+Character.isLetterOrDigit(A)); // true System.out.println(a+" minscula ? "+Character.isLowerCase(a)); // true System.out.println(+" minscula ? "+Character.isLowerCase()); // false System.out.println( +" minscula ? "+Character.isLowerCase( )); // false System.out.println(i+" maiscula ? "+Character.isUpperCase(i)); // false System.out.println(+" maiscula ? "+Character.isUpperCase()); // true System.out.println( +" maiscula ? "+Character.isUpperCase( )); // false System.out.println( +" espao ? "+Character.isWhitespace( )); // true System.out.println(\n+" espao ? "+Character.isWhitespace(\n)); // true System.out.println(a+" espao ? "+Character.isWhitespace(a)); // false System.out.println(!+" espao ? "+Character.isWhitespace(!)); // false System.out.println("Faixa de valores do char:"+ // impresso dos valores-limite, (int)Character.MIN_VALUE+" a "+ // convertidos para int para impresso (int)Character.MAX_VALUE); } } // fim da classe DemoCharacter

Nas linhas 7 a 10 temos exemplos de uso do construtor da classe Character, sendo que na linha 7 usamos o valor numrico do caracter para inicializao. O cast necessrio para garantir que o valor 65 no ser
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

193 considerado como sendo do tipo inteiro. As linhas 11 a 13 mostram usos do mtodo esttico isDigit() que recebe um valor do tipo char e retorna um booleano. Para lnguas ocidentais, somente os valores 0, 1, 2, 9 so considerados dgitos. As linhas 14 a 17 mostram usos do mtodo isLetter() que retornar true para os caracteres que correspondam a letras nos diversos alfabetos suportados. O mtodo isLetterOrDigit() (mostrado nas linhas 18 a 20) retorna true se o caracter for dgito ou letra. A classe Character fornece mtodos para vericar se o caracter minsculo isLowerCase()) ou maisculo (isUpperCase()), como mostrado nas linhas 21 a 26. Similarmente, caracteres podem ser testados para vericar se so espaos em branco pelo mtodo isWhitespace(), como mostrado nas linhas 27 a 30. Os valores mnimo e mximo para dados do tipo char podem ser obtidos usando as constantes denidas na classe Character, como mostrado nas linhas 31 a 33. Os valores foram modicados atravs do cast para tipos inteiros para impresso. A alguns exemplos de uso incorreto da classe so mostrados no programa na listagem A.24.

Listagem A.24: Programa que demonstra usos incorretos da classe Character


1 2 3 4 5 6 7 8 9 10 11 12 13

/* Esta classe demonstra usos incorretos da classe Character e suas instncias */ class DemoCharacter { public static void main(String argumentos[]) { Character c1,c2,c3,c4,c5; // declarao das instncias c1 = new Character(200); // erro: o valor passado implicitamente um inteiro c2 = new Character("65"); // erro: construtor no aceita Strings c3 = new Character(); // erro: caracter vazio no pode ser usado c4 = new Character(1.2); // erro: o valor passado implicitamente um double c5 = new Character((char)-20); // no existe erro, mas o caracter valer 65516 } } // fim da classe DemoCharacter

Nas linhas 7 a 10 da listagem A.24 temos exemplos de argumentos invlidos passados ao construtor da classe Character: um valor inteiro (linha 7), uma String (linha 8), um caracter vazio (linha 9) e um valor do tipo double (linha 10). O construtor mostrado na linha 11 no ter erros de compilao nem execuo, e a instncia c5 representar o caracter cujo cdigo Unicode 65516. A.2.2.3 A classe Short

A classe Short uma classe de Java que encapsula valores nativos do tipo short. Os construtores da classe permitem a inicializao dos valores encapsulados atravs da especicao de um valor do tipo short ou de uma String que contenha um valor do tipo short. Neste segundo caso, a String deve conter somente e exatamente os caracteres necessrios para que um valor do tipo short seja representado. Alguns exemplos de uso de instncias da classe Short so mostrados no programa na listagem A.25. Listagem A.25: Programa que demonstra usos da classe Short
1 2

/* Esta classe demonstra usos da classe Short e suas instncias */ class DemoShort Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

194
{ public static void main(String argumentos[]) { Short s1,s2; // declarao das instncias s1 = new Short((short)9999); // s1 representar o short 9999 s2 = new Short("-1024"); // s2 representar o short -1024 - converso ser automtica int i = s1.shortValue()+s2.shortValue(); // i ser a soma dos valores de s1 e s2 long l = s1.longValue()*s2.longValue(); // l ser a multiplicao dos valores de s1 e s2 Short s3 = Short.valueOf("1000",16); // s3 representar 4096 Short s4 = Short.valueOf("zz",36); // podemos usar qualquer base entre 2 e 36 ! System.out.println("Faixa de valores do short:"+ // impresso dos valores-limite Short.MIN_VALUE+" a "+ Short.MAX_VALUE); } } // fim da classe DemoShort

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

As linhas 7 e 8 da listagem A.25 mostram usos dos construtores da classe Short, que aceitam respectivamente valores do tipo short e Strings contendo valores compatveis. As linhas 9 e 10 mostram como podemos recuperar um valor armazenado em uma instncia da classe Short como valores dos tipos short e long, respectivamente. As linhas 11 e 12 mostram como podemos converter valores contidos em Strings para instncias da classe Short, usando bases numricas diferentes. possvel o uso de qualquer base numrica entre 2 e 36 (inclusive), como mostrado nos exemplos. A base 36 usa os nmeros 0 a 9 e os caracteres A a Z (maisculos ou minsculos). Nas linhas 13 a 15 os valores mnimo e mximo para dados do tipo short so impressos. Alguns exemplos de uso incorreto da classe so mostrados no programa na listagem A.26.

Listagem A.26: Programa que demonstra usos incorretos da classe Short


1 2 3 4 5 6 7 8 9 10 11 12 13 14

/* Esta classe demonstra usos incorretos da classe Short e suas instncias */ class DemoShort { public static void main(String argumentos[]) { Short s1,s2,s3,s4; // declarao das instncias s1 = new Short(200); // erro: o valor passado implicitamente um inteiro s2 = new Short("999999"); // erro de execuo: String no contm um short s3 = new Short("1 2 3"); // erro de execuo: String no contm somente um short s4 = new Short(0.9); // erro: o valor passado implicitamente um double Short s5 = Short.valueOf("ffff",16); // erro de execuo: valor fora da faixa de shorts Short s6 = Short.valueOf("01234",2); // erro de execuo: valor e base incompatveis } } // fim da classe DemoShort

Nas linhas 7 e 10 da listagem A.26 vemos chamadas ao construtor da classe Short com valores de tipos no vlidos (no existem construtores para os tipos int e double). O valor passado na String da linha 8 no pode ser transformado em valor do tipo short. A String mostrada na linha 9 contm espaos entre os caracteres numricos, e no poder ser convertida para um dado do tipo short, causando erro de execuo. A converso mostrada na linha 11 pode ser feita, mas como o resultado no pode ser armazenado em uma varivel do tipo short, um erro de execuo ocorrer. Finalmente, a converso mostrada na linha 12 causar erro de execuo porque a base somente reconhecer caracteres 0 e 1, e outros caracteres esto presentes na String.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

195 A.2.2.4 A classe Integer

A classe Integer uma classe de Java que encapsula valores nativos do tipo int. Os construtores da classe permitem a inicializao dos valores encapsulados atravs da especicao de um valor do tipo int ou de uma String que contenha um valor do tipo int. Neste segundo caso, a String deve conter somente e exatamente os caracteres necessrios para que um valor do tipo int seja representado. Alm do mtodo polimrco valueOf que permite a criao de uma instncia da classe Integer atravs de uma String contendo um valor numrico e uma base entre 2 e 36, a classe Integer possui os mtodos estticos toBinaryString(), toOctalString() e toHexString() que permitem a converso do valor armazenado na classe para as bases binria, octal e hexadecimal, respectivamente. Alguns exemplos de uso de instncias da classe Integer so mostrados no programa na listagem A.27.

Listagem A.27: Programa que demonstra usos da classe Integer


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/* Esta classe demonstra usos da classe Integer e suas instncias */ class DemoInteger { public static void main(String argumentos[]) { Integer i1,i2,i3; // declarao das instncias i1 = new Integer(100000); // s1 representar o int 100000 i2 = new Integer("100000"); // s2 representar o int 100000 - converso ser automtica int i = i1.intValue()-i2.intValue(); // i ser a diferena entre os valores s1 e s2 float f = i1.floatValue()*i2.longValue(); // l ser a multiplicao dos valores de i1 e i2 i3 = Integer.valueOf("7fffffff",16); // i3 representar 2147483647 Integer i4 = Integer.valueOf("java",36); // podemos usar qualquer base entre 2 e 36 ! String base2 = Integer.toBinaryString(2000); // 11111010000 String base8 = Integer.toOctalString(2000); // 3720 String base16 = Integer.toHexString(2000); // 7d0 byte b = i1.byteValue(); // b valer -96: perda de preciso ! short s = i1.shortValue(); // s valer -31072: perda de preciso ! System.out.println("Faixa de valores do int:"+ // impresso dos valores-limite Integer.MIN_VALUE+" a "+ Integer.MAX_VALUE); } } // fim da classe DemoInteger

Nas linhas 7 e 8 da listagem A.27 vemos a criao de duas instncias da classe Integer, usando um valor inteiro e uma String contendo os caracteres que representam um valor inteiro. Nas linhas 9 e 10 vemos a converso dos valores contidos em instncias da classe Integer em inteiros e oats, respectivamente. Nas linhas 11 e 12 temos a converso de Strings em instncias usando duas bases diferentes. Nas linhas 13 a 15 temos a converso dos valores passados para os mtodos estticos toBinaryString(), toOctalString() e toHexString() para Strings contendo as representaes binria, octal e hexadecimal, respectivamente. Nas linhas 16 e 17 temos a converso dos valores armazenados nas instncias para tipos de dados com menos preciso numrica: a converso feita sem mensagens de erro, mas os valores so truncados com perda de preciso similar ao cast. As linhas 18 a 20 imprimem os valores mnimo e mximo representveis pelo tipo int. Alguns exemplos de uso incorreto da classe so mostrados no programa na listagem A.28.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

196

Listagem A.28: Programa que demonstra usos incorretos da classe Integer


1 2 3 4 5 6 7 8 9 10 11 12 13 14

/* Esta classe demonstra usos incorretos da classe Integer e suas instncias */ class DemoInteger { public static void main(String argumentos[]) { Integer i1,i2,i3,i4; // declarao das instncias i1 = new Integer(9999999999); // erro: o valor passado no vlido para inteiros i2 = new Integer("9999999999"); // erro de execuo: String contm valor muito grande i3 = new Integer(" 100 "); // erro de execuo: String no contm somente um int i4 = new Integer(0.9); // erro: o valor passado implicitamente um double Integer i5 = Integer.valueOf("ffffffff",16); // erro de execuo: valor fora da faixa de ints Integer i6 = Integer.valueOf("abcdefg",16); // erro de execuo: valor e base incompatveis } } // fim da classe DemoInteger

Na linha 7 da listagem A.28 vemos um erro de compilao causado pelo valor passado ao construtor, que invlido para um tipo inteiro (fora da faixa de valores representveis). Na linha 8, o mesmo erro ocorrer mas em tempo de execuo, pois o valor contido na String tambm est fora da faixa de valores representveis por um inteiro. A linha 9 causar um erro de execuo pois existem caracteres que no permitem a transformao da String em um inteiro e a linha 10 causar um erro de compilao pois no existe construtor que aceita valor de ponto utuante para a classe Integer. As linhas 11 e 12 causaro erros de execuo pois os valores representados na String esto fora da faixa de valores representveis e usam caracteres invlidos para a base usada, respectivamente.

A.2.2.5

A classe Long

A classe Long uma classe de Java que encapsula valores nativos do tipo long. Os construtores da classe permitem a inicializao dos valores encapsulados atravs da especicao de um valor do tipo long ou de uma String que contenha um valor do tipo long. Neste segundo caso, a String deve conter somente e exatamente os caracteres necessrios para que um valor do tipo long seja representado. Alguns exemplos de uso de instncias da classe Long so mostrados no programa na listagem A.29.

Listagem A.29: Programa que demonstra usos da classe Long


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

/* Esta classe demonstra usos da classe Long e suas instncias */ class DemoLong { public static void main(String argumentos[]) { Long l1,l2; // declarao das instncias l1 = new Long(99999999); // l1 representar o long 99999999 l2 = new Long("-360000"); // l2 representar o long -360000 - converso automtica float f = l1.floatValue()+l2.floatValue(); // f ser a soma dos valores de l1 e l2 double d = l1.doubleValue()*l2.doubleValue(); // d ser a multiplicao dos valores de l1 e l2 Long l3 = Long.valueOf("ffffffff",16); // l3 representar 4294967295 short s = l1.shortValue(); // s valer -7937 - perda de preciso ! System.out.println("Faixa de valores do long:"+ // impresso dos valores-limite Long.MIN_VALUE+" a "+ Long.MAX_VALUE); } } // fim da classe DemoLong

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

197 Nas linhas 7 e 8 da listagem A.29 temos a criao de duas instncias da classe Long usando um valor inteiro e uma String como argumentos para os construtores. Embora no exista um construtor para a classe que aceite um valor inteiro, o construtor aceita um valor do tipo long pode receber valores do tipo int como argumentos. Nas linhas 9 e 10 vemos a converso dos valores contidos nas instncias para os tipos oat e double, respectivamente. Na linha 11 vemos a converso de um valor na base 16 para uma instncia da classe Long. Na linha 12 temos a converso de um valor long para short, com a perda de preciso esperada deste tipo de operao. Finalmente, nas linhas 13 a 15 vemos a impresso dos valores mnimo e mximo para o tipo long. Alguns exemplos de uso incorreto da classe so mostrados no programa na listagem A.30.

Listagem A.30: Programa que demonstra usos incorretos da classe Long


1 2 3 4 5 6 7 8 9 10 11 12 13

/* Esta classe demonstra usos incorretos da classe Long e suas instncias */ class DemoLong { public static void main(String argumentos[]) { Long l1,l2,l3; // declarao das instncias l1 = new Long(200.3); // erro: o valor passado implicitamente um double l2 = new Long("99999999999999999999"); // erro de execuo: String no contm um long l3 = new Long("L10000000"); // erro de execuo: String no contm somente um long Long l4 = Long.valueOf("ffffffffffffffff",16); // erro de execuo: valor fora da faixa Long l5 = Long.valueOf("01234",2); // erro de execuo: valor e base incompatveis } } // fim da classe DemoLong

Na linha 7 da listagem A.30 temos um erro de compilao pois no existe construtor para a classe Long que aceite valores de ponto utuante. Na linha 8 o erro ser de execuo, o valor muito grande para ser armazenado na classe. Na linha 9, o erro ser por causa do caracter L que no ser reconhecido para converso para uma instncia da classe Long. Na linha 10, o valor ser novamente muito grande para ser armazenado por um long, e na linha 11 existem caracteres que no sero aceitos para converso por causa da base passada como argumento. A.2.2.6 A classe Float

A classe Float uma classe de Java que encapsula valores nativos do tipo oat. Os construtores da classe permitem a inicializao dos valores encapsulados atravs da especicao de um valor do tipo oat ou de uma String que contenha um valor do tipo oat. Neste segundo caso, a String deve conter somente e exatamente os caracteres necessrios para que um valor do tipo oat seja representado. A classe Float no permite a converso de bases como as classes que encapsulam valores inteiros. Alguns exemplos de uso de instncias da classe Float so mostrados no programa na listagem A.31.

Listagem A.31: Programa que demonstra usos da classe Float


1 2 3 4 5

/* Esta classe demonstra usos da classe Float e suas instncias */ class DemoFloat { public static void main(String argumentos[]) { Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

198
Float f1,f2; // declarao das instncias f1 = new Float(100.0002); // l1 representar o float 100.0002 f2 = new Float("100.0002"); // l2 representar o float 100.0002 - converso automtica float f = f1.floatValue()+f2.floatValue(); // f ser a soma dos valores de f1 e f2 double d = f1.doubleValue()*f2.doubleValue(); // d ser a multiplicao dos valores de f1 e f2 Float f3 = Float.valueOf("6.02e23"); // f3 representar 6.02 x 10^23 byte b = f1.byteValue(); // b valer 100: perda de preciso ! int i = f2.intValue(); // i valer 100: perda de preciso ! System.out.println("Faixa de valores do float:"+ // impresso dos valores-limite Float.MIN_VALUE+" a "+ Float.MAX_VALUE); } } // fim da classe DemoFloat

6 7 8 9 10 11 12 13 14 15 16 17 18

Nas linhas 7 e 8 da listagem A.31 temos a criao de duas instncias da classe Float, uma com um valor de ponto utuante e outro com uma String que representa um valor de ponto utuante. A classe tem construtores que aceitam valores dos tipos oat e double. As linhas 9 e 10 mostram a converso dos valores das instncias para os tipos oat e double, e as linhas 12 e 13 mostram a converso destes valores para variveis do tipo byte e int, respectivamente, com perda de preciso, da mesma maneira que ocorreria se um cast fosse feito. A linha 11 mostra outra maneira de inicializao de instncias da classe Float atravs do mtodo valueOf(), que neste caso no aceita um argumento adicional especicando a base para converso. Na String passada vemos que a notao xey correspondente a x 10y pode ser usada para converso. As linhas 14 a 16 imprimem os valores mnimo e mximo para variveis do tipo oat. Alguns exemplos de uso incorreto da classe so mostrados no programa na listagem A.32.

Listagem A.32: Programa que demonstra usos incorretos da classe Float


1 2 3 4 5 6 7 8 9 10 11

/* Esta classe demonstra usos incorretos da classe Float e suas instncias */ class DemoFloat { public static void main(String argumentos[]) { Float f1,f2,f3; // declarao das instncias f1 = new Float(false); // erro: o valor passado no pode ser convertido f2 = new Float("1x10^23"); // erro de execuo: String no contm um float f3 = new Float("1e10000000"); // No erro, mas o valor armazenado infinito. } } // fim da classe DemoFloat

Na linha 7 da listagem A.32 vemos que no possvel inicializarmos uma instncia da classe Float com um valor booleano. Na linha 8 teremos um erro de execuo uma vez que a String no contm um valor vlido para converso. Na linha 9, nenhum erro ocorrer, mas uma vez que o valor muito grande para ser armazenado em um oat, ser considerado internamente como o valor innito (Infinity). A.2.2.7 A classe Double

A classe Double uma classe de Java que encapsula valores nativos do tipo double. Os construtores da classe permitem a inicializao dos valores encapsulados atravs da especicao de um valor do tipo double ou de uma String que contenha um valor do tipo double. Neste segundo caso, a String deve conter somente e exatamente os caracteres necessrios para que um valor do tipo double seja representado. A classe Double no permite a converso de bases como as classes que encapsulam valores inteiros.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

199 Alguns exemplos de uso de instncias da classe Double so mostrados no programa na listagem A.33.

Listagem A.33: Programa que demonstra usos da classe Double


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

/* Esta classe demonstra usos da classe Double e suas instncias */ class DemoDouble { public static void main(String argumentos[]) { Double d1,d2; // declarao das instncias d1 = new Double(100000.000001); // l1 representar o double 100000.000001 d2 = new Double("100000.000001"); // l2 representar o double 100000.000001 double ds = d1.doubleValue()+d2.doubleValue(); // ds ser a soma dos valores de d1 e d2 double dm = d1.doubleValue()*d2.doubleValue(); // dm ser a multiplicao de d1 e d2 Double d3 = Double.valueOf("7.13e239"); // d3 representar 7.12 x 10^239 float f = d3.floatValue(); // f representar infinito ! short s = d1.shortValue(); // s representar -31072: perda de preciso ! System.out.println("Faixa de valores do double:"+ // impresso dos valores-limite Double.MIN_VALUE+" a "+ Double.MAX_VALUE); } } // fim da classe DemoDouble

Na linhas 7 e 8 da listagem A.33 temos a inicializao de duas instncias da classe Double, uma com um valor do tipo double e outra com uma String. Nas linhas 9 e 10 temos a recuperao dos valores das instncias para valores do tipo double. Na linha 11 temos a criao de uma instncia atravs do mtodo valueOf, que somente trabalha com a base 10, e nas linhas 12 e 13 temos a converso para outros tipos com perda de preciso - no caso da varivel f na linha 12 o valor do tipo oat receber o valor innito. As linhas 14 a 16 imprimiro os valores mnimo e mximo que podem ser representados por valores do tipo double. A alguns exemplos de uso incorreto da classe so mostrados no programa na listagem A.34.

Listagem A.34: Programa que demonstra usos incorretos da classe Double


1 2 3 4 5 6 7 8 9 10 11

/* Esta classe demonstra usos incorretos da classe Double e suas instncias */ class DemoDouble { public static void main(String argumentos[]) { Double d1,d2,d3; // declarao das instncias d1 = new Double(false); // erro: o valor passado no pode ser convertido d2 = new Double("6.02x10^23"); // erro de execuo: String no contm um double d3 = new Double("1e10000000"); // No erro, mas o valor armazenado infinito. } } // fim da classe DemoDouble

Na linha 7 da listagem A.34 vemos que no possvel inicializarmos uma instncia da classe Double com um valor booleano. Na linha 8 teremos um erro de execuo uma vez que a String no contm um valor vlido para converso. Na linha 9, nenhum erro ocorrer, mas uma vez que o valor muito grande para ser armazenado em um double, ser considerado internamente como o valor innito (Infinity).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

200 A.2.2.8 A classe Boolean

A classe Boolean possibilita o encapsulamento de valores nativos do tipo boolean. Os construtores da classe permitem a inicializao dos valores encapsulados atravs da especicao de um valor do tipo boolean ou de uma String que contenha um valor do tipo boolean. Neste segundo caso, se a String for igual a true (independente de estar em caracteres maisculos, minsculos ou misturados) o valor representado ser igual a true, caso contrrio ser igual a false. No existem mecanismos nesta classe para converso de ou para valores numricos. Alguns exemplos de uso de instncias da classe Boolean so mostrados no programa na listagem A.35.

Listagem A.35: Programa que demonstra usos da classe Boolean


1 2 3 4 5 6 7 8 9 10 11 12

/* Esta classe demonstra usos da classe Boolean e suas instncias */ class DemoBoolean { public static void main(String argumentos[]) { Boolean b1,b2,b3; // declarao das instncias b1 = new Boolean(true); // b1 representar o boolean true b2 = new Boolean("true"); // b2 representar o boolean true b3 = new Boolean("verdadeiro"); // b3 representar o boolean false boolean b = b1.booleanValue(); // b valer true } } // fim da classe DemoBoolean

Nas linhas 7 a 9 da listagem A.35 temos exemplos dos construtores da classe Boolean, recebendo um valor do tipo boolean e duas Strings. Nos dois primeiros exemplos, o valor encapsulado ser igual a true, enquanto que no terceiro ser igual a false pois a String diferente de true. Na linha 10, convertemos o valor contido numa instncia da classe para uma varivel do tipo booleano. Alguns exemplos de uso incorreto de instncias da classe so mostrados no programa na listagem A.36.

Listagem A.36: Programa que demonstra usos incorretos da classe Boolean


1 2 3 4 5 6 7 8 9 10 11 12

/* Esta classe demonstra usos incorretos da classe Boolean e suas instncias */ class DemoBoolean { public static void main(String argumentos[]) { Boolean b1,b2,b3; // declarao das instncias b1 = new Boolean(0); // no pode converter inteiro para boolean b2 = new Boolean(); // um valor deve ser passado b3 = new Boolean("true"); // b3 representar o boolean false int x = b3.intValue(); // classe Boolean no tem mtodos xxxValue exceto booleanValue } } // fim da classe DemoBoolean

Nas linhas 7 e 8 da listagem A.36 temos duas chamadas incorretas ao construtor da classe Boolean, passando respectivamente um valor inteiro e nenhum valor ao construtor. Na linha 10 tentamos recuperar o valor de uma instncia da classe Boolean como um valor do tipo int, o que no possvel, causando um erro de compilao.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

201

Apndice B A Classe Keyboard


B.1 A classe Keyboard

A linguagem Java no tem mecanismos simples de interao com o usurio via teclado e terminal - no existem classes que formatem a entrada de dados via teclado de maneira simples e intuitiva. Embora possamos associar um arquivo entrada padro de dados, isto complicado e contra-intuitivo para principiantes na linguagem. Vale a pena notar que em aplicaes reais, a entrada de dados via um terminal cada vez mais rara - interfaces grcas permitem que dados sejam entrados via teclado, de forma mais elegante, como mostrado neste livro. A classe Keyboard visa unicamente facilitar o uso da interao via teclado nos primeiros programas em Java, para tornar estes programas mais exveis e interessantes. A classe Keyboard foi adaptada do livro An Introduction to Computer Science Using Java, de Samuel N. Kamin, M. Dennis Mickunas e Edward M. Reingold [1]. A verso apresentada neste livro foi digitada por diligentes alunos da disciplina Programao Orientada a Objetos I (turma de 1999) e anotada depois para mais clareza.

B.1.1

Usando a classe Keyboard

A classe Keyboard tem mtodos estticos (que permitem o seu uso sem a necessidade de criao de instncias da classe) para leitura de todos os tipos bsicos de Java e instncias da classe String. Todos estes mtodos so polimrcos, permitindo que se passe um argumento default a ser usado caso o usurio d uma resposta vazia (pressionando Enter sem entrar um valor). Para que os programas desenvolvidos possam usar a classe, necessrio que esta seja copiada para o diretrio onde os programas esto sendo criados. Cpias da classe Keyboard (compilada e cdigo-fonte) podem ser obtidas no mesmo site que a ltima verso deste documento (veja seo 1.1). FCC/UNIVAP Usurios de computadores que rodam Linux nos laboratrios da FCC podem copiar a classe Keyboard para suas contas com o comando cp POO/Keyboard.class . (note o ponto no nal do comando), sendo que os usurios devem estar no diretrio onde desenvolvem programas em Java. Caso o usurio use mais de um diretrio para desenvolvimento de programas em Java, ele/a deve copiar o arquivo para todos os diretrios. A lista dos mtodos da classe Keyboard exemplos de uso sero mostrados nas sees seguintes.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

202 B.1.1.1 Usando a classe Keyboard para leitura de valores tipo boolean

Dois mtodos da classe Keyboard podem ser usados para a leitura de valores booleanos do teclado: boolean Keyboard.readBoolean(): Este mtodo l um valor do teclado e retorna um valor booleano correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar true. boolean Keyboard.readBoolean(boolean bdefault): Este mtodo l um valor do teclado e retorna um valor booleano correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor passado pela varivel bdefault. Ambos os mtodos acima reconhecero os valores true, t, yes, y, v, s, sim ou verdadeiro (independente de estarem em caracteres maisculos, minsculos ou misturados) como sendo iguais true e os valores false, f, no, n, no, nao ou falso (independente de estarem em caracteres maisculos, minsculos ou misturados) como sendo iguais false. O programa na listagem B.1 demonstra o uso dos dois mtodos da classe Keyboard descritos nesta seo.

Listagem B.1: Exemplo de uso da classe Keyboard para leitura de valores tipo boolean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

class demoKeyboard { public static void main(String args[]) { System.out.print("Entre um valor booleano:"); boolean b1 = Keyboard.readBoolean(); // se no digitar nada, aceitar como true if (b1) System.out.println("Verdadeiro !"); else System.out.println("Falso !"); System.out.print("Entre outro valor booleano:"); boolean b2 = Keyboard.readBoolean(false); // se no digitar nada, aceitar como false if (b2) System.out.println("Verdadeiro !"); else System.out.println("Falso !"); } // fim do mtodo main } // fim da classe demoKeyboard

B.1.1.2

Usando a classe Keyboard para leitura de valores tipo byte

Dois mtodos da classe Keyboard podem ser usados para a leitura de valores do tipo byte do teclado: byte Keyboard.readByte(): Este mtodo l um valor do teclado e retorna um valor do tipo byte correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor 0 (tipo byte). byte Keyboard.readByte(byte cdefault): Este mtodo l um valor do teclado e retorna um valor byte correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor passado pela varivel cdefault (tipo byte). O programa na listagem B.2 demonstra o uso dos dois mtodos da classe Keyboard descritos nesta seo.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

203

Listagem B.2: Exemplo de uso da classe Keyboard para leitura de valores tipo byte
1 2 3 4 5 6 7 8 9 10 11 12 13

class demoKeyboard { public static void main(String args[]) { System.out.print("Entre um valor do tipo byte:"); byte b1 = Keyboard.readByte(); // se no digitar nada, aceitar como zero System.out.println("Valor digitado: "+b1); System.out.print("Entre outro valor do tipo byte:"); byte b2 = Keyboard.readByte((byte)-1); // se no digitar nada, aceitar como -1 System.out.println("Valor digitado: "+b2); } // fim do mtodo main } // fim da classe demoKeyboard

B.1.1.3

Usando a classe Keyboard para leitura de valores tipo char

Dois mtodos da classe Keyboard podem ser usados para a leitura de valores do tipo char do teclado: char Keyboard.readChar(): Este mtodo l um valor do teclado e retorna um valor do tipo char correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o caracter espao (tipo char). char Keyboard.readChar(char cdefault): Este mtodo l um valor do teclado e retorna um valor char correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o caracter passado pela varivel cdefault (tipo char). O programa na listagem B.3 demonstra o uso dos dois mtodos da classe Keyboard descritos nesta seo.

Listagem B.3: Exemplo de uso da classe Keyboard para leitura de valores tipo char
1 2 3 4 5 6 7 8 9 10 11 12 13

class demoKeyboard { public static void main(String args[]) { System.out.print("Entre um valor do tipo char:"); char c1 = Keyboard.readChar(); // se no digitar nada, aceitar como zero System.out.println("Valor digitado: "+c1); System.out.print("Entre outro valor do tipo char:"); char c2 = Keyboard.readChar(*); // se no digitar nada, aceitar como * System.out.println("Valor digitado: "+c2); } // fim do mtodo main } // fim da classe demoKeyboard

B.1.1.4

Usando a classe Keyboard para leitura de valores tipo short

Dois mtodos da classe Keyboard podem ser usados para a leitura de valores do tipo short do teclado: short Keyboard.readShort(): Este mtodo l um valor do teclado e retorna um valor do tipo short correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor 0 (tipo short).

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

204 short Keyboard.readShort(short sdefault): Este mtodo l um valor do teclado e retorna um valor short correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor passado pela varivel sdefault (tipo short). O programa na listagem B.4 demonstra o uso dos dois mtodos da classe Keyboard descritos nesta seo.

Listagem B.4: Exemplo de uso da classe Keyboard para leitura de valores tipo short
1 2 3 4 5 6 7 8 9 10 11 12 13

class demoKeyboard { public static void main(String args[]) { System.out.print("Entre um valor do tipo short:"); short s1 = Keyboard.readShort(); // se no digitar nada, aceitar como zero System.out.println("Valor digitado: "+s1); System.out.print("Entre outro valor do tipo short:"); short s2 = Keyboard.readShort((short)123); // se no digitar nada, aceitar como 123 System.out.println("Valor digitado: "+s2); } // fim do mtodo main } // fim da classe demoKeyboard

B.1.1.5

Usando a classe Keyboard para leitura de valores tipo int

Dois mtodos da classe Keyboard podem ser usados para a leitura de valores do tipo int do teclado: int Keyboard.readInt(): Este mtodo l um valor do teclado e retorna um valor do tipo int correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor 0 (tipo int). int Keyboard.readInt(int idefault): Este mtodo l um valor do teclado e retorna um valor int correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor passado pela varivel idefault (tipo int). O programa na listagem B.5 demonstra o uso dos dois mtodos da classe Keyboard descritos nesta seo.

Listagem B.5: Exemplo de uso da classe Keyboard para leitura de valores tipo int
1 2 3 4 5 6 7 8 9 10 11 12 13

class demoKeyboard { public static void main(String args[]) { System.out.print("Entre um valor do tipo int:"); int i1 = Keyboard.readInt(); // se no digitar nada, aceitar como zero System.out.println("Valor digitado: "+i1); System.out.print("Entre outro valor do tipo int:"); int i2 = Keyboard.readInt(123); // se no digitar nada, aceitar como 123 System.out.println("Valor digitado: "+i2); } // fim do mtodo main } // fim da classe demoKeyboard

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

205 B.1.1.6 Usando a classe Keyboard para leitura de valores tipo long

Dois mtodos da classe Keyboard podem ser usados para a leitura de valores do tipo long do teclado: long Keyboard.readLong(): Este mtodo l um valor do teclado e retorna um valor do tipo long correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor 0 (tipo long). long Keyboard.readLong(long ldefault): Este mtodo l um valor do teclado e retorna um valor long correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor passado pela varivel idefault (tipo long). O programa na listagem B.6 demonstra o uso dos dois mtodos da classe Keyboard descritos nesta seo.

Listagem B.6: Exemplo de uso da classe Keyboard para leitura de valores tipo long
1 2 3 4 5 6 7 8 9 10 11 12 13

class demoKeyboard { public static void main(String args[]) { System.out.print("Entre um valor do tipo long:"); long l1 = Keyboard.readLong(); // se no digitar nada, aceitar como zero System.out.println("Valor digitado: "+l1); System.out.print("Entre outro valor do tipo long:"); long l2 = Keyboard.readLong(-100); // se no digitar nada, aceitar como -100 System.out.println("Valor digitado: "+l2); } // fim do mtodo main } // fim da classe demoKeyboard

B.1.1.7

Usando a classe Keyboard para leitura de valores tipo float

Dois mtodos da classe Keyboard podem ser usados para a leitura de valores do tipo float do teclado: float Keyboard.readFloat(): Este mtodo l um valor do teclado e retorna um valor do tipo float correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor 0 (tipo float). float Keyboard.readFloat(float fdefault): Este mtodo l um valor do teclado e retorna um valor oat correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor passado pela varivel fdefault (tipo float). O programa na listagem B.7 demonstra o uso dos dois mtodos da classe Keyboard descritos nesta seo.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

206

Listagem B.7: Exemplo de uso da classe Keyboard para leitura de valores tipo float
1 2 3 4 5 6 7 8 9 10 11 12 13 14

class demoKeyboard { public static void main(String args[]) { System.out.print("Entre um valor do tipo float:"); float f1 = Keyboard.readFloat(); // se no digitar nada, aceitar como zero System.out.println("Valor digitado: "+f1); System.out.print("Entre outro valor do tipo float:"); float f2 = Keyboard.readFloat((float)3.1415); // se no digitar nada, // aceitar como 3.1415 System.out.println("Valor digitado: "+f2); } // fim do mtodo main } // fim da classe demoKeyboard

B.1.1.8

Usando a classe Keyboard para leitura de valores tipo double

Dois mtodos da classe Keyboard podem ser usados para a leitura de valores do tipo double do teclado: double Keyboard.readDouble(): Este mtodo l um valor do teclado e retorna um valor do tipo double correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor 0 (tipo double). double Keyboard.readDouble(double ddefault): Este mtodo l um valor do teclado e retorna um valor double correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar o valor passado pela varivel ddefault (tipo double). O programa na listagem B.8 demonstra o uso dos dois mtodos da classe Keyboard descritos nesta seo.

Listagem B.8: Exemplo de uso da classe Keyboard para leitura de valores tipo double
1 2 3 4 5 6 7 8 9 10 11 12 13 14

class demoKeyboard { public static void main(String args[]) { System.out.print("Entre um valor do tipo double:"); double d1 = Keyboard.readDouble(); // se no digitar nada, aceitar como zero System.out.println("Valor digitado: "+d1); System.out.print("Entre outro valor do tipo double:"); double d2 = Keyboard.readDouble(3.1415926535); // se no digitar nada, // aceitar como 3.1415926535 System.out.println("Valor digitado: "+d2); } // fim do mtodo main } // fim da classe demoKeyboard

B.1.1.9

Usando a classe Keyboard para leitura de instncias da classe String

Dois mtodos da classe Keyboard podem ser usados para a leitura de instncias da classe String do teclado: String Keyboard.readString(): Este mtodo l um valor do teclado e retorna uma instncia da classe String correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar uma instncia da classe String vazia (contendo zero caracteres).
Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

207 String Keyboard.readString(String ddefault): Este mtodo l um valor do teclado e retorna uma instncia da classe String correspondente ao que foi digitado. Caso nada seja digitado, o mtodo retornar uma cpia da String passada pela varivel ddefault. O programa na listagem B.9 demonstra o uso dos dois mtodos da classe Keyboard descritos nesta seo.

Listagem B.9: Exemplo de uso da classe Keyboard para leitura de instncias da classe String
1 2 3 4 5 6 7 8 9 10 11 12 13 14

class demoKeyboard { public static void main(String args[]) { System.out.print("Entre um valor do tipo String:"); String s1 = Keyboard.readString(); // se no digitar nada, aceitar como zero System.out.println("Valor digitado: "+s1); System.out.print("Entre outro valor do tipo String:"); String s2 = Keyboard.readString("default"); // se no digitar nada, aceitar // como "default" System.out.println("Valor digitado: "+s2); } // fim do mtodo main } // fim da classe demoKeyboard

B.2

Outros exemplos de uso da classe Keyboard

Nesta seo, outros exeplos de uso da classe Keyboard sero mostrados. O primeiro exemplo mostra vrios usos dos diversos mtodos da classe, no programa na listagem B.10.

Listagem B.10: Mais exemplos de usos da classe Keyboard


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

/* Esta classe demonstra os mtodos na classe Keyboard. Veja tambm outros exemplos para mais detalhes. */ class demoteclado { /* Este mtodo permite a execuo da classe */ public static void main(String args[]) { // declaro algumas variveis int i; double d; boolean b; String s; char c; System.out.print("Entre um valor inteiro:"); i = Keyboard.readInt(); // l um valor do tipo integer do teclado System.out.print("Entre um valor double [default: -2]:"); d = Keyboard.readDouble(-2); // l um valor do tipo double do teclado // no exemplo acima, se o usurio no digitar nada como entrada o // programa vai assumir o valor default -2. System.out.print("Entre um valor booleano:"); b = Keyboard.readBoolean(); // l um valor do tipo boolean do teclado System.out.print("Entre uma String: [default: Java]"); s = Keyboard.readString("Java"); // l um valor do tipo String do teclado // no exemplo acima, se o usurio no digitar nada como entrada o // programa vai assumir o valor default "Java". Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

208
System.out.print("Entre um char:"); c = Keyboard.readChar(); // l um valor do tipo char do teclado System.out.println("Os valores digitados so:"); // imprime resultados System.out.println("O inteiro "+i); System.out.println("O double "+d); System.out.println("O boolean "+b); System.out.println("A String "+s); System.out.println("O char "+c); } // fim do mtodo main } // fim da classe demoteclado

27 28 29 30 31 32 33 34 35 36

O segundo exemplo mostra como podemos usar os mtodos da classe Keyboard de dentro de outra classe. Especicamente, uma verso simplicada da classe Aluno ser reescrita para que alguns dos seus mtodos usem mtodos da classe Keyboard para leitura dos dados das instncias da classe Aluno. A listagem B.11 mostra a classe Aluno usando mtodos da classe Keyboard dentro de seus prprios mtodos, e o programa na listagem B.12 mostra usos da nova classe Aluno.

Listagem B.11: Exemplo de uso da classe Keyboard na classe Aluno


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

/* Classe que representa um aluno genrico */ class Aluno { private String nome; // o nome do aluno private int idade; // a idade do aluno private float mensalidade; // a mensalidade do aluno /* Mtodo que l somente o nome do aluno do teclado */ void lNome() { System.out.print("Entre o nome do aluno:"); // imprime uma mensagem nome = Keyboard.readString(); // l uma String para o nome } // fim do mtodo lNome /* Mtodo que imprime somente o nome do aluno */ void imprimeNome() { System.out.println("Nome: "+nome); // imprime o nome } // fim do mtodo imprimeNome /* Mtodo que l somente a idade do aluno do teclado */ void lIdade() { System.out.print("Entre a idade do aluno:"); // imprime uma mensagem idade = Keyboard.readInt(); // l um int para a idade } // fim do mtodo lIdade /* Mtodo que imprime somente a idade do aluno */ void imprimeIdade() { System.out.println("Idade: "+idade); // imprime a idade } // fim do mtodo imprimeIdade /* Mtodo que retorna o valor da varivel privada idade */ int retornaIdade() { return idade; } // fim do mtodo retornaIdade /* Mtodo que imprime somente a mensalidade do aluno */ void imprimeMensalidade() { System.out.println("Mensalidade: "+mensalidade); // imprime a mensalidade } // fim do mtodo imprimeMensalidade /* Mtodo que l somente a mensalidade do aluno do teclado */ void lMensalidade() { Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

209
System.out.print("Entre a mensalidade do aluno:"); // imprime uma mensagem mensalidade = Keyboard.readFloat(); // l um float para a mensalidade } // fim do mtodo lMensalidade /* Mtodo para imprimir todos os dados do aluno */ void imprimeDados() { imprimeNome(); imprimeIdade(); imprimeMensalidade(); } // fim do mtodo imprimeDados /* Mtodo para ler todos os dados do aluno */ void lDados() { lNome(); lIdade(); lMensalidade(); } // fim do mtodo lDados } // Fim da classe Aluno

42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

Listagem B.12: Exemplo de uso da classe Aluno com instncias da classe Keyboard
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

class TesteAluno // uma classe que testa a classe Aluno { public static void main(String args[]) { Aluno a1 = new Aluno(); // cria uma instncia da classe Aluno a1.lDados(); // l os dados deste aluno do teclado Aluno a2 = new Aluno(); // cria outra instncia da classe Aluno a2.lDados(); // l os dados deste aluno do teclado System.out.println("O aluno mais velho :"); // imprime mensagem if (a1.retornaIdade() > a2.retornaIdade()) // se a1 for mais velho que a2 a1.imprimeDados(); // imprime a1 else // seno a2.imprimeDados(); // imprime a2 } // fim do mtodo main } // fim da classe testealunokey

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

210

B.3

Cdigo fonte da classe Keyboard

Para referncia, a classe Keyboard completa est listada abaixo. Listagem B.13: A classe Keyboard
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

/* A classe Keyboard (adaptada do livro "An Introduction to Computer Science Using Java", de Samuel N. Kamin , M. Dennis Mickunas e Edward M. Reingold) l dados do teclado usando um pequeno truque: um BufferedReader criado a partir da classe System.in. Esta classe foi digitada por diligentes alunos da disciplina Programao Orientada a Objetos I (turma de 1999) e anotada depois para mais clareza. Alguns mtodos e chamadas no esto otimizados para manter a clareza e servir de referncia aos estudiosos. */ // importo as classes de E/S de Java import java.io.*; class Keyboard { /* Algumas variveis so "globais" dentro da classe, sendo declaradas aqui */ static boolean iseof = false; // indica se fim do "arquivo" de leitura // declara e inicializa um BufferedReader a partir do System.in static BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); /////////////////////////////////////////////////////////////////////////////// // MTODOS PARA LER BOOLEANS /////////////////////////////////////////////////////////////////////////////// /* L um valor do tipo boolean do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. Este mtodo considera que o default retornar true. */ public static boolean readBoolean() { return readBoolean(true); // chama o mtodo genrico abaixo } /* L um valor do tipo boolean do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. */ public static boolean readBoolean(boolean bdefault) { String s=""; // a string a ser lida do teclado e convertida em um boolean boolean b = bdefault; // o valor booleano a ser retornado, inicializado if (iseof) return b; // se estamos no fim do arquivo, retornamos o default System.out.flush(); // limpa o que existir no buffer do arquivo try // tenta.. { s = input.readLine(); // ... ler uma string do "arquivo" de entrada System.out.flush(); // limpa o que existir no buffer do arquivo } catch (IOException e) // se no der certo, { System.exit(-1); // sai do programa. } if (s==null) // se a String lida for nula, ou vazia, { iseof=true; // avisa que este o fim do "arquivo" return b; // e retorna o valor default } // seno avalia o que foi digitado: if (s.trim().equalsIgnoreCase("true")) b = true; // verdadeiro se igual true else if (s.trim().equalsIgnoreCase("false")) b = false; // falso se igual false else if (s.trim().equalsIgnoreCase("t")) b = true; // verdadeiro se igual t Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

211
else else else else else else else else else else else else (s.trim().equalsIgnoreCase("f")) b = false; // falso se igual f (s.trim().equalsIgnoreCase("yes")) b = true; // verdadeiro se igual yes (s.trim().equalsIgnoreCase("no")) b = false; // falso se igual no (s.trim().equalsIgnoreCase("y")) b = true; // verdadeiro se igual yes (s.trim().equalsIgnoreCase("n")) b = false; // falso se igual no (s.trim().equalsIgnoreCase("v")) b = true; // verdadeiro se igual v (s.trim().equalsIgnoreCase("f")) b = false; // falso se igual f (s.trim().equalsIgnoreCase("s")) b = true; // verdadeiro se igual s (s.trim().equalsIgnoreCase("sim")) b = true; // verdadeiro se igual sim (s.trim().equalsIgnoreCase("nao")) b = false; // falso se igual nao (s.trim().equalsIgnoreCase("no")) b = false; // falso se igual no (s.trim().equalsIgnoreCase("verdadeiro")) b = true; // verdadeiro se // igual verdadeiro else if (s.trim().equalsIgnoreCase("falso")) b = false; // falso se igual falso return b; // retorna o valor de b } // fim do mtodo readBoolean if if if if if if if if if if if if

59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124

/////////////////////////////////////////////////////////////////////////////// // MTODOS PARA LER BYTES /////////////////////////////////////////////////////////////////////////////// /* L um valor do tipo byte do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. Este mtodo considera que o default retornar zero. */ public static byte readByte() { return readByte((byte)0); // chama o mtodo genrico abaixo } /* L um valor do tipo byte do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. */ public static byte readByte(byte bdefault) { String s=""; // a String a ser lida do teclado e convertida em um byte byte b; // o valor byte a ser retornado, inicializado if (iseof) return bdefault; // se estamos no fim do arquivo, retornamos o default System.out.flush(); // limpa o que existir no buffer do arquivo try // tenta.. { s = input.readLine(); // ... ler uma string do "arquivo" de entrada System.out.flush(); // limpa o que existir no buffer do arquivo } catch (IOException e) // se no der certo, { System.exit(-1); // sai do programa. } if (s==null) // se a String lida for nula, ou vazia, { iseof=true; // avisa que este o fim do "arquivo" return bdefault; // e retorna o valor default } // seno avalia o que foi digitado: try // tenta { b=new Byte(s.trim()).byteValue(); // converter a String para byte... } catch (NumberFormatException e) // se no conseguir, { b = bdefault; // usa o valor default } return b; // retorna o valor de b } // fim do mtodo readByte /////////////////////////////////////////////////////////////////////////////// // MTODOS PARA LER CHARS /////////////////////////////////////////////////////////////////////////////// Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

212

125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190

/* L um valor do tipo char do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. Este mtodo considera que o default retornar um espao. */ public static char readChar() { return readChar( ); // chama o mtodo genrico abaixo } /* L um valor do tipo char do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. */ public static char readChar(char cdefault) { String s=""; // a String a ser lida do teclado e convertida em um nico char char c = cdefault; // o valor char a ser retornado, inicializado if (iseof) return c; // se estamos no fim do arquivo, retornamos o default System.out.flush(); // limpa o que existir no buffer do arquivo try // tenta.. { s = input.readLine(); // ... ler uma string do "arquivo" de entrada System.out.flush(); // limpa o que existir no buffer do arquivo } catch (IOException e) // se no der certo, { System.exit(-1); // sai do programa. } if (s==null) // se o char lido for nulo, ou vazio, { iseof=true; // avisa que este o fim do "arquivo" return c; // e retorna o valor default } if (s.length() > 0) // seno verifica o tamanho do que foi entrado, return s.charAt(0); // retorna o primeiro caracter do que foi digitado else // ou ento return cdefault; // retorna o default } // fim do mtodo readChar /////////////////////////////////////////////////////////////////////////////// // MTODOS PARA LER SHORTS /////////////////////////////////////////////////////////////////////////////// /* L um valor do tipo short do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. Este mtodo considera que o default retornar zero. */ public static short readShort() { return readShort((short)0); // chama o mtodo genrico abaixo } /* L um valor do tipo short do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. */ public static short readShort(short sdefault) { String s=""; // a String a ser lida do teclado e convertida em um short short sh = sdefault; // o valor short a ser retornado, inicializado if (iseof) return sh; // se estamos no fim do arquivo, retornamos o default System.out.flush(); // limpa o que existir no buffer do arquivo try // tenta.. { s = input.readLine(); // ... ler uma string do "arquivo" de entrada System.out.flush(); // limpa o que existir no buffer do arquivo } catch (IOException e) // se no der certo, { System.exit(-1); // sai do programa. } Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

213
if (s==null) // se a String lida for nula, ou vazia, { iseof=true; // avisa que este o fim do "arquivo" return sh; // e retorna o valor default } // seno avalia o que foi digitado: try // tenta { sh=new Short(s.trim()).shortValue(); // converter a String para short... } catch (NumberFormatException e) // se no conseguir, { sh = sdefault; // usa o valor default } return sh; // retorna o valor de sh } // fim do mtodo readShort /////////////////////////////////////////////////////////////////////////////// // MTODOS PARA LER INTS /////////////////////////////////////////////////////////////////////////////// /* L um valor do tipo int do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. Este mtodo considera que o default retornar zero. */ public static int readInt() { return readInt(0); // chama o mtodo genrico abaixo } /* L um valor do tipo int do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. */ public static int readInt(int idefault) { String s=""; // a String a ser lida do teclado e convertida em um int int i = idefault; // o valor int a ser retornado, inicializado if (iseof) return i; // se estamos no fim do arquivo, retornamos o default System.out.flush(); // limpa o que existir no buffer do arquivo try // tenta.. { s = input.readLine(); // ... ler uma string do "arquivo" de entrada System.out.flush(); // limpa o que existir no buffer do arquivo } catch (IOException e) // se no der certo, { System.exit(-1); // sai do programa. } if (s==null) // se a String lida for nula, ou vazia, { iseof=true; // avisa que este o fim do "arquivo" return i; // e retorna o valor default } // seno avalia o que foi digitado: try // tenta { i=new Integer(s.trim()).intValue(); // converter a String para int... } catch (NumberFormatException e) // se no conseguir, { i = idefault; // usa o valor default } return i; // retorna o valor de i } // fim do mtodo readInt /////////////////////////////////////////////////////////////////////////////// // MTODOS PARA LER LONGS /////////////////////////////////////////////////////////////////////////////// Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256

214

257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

/* L um valor do tipo long do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. Este mtodo considera que o default retornar zero. */ public static long readLong() { return readLong(0); // chama o mtodo genrico abaixo } /* L um valor do tipo long do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. */ public static long readLong(long ldefault) { String s=""; // a String a ser lida do teclado e convertida em um long long l = ldefault; // o valor long a ser retornado, inicializado if (iseof) return l; // se estamos no fim do arquivo, retornamos o default System.out.flush(); // limpa o que existir no buffer do arquivo try // tenta.. { s = input.readLine(); // ... ler uma string do "arquivo" de entrada System.out.flush(); // limpa o que existir no buffer do arquivo } catch (IOException e) // se no der certo, { System.exit(-1); // sai do programa. } if (s==null) // se a String lida for nula, ou vazia, { iseof=true; // avisa que este o fim do "arquivo" return l; // e retorna o valor default } // seno avalia o que foi digitado: try // tenta { l=new Long(s.trim()).longValue(); // converter a String para long... } catch (NumberFormatException e) // se no conseguir, { l = ldefault; // usa o valor default } return l; // retorna o valor de l } // fim do mtodo readLong /////////////////////////////////////////////////////////////////////////////// // MTODOS PARA LER FLOATS /////////////////////////////////////////////////////////////////////////////// /* L um valor do tipo float do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. Este mtodo considera que o default retornar zero. */ public static float readFloat() { return readFloat(0); // chama o mtodo genrico abaixo } /* L um valor do tipo float do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. */ public static float readFloat(float fdefault) { String s=""; // a String a ser lida do teclado e convertida em um float float f = fdefault; // o valor float a ser retornado, inicializado if (iseof) return f; // se estamos no fim do arquivo, retornamos o default System.out.flush(); // limpa o que existir no buffer do arquivo try // tenta.. { s = input.readLine(); // ... ler uma string do "arquivo" de entrada Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

215
System.out.flush(); // limpa o que existir no buffer do arquivo } catch (IOException e) // se no der certo, { System.exit(-1); // sai do programa. } if (s==null) // se a String lida for nula, ou vazia, { iseof=true; // avisa que este o fim do "arquivo" return f; // e retorna o valor default } // seno avalia o que foi digitado: try // tenta { f=new Float(s.trim()).floatValue(); // converter a String para float... } catch (NumberFormatException e) // se no conseguir, { f = fdefault; // usa o valor default } return f; // retorna o valor de f } // fim do mtodo readFloat /////////////////////////////////////////////////////////////////////////////// // MTODOS PARA LER DOUBLES /////////////////////////////////////////////////////////////////////////////// /* L um valor do tipo double do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. Este mtodo considera que o default retornar zero. */ public static double readDouble() { return readDouble(0); // chama o mtodo genrico abaixo } /* L um valor do tipo double do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. */ public static double readDouble(double ddefault) { String s=""; // a String a ser lida do teclado e convertida em um double double d = ddefault; // o valor double a ser retornado, inicializado if (iseof) return d; // se estamos no fim do arquivo, retornamos o default System.out.flush(); // limpa o que existir no buffer do arquivo try // tenta.. { s = input.readLine(); // ... ler uma string do "arquivo" de entrada System.out.flush(); // limpa o que existir no buffer do arquivo } catch (IOException e) // se no der certo, { System.exit(-1); // sai do programa. } if (s==null) // se a String lida for nula, ou vazia, { iseof=true; // avisa que este o fim do "arquivo" return d; // e retorna o valor default } // seno avalia o que foi digitado: try // tenta { d=new Double(s.trim()).doubleValue(); // converter a String para float... } catch (NumberFormatException e) // se no conseguir, { d = ddefault; // usa o valor default } Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388

216
return d; // retorna o valor de d } // fim do mtodo readDouble /////////////////////////////////////////////////////////////////////////////// // MTODOS PARA LER STRINGS /////////////////////////////////////////////////////////////////////////////// /* L um valor do tipo String do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. Este mtodo considera que o default retornar uma String vazia. */ public static String readString() { return readString(""); // chama o mtodo genrico abaixo } /* L um valor do tipo String do teclado, retorna o valor default se nada digitado ou sai do programa se existe erro de leitura. */ public static String readString(String sdefault) { String s=""; // a String a ser lida do teclado e convertida em um outro String String sd = sdefault; // o valor String a ser retornado, inicializado if (iseof) return sd; // se estamos no fim do arquivo, retornamos o default System.out.flush(); // limpa o que existir no buffer do arquivo try // tenta.. { s = input.readLine(); // ... ler uma string do "arquivo" de entrada System.out.flush(); // limpa o que existir no buffer do arquivo } catch (IOException e) // se no der certo, { System.exit(-1); // sai do programa. } if (s==null) // se a String lida for nula, ou vazia, { iseof=true; // avisa que este o fim do "arquivo" return sd; // e retorna o valor default } if (s.length() == 0) // se a String lida for vazia return sd; // retorna a default else // seno return s; // seno retorna o que foi digitado } // fim do mtodo readString } // fim da classe Keyboard

389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

217

Apndice C Usando o Java Development Kit


ATENO: Este captulo ainda est sendo escrito. Evite imprimi-lo, pois novas verses devem ser liberadas em breve.

C.1
C.1.1

Sobre o Java Development Kit (JDK)


Obtendo e Instalando o JDK

O JDK pode ser obtido, em diferentes verses, no Site da Sun (www.sun.com). Seguindo as instrues na pgina da Sun, copie e instale o JDK na sua mquina. FCC/UNIVAP Alunos da FCC/Univap j tem o JDK instalado e pronto para o uso: uma verso atual do JDK j est instalada nos computadores rodando Linux ou terminais que possibilitem o acesso contas no Linux nos laboratrios de informtica da Faculdade de Cincia da Computao.

C.2

Como um programa em Java compilado e executado

Cdigofonte em Java

Compilador Java

Bytecode (objeto)

Interpretador Java
(JVM, mquina virtual Java)

Transporte via Internet

Navegador

Interpretador Java
(JVM, mquina virtual Java)

Figura C.1: Como um programa em Java compilado e executado

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

218

C.3
C.3.1

Usando o JDK no Linux


Compilando e Executando Programas em Java no Linux

Se o JDK estiver instalado no computador ou terminal sendo usado (veja a seo C.1.1), programas em Java podem ser compilados atravs de comandos entrados em um terminal como kterm, xterm ou similares.

C.4 Usando o JDK no Windows


C.4.1 Editores de Texto para o Windows
Qualquer editor de textos puro que seja capaz de ler e gravar arquivos em ASCII pode ser usado para editar programas em Java. Exemplos destes editores so o Notepad (ou Bloco de Notas) e o EditPlus (que colore a sintaxe das palavras-chave dos programas em Java). Editores de texto como o Microsoft Word e similares no devem ser usados, uma vez que estes gravam arquivos em um formato interno que no reconhecido pelo compilador Java (este somente compilar programas que tiverem sido gravados em modo texto, o que default para os editores sugeridos acima). O compilador tambm espera que o programa em java seja gravado com a extenso .java e no .txt. Quando estiver editando arquivos em uma janela com o editor e compilando programas em Java em uma janela do DOS, lembre-se de sempre gravar o programa antes de compilar.

C.4.2

Compilando e Executando Programas em Java no Windows

Depois de criar um programa em Java usando o editor de textos escolhido e grav-lo no disco, voc pode usar o compilador Java para compil-lo. De uma janela do MS-DOS

CHAMA MESMO ?, mude o diretrio atual para o diretrio onde seu arquivo .java

COMO E QUE

est, usando o comando cd [nome do diretrio]. Para compilar o programa, basta usar o comando javac [nome do arquivo com a extenso .java]. Este comando criar os arquivos .class correspondentes (veja a seo C.5). A mquina virtual Java que executar as classes compiladas s pode executar arquivos com a extenso .class que contenham o mtodo main decladaro como public static void main e com um vetor de Strings passado como parmetro. Outras classes podem ser necessrias para a execuo do programa, e devem estar tambm compiladas. Para executar uma classe que tenha o mtodo main apropriado, basta executar o comando java [nome da classe] sem a extenso .class. Caso haja uma interface grca para o programa, esta aparecer na tela do terminal ou computador, e caso a interao seja feita por entrada e sada normal, estas ocorrero na janela do MS-DOS

COMO E QUE CHAMA MESMO ?.

C.5 Esclarecimentos Sobre Nomes de Classes e Arquivos


Diferentemente de compiladores de outras linguagens como C e Pascal, o compilador Java cria os nomes das classes (bytecodes que podem ser executados pela mquina virtual) baseado nas classes existentes nos arquivos e no nos nomes dos arquivos. Quando um programa compilado, dependendo do contedo do arquivo com o programa em java, uma ou mais classes sero criadas e colocadas em arquivos com a extenso .class. Para cada classe existente no arquivo, um arquivo de sada com o nome da classe e a extenso .class ser criado.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

219 Quando uma classe declarada pblica com a palavra-chave public ela deve ser colocada em um arquivo com o mesmo nome da classe. Por exemplo, uma classe Aluno declarada como public class Aluno deve ser escrita em um arquivo Aluno.java. Quando uma classe depende de outra (por exemplo, a classe Turma contm uma instncia da classe Professor, signicando que para compilar a classe Turma precisamos compilar a classe Professor antes), o compilador tentar compilar todas as classes que so pr-requisitos para a classe que estamos compilando. Seguindo o exemplo acima, se compilarmos a classe Turma o compilador, se necessrio, compilar automaticamente a classe Professor. Note que o reverso no verdade: se compilarmos somente a classe Professor teremos que compilar manualmente a classe Turma se esta no tiver sido compilada. Alguns exemplos de nomes de arquivos e classes que sero criadas so mostrados na tabela C.1: Nome do Arquivo Contedo do Arqui- Comando a ser exevo cutado aluno.java (com Uma classe chama- javac aluno.java a minsculo) da Aluno (com A maisculo) alunos.java As classes Aluno, javac (com a minscu- Aluno_Pre_Primario alunos.java lo) e Aluno_Universitario. A.java As classes B, C e D. javac A.java A classe D depende da classe E, que ainda no foi compilada e est no arquivo E.java. Resultado O arquivo Aluno.class (com A maisculo). Os arquivos Aluno.class, Aluno_Pre_Primario.class e Aluno_Universitario.class. Os arquivos B.class, C.class e D.class (note que no existe a classe A ento o arquivo A.class no criado). O arquivo E.class criado (compilado automaticamente) porque necessrio para a classe D.

Tabela C.1: Exemplos de nomes de arquivos e classes geradas pelo compilador

C.6

Possveis Erros de Compilao e Execuo

Diversos erros podem acontecer no processo de compilao e execuo de programas em Java. Alguns mais frequentes so descritos na tabela C.2, com detalhes das causas e possveis solues: Outros erros que podem acontecer por causa de erros de digitao, falta de comandos ou pontos-e-vrgulas, aparecero na linha de comando com o nmero da linha indicado, e o trecho onde o problema ocorreu. Use estas indicaes para achar os erros e corrig-los. FCC/UNIVAP Se voc est usando o ambiente sugerido pelo professor (Linux, JDK, xemacs) o editor automaticamente mostrar os erros na janela de compilao.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

220

Erro ou Problema Ao tentar compilar um arquivo com um programa em Java, o compilador javac mostra a mensagem invalid argument (argumento invlido). O compilador javac mostra uma mensagem de erro parecida com Public class ... must be dened in a le called ....

Possvel Causa O arquivo sendo compilado no est com a extenso apropriada .java.

Possvel Soluo Renomeie ou salve o arquivo com a extenso .java

O arquivo sendo compilado contm uma classe declarada pblica com um nome diferente do arquivo. Classes pblicas devem ser criadas em arquivos com o mesmo nome da classe. O intepretador java mostra uma A classe sendo executada mensagem de erro parecida com no foi encontrada ou seu Cant nd class.... nome foi dado incorretamente.

Renomeie o arquivo para o nome da classe.

O intepretador java mostra uma Uma classe que necessria mensagem de erro parecida com para a execuo do prograjava.lang.NoClassDefFoundError. ma no foi encontrada.

Recompile todos os programas que sejam relacionados com a classe ou verique se o nome da classe foi dado corretamente lembre-se que o nome da classe passada para o interpretador no deve conter a extenso .class. Recompile os programas necessrios para a classe no encontrada.

Tabela C.2: Alguns erros de compilao e execuo, suas causas e possveis solues

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

221

Apndice D Usando o Sistema Operacional Linux


ATENO: Este captulo ainda est sendo escrito. Evite imprimi-lo, pois novas verses devem ser liberadas em breve.

D.1 D.2

Introduo A estrutura de arquivos e diretrios do Linux

usurio, usurio em rede, superusurio, permisses REFAZER COMO FIGURA ? / /home /home/shinosuke /home/shinosuke/java /home/shinosuke/java/prog1.java /home/shinosuk /home/shinosuke/c/prog1.c /home/shinosuke/docs /home/shinosuke/docs/carta.txt /home/shinosu /home/sazae /home/sazae/java /home/sazae/java/prog1.java /bin /usr /tmp

D.3
D.3.1 D.3.2

Uma introduo aos comandos bsicos do Linux


Executando comandos no Linux Comandos de listagem de diretrios e arquivos

Alguns dos comandos mais usados para listagem de diretrios e arquivos so exemplicados na lista abaixo. Argumentos opcionais sero mostrados entre colchetes [ ].

ls [argumentos] [nome-de-arquivo-ou-diretrio] O comando ls, sem argumentos, lista o contedo (nomes de arquivos) do diretrio corrente, da maneira mais simples possvel. Se o argumento -l for passado, a listagem ser detalhada (mostrando o nome do dono do arquivo, as permisses, o tamanho em bytes e a data da ltima modicao). Se o argumento -R for passado, a listagem ser recursiva, ou seja, todos os arquivos em todos os diretrios a partir do diretrio corrente sero listados - esta opo pode resultar em listagens muito longas. aa

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

222

D.3.3 D.3.4 D.3.5 D.3.6


D.3.6.1

Comandos de criao, remoo e modicao de diretrios Comandos de cpia, remoo e modicao de arquivos e diretrios Comandos de exibio do contedo de arquivos Editores de Texto para o Linux
Xemacs e Emacs

Caractersticas: buffers, nomes, etc. Cuidados: ao usar xemacs, o nome deve ser criado com a extenso correta.

Figura D.1: Interface grca do Xemacs

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

223

Figura D.2: Interface grca do Emacs

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

224

Comando ctrl+x ctrl+s ctrl+x ctrl+c ctrl+x ctrl+f ctrl+x ctrl+w ctrl+x k ctrl+d ctrl+k ctrl+y

ctrl+e ctrl+a esc+x goto-line

ctrl+r ctrl+s esc+x replace-string esc+% ctrl+x 1 ctrl+x 2 ctrl+x b

Efeito Grava o buffer sendo editado. Sai do emacs, perguntando se deve salvar buffers modicados. Pede nome de novo arquivo para edio. O nome deve ser digitado na barra de texto inferior do emacs. Grava o buffer com novo nome (que dever ser digitado na barra de texto inferior do emacs). Elimina o buffer sendo editado do emacs (pede conrmao para eliminao de buffers modicados). Apaga o caracter sob o cursor. Apaga a linha a partir do caracter sob o cursor, copiando para a memria. Copia o contedo da memria para a posio do cursor. Os comandos ctrl+k e ctrl+y, usados em conjunto, podem servir para duplicar trechos do programa. Move o cursor para o nal da linha. Move o cursor para o incio da linha. Pede um nmero de linha e move o cursor para a linha especicada. O Xemacs aceita o comando abreviado esc+g, com a mesma funo. Procura texto (desde o incio do buffer at a posio do cursor). Procura texto (desde a posio do cursor at o m do buffer) Troca ocorrncias de texto dentro do buffer (sem pedir conrmao). Troca ocorrncias de texto dentro do buffer (pedindo conrmao para cada troca). Muda o modo de tela para que somente um buffer seja exibido de vez. Muda o modo de tela para que dois buffers sejam exibidos de vez. Troca o buffer sendo mostrado.

Tabela D.1: Comandos bsicos de teclado para o Emacs/Xemacs

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

225

Referncias Bibliogrcas
[1] Samuel N. Kamin, M. Dennis Mickunas, Edward M. Reingold, An Introduction to Computer Science Using Java, WCB/McGraw-Hill, 1998. [2] David Arnow, Gerald Weiss, Introduction to Programming Using Java - An Object-Oriented Approach, Addison-Wesley, 1998.

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

226

ndice Remissivo
Acrobat Reader, 2 aplicaes em Java, 5 applets, 5 argumentos para o mtodo main, 33 array, 33 bibliotecas, 39 C++, 4 caracter de escape, 188 cast, 179 classe ponto de entrada, 33 classes denio, 8 comentrios em java, 18 construtor, 68 Eiffel, 4 encapsulamento, 10 erro overow, 183 exerccios categorias, 3 herana, 43 sobrecarga, 46 if aninhados, 81 interface, 10 java comentrios, 18 lao while, 86, 88 laos, 85 mtodos, 21 argumentos, 21 main, 33 modelos denio, 7 modicadores para o mtodo main, 33 new, 36 Object,classe, 73 objetos denio, 9 ocultao de informao, 10 overow erro, 183 PDF, 2 polimorsmo, 57 POO denio, 8 POOI Objetivos Gerais, 5 POOII Objetivos Gerais, 6 Unidades, 5, 6 private mtodos, 21 variveis, 19 public, 218 mtodos, 21 variveis, 19 Smalltalk, 4 sobrecarga, 46 static, 33, 37 Strings, 187 concatenao, 188 super, 52 tipos de dados nativos, 178 Unicode, 180 varivel de controle, 85 void, 21

Clique aqui para ver como este documento pode ser personalizado para voc ! ( necessrio estar conectado Internet.)

Potrebbero piacerti anche