You are on page 1of 166

TREINAMENTOS

Orientao a Objetos em Java

Orientao a Objetos em Java

9 de fevereiro de 2011

www.k19.com.br

ii

Sumrio
1 2 Introduo Lgica 2.1 O que um Programa? . . . . . . . . . . . . . . . . . . 2.2 Linguagem de Programao VS Linguagem de Mquina 2.3 Exemplo de programa Java . . . . . . . . . . . . . . . . 2.4 Mtodo Main - Ponto de Entrada . . . . . . . . . . . . . 2.5 Mquinas Virtuais . . . . . . . . . . . . . . . . . . . . . 2.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . 2.7 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . 2.8 Operadores . . . . . . . . . . . . . . . . . . . . . . . . 2.9 IF-ELSE . . . . . . . . . . . . . . . . . . . . . . . . . . 2.10 WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11 FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.12 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . Orientao a Objetos 3.1 Objetos . . . . . . . . . . . . . . . . . . . . 3.2 Classes . . . . . . . . . . . . . . . . . . . . 3.3 Referncias . . . . . . . . . . . . . . . . . . 3.4 Manipulando Atributos . . . . . . . . . . . . 3.5 Agregao . . . . . . . . . . . . . . . . . . . 3.6 Exerccios . . . . . . . . . . . . . . . . . . . 3.7 Mtodos . . . . . . . . . . . . . . . . . . . . 3.8 Sobrecarga(Overloading) . . . . . . . . . . . 3.9 Exerccios . . . . . . . . . . . . . . . . . . . 3.10 Construtores . . . . . . . . . . . . . . . . . . 3.10.1 Construtor Default . . . . . . . . . . 3.10.2 Sobrecarga de Construtores . . . . . 3.10.3 Construtores chamando Construtores 3.11 Exerccios . . . . . . . . . . . . . . . . . . . 3.12 Referncias como parmetro . . . . . . . . . 3.13 Exerccios . . . . . . . . . . . . . . . . . . . iii 1 3 3 3 4 5 6 9 10 13 14 15 15 15 19 19 20 21 22 22 23 27 29 30 31 33 33 34 34 37 37

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SUMRIO 4 Arrays 4.1 Arrays de Arrays . 4.2 Percorrendo Arrays 4.3 Operaes . . . . . 4.4 Exerccios . . . . .

SUMRIO 39 40 40 41 41 45 45 46 46 47 48 48 51 53 54 55 56 56

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Eclipse 5.1 Workspace . . . . . . . . 5.2 Welcome . . . . . . . . 5.3 Workbench . . . . . . . 5.4 Perspective . . . . . . . 5.5 Views . . . . . . . . . . 5.6 Criando um projeto java 5.7 Criando uma classe . . . 5.8 Criando o mtodo main . 5.9 Executando uma classe . 5.10 Corrigindo erros . . . . . 5.11 Atalhos teis . . . . . . 5.12 Save Actions . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Atributos e Mtodos de Classe 59 6.1 Atributos Estticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.2 Mtodos Estticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 6.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Encapsulamento 7.1 Atributos Privados . . . . . . . . 7.2 Mtodos Privados . . . . . . . . . 7.3 Mtodos Pblicos . . . . . . . . . 7.4 Implementao e Interface de Uso 7.5 Escondendo a implementao . . . 7.6 Acesso e Alterao de atributos . . 7.7 Exerccios . . . . . . . . . . . . . Herana 8.1 Reutilizao de Cdigo 8.2 Reescrita de Mtodo . 8.3 Construtores e Herana 8.4 Exerccios . . . . . . . 63 63 64 64 65 65 66 67 71 71 75 77 77 83 84 85 85 86 iv

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Polimorsmo 9.1 Modelagem das contas . . . . . 9.2 UM (extends) . . . . . . . . . 9.3 Melhorando o gerador de extrato 9.4 Exerccios . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

www.k19.com.br

SUMRIO

SUMRIO

10 Classes Abstratas 89 10.1 Classes Abstratas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 10.2 Mtodos Abstratos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 10.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 11 Interfaces 11.1 Padronizao . . . 11.2 Contratos . . . . . 11.3 Exemplo . . . . . . 11.4 Polimorsmo . . . 11.5 Interface e Herana 11.6 Exerccios . . . . . 93 93 94 94 95 95 97 101 101 101 101 102 102 103 104 104 104 104 104 104 107 108 108 108 109 110 113 113 114 115 116 117 117 118 119 119

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

12 Pacotes 12.1 Organizao . . . . . . . . . . 12.2 O comando package . . . . . . 12.3 Sub Pacotes . . . . . . . . . . 12.4 Classes ou Interfaces pblicas 12.4.1 Fully Qualied Name . 12.5 Import . . . . . . . . . . . . . 12.6 Nveis de visibilidade . . . . . 12.6.1 Privado . . . . . . . . 12.6.2 Padro . . . . . . . . 12.6.3 Protegido . . . . . . . 12.6.4 Pblico . . . . . . . . 12.7 Exerccios . . . . . . . . . . . 13 Exceptions 13.1 Tipos de erros de execuo . . 13.2 Lanando erros . . . . . . . . 13.2.1 Checked e Unchecked 13.3 Capturando erros . . . . . . . 13.4 Exerccios . . . . . . . . . . . 14 Object 14.1 Polimorsmo . . . 14.2 O mtodo toString() 14.3 O mtodo equals() . 14.4 Exerccios . . . . . 15 Entrada e Sada 15.1 Byte a Byte 15.2 Scanner . . 15.3 PrintStream 15.4 Exerccios . v

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

K19 Treinamentos

SUMRIO 16 Collections 16.1 Listas . . . . . . . . . . . . . . . 16.1.1 Mtodo: add(Object) . . . 16.1.2 Mtodo: add(int, Object) . 16.1.3 Mtodo: size() . . . . . . 16.1.4 Mtodo: clear() . . . . . . 16.1.5 Mtodo: contains(Object) 16.1.6 Mtodo: remove(Object) . 16.1.7 Mtodo: remove(int) . . . 16.1.8 Mtodo: get(int) . . . . . 16.1.9 Mtodo: indexOf(Object) 16.1.10 Benchmarking . . . . . . 16.2 Exerccios . . . . . . . . . . . . . 16.3 Conjuntos . . . . . . . . . . . . . 16.4 Colees . . . . . . . . . . . . . . 16.5 Exerccios . . . . . . . . . . . . . 16.6 Lao foreach . . . . . . . . . . . 16.7 Generics . . . . . . . . . . . . . . 16.8 Exerccios . . . . . . . . . . . . . 17 Apndice -Swing 17.1 Componentes . . . . . . . 17.1.1 JFrame . . . . . . 17.1.2 JPanel . . . . . . . 17.1.3 JTextField e JLabel 17.1.4 JTextArea . . . . . 17.1.5 JPasswordField . . 17.1.6 JButton . . . . . . 17.1.7 JCheckBox . . . . 17.1.8 JComboBox . . . 17.2 Layout Manager . . . . . . 17.3 Events, Listeners e Sources 17.3.1 Exemplo . . . . . 17.4 Exerccios . . . . . . . . .

SUMRIO 121 121 122 122 122 123 123 123 124 124 124 125 125 127 127 128 129 129 130 133 133 133 134 134 135 135 136 136 136 137 138 138 139 141 141 142 142 143 143 144 144 vi

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

18 Apndice -Threads 18.1 Denindo Tarefas - (Runnables) . . 18.2 Executando Tarefas . . . . . . . . . 18.3 Exerccios . . . . . . . . . . . . . . 18.4 Controlando a Execuo das Tarefas 18.4.1 sleep() . . . . . . . . . . . . 18.4.2 join() . . . . . . . . . . . . 18.5 Exerccios . . . . . . . . . . . . . . www.k19.com.br

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

SUMRIO

SUMRIO

19 Apndice - Socket 147 19.1 Socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 19.2 ServerSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 19.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 20 Apndice - Chat K19 20.1 Arquitetura do Sistema . . . . 20.2 Aplicao servidora . . . . . . 20.2.1 Registrador . . . . . . 20.2.2 Receptor . . . . . . . 20.2.3 Emissor . . . . . . . . 20.2.4 Distribuidor . . . . . . 20.3 Aplicao cliente . . . . . . . 20.3.1 EmissorDeMensagem 20.3.2 ReceptorDeMensagem 20.4 Exerccios . . . . . . . . . . . 151 151 151 151 151 152 152 152 152 152 153

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

vii

K19 Treinamentos

SUMRIO

SUMRIO

www.k19.com.br

viii

Captulo 1 Introduo
O principal objetivo deste treinamento capacitar prossionais para atuar no mercado de trabalho na rea de desenvolvimento de software. Conhecimentos sobre a plataforma Java e sobre o modelo de programao orientado a objetos so normalmente exigidos pelas empresas que desejam contratar. Portanto, os dois tpicos principais deste treinamento so: a plataforma Java e orientao a objetos. Resumidamente, apresentaremos a seguir cada um desses assuntos e as relaes entre eles. Orientao a objetos um modelo de programao ou paradigma de programao, ou seja, um conjunto de ideias, conceitos e abstraes que servem como um guia para construir um software. A plataforma Java composta por vrios elementos. Neste momento os mais importantes so: a linguagem de programao e o ambiente de execuo. A linguagem de programao utilizada para denir formalmente todas as partes de um sistema e como essas partes se relacionam. Alm disso, a linguagem de programao Java orientada a objetos, ou seja, ela permite que voc aplique as ideias, conceitos e abstraes de orientao a objetos de uma maneira natural. O ambiente de execuo composto basicamente de uma mquina virtual e de um conjunto de bibliotecas padronizado. A mquina virtual permite que um programa Java possa ser executado em ambiente diferentes. As bibliotecas facilitam a implementao dos sistemas. O processo de desenvolver um sistema orientado a objetos em Java se d da seguinte forma: As partes do sistema e o relacionamento entre elas so denidas utilizando o modelo de programao orientado a objetos e depois o cdigo fonte do sistema escrito na linguagem de programao Java. Do ponto de vista do aprendizado, interessante tentar denir o grau de importncia dos dois assuntos principais abordados neste treinamento. Consideramos que a orientao a objetos mais importante pois ela utilizada frequentemente no desenvolvimento de software inclusive com outras linguagens de programao (C#, JavaScript, Ruby, C++, entre outras). As pessoas que possuem conhecimentos mais slidos em orientao a objetos so mais preparadas para desenvolver sistemas na maioria das linguagens utilizadas pelas empresas que desenvolvem software. Para compreender melhor o contedo desse treinamento, importante saber para quais tipos de sistemas o modelo de programao orientado a objetos e a plataforma Java so mais adequados. As caractersticas desses sistemas so: Possui uma grande quantidade de funcionalidades, sendo necessria uma equipe de de1

Introduo senvolvedores para desenvolver e manter o funcionamento do sistema. Ser utilizado por muito tempo e sofrer alteraes com o tempo. Esse tipo de sistema justamente o que muitas empresas que desenvolvem software esto interessadas em desenvolver. Por isso, elas acabam adotando orientao a objetos e Java. Para que sistemas desse tipo sejam bem sucedidos algumas qualidades so necessrias. Durante o treinamento, discutiremos quais so essas qualidades e como consegui-las.

www.k19.com.br

Captulo 2 Lgica
2.1 O que um Programa?

Um dos maiores benefcios da utilizao de computadores a automatizao de processos que antes deveriam ser realizados por pessoas. Vejamos um exemplo prtico: Quando as apuraes dos votos das eleies eram realizadas manualmente, o tempo para obter os resultados era alto e havia grandes chances de ocorrer uma falha humana. Esse processo foi automatizado e hoje realizado por computadores. O tempo para obter os resultados e a chance de ocorrer uma falha humana diminuram bastante. Os computadores so capazes de executar instrues. Com essa capacidade eles podem resolver tarefas complexas. Porm, eles no so sucientemente inteligentes para denir quais instrues devem ser executadas para resolver uma determinada tarefa. Em outras palavras, um computador sabe executar comandos mas no sabe quais comandos devem ser executados para solucionar um problema. Ento, uma pessoa precisa criar um roteiro com as instrues que devem ser executadas pelo computador para que uma determinada tarefa seja realizada. Esses roteiros devem ser colocados em arquivos no disco rgido dos computadores. Assim, quando as tarefas precisam ser realizadas, os computadores podem ler esses arquivos para saber quais instrues devem ser executadas. Um arquivo contendo um roteiro de instrues que devem ser realizadas por um computador para resolver uma determinada tarefa chamado de programa ou executvel.

2.2

Linguagem de Programao VS Linguagem de Mquina

Os computadores s sabem ler programas escritos em Linguagem de Mquina. Um programa escrito em Linguagem de Mquina uma sequncia de nmeros que representam as instrues que um computador deve executar.

Teoricamente, os programadores poderiam escrever os programas j em linguagem de m3

Lgica quina. Na prtica, ningum faz isso pois uma tarefa muito complicada e demorada. muito complicado para uma pessoa ler ou escrever um programa escrito em linguagem de mquina. Ao invs disso, os programadores escrevem os programas utilizando alguma Linguagem de Programao. As linguagens de programao tentam ser mais prximas das linguagens humanas. Para uma pessoa, mais fcil ler um programa escrito em linguagem de programao. Os programas escritos pelos programadores em alguma linguagem de programao so traduzidos para programas escritos em linguagem de mquina para que os computadores possam execut-los. Quem faz essa traduo so os compiladores. Os programas escritos em linguagem de programao so chamados de Cdigo Fonte. Os programas escritos em linguagem de mquina so chamados de Cdigo Executvel ou simplesmente Executvel.

2.3

Exemplo de programa Java

Uma linguagem de programao muito utilizada no mercado de trabalho a linguagem Java. Os cdigos dos programas escritos em Java so colocados em arquivos com a extenso .java. Observe o cdigo do exemplo de programa escrito em Java que imprime uma mensagem na tela.

1 2 3 4 5 6

// arquivo: OlaMundo.java class OlaMundo { public static void main(String[] args) { System.out.println("Ol Mundo"); } }

Agora, no necessrio entender todo esse cdigo fonte. O importante saber que todo programa escrito em Java para executar precisa ter o mtodo especial main. Esse cdigo fonte precisa ser traduzido para um executvel para que um computador possa execut-lo. Essa traduo realizada por um compilador da linguagem Java. Suponha que o cdigo acima seja colocado no arquivo OlaMundo.java. O compilador padro do Java (javac) pode ser utilizado para compilar esse arquivo. O terminal permite que o compilador seja executado. www.k19.com.br 4

Lgica

O programa gerado pelo compilador colocado em um arquivo chamado OlaMundo.class que podemos executar pelo terminal.

2.4

Mtodo Main - Ponto de Entrada

Para um programa Java executar, necessrio denir um mtodo especial para ser o ponto de entrada do programa, ou seja, para ser o primeiro mtodo a ser chamado quando o programa for executado. O mtodo main precisa ser public, static, void e receber um array de strings como argumento. Algumas das possveis verses do mtodo main:
1 2 3 4 static public public public public static static static void void void void main(String[] args) main(String[] args) main(String args[]) main(String[] parametros)

Os parmetros do mtodo main so passados pela linha de comando e podem ser manipulados dentro do programa. O cdigo abaixo imprime cada parmetro recebido em uma linha diferente. A execuo do programa mostrada na gura abaixo. 5 K19 Treinamentos

Lgica
1 2 3 4 5 6 7 8 // arquivo: OlaMundo.java class OlaMundo { public static void main(String[] args) { for(int i = 0; i < args.length; i++) { System.out.println(args[i]); } } }

2.5

Mquinas Virtuais

Os compiladores geram executveis especcos para um determinado tipo de processador e um sistema operacional. Em outras palavras, esses executveis funcionam corretamente em computadores que possuem um determinado tipo de processador e um determinado sistema operacional.

Como os computadores possuem processadores de tipos diferentes e sistemas operacionais diferentes, necessrio ter diversos executveis do mesmo programa para poder execut-lo em computadores diferentes. www.k19.com.br 6

Lgica

Do ponto de vista das empresas, manter atualizados e distribuir corretamente os diversos executveis de um mesmo programa custoso.

Alm disso, ao escrever um programa, os programadores utilizam bibliotecas que j realizam parte do trabalho que deveria ser feito. Essas bibliotecas so chamadas diretamente do cdigo fonte e elas normalmente s funcionam em um determinado Sistema Operacional e em um tipo especco de processador. Dessa forma, o cdigo fonte de um programa ca acoplado a um determinado tipo de processador e um determinado sistema operacional.

No basta manter diversos executveis de um mesmo programa. necessrio ter diversos cdigos fonte de um mesmo programa, um para cada tipo de processador e sistema operacional que sero utilizados. O alto custo do desenvolvimento e manuteno desses cdigos fonte pode tornar invivel comercializao de um software. 7 K19 Treinamentos

Lgica

Para no ser necessrio manter diversos executveis e diversos cdigos fonte de um mesmo programa, surgiu o conceito de mquina virtual. Uma mquina virtual um programa que funciona como um computador, ela sabe ler e executar instrues de programas escritos na sua prpria linguagem de mquina. Alm disso, as mquinas virtuais oferecem bibliotecas para criao de programas. Para ser vantajoso, necessrio ter diversas implementaes da mesma mquina virtual. Cada implementao deve funcionar em um sistema operacional e em um tipo de processador. Dessa forma, um programador pode escrever o cdigo fonte de um programa chamando diretamente as bibliotecas da mquina virtual. Depois, compilar esse cdigo fonte para gerar um executvel escrito na linguagem de mquina da mquina virtual.

www.k19.com.br

Lgica Um benefcio da utilizao de mquinas virtuais o ganho de portabilidade. Em outras palavras, para executar um programa em computadores diferentes, necessrio apenas um cdigo fonte e um executvel. Uma desvantagem de utilizar uma mquina virtual para executar um programa e a diminuio de performance j que a prpria mquina virtual consome recursos do computador. Alm disso, as instrues do programa so processadas primeiro pela mquina virtual e depois pelo computador. Por outro lado, as mquinas virtuais podem aplicar otimizaes que aumentam a performance da execuo de um programa. Inclusive, essas otimizaes podem considerar informaes geradas durante a execuo. So exemplos de informaes geradas durante a execuo: a quantidade de uso da memria RAM e do processador do computador, a quantidade de acessos ao disco rgido, a quantidade de chamadas de rede e a frequncia de execuo de um determinado trecho do programa. Algumas mquinas virtuais identicam os trechos do programa que esto sendo mais chamados em um determinado momento da execuo para traduzi-los para a linguagem de mquina do computador. A partir da, esses trechos podem ser executados diretamente no computador sem passar pela mquina virtual. Essa anlise da mquina virtual realizada durante toda a execuo. Com essas otimizaes que consideram vrias informaes geradas durante a execuo, um programa executado com mquina virtual pode at ser mais eciente em alguns casos do que um programa executado diretamente no sistema operacional.

2.6

Exerccios

1. Abra um terminal e crie uma pasta com o seu nome. Voc deve salvar os exerccios nessa pasta.

2. Dentro da sua pasta de exerccios crie uma pasta para os arquivos desenvolvidos nesse captulo chamada logica. 9 K19 Treinamentos

Lgica

3. Crie um programa que imprima uma mensagem na tela.

1 2 3 4 5 6

// arquivo: OlaMundo.java class OlaMundo { public static void main(String[] args) { System.out.println("Ol Mundo"); } }

Compile e execute a classe O LA M UNDO.

2.7

Variveis

Um dos recursos fundamentais que as linguagens de programao oferecem so as variveis. A funo de uma varivel permitir que um programa armazene e manipule dados na memria RAM do computador.

Declarao
Na linguagem de programao Java, as variveis devem ser declaradas para que possam ser utilizadas. A declarao de uma varivel envolve denir um nome nico (identicador) e um tipo de valor. As variveis so acessadas pelos nomes e armazenam valores compatveis com o seu tipo.
1 2 3 4 5 // tipo: int, nome: numero int numero; // tipo: double, nome: preco double preco;

www.k19.com.br

10

Lgica

Declarao, Inicializao e Uso


Toda varivel deve ser inicializada antes de ser utilizada pela primeira vez. Se isso no for realizado ocorrer um erro de compilao. A inicializao realizada atravs do operador de atribuio =. Esse operador guarda um valor na varivel, ou melhor, no espao de memria reservado para a varivel.
1 2 3 4 5 6 7 8 9 10 11 12 // Declaracoes int numero; double preco; // Inicializacao numero = 10; // Uso System.out.println(numero); // Erro de compilacao System.out.println(preco);

Mais Declaraes
A declarao de uma varivel pode ser feita em qualquer linha de um bloco. No necessrio declarar todas as variveis no comeo do bloco.
1 2 3 4 5 6 7 8 9 10 11 // Declaracao com Inicializacao int numero = 10; // Uso System.out.println(numero); // Outra Declaracao com Inicializacao double preco = 137.6; // Uso System.out.println(preco);

Escopo
Toda varivel pode ser utilizada dentro do bloco no qual ela foi declarada aps a linha da sua inicializao.
1 2 3 4 5 // Aqui nao pode usar a variavel numero int numero = 10; // Aqui pode usar a variavel numero System.out.println(numero);

No permitido declarar duas variveis com o mesmo nome dentro de um mesmo bloco. Se isso ocorrer o compilador indicar um erro de compilao. 11 K19 Treinamentos

Lgica
1 2 3 4 int numero; // Erro de compilacao int numero;

Dentro de um bloco possvel abrir um sub-bloco. As variveis declaradas antes do subbloco podem ser acessadas tambm no sub-bloco. Assuma que o cdigo abaixo est dentro do bloco do mtodo main.
1 2 3 4 5 6 7 8 9 10

int numero = 10; // sub-bloco do bloco do metodo main { // Aqui pode usar a variavel numero System.out.println(numero); } // Aqui tambem pode usar o numero System.out.println(numero);

Porm, variveis declaradas em sub-blocos no podem ser acessadas do bloco pai nem de outro sub-bloco do bloco pai.

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

// sub-bloco do bloco do metodo main { int numero = 10; // Aqui pode usar a variavel numero System.out.println(numero); } // Erro de compilacao System.out.println(numero); // sub-bloco do bloco do metodo main { // Erro de compilacao System.out.println(numero); }

Dentro de sub-blocos diferentes de um mesmo bloco permitido declarar variveis com nomes iguais.

1 2 3 4 5 6 7 8 9

// sub-bloco do bloco do metodo main { int numero = 10; } // sub-bloco do bloco do metodo main { int numero = 10; }

www.k19.com.br

12

Lgica

2.8

Operadores

Para manipular os valores das variveis, podemos aplicar os operadores da linguagem Java. H diversos tipos de operadores.

Aritmticos
Para realizar as operaes matemticas podemos aplicar os operadores: +(soma), -(subtrao), *(multiplicao), /(diviso) e % (mdulo).
1 2 3 4 5 int int int int int dois = 1 + 1; tres = 4 - 1; quatro = 2 * 2; cinco = 10 / 2; um = 5 % 2;

Igualdade e Desigualdade
Para vericar se o valor armazenado em uma varivel igual ou diferente a um determinado valor ou ao valor de outra varivel, devem ser utilizados os operadores: ==(igual) e !=(diferente). Esses operadores devolvem valores do tipo boolean(true ou false).
1 2 3 4 5 6 7 8 9 10 int numero = 10; boolean teste1 = numero == 10; boolean teste2 = numero != 10; // imprime: true System.out.println(teste1); // imprime: false System.out.println(teste2);

Relacionais
As variveis numricas podem ser comparadas com o intuito de descobrir a ordem numrica dos seus valores. Os operadores relacionais so: >, <, > e <. Esses operadores devolvem valores do tipo BOOLEAN (true ou false). 13 K19 Treinamentos

Lgica
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int numero = 10; boolean boolean boolean boolean teste1 teste2 teste2 teste2 = = = = numero numero numero numero > 5; < 5; >= 10; <= 5;

// imprime: true System.out.println(teste1); // imprime: false System.out.println(teste2); // imprime: true System.out.println(teste3); // imprime: false System.out.println(teste4);

Lgicos
Para vericar diversas condies possvel aplicar os operadores lgicos: && e .
1 2 3 4 5 6 7 8 9 10 11 int numero1 = 10; int numero2 = 20; boolean teste1 = numero1 > 1 && numero2 < 10; boolean teste1 = numero1 > 1 || numero2 < 10; // imprime: False System.out.println(teste1); // imprime: True System.out.println(teste2);

2.9

IF-ELSE

Muitas vezes os programadores necessitam denir quais trechos de cdigo devem ser executados de acordo com uma ou mais condies. Por exemplo, quando o pagamento de um boleto feito em alguma agncia bancria, o sistema do banco deve vericar a data de vencimento do boleto para aplicar a multa por atraso ou no.
1 2 3 4 5 6 7 8 GregorianCalendar vencimento = new GregorianCalendar(2010, 10, 20); GregorianCalendar agora = new GregorianCalendar(); if (agora.after(vencimento)) { System.out.println("Calculando multa..."); } else { System.out.println("Sem multa"); }

O comando IF permite que valores booleanos sejam testados. Se o valor passado como parmetro para o comando IF for TRUE o bloco do IF executado caso contrrio o bloco do ELSE executado. www.k19.com.br 14

Lgica O parmetro passado para o comando IF deve ser um valor booleano, caso contrrio o cdigo fonte no compila. O comando ELSE e o seu bloco so opcionais.

2.10

WHILE

Em alguns casos, necessrio repetir um trecho de cdigo diversas vezes. Suponha que seja necessrio imprimir 10 vezes na tela a mensagem: Bom Dia. Isso poderia ser realizado colocando no cdigo fonte 10 linhas iguais. Porm, se ao invs de 10 vezes fosse necessrio imprimir 100 vezes j seriam 100 linhas iguais no cdigo fonte. Atravs do comando WHILE, possvel denir quantas vezes um determinado trecho de cdigo deve ser executado pelo computador.
1 2 3 4 5 6 int contador = 0; while(contador <= 100) { System.out.println("Bom Dia"); contador++; }

A varivel CONTADOR indica quantas vezes a mensagem Bom Dia foi impressa na tela. O operador ++ incrementa a varivel CONTADOR a cada rodada. O parmetro do comando WHILE tem que ser um valor booleano. Caso contrrio ocorrer um erro de compilao.

2.11

FOR

O comando FOR anlogo ao WHILE. A diferena entre esses dois comandos que o FOR recebe trs argumentos.
1 2 3 for(int contador = 0; contador <= 100; contador++) { System.out.println("Bom Dia"); }

2.12

Exerccios

4. Imprima na tela o seu nome 100 vezes.


1 2 3 4 5 6 7 8 // arquivo: ImprimeNome.java class ImprimeNome { public static void main(String[] args) { for(int contador = 0; contador < 100; contador++) { System.out.println("Rafael Cosentino"); } } }

15

K19 Treinamentos

Lgica Compile e execute a classe I MPRIME N OME 5. Imprima na tela os nmeros de 1 at 100.
1 2 3 4 5 6 7 8 // arquivo: ImprimeAte100.java class ImprimeAte100 { public static void main(String[] args) { for(int contador = 1; contador <= 100; contador++) { System.out.println(contador); } } }

Compile e execute a classe I MPRIME ATE 100 6. Faa um programa que percorra todos os nmero de 1 at 100. Para os nmeros mpares deve ser impresso um * e para os nmeros pares deve ser impresso dois **. * ** * ** * **

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

// arquivo: ImprimePadrao1.java class ImprimePadrao1 { public static void main(String[] args) { for(int contador = 1; contador <= 100; contador++) { int resto = contador % 2; if(resto == 1) { System.out.println("*"); } else { System.out.println("**"); } } } }

Compile e execute a classe I MPRIME PADRAO 1 7. Faa um programa que percorra todos os nmero de 1 at 100. Para os nmeros mltiplos de 4 imprima a palavra PI e para os outros imprima o prprio nmero. 1 2 3 PI 5 6 7 PI www.k19.com.br 16

Lgica
1 2 3 4 5 6 7 8 9 10 11 12 13 // arquivo: ImprimePadrao2.java class ImprimePadrao2 { public static void main(String[] args) { for(int contador = 1; contador <= 100; contador++) { int resto = contador % 4; if(resto == 0) { System.out.println("PI"); } else { System.out.println(contador); } } } }

Compile e execute a classe I MPRIME PADRAO 2 8. Crie um programa que imprima na tela um tringulo de *. Observe o padro abaixo. * ** *** **** *****

1 2 3 4 5 6 7 8 9 10

// arquivo: ImprimePadrao3.java class ImprimePadrao3 { public static void main(String[] args) { String linha = "*"; for(int contador = 1; contador <= 10; contador++) { System.out.println(linha); linha += "*"; } } }

Compile e execute a classe I MPRIME PADRAO 3 9. (Opcional) Crie um programa que imprima na tela vrios tringulos de *. Observe o padro abaixo. * ** *** **** * ** *** **** 17 K19 Treinamentos

Lgica
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // arquivo: ImprimePadrao4.java class ImprimePadrao4 { public static void main(String[] args) { String linha = "*"; for(int contador = 1; contador <= 10; contador++) { System.out.println(linha); int resto = contador % 4; if(resto == 0) { linha = "*"; } else { linha += "*"; } } } }

Compile e execute a classe I MPRIME PADRAO 4 10. (Opcional) A srie bonacci uma sequncia de nmeros. O primeiro elemento da srie 0 e o segundo 1. Os outros elementos so calculados somando os dois antecessores. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233... Crie um programa para imprimir os 30 primeiros nmeros da srie de bonacci.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // arquivo: ImprimePadrao5.java class ImprimePadrao5 { public static void main(String[] args) { int penultimo = 0; int ultimo = 1; System.out.println(penultimo); System.out.println(ultimo); for(int contador = 0; contador < 28; contador++) { int proximo = anterior + ultimo; System.out.println(proximo); penultimo = ultimo; ultimo = proximo; } } }

Compile e execute a classe I MPRIME PADRAO 5

www.k19.com.br

18

Captulo 3 Orientao a Objetos


Para apresentar os conceitos desse e dos prximos captulos, simularemos a criao de um sistema bancrio. No desenvolvimento de um sistema, um dos primeiros passos identicar os elementos que devem existir no mesmo. O que deve existir num sistema bancrio? Contas Funcionrios Clientes Agncias O exerccio de identicar os elementos que devem existir em um sistema uma tarefa complicada e depende muito da experincia dos desenvolvedores e do conhecimento que eles tem sobre o domnio (o contexto do banco).

3.1

Objetos

Depois de identicar os elementos que devem existir num sistema bancrio, devemos decidir como eles devem ser representados dentro do computador. Como o nosso objetivo criar um sistema orientado a objetos, devemos utilizar objetos para representar os elementos do sistema bancrio. Para exemplicar, suponha que o banco tenha um cliente chamado Joo. Dentro do sistema, deve existir um objeto para representar o Joo. Conceitualmente, um objeto deve ser modelado am de car o mais parecido possvel com aquilo que ele est representando. A funo de um objeto representar um elemento do domnio. Algumas informaes do Joo como nome, idade e sexo so importantes para o banco. O objeto que representa o Joo deve possuir os dados que so relevantes para o banco. Esses dados so armazenados nos atributos do objeto que representa o Joo. Quando alteraes nos valores dos atributos de um objeto devem ser realizadas, o prprio objeto deve realiz-las. As lgicas para essas alteraes so denidas nos mtodos do objeto. Os mtodos tambm so utilizados para possibilitar a interao entre os objetos que formam um determinado sistema. Por exemplo, quando um cliente requisita um saque atravs de um 19

Orientao a Objetos caixa eletrnico do banco, o objeto que representa o caixa eletrnico deve interagir com o objeto que representa a conta do cliente para tentar realizar a operao. Um objeto composto por atributos e mtodos. No adequado usar o objeto que representa o Joo para representar outro cliente do banco, pois cada cliente possui os seus prprios dados. Dessa forma, para cada cliente do banco, deve existir um objeto dentro do sistema para represent-lo. Os objetos no representam apenas coisas concretas como os clientes do banco. Eles tambm devem ser utilizados para representar coisas abstratas como uma conta de um cliente ou um servio que o banco oferea.

3.2

Classes

Em algum momento, os objetos devem ser criados. Por exemplo, quando algum se torna cliente do banco, um novo objeto deve ser construdo para representar esse cliente. A criao de um objeto novo envolve alocar um espao na memria do computador para colocar os atributos e mtodos do mesmo. Um objeto como se fosse uma casa ou um prdio, para ser construdo precisa de um espao fsico, no caso dos objetos o espao algum trecho vago da memria RAM de algum computador, no caso das casas e dos prdios o espao algum terreno vazio em alguma cidade. Um prdio construdo a partir de uma planta criada por um engenheiro. Para criar um objeto, necessrio algo semelhante a uma planta para que sejam denidos os atributos e mtodos que objeto deve ter. Em orientao a objetos, a "planta"de um objeto chamada de classe.

Uma classe funciona como uma forma para criar objetos. Inclusive, vrios objetos podem ser criados a partir de uma nica classe. Assim como vrios prdios poderiam ser construdos a partir de uma nica planta. Os objetos criados a partir da classe C ONTA tero todos os atributos e mtodos mostrados no diagrama UML. As diferenas entre esses objetos so os valores dos atributos.

Classes Java
O conceito de classe apresentado anteriormente genrico e pode ser aplicado em diversas linguagens de programao. Mostraremos como a classe C ONTA poderia ser escrita utilizando a linguagem Java. Inicialmente, discutiremos apenas sobre os atributos. Os mtodos sero abordados posteriormente. www.k19.com.br 20

Orientao a Objetos
1 2 3 4 5 class Conta { double saldo; double limite; int numero; }

A classe Java C ONTA declarada utilizando a palavra reservada class. No corpo dessa classe, so declaradas trs variveis que so os atributos que os objetos possuiro. Como a linguagem Java estaticamente tipada os tipos dos atributos so denidos no cdigo. O atributo saldo e limite so do tipo double que permite armazenar nmeros com casas decimais e o atributo numero do tipo int que permite armazenar nmeros inteiros.

Criando objetos em Java


Aps denir a classe C ONTA, podemos criar objetos a partir dela. Esses objetos devem ser alocados na memria RAM do computador. Felizmente, todo o processo de alocao do objeto na memria gerenciado pela mquina virtual. O gerenciamento da memria um dos recursos mais importantes oferecidos pela mquina virtual. Do ponto de vista da aplicao, basta utilizar um comando especial para criar objetos que a mquina virtual se encarrega do resto. O comando para criar objetos o new.
1 2 3 4 5 class TestaConta { public static void main(String[] args) { new Conta(); } }

A linha com o comando NEW poderia ser repetida cada vez que desejssemos criar (instanciar) um objeto da classe C ONTA. A classe Java T ESTAC ONTA serve apenas para colocarmos o mtodo MAIN que o ponto de partida da aplicao. Chamar o comando NEW passando uma classe Java como se estivssemos contratando uma construtora e passando a planta da casa que queremos construir. A construtora se encarrega de construir a casa para ns de acordo com a planta.

3.3

Referncias

Aps criar um objeto, provavelmente, desejaremos utiliz-lo. Para isso precisamos acesslo de alguma maneira. Os objetos so acessados atravs de referncias. Uma referncia link que aponta para um objeto.

Referncias em Java
Ao utilizar o comando NEW, um objeto alocado em algum lugar da memria RAM. Para que possamos acessar esse objeto, precisamos da referncia dele. O comando NEW devolve a referncia do objeto que foi criado. Para guardar as referncias devolvidas pelo comando NEW, podemos declarar variveis cujo o propsito justamente armazenar referncias. 21 K19 Treinamentos

Orientao a Objetos
1 Conta ref = new Conta();

No cdigo Java acima, a varivel ref receber a referncia do objeto criado pelo comando NEW . Essa varivel do tipo Conta. Isso signica que ela s pode armazenar referncia para objeto do tipo Conta.

3.4

Manipulando Atributos

Podemos alterar os valores dos atributos de um objeto se tivermos a referncia dele. Os atributos so acessados pelo nome. No caso especco da linguagem Java, a sintaxe para acessar um atributo utiliza o operador ".".
1 2 3 4 5 6 7 8 9 Conta ref = new Conta(); ref.saldo = 1000.0; ref.limite = 500.0; ref.numero = 1; System.out.println(ref.saldo); System.out.println(ref.limite); System.out.println(ref.numero);

No cdigo acima, o atributo NOME recebe o valor 1000.0. O atributo LIMITE recebe o valor 500 e o NUMERO recebe o valor 1. Depois, os valores so impressos na tela atravs do comando S YSTEM . OUT. PRINTLN.

Valores Default
Poderamos instanciar um objeto e utilizar o seus atributos sem inicializ-los explicitamente, pois os atributos so inicializados com valores default. Os atributos de tipos numricos so inicializados com 0, os atributos do tipo BOOLEAN(true ou false) so inicializados com FALSE e os demais atributos com NULL (referncia vazia). A inicializao dos atributos com os valores default ocorre na instanciao, ou seja, quando o comando NEW utilizado. Dessa forma, todo objeto "nasce"com os valores default. Em alguns casos, necessrio trocar esses valores. Para trocar o valor default de um atributo, devemos inicializ-lo na declarao.
1 2 3 4 5 class Conta { double saldo; double limite = 500; int numero; }

3.5

Agregao

Todo cliente do banco pode adquirir um carto de crdito. Suponha que um cliente adquira um carto de crdito. Dentro do sistema do banco, deve existir um objeto que represente o www.k19.com.br 22

Orientao a Objetos cliente e outro que represente o carto de crdito. Para expressar a relao entre o cliente e o carto de crdito, algum vnculo entre esses dois objetos deve ser estabelecido. Duas classes deveriam ser criadas, uma para denir os atributos e mtodos dos clientes e outra para os cartes de crdito. Para expressar o relacionamento entre cliente e carto de crdito, podemos colocar um atributo do tipo C LIENTE na classe C ARTAO D E C REDITO.
1 2 3 class Cliente { String nome; }

1 2 3

class CartaoDeCredito { Cliente cliente; }

Esse tipo de relacionamento chamado de Agregao. H uma notao grca na linguagem UML para representar uma agregao. Veja o diagrama abaixo.

No relacionamento entre carto de crdito e cliente, um carto de crdito s pode se relacionar com um nico cliente. Por isso, no diagrama acima, o 1 colocado ao lado da classe C LIENTE. Por outro lado, um cliente pode se relacionar com muitos cartes de crdito. Por isso, no diagrama acima, o "*" colocado ao lado da classe C ARTAO D E C REDITO. O relacionamento entre um objeto da classe C LIENTE e um objeto da classe C ARTAO D E C REDITO s concretizado quando a referncia do objeto da classe C LIENTE armazenada no atributo cliente do objeto da classe C ARTAO D E C REDITO. Depois de relacionados, podemos acessar os atributos do cliente atravs da referncia do objeto da classe C ARTAO D E C REDITO.
1 2 3 4 5 6 7 8 9 // Criando um objeto de cada classe CartaoDeCredito cdc = new CartaoDeCredito(); Cliente c = new Cliente(); // Ligando os objetos cdc.cliente = c; // Acessando o nome do cliente cdc.cliente.nome = "Rafael Cosentino";

3.6

Exerccios

1. Dentro da sua pasta de exerccios crie uma pasta para os arquivos desenvolvidos nesse captulo chamada oo. 23 K19 Treinamentos

Orientao a Objetos

2. No sistema de um banco algumas informaes dos clientes como nome e cdigo precisam ser armazenadas. Crie uma classe para modelar os objetos que representaro os clientes.
1 2 3 4 5 // arquivo: Cliente.java class Cliente { String nome; int codigo; }

3. Faa um teste criando dois objetos da classe C LIENTE.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // arquivo: TestaCliente.java class TestaCliente { public static void main(String[] args) { Cliente c1 = new Cliente(); c1.nome = "Rafael Cosentino"; c1.codigo = 1; Cliente c2 = new Cliente(); c2.nome = "Jonas Hirata"; c2.codigo = 2; System.out.println(c1.nome); System.out.println(c1.codigo); System.out.println(c2.nome); System.out.println(c2.codigo); } }

Compile e execute a classe T ESTAC LIENTE. 4. Os bancos oferecem aos clientes a possibilidade de obter um carto de crdito que pode ser utilizados para fazer compras. Um carto de crdito possui um nmero e uma data de validade. Crie uma classe para modelar os objetos que representaro os cartes de crdito. www.k19.com.br 24

Orientao a Objetos
1 2 3 4 5 // arquivo: CartaoDeCredito.java class CartaoDeCredito { int numero; String dataDeValidade; }

5. Faa um teste criando dois objetos da classe C ARTAO D E C REDITO. Altere e imprima os atributos desses objetos.

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

// arquivo: TestaCartaoDeCredito.java class TestaCartaoDeCredito { public static void main(String[] args) { CartaoDeCredito cdc1 = new CartaoDeCredito(); cdc1.numero = 111111; cdc1.dataDeValidade = "01/01/2012"; CartaoDeCredito cdc2 = new CartaoDeCredito(); cdc2.numero = 222222; cdc2.dataDeValidade = "01/01/2014"; System.out.println(cdc1.numero); System.out.println(cdc1.dataDeValidade); System.out.println(cdc2.numero); System.out.println(cdc2.dataDeValidade); } }

Compile e execute a classe T ESTAC ARTAO D E C REDITO.

6. Dena um vnculo entre a classe C LIENTE e a classe C ARTAO D E C REDITO. Para isso voc deve alterar a classe C ARTAO D E C REDITO.

1 2 3 4 5 6 7 8

// arquivo: CartaoDeCredito.java class CartaoDeCredito { int numero; String dataDeValidade; // ADICIONE A LINHA ABAIXO Cliente cliente; }

7. Teste o relacionamento entre clientes e cartes de crdito. 25 K19 Treinamentos

Orientao a Objetos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // arquivo: TestaClienteECartao.java class TestaClienteECartao { public static void main(String[] args) { // Criando alguns objetos Cliente c = new Cliente(); CartaoDeCredito cdc = new CartaoDeCredito(); // Carregando alguns dados c.nome = "Rafael Cosentino"; cdc.numero = 111111; // Ligando os objetos cdc.cliente = c; System.out.println(cdc.numero); System.out.println(cdc.cliente.nome); } }

Compile e execute a classe T ESTAC LIENTE EC ARTAO. 8. As agncias bancrias possuem um nmero. Crie uma classe para modelar as agncias.
1 2 3 4 // arquivo: Agencia.java class Agencia { int numero; }

9. As contas do banco possuem saldo e esto vinculadas a uma agncia. Crie uma classe para modelar as contas e estabelea um vnculo com a classe AGENCIA.
1 2 3 4 5 // arquivo: Conta.java class Conta { double saldo; Agencia agencia; }

10. Teste o relacionamento entre contas e agncias.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // arquivo: TestaContaEAgencia.java class TestaContaEAgencia { public static void main(String[] args) { // Criando alguns objetos Agencia a = new Agencia(); Conta c = new Conta(); // Carregando alguns dados a.numero = 178; c.saldo = 1000.0; // Ligando os objetos c.agencia = a; System.out.println(c.agencia.numero); System.out.println(c.saldo); } }

www.k19.com.br

26

Orientao a Objetos Compile e execute a classe T ESTAC LIENTE EC ARTAO. 11. Faa um teste que imprima os atributos de um objeto da classe C ONTA logo aps a instanciao.

1 2 3 4 5 6 7 8 9

// arquivo: TestaValoresDefault.java class TestaValoresDefault { public static void main(String[] args) { Conta c = new Conta(); System.out.println(c.saldo); System.out.println(c.agencia); } }

Compile e execute a classe T ESTAVALORES D EFAULT. 12. Altere a classe C ONTA para que todos os objetos criados a partir dessa classe possuam 100 de saldo inicial.
1 2 3 4 5 // arquivo: Conta.java class Conta { double saldo = 100.0; Agencia agencia; }

Compile e execute a classe T ESTAVALORES D EFAULT.

3.7

Mtodos

Quando um depsito realizado, o valor depositado deve ser acrescentado ao saldo da conta correspondente. No sistema do banco, as contas so representadas por objetos e os saldos so atributos desses objetos. Alteraes nos valores dos atributos de um objeto devem ser realizadas pelo prprio objeto atravs dos seus mtodos. Supondo que tivssemos um objeto da classe C ONTA, a sintaxe para chamar um mtodo seria relativamente parecida sintaxe de acessar atributos. A diferena que devemos passar uma lista de parmetros na chamada de um mtodo. No caso do mtodo que implementa a operao de depositar interessante passar o valor que est sendo depositado como parmetro.
1 2 3 4 Conta c = new Conta(); // Chamando um metodo c.deposita(1000);

Contudo, os objetos da classe C ONTA no possuem o mtodo DEPOSITA () at que este seja denido na classe C ONTA. 27 K19 Treinamentos

Orientao a Objetos
1 2 3 4 5 6 7 8 class Conta { double saldo; double limite; void deposita(double valor) { this.saldo += valor; } }

Com o DEPOSITA () denido na classe C ONTA todo objeto criado a partir dessa classe possuir esse mtodo. Na declarao de um mtodo, a lista de parmetros deve ser denida, ou seja, os tipos e a ordem dos valores que o mtodo deve receber precisa ser especicada. Os atributos do objeto que receber uma chamada ao mtodo DEPOSITA () so acessados de dentro do corpo do mtodo atravs da palavra reserva this. Como o mtodo DEPOSITA () no deve devolver nenhuma resposta ele marcado com void. Da maneira que o mtodo DEPOSITA () foi implementado, os saldos das contas podem assumir valores incorretos. Isso ocorreria se um valor negativo fosse depositado.

c.deposita(-1000);

Para evitar essa situao, algum tipo de validao pode ser implementada no mtodo
POSITA ().

DE -

1 2 3 4 5

void deposita(double valor) { if(valor > 0) { this.saldo += valor; } }

De acordo com essa implementao o mtodo DEPOSITA () simplesmente no faz nada se o valor passado como parmetro negativo. Uma desvantagem dessa abordagem que o chamador do mtodo no saber se houve algo de errado no processamento do DEPOSITA (). Para resolver esse problema, o mtodo DEPOSITA () pode devolver uma resposta.

1 2 3 4 5 6 7 8

boolean deposita(double valor) { if(valor > 0) { this.saldo += valor; return true; } else { return false; } }

Ao chamar o mtodo DEPOSITA () a resposta pode ser armazenada em uma varivel. www.k19.com.br 28

Orientao a Objetos
1 2 3 4 5 6 7 8 Conta c = new Conta(); boolean reposta = c.deposita(1000); if(resposta){ System.out.println("O depsito foi efetuado"); } else { System.out.println("O depsito no foi efetuado"); }

3.8

Sobrecarga(Overloading)

natural que um cliente do banco queira consultar periodicamente algumas informaes das suas contas. Para obter essas informaes o cliente pode pedir um extrato. Como dados das contas devem ser utilizados para gerar os extratos, interessante denir um mtodo na classe C ONTA para implementar a lgica para imprimir extratos.
1 2 3 4 5 6 7 8 9 class Conta { double saldo; double limite; void imprimeExtrato(){ System.out.println("Saldo: " + this.saldo); System.out.println("Limite: " + this.limite); } }

Normalmente, quando requisitamos extratos para os bancos, temos a possibilidade de passar uma quantidade de dias que devem ser considerados ou utilizar a quantidade padro denida pelo banco (ex: 15 dias). Para implementar essas possibilidades, podemos denir dois mtodos na classe C ONTA.
1 2 3 4 5 6 7 8 9 10 11 class Conta { void imprimeExtrato(){ // Logica para gerar um extrato dos ultimos 15 dias } void imprimeExtrato(int dias){ // Logica para gerar um extrato com // uma quantidade variavel de dias } }

O primeiro mtodo no recebe parmetros pois ele utilizar uma quantidade de dias padro pelo banco para gerar os extratos. O segundo recebe um valor inteiro como parmetro e deve considerar essa quantidade de dias para gerar os extratos. Os dois mtodos possuem o mesmo nome e lista de parmetros diferentes. Quando dois ou mais mtodos so denidos na mesma classe com o mesmo nome, dizemos que houve uma sobrecarga de mtodos. Uma sobrecarga de mtodos s vlida se as listas de parmetros dos mtodos so diferentes entre si. No caso dos dois mtodos que geram extratos, poderamos evitar repetio de cdigo fazendo um mtodo chamar o outro. Normalmente, o mtodo mais especco chama o mtodo mais genrico. 29 K19 Treinamentos

Orientao a Objetos
1 2 3 4 5 6 7 8 9 10 11 class Conta { void imprimeExtrato(){ this.imprimeExtrato(15); } void imprimeExtrato(int dias){ // Logica para gerar um extrato com // uma quantidade variavel de dias } }

3.9

Exerccios

13. Acrescente alguns mtodos na classe C ONTA para denir as lgicas de depositar, sacar e imprimir extrato.

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

// arquivo: Conta.java class Conta { double saldo; Agencia agencia; void deposita(double valor) { this.saldo += valor; } void saca(double valor) { this.saldo -= valor; } void imprimeExtrato() { System.out.println("SALDO: " + this.saldo); } }

14. Teste os mtodos da classe C ONTA.


1 2 3 4 5 6 7 8 9 10 11 12 // arquivo: TestaMetodosConta.java class TestaMetodosConta { public static void main(String[] args) { Conta c = new Conta(); c.deposita(1000); c.imprimeExtrato(); c.saca(100); c.imprimeExtrato(); } }

Compile e execute a classe T ESTA M ETODOS C ONTA. 15. Crie uma classe para modelar as faturas dos cartes de crdito. www.k19.com.br 30

Orientao a Objetos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // arquivo: Fatura.java class Fatura { double total; void adiciona(double valor) { this.total += valor; } double calculaMulta() { return this.total * 0.2; } void imprimeDados() { System.out.println("Total: " + this.total); } }

16. Teste a classe FATURA.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // arquivo: TestaMetodosFatura.java class TestaMetodosFatura { public static void main(String[] args) { Fatura f = new Fatura(); f.adiciona(100); f.adiciona(200); f.imprimeDados(); double multa = f.calculaMulta(); System.out.println(multa); } }

Compile e execute a classe T ESTA M ETODOS FATURA.

3.10

Construtores

Na criao de um carto de crdito fundamental que o nmero dele seja denido. Na criao de uma agncia necessrio que o nmero dela seja escolhido. Uma conta quando criada deve ser associada a uma agncia. Aps criar um objeto para representar um carto de crdito, poderamos denir um valor para o atributo NUMERO. De maneira semelhante, podemos denir um nmero para um objeto da classe AGENCIA e uma agncia para um objeto da classe C ONTA.
1 2 CartaoDeCredito cdc = new CartaoDeCredito(); cdc.numero = 12345;

1 2

Agencia a = new Agencia(); a.numero = 11111;

31

K19 Treinamentos

Orientao a Objetos
1 2 Conta c = new Conta(); c.agencia = a;

Denir os valores dos atributos obrigatrios de um objeto logo aps a criao dele resolveria as restries do sistema do banco. Porm, nada garante que todos os desenvolvedores sempre lembrem de inicializar esses valores. Para resolver esse problema, podemos utilizar o conceito de CONSTRUTOR que permite que um determinado trecho de cdigo seja executado toda vez que um objeto criado. Um construtor pode receber parmetros como os mtodos mas no pode devolver uma resposta. Alm disso, em Java, para denir um construtor devemos utilizar o mesmo nome da classe na qual o construtor foi colocado.
1 2 3 4 5 6 7 8 // arquivo: CartaoDeCredito.java class CartaoDeCredito { int numero; CartaoDeCredito(int numero) { this.numero = numero; } }

1 2 3 4 5 6 7 8

// arquivo: Agencia.java class Agencia { int numero; Agencia(int numero) { this.numero = numero; } }

1 2 3 4 5 6 7 8

// arquivo: Conta.java class Conta { Agencia agencia; Conta(Agencia agencia) { this.agencia = agencia; } }

Na criao de um objeto com o comando NEW, os argumentos passados devem ser compatveis com a lista de parmetro de algum construtor denido na classe que est sendo instanciada. Caso contrrio, um erro de compilao ocorrer para avisar o desenvolvedor dos valores obrigatrios que devem ser passados para criar um objeto.
1 2 3 4 5 6 // Passando corretamente os parmetros para os construtores CartaoDeCredito cdc = new CartaoDeCredito(1111); Agencia a = new Agencia(1234); Conta c = new Conta(a1);

www.k19.com.br

32

Orientao a Objetos
1 2 3 4 5 6 7 8 // ERRO DE COMPILACAO CartaoDeCredito cdc = new CartaoDeCredito(); // ERRO DE COMPILACAO Agencia a = new Agencia(); // ERRO DE COMPILACAO Conta c = new Conta(a1);

3.10.1

Construtor Default

Toda vez que um objeto criado, um construtor da classe correspondente deve ser chamado. Mesmo quando nenhum construtor foi denido explicitamente, h um construtor padro que inserido pelo prprio compilador. O construtor padro s inserido se nenhum construtor foi explicitamente denido e ele no possui parmetros. Portanto, para instanciar uma classe que no possui construtores denidos no cdigo fonte, devemos utilizar o construtor padro j que este inserido automaticamente pelo compilador.
1 2 3 4 // arquivo: Conta.java class Conta { }

1 2

// Chamando o construtor padro Conta c = new Conta();

Lembrando que o construtor padro s inserido pelo compilador se nenhum construtor foi denido no cdigo fonte. Dessa forma, se voc zer um construtor com parmetros ento no poder utilizar o comando NEW sem passar argumentos pois um erro de compilao ocorrer.
1 2 3 4 5 6 7 8 // arquivo: Agencia.java class Agencia { int numero; Agencia(int numero) { this.numero = numero; } }

1 2

// ERRO DE COMPILACAO Agencia a = new Agencia();

3.10.2

Sobrecarga de Construtores

O conceito de sobrecarga de mtodos pode ser aplicado para construtores. Dessa forma, podemos denir diversos construtores na mesma classe. 33 K19 Treinamentos

Orientao a Objetos
1 2 3 4 5 6 7 8 9 10 11 12 13 // arquivo: Pessoa.java class Pessoa { String rg; int cpf; Pessoa(String rg){ this.rg = rg; } Pessoa(int cpf){ this.cpf = cpf; } }

Quando dois ou mais construtores so denidos, h duas ou mais opes no momento de utilizar o comando NEW.
1 2 3 4 // Chamando Pessoa p1 = // Chamando Pessoa p2 = o primeiro construtor new Pessoa("123456X"); o segundo construtor new Pessoa(123456789);

3.10.3

Construtores chamando Construtores

Assim como podemos encadear mtodos tambm podemos encadear construtores.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 // arquivo: Conta.java class Conta { int numero; double limite; Conta(int numero) { this.numero = numero; } Conta(int numero, double limite) { this(numero); this.limite = limite; } }

3.11

Exerccios

17. Acrescente um construtor na classe AGENCIA para receber um nmero como parmetro.
1 2 3 4 5 6 7 8 9 // arquivo: Agencia.java class Agencia { int numero; // ADICIONE O CONSTRUTOR ABAIXO Agencia(int numero) { this.numero = numero; } }

www.k19.com.br

34

Orientao a Objetos 18. Tente compilar novamente o arquivo T ESTAC ONTA EAGENCIA. Observe o erro de compilao. 19. Altere o cdigo da classe T ESTAC ONTA EAGENCIA para que o erro de compilao seja resolvido. Substitua a linha abaixo:
1 Agencia a = new Agencia();

Por:
1 Agencia a = new Agencia(1234);

Compile novamente o arquivo T ESTAC ONTA EAGENCIA. 20. Acrescente um construtor na classe C ARTAO D E C REDITO para receber um nmero como parmetro.
1 2 3 4 5 6 7 8 9 10 11 12 // arquivo: CartaoDeCredito.java class CartaoDeCredito { int numero; String dataDeValidade; Cliente cliente; // ADICIONE O CONSTRUTOR ABAIXO CartaoDeCredito(int numero) { this.numero = numero; } }

21. Tente compilar novamente os arquivos T ESTAC ARTAO D E C REDITO e T ESTAC LIENTE EC ARTAO. Observe os erros de compilao. 22. Altere o cdigo da classe T ESTAC ARTAO D E C REDITO e T ESTAC LIENTE EC ARTAO para que os erros de compilao sejam resolvidos. Substitua trechos de cdigo semelhantes ao trecho abaixo:
1 2 CartaoDeCredito cdc1 = new CartaoDeCredito(); cdc1.numero = 111111;

Por trechos de cdigo semelhantes ao trecho abaixo:


1 CartaoDeCredito cdc = new CartaoDeCredito(111111);

35

K19 Treinamentos

Orientao a Objetos Compile novamente os arquivos T ESTAC ARTAO D E C REDITO e T ESTAC LIENTE EC AR TAO . 23. Acrescente um construtor na classe C ONTA para receber uma referncia como parmetro.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // arquivo: Conta.java class Conta { double saldo = 100.0; Agencia agencia; // ADICIONE O CONSTRUTOR ABAIXO Conta(Agencia agencia) { this.agencia = agencia; } void deposita(double valor) { this.saldo += valor; } void saca(double valor) { this.saldo -= valor; } void imprimeExtrato() { System.out.println("SALDO: " + this.saldo); } }

24. Tente compilar novamente os arquivos T ESTAC ONTA EAGENCIA, T ESTA M ETODOS C ONTA e T ESTAVALORES D EFAULT. Observe os erros de compilao. 25. Altere o cdigo da classe T ESTAC ONTA EAGENCIA, T ESTA M ETODOS C ONTA e T ES TAVALORES D EFAULT para que o erros de compilao sejam resolvidos. Substitua trechos de cdigo semelhantes ao trecho abaixo:
1 2 Agencia a = new Agencia(1234); Conta c = new Conta();

Por trechos de cdigo semelhantes ao trecho abaixo:


1 2 Agencia a = new Agencia(1234); Conta c = new Conta(a);

Tambm substitua trechos de cdigo semelhantes ao trecho abaixo:


1 Conta c = new Conta();

Por trechos de cdigo semelhantes ao trecho abaixo:


1 2 Agencia a = new Agencia(1234); Conta c = new Conta(a);

www.k19.com.br

36

Orientao a Objetos Compile novamente os arquivos T ESTAC ONTA EAGENCIA, T ESTA M ETODOS C ONTA e T ESTAVALORES D EFAULT.

3.12

Referncias como parmetro

Assim como podemos passar valores primitivos como argumentos para um mtodo ou construtor tambm podemos passar valores no primitivos (referncias). Suponha um mtodo na classe C ONTA que implemente a lgica de transferncia de valores entre contas. Esse mtodo deve receber como argumento alm do valor a ser transferido a conta que receber o dinheiro.
1 2 3 4 void transfere(Conta destino, double valor) { this.saldo -= valor; destino.saldo += valor; }

Na chamada do mtodo TRANSFERE, devemos ter duas referncias de contas: uma para chamar o mtodo e outra para passar como parmetro.
1 2 3 4 5 6 Conta origem = new Conta(); origem.saldo = 1000; Conta destino = new Conta(); origem.transfere(destino, 500);

Quando a varivel DESTINO passada como parmetro, somente a referncia armazenada nessa varivel enviada para o mtodo TRANSFERE e no o objeto correspondente a referncia. Em outras palavras, somente o link para a conta que receber o valor da transferncia enviado para o mtodo TRANSFERE.

3.13

Exerccios

26. Acrescente um mtodo na classe C ONTA para implementar a lgica de transferncia de valores entre contas.

1 2 3 4

void transfere(Conta destino, double valor) { this.saldo -= valor; destino.saldo += valor; }

27. Faa um teste para vericar o funcionamento do mtodo transfere. 37 K19 Treinamentos

Orientao a Objetos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // arquivo: TestaMetodoTransfere.java class TestaMetodoTransfere { public static void main(String[] args) { Agencia a = new Agencia(1234); Conta origem = new Conta(a); origem.saldo = 1000; Conta destino = new Conta(a); destino.saldo = 1000; origem.transfere(destino, 500); System.out.println(origem.saldo); System.out.println(destino.saldo); } }

Compile e execute a classe T ESTA M ETODOT RANSFERE.

www.k19.com.br

38

Captulo 4 Arrays
Suponha que o sistema de uma loja virtual precisa armazenar os preos dos produtos que ela comercializa. No seria nada prtico declarar para cada produto uma varivel que armazena o preo do mesmo. Para isso, possvel utilizar as estruturas chamadas arrays. Um array uma estrutura que armazena um ou mais valores de um determinado tipo. Um array pode ser criado com o comando NEW.
1 double[] precos = new double[100];

A varivel PRECOS armazena a referncia de um array criado na memria RAM do computador. Na memria, o espao ocupado por esse array est dividido em 100 pedaos iguais numerados de 0 at 99. Cada pedao pode armazenar um valor do tipo DOUBLE. Quando um array criado, as posies dele so inicializadas com os valores default.
1 2 3 double[] precos = new double[100]; precos[0] = 130.5; precos[99] = 17.9;

Acessar posies fora do intervalo de ndices de um array gera um erro de execuo. No momento da criao de um array, os seus valores podem ser denidos.
1 double[] precos = new double[2]{100.4,87.5};

double[] precos = new double[]{100.4,87.5};

double[] precos = {100.4,87.5};

39

Arrays

4.1

Arrays de Arrays

Podemos criar arrays de arrays.


1 2 3 4 5 6 7 double[][] arrays = new double[3][]; arrays[0] = new double[2]; arrays[1] = new double[3]; arrays[2] = new double[4]; arrays[0][0] = 10.5;

1 2 3 4 5 6

double[][] arrays = { new double[]{1.5, 3.7}, new double[]{6.6, 9.7, 6.7}, new double[]{8.5, 2.8, 7.5, 8.6} }; System.out.println(arrays[0][0]);

4.2

Percorrendo Arrays

Os arrays podem ser facilmente preenchidos utilizando o comando WHILE ou o FOR.


1 2 3 4 double[] precos = new double[100]; for(int i = 0; i < 100; i++) { precos[i] = i; }

1 2 3 4 5 6

double[][] tabela = new double[100][50]; for(int i = 0; i < 100; i++) { for(int j = 0; j < 50; j++) { tabela[i][j] = i * j; } }

A quantidade de elementos em cada dimenso dos arrays pode ser obtida atravs do atributo LENGTH .
1 2 3 4 5 6 double[][] tabela = new double[100][50]; for(int i = 0; i < tabela.length; i++) { for(int j = 0; j < tabela[i].length; j++) { tabela[i][j] = i * j; } }

Para acessar todos os elementos de um array, possvel aplicar o comando sintaxe um pouco diferente. www.k19.com.br

FOR

com uma

40

Arrays
1 2 3 4 5 6 7 8 9 double[] precos = new double[100]; for(int i = 0; i < precos.length; i++) { precos[i] = i; } for(double x : precos) { System.out.println(x); }

4.3

Operaes

Ordenando um Array
Suponha um array de strings criado para armazenar alguns nomes de pessoas. comum querer ordenar esses nomes utilizando a ordem alfabtica. Essa tarefa pode ser realizada atravs do mtodo A RRAYS . SORT.
1 2 3 4 5 6 7 String[] nomes = new String[]{"rafael cosentino", "jonas hirata", "marcelo martins" }; Arrays.sort(nomes); for(String nome : nomes) { System.out.println(nome); }

Copiando um Array
Para copiar o contedo de um array para outro com maior capacidade, podemos utilizar o mtodo A RRAYS . COPYO F.
1 2 String[] nomes = new String[] {"rafael", "jonas", "marcelo" }; String[] nomes2 = Arrays.copyOf(nomes, 10);

4.4

Exerccios

1. Dentro da sua pasta de exerccios crie uma pasta para os arquivos desenvolvidos nesse captulo chamada arrays. 41 K19 Treinamentos

Arrays

2. Crie um programa que imprima na tela os argumentos passados na linha de comando para o mtodo MAIN.
1 2 3 4 5 6 7 8 // arquivo: Imprime.java class Imprime { public static void main(String[] args) { for(String arg : args) { System.out.println(arg); } } }

Compile e execute a classe I MPRIME. Na execuo no esquea de passar alguns parmetros na linha de comando. java Imprime Rafael Alex Daniel Jonas 3. Faa um programa que ordene o array de strings recebido na linha de comando.
1 2 3 4 5 6 7 8 9 10 // arquivo: Ordena.java class Ordena { public static void main(String[] args) { java.util.Arrays.sort(args); for(String arg : args) { System.out.println(arg); } } }

Compile e execute a classe O RDENA. Na execuo no esquea de passar alguns parmetros na linha de comando. java Ordena Rafael Alex Daniel Jonas www.k19.com.br 42

Arrays 4. (Opcional) Faa um programa que calcule a mdia dos elementos recebidos na linha de comando. Dica: para converter strings para double pode ser utilizado um cdigo semelhante a este:
1 2 String s = "10"; double d = Double.parseDouble(s);

5. (Opcional) Crie um programa que encontre o maior nmero entre os valores passados na linha de comando. 6. (Opcional) Crie um array de arrays na forma de tringulo com os valores do padro abaixo e imprima na tela esses valores. 1 1 1 1 1

2 2 3 2 3 4 2 3 4 5

43

K19 Treinamentos

Arrays

www.k19.com.br

44

Captulo 5 Eclipse
Na prtica, alguma ferramenta de desenvolvimento adotada para aumentar a produtividade. Essas ferramentas so chamadas IDE(Integrated Development Environment - Ambiente de Desenvolvimento Integrado). Uma IDE uma ferramenta que prov facilidades para o desenvolvedor realizar as principais tarefas relacionadas ao desenvolvimento de um software. No caso especco da plataforma Java, a IDE mais utilizada e o Eclipse. Essa ferramenta bem abrangente e oferece recursos sosticados para o desenvolvimento de uma aplicao Java. Alm disso, ela gratuita. As diversas distribuies do Eclipse podem ser obtidas atravs do site: http://www. eclipse.org/.

5.1

Workspace

Uma workspace uma pasta que normalmente contm projetos e conguraes do Eclipse. Logo que executado, o Eclipse permite que o usurio selecione uma pasta como workspace.

Podemos ter vrias worspaces para organizar conjuntos projetos e conguraes indepen45

Eclipse dentemente.

5.2

Welcome

A primeira tela do Eclipse (welcome) mostra links para alguns exemplos, tutorias, viso geral da ferramenta e novidades.

5.3

Workbench

Da tela welcome podemos ir para workbench que a rea de trabalho do Eclipse clicando no cone destacado na gura abaixo ou simplesite fechando a tela welcome. www.k19.com.br 46

Eclipse

5.4

Perspective

O Eclipse oferece vrios modos de trabalho ao desenvolvedor. Cada modo de trabalho adequado para algum tipo de tarefa. Esses modos de trabalhos so chamados de perspectives (perspectivas). Podemos abrir uma perspectiva atravs do cone no canto superior direito da workbench.

Na maioria das vezes utilizaremos a perspectiva Java. 47 K19 Treinamentos

Eclipse

5.5

Views

As telas que so mostradas na workbench so chamadas de views. O desenvolvedor pode abrir, fechar ou mover qualquer view ao seu gosto e necessidade. Uma nova view pode ser aberta atravs do menu Window->Show View->Other.

5.6

Criando um projeto java

Podemos utilizar os menus para criar projetos porm a maneira mais prtica utilizar o Quick Acess atravs do atalho CTRL+3. O Quick Acess permite que o desenvolvedor busque as funcionalidades do Eclipse pelo nome. www.k19.com.br 48

Eclipse

Na tela de criao de projeto java devemos escolher um nome para o projeto. 49 K19 Treinamentos

Eclipse

A estrutura do projeto pode ser vista atravs da view Navigator que pode ser aberta com Quick Acess. www.k19.com.br 50

Eclipse

5.7

Criando uma classe

Aps a criao de um projeto podemos criar uma classe tambm atravs do Quick Acess. 51 K19 Treinamentos

Eclipse

Na tela de criao de classe devemos escolher um nome. www.k19.com.br 52

Eclipse

Um arquivo com o esqueleto da classe criado na pasta src e automaticamente o Eclipse compila e salva o cdigo compilado na pasta bin.

5.8

Criando o mtodo main

O mtodo main pode ser gerado utilizando Content Assist atravs do atalho CTRL+ESPACO. Basta digitar main seguido de CTRL+ESPACO e aceitar a sugesto do template para o mtodo main. 53 K19 Treinamentos

Eclipse

Dentro do mtodo main podemos gerar o cdigo necessrio para imprimir uma mensagem na tela com o Content Assist. Basta digitar sys seguido de CTRL+ESPACO e escolher a sugesto adequada.

5.9

Executando uma classe

Podemos executar uma classe que possui main atravs do Quick Acess. www.k19.com.br 54

Eclipse

Tambm podemos utilizar o boto run na barra de ferramentas do eclipse.

A sada do programa mostrada na tela Console.

5.10

Corrigindo erros

Erros de compilao podem ser corrigidos com o Quick Fix atravs do atalho CTRL+1. 55 K19 Treinamentos

Eclipse

No exemplo, o Quick Fix gera uma varivel local chamada um valor para essa varivel.

NOME.

Depois, basta denir

5.11

Atalhos teis

CTRL+1 (Quick Fix) : Lista sugestes para consertar erros. CTRL+3 (Quick Acess) : Lista para acesso rpido a comandos ou menus. CTRL+ESPACO (Content Assist) : Lista sugestes para completar cdigo. CTRL+SHIFT+F : Formata o cdigo. CTRL+\ : Comenta o cdigo selecionado.

5.12

Save Actions

Podemos escolher algumas aes para serem executadas no momento em que um arquivo com cdigo java salvo. Uma ao muito til a de formatar o cdigo. www.k19.com.br 56

Eclipse

57

K19 Treinamentos

Eclipse

www.k19.com.br

58

Captulo 6 Atributos e Mtodos de Classe


6.1 Atributos Estticos

Num sistema bancrio, provavelmente, criaramos uma classe para especicar os objetos que representariam os funcionrios do banco.
1 2 3 4 5 6 7 8 class Funcionario { String nome; double salario; void aumentaSalario(double aumento) { this.salario += aumento; } }

Supondo que o banco possui um piso salarial para os seus funcionrios e que o sistema tem que guardar esse valor, poderamos denir um atributo na classe F UNCIONARIO para tal propsito.
1 2 3 4 5 6 7 8 9 class Funcionario { String nome; double salario; double pisoSalarial; void aumentaSalario(double aumento) { this.salario += aumento; } }

O atributo PISO S ALARIAL de instncia, ou seja, cada objeto criado a partir da classe F UN CIONARIO teria o seu prprio atributo PISO S ALARIAL . Porm, no faz sentido ter o valor do piso salarial repetido em todos os objetos j que esse valor nico para todos os funcionrios. Para que o atributo PISO S ALARIAL no se repita em cada objeto da classe F UNCIONARIO, devemos torn-lo um atributo de classe ou invs de atributo de instncia. Para isso devemos aplicar o modicador static na declarao do atributo. 59

Atributos e Mtodos de Classe


1 2 3 4 5 6 7 8 9 class Funcionario { String nome; double salario; static double pisoSalarial; void aumentaSalario(double aumento) { this.salario += aumento; } }

Um atributo de classe deve ser acessado atravs do nome da classe na qual ele foi declarado.
1 Funcionario.pisoSalarial = 2000;

6.2

Mtodos Estticos

Da mesma forma que denimos mtodos para implementar as lgicas que manipulam os valores dos atributos de instncia, podemos fazer o mesmo para os atributos de classe. Suponha que o banco tenha um procedimento para reajustar o piso salarial baseado em uma taxa. Poderamos denir um mtodo na classe F UNCIONARIO para implementar esse reajuste.
1 2 3 void reajustaPisoSalarial(double taxa) { Funcionario.pisoSalarial += Funcionario.pisoSalarial * taxa; }

O mtodo REAJUSTA P ISO S ALARIAL () de instncia, ou seja, deve ser invocado a partir da referncia de um objeto da classe F UNCIONARIO. Porm, como o reajuste do piso salarial no depende dos dados de um funcionrio em particular no faz sentido precisar de uma referncia de um objeto da classe F UNCIONARIO para poder fazer o reajuste. Neste caso, poderamos denir o REAJUSTA P ISO S ALARIAL () como mtodo de classe ao invs de mtodo de instncia atravs do modicador STATIC. Dessa forma, o reajuste poderia ser executado independentemente da existncia de objetos da classe F UNCIONARIO.
1 2 3 static void reajustaPisoSalarial(double taxa) { Funcionario.pisoSalarial += Funcionario.pisoSalarial * taxa; }

Um mtodo de classe deve ser invocado atravs do nome da classe na qual ele foi denido.
1 Funcionario.reajustaPisoSalarial(0.1);

6.3

Exerccios

1. Crie um projeto no eclipse chamado Static. www.k19.com.br 60

Atributos e Mtodos de Classe 2. Crie uma classe chamada Conta no projeto S TATIC. Dena um atributo de classe para contabilizar o nmero de objetos instanciados a partir da classe C ONTA. Esse atributo deve ser incrementado toda vez que um objeto criado. Voc pode utilizar construtores para fazer o incremento.

1 2 3 4 5 6 7 8 9

public class Conta { // ATRIBUTO DE CLASSE static int contador; // CONSTRUTOR Conta() { Conta.contador++; } }

3. Faa um teste criando dois objetos da classe C ONTA e imprimindo o valor do contador de contas antes, entre e depois da criao dos objetos.

1 2 3 4 5 6 7 8 9

public class Teste { public static void main(String[] args) { System.out.println("Contador: " + Conta.contador); Conta c1 = new Conta(); System.out.println("Contador: " + Conta.contador); Conta c2 = new Conta(); System.out.println("Contador: " + Conta.contador); } }

4. O contador de contas pode ser utilizado para gerar um nmero nico para cada conta. Acrescente na classe C ONTA um atributo de instncia para guardar o nmero das contas e implemente no construtor a lgica para gerar esses nmeros de forma nica atravs do contador de contas.

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

public class Conta { // ATRIBUTO DE CLASSE static int contador; // ATRIBUTO DE INSTANCIA int numero; // CONSTRUTOR Conta() { Conta.contador++; this.numero = Conta.contador; } }

5. Altere o teste para imprimir o nmero de cada conta criada. 61 K19 Treinamentos

Atributos e Mtodos de Classe


1 2 3 4 5 6 7 8 9 10 11 12 13 public class Teste { public static void main(String[] args) { System.out.println("Contador: " + Conta.contador); Conta c1 = new Conta(); System.out.println("Numero da primeira conta: " + c1.numero); System.out.println("Contador: " + Conta.contador); Conta c2 = new Conta(); System.out.println("Numero da segunda conta: " + c2.numero); System.out.println("Contador: " + Conta.contador); } }

6. (Opcional) Dena um mtodo de classe na classe C ONTA para zerar o contador e imprimir o total de contas anterior.
1 2 3 4 5 6 // METODO DE CLASSE static void zeraContador() { System.out.println("Contador: " + Conta.contador); System.out.println("Zerando o contador de contas..."); Conta.contador = 0; }

7. (Opcional) Altere o teste para utilizar o mtodo ZERAC ONTADOR ().


1 2 3 4 5 6 7 8 9 10 11 public class Teste { public static void main(String[] args) { Conta c1 = new Conta(); System.out.println("Numero da primeira conta: " + c1.numero); Conta c2 = new Conta(); System.out.println("Numero da segunda conta: " + c2.numero); Conta.zeraContador(); } }

8. (Opcional) Crie uma classe para modelar os funcionrios do banco. Dena nessa classe um atributo para armazenar o piso salarial. 9. (Opcional) Faa um teste para vericar o funcionamento do piso salarial. 10. (Opcional) Dena um mtodo para reajustar o piso salarial a partir de uma taxa.

www.k19.com.br

62

Captulo 7 Encapsulamento
7.1 Atributos Privados

No sistema do banco, cada objeto da classe F UNCIONARIO possuiria um atributo para guardar o salrio do funcionrio que ele representa.
1 2 3 class Funcionario { double salario; }

O atributo SALARIO de um objeto da classe F UNCIONARIO pode ser acessado ou modicado por cdigo escrito em qualquer classe do mesmo pacote da classe F UNCIONARIO (Veremos pacotes posteriormente). Portanto, o controle do atributo SALARIO descentralizado dicultando a deteco de erros relacionados manipulao dos salrios dos funcionrios. Para obter um controle centralizado, podemos fazer o atributo SALARIO ser privado na classe F UNCIONARIO e criar mtodos para implementar as lgicas que utilizam o valor desse atributo.
1 2 3 4 5 6 7 class Funcionario { private double salario; void aumentaSalario(double aumento) { // lgica para aumentar o salrio } }

Um atributo privado s pode ser acessado ou alterado por cdigo escrito na classe na qual ele foi denido. Se algum cdigo fora da classe F UNCIONARIO tenta acessar ou alterar o valor do atributo privado SALARIO de um objeto da classe F UNCIONARIO um erro de compilao gerado. Denir todos os atributos como privados e mtodos para implementar as lgicas de acesso e alterao quase uma regra da orientao a objetos. O intuito ter sempre um controle centralizado do dados dos objetos para facilitar a manuteno do sistema. 63

Encapsulamento

7.2

Mtodos Privados

O papel de alguns mtodos de uma classe pode ser auxiliar outros mtodos da mesma classe. E muitas vezes, no correto chamar esses mtodos auxiliares diretamente. Para garantir que mtodos auxiliares no sejam chamados por cdigo escrito fora da classe na qual eles foram denidos, podemos faz-los privados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Conta { private double saldo; void deposita(double valor) { this.saldo += valor; this.descontaTarifa(); } void saca(double valor) { this.saldo -= valor; this.descontaTarifa(); } private descontaTarifa(){ this.saldo -= 0.1; } }

No exemplo acima, o mtodo DESCONTATARIFA () um mtodo auxiliar dos mtodos DE e SACA (). Alm disso, ele no deve ser chamado diretamente pois a tarifa s deve ser descontada quando ocorre um depsito ou um saque.
POSITA ()

7.3

Mtodos Pblicos

Os mtodos que devem ser acessados a partir de qualquer parte do sistema devem possuir o modicador de visibilidade public.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Conta { private double saldo; public void deposita(double valor) { this.saldo += valor; this.descontaTarifa(); } public void saca(double valor) { this.saldo -= valor; this.descontaTarifa(); } private descontaTarifa(){ this.saldo -= 0.1; } }

www.k19.com.br

64

Encapsulamento

7.4

Implementao e Interface de Uso

Dentro de um sistema orientado a objetos cada objeto realiza um conjunto de tarefas de acordo com as suas responsabilidades. Por exemplo, os objetos da classe C ONTA realizam as operaes de sacar, depositar, transferir ou gerar extrato. Para descobrir o que um objeto pode fazer basta olhar para as assinaturas dos mtodos pblicos denidos na classe desse objeto. A assinatura de um mtodo composta pelo seu tipo de retorno, seu nome e seus parmetros. As assinaturas dos mtodos pblicos de um objeto formam a sua interface de uso. Por outro lado, para descobrir como um objeto da classe C ONTA realiza as suas operaes devemos observar o corpo de cada um dos mtodos da classe C ONTA. Os corpos dos mtodos denem a implementao das operaes dos objetos.

7.5

Escondendo a implementao

Uma das ideias mais importantes da orientao a objetos o encapsulamento. Encapsular signica esconder a implementao dos objetos. O encapsulamento favorece principalmente dois aspectos de um sistema: a manuteno e o desenvolvimento. A manuteno favorecida pelo encapsulamento porque quando a implementao de um objeto tem que ser alterada basta modicar a classe do objeto. O desenvolvimento favorecido pelo encapsulamento pois podemos separar o trabalho dos desenvolvedores de forma mais independente.

Exemplos
O conceito do encapsulamento pode ser identicado em diversos exemplos do cotidiano. Mostraremos alguns desses exemplos para esclarecer melhor a ideia.

Celular
Hoje em dia, as pessoas esto acostumadas com os celulares. Os botes, a tela e os menus do celular forma a interface de uso do mesmo. Em outras palavras, o usurio interage com o celular atravs dos botes, da tela e dos menus. Os dispositivos internos do celular e os processos que transformam o som capturado pelo microfone em ondas que podem ser transmitidas para uma antena da operadora de telefonia mvel formam a implementao do celular. Do ponto de vista do usurio do celular, para fazer uma ligao, basta digitar o nmero do telefone desejado e clicar no boto que efetua ligao. Porm, diversos processos complexos so realizados pelo celular para que as pessoas possam conversar atravs dele. Se os usurios tivessem que ter conhecimento de todo o funcionamento interno do celular certamente a maioria das pessoas no teria celular. No contexto da orientao a objetos, aplicamos o encapsulamento para criar objetos mais simples de serem utilizados em qualquer parte do sistema. 65 K19 Treinamentos

Encapsulamento

Carro
A interface de uso de um carro composta pelos dispositivos que permitem que o motorista conduza o veculo (volante, pedais, alavanca do cambio, etc). A implementao do carro composta pelos dispositivos internos (motor, caixa de cmbio, radiador, sistema de injeo eletrnica ou carburador, etc) e pelos processos realizados internamente por esses dispositivos. Nos carros mais antigos, o dispositivo interno que leva o combustvel para o motor o carburador. Nos carros mais novos, o carburador foi substitudo pelo sistema de injeo eletrnica. Inclusive, algumas ocinas especializadas substituem o carburador pelo sistema de injeo eletrnica. Essa alterao na implementao do carro no afeta a maneira que o motorista dirige. Todo mundo que sabe dirigir um carro com carburador sabe dirigir um carro com injeo eletrnica. Hoje em dia, as montadoras fabricam veculos com cmbio mecnico ou automtico. O motorista acostumado a dirigir carros com cmbio mecnico pode ter diculdade para dirigir carros com cmbio automtico e vice-versa. Quando a interface de uso do carro alterada, a maneira de dirigir afetada fazendo com que as pessoas que sabem dirigir tenham que se adaptar. No contexto da orientao a objetos, aplicando o conceito do encapsulamento, as implementaes dos objetos cam "escondidas"ento podemos modic-las sem afetar a maneira de utilizar esses objetos. Por outro lado, se alterarmos a interface de uso que est exposta afetaremos a maneira de usar os objetos. Suponha uma troca de nome de mtodo pblico, todas as chamadas a esse mtodo devem ser alteradas.

Mquinas de Porcarias
Estamos acostumados a utilizar mquinas de refrigerantes, de salgadinhos, de doces, de caf, etc. Em geral, essas mquinas oferecem uma interface de uso composta por: Entradas para moedas ou cdulas. Botes para escolher o produto desejado. Sada do produto. Sada para o troco (opcional). Normalmente, essas mquinas so extremamente protegidas, para garantir que nenhum usurio mal intencionado ou no tente alterar a implementao da mquina, ou seja, tente alterar como a mquina funciona por dentro. Levando essa ideia para um sistema orientado a objetos, um objeto deve ser bem protegido para que outros objetos no prejudiquem o funcionamento interno do objeto.

7.6

Acesso e Alterao de atributos

Aplicando a ideia do encapsulamento, os atributos deveriam ser todos privados. Assim, os atributos no podem ser acessados ou alterados por cdigo escrito fora da classe na qual eles www.k19.com.br 66

Encapsulamento foram denidos. Porm, muitas vezes, as informaes armazenadas nos atributos precisam ser consultadas de qualquer lugar do sistema. Nesse caso, podemos disponibilizar mtodos para consultar os valores dos atributos.
1 2 3 4 5 6 7 class Cliente { private String nome; public String consultaNome() { return this.nome; } }

Da mesma forma, eventualmente, queremos alterar o valor de um atributo a partir de qualquer lugar do sistema. Nesse caso, tambm poderamos criar um mtodo para essa tarefa.
1 2 3 4 5 6 7 class Cliente { private String nome; public void alteraNome(String nome){ this.nome = nome; } }

Muitas vezes, necessrio consultar e alterar o valor de um atributo a partir de qualquer lugar do sistema. Nessa situao, podemos denir os dois mtodos discutidos anteriormente. Mas, o que melhor? Criar os dois mtodos (um de leitura outro de escrita) ou deixar o atributo pblico? Utilizando os mtodos, podemos controlar como as alteraes ou as consultas so feitas. Ou seja, temos um controle maior. Na linguagem Java, para facilitar o trabalho em equipe, os nomes dos mtodos discutidos anteriormente so padronizados. Os nomes dos mtodos que consultam os valores dos atributos possuem o prexo "get"seguido do nome do atributo. Os que alteram os valores dos atributos possuem o prexo "set"seguido do nome do atributo.
1 2 3 4 5 6 7 8 9 10 11 class Cliente { private String nome; public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; } }

7.7

Exerccios

1. Crie um projeto no eclipse chamado Encapsulamento. 2. Dena uma classe para representar os funcionrios do banco com um atributo para guar67 K19 Treinamentos

Encapsulamento dar os salrios e outro para os nomes.

1 2 3 4

class Funcionario { double salario; String nome; }

3. Teste a classe F UNCIONARIO criando um objeto e manipulando os atributos.

1 2 3 4 5 6 7 8 9 10 11

class Teste { public static void main(String[] args) { Funcionario f = new Funcionario(); f.nome = "Rafael Cosentino"; f.salario = 2000; System.out.println(f.nome); System.out.println(f.salario); } }

Perceba que a classe T ESTE pode acessar ou modicar os valores dos atributos de um objeto da classe F UNCIONARIO. Execute o teste!

4. Aplique a ideia do encapsulamento tornando os atributos denidos na classe F UNCIO NARIO privados.

1 2 3 4

class Funcionario { private double salario; private String nome; }

Observe que a classe T ESTE no compila mais. Lembre que um atributo privado s pode ser acessado por cdigo escrito na prpria classe do atributo.

5. Crie mtodos de acessado com nome padronizados para os atributos da classe F UNCIO NARIO . www.k19.com.br 68

Encapsulamento
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Funcionario { private double salario; private String nome; public double getSalario() { return this.salario; } public String getNome() { return this.nome; } public void setSalario(double salario) { this.salario = salario; } public void setNome(String nome) { this.nome = nome; } }

6. Altere a classe T ESTE para que ela utilize os mtodos de acesso ao invs de manipular os atributos do objeto funcionrio diretamente.

1 2 3 4 5 6 7 8 9 10 11

class Teste { public static void main(String[] args) { Funcionario f = new Funcionario(); f.setNome("Rafael Cosentino"); f.setSalario(2000); System.out.println(f.getNome()); System.out.println(f.getSalario()); } }

Execute o teste! 7. Gere os getters e setters com os recursos do eclipse. Digite get ou set seguidos de CTRL+ESPAO para completar o cdigo.

Outra possibilidade utilizar o Quick Acess para executar o comando generate getters and setters 69 K19 Treinamentos

Encapsulamento

www.k19.com.br

70

Captulo 8 Herana
8.1 Reutilizao de Cdigo

Um banco oferece diversos servios que podem ser contratados individualmente pelos clientes. Suponha que todos os servios possuem basicamente: o cliente que contratou, o funcionrio responsvel pela contratao e data de contratao. O sistema do banco deve estar preparado para gerenciar esses servios. Com o intuito de ser produtivo, a modelagem dos servios do banco deve diminuir a repetio de cdigo. A ideia reaproveitar o mximo do cdigo j criado. Essa ideia est diretamente relacionada ao conceito Dont Repeat Yourself. Em outras palavras, devemos minimizar ao mximo a utilizao do "copiar e colar". O aumento da produtividade e a diminuio do custo de manuteno so as principais motivaes do DRY. Em seguida, vamos discutir algumas modelagens possveis para os servios do banco. Buscaremos seguir a ideia do DRY na criao dessas modelagens.

Uma classe para todos os servios


Poderamos denir apenas uma classe para modelar todos os tipos de servios que o banco oferece.
1 2 3 4 5 6 7 class Servico { private Cliente contratante; private Funcionario responsavel; private String dataDeContratacao; // getters e setters }

Emprstimo
O emprstimo um dos servios que o banco oferece. Quando um cliente contrata esse servio so denidos o valor e a taxa de juros mensal do emprstimo. Devemos acrescentar dois atributos na classe S ERVICO, um para o valor outro para a taxa de juros do servio de emprstimo. 71

Herana
1 2 3 4 5 6 7 8 9 10 class Servico { private Cliente contratante; private Funcionario responsavel; private String dataDeContratacao; private double valor; private double taxa; // getters e setters }

Seguro de veculos
Outro servio oferecido pelo banco o seguro de veculos. Para esse servio devem ser denidas as seguintes informaes: veculo segurado, valor do seguro e a franquia. Devemos adicionar trs atributos na classe S ERVICO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Servico { // GERAL private Cliente contratante; private Funcionario responsavel; private String dataDeContratacao; // EMPRESTIMO private double valor; private double taxa; // SEGURO DE VEICULO private Veiculo veiculo; private double valorDoSeguroDeVeiculo; private double franquia; // getters e setters }

Apesar de seguir a ideia do DRY, modelar todos os servios com apenas uma classe pode dicultar o desenvolvimento. Supondo que dois ou mais desenvolvedores so responsveis pela implementao dos servios ento eles provavelmente codicariam a mesma classe concorrentemente. Alm disso, os desenvolvedores, principalmente os recm chegados no projeto do banco, cariam confusos com o cdigo extenso da classe S ERVICO. Outro problema que um objeto da classe S ERVICO possui atributos para todos os servios que o banco oferece mas na verdade deveria possuir apenas os atributos relacionados a um servio. Do ponto de vista de performance, essa abordagem causaria um consumo desnecessrio de memria.

Uma classe para cada servio


Para modelar melhor os servios, evitando uma quantidade grande de atributos e mtodos desnecessrios, criaremos uma classe para cada servio. www.k19.com.br 72

Herana
1 2 3 4 5 6 7 8 9 10 11 12 13 class SeguroDeVeiculo { // GERAL private Cliente contratante; private Funcionario responsavel; private String dataDeContratacao; // SEGURO DE VEICULO private Veiculo veiculo; private double valorDoSeguroDeVeiculo; private double franquia; // getters e setters }

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

class Emprestimo { // GERAL private Cliente contratante; private Funcionario responsavel; private String dataDeContratacao; // EMPRESTIMO private double valor; private double taxa; // getters e setters }

Criar uma classe para cada servio, torna o sistema mais exvel, pois qualquer alterao em um determinado servio no causar efeitos colaterais nos outros. Mas, por outro lado, essas classes teriam bastante cdigo repetido, contrariando a ideia do DRY. Alm disso, qualquer alterao que deva ser realizada em todos os servios precisa ser implementada em cada uma das classes.

Uma classe genrica e vrias especcas


Na modelagem dos servios do banco, podemos aplicar um conceito da orientao a objetos chamado Herana. A ideia reutilizar o cdigo de uma determinada classe em outras classes. Teramos a classe S ERVICO com os atributos e mtodos que todos os servios devem ter e uma classe para cada servio com os atributos e mtodos especcos do determinado servio. As classes especcas seriam "ligadas"de alguma forma classe S ERVICO para reaproveitar o cdigo nela denido. Esse relacionamento entre as classes representado em UML pelo diagrama abaixo: 73 K19 Treinamentos

Herana

Os objetos das classes especcas: E MPRESTIMO e S EGURO D E V EICULO) possuiriam tanto os atributos e mtodos denidos nessas classes quanto os denidos na classe S ERVICO.
1 2 3

Emprestimo e = new Emprestimo(); e.setDataDeContratacao("10/10/2010"); e.setValor(10000);

As classes especcas so vinculadas com a classe genrica utilizando o comando extends e no precisam redenir o contedo j declarado na classe genrica.
1 2 3 4 5

class Servico { private Cliente contratante; private Funcionario responsavel; private String dataDeContratacao; }

1 2 3 4

class Emprestimo extends Servico { private double valor; private double taxa; }

1 2 3 4 5

class SeguroDeVeiculo extends Servico { private Veiculo veiculo; private double valorDoSeguroDeVeiculo; private double franquia; }

A classe genrica denominada de super classe, classe base ou classe me. As classes especcas so denominadas sub classes, classes derivadas ou classes lhas. www.k19.com.br 74

Herana

8.2

Reescrita de Mtodo

Preo Fixo
Suponha que todo servio do banco possui uma taxa administrativa que deve ser paga pelo cliente que contratar o servio. Inicialmente, vamos considerar que o valor dessa taxa igual para todos os servios do banco. Neste caso, poderamos implementar um mtodo na classe S ERVICO para calcular o valor da taxa. Este mtodo ser reaproveitado por todas as classes que herdam da classe S ERVICO.
1 2 3 4 5 6 7 class Servico { // ATRIBUTOS public double calculaTaxa() { return 10; } }

Alguns preos diferentes


Suponha que o valor da taxa administrativa do servio de emprstimo diferente dos outros servios pois ele calculado a partir do valor emprestado ao cliente. Como esta lgica especca para o servio de de emprstimo devemos acrescentar um mtodo para implementar esse clculo na classe E MPRESTIMO.
1 2 3 4 5 6 7 class Emprestimo extends Servico { // ATRIBUTOS public double calculaTaxaDeEmprestimo() { return this.valor * 0.1; } }

Para os objetos da classe E MPRESTIMO devemos chamar o mtodo CALCULATAXA D E E MPRESTIMO (). Para todos os outros servios devemos chamar o mtodo CALCULATAXA (). Mesmo assim, nada impediria que o mtodo CALCULATAXA () fosse chamado num objeto da classe E MPRESTIMO, pois ela herda esse mtodo da classe S ERVICO. Dessa forma, corremos o risco de algum se equivocar chamando o mtodo errado. Na verdade, gostaramos de "substituir"a implementao do mtodo CALCULATAXA () herdado da classe S ERVICO na classe E MPRESTIMO para evitar uma chamada errada de mtodo. Para isso, basta escrever o mtodo CALCULATAXA () tambm na classe E MPRESTIMO com a mesma assinatura que ele possui na classe S ERVICO.
1 2 3 4 5 6 7 class Emprestimo extends Servico { // ATRIBUTOS public double calculaTaxa() { return this.valor * 0.1; } }

75

K19 Treinamentos

Herana Os mtodos das classes especcas tm prioridade sobre os mtodos das classes genricas. Em outras palavras, se o mtodo chamado existe na classe lha ele ser chamado, caso contrrio o mtodo ser procurado na classe me.

Fixo + Especco
Suponha que o preo de um servio a soma de um valor xo mais um valor que depende do tipo do servio. Por exemplo, o preo do servio de emprstimo 5 reais mais uma porcentagem do valor emprestado ao cliente. O preo do servio de seguro de veculo 5 reais mais uma porcentagem do valor do veculo segurado. Em cada classe especca, podemos reescrever o mtodo CALCULATAXA ().
1 2 3 4 5 6 7 class Emprestimo extends Servico { // ATRIBUTOS public double calculaTaxa() { return 5 + this.valor * 0.1; } }

1 2 3 4 5 6 7

class SeguraDeVeiculo extends Servico { // ATRIBUTOS public double calculaTaxa() { return 5 + this.veiculo.getValor() * 0.05; } }

Se o valor xo dos servios for atualizado todas as classes especcas devem ser modicadas. Outra alternativa, seria criar um mtodo na classe S ERVICO para calcular o valor xo de todos os servios e cham-lo dos mtodos reescritos nas classes especcas.
1 2 3 4 5 class Servico { public double calculaTaxa() { return 5 ; } }

1 2 3 4 5 6 7

class Emprestimo extends Servico { // ATRIBUTOS public override double calculaTaxa() { return super.calculaValor() + this.valor * 0.1; } }

www.k19.com.br

76

Herana

8.3

Construtores e Herana

Quando temos uma hierarquia de classes, as chamadas dos construtores so mais complexas do que o normal. Pelo menos um construtor de cada classe de uma mesma sequncia hierrquica deve ser chamado ao instanciar um objeto. Por exemplo, quando um objeto da classe E MPRESTIMO, pelo menos um construtor da prpria classe E MPRESTIMO e um da classe S ERVICO devem ser executados. Alm disso, os construtores da classes mais genricas so chamados antes dos construtores das classes especcas.
1 2 3 4 5 class Servico { public Servico() { System.out.println("Servico"); } }

1 2 3 4 5 6 7

class Emprestimo extends Servico { // ATRIBUTOS public Emprestimo() { System.out.println("Emprestimo"); } }

Por padro, todo construtor chama o construtor sem argumentos da classe me se no existir nenhuma chamada de construtor explcita.

8.4

Exerccios

1. Crie um projeto no eclipse chamado Heranca. 2. Dena uma classe para modelar os funcionrios do banco. Sabendo que todo funcionrio possui nome e salrio. Inclua os getters e setters dos atributos.

1 2 3 4 5 6

class Funcionario { private String nome; private double salario; // GETTERS AND SETTERS }

3. Crie uma classe para cada tipo especco de funcionrio herdando da classe F UNCIO NARIO . Suponha somente trs tipos especcos de funcionrios: gerentes, telefonistas e secretarias. Os gerentes possuem um nome de usurio e uma senha para acessar o sistema do banco. As telefonistas possuem um cdigo de estao de trabalho. As secretarias possuem um nmero de ramal. 77 K19 Treinamentos

Herana
1 2 3 4 5 6 class Gerente extends Funcionario { private String usuario; private String senha; // GETTERS AND SETTERS }

1 2 3 4 5

class Telefonista extends Funcionario { private int estacaoDeTrabalho; // GETTERS AND SETTERS }

1 2 3 4 5

class Secretaria extends Funcionario { private int ramal; // GETTERS AND SETTERS }

4. Teste o funcionamento dos trs tipos de funcionrios criando um objeto de cada uma das classes: G ERENTE, T ELEFONISTA e S ECRETARIA. www.k19.com.br 78

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 class TestaFuncionarios { public static void main(String[] args) { Gerente g = new Gerente(); g.setNome("Rafael Cosentino"); g.setSalario(2000); g.setUsuario("rafael.cosentino"); g.setSenha("12345"); Telefonista t = new Telefonista(); t.setNome("Carolina Mello"); t.setSalario(1000); t.setEstacaoDeTrabalho(13); Secretaria s = new Secretaria(); s.setNome("Tatiane Andrade"); s.setSalario(1500); s.setRamal(198); System.out.println("GERENTE"); System.out.println("Nome: " + g.getNome()); System.out.println("Salrio: " + g.getSalario()); System.out.println("Usurio: " + g.getUsuario()); System.out.println("Senha: " + g.getSenha()); System.out.println("TELEFONISTA"); System.out.println("Nome: " + t.getNome()); System.out.println("Salrio: " + t.getSalario()); System.out.println("Estacao de trabalho: " + t.getEstacaoDeTrabalho()); System.out.println("SECRETARIA"); System.out.println("Nome: " + s.getNome()); System.out.println("Salrio: " + s.getSalario()); System.out.println("Ramal: " + s.getRamal()); } }

Execute o teste! 5. Suponha que todos os funcionrios possuam uma bonicao de 10% do salrio. Acrescente um mtodo na classe F UNCIONARIO para calcular essa bonicao.
1 2 3 4 5 6 7 8 9 10 class Funcionario { private String nome; private double salario; public double calculaBonificacao() { return this.salario * 0.1; } // GETTERS AND SETTERS }

6. Altere a classe T ESTA F UNCIONARIOS para imprimir a bonicao de cada funcionrio alm dos dados que j foram impressos. Depois, execute o teste novamente. 7. Suponha que os gerentes possuam uma bonicao maior que os outros funcionrios. Reescreva o mtodo CALCULA B ONIFICACAO () na classe G ERENTE. Depois, execute o teste novamente. 79 K19 Treinamentos

Herana
1 2 3 4 5 6 7 8 9 10 class Gerente extends Funcionario { private String usuario; private String senha; public double calculaBonificacao() { return this.getSalario() * 0.6 + 100; } // GETTERS AND SETTERS }

8. (Opcional) Dena na classe F UNCIONARIO um mtodo para imprimir alguns dados na tela.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Funcionario { private String nome; private double salario; public double calculaBonificacao() { return this.salario * 0.1; } public void mostraDados() { System.out.println("Nome: " + this.nome); System.out.println("Salrio: " + this.salario); System.out.println("Bonificao: " + this.calculaBonificacao()); } // GETTERS AND SETTERS }

9. (Opcional) Reescreva o mtodo MOSTRA DADOS () nas classes G ERENTE, T ELEFONISTA e S ECRETARIA para acrescentar a impresso dos dados especcos de cada tipo de funcionrio. Veja o exemplo abaixo:

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

class Gerente extends Funcionario { private String usuario; private String senha; public double calculaBonificacao() { return this.getSalario() * 0.6 + 100; } public void mostraDados() { super.mostraDados(); System.out.println("Usurio: " + this.usuario); System.out.println("Senha: " + this.senha); } // GETTERS AND SETTERS }

10. (Opcional) Modique a classe T ESTA F UNCIONARIO para utilizar o mtodo DADOS (). www.k19.com.br

MOSTRA -

80

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 class TestaFuncionarios { public static void main(String[] args) { Gerente g = new Gerente(); g.setNome("Rafael Cosentino"); g.setSalario(2000); g.setUsuario("rafael.cosentino"); g.setSenha("12345"); Telefonista t = new Telefonista(); t.setNome("Carolina Mello"); t.setSalario(1000); t.setEstacaoDeTrabalho(13); Secretaria s = new Secretaria(); s.setNome("Tatiane Andrade"); s.setSalario(1500); s.setRamal(198); System.out.println("GERENTE"); g.mostraDados(); System.out.println("TELEFONISTA"); t.mostraDados(); System.out.println("SECRETARIA"); s.mostraDados(); } }

11. (Opcional) Dena classes para modelar diversos tipos de contas bancrias: poupana, corrente, conta salrio, entre outros.

81

K19 Treinamentos

Herana

www.k19.com.br

82

Captulo 9

Polimorsmo

Os clientes de um banco podem consultar algumas informaes das suas contas atravs de extratos impressos nos caixas eletrnicos. Eventualmente, poderamos criar uma classe para denir um tipo de objeto capaz de gerar extratos de diversos tipos.

1 2 3 4 5 6 7 8 9 10

class GeradorDeExtrato { public void imprimeExtratoBasico(ContaPoupanca cp) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date agora = new Date(); System.out.println("DATA: " + sdf.format(agora)); System.out.println("SALDO: " + cp.getSaldo()); } }

O mtodo IMPRIME E XTRATO BASICO () gera extratos bsicos somente de contas do tipo poupana. O sistema do banco deve ser capaz de gerar extratos bsicos para os outros tipos de contas tambm. Poderamos implementar outros mtodos na classe G ERADOR D E E XTRATO para trabalhar com os outros tipos de conta, um para cada tipo de conta. 83

Polimorsmo
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 GeradorDeExtrato { public void imprimeExtratoBasico(ContaPoupanca cp) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date agora = new Date(); System.out.println("DATA: " + sdf.format(agora)); System.out.println("SALDO: " + cp.getSaldo()); } public void imprimeExtratoBasico(ContaCorrente cc) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date agora = new Date(); System.out.println("DATA: " + sdf.format(agora)); System.out.println("SALDO: " + cc.getSaldo()); } public void imprimeExtratoBasico(ContaSalario cs) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date agora = new Date(); System.out.println("DATA: " + sdf.format(agora)); System.out.println("SALDO: " + cs.getSaldo()); } }

Como o contedo do extrato bsico o mesmo independentemente do tipo de conta ento os mtodos da classe G ERADOR D E E XTRATO seriam praticamente iguais. Qualquer tipo de mudana no contedo do extrato bsico causaria modicaes em diversos mtodos. Alm disso, se o banco denir um novo tipo de conta ento um mtodo praticamente idntico aos que j existem teria que ser adicionado na classe G ERADOR D E E XTRATO. Analogamente, se o banco extinguir um tipo de conta ento o mtodo correspondente de gerar extrato bsico deve ser retirado do gerador.

9.1

Modelagem das contas

Com o intuito inicial de reutilizar cdigo podemos modelar os diversos tipos de contas do banco utilizando o conceito de herana.
1 2 3 4 5 class Conta { private double saldo; // MAIS ATRIBUTOS E MTODOS }

1 2 3 4 5

class ContaPoupanca extends Conta { private int diaDoAniversario; // MAIS ATRIBUTOS E MTODOS }

www.k19.com.br

84

Polimorsmo
1 2 3 4 5 class ContaCorrente extends Conta { private double limite; // MAIS ATRIBUTOS E MTODOS }

9.2

UM (extends)

Alm de gerar reaproveitamento de cdigo, a utilizao de herana permite que objetos criados a partir das classes especcas sejam tratados como objetos da classe genrica. Em outras palavras, a herana entre as classes que modelam as contas permite que objetos criados a partir das classes C ONTA P OUPANCA ou C ONTAC ORRENTE sejam tratados como objetos da classe C ONTA. No cdigo da classe C ONTA P OUPANCA utilizamos a palavra extends. Ela pode ser interpretada com a expresso: UM ou UMA.
1 2 class ContaPoupanca extends Conta //TODA ContaPoupanca UMA Conta

Como est explcito no cdigo que toda conta poupana uma conta ento podemos criar um objeto da classe C ONTA P OUPANCA e trat-lo como um objeto da classe C ONTA.
1 2 3 4 5 // Criando um objeto da classe ContaPoupanca ContaPoupanca cp = new ContaPoupanca(); // Tratando o objeto como um objeto da classe Conta Conta c = cp;

Em alguns lugares do sistema do banco ser mais vantajoso tratar um objeto da classe C ONTA P OUPANCA como um objeto da classe C ONTA.

9.3

Melhorando o gerador de extrato

Do ponto de vista do gerador de extrato, o tipo de conta no faz diferena na hora de gerar extratos bsicos. Ento, ao invs de criar um mtodo de gerar extratos bsicos para cada tipo de conta, vamos criar um mtodo genrico que aceite qualquer tipo de conta como parmetro.
1 2 3 4 5 6 7 8 9 10 class GeradorDeExtrato { public void imprimeExtratoBasico(Conta c) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date agora = new Date(); System.out.println("DATA: " + sdf.format(agora)); System.out.println("SALDO: " + c.getSaldo()); } }

85

K19 Treinamentos

Polimorsmo Como o mtodo IMPRIME E XTRATO BASICO () recebe uma conta como parmetro ele pode receber objetos da classe C ONTA P OUPANCA, C ONTAC ORRENTE ou qualquer outra classe que herde direta ou indiretamente da classe C ONTA. A capacidade de tratar objetos criados a partir das classes especcas como objetos de uma classe genrica chamada de Polimorsmo. Aplicando a ideia do polimorsmo no gerador de extratos melhoramos a manutenibilidade da classe G ERADOR D E E XTRATO pois agora qualquer alterao no formato ou no contedo dos extratos bsicos causa modicaes em apenas um mtodo. Fora isso, novos tipos de contas podem ser criadas sem a necessidade de qualquer alterao na classe G ERADOR D E E XTRATO. Analogamente, se algum tipo de conta for extinto nada precisar ser modicado na classe G E RADOR D E E XTRATO .

9.4

Exerccios

1. Crie um projeto no eclipse chamado Polimorsmo. 2. Dena uma classe genrica para modelar as contas do banco.

1 2 3 4 5

class Conta { private double saldo; // GETTERS AND SETTERS }

3. Dena duas classes especcas para dois tipos de contas do banco: poupana e corrente.

1 2 3 4 5

class ContaPoupanca extends Conta { private int diaDoAniversario; // GETTERS AND SETTERS }

1 2 3 4 5

class ContaCorrente extends Conta { private double limite; // GETTERS AND SETTERS }

4. Dena uma classe para especicar um gerador de extratos. www.k19.com.br 86

Polimorsmo
1 2 3 4 5 6 7 8 9 10 11 12 13 import java.text.SimpleDateFormat; import java.util.Date; class GeradorDeExtrato { public void imprimeExtratoBasico(Conta c) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date agora = new Date(); System.out.println("DATA: " + sdf.format(agora)); System.out.println("SALDO: " + c.getSaldo()); } }

No se preocupe com os comando de import, discutiremos sobre ele posteriormente. 5. Faa um teste para o gerador de extratos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class TestaGeradorDeExtrato { public static void main(String[] args) { GeradorDeExtrato gerador = new GeradorDeExtrato(); ContaPoupanca cp = new ContaPoupanca(); cp.setSaldo(1000); ContaCorrente cc = new ContaCorrente(); cc.setSaldo(1000); gerador.imprimeExtratoBasico(cp); gerador.imprimeExtratoBasico(cc); } }

87

K19 Treinamentos

Polimorsmo

www.k19.com.br

88

Captulo 10 Classes Abstratas


10.1 Classes Abstratas

Suponha que no banco todas as contas possuem um tipo especco, por exemplo, conta poupana, conta corrente ou conta salrio e que elas so modelas dentro do nosso sistema pelas seguintes classes.
1 2 3 4 5 class Conta { private double saldo; // MAIS ATRIBUTOS E MTODOS }

1 2 3 4 5

class ContaPoupanca extends Conta { private int diaDoAniversario; // MAIS ATRIBUTOS E MTODOS }

1 2 3 4 5

class ContaCorrente extends Conta { private double limite; // MAIS ATRIBUTOS E MTODOS }

Para cada conta do domnio do banco devemos criar um objeto da classe correspondente ao tipo da conta. Por exemplo, se existe uma conta poupana no domnio do banco devemos criar um objeto da classe C ONTA P OUPANCA.
1 ContaPoupanca cp = new ContaPoupanca();

Faz sentido criar objetos da classe C ONTA P OUPANCA pois existem contas poupana no domnio do banco. Dizemos que a classe C ONTA P OUPANCA uma classe concreta pois criaremos objetos a partir dela. 89

Classes Abstratas Por outro lado, a classe C ONTA no dene uma conta que de fato existe no domnio do banco. Ela apenas serve como "base"para denir as contas concretos. No faz sentido criar um objeto da classe C ONTA pois estaramos instanciado um objeto que no suciente para representar uma conta que pertena ao domnio do banco. Mas, a princpio no h nada proibindo a criao de objetos dessa classe. Para adicionar essa restrio no sistema, devemos declarar a classe C ONTA como abstrata. Uma classe concreta pode ser utilizada para instanciar objetos. Por outro lado, uma classe abstrata no pode. Todo cdigo que tenta criar um objeto de uma classe abstrata no compila. Para denir uma classe abstrata, basta adicionar o modicador abstract.
1 2 abstract class Conta { }

10.2

Mtodos Abstratos

Suponha que o banco oferea extrato detalhado das contas e para cada tipo de conta as informaes e o formato desse extrato detalhado so diferentes. Alm disso, a qualquer momento o banco pode mudar os dados e o formato do extrato detalhado de um dos tipos de conta. Neste caso, no vale apena ter uma implementao de mtodo na classe C ONTA para gerar extratos detalhados porque essa implementao seria reescrita nas classes especcas sem nem ser reaproveitada. Poderamos, simplesmente, no denir nenhum mtodo para gerar extratos detalhados na classe C ONTA. Porm, nada garantiria que as classes que derivam direta ou indiretamente da classe C ONTA possuam uma implementao para gerar extratos detalhados nem que uma mesma assinatura de mtodo seja respeitada, ou seja, as classes derivadas poderiam denir mtodos com nomes, parmetros ou retorno diferentes entre si. Para garantir que toda classe concreta que deriva direta ou indiretamente da classe C ONTA tenha uma implementao de mtodo para gerar extratos detalhados e alm disso que uma mesma assinatura de mtodo seja utilizada, devemos utilizar o conceito de mtodos abstratos. Na classe C ONTA, denimos um mtodo abstrato para gerar extratos detalhados. Um mtodo abstrato possui somente assinatura, ou seja, no possui corpo (implementao).
1 2 3 4 5 6 7 abstract class Conta { private double saldo; // GETTERS AND SETTERS public abstract void imprimeExtratoDetalhado(); }

www.k19.com.br

90

Classes Abstratas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class ContaPoupanca extends Conta { private int diaDoAniversario; public void imprimeExtratoDetalhado() { System.out.println("EXTRATO DETALHADO DE CONTA POUPANA"); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date agora = new Date(); System.out.println("DATA: " + sdf.format(agora)); System.out.println("SALDO: " + this.getSaldo()); System.out.println("ANIVERSRIO: " + this.diaDoAniversario); } }

Toda classes concreta que deriva direta ou indiretamente da classe C ONTA ser obrigada a ter uma implementao desse mtodo. Caso contrrio a classe no compila.
1 2 3 4 5 // ESSA CLASSE NO COMPILA class ContaPoupanca extends Conta { private int diaDoAniversario; }

10.3

Exerccios

1. Crie um projeto no eclipse chamado Classes-Abstratas. 2. Dena uma classe genrica para modelar as contas do banco.
1 2 3 4 5 class Conta { private double saldo; // GETTERS AND SETTERS }

3. Crie um teste simples para utilizar objetos da classe C ONTA.


1 2 3 4 5 6 7 8 9 class TestaConta { public static void main(String[] args) { Conta c = new Conta(); c.setSaldo(1000); System.out.println(c.getSaldo()); } }

4. Torne a classe C ONTA abstrata e verique o que acontece na classe de teste. 5. Dena uma classe para modelar as contas poupana do nosso banco. 91 K19 Treinamentos

Classes Abstratas
1 2 3 4 5 class ContaPoupanca extends Conta { private int diaDoAniversario; // GETTERS E SETTERS }

6. Altere a classe T ESTAC ONTA para corrigir o erro de compilao.


1 2 3 4 5 6 7 8 9 class TestaConta { public static void main(String[] args) { Conta c = new ContaPoupanca(); c.setSaldo(1000); System.out.println(c.getSaldo()); } }

7. Dena um mtodo abstrato na classe C ONTA para gerar extratos detalhados.


1 2 3 4 5 6 7 abstract class Conta { private double saldo; // GETTERS AND SETTERS public abstract void imprimeExtratoDetalhado(); }

8. O que acontece com a classe C ONTA P OUPANCA? 9. Dena uma implementao do mtodo IMPRIME E XTRATO D ETALHADO () na classe C ON TA P OUPANCA .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import java.text.SimpleDateFormat; import java.util.Date; class ContaPoupanca extends Conta { private int diaDoAniversario; public void imprimeExtratoDetalhado() { System.out.println("EXTRATO DETALHADO DE CONTA POUPANA"); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date agora = new Date(); System.out.println("DATA: " + sdf.format(agora)); System.out.println("SALDO: " + this.getSaldo()); System.out.println("ANIVERSRIO: " + this.diaDoAniversario); } }

www.k19.com.br

92

Captulo 11 Interfaces
11.1 Padronizao

Recentemente, a TV Digital chegou ao Brasil. Muitos debates, testes e pesquisas foram realizados para escolher qual padro de TV Digital deveria ser adotado pelo Brasil antes dessa nova tecnologia ser implantada. Quando o brasil iniciou o processo de denio de um padro para TV Digital, alguns pases j haviam denido um padro prprio. Os principais eram o americano e o japons. O Brasil poderia criar o seu prprio padro ou adotar um dos j existentes. Essa escolha complexa pois afeta fortemente vrios setores do pas. As emissoras de TV precisam adquirir novos equipamentos e capacitar pessoas para oper-los. Os fabricantes de aparelhos de TV devem desenvolver tecnologia para se adaptar. A populao em geral precisa adquirir novos aparelhos ou adaptadores. Esse problema, pode ser levado a escala mundial. A escolha de um padro diferente dos outros pases implica em diculdades tcnicas para utilizar produtos importados. Alm disso, os produtos exportados pelo Brasil tambm podem enfrentar problemas tcnicos para serem utilizados no exterior. Isso certamente afeta as relaes comerciais do Brasil com o resto do mundo. O Brasil acabou adotando um padro fortemente baseado no padro japons. Esse padro dene o que cada dispositivo que participa da TV Digital deve fazer, desde do decodicador das TVs at as antenas que transmitem o sinal digital. Essa padronizao possibilita que aparelhos de TV de diversos fabricantes "conversem"com as antenas das emissoras de TV. Mais, do que isso, ele permite que aparelhos mveis como por exemplo celulares possam interagir de uma maneira uniforme com as antenas. claro que isso tudo funciona porque as empresas que fabricam os dispositivos que participam da TV Digital respeitam as especicaes do padro. Alm disso, no interessante para um fabricante de TV no seguir as especicaes pois os aparelhos dele no funcionariam e consequentemente ningum compraria. Padronizao atravs especicaes algo bem comum. H organizaes nacionais e internacionais que denem padres para diversas reas (veja http://www.iso.org). Normalmente, essas organizaes alm de denir especicaes elas emitem certicados para os produtos ou servios que esto de acordo com determinadas especicaes. Esses certicados so importantes pois garantem qualidade e modo de utilizao dos produtos ou servios. Eventualmente, padres so substitudos por outros. Recentemente, o Brasil trocou o pa93

Interfaces dro das tomadas eltricas afetando a maior parte da populao. As pessoas tiveram que substituir tomadas ou comprar adaptadores.

11.2

Contratos

Num sistema Orientado a Objetos, os objetos interagem entre si atravs de chamadas de mtodos (troca de mensagens). Assim como os aparelhos de TV e dispositivos mveis interagem com as antenas. Para os objetos de um sistema conversarem entre si facilmente importante padronizar o conjunto de mtodos oferecidos por eles. Assim como as operaes das antenas e dos aparelhos de TV so padronizadas. Um padro denido atravs de especicaes ou contratos. No contexto da orientao a objetos, um contrato uma interface. Uma interface um contrato que dene assinaturas de mtodos que devem ser implementados pelas classes que assinarem o mesmo.

11.3

Exemplo

No sistema do banco, podemos denir uma interface (contrato) para padronizar as assinaturas dos mtodos oferecidos pelos objetos que representam as contas do banco.
1 2 3 4 interface Conta { void deposita(double valor); void saca(double valor); }

Observe que somente assinaturas de mtodos so declaradas no corpo de uma interface. Todos os mtodos de uma interface so pblicos e abstratos. Os modicadores PUBLIC e ABSTRACT so opcionais. As classes que denem os diversos tipos de contas que existem no banco devem implementar (assinar) a interface C ONTA.
1 2 3 4 5 6 7 8 class ContaPoupanca implements Conta { public void deposita(double valor) { // implementacao } public void saca(double valor) { // implementacao } }

1 2 3 4 5 6 7 8

class ContaCorrente implements Conta { public void deposita(double valor) { // implementacao } public void saca(double valor) { // implementacao } }

www.k19.com.br

94

Interfaces As classes concretas que implementam uma interface so obrigadas a possuir uma implementao para cada mtodo declarado na interface. Caso contrrio, ocorrer um erro de compilao.
1 2 3 4 5 6 // Esta classe no compila porque ela no implementou o mtodo saca() class ContaCorrente implements Conta { public void deposita(double valor) { // implementacao } }

A primeira vantagem de utilizar uma interface a padronizao das assinaturas dos mtodos oferecidos por um determinado conjunto de classes. A segunda vantagem garantir que determinadas classes implementem certos mtodos.

11.4

Polimorsmo

Se uma classe implementa uma interface, podemos aplicar a ideia do polimorsmo assim como em herana. Dessa forma, outra vantagem da utilizao de interfaces o ganho do polimorsmo. Como exemplo, suponha que a classe C ONTAC ORRENTE implemente a interface C ONTA. Podemos guardar a referncia de um objeto do tipo C ONTAC ORRENTE em uma varivel do tipo C ONTA.
1 Conta c = new ContaCorrente();

Alm disso podemos passar uma varivel do tipo C ONTAC ORRENTE para um mtodo que o parmetro seja do tipo C ONTA.
1 2 3 GeradorDeExtrato g = new GeradorDeExtrato(); ContaCorrente c = new ContaCorrente(); g.geraExtrato(c);

1 2 3 4 5

class GeradorDeExtrato { public void geraExtrato(Conta c) { // implementao } }

O mtodo GERA E XTRATO () pode ser aproveitado para objetos criados a partir de classes que implementam direta ou indiretamente a interface C ONTA.

11.5

Interface e Herana

As vantagens e desvantagens entre interface e herana, provavelmente, o tema mais discutido nos blogs, fruns e revistas que abordam desenvolvimento de software orientado a objetos. 95 K19 Treinamentos

Interfaces Muitas vezes, os debates sobre este assunto se estendem mais do que a prpria importncia deste tema. Inclusive, muitas pessoas se posicionam de forma radical defendendo a utilizao de interfaces ao invs de herana em qualquer situao. Normalmente, os debates sobre este tpico esto interessados em analisar o que melhor para manuteno, utilizar interfaces ou aplicar herana. A grosso modo, priorizar a utilizao de interfaces permite que alteraes pontuais em determinados trechos do cdigo fonte sejam feitas mais facilmente pois diminui as ocorrncias de efeitos colaterais indesejados no resto da aplicao. Por outro lado, priorizar a utilizao de herana pode diminuir a quantidade de cdigo escrito no incio do desenvolvimento de um projeto. Algumas pessoas propem a utilizao de interfaces juntamente com composio para substituir totalmente o uso de herana. De fato, esta uma alternativa interessante pois possibilita que um trecho do cdigo fonte de uma aplicao possa ser alterado sem causar efeito colateral no restante do sistema alm de permitir a reutilizao de cdigo mais facilmente. Do ponto de vista prtico, em Java, como no h herana mltipla, muitas vezes, interfaces so apresentadas como uma alternativa para obter um grau maior de polimorsmo. Por exemplo, suponha duas rvores de herana independentes.

Suponha que os gerentes e as empresas possam acessar o sistema do banco atravs de um nome de usurio e uma senha. Seria interessante utilizar um nico mtodo para implementar a autenticao desses dois tipos de objetos. Mas, qual seria o tipo de parmetro deste mtodo? Lembrando que ele deve aceitar gerentes e empresas.
1 2 3 4 5 class AutenticadorDeUsuario { public boolean autentica(??? u) { // implementao } }

De acordo com as rvores de herana, no h polimorsmo entre objetos da classe G E RENTE e da classe E MPRESA . Para obter polimorsmo entre os objetos dessas duas classes somente com herana, deveramos coloc-las na mesma rvore de herana. Mas, isso no faz www.k19.com.br 96

Interfaces sentido pois uma empresa no um funcionrio e o gerente no cliente. Neste caso, a soluo utilizar interfaces para obter polimorsmo entre objetos da classe G ERENTE e da classe E MPRESA.

Agora, conseguimos denir o que o mtodo AUTENTICA () deve receber como parmetro para trabalhar tanto com gerentes quanto com empresas. Ele deve receber um parmetro do tipo U SUARIO.
1 2 3 4 5 class AutenticadorDeUsuario { public boolean autentica(Usuario u) { // implementao } }

11.6

Exerccios

1. Crie um projeto no eclipse chamado Interfaces. 2. Dena uma interface para padronizar as assinaturas dos mtodos das contas do banco.

1 2 3 4 5

interface Conta { void deposita(double valor); void saca(double valor); double getSaldo(); }

3. Agora, crie algumas classes para modelar tipos diferentes de conta. 97 K19 Treinamentos

Interfaces
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class ContaCorrente implements Conta { private double saldo; private double taxaPorOperacao = 0.45; public void deposita(double valor) { this.saldo += valor - this.taxaPorOperacao; } public void saca(double valor) { this.saldo -= valor + this.taxaPorOperacao; } public double getSaldo() { return this.saldo; } }

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

class ContaPoupanca implements Conta { private double saldo; public void deposita(double valor) { this.saldo += valor; } public void saca(double valor) { this.saldo -= valor; } public double getSaldo() { return this.saldo; } }

4. Fao um teste simples com as classes criadas anteriormente.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class TestaContas { public static void main(String[] args) { ContaCorrente c1 = new ContaCorrente(); ContaPoupanca c2 = new ContaPoupanca(); c1.deposita(500); c2.deposita(500); c1.saca(100); c2.saca(100); System.out.println(c1.getSaldo()); System.out.println(c2.getSaldo()); } }

5. Altere a assinatura do mtodo DEPOSITA () na classe C ONTAC ORRENTE. Voc pode acrescentar um r no nome do mtodo. O que acontece? Obs: desfaa a alterao depois deste exerccio. 6. Crie um gerador de extratos com um mtodo que pode trabalhar com todos os tipos de conta. www.k19.com.br 98

Interfaces
1 2 3 4 5 6 class GeradorDeExtrato { public void geraExtrato(Conta c) { System.out.println("EXTRATO"); System.out.println("SALDO: " + c.getSaldo()); } }

7. Teste o gerador de extrato.


1 2 3 4 5 6 7 8 9 10 11 12 13 class TestaGeradorDeExtrato { public static void main(String[] args) { ContaCorrente c1 = new ContaCorrente(); ContaPoupanca c2 = new ContaPoupanca(); c1.deposita(500); c2.deposita(500); GeradorDeExtrato g = new GeradorDeExtrato(); g.geraExtrato(c1); g.geraExtrato(c2); } }

99

K19 Treinamentos

Interfaces

www.k19.com.br

100

Captulo 12 Pacotes
12.1 Organizao

O cdigo fonte de uma aplicao real formado por uma quantidade grande de arquivos. Conforme essa quantidade cresce surge a necessidade de algum tipo de organizao para poder encontrar os arquivos mais rapidamente quando for necessrio modic-los. A ideia para organizar logicamente os arquivos de uma aplicao bem simples e muito parecida com o que um usurio de computador j est acostumado a fazer. Os arquivos so separados em pastas e subpastas ou diretrios e subdiretrios.

12.2

O comando package

Na terminologia do Java, dizemos que as classes e interfaces so organizadas em pacotes (pastas). O primeiro passo, para colocar uma classe ou interface em um determinado pacote, utilizar o comando PACKAGE no cdigo fonte.
1 2 3 4 5 6 // Arquivo: Conta.java package sistema; class Conta { // corpo da classe }

O segundo passo salvar o arquivo dentro de uma pasta como mesmo nome do pacote denido no cdigo fonte. sistema/Conta.java A declarao das classes ou interfaces deve aparecer aps a declarao de pacote caso contrrio ocorrer um erro de compilao.

12.3

Sub Pacotes

Podemos criar pacotes dentro de pacotes. No cdigo fonte os sub pacotes so denidos com o operador .. 101

Pacotes
1 2 3 4 5 6 // Arquivo: Conta.java package sistema.contas; class Conta { // corpo da classe }

Alm disso, devemos criar uma estrutura de pastas que reita os sub pacotes. sistema/contas/Conta.java

12.4
12.4.1

Classes ou Interfaces pblicas


Fully Qualied Name

Com a utilizao de pacotes apropriado denir o que o nome simples e o nome completo (fully qualied name) de uma classe ou interface. O nome simples o identicador declarado a direita do comando CLASS ou INTERFACE. O nome completo formado pela concatenao dos nomes dos pacotes com o nome simples atravs do carcter .. Por exemplo, suponha a seguinte cdigo:
1 2 3 4 5 6 // Arquivo: Conta.java package sistema.contas; class Conta { // corpo da classe }

O nome simples da classe acima : C ONTA e o nome completo : SISTEMA . CONTAS .C ONTA. Duas classes de um mesmo pacote podem conversar entre si atravs do nome simples de cada uma delas. O mesmo vale para interfaces. Por exemplo suponha duas classes: sistema/contas/Conta.java

1 2 3 4 5 6

// Arquivo: Conta.java package sistema.contas; class Conta { // corpo da classe }

sistema/contas/ContaPoupanca.java

1 2 3 4 5 6

// Arquivo: ContaPoupanca.java package sistema.contas; class ContaPoupanca extends Conta { // corpo da classe }

www.k19.com.br

102

Pacotes A classe C ONTA P OUPANCA declara que herda da classe C ONTA apenas utilizando o nome simples. Por outro lado, duas classes de pacotes diferentes precisam utilizar o nome completo de cada uma delas para conversar entre si. Alm disso, a classe que ser utilizada por classes de outro pacote deve ser pblica. O mesmo vale para interfaces. Como exemplo suponha duas classes: sistema/contas/Conta.java

1 2 3 4 5 6

// Arquivo: Conta.java package sistema.contas; public class Conta { // corpo da classe }

sistema/clientes/Cliente.java

1 2 3 4 5 6

// Arquivo: Cliente.java package sistema.clientes; class Cliente { private sistema.contas.Conta conta; }

12.5

Import

Para facilitar a escrita do cdigo fonte, podemos utilizar o comando IMPORT para no ter que repetir o nome completo de uma classe ou interface vrias vezes dentro do mesmo arquivo. sistema/clientes/Cliente.java

1 2 3 4 5 6 7 8

// Arquivo: Cliente.java package sistema.clientes; import sistema.contas.Conta; class Cliente { private Conta conta; }

Podemos importar vrias classes ou interfaces no mesmo arquivo. As declaraes de importe devem aparecer aps a declarao de pacote e antes das declaraes de classes ou interfaces. 103 K19 Treinamentos

Pacotes

12.6

Nveis de visibilidade

No Java, h quatro nveis de visibilidade: privado, padro, protegido e pblico. Podemos denir os nveis privado, protegido e pblico com os modicadores PRIVATE, PROTECTED e PUBLIC respectivamente. Quando nenhum modicador de visibilidade utilizado o nvel padro aplicado.

12.6.1

Privado

O nvel privado aplicado com o modicador PRIVATE. O que pode ser privado? Atributos, construtores, mtodos, classes aninhadas ou interfaces aninhadas. Os itens em nvel de visibilidade privado s podem ser acessados por cdigo escrito na mesma classe na qual eles foram declarados.

12.6.2

Padro

O nvel padro aplicado quando nenhum modicador utilizado. O que pode ser padro? Atributos, construtores, mtodos, classes de todos os tipos e interfaces de todos os tipos. Os itens em nvel de visibilidade padro s podem ser acessados por cdigo escrito em classes do mesmo pacote da classe na qual eles foram declarados.

12.6.3

Protegido

O nvel protegido aplicado com o modicador PROTECTED. O que pode ser protegido? Atributos, construtores, mtodos, classes aninhadas ou interfaces aninhadas. Os itens em nvel de visibilidade protegido s podem ser acessados por cdigo escrito em classes do mesmo pacote da classe na qual eles foram declarados ou por classes derivadas.

12.6.4

Pblico

O nvel pblico aplicado quando o modicador PUBLIC utilizado. O que pode ser pblico? Atributos, construtores, mtodos, classes de todos os tipos e interfaces de todos os tipos. Os itens em nvel de visibilidade pblico podem ser acessados de qualquer lugar do cdigo da aplicao.

12.7

Exerccios

1. Crie um projeto no eclipse chamado Pacotes. 2. Crie um pacote chamado sistema e outro chamado testes. www.k19.com.br 104

Pacotes 3. Faa uma classe para modelar as contas no pacote sistema.


1 2 3 4 5 6 7 8 9 10 // Arquivo: Conta.java package sistema; public class Conta { private double saldo; public void deposita(double valor) { this.saldo += valor; } }

4. Faa uma classe de teste no pacote testes.


1 2 3 4 5 6 7 8 9 10 11 12 // Arquivo: Teste.java package testes; import sistema.Conta; public class Teste { public static void main(String[] args) { Conta c = new Conta(); c.deposita(1000); System.out.println(c.getSaldo()); } }

5. Retire o modicador PUBLIC da classe C ONTA e observe o erro de compilao na classe T ESTE. Importante: faa a classe C ONTA ser pblica novamente.

105

K19 Treinamentos

Pacotes

www.k19.com.br

106

Captulo 13 Exceptions
Como erros podem ocorrer durante a execuo de uma aplicao, devemos denir como eles sero tratados. Tradicionalmente, cdigos de erro so utilizados para lidar com falhas na execuo de um programa. Nesta abordagem, os mtodos devolveriam nmeros inteiros para indicar o tipo de erro que ocorreu.
1 2 3 4 5 6 7

int deposita(double valor) { if(valor < 0) { return 107; // cdigo de erro para valor negativo } else { this.saldo += valor; } }

Utilizar cdigos de erro exige uma vasta documentao dos mtodos para explicar o que cada cdigo signica. Alm disso, esta abordagem gasta o retorno do mtodo impossibilitando que outros tipos de dados sejam devolvidos. Em outras palavras, ou utilizamos o retorno para devolver cdigos de erro ou para devolver algo pertinente a lgica natural do mtodo. No possvel fazer as duas coisas sem nenhum tipo de gambiarra.
1 2 3 4 5 6 7 8

??? geraRelatorio() { if(...) { return 200; // cdigo de erro tipo1 } else { Relatorio relatorio = ... return relatorio; } }

Observe que no cdigo do mtodo GERA R ELATORIO () seria necessrio devolver dois tipos de dados incompatveis: int e referncias de objetos da classe R ELATORIO. Porm, no possvel denir dois tipos incopatveis como retorno de um mtodo. A linguagem Java tem uma abordagem prpria para lidar com erros de execuo. Na abordagem do Java no so utilizados cdigos de erro ou os retornos dos mtodos. 107

Exceptions

13.1

Tipos de erros de execuo

O primeiro passo para entender a abordagem do Java para lidar com os erros de execuo saber classic-los. A classe T HROWABLE modela todos os tipos de erros de execuo. H duas subclasses de T HROWABLE: E RROR e E XCEPTION. A subclasse E RROR dene erros que no devem ser capturados pelas aplicaes pois representam erros graves que no permitem que a execuo continue de maneira satisfatria. A subclasse E XCEPTION dene erros para os quais as aplicaes normalmente tm condies de denir um tratamento.

13.2

Lanando erros

Tecnicamente, podemos criar um objeto de qualquer classe que deriva de T HROWABLE para representar um erro que foi identicado. Porm, conceitualmente, devemos utilizar apenas as classes que derivam de E XCEPTION. Depois de criar uma exception podemos lanar a referncia dela utilizando o comando THROW . Observe o exemplo utilizando a classe I LLEGAL A RGUMENT E XCEPTION que deriva indiretamente da classe E XCEPTION.
1 2 3 4 if(valor < 0) { IllegalArgumentException erro = new IllegalArgumentException(); throw erro; }

13.2.1

Checked e Unchecked

As exceptions so classicadas em checked e unchecked. Para identicar o tipo de uma exception, devemos considerar a rvore de herana da classe E XCEPTION.

www.k19.com.br

108

Exceptions As classes que derivam de E XCEPTION mas no derivam de RUNTIME E XCEPTION denem as chamadas checked-exceptions j as classes que derivam de RUNTIME E XCEPTION denem as chamadas unchecked-exceptions. Para um mtodo lanar uma unchecked-exception, basta utilizar o comando THROW como visto anteriormente. Para um mtodo lanar uma checked-exception, alm do comando THROW necessrio utilizar o comando THROWS. Observe o exemplo utilizando a classe I LLEGA L A RGUMENT E XCEPTION que deriva diretamente da classe RUNTIME E XCEPTION e a classe SQLE XCEPTION que deriva diretamente da classe E XCEPTION mas no da RUNTIME E XCEP TION .
1 2 3 4 5 6 7 // lanando uma unchecked-exception void deposita(double valor) { if(valor < 0) { IllegalArgumentException erro = new IllegalArgumentException(); throw erro; } }

1 2 3 4 5 6 7

// lanando uma unchecked-exception void deposita(double valor) throws SQLException { if(valor < 0) { SQLException erro = new SQLException(); throw erro; } }

13.3

Capturando erros

Em um determinado trecho de cdigo, para capturar uma exception devemos utilizar o comando TRY- CACTH.
1 2 3 4 5 6 7 8 9 10 11 class Teste { public static void main(String[] args) { Conta c = new Conta(); try { c.deposita(); } catch (IllegalArgumentException e) { System.out.println("Houve um erro ao depositar"); } } }

Podemos encadear vrios blocos CATCH para capturar exceptions de classes diferentes. 109 K19 Treinamentos

Exceptions
1 2 3 4 5 6 7 8 9 10 11 12 13 class Teste { public static void main(String[] args) { Conta c = new Conta(); try { c.deposita(); } catch (IllegalArgumentException e) { System.out.println("Houve uma IllegalArgumentException ao depositar"); } catch (SQLException e) { System.out.println("Houve uma SQLException ao depositar"); } } }

13.4

Exerccios

1. Crie um projeto no eclipse chamado Exceptions.

2. Crie uma classe para modelar os funcionrios do sistema do banco.

1 2 3 4 5 6 7 8 9 10

class Funcionario { private double salario; public void aumentaSalario(double aumento) { if(aumento < 0) { IllegalArgumentException erro = new IllegalArgumentException(); throw erro; } } }

3. Agora teste a classe F UNCIONARIO.

1 2 3 4 5 6

class TestaFuncionario { public static void main(String[] args) { Funcionairo f = new Funcionario(); f.aumentaSalario(-1000); } }

Execute e observe o erro no console.

4. Altere o teste para capturar o erro. www.k19.com.br 110

Exceptions
1 2 3 4 5 6 7 8 9 10 11 class TestaFuncionario { public static void main(String[] args) { Funcionairo f = new Funcionario(); try { f.aumentaSalario(-1000); } catch(IllegalArgumentException e) { System.out.println("Houve uma IllegalArgumentException ao aumentar o salrio"); } } }

111

K19 Treinamentos

Exceptions

www.k19.com.br

112

Captulo 14 Object
Todas as classes derivam direta ou indiretamente da classe JAVA . LANG .O BJECT. Consequentemente, todo contedo denido nessa classe estar presente em todos os objetos. Alm disso, qualquer referncia pode ser armazenada em uma varivel do tipo O BJECT. A ideia do polimorsmo pode ser aplicada para criar mtodos genricos que trabalham com objetos de qualquer classe.

14.1

Polimorsmo

Aproveitando o polimorsmo gerado pela herana da classe O BJECT, possvel criar uma classe para armazenar objetos de qualquer tipo como se fosse um repositrio de objetos.
1 2 3 class RepositorioDeObjetos { // codigo da classe }

Um array de objetos pode ser utilizado como estrutura bsica para manter os objetos do repositrio.
1 Object[] objetos = new Object[100];

Alguns mtodos podem ser criados para formar a interface do repositrio. Por exemplo, mtodos para adicionar, retirar e pesquisar elementos.
1 2 3 public void adiciona(Object o) { // implementacao }

1 2 3

public void remove(Object o) { // implementacao }

113

Object
1 2 3 public Object pega(int posicao) { // implementacao }

Com esses mtodos o repositrio teria a vantagem de armazenar objetos de qualquer tipo. Porm, na compilao, no haveria garantia sobre os tipos especcos. Em outras palavras, j que objetos de qualquer tipo podem ser armazenados no repositrio ento objetos de qualquer tipo podem sair dele.
1 2 3 Repositorio repositorio = new Repositorio(); repositorio.adiciona("Rafael"); Object o = repositorio.pega(0);

Por outro lado, na maioria dos casos, os programadores criam repositrios para armazenar objetos de um determinado tipo. Por exemplo, uma repositrio para armazenar somente nomes de pessoas, ou seja, para armazenar objetos do tipo JAVA . LANG .S TRING. Nesse caso, em tempo de compilao possvel forar o compilador a tratar os objetos como string.
1 2 3 4 Repositorio repositorio = new Repositorio(); repositorio.adiciona("Rafael"); Object o = repositorio.pega(0); String s = (String)o;

14.2

O mtodo toString()

Quando uma varivel de um tipo primitivo passada como parmetro para o mtodo PRIN TLN () o valor primitivo impresso na tela (sada padro).
1 2 int a = 10; System.out.println(a);

O que ser impresso quando uma varivel no primitiva passada como argumento para o mtodo PRINTLN ()? O mtodo PRINTLN () imprime na tela uma string que obtida atravs do mtodo TO STRING (). Todos os objetos possuem esse mtodo pois todas as classes derivam direta ou indiretamente da classe O BJECT que dene o TO S TRING (). A implementao padro do TO S TRING (), na classe O BJECT, devolve o nome da classe mais especca do objeto.
1 2 3 4 5 6 7 8 9 class Vetor { private double x; private double y; public Vetor(double x, double y) { this.x = x; this.y = y; } }

www.k19.com.br

114

Object
1 2 3 4 Vetor vetor = new Vetor(10,5); // imprime na tela: Vetor System.out.println(vetor);

O mtodo TO S TRING () pode ser reescrito para devolver uma string que faa mais sentido para o tipo de objeto correspondente a classe na qual a reescrita ocorrer. interface
1 2 3 4 5 6 7 8 class Vetor { // ATRIBUTOS // CONSTRUTOR public String toString() { return "(" + this.x + ", " + this.y + ")"; } }

1 2 3 4

Vetor vetor = new Vetor(10, 5); // imprime na tela: (10.0, 5.0) System.out.println(vetor);

14.3

O mtodo equals()

Para vericar se os valores armazenados em duas variveis de algum tipo primitivo so iguais, deve ser utilizado o operador == . Esse operador tambm pode ser aplicado em variveis de tipos no primitivos.
1 2 3 4 5 Vetor vetor1 = new Vetor(10, 5); Vetor vetor2 = new Vetor(10, 5); // imprime na tela: False System.out.println(vetor1 == vetor2);

O operador ==, aplicado em referncias, verica se elas apontam para o mesmo objeto na memria. Quando for necessrio comparar o contedo de dois objetos e no as suas localizaes na memria, o mtodo EQUALS () deve ser utilizado. Esse mtodo est presente em todos os objetos pois ele foi denido na classe O BJECT. A implementao padro do mtodo EQUALS () na classe O BJECT verica se os objetos esto localizados no mesmo lugar da memria. Esse mtodo deve ser reescrito caso seja necessrio comparar o contedo dos objetos. 115 K19 Treinamentos

Object
1 2 3 4 5 6 7 8 9 class Vetor { // ATRIBUTOS // CONSTRUTOR public boolean equals(Object o){ Vetor outro = (Vetor)o; return this.x == outro.x && this.y == outro.y; } }

O mtodo EQUALS () recebe como parmetro uma varivel do tipo O BJECT. Dessa forma, necessrio aplicar a ideia de casting de referncia para poder acessar o contedo do objeto denido na classe V ETOR. A implementao do mtodo EQUALS () no est correta pois ela gera um erro de execuo quando o parmetro no puder ser convertido para V ETOR. Para garantir que no ocorra um erro de execuo o tipo do objeto pode ser testado antes do casting.
1 2 3 4 5 6 7 8 9 public boolean equals(Object o){ if (o instaceof Vetor) { Vetor outro = (Vetor)o; return this.x == outro.x && this.y == outro.y; } else { return false; } }

O uso do mtodo EQUALS () anlogo ao de outro mtodo qualquer.


1 2 3 4 5 Vetor vetor1 = new Vetor(10, 5); Vetor vetor2 = new Vetor(10, 5); // imprime na tela: True System.out.println(vetor1.equals(vetor2));

14.4

Exerccios

1. Crie uma classe Lista capaz de armazenar objetos de qualquer tipo. 2. Crie uma classe Vetor anloga vista nesse captulo. 3. Reescreva o mtodo ToString na classe Vetor. 4. Reescreva o mtodo Equals na classe Vetor.

www.k19.com.br

116

Captulo 15 Entrada e Sada


No contexto do desenvolvimento de software, quando falamos em entrada e sada, estamos nos referindo a qualquer troca de informao entre uma aplicao e o seu exterior. A leitura do que o usurio digita no teclado, do contedo de um arquivo ou dos dados recebidos pela rede so exemplos de entrada de dados. A impresso de mensagens no console, escrita de texto em um arquivo ou envio de dados pela rede so exemplos de sada de dados. A plataforma Java oferece diversas classes e interfaces para facilitar o processo de entrada e sada.

15.1

Byte a Byte

Para determinadas situaes e problemas, necessrio que uma aplicao faa entrada e sada byte a byte. As classes da plataforma Java responsveis pela leitura e escrita byte a byte so I NPUT S TREAM e O UTPUT S TREAM respectivamente. Essas duas classes esto no pacote java.io. Veja um exemplo de leitura do teclado:
1 2 3 4 5 6 7 8 InputStream entrada = System.in; int i; do { i = entrada.read(); System.out.println("valor lido: " + i); } while (i != -1);

O uxo de entrada associado ao teclado representado pelo objeto referenciado pelo atributo esttico S YSTEM . IN. O mtodo READ () faz a leitura do prximo byte da entrada. Veja um exemplo de escrita no console:
1 2 3 4 5 6 OutputStream saida = System.out; saida.write(107); saida.write(49); saida.write(57); saida.flush();

117

Entrada e Sada O uxo de sada associado ao console representado pelo objeto referenciado pelo atributo esttico S YSTEM . OUT. O mtodo WRITE () armazena um byte(um valor entre 0 e 255) no buffer da sada. O mtodo FLUSH () libera o contedo do buffer para a sada. A classe I NPUT S TREAM genrica e modela um uxo de entrada sem uma fonte especca denida. Diversas classes herdam direta ou indiretamente da classe I NPUT S TREAM para especicar um determinado tipo de fonte de dados. Eis algumas classes que derivam da classe I NPUT S TREAM: AudioInputStream FileInputStream ObjectInputStream A classe O UTPUT S TREAM genrica e modela um uxo de sada sem um destino especco denido. Diversas classes herdam direta ou indiretamente da classe O UTPUT S TREAM para especicar um determinado tipo de destino de dados. Eis algumas classes que derivam da classe O UTPUT S TREAM: ByteArrayOutputStream FileOutputStream ObjectOutputStream

15.2

Scanner

Nem sempre necessrio fazer entrada byte a byte. Nestes casos, normalmente, mais simples utilizar a classe S CANNER do pacote java.util do Java. Esta classe possui mtodos mais sosticados para obter os dados de uma entrada. Veja um exemplo de leitura do teclado com a classe S CANNER:
1 2 3 4 5 6 7 InputStream entrada = System.in; Scanner scanner = new Scanner(entrada); while(scanner.hasNextLine()) { String linha = scanner.nextLine(); System.out.println(linha); }

Os objetos da classe S CANNER podem ser associados a diversas fontes de dados.


1 2 3 4 5 InputStream teclado = System.in; Scanner scannerTeclado = new Scanner(teclado); FileInputStream arquivo = new FileInputStream("arquivo.txt"); Scanner scannerArquivo = new Scanner(arquivo);

www.k19.com.br

118

Entrada e Sada

15.3

PrintStream

Nem sempre necessrio fazer sada byte a byte. Nestes casos, normalmente, mais simples utilizar a classe P RINT S TREAM do pacote java.io do Java. Esta classe possui mtodos mais sosticados para enviar dados para uma entrada. Veja um exemplo de escrita no console com a classe P RINT S TREAM:
1 2 3 4 OutputStream console = System.out; PrintStream printStream = new PrintStream(console); printStream.println("Curso de Java e Orientao da K19");

Os objetos da classe P RINT S TREAM podem ser associados a diversos destinos de dados.
1 2 3 4 5 OutputStream console = System.out; PrintStream printStreamConsole = new PrintStream(console); FileOutputStream arquivo = new FileOutputStream("arquivo.txt"); PrintStream printStreamArquivo = new PrintStream(arquivo);

15.4

Exerccios

1. Crie um projeto no eclipse chamado EntradaSaida. 2. Crie um teste para recuperar e imprimir na tela o contedo digitado pelo usurio no teclado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

import java.io.IOException; import java.io.InputStream; import java.util.Scanner; public class LeituraDoTeclado { public static void main(String[] args) throws IOException { InputStream teclado = System.in; Scanner scanner = new Scanner(teclado); while (scanner.hasNextLine()) { String linha = scanner.nextLine(); System.out.println(linha); } } }

OBS: Para nalizar o uxo de entrado do teclado digite CTRL+D no Linux ou CTRL+Z no Windows. 3. Crie um teste para recuperar e imprimir na tela o contedo de um arquivo. 119 K19 Treinamentos

Entrada e Sada
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import import import import java.io.FileInputStream; java.io.IOException; java.io.InputStream; java.util.Scanner;

public class LeituraDeArquivo { public static void main(String[] args) throws IOException { InputStream teclado = new FileInputStream("entrada.txt"); Scanner scanner = new Scanner(teclado); while (scanner.hasNextLine()) { String linha = scanner.nextLine(); System.out.println(linha); } } }

OBS: O arquivo entrada.txt deve ser criado no diretrio raiz do projeto EntradaSaida. 4. Crie um teste para imprimir algumas linhas em um arquivo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; public class EscritaDeArquivo { public static void main(String[] args) throws IOException { FileOutputStream arquivo = new FileOutputStream("saida.txt"); PrintStream printStream = new PrintStream(arquivo); printStream.println("Primeira linha!!!"); printStream.println("Segunda linha!!!"); printStream.println("Terceira linha!!!"); } }

OBS: O projeto EntradaSaida deve ser atualizado para que o arquivo saida.txt seja mostrado no eclipse. 5. (Opcional) Crie um teste que faa a leitura do contedo de um arquivo e grave em outro arquivo. 6. (Opcional) Crie um teste que faa a leitura do teclado e grave em arquivo.

www.k19.com.br

120

Captulo 16 Collections
Quando uma aplicao precisa manipular uma quantidade grande de dados, ela deve utilizar alguma estrutura de dados. Podemos dizer que a estrutura de dados mais bsica do Java so os arrays. Muitas vezes, trabalhar diretamente com arrays no simples dado as diversas limitaes que eles possuem. A limitao principal a capacidade xa, um array no pode ser redimensionado. Se todas as posies de um array estiverem ocupadas no podemos adicionar mais elementos. Normalmente, criamos um outro array com maior capacidade e transferimos os elementos do array antigo para o novo. Alm disso, adicionar ou remover elementos provavelmente gera a necessidade de deslocar parte do contedo do array. As diculdades do trabalho com array podem ser superadas com estruturas de dados mais sosticadas. Na biblioteca do Java, h diversas estruturas de dados que facilitam o trabalho do desenvolvedor.

16.1

Listas

As listas so estruturas de dados de armazenamento sequencial assim como os arrays. Mas, diferentemente dos arrays, as listas no possuem capacidade xa o que facilita bastante o trabalho. L IST a interface Java que dene os mtodos que uma lista deve implementar. As principais implementaes da interface L IST so: A RRAY L IST, L INKED L IST e V ECTOR. Cada implementao possui suas caractersticas sendo apropriadas para contextos diferentes.
1 ArrayList arrayList = new ArrayList();

LinkedList linkedList = new LinkedList();

Vector vector = new Vector();

121

Collections Podemos aplicar o polimorsmo e referenciar objetos criados a partir das classes: A RRAYL IST, L INKED L IST e V ECTOR como L IST.
1 List list = new ArrayList();

List list = new LinkedList();

List list = new Vector();

16.1.1

Mtodo: add(Object)

O mtodo ADD (O BJECT ) adiciona uma referncia no nal da lista e aceita referncias de qualquer tipo.
1 2 3 4 5 6 List list = ... list.add(258); list.add("Rafael Cosentino"); list.add(1575.76); list.add("Marcelo Martins");

16.1.2

Mtodo: add(int, Object)


ADD ( INT,

O mtodo lista.
1 2 3 4 5 6

O BJECT ) adiciona uma referncia em uma determinada posio da

List list = ... list.add(0, list.add(1, list.add(1, list.add(3, "Jonas Hirata"); "Rafael Cosentino"); "Marcelo Martins"); "Thiago Thies");

16.1.3

Mtodo: size()

O mtodo SIZE () informa a quantidade de elementos armazenado na lista. www.k19.com.br 122

Collections
1 2 3 4 5 6 7 8 9 List list = ... list.add("Jonas Hirata"); list.add("Rafael Cosentino"); list.add("Marcelo Martins"); list.add("Thiago Thies"); // quantidade = 4 int quantidade = list.size();

16.1.4

Mtodo: clear()

O mtodo CLEAR () remove todos os elementos da lista.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 List list = ... list.add("Jonas Hirata"); list.add("Rafael Cosentino"); list.add("Marcelo Martins"); list.add("Thiago Thies"); // quantidade = 4 int quantidade = list.size(); list.clear(); // quantidade = 0 quantidade = list.size();

16.1.5

Mtodo: contains(Object)
CON -

Para vericar se um elemento est contido em uma lista podemos utilizar o mtodo
TAINS (O BJECT )
1 2 3 4 5 6 7 8 9 10 List list = ... list.add("Jonas Hirata"); list.add("Rafael Cosentino"); // x = true boolean x = list.contains("Jonas Hirata"); // x = false x = list.contains("Daniel Machado");

16.1.6

Mtodo: remove(Object)

Podemos retirar elementos de uma lista atravs do mtodo REMOVE (O BJECT ). Este mtodo remove a primeira ocorrncia do elemento passado como parmetro. 123 K19 Treinamentos

Collections
1 2 3 4 5 6 7 8 9 10 11 List list = ... list.add("Jonas Hirata"); // x = true boolean x = list.contains("Jonas Hirata"); list.remove("Jonas Hirata"); // x = false x = list.contains("Jonas Hirata");

16.1.7

Mtodo: remove(int)

Outra maneira para retirar elementos de uma lista atravs do mtodo REMOVE ( INT ).
1 2 3 4 5 6 7 8 9 10 11 List list = ... list.add("Jonas Hirata"); // x = true boolean x = list.contains("Jonas Hirata"); list.remove(0); // x = false x = list.contains("Jonas Hirata");

16.1.8

Mtodo: get(int)

Para recuperar um elemento de uma determinada posio de uma lista podemos utilizar o mtodo GET ( INT ).
1 2 3 4 5 6 List list = ... list.add("Jonas Hirata"); // nome = "Jonas Hirata" String nome = list.get(0);

16.1.9

Mtodo: indexOf(Object)

Para descobrir o ndice da primeira ocorrncia de um determinado elemento podemos utilizar o mtodo INDEX O F (O BJECT ).
1 2 3 4 5 6 List list = ... list.add("Jonas Hirata"); // indice = 0 int indice = list.indexOf("Jonas Hirata");

www.k19.com.br

124

Collections

16.1.10

Benchmarking

As trs principais implementaes da interface L IST (A RRAY L IST, L INKED L IST e V EC TOR ) possuem desempenho diferentes para cada operao. O desenvolvedor deve escolher a implementao de acordo com a sua necessidade. Operao Adicionar ou Remover do nal da lista Adicionar ou Remover do comeo da lista Acessar elementos pela posio ArrayList LinkedList

Os mtodos da classe V ECTOR possui desempenho um pouco pior do que os da classe A RRAY L IST. Porm, a classe V ECTOR implementa lgica de sincronizao de threads.

16.2

Exerccios

1. Crie um projeto no eclipse chamado Collections. 2. Vamos calcular o tempo das operaes principais das listas.

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

import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class TestaAdicionaNoFinal { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); LinkedList linkedList = new LinkedList(); long tempo = TestaAdicionaNoFinal.AdicionaNoFinal(arrayList); System.out.println("ArrayList: " + tempo + "ms"); tempo = TestaAdicionaNoFinal.AdicionaNoFinal(linkedList); System.out.println("LinkedList: " + tempo + "ms"); } public static long AdicionaNoFinal(List lista) { long inicio = System.currentTimeMillis(); int size = 100000; for (int i = 0; i < size; i++) { lista.add(i); } long fim = System.currentTimeMillis(); return fim - inicio; } }

125

K19 Treinamentos

Collections
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 import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class TestaAdicionaNoComeco { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); LinkedList linkedList = new LinkedList(); long tempo = TestaAdicionaNoComeco.AdicionaNoComeco(arrayList); System.out.println("ArrayList: " + tempo + "ms"); tempo = TestaAdicionaNoComeco.AdicionaNoComeco(linkedList); System.out.println("LinkedList: " + tempo + "ms"); } public static long AdicionaNoComeco(List lista) { long inicio = System.currentTimeMillis(); int size = 100000; for (int i = 0; i < size; i++) { lista.add(0, i); } long fim = System.currentTimeMillis(); return fim - inicio; } }

www.k19.com.br

126

Collections
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 import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class TestaGet { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); LinkedList linkedList = new LinkedList(); long tempo = TestaGet.Get(arrayList); System.out.println("ArrayList: " + tempo + "ms"); tempo = TestaGet.Get(linkedList); System.out.println("LinkedList: " + tempo + "ms"); } public static long Get(List lista) { int size = 100000; for (int i = 0; i < size; i++) { lista.add(i); } long inicio = System.currentTimeMillis(); for (int i = 0; i < size; i++) { lista.get(i); } long fim = System.currentTimeMillis(); return fim - inicio; } }

3. (Opcional) Teste o desempenho para remover elementos do comeo ou do m das listas.

16.3

Conjuntos

Os conjuntos diferem das listas pois no permitem elementos repetidos e no possuem ordem. Como os conjuntos no possuem ordem as operaes baseadas em ndice que existem nas listas no aparecem nos conjuntos. S ET a interface Java que dene os mtodos que um conjunto deve implementar. As principais implementaes da interface S ET so: H ASH S ET e T REE S ET. Cada implementao possui suas caractersticas sendo apropriadas para contextos diferentes.

16.4

Colees

H semelhanas conceituais entre os conjuntos e as listas por isso existe uma super interface chamada C OLLECTION para as interfaces L IST e S ET. 127 K19 Treinamentos

Collections

Dessa forma, podemos referenciar como C OLLECTION qualquer lista ou conjunto.

16.5

Exerccios

4. Vamos comparar o tempo do mtodo CONTAINS () das listas e dos conjuntos.

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

import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; public class TestaContains { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); HashSet hashSet = new HashSet(); long tempo = TestaContains.Contains(arrayList); System.out.println("ArrayList: " + tempo + "ms"); tempo = TestaContains.Contains(hashSet); System.out.println("HashSet: " + tempo + "ms"); } public static long Contains(Collection colecao) { int size = 100000; for (int i = 0; i < size; i++) { colecao.add(i); } long inicio = System.currentTimeMillis(); for (int i = 0; i < size; i++) { colecao.contains(i); } long fim = System.currentTimeMillis(); return fim - inicio; } }

www.k19.com.br

128

Collections

16.6

Lao foreach

As listas podem ser iteradas com um lao FOR tradicional.


1 2 3 4 5 List lista = ... for(int i = 0; i < lista.size(); i++) { Object x = lista.get(i); }

Porm, como os conjuntos no so baseados em ndice eles no podem ser iterados com um lao FOR tradicional. Alm disso, mesmo para as listas o FOR tradicional nem sempre eciente pois o mtodo GET () para determinadas implementaes de lista lento (ex: L INKE D L IST ). A maneira mais eciente para percorrer uma coleo utilizar um lao foreach.
1 2 3 4 5 Collection colecao = ... for(Object x : colecao) { }

16.7

Generics

As colees armazenam referncias de qualquer tipo. Dessa forma, quando recuperamos um elemento de uma coleo temos que trabalhar com referncias do tipo O BJECT.
1 2 3 4 5 6 7 Collection colecao = ... colecao.add("Rafael Cosentino"); for(Object x : colecao) { System.out.println(x); }

Porm, normalmente, precisamos tratar os objetos de forma especca pois queremos ter acesso aos mtodos especcos desses objetos. Nesses casos, devemos fazer casting nas referncias.
1 2 3 4 5 6 7 8 Collection colecao = ... colecao.add("Rafael Cosentino"); for(Object x : colecao) { String s = (String)x; System.out.println(s.toUpperCase()); }

O casting de referncia arriscado pois em tempo de compilao no temos garantia que ele est correto. Dessa forma, corremos o risco de obter um erro de execuo. 129 K19 Treinamentos

Collections Para ter certeza da tipagem dos objetos em tempo de compilao, devemos aplicar o recurso do Generics. Com este recurso podemos determinar o tipo de objeto que queremos armazenar em uma coleo no momento em que ela criada. A partir da, o compilador no permitir que elementos no compatveis com o tipo escolhido sejam adicionados na coleo. Isso garante o tipo do elemento no momento em que ele recuperado da coleo e elimina a necessidade de casting.

1 2 3 4 5 6 7

Collection<String> colecao = new HashSet<String>(); colecao.add("Rafael Cosentino"); for(String x : colecao) { System.out.println(x.toUpperCase()); }

16.8

Exerccios

5. Vamos testar o desempenho do FOR tradicional e do foreach. www.k19.com.br 130

Collections
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 import java.util.LinkedList; import java.util.List; public class TestaContains { public static void main(String[] args) { LinkedList<Integer> linkedList = new LinkedList<Integer>(); int size = 100000; for (int i = 0; i < size; i++) { linkedList.add(i); } long tempo = TestaContains.forTradicional(linkedList); System.out.println("For Tradicional: " + tempo + "ms"); tempo = TestaContains.foreach(linkedList); System.out.println("Foreach: " + tempo + "ms"); } public static long forTradicional(List<Integer> lista) { long inicio = System.currentTimeMillis(); for (int i = 0; i < lista.size(); i++) { int x = lista.get(i); } long fim = System.currentTimeMillis(); return fim - inicio; } public static long foreach(List<Integer> lista) { long inicio = System.currentTimeMillis(); for (int x : lista) { } long fim = System.currentTimeMillis(); return fim - inicio; } }

131

K19 Treinamentos

Collections

www.k19.com.br

132

Captulo 17 Apndice -Swing


A plataforma Java oferece recursos sosticados para construo de interfaces grcas de usurio GUI. Esses recursos fazem parte do framework Java Foundation Classes (JFC). Eis uma viso geral do JFC: Java Web Start: Permite que aplicaes Java sejam facilmente implantadas nas mquinas dos usurios. Java Plug-In: Permite que applets executem dentro dos principais navegadores. Java 2D: Possibilita a criao de imagens e grcos 2D. Java 3D: Possibilita a manipulao de objetos 3D. Java Sound: Disponibiliza a manipulao de sons para as aplicaes Java. AWT (Abstract Window Toolkit): Conjunto bsico de classes e interfaces que denem os componentes de uma janela desktop. AWT a base para Java Swing API. Swing: Conjunto sosticado de classes e interfaces que denem os componentes visuais e servios necessrios para construir uma interface grca de usurio.

17.1

Componentes

Os itens que aparecem em uma interface grca de usurio (janelas, caixas de texto, botes, listas, caixas de seleo, entre outros) so chamados de componentes. Alguns componentes podem ser colocados dentro de outros componentes, por exemplo, uma caixa de texto dentro de uma janela. O primeiro passo para construir uma interface grca de usurio conhecer os principais componentes do Java Swing API.

17.1.1

JFrame

A classe JF RAME dene janelas com ttulo, borda e alguns itens denidos pelo sistema operacional como boto para minimizar ou maximizar. 133

Apndice -Swing
1 2 3 JFrame frame = new JFrame("K19 - Java OO"); frame.setSize(300, 200); frame.setVisible(true);

possvel associar uma das aes abaixo ao boto de fechar janela. DO_NOTHING_ON_CLOSE: No faz nada. HIDE_ON_CLOSE: Esconde a janela (Padro no JF RAME). DISPOSE_ON_CLOSE: Fecha a janela (Mais utilizado em janelas internas). EXIT_ON_CLOSE: Fecha a aplicao (System.exit(0)).

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Por padro, o visual das janelas utiliza o estilo denido pelo sistema operacional. Mas, podemos alterar esse comportamento padro.

17.1.2

JPanel

A classe JPANEL dene um componente que basicamente utilizado para agrupar nas janelas outros componentes como caixas de texto, botes, listas, entre outros. Normalmente, criamos um objeto da classe JPANEL e associamos a um objeto da classe JF RAME para agrupar todo o contedo da janela.
1 2 3 4 5 JFrame frame = new JFrame("K19 - Java OO"); JPanel panel = new JPanel(); frame.setContentPane(panel);

17.1.3

JTextField e JLabel

A classe JT EXT F IELD dene os campos de texto que podem ser preenchidos pelo usurio. A classe JL ABEL dene rtulos que podem ser utilizados por exemplo em caixas de texto. www.k19.com.br 134

Apndice -Swing
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 JFrame frame = new JFrame("K19 - Java OO"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); JLabel rotulo = new JLabel(); rotulo.setText("Nome: "); panel.add(rotulo); JTextField textField = new JTextField(40); panel.add(textField); frame.setContentPane(panel); frame.pack(); frame.setVisible(true);

17.1.4

JTextArea

Para textos maiores podemos aplicar o componente denido pela classe JT EXTA REA.
1 JTextArea textArea = new JTextArea(10, 20);

17.1.5

JPasswordField

Em formulrios que necessitam de caixa de texto para digitar senhas, podemos aplicar o componente denido pela classe JPASSWORD F IELD. O contedo digitado na caixa de texto gerado pelo componente da classe JPASSWORD F IELD no apresentado ao usurio.
1 JPasswordField passwordField = new JPasswordField(20);

135

K19 Treinamentos

Apndice -Swing

17.1.6

JButton

Os botes que permitem que os usurios indiquem quais aes ele deseja que a aplicao execute podem ser criados atravs do componente denido pela classe JB UTTON.
1 2 3 4 5 JButton button1 = new JButton("SIM"); JButton button2 = new JButton("NO"); JButton button3 = new JButton("CANCEL");

17.1.7

JCheckBox

Podemos criar formulrios com checkboxs utilizando o componente da classe JC HECK B OX.
1 2 3 4 5 JCheckBox checkBox1 = new JCheckBox("Rafael Cosentino"); JCheckBox checkBox2 = new JCheckBox("Jonas Hirata"); JCheckBox checkBox3 = new JCheckBox("Marcelo Martins");

17.1.8

JComboBox

Podemos criar formulrios com comboboxs utilizando o componente da classe JC OMBO B OX.
1 2 3 4 5 6 String[] items[0] items[1] items[2] items = new String[3]; = "Rafael Cosentino"; = "Jonas Hirata"; = "Marcelo Martins";

JComboBox comboBox = new JComboBox(items);

www.k19.com.br

136

Apndice -Swing

17.2

Layout Manager

Muitas pessoas consideram que uma das tarefas mais complicadas quando se utiliza a Java Swing API o posicionamento e o tamanho dos componentes. Posicionamento e tamanho dos componentes Java Swing so controlados por Layout Managers. Um Layout Manager um objeto Java associado a um componente Java Swing que na maioria dos casos um componente de background como uma janela ou um painel. Um Layout Manager controla os componentes que esto dentro do componente ao qual ele est associado. Os quatro principais Layout Managers do Java Swing so:

BorderLayout: Esse Layout Manager divide a rea de um componente de background em cinco regies (norte, sul, leste, oeste e centro). Somente um componente pode ser adicionado em cada regio. Eventualmente, o BorderLayout altera o tamanho preferencial dos componentes para torn-los compatveis com o tamanho das regies. O BorderLayout o Layout Manager padro de um JFrame.

FlowLayout: Esse Layout Manager arranja os componentes da esquerda para direita e quando o tamanho horizontal no suciente ele pula para a prxima linha. O FlowLayout no altera o tamanho preferencial dos componentes. O FlowLayout o Layout Manager padro de um JPanel.

BoxLayout: Esse Layout Manager arranja os componentes de cima para baixo quebrando linha a cada componente adicionado. O BoxLayout no altera o tamanho preferencial dos componentes. 137 K19 Treinamentos

Apndice -Swing

GridLayout: Esse Layout Manager divide a rea de um componente de background em clulas semelhantemente a uma tabela. As clulas possuem o mesmo tamanho.

17.3

Events, Listeners e Sources

A principal funo de uma interface grca de usurio permitir interao entre usurios e aplicao. Os usurios interagem com uma aplicao clicando em botes, preenchendo caixas de texto, movimentando o mouse, entre outros. Essas aes dos usurios disparam eventos que so processados pela aplicao atravs de listeners (callbacks). Para criar um listener, devemos implementar a interface correspondente ao tipo de evento que queremos tratar. Eis algumas das interfaces que devemos implementar quando queremos criar um listener. ActionListener: Essa interface deve ser implementada quando desejamos tratar eventos como por exemplo cliques em botes, seleo de items de um menu ou teclar enter dentro de uma caixa de texto. MouseListener: Essa interface deve ser implementada quando desejamos tratar eventos como clique dos botes do mouse. KeyListener: Essa interface deve ser implementada quando desejamos tratar eventos de pressionar ou soltar teclas do teclado.

17.3.1

Exemplo

Vamos criar um listener para executar quando o usurio clicar em um boto. O primeiro passo denir uma classe que implemente ACTION L ISTENER. www.k19.com.br 138

Apndice -Swing
1 2 3 4 5 6 class MeuListener implements ActionListener { public void actionPerformed(ActionEvent e) { JButton button = (JButton) e.getSource(); button.setText("clicado"); } }

O mtodo ACTION P ERFORMED () dever ser executado quando algum boto for clicado pelo usurio. Perceba que este mtodo recebe um referncia de um objeto da classe ACTIO N E VENT que representa o evento que ocorreu. Atravs do objeto que representa o evento do clique do usurio em algum boto podemos recuperar a fonte do evento que no caso o prprio boto com o mtodo GET S OURCE () e alterar alguma caracterstica da fonte. O segundo passo associar esse listener aos botes desejados.

1 2 3 4 5 6 7

JButton button1 = new JButton("ACAO1"); JButton button2 = new JButton("ACAO2"); MeuListener listener = new MeuListener(); button1.addActionListener(listener); button2.addActionListener(listener);

17.4

Exerccios

1. Crie um projeto no eclipse chamado Swing.

2. Crie uma tela de login com caixas de texto e rtulos para o nome de usurio e senha e um boto para logar. 139 K19 Treinamentos

Apndice -Swing
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 public class Teste { public static void main(String[] args) { JFrame frame = new JFrame("K19 - Login"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); JLabel label1 = new JLabel("Usurio: "); JTextField textField = new JTextField(20); JLabel label2 = new JLabel("Senha: "); JPasswordField passwordField = new JPasswordField(20); JButton button = new JButton("Logar"); panel.add(label1); panel.add(textField); panel.add(label2); panel.add(passwordField); panel.add(button); frame.setContentPane(panel); frame.pack(); frame.setVisible(true); } }

3. Redimensione a janela e observe o que ocorre com os elementos e pense o que determina o comportamento observado. 4. Altere o Layout Manager do painel utilizado na tela de login para G RID L AYOUT adicionando a linha a seguir logo aps a criao do JPANEL.
1 panel.setLayout(new GridLayout(3, 2));

Execute novamente o teste e observe o resultado. Depois tente redimensionar a tela para observar o comportamento. 5. (Opcional) Observando a tela obtida no exerccio anterior, vericamos que o boto colocado na primeira coluna do grid gerado pelo G RID L AYOUT. Tente fazer o boto aparecer na segunda coluna.

www.k19.com.br

140

Captulo 18 Apndice -Threads


Se pensarmos nos programas que utilizamos comumente no dia a dia, conseguiremos chegar a seguinte concluso: um programa executa um conjunto de tarefas relativamente independentes entre si. Por exemplo, um navegador pode baixar vrios arquivos diferentes alm de permitir a navegao. Um software de visualizao de vdeos alm de reproduzir imagens tambm reproduzir sons. Se pensarmos em sistemas corporativos, tambm chegamos na mesma concluso: um sistema corporativo executa um conjunto de tarefas relativamente independentes entre si. Por exemplo, dois ou mais usurios acessando o mesmo sistema para fazer coisas diferentes. J que um programa ou um sistema corporativo executa tarefas relativamente independentes entre si podemos pensar em execut-las simultaneamente. A primeira grande limitao para executar tarefas simultaneamente a quantidade de unidades de processamento (cpus) disponveis. Em geral, a regra para saber quantas tarefas podemos executar simultaneamente bem simples: se temos N unidades de processamento podemos executar no mximo N tarefas. Uma exceo a essa regra ocorre quando a tecnologia hyperthreding aplicada. Essa tecnologia permite o aproveitamento do tempo ocioso de uma cpu. Geralmente, a quantidade de tarefas que desejamos executar maior do que a quantidades de cpus. Supondo que as tarefas sejam executadas sem interrupo do comeo at o m ento com alta probabilidade teramos constantemente um cenrio com todas as cpus ocupadas com tarefas grandes e demoradas e diversas tarefas menores que poderiam ser executadas rapidamente esperando em uma la. Esse cenrio no adequado para sistema com alta interatividade com usurios pois diminui a sua responsividade (o efeito de uma ao do usurio demora). Para aumentar a responsividade das aplicaes, o sistema operacional faz um revezamento das tarefas que precisam executar. Isso evita que tarefas demoradas travem a utilizao das cpus tornando a interatividade mais satisfatria. O trabalho do desenvolvedor denir quais so as tarefas que uma aplicao deve realizar e determinar quando elas devem executar.

18.1

Denindo Tarefas - (Runnables)

Para denir as tarefas que uma aplicao Java deve executar, devemos criar classes que implementam a interface RUNNABLE. Essa interface possui apenas um mtodo (RUN ()). O 141

Apndice -Threads mtodo RUN () conceitualmente anlogo ao mtodo MAIN () pois o primeiro funciona como ponto de partida de uma tarefa de uma aplicao o segundo funciona como ponto de partida de uma aplicao. Veja alguns exemplos de tarefas denidas em Java implementando a interface RUNNABLE:
1 2 3 4 5 6 7 class TarefaImprimeOi implements Runnable { public void run() { for(int i = 0; i < 100; i++) { System.out.println("OI"); } } }

1 2 3 4 5 6 7 8 9

class TarefaSomaAte100 implements Runnable { public void run() { int soma = 0; for(int i = 1; i <= 100; i++) { soma += i; } System.out.println(soma); } }

18.2

Executando Tarefas

As tarefas so executadas dentro de objetos da classe T HREAD. Ento, para cada tarefa que desejamos executar, devemos criar um objeto da classe T HREAD e associ-lo a tarefa.
1 2 3 4 5 6 7 TarefaImprimeOi tarefa1 = new TarefaImprimeOi(); TarefaImprimeOi tarefa2 = new TarefaImprimeOi(); TarefaSomaAte100 tarefa3 = new TarefaSomaAte100(); Thread thread1 = new Thread(tarefa1); Thread thread2 = new Thread(tarefa2); Thread thread3 = new Thread(tarefa3);

Depois de associar uma tarefa (objeto de uma classe que implementa RUNNABLE) a um objeto da classe T HREAD, devemos disparar a execuo da thread atravs do mtodo START ().
1 2 3 TarefaImprimeOi tarefa = new TarefaImprimeOi(); Thread thread = new Thread(tarefa); thread.start();

Podemos disparar diversas threads e elas podero ser executadas simultaneamente de acordo com o revezamento que a mquina virtual e o sistema operacional aplicarem.

18.3

Exerccios

1. Crie um projeto no eclipse chamado Threads. www.k19.com.br 142

Apndice -Threads 2. Dena uma tarefa para imprimir mensagens na tela.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 class TarefaImprimeMensagens implements Runnable { private String msg; public TarefaImprimeMensagens(String msg) { this.msg = msg; } public void run() { for(int i = 0; i < 100000; i++) { System.out.println(i + " : " + this.msg); } } }

3. Crie tarefas e associe-as com threads para execut-las.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Teste { public static void main(String[] args) { TarefaImprimeMensagens tarefa1 = new TarefaImprimeMensagens("K19"); TarefaImprimeMensagens tarefa2 = new TarefaImprimeMensagens("Java"); TarefaImprimeMensagens tarefa3 = new TarefaImprimeMensagens("Web"); Thread thread1 = new Thread(tarefa1); Thread thread2 = new Thread(tarefa2); Thread thread3 = new Thread(tarefa3); thread1.start(); thread2.start(); thread3.start(); } }

Execute o teste!

18.4

Controlando a Execuo das Tarefas

Controlar a execuo das tarefas de uma aplicao pode ser bem complicado. Esse controle envolve, por exemplo, decidir quando uma tarefa pode executar, quando no pode, a ordem na qual duas ou mais tarefas devem ser executadas, etc. A prpria classe T HREAD oferece alguns mtodos para controlar a execuo das tarefas de uma aplicao. Veremos o funcionamento alguns desses mtodos.

18.4.1

sleep()

Durante a execuo de uma thread, se o mtodo SLEEP () for chamado a thread car sem executar pelo menos durante a quantidade de tempo passada como parmetro para este mtodo.
1 2 // Faz a thread corrente dormir por 3 segundos Thread.sleep(3000);

143

K19 Treinamentos

Apndice -Threads InterruptedException Uma thread que est dormindo pode ser interrompida por outra thread. Quando isso ocorrer, a thread que est dormindo recebe uma I NTERRUPTED E XCEPTION.
1 2 3 4 5 try { Thread.sleep(3000); } catch (InterruptedException e) { }

18.4.2

join()

Uma thread pode pedir para esperar o trmino de outra thread para continuar a execuo atravs do mtodo JOIN (). Esse mtodo tambm pode lanar uma I NTERRUPTED E XCEPTION.
1 2 3 4 5 6 7 8 9 TarefaImprimeMensagens tarefa = new TarefaImprimeMensagens("K19"); Thread thread = new Thread(tarefa); thread.start(); try { thread.join(); } catch (InterruptedException e) { }

18.5

Exerccios

4. Altere a classe TAREFA I MPRIME M ENSAGENS do projeto Threads, adicionando uma chamada ao mtodo SLEEP ().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class TarefaImprimeMensagens implements Runnable { private String msg; public TarefaImprimeMensagens(String msg) { this.msg = msg; } public void run() { for(int i = 0; i < 100000; i++) { System.out.println(i + " : " + this.msg); if(i % 1000 == 0) { try { Thread.sleep(100); } catch (InterruptedException e) { } } } } }

www.k19.com.br

144

Apndice -Threads Execute o teste novamente! 5. Crie um nova classe para testar o mtodo JOIN ()
1 2 3 4 5 6 7 8 9 10 11 12 13 class Teste2 { public static void main(String[] args) throws InterruptedException { TarefaImprimeMensagens tarefa = new TarefaImprimeMensagens("K19"); Thread thread = new Thread(tarefa); thread.start(); thread.join(); System.out.println("FIM"); } }

Execute o segundo teste e observe a mensagem FIM no console. Depois, comente a linha do mtodo JOIN () e verique o que mudou.

145

K19 Treinamentos

Apndice -Threads

www.k19.com.br

146

Captulo 19 Apndice - Socket


Os computadores ganham muito mais importncia quando conectados entre si para trocar informaes. A troca de dados entre computadores de uma mesma rede realizada atravs de sockets. Um socket permite que um computador receba ou envia dados para outros computadores da mesma rede.

19.1

Socket

A classe S OCKET dene o funcionamento dos sockets em Java.


1 Socket socket = new Socket("184.72.247.119", 1000);

Um dos construtores da classe S OCKET recebe o ip e a porta da mquina que queremos nos conectar. Aps a conexo atravs do socket ser estabelecida, podemos criar um objeto da classe P RINT S TREAM e outro da classe S CANNER associados ao socket para facilitar o envio e o recebimento dados respectivamente.
1 2 3 4 5 Socket socket = new Socket("184.72.247.119", 1000); PrintStream saida = new PrintStream(socket.getOutputStream()); Scanner entrada = new Scanner(socket.getInputStream());

O funcionamento da classe P RINT S TREAM e S CANNER foi visto no captulo 15.

19.2

ServerSocket

Um server socket um tipo especial de socket. Ele deve ser utilizado quando desejamos que uma aplicao seja capaz de aguardar que outras aplicaes possivelmente em outras mquinas se conectem a ela. A classe S ERVER S OCKET dene o funcionamento de um server socket.s 147

Apndice - Socket
1 2 3 ServerSocket severSocket = new ServerSocket(1000); Socket socket = serverSocket.accept();

Um dos construtores da classe S ERVER S OCKET recebe a porta que ser utilizada pelas aplicaes que querem estabelecer uma conexo com a aplicao do server socket. O mtodo ACCEPT () espera alguma aplicao se conectar na porta do server socket. Quando isso acontecer, o mtodo ACCEPT () cria um novo socket em outra porta associado aplicao que se conectou para realizar a troca de dados e liberar a porta do server socket para outras aplicaes que desejem se conectar. Se uma aplicao deseja permitir que diversas aplicao se conectem a ela ento necessrio chamar vrias vezes o mtodo ACCEPT (). Este mtodo pode ser colocado em um lao.
1 2 3 4 5 6 ServerSocket severSocket = new ServerSocket(1000); while(true) { Socket socket = serverSocket.accept(); }

Cada iterao do lao acima estabelece uma conexo nova com uma aplicao cliente.

19.3

Exerccios

1. Crie um projeto no eclipse chamado Sockets.

2. Crie o cdigo de uma aplicao servidora.

1 2 3 4 5 6 7 8 9 10 11

public class Servidor { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(10000); Socket socket = serverSocket.accept(); PrintStream saida = new PrintStream(socket.getOutputStream()); saida.println("Voc se conectou ao servidor da K19!"); } }

3. Crie o cdigo de uma aplicao cliente. www.k19.com.br 148

Apndice - Socket
1 2 3 4 5 6 7 8 9 10 11 public class Cliente { public static void main(String[] args) throws Exception { Socket socket = new Socket("127.0.0.1", 10000); Scanner entrada = new Scanner(socket.getInputStream()); String linha = entrada.nextLine(); System.out.println(linha); } }

4. Abra um terminal, entre na pasta bin do projeto Sockets e execute a classe S ERVIDOR.

5. Abra outro terminal, entre na pasta bin do projeto Sockets e execute a classe C LIENTE. 149 K19 Treinamentos

Apndice - Socket

www.k19.com.br

150

Captulo 20 Apndice - Chat K19


20.1 Arquitetura do Sistema

O sistema de chat da K19 dividido em aplicao servidora e aplicao cliente. A aplicao servidora no possuir interface grca e sua principal tarefa distribuir as mensagens enviadas pelos usurios. A aplicao cliente possuir interface grca que permita que um usurio envie e receba mensagens. Criaremos neste captulo um esqueleto de cada uma das principais classes do sistema de chat da K19.

20.2
20.2.1

Aplicao servidora
Registrador

Na aplicao servidora, um objeto registrador deve esperar novos usurios do chat da K19 e realizar todo processo de registro de novos usurios quando algum chegar.
1 2 3 4 5 public class Registrador { public void aguardaUsuario() { } }

20.2.2

Receptor

Para cada usurio cadastrado no chat da K19 deve ser criado um objeto da classe R ECEP TOR . A tarefa de um objeto da classe R ECEPTOR aguardar as mensagens enviadas pelo usurio correspondente.
1 2 3 4 5 public class Receptor { public void aguardaMensagens() { } }

151

Apndice - Chat K19

20.2.3

Emissor

Para cada usurio cadastrado no chat da K19 deve ser criado um objeto da classe E MIS SOR . A tarefa de um objeto da classe E MISSOR enviar as mensagens do chat para o usurio correspondente.
1 2 3 4 5 public class Emissor { public void envia(String mensagem) { } }

20.2.4

Distribuidor

Na aplicao servidora, deve existir um objeto da classe D ISTRIBUIDOR que tem como tarefa receber as mensagens dos receptores e repass-las para os emissores.
1 2 3 4 5 public class Distribuidor { public void distribuiMensagem(String mensagem) { } }

20.3
20.3.1

Aplicao cliente
EmissorDeMensagem

Na aplicao cliente, deve existir um objeto da classe E MISSOR D E M ENSAGEM que envia as mensagens digitadas pelo usurio para a aplicao servidora.
1 2 3 4 5 public class EmissorDeMensagem { public void enviaMensagem(String mensagem) { } }

20.3.2

ReceptorDeMensagem

Na aplicao cliente, deve existir um objeto da classe R ECEPTOR D E M ENSAGEM que aguarda as mensagens enviadas pela aplicao servidora e as apresenta par o usurio.
1 2 3 4 5 public class ReceptorDeMensagem { public void aguardaMensagem() { } }

www.k19.com.br

152

Apndice - Chat K19

20.4

Exerccios

1. Crie um projeto no eclipse chamado K19-chat-server. 2. Crie um projeto no eclipse chamado K19-chat-client. 3. No projeto K19-chat-server crie uma classe para denir os emissores.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import java.io.PrintStream; public class Emissor { private PrintStream saida; public Emissor(PrintStream saida) { this.saida = saida; } public void envia(String mensagem) { this.saida.println(mensagem); } }

Cada emissor possui uma sada de dados relacionada a um cliente conectado ao chat. Para criao de um emissor, a sada deve ser passada como parmetro atravs do construtor. Quando alguma mensagem de algum cliente conectado ao chat chegar no servidor, o distribuidor chamar o mtodo ENVIA () passando a mensagem para o emissor envi-la ao cliente correspondente. 4. No projeto K19-chat-server crie uma classe para denir o distribuidor de mensagens.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import java.util.Collection; import java.util.ArrayList; public class Distribuidor { private Collection<Emissor> emissores = new ArrayList<Emissor>(); public void adicionaEmissor(Emissor emissor) { this.emissores.add(emissor); } public void distribuiMensagem(String mensagem) { for (Emissor emissor : this.emissores) { emissor.envia(mensagem); } } }

O distribuidor possui uma coleo de emissores, um emissor para cada cliente conectado. Quando um novo cliente se conecta ao chat, o mtodo ADICIONA E MISSOR () permite que um novo emissor seja adicionada na coleo do distribuidor. Quando algum cliente envia uma mensagem, o mtodo DISTRIBUI M ENSAGEM () permite que a mesma seja enviada para todos os clientes conectados. 5. No projeto K19-chat-server crie uma classe para denir os receptores.
1 2 3 4 import java.util.Scanner; public class Receptor implements Runnable { private Scanner entrada;

153

K19 Treinamentos

Apndice - Chat K19


5 6 7 8 9 10 11 12 13 14 15 16 17 18 private Distribuidor distribuidor; public Receptor(Scanner entrada, Distribuidor distribuidor) { this.entrada = entrada; this.distribuidor = distribuidor; } public void run() { while (this.entrada.hasNextLine()) { String mensagem = this.entrada.nextLine(); this.distribuidor.distribuiMensagem(mensagem); } } }

Cada receptor possui uma entrada de dados relacionada a um cliente conectado ao chat e o distribuidor. Para criao de um receptor, devem ser passados a entrada relacionada a um cliente e o distribuidor atravs do construtor. Como o servidor de chat precisa receber simultaneamente as mensagens de todos os clientes, cada receptor ser executado em uma thread por isso a classe R ECEPTOR implementa a interface RUNNABLE. No mtodo RUN (), o receptor entra em um lao esperando que uma mensagem seja enviada pelo seu cliente para repass-la ao distribuidor. 6. No projeto K19-chat-server crie uma classe para denir o registrador.
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 import import import import import java.io.IOException; java.io.PrintStream; java.net.ServerSocket; java.net.Socket; java.util.Scanner;

public class Registrador implements Runnable { private Distribuidor distribuidor; private ServerSocket serverSocket; public Registrador(Distribuidor distribuidor, ServerSocket serverSocket) { this.distribuidor = distribuidor; this.serverSocket = serverSocket; } public void run() { while (true) { try { Socket socket = this.serverSocket.accept(); Scanner entrada = new Scanner(socket.getInputStream()); PrintStream saida = new PrintStream(socket.getOutputStream()); Receptor receptor = new Receptor(entrada, this.distribuidor); Thread pilha = new Thread(receptor); pilha.start(); Emissor emissor = new Emissor(saida); this.distribuidor.adicionaEmissor(emissor); } catch (IOException e) { System.out.println("ERRO"); } } }

www.k19.com.br

154

Apndice - Chat K19


39 }

7. No projeto K19-chat-server crie uma classe para inicializar o servidor.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 import java.io.IOException; import java.net.ServerSocket; public class Server { public static void main(String[] args) throws IOException { Distribuidor distribuidor = new Distribuidor(); ServerSocket serverSocket = new ServerSocket(10000); Registrador registrador = new Registrador(distribuidor, serverSocket); Thread pilha = new Thread(registrador); pilha.start(); } }

8. No projeto K19-chat-client crie uma classe para denir o emissor de mensagens.


1 2 3 4 5 6 7 8 9 10 11 12 13 import java.io.PrintStream; public class EmissorDeMensagem { private PrintStream saida; public EmissorDeMensagem(PrintStream saida) { this.saida = saida; } public void envia(String mensagem) { this.saida.println(mensagem); } }

9. No projeto K19-chat-client crie uma classe para denir a tela em Java Swing do chat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import import import import import import import javax.swing.JButton; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JPanel; javax.swing.JScrollPane; javax.swing.JTextArea; javax.swing.JTextField;

public class TelaK19Chat { private private private private private private private final final final final final final final JFrame frame; JPanel panel; JScrollPane scrollPane; JTextArea textArea1; JLabel label1; JTextField textField; JButton button;

private final EmissorDeMensagem emissorDeMensagem; public TelaK19Chat(EmissorDeMensagem emissor) { this.emissorDeMensagem = emissor; this.frame = new JFrame("K19 - Chat"); this.panel = new JPanel(); this.textArea1 = new JTextArea(10, 60);

155

K19 Treinamentos

Apndice - Chat K19


30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 this.textArea1.setEditable(false); this.scrollPane = new JScrollPane(this.textArea1); this.label1 = new JLabel("Digite uma mensagem..."); this.textField = new JTextField(60); this.button = new JButton("Enviar"); this.frame.setContentPane(this.panel); this.panel.add(this.scrollPane); this.panel.add(this.label1); this.panel.add(this.textField); this.panel.add(button); class EnviaMensagemListener implements ActionListener { public void actionPerformed(ActionEvent e) { emissorDeMensagem.envia(textField.getText()); textField.setText(""); } } this.button.addActionListener(new EnviaMensagemListener()); this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.frame.setSize(700, 300); this.frame.setVisible(true); } public void adicionaMensagem(String mensagem) { this.textArea1.append(mensagem + "\n"); } }

10. No projeto K19-chat-client crie uma classe para denir o receptor de mensagens.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import java.util.Scanner; public class ReceptorDeMensagem implements Runnable { private Scanner entrada; private TelaK19Chat telaK19Chat; public ReceptorDeMensagem(Scanner entrada, TelaK19Chat telaK19Chat) { this.entrada = entrada; this.telaK19Chat = telaK19Chat; } public void run() { while (this.entrada.hasNextLine()) { String mensagem = this.entrada.nextLine(); this.telaK19Chat.adicionaMensagem(mensagem); } } }

11. No projeto K19-chat-client crie uma classe para inicializar o cliente.


1 2 3 4 5 6 7 8 9 import java.io.PrintStream; import java.net.Socket; import java.util.Scanner; public class Client { public static void main(String[] args) throws Exception { Socket socket = new Socket("IP DO SERVIDOR", 10000);

www.k19.com.br

156

Apndice - Chat K19


10 11 12 13 14 15 16 17 18 19 20 21 22 23 PrintStream saida = new PrintStream(socket.getOutputStream()); Scanner entrada = new Scanner(socket.getInputStream()); EmissorDeMensagem emissor = new EmissorDeMensagem(saida); TelaK19Chat telaK19Chat = new TelaK19Chat(emissor); ReceptorDeMensagem receptor = new ReceptorDeMensagem(entrada, telaK19Chat); Thread pilha = new Thread(receptor); pilha.start(); } }

157

K19 Treinamentos

You might also like