Você está na página 1de 155

Java Orientado a Objeto

Laboratrios
www.3way.com.br
Lab 1 | Introduo a Linguagem Java .....................................................8
Exerccio 1 | Instalar JDK 7 ...........................................................................................................8
1.1 | Fazendo Download do JDK 7 .............................................................................................8
1.2 | Instalao do JDK em ambiente Windows .......................................................................9
1.3 | Instalao do JDK em ambiente Linux ...........................................................................13
Exerccio 2 | Escrever, compilar e executar programa Hello World usando ferramentas de
www.3way.com.br
Java OO | Laboratrios
ndice
linha de comando ..........................................................................................................................15
2.1 |Montar e executar o programa Java HelloWorld, usando o comando javac e java ....................15
2.2 | Usar o compilador Java, comando javac .......................................................................................18
2.3 | Usar o interpretador Java, comando java .......................................................................19
Lab 2 | Java Bsico................................................................................22
Exerccio 1 | Declarar, Inicializar, Imprimir variveis...................................................................22
1.1 | Montando e executando o programa ImprimirVariavel usando comando javac and
java .......................................................................................................................................22
Exerccio 2 | Operador Condicional .............................................................................................24
Exerccio 3 | Mdia numrica .......................................................................................................25
Exerccio 4 | Encontre o maior nmero .......................................................................................26
Lab 3 | Estruturas de Controle Java.......................................................27
Exerccio 1 | Estrutura de controle if/else ....................................................................................27
1.1 | Refazer programa MediaNumerica.java do Lab1 adicionando opo de entrada de
usurio com JoptionPane ........................................................................................................27
1.2 | Construir um segundo exemplo de uso de if/else ...........................................................29
Exerccio 2 | Lao For ...................................................................................................................30
www.3way.com.br
Java OO | Laboratrios
Exerccio 3 | Lao While/Do-While ..............................................................................................31
3.1 | Lao while e a classe java.util.Scanner. so usado neste exemplo ..................................31
3.2 | Lao do-while ..................................................................................................................32
Lab 4 | Vetores e Matrizes em Java .......................................................34
Exerccio 1 | Construindo Arrays de Primitivos Inteiros .............................................................34
1.1 | Usando arrays unidimensionais de inteiros ....................................................................34
1.2 | Usando arrays bidimensionais de inteiros ......................................................................35
1.3 | Busca maior valor ............................................................................................................36
Exerccio 2 | Construindo Arrays de Objetos String 36
1.1 | Usando arrays unidimensionais de String .......................................................................36
Lab 5 | Usando Objetos em Java ...........................................................38
Exerccio 1 | Criando uma instncia de objeto de uma classe usando a palavra chave new
(20 minutos) .................................................................................................................................38
1.1 | Criando objetos da classe String ......................................................................................38
1.2 | Criando objetos da classe Integer ....................................................................................39
Exerccio 2 | Mtodos estticos e mtodos de instncia (no - esttico) .....................................39
Exerccio 3 | Argumentos de mtodos passado por valor e por referncia .................................42
3.1 | Passagem de parmetros por valor .................................................................................42
3.2 | Passagem de parmetros por referncia .........................................................................43
Exerccio 4 | Escopo de variveis .................................................................................................43
4.1 | Um programa que demonstra escopo de variveis .........................................................44
4.2 | Um programa que usa trs tipos de variveis ................................................................45
Exerccio 5 | Casting de tipos primitivos e classe Wrapper ..........................................................45
www.3way.com.br
Java OO | Laboratrios
5.1 | Casting de tipos primitivos ..............................................................................................45
5.2 | Convertendo primitivos para classes Wrapper ...............................................................46
Exerccio 6 | Comparando objetos ................................................................................................47
Exerccio 7 | mtodo getClass() e o operador instanceof ............................................................48
7.1 | Usando mtodo getClass() ...............................................................................................49
7.2 | Usando operador instanceOf .......................................................................................... 49
Lab 6 | Criando suas prprias classes ....................................................51
Exerccio 1 | Defnindo e usando classes ......................................................................................52
1.1 | Defnindo a nova classe Conta.java ..................................................................................52
Exerccio 2 | Membros estticos ...................................................................................................55
2.1 | Criando aplicativos que usam variveis estticas ...........................................................55
2.2 | Criando aplicativos que usam mtodos estticos ...........................................................57
Exerccio 3 | Sobrecarga ...............................................................................................................57
3.1 | Adicionando mtodos sobrecarregados ..........................................................................57
Exerccio 4 | Construtores ............................................................................................................61
4.1 | Defnindo mltiplos construtores numa classe ...............................................................61
Exerccio 5 | Referncia this .....................................................................................................62
5.1 Invoque mtodos com this ..............................................................................................62
Lab 7 | Herana .....................................................................................67
Exerccio 1 | Construindo programas que criam classes atravs .................................................67
Exerccio 2 | Invocando construtores com palavra chave super .................................................69
Exerccio 3 | Type Casting e Polimorfsmo ...................................................................................69
Exerccio 4 | Palavra chave fnal em classes e mtodos ..............................................................69
www.3way.com.br
Java OO | Laboratrios
Lab 8 | Interfaces e Classes Abstratas ....................................................71
Exerccio 1 | Classes Abstratas ......................................................................................................71
Exerccio 2 | Interface como um tipo ............................................................................................72
Lab 9 | Excees ....................................................................................75
Exerccio 1 | Criando excees .................................................................................................... 75
Exerccio 2 | Usando excees ......................................................................................................76
Lab 10 | Generics ..................................................................................77
Exerccio 1 | Construindo uma classe Genrica ............................................................................77
Lab 11 | Colees ...................................................................................79
Exerccio 1 | UML e Colees ........................................................................................................79
Exerccio 2 | Usando coleo Set ..................................................................................................82
2.1 | Descartando elementos duplicados com HashSet ..........................................................82
2.2 | Classifcando os elementos com TreeSet ........................................................................84
Exerccio 3 | Usando coleo List .................................................................................................85
Exerccio 4 | Usando coleo Map ................................................................................................86
4.1 | Usando HashMap ............................................................................................................87
4.2 | Usando TreeMap .............................................................................................................88
Exerccio 5 | Ordenando e Comparando Objetos nas Colees ...................................................89
Lab 12 | Manipulando arquivos ............................................................90
Exerccio 1 | Manipulando arquivos em java ...............................................................................90
Lab 13 |Threads ....................................................................................92
Exerccio 1 | Herdando a classe Thread .......................................................................................92
1.1 | O mtodo start() sem o construtor da subclasse .............................................................92
www.3way.com.br
Java OO | Laboratrios
1.2 | O mtodo start() est no construtor da subclasse ...........................................................93
Exerccio 2 | Implementando Interface Runnable ......................................................................94
2.1 | Iniciando fora do construtor da classe que implementa Runnable ................................94
2.2 | Iniciando dento do construtor da classe que implementa Runnable .............................95
Exerccio 3 | Sincronizando threads..............................................................................................96
3.1 | Threads no sincronizados ..............................................................................................96
3.2 | Sincronizando threads atravs de mtodos ....................................................................98
3.3 | Sincronizando threads atravs de sentenas ...............................................................98
Lab 14 | Criando GUI com Swing ........................................................ 100
Exerccio 1 | Desenvolver janela swing .......................................................................................100
Exerccio 2 | Manipulao de eventos com Java Swing..............................................................106
Projeto | Criando Aplicao Orientada a Objeto + Swing......................110
1 | Descrio do Problema ...........................................................................................................110
2 | Criao do projeto ...................................................................................................................111
3 | Prototipao Crie as telas de acordo com os prottipos. Utilize o windowBuilder ...........112
4 | Aes de tela ...........................................................................................................................115
4.1. Figura 5 - Tela inicial do sistema Banco .........................................................................115
4.2. Figura 6 - Tela Manter Clientes (JInternalFrame) ........................................................ 115
4.3. Figura 7 - Tela Operaes Bancarias (JInternalFrame) .................................................115
4.4. Figura 8 - Tela Abrir Conta (JDialog) ............................................................................ 116
4.5. Figura 8 - Tela Transferncia (JDialog) .........................................................................116
5 |Passo a Passo do cdigo fonte do sistema ...............................................................................116
5.1. Dao Data Access Object ................................................................................................116
www.3way.com.br
Java OO | Laboratrios
5.2. Figura 5 - Tela inicial do sistema Banco .........................................................................117
5.3. Figura 6 - Tela Manter Clientes ......................................................................................121
5.4. Figura 7 - Tela Operaes Bancarias ..............................................................................130
5.5. Figura 8 - Tela Abrir Conta ............................................................................................143
5.6. Figura 9 - Tela Transferncia entre Contas ...................................................................146
Tutorial ...............................................................................................151
Instalando e confgurando WindowBuilder Pro no Eclipse para desenvolver aplicativos Swing ...151
8 www.3way.com.br
Java OO | Laboratrio
Lab 1 | Introduo a Linguagem Java
Neste laboratrio faremos Instalao do Java Development Kit, em ambiente Windows
ou Linux. E escreveremos nosso primeiro programa em Java, o mais famoso programa do mundo.
Exerccios
Exerccio 1: Instalar JDK 7.0 (30 minutos)
Exerccio 2: Escrever, compilar e rodar um programa HelloWorld em Java usando
ferramentas da linha de comando (30 minutos)
Exerccio 1 | Instalar JDK 7
1.1 | Fazendo Download do JDK 7
Para voc baixar o JDK(Java Development Kit), acesse o link no site da ORACLE:
http://www.oracle.com/technetwork/java/javase/downloads/index.html

Nesta pgina, voc tem a opo de baixar o JDK, JRE, Documentao, Cdigo
Fonte e outras.
1
9 www.3way.com.br
Java OO | Laboratrio 1
Clique em Download (Java Plataform JDK 7u25) como mostra a fgura acima.
1. Voc ser redirecionado para a pgina abaixo.
1. Habilite o download aceitando os termos da licena. Accept License Agreement
2. Escolha sua plataforma SO: Windows para plataforma Windows, por exemplo, e
click em Download.
3. Selecione sua plataforma SO na coluna de Download, para iniciar o download
1.2 | Instalao do JDK em ambiente Windows
Para instalar o JDK no Windows, primeiro baixe-o no site da Oracle, um simples arquivo
executvel que contm o Wizard de instalao.
1. D um clique duplo no arquivo jdk-<verso>-windows-<arquitetura>.exe, e espere
at ele entrar no wizard de instalao.

10 www.3way.com.br
Java OO | Laboratrio 1
2. Nesta tela Clique em Next.
3. Agora devemos selecionar quais recursos instalaremos junto com o java (Ferramentas de
desenvolvimento, o cdigo fonte e o prprio java), e onde ele ser instalado (marque esse caminho
porque usaremos ele mais pra frente), deixe como est e clique em Next.
4. O processo de instalao iniciar.

11 www.3way.com.br
Java OO | Laboratrio 1
5. Este passo s ser executado caso voc ainda no tenha instalado o JRE na sua mquina.
Agora ele comear a instalar o JRE(Java Runtime Environment). Assim como o JDK, ele
tambm tem algumas opes. Deixe como est e clique em Next.
6. O processo de instalao da JRE(Java Runtime Environment) iniciar.
7. Agora seu JDK est instalado. Clique em Finish.
8. Agora vamos criar as Variveis de Ambiente. Clique com o boto direito em cima do
cone Meu Computador e selecione a opo Propriedades.
12 www.3way.com.br
Java OO | Laboratrio
9. Clique em Confguraes avanadas do sistema.

10. Agora escolha a aba Avanado e depois clique no boto Variveis de Ambiente.

11. Nesta tela voc ver na parte de cima, as variveis de ambiente do usurio corrente, e
embaixo, as variveis de ambiente do computador, que serve para todos os usurios. Clique no
boto Novo da parte de baixo.
12. Agora em Nome da Varivel digite JAVA_HOME e em Valor da Varivel digite o
Caminho que voc anotou no passo 3, ou seja, o caminho que foi instalado o JDK.
1
13 www.3way.com.br
Java OO | Laboratrio
Provavelmente vai estar em C:\Program Files\Java\jdk1.7.0_25, ou um caminho
parecido com este dependendo da verso que foi instalado. Depois clique em OK.
13. Agora no vamos criar outra varivel e sim alterar, para isso procure a varivel PATH,
ou Path, e clique no boto Editar.

14. No altere o nome da varivel e no altere, apague os dados nela informados! Deixe
como est e adicione no fnal do valor ;%JAVA_HOME%\bin, no esquea do ponto-e-vrgula no incio,
assim voc est adicionando mais um caminho sua varivel Path.
15. Agora abra o prompt e digite javac -version para mostrar a verso do Java Compiler
e algumas opes, caso no aparea reveja os passos e confra se no esqueceu ou pulou nenhum
deles e se o caminho colocado nas variveis esto corretos.
1.3 | Instalao do JDK em ambiente Linux
1. Baixe o pacote de instalao para Linux chamado Linux self-extracting fle, assim o
arquivo que voc baixar ter a extenso .bin.
1
14 www.3way.com.br
Java OO | Laboratrio
2. Abra um terminal e faa login como root (comando su).
3. Crie um diretrio chamado /java na raiz do seu sistema (mkdir /java)
4. Copie o arquivo que voc baixou para o diretrio /Java (cp /<caminho do arquivo>/
jdk-<verso>-linux.bin /java)
5. Execute o arquivo (sh jdk<verso>-linux.bin)
6. Aparecer na sua tela um acordo de instalao, aperte a tecla Q para ir at o fnal do
documento e depois escreva yes para aceitar o contrato. Feito isso ele comear a descompactar o
JDK em um diretrio que ele cria, chamado jdk<verso>.
7. Vamos agora criar as variveis de ambiente, edite o arquivo, use um editor de sua
preferncia, altere seu arquivo .bashrc ou .bash_profle (depende da sua distribuio e sua
preferncia) ou ainda /etc/bash.bashrc, considerando que voc no tem privilgios de super
usurio, faa:
> ~/bashrc
> vi ~/bashrc
Adicione as seguintes linhas no fnal do arquivo, substituindo <verso> pela verso que foi
instalado do JDK:
JAVA_HOME=/java/jdk<verso>
PATH=$PATH:/$JAVA_HOME/bin
CLASSPATH=.export JAVA_HOME PATH CLASSPATH
8. Execute o comando source ~/.bashrc
10. Abra um terminal e teste o Java Compiler executando o comando javac -version
11. A sada dever ser parecida com a apresentada abaixo, se no aparecer reveja os passos e
confra se foi feito tudo corretamente, inclusive o caminho dos diretrios.
javac 1.7.0_25
javac: no source fles
Usage: javac <options> <source fles>
where possible options include:
.....
1
15 www.3way.com.br
Java OO | Laboratrio
Exerccio 2 | Escrever, compilar e executar programa Hello
World usando ferramentas de linha de comando
O objetivo de exerccio promover uma experincia completa como ciclo de
desenvolvimento de programas em Java escrever, compilar e executar um programa java to
simples quanto possvel usando as ferramentas de linha de comando do seu JDK. Se voc j
programou em linguagens como C, C++ ou Pascal (o tradicional, no a IDE Delphi), ver que h
pequenas diferenas.
Em Java o compilador que chamado javac compila o arquivo de cdigo fonte Java em
um arquivo binrio chamado de bytecode que pode ser executado em qualquer plataforma
compatvel com Java, isto prov a portabilidade dos programas em Java. O bytecode so os
arquivos *.java compilados para serem executados, so os arquivos com extenso *.class .
1. Montar e executar o programa Java HelloWorld, usando o comando javac e java
2. Usar o compilador Java, comando javac
3. Usar o interpretador Java, comando java
2.1 |Montar e executar o programa Java HelloWorld, usando o comando javac e java
1. Crie um diretrio onde voc vai colocar os programas em Java que voc escrever
>mkdir c:\myjavaprograms
>cd \myjavaprograms
2. Escreva o cdigo de HelloWorld.java usando o editor de sua preferncia, pode
textpad ou notepad no Windows; vi, gedit. Veja o gabarito do programa na Listagem-0.1
abaixo. Nestes primeiros exemplos interessante que voc digite e tenha experincia com alguns
erros compilao.
public class HelloWorld {

/**
*Aplicao Hello World
*/
public static void main( String[] args ){

// Imprime cadeia de caracteres Hello world na tela
System.out.println(Hello, world);
}
}
Listagem -0.1: HelloWorld.java
1
16 www.3way.com.br
Java OO | Laboratrio
Anatomia do Cdigo:
3. Compile HelloWorld.java usando o compilador javac. O compilador javac foi instalado
com seu J2SE SDK. Ele est no diretrio %JAVA_HOME%\bin (Windows) ou $JAVA_HOME/bin (Linux). O
resultado da compilao ser a criao do arquivo HelloWorld.class.
> javac HelloWorld.java
Problema #1: se voc receber a mensagem de erro abaixo
> HelloWorld.java
javac is not recognized as an internal or external command, operable program or batch
fle
Isto signifca que %JAVA_HOME%\bin para Windows ou $JAVA_HOME/bin para Linux, no est
confgurada corretamente. Voc pode tentar colocando C:\Program Files\Java\jdk1.7.0_25\bin\
javac HelloWorld.java (para Windows) se quiser continuar sem confgurar as variveis de ambiente.
Soluo: Sugiro que voc reveja o passo 9 do item 1.2 (para windows) ou passo 7 do item
1.3 (para Linux), do exerccio 1.
4. Certifque-se de que o arquivo HelloWorld.class foi criado. O arquivo HelloWorld.class
contm a representao bytecode da classe HelloWorld.
> dir HelloWorld.class (para windows)
ou
1
17 www.3way.com.br
Java OO | Laboratrio
> dir HelloWorld.class (para linux)
6. Rode o programa HelloWorld usando o comando java. O comando java inicia a Mquina
Vitual Java e executa o programa HelloWorld deste exemplo. Um programa em java pode ter
mltiplas classes e um conjunto de bibliotecas de classes . Neste exemplo, o programa HelloWorld
possui uma nica classe chamada HelloWorld.class. O comando java o Interpretador Java.
>java HelloWorld
HelloWorld world
Problema #2: Se voc receber a mensagem de erro
>java HelloWorld
Exception in thread main java.lang.UnsupportedClassVersionError: HelloWorld
(Unsupported major.minor version 49.0)
possvel que voc tenha compilado seu programa com uma verso diferente da que esteja
tentando execut-lo.
Soluo: certifque que sua varivel de ambiente PATH esteja corretamente confgurada
para o diretrio de instalao da verso apropriada do seu JDK.
Sugiro que voc reveja o passo 9 do item 1.2 (para windows) ou passo 7 do item 1.3 (para Linux),
do exerccio 1.
Problema #3: Se voc receber a mensagem de erro
>java HelloWorld
Exception in thread main java.lang.NoClassDefFoundError: HelloWorld
Provavelmente sua varivel de ambiente CLASSPATH no est corretamente confgurada
com o diretrio corrente.
Soluo: tente usar o comando java -classpath . HelloWorld (H um ponto . aps o
-classpath). Voc ver mais sobre a classpath posteriormente.
>java -classpath . HelloWorld
7. Modifque HelloWorld.java como mostra a Listagem-0.2 abaixo.
public class HelloWorld {

/**
* Comentario:
* Primeiro programa em Java
*/
public statc void main( String[] args ){
// tambem e um comentario
// Imprime cadeia de caracteres Hello world na tela
System.out.println(Ol Java);
//modifque para imprimir mais
System.out.println(Meu primeiro programa Java);
}
}
Listagem-0.2: HelloWorld.java modifcado
1
18 www.3way.com.br
Java OO | Laboratrio
8. Compile e execute o programa. Observe a nova mensagem mostrada.
>javac HelloWorld.java
>java HelloWorld
Ol Java
Meu primeiro programa Java
2.2 | Usar o compilador Java, comando javac
Neste passo voc aprender como usar algumas opes do compilador javac.
1. Mostrar as opes do compilador javac usando a opo help:
> javac -help
Usage: javac <options> <source fles>
where possible options include:
-g Generate all debugging info
-g:none Generate no debugging info
-g:{lines,vars,source} Generate only some debugging info
-nowarn Generate no warnings
-verbose Output messages about what the compiler is doing
-deprecation Output source locations where deprecated APIs are used
-classpath <path> Specify where to fnd user class fles
-cp <path> Specify where to fnd user class fles
-sourcepath <path> Specify where to fnd input source fles
-bootclasspath <path> Override location of bootstrap class fles
-extdirs <dirs> Override location of installed extensions
-endorseddirs <dirs> Override location of endorsed standards path
-d <directory> Specify where to place generated class fles
-encoding <encoding> Specify character encoding used by source fles
-source <release> Provide source compatibility with specifed release
-target <release> Generate class fles for specifc VM version
-version Version information
-help Print a synopsis of standard options
-X Print a synopsis of nonstandard options
-J<fag> Pass <fag> directly to the runtime system
2. Execute o comando javac com a opo -verbose
>javac -verbose HelloWorld.java
[parsing started HelloWorld.java]
[parsing completed 516ms]
[search path for source fles: [.]]
[search path for class fles: [C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar,C:\
Program Files\Java\jdk1.7.0_25\jre\lib\jsse.jar, C:\Program Files\Java\jdk1.7.0_25\jre\
lib\jce.jar, C:\Program Files\Java\jdk1.7.0_25\jre\lib\charsets.jar,C:\Program Files\
Java\jdk1.7.0_25\jre\lib\ext\dnsns.jar, C:\Program Files\Java\jdk1.7.0_25\jre\lib\ext\
localedata.jar, C:\Program Files\Java\jdk1.7.0_25\jre\lib\ext\sunjce_provider.jar, C:\
Program Files\Java\jdk1.7.0_25\jre\lib\ext\sunpkcs11.jar, .]]
[loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/lang/Object.class)]
[loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/lang/String.class)]
[checking HelloWorld]
[loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/lang/System.class)]
1
19 www.3way.com.br
Java OO | Laboratrio
[loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/io/PrintStream.class)]
[loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/io/FilterOutputStream.
class)]
[loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/io/OutputStream.class)]
[wrote HelloWorld.class]
[total 1141ms]
3. Experincia com erros de compilao.
Modifque o programa HelloWorld.java como mostra a Listagem-0-3 abaixo. A
mudana causa um erro de sintaxe a palavra-chave static est incorretamente digitada
como statict.
public class HelloWorld {

/**
* Comentario:
* Primeiro programa em Java
*/
public statct void main( String[] args ){
// tambem e um comentario
// Imprime cadeia de caracteres na tela
System.out.println(Meu primeiro program Java);
}
}
Listagem -0.3: Cdigo contento erro de sintaxe
Compile HelloWorld.java with javac.
Observe os erros
>javac HelloWorld.java
HelloWorld.java:6: <identifer> expected
public statict void main( String[] args ){
^
HelloWorld.java:12: ; expected
}
^
2 errors
Remova o erro de sintaxe que voc introduziu no cdigo e recompile-o.
2.3 | Usar o interpretador Java, comando java
Neste passo voc aprender como usar algumas opes do interpretador java. Voc pode
pensar no comando como sua Java Virtual Machine.
1. Mostrar o uso da informaes de ajuda do comando java com a opo -help ou -? .
>java -help
Usage: java [-options] class [args...]
(to execute a class)
or java [-options] -jar jarfle [args...]
(to execute a jar fle)

where options include:
-client to select the client VM
-server to select the server VM
1
20 www.3way.com.br
Java OO | Laboratrio
-hotspot is a synonym for the client VM [deprecated]
The default VM is client.

-cp <class search path of directories and zip/jar fles>
-classpath <class search path of directories and zip/jar fles>
A ; separated list of directories, JAR archives,
and ZIP archives to search for class fles.
-D<name>=<value>
set a system property
-verbose[:class|gc|jni]
enable verbose output
-version print product version and exit
-version:<value>
require the specifed version to run
-showversion print product version and continue
-jre-restrict-search | -jre-no-restrict-search
include/exclude user private JREs in the version search
-? -help print this help message
-X print help on non-standard options
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
enable assertions
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
disable assertions
-esa | -enablesystemassertions
enable system assertions
-dsa | -disablesystemassertions
disable system assertions
-agentlib:<libname>[=<options>]
load native agent library <libname>, e.g. -agentlib:hprof
see also, -agentlib:jdwp=help and -agentlib:hprof=help
-agentpath:<pathname>[=<options>]
load native agent library by full pathname
-javaagent:<jarpath>[=<options>]
load Java programming language agent, see java.lang.instrument
2. Execute o comando java com a opo -verbose
>java -verbose HelloWorld
[Opened C:\Program Files\Java\jre1.7.0_25\lib\rt.jar]
[Opened C:\Program Files\Java\jre1.7.0_25\lib\jsse.jar]
[Opened C:\Program Files\Java\jre1.7.0_25\lib\jce.jar]
[Opened C:\Program Files\Java\jre1.7.0_25\lib\charsets.jar]
[Loaded java.lang.Object from shared objects fle]
[Loaded java.io.Serializable from shared objects fle]
[Loaded java.lang.Comparable from shared objects fle]
[Loaded java.lang.CharSequence from shared objects fle]
[Loaded java.lang.String from shared objects fle]
[Loaded java.lang.refect.GenericDeclaration from shared objects fle]
[Loaded java.lang.refect.Type from shared objects fle]
[Loaded java.lang.refect.AnnotatedElement from shared objects fle]
[Loaded java.lang.Class from shared objects fle]
[Loaded java.lang.Cloneable from shared objects fle]
[Loaded java.lang.ClassLoader from shared objects fle]
[Loaded java.lang.System from shared objects fle]
[Loaded java.lang.Throwable from shared objects fle]
1
21 www.3way.com.br
Java OO | Laboratrio
[Loaded java.lang.Error from shared objects fle]
[Loaded java.lang.ThreadDeath from shared objects fle]
[Loaded java.lang.Exception from shared objects fle]
[Loaded java.lang.RuntimeException from shared objects fle]
[Loaded java.security.ProtectionDomain from shared objects fle]
[Loaded java.security.AccessControlContext from shared objects fle]
[Loaded java.lang.ClassNotFoundException from shared objects fle]
[Loaded java.lang.LinkageError from shared objects fle]
[Loaded java.lang.NoClassDefFoundError from shared objects fle]
[Loaded java.lang.ClassCastException from shared objects fle]
[Loaded java.lang.ArrayStoreException from shared objects fle]
[Loaded java.lang.VirtualMachineError from shared objects fle]
....
[Loaded sun.net.www.URLConnection from shared objects fle]
[Loaded sun.net.www.protocol.fle.FileURLConnection from shared objects fle]
[Loaded java.net.ContentHandler from shared objects fle]
[Loaded java.net.UnknownContentHandler from shared objects fle]
[Loaded sun.net.www.MessageHeader from shared objects fle]
[Loaded java.io.FilePermission from shared objects fle]
[Loaded java.io.FilePermission$1 from shared objects fle]
[Loaded java.io.FilePermissionCollection from shared objects fle]
[Loaded java.security.AllPermission from shared objects fle]
[Loaded java.security.UnresolvedPermission from shared objects fle]
[Loaded java.security.BasicPermissionCollection from shared objects fle]
[Loaded java.security.Principal from shared objects fle]
[Loaded java.security.cert.Certifcate from shared objects fle]
[Loaded HelloWorld from fle:/C:/myjavaprograms/]
This is my frst Java program!
[Loaded java.lang.Shutdown from shared objects fle]
[Loaded java.lang.Shutdown$Lock from shared objects fle]
3. Execute o comando java com a opo -version. Observe que o nmero da verso do JDK
instalada mostrado.
>java -version
java version 1.7.0_25
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) 64-Bit Client VM (build 23.25-b01 , mixed mode)
1
22 www.3way.com.br
Java OO | Laboratrio 2
Lab 2 | Java Bsico
O objetivo deste laboratrio para voc se habituar com bsico da programao Java, com a
forma de declarar e usar variveis, como usar operadores condicional.
Durao prevista: 90 minutos

Exerccios
Exerccio 1: Declarar, Inicializar, Imprimir Variveis (30 minutos)
Exerccio 2: Operador Condicional (30 minutos)
Exerccio 3: Mdia numrica (15 minutos)
Exerccio 4: Encontre o maior nmero (15 minutos)
Exerccio 1 | Declarar, Inicializar, Imprimir variveis
Neste exerccio voc ir aprender como declarar e inicializar uma varivel. Voc tambm vai
aprender a modifcar e imprimir o contedo da varivel.
1.1 | Montando e executando o programa ImprimirVariavel usando comando javac
and java.
1. V para seu diretrio de trabalho, onde voc est escrevendo seus programas Java.
> cd \myjavaprograms
2. Escreva a classe ImprimirVariavel.java, usando editor de texto, por exemplo textpad, vi,
gedit ou qualquer editor, como mostrado abaixo na Listagem -1.1.
public class ImprimirVariavel {
public static void main(String[] args) {
// Variavel valor do tipo int (primitivo), inicializado com 10
int valor = 10;
// Variavel x do tipo char primitivo, inicializada com caracter A
char x;
x = A;
// Mostra o valor da variavel valor na saida padrao
System.out.println(valor);
// Mostra o valor da variavel x na saida padrao
System.out.println(O valor de x= + x);
}
}
Listagem 1.1 : ImprimirVariavel.java
2
23 www.3way.com.br
Java OO | Laboratrio
3. Compile o arquivo ImprimirVariavel.java usando o compilador javac. O comando javac
foi instalado junto com J2SE SDK no Laboratrio 0. Est localizado no diretrio %JAVA_HOME%\
bin (Windows) ou $JAVA_HOME/bin (Linux). O resultado da compilao ser a criao do arquivo
ImprimirVariavel.class.
>javac ImprimirVariavel.java
4. Execute o progama ImprimirVariavel usando o comando java. O comando java inicia
a Java VM e executa o programa. Um programa Java pode se constituir de mltiplas classes Java
e de um conjunto de bibliotecas. Neste exemplo, o programa ImprimirVariavel contm apenas
uma classe simples chamada de ImprimirVariavel.class. Voc deve perceber que o comando java o
interpretador Java.
>java ImprimirVariavel
10
O valor de x=A
5. Modifque ImprimirVariavel.java como mostra a Listagem-1.2 abaixo. Voc adicionar
uma varivel do tipo primitivo double, nomeada como media e mostrar o seu valor.
public class ImprimirVariavel {
public static void main(String[] args) {
// Variavel valor do tipo int (primitivo), inicializado com 10
int valor = 10;
// Variavel x e do tipo char primitivo, inicializada com caracter A
char x;
x = A;
// Variavel media do tipo double
double media = 11;
// Mostra o valor da variavel valor na saida padrao
System.out.println(valor);
// Mostra o valor da variavel x na saida padrao
System.out.println(O valor de x= + x);
// Mostra o valor da variavel media na saida padrao
System.out.println(O valor de media= + media);
}
}
Listagem -1.2: ImprimirVariavel.java modifcado


2
24 www.3way.com.br
Java OO | Laboratrio
7. Compile e execute o programa. Observe que uma nova mensagem mostrada.
>javac ImprimirVariavel.java
>java ImprimirVariavel
10
O valor de x=A
O valor de media =11.0
Exerccio 2 | Operador Condicional
Neste exerccio voc vai escrever um programa que usa o operador condicional ( ? ).
1. Crie uma nova classe pblica nomeada como OperadorCondicional dentro do arquivo
OperadorCondicional.java
public class OperadorCondicional {
public static void main(String[] args) {
// Declara e inicializa duas variveies, uma varivel do tipo String
// chamado estado e a outra varivel chamada grau do
// tipo primitivo int
String estado = ;
int grau = 80;
// pega estado do aluno.
estado = ( grau >= 60 ) ? Aprovado : Reprovado;
// Imprime estado
System.out.println(estado);
}
}
Listagem 1.3 OperadorCondicional.java
2. Compile e execute o programa.
3. Modifque o programa adicionando as seguintes linhas de cdigo no local apropriado,
compile e rode o programa.
int salario = 100000;
Imprima Voc est rico! se salario maior que 50000, ou Voc pobre! caso
contrrio.
2
25 www.3way.com.br
Java OO | Laboratrio
Exerccio 3 | Mdia numrica
1. Escreva, compile e execute o programa a baixo. Este programa deve calcular a mdia
numrica entre trs nmeros inteiros e imprimi-los na tela.
public class MediaNumerica {

public static void main(String[] args) {
//declara numeros inteiros
int 1num = 10;
int Num2 = 20;
char nmero$3 = 45;

//retorna a media numerica dos tres numeros
// e salva-o na variavel media
int mdia = (1num+num2+nmero$3)/3;

//imprime na sada padro
System.out.println(numero 1 = +1num)
System.out.println(numero 2 = , num2);
System.out.println(numero 3 = num3);
System.out.println(media = + mdia);
}

}
Listagem 1.4 MediaNumerica.java
2. O programa contm alguns erros, voc deve identifc-los com a ajuda do compilador.
Ao compilar voc receber mensagens como abaixo, mostrando o nome do programa a linha onde
ocorreu o erro e a mensagem de erro. Corrija o programa e execute.
MediaNumerica.java:7: not a statement
int 1num = 10;
^
MediaNumerica.java:7: ; expected
int 1num = 10;
^
MediaNumerica.java:13: ) expected
int mdia = (1num+num2+nmero$3)/3;
^
MediaNumerica.java:16: ) expected
System.out.println(numero 1 = +1nums)
3. Modifque o programa para calcular a mdia entre quatro nmeros inteiros e imprima a mdia.
2
26 www.3way.com.br
Java OO | Laboratrio
Exerccio 4 | Encontre o maior nmero
1. Crie uma nova classe no pblica nomeada como MaiorValor dentro do arquivo
MaiorNumero.java.
class MaiorValor {

/** Construtor para criar uma nova instancia de MaiorValor */
public MaiorValor() {
}

/**
* @param args argumentos de linha de comando
*/
public static void main(String[] args) {
//declare os numeros
int num1 = 10;
int num2 = 23;
int num3 = 5;
int max = 0;

//determina o maior numero
max = (num1>num2)?num1:num2;
max = (max>num3)?max:num3;

//imprimindo
System.out.println(numero 1 = +num1);
System.out.println(numero 2 = +num2);
System.out.println(numero 3 = +num3);
System.out.println(O maior numero = +max);
}

}
Listagem 1.5 Programa maior numero
2. Escreva, compile e execute o programa da Listagem-1.5 com os comandos:
> javac MaiorNumero.java
> java MaiorValor
Por que isto funcionou? Qual a diferena como os outros programas?
3. Modifque o programa para que a classe MaiorValor seja pblica, alterando a declarao da
classe e tente compilar.
public class MaiorValor{...}
4. Seu compilador deve ter emitido uma mensagem de erro como abaixo:
MaiorNumero.java:4: class MaiorValor is public, should be declared in a fle named MaiorValor.
java
public class MaiorValor {
^
1 error
Voc consegue resolver? Ento tente colocar o nome do arquivo igual ao nome classe,
MaiorValor.java. E agora, resolveu, compilou?
2
27 www.3way.com.br
Java OO | Laboratrio 3
Lab 3 | Estruturas de Controle Java
Neste laboratrio faremos uso das estruturas de controle de Java.
Durao prevista: 60 minutos
Exerccios
Exerccio 1: Estrutura de controle if/else (20 minutos)
Exerccio 2: Lao for (20 minutos)
Exerccio 3: Lao while (20 minutos)
Exerccio 1 | Estrutura de controle if/else
1. Primeiro programa com if/else
2. Segundo programa com if/else
1.1 | Refazer programa MediaNumerica.java do Lab1 adicionando opo de entrada
de usurio com JoptionPane.
1. Escrever, compilar e executar a Listagem-3.1, MediaNota.java, como segue a baixo:
import javax.swing.JOptionPane;
public class MediaNota {
public static void main(String[] args) {
int notaIPD = 0;
int notaIngles = 0;
int notaFisica = 0;
double media = 0;
// Recebe dados do showInputDialog
String snota;
snota = JOptionPane.showInputDialog(Nota IPD entre 0 e 100!);
notaIPD = Integer.parseInt(snota);
snota = JOptionPane.showInputDialog(Nota Ingls entre 0 e 100!);
notaIngles = Integer.parseInt(snota);
snota = JOptionPane.showInputDialog(Nota Fsica entre 0 e 100);
notaFisica = Integer.parseInt(snota);
// Calcula mdia
media = ( notaIPD + notaIngles + notaFisica ) / 3;

// Realiza controle if & else
if (media >= 60) {
28 www.3way.com.br
Java OO | Laboratrio
JOptionPane.showMessageDialog(null, Estrelinhas! Sua media e + media);
} else {
JOptionPane.showMessageDialog(null, Sem estrelinha! Sua media e + media);
}
}
}Listagem 3.1 MediaNota.java
2. Compile e rode o programa, janelas de entrada de dados aparecero para voc digitar as
trs notas conforme imagens abaixo:
Figura 3.1 Caixa Dialogo entre com nota IPD
Figura 3.2 Caixa Dialogo entre com nota Ingls
Figura 3.3 Caixa Dialogo entre com nota Fsica
Figura 3.4 Caixa Dialogo Mensagem com resultado
3
29 www.3way.com.br
Java OO | Laboratrio
3. Modifque o programa como pede abaixo:
- se mdia maior que 90 ento mostre Estrela dourada! Sua mdia xxx.0
- se mdia maior que 50 e menor que 90 ento mostre Estrela prateada! Sua mdia
xxx.0
- se mdia menor que 50 ento mostre No ganha estrela! Sua mdia xxx.0
1.2 | Construir um segundo exemplo de uso de if/else

1. Escrever, compilar e executar a Listagem-3.2, NumeroExtenso.java, como segue a baixo:
import javax.swing.JOptionPane;
public class NumeroExtenso {
public static void main(String[] args) {
String msg = ;
int input = 0;
// Pega literal numrico de entrada e converte para int
input = Integer.parseInt(JOptionPane.showInputDialog(Entre numero entre 1 e 10));
// Confgura varivel msg com string equivalente a entrada
if(input == 1) msg = um;
else if(input == 2) msg = dois;
else if(input == 3) msg = tres;
else if(input == 4) msg = quatro;
else if(input == 5) msg = cinco;
else if(input == 6) msg = seis;
else if(input == 7) msg = sete;
else if(input == 8) msg = oito;
else if(input == 9) msg = nove;
else if(input == 10) msg = dez;
else msg = Numero Invalido;


// Mostra nmero por extenso
JOptionPane.showMessageDialog(null, msg);
}
}
Listagem 3.2 NumeroExtenso.java

3
30 www.3way.com.br
Java OO | Laboratrio
2. Compile e rode o programa, surgir uma janela de entrada de dados onde voc deve digitar um
nmero, veja fguras:
Figura 3.5 Entrada de dados literal numrico
Figura 3.6 Mensagem
3. Modifique o programa anterior, Listagem-3.2, substituindo as estruturas if/else
pela switch.
4. Compile e execute.
Exerccio 2 | Lao For
1. Escrever, compilar e executar a Listagem-3.3, TestaFor.java, como segue a baixo:
import javax.swing.JOptionPane;
public class TestaFor {
public static void main(String[] args) {
// Declare e inicialize um array de String chamado nomes.
String nomes[] = { Beth, Bianca, Luis, Bela, Nico, Ilza, Geronimo,
Rafa};
// Esta string ser procurada dentro do array
String procuraNome = JOptionPane.showInputDialog(Digite \Ilza\ ou \sem nome\!);
// Declara e inicializa um varivel boolean acheiNome.
boolean acheiNome = false;
// Procura no array de String usando o for.
// O nomes.length retorna o tamanho do array.
// Este for compara cada elemento do array com o valor de procuraNome que do tipo String.
// O mtodo equals(...) da classe String usado para comparar
// Pense a respeito de voc no poder utilizar
// nomes[i] == procuraNome como lgica de comparao aqui
3
31 www.3way.com.br
Java OO | Laboratrio
for (int i = 0; i < nomes.length; i++) {
if (nomes[i].equals(procuraNome)) {
acheiNome = true;
break;
}
}
// Mostra o resultado
if (acheiNome)
JOptionPane.showMessageDialog(null, procuraNome + encontrado!);
else
JOptionPane.showMessageDialog(null, procuraNome + no encontrado!);
}
}
Listagem 3.3 TestaFor.java
2. Compile e execute o programa, surgir janela de entrada de dados onde voc deve digitar
um Nome como Ilza ou sem nome, veja fguras abaixo:

Figura 3.7 Procurar Bela
Figura 3.8 Nome procurado foi encontrado
Exerccio 3 | Lao While/Do-While
1. Primeiro programa com while
2. Segundo programa com do-while
3.1 | Lao while e a classe java.util.Scanner. so usado neste exemplo
1. Escrever, compilar e executar a Listagem-3.4, TestaWhile.java, como segue a baixo:
import java.text.DecimalFormat;
3
32 www.3way.com.br
Java OO | Laboratrio
import java.util.Scanner;
public class TestaWhile {
public static void main(String args[]) {
// declara variveis inteiras
int contadorNota, valorNota, total;
// declara varivel media double
double media;
total = 0;
contadorNota = 1;
// Classe Scanner utilizada para ler entrada de dados digitado pelo usurio
Scanner leitor = new Scanner(System.in);
System.out.println(Entre com 4 notas inteiras, ou valor negativo para sair);
System.out.println(Digite nota( + contadorNota + ) :);
// l o que o usurio digitou e converte para um int
valorNota = leitor.nextInt();
// Testa antes de entrar se valorNota que foi digitado maior que um
while (( valorNota > -1 )) {
total += valorNota;
if (contadorNota >= 4){
break;
}
contadorNota++;
System.out.println(Digite nota( + contadorNota + ) :);
valorNota = leitor.nextInt();
}
if (( contadorNota > 0 ) && ( valorNota > 0 )) {
media = (double) total / contadorNota;
// Usa DecimalFormat para formatar valor
// double com 2 casas decimais
DecimalFormat doisDigitos = new DecimalFormat(0.00);
System.out.println(A mdia : + doisDigitos.format(media));
} else {
System.out.println(No inseriu nota ou leitura interrompida!);
}
System.exit(0);
}
}
Listagem 3.4 TestaWhile.java
2. Neste programa a classe Scanner usada para capturar entrada de dados do teclado que
for digitada na console.
3.2 | Lao do-while
1. Escrever, compilar e executar a Listagem-3.5, TestaDoWhile.java, como segue a baixo,
para implementar a mesma lgica do exemplo anterior usando lao do-while:
3
33 www.3way.com.br
Java OO | Laboratrio
import java.text.DecimalFormat;
import java.util.Scanner;
public class TestaDoWhile {
public static void main(String args[]) {
// declara variveis inteiras
int contadorNota, valorNota, total;
// declara varivel media double
double media;
total = 0;
contadorNota = 1;
// Classe Scanner utilizada para ler entrada de dados digitado pelo usurio
Scanner leitor = new Scanner(System.in);
System.out.println(Entre com 4 notas inteiras, ou valor negativo para sair);
// Testa antes de entrar se valorNota digitado maior que um
do {
System.out.println(Digite nota( + contadorNota + ) :);
// l o que o usurio digitou e converte para um int
valorNota = leitor.nextInt();
total = total + valorNota;
contadorNota++;
} while (( valorNota > -1 ) && ( contadorNota < 5 ));
if (( contadorNota > 0 ) && ( valorNota > 0 )) {
media = (double) total / --contadorNota;
// Usa DecimalFormat para formatar valor double com 2 casas decimais
DecimalFormat doisDigitos = new DecimalFormat(0.00);
System.out.println(A mdia : + doisDigitos.format(media));
} else {
System.out.println(No inseriu nota ou leitura interrompida!);
}
System.exit(0);
}
}
Listagem 3.5 TestaDoWhile.java
2. Perceba a diferena entre os controles while e do-while, o primeiro testa, forando
uma leitura adiantada para depois executar o trecho de cdigo, o segundo executa primeiro as
instrues e s testa ao fnal se deve continuar a repetir as instrues.
3
34 www.3way.com.br
Java OO | Laboratrio 4
Lab 4 | Vetores e Matrizes em Java
Neste laboratrio construiremos e executaremos exemplos de programas que usam arrays
em Java, tambm conhecidos como matrizes e vetores.
Durao prevista: 90 minutos
Exerccios
Exerccio 1: Construindo arrays de primitivos inteiros (40 minutos)
Exerccio 2: Construindo arrays de objetos String (50 minutos)
Exerccio 1 | Construindo Arrays de Primitivos Inteiros
1. Usando arrays unidimensionais de inteiros
2. Usando arrays bidimensionais de inteiros
3. Busca maior valor
1.1 | Usando arrays unidimensionais de inteiros
1. Escreva, compile e execute a Listagem-4.1, UniArr ay.java, preste bastante ateno
aos comentrios.
public class UniArray {
public static void main(String[] args) {
// Declara e cria um array de int com tamanho 10
int[] idades = new int[10];
// Imprime o valor de cada elemento do array
for (int i = 0; i < idades.length; i++) {
System.out.print(idades[i]);
}
}
}
Listagem 4.1 UniArray.java
2. Compile e execute o programa, veja o resultados
0000000000
3. Antes do lao for que imprime os valores modifque o programa UniArray.java, crie outro lao for
para inicializar os elementos do array idades de modo que cada entrada fque como na sequncia: idades[0]=31,
idades[1]=32 ... idades[n]=N e assim por diante.
35 www.3way.com.br
Java OO | Laboratrio 4
1.2 | Usando arrays bidimensionais de inteiros
1. Escreva, compile e execute a Listagem-4.2, BiDArray.java, preste bastante ateno
aos comentrios.
public class BiDArray {
public static void main(String[] args) {
// Declara e cria um array de duas dimenses de int com tamanho 10x5
int[][] idades = new int[10][5];
// Mostra numero de linhas e colunas
System.out.println(idades.length = + idades.length); //linhas
System.out.println(idades.length[1] = + idades[1].length); //colunas
// Imprime o valor de cada elemento do array
for (int i = 0; i < idades.length; i++) {
System.out.println(\n Linha inicio + i);
for (int j = 0; j < idades[i].length; j++) {
idades[i][j] = i * j;
System.out.print(idades[i][j] + );
}
}
}
}
Listagem 4.2 BiDArray.java
2. Compile e execute o programa, veja o resultado:
idades.length =10
idades.length[1] =5
Linha 0
0 0 0 0 0
Linha 1
0 1 2 3 4
Linha 2
0 2 4 6 8
Linha 3
0 3 6 9 12
Linha 4
0 4 8 12 16
Linha 5
0 5 10 15 20
Linha 6
0 6 12 18 24
Linha 7
0 7 14 21 28
Linha 8
0 8 16 24 32
Linha 9
0 9 18 27 36
3. Crie um programa TriDArray.java que declara um array tridimensional de
inteiros e inicialize cada clula com um nmero crescente comeando de 1000, 1001, 1002 ...
N, assim por diante.
36 www.3way.com.br
Java OO | Laboratrio 4
1.3 | Busca maior valor
1. Escreva, compile e execute a Listagem-4.3, MaiorNumero.java, preste bastante ateno aos comentrios.
import javax.swing.JOptionPane;
public class MaiorNumero {
public static void main(String[] args) {
int[] num = new int[10];
int contador;
int max = 0;
int numerostotal = 3;
// Pede ao usurio para digitar nmeros
for (contador = 0; contador < numerostotal; contador++) {
num[contador] = Integer.parseInt(JOptionPane.showInputDialog(Entre com nmeros at
+ numerostotal + no total));
// verifca se o nmero digitado maior que max
if (( contador == 0 ) || ( num[contador] > max ))
max = num[contador];
}
// Mostra o maior nmero.
JOptionPane.showMessageDialog(null, O maior nmero + max);
}
}
Listagem 4.3 MaiorNumero.java
2. Compile e execute o programa e veja o resultado.
3. Modifque o programa para achar o menor nmero e mostr-lo.
Exerccio 2 | Construindo Arrays de Objetos String
1. Usando arrays unidimensionais de String
1.1 | Usando arrays unidimensionais de String
1. Escreva, compile e execute a Listagem-4.4, DiasDaSemana.java, preste bastante
ateno aos comentrios.
public class DiasDaSemana {
public static void main(String[] args) {
// Declara e inicializa um array de String contendo os dias da semana
String[] dias = { Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado };
// Mostra dias da semana com lao forEach/Enhenced for Java 5.0
System.out.println(Mostra dias da Semana usando lao For-Each);
for (String str : dias)
System.out.print(str + );
37 www.3way.com.br
Java OO | Laboratrio 4
// Declara e inicializa um array de String contendo os dias da semana em Ingls
// veja que para cada elemento voc cria um objeto do tipo usado pelo array
String[] days = new String[7];
days[0] = new String(Sunday);
days[1] = new String(Monday);
days[2] = new String(Tuesday);
days[3] = new String(Wednesday);
days[4] = new String(Thursday);
days[5] = new String(Friday);
days[6] = new String(Saturday);
// imprime a traducao de portugues-ingles dos dias da semana
System.out.println(\nPORTUGUES - INGLES);
for (int i = 0; i < dias.length; i++) {
System.out.println(dias[i] + - + days[i]);
}
}
}
Listagem 4.4 DiasDaSemana.java
3. Crie um programa como o anterior, que contenha um nico array bidimensional de
String, onde cada linha contenha a String em Portugus e em Ingls do dia da semana, como
exemplo dias[0][0]=Segunda, dias[0][1]=Monday ..., e assim por diante.
38 www.3way.com.br
Java OO | Laboratrio 5
Lab 5 | Usando Objetos em Java
Neste laboratrio faremos uso de objetos Java, objetos de bibliotecas bsica, reforando
experincia de programao em Java e outros conceitos bsicos como invocao de mtodos (de
classe e de instncia), classes bsicas do pacote java.lang.
Durao prevista: 160 minutos
Exerccios
Exerccio 1: Criando uma instncia de objeto de uma classe usando a palavra chave
new (20 minutos)
Exerccio 2: Mtodos estticos e mtodos de instncia (no - esttico) (20 minutos)
Exerccio 3: Argumentos passado por valor e por referncia (20 minutos)
Exerccio 4: Escopo de variveis (20 minutos)
Exerccio 5: Coeso de tipos primitivos e classe Wrapper (30 minutos)
Exerccio 6: Comparando objetos (30 minutos)
Exerccio 7: Mtodo getClass() e o operador instanceof (20 minutos)
Exerccio 1 | Criando uma instncia de objeto de uma classe
usando a palavra chave new (20 minutos)
1.1 | Criando objetos da classe String
1. Usando sua IDE ou editor de arquivo crie um arquivo ClasseEObjeto.java com base na
Listagem-2.1 abaixo. Estude o cdigo prestando muita ateno aos comentrios.
public class ClasseEObjeto {
public static void main(String[] args) {
// Para criar uma instncia de uma classe use a palavra chave new
// Por exemplo, para criar uma instncia da classe String
// procedemos como segue
String strObjeto1 = new String(Este objeto e uma instncia da classe String);
System.out.println(estado da instncia de strObjeto1 = + strObjeto1);
// A classe String e uma classe especial que permite a criao de uma
// instncia pela atribuio de um literal string. Nenhuma outra classe
// em java permite este tipo de criao. Alm disso para cada literal
// string e criada uma nica instncia desta string
String strObjeto2 = Este objeto uma instncia da classe String;
System.out.println(estado da instncia de strObjeto2 = + strObjeto2);
}
}
Listagem 2.1 ClasseEObjeto.java
39 www.3way.com.br
Java OO | Laboratrio
2. Compile e execute o programa ClasseEObjeto.java, observe o resultado da execuo:
estado da instncia de strObjeto1 = Este objeto uma instncia da classe String
estado da instncia de strObjeto2 = Este objeto uma instncia da classe String
3. Modifque o programa ClasseEObjeto.java para criar outra instncia da classe String
contendo o literal string Eu sou outra instncia da classe String e imprimir seu estado usando
o mtodo System.out.println(...)
1.2 | Criando objetos da classe Integer
1. Com base no programa ClasseEObjeto.java, modifque o programa para criar um
objeto da classe Integer (classe Wrapper do tipo primitivo int) cujo valor 20, veja na
Listagem-2.2.
public class ClasseEObjeto {
public static void main(String[] args) {
// Para criar uma instncia de uma classe use a palavra chave new
// Por exemplo, para criar uma instncia da classe String
// procedemos como segue
String strObjeto1 = new String(Este objeto e uma instncia da classe String);
System.out.println(estado da instncia de strObjeto1 = + strObjeto1);
// A classe String e uma classe especial que permite a criao de uma
// instncia pela atribuio de um literal string. Nenhuma outra classe
// em java permite este tipo de criao. Alm disso para cada literal
// string e criada uma nica instncia desta string
String strObjeto2 = Este objeto uma instncia da classe String;
System.out.println(estado da instncia de strObjeto2 = + strObjeto2);
// cria uma instncia de objeto da classe Integer
Integer intObjeto1 = new Integer(20);
System.out.println(estado da instncia de intObjeto1 = + intObjeto1);
}
}
Listagem 2.2 ClasseEObjeto.java criando objeto Interger
2. Modifque o programa anterior para criar e imprimir uma instncia da classe Double e
imprimir seu estado.
Exerccio 2 | Mtodos estticos e mtodos de instncia (no -
esttico)
Neste exerccio, voc aprender como invocar mtodos estticos (de classe) e no-
estticos (de instncia) de uma classe. Para invocar mtodos estticos usamos a seguinte forma:
<Nome da Classe>.<Nome do mtodo esttco>
5
40 www.3way.com.br
Java OO | Laboratrio
por exemplo,
Integer.parseInt(25); // parseInt um mtodo esttco da classe Integer
Um mtodo no-esttico (instncia) de uma classe s pode ser invocado a partir de uma
instncia do objeto da classe usando a seguinte forma:
<Nome da instncia de uma classe>.<Nome do mtodo no-esttco>
por exemplo,
String str = new String(Brazil com z); //cria instncia do objeto
str.charAt(0); //chama mtodo de instncia charAt()
//da classe String atravs da instncia do objeto
1. Crie o programa MetodosInstanciaEEstatico.java com base na Listagem-2.3 a abaixo.
public class MetodosInstanciaEEstatico {
public static void main(String[] args) {
// Cria duas instncias da classe String
String strInst1 = new String(Sou uma instncia de objeto da classe String);
String strInst2 = Viva com paixo!;
// Invoca o mtodo de instncia charAt()
// atravs das instncias da classe String
char x = strInst1.charAt(2);
char y = strInst2.charAt(1);
char z = strInst2.charAt(0);
System.out.println(O 3.o caracter da strInst1 = + x);
System.out.println(O 2.o caracter da strInst2 = + y);
System.out.println(O 1.o caracter da strInst2 = + z);
// Invoca o mtodo de instncia equalsIgnoreCase(...)
boolean b = strInst1.equalsIgnoreCase(strInst2);
String strInst3 = b ? Sim : No;

System.out.println(As variveis strInst1 + e strInst2 tem o mesmo + conjunto de
caracteres? + strInst3);
// Invoca um mtodo esttico, valueOf (int i), da classe String
int i = 23;
String strInst4 = String.valueOf(i);
System.out.println(valor de strInst4 = + strInst4);
// Voc j usou o mtodo esttico parseInt() da classe
// Integer no exerccio anterior
// Agora cria uma instncia de objeto da classe String
String strInst5 = new String(34);
int ii = Integer.parseInt(strInst5);
System.out.println(valor de ii = + ii);
}
}
Listagem 2.3 MetodoInstanciaEEstatco.java
2. Compile, rode o programa e observe o resultado.
5
41 www.3way.com.br
Java OO | Laboratrio
3. Modifque o programa MetodosInstanciaEEstatico.java para que o mesmo contenha
as instrues abaixo no fnal do mtodo main().
// O seguinte codigo ira gerar erro de compilacao
// uma vez que ele tentara invocar um metodo de instancia
// atraves do nome da classe. Corrija o este erro de compilacao
char f = String.charAt(2);
4. Compile o programa. O seguinte erro ser gerado pelo compilador:
Cannot make a statc reference to the non-statc method charAt(int) from the type String
5. Corrija o erro de compilao e novamente compile e execute o programa.
6. Como vou saber se um mtodo qualquer na biblioteca de Java esttico ou de instncia?
A resposta : consulte a documentao da API Java (http://docs.oracle.com/javase/6/docs/
api/java/lang/String.html#charAt(int) e veja se o mtodo em questo possui em sua assinatura a
palavra chave static. Veja na fgura:
7. Acrescente o trecho de cdigo abaixo, Listagem-2.4, no programa anterior. Consulte
na documentao da API se os mtodos so estticos ou de instncia e faa a correta invocao do
mtodo.
// mtodo endsWith()
String str = Hello;
System.out.println( str.endsWith( slo ) );
// mtodo foor()
System.out.println( Math.foor(3.14));
// mtodo isDigit()
System.out.println( 0= + Character.isDigit(0));
System.out.println( A= +Character.isDigit(A));
Listagem 2.4 Identfque quais mtodos so de classe ou de instncia
5
42 www.3way.com.br
Java OO | Laboratrio
Exerccio 3 | Argumentos de mtodos passado por valor e por
referncia
Neste exerccio, voc ira praticar o conceito da passagem de parmetro por valor. Note que
os parmetros de tipos primitivos so passados o valor, enquanto parmetros do tipo referncia
so passados a referncia. Um array considerado um tipo referncia mesmo que os valores
armazenados nele sejam de um tipo primitivo.
3.1 | Passagem de parmetros por valor
1. Escreva, compile e execute a Listagem-2.5, TestaPassagemValor.java, preste bastante
ateno aos comentrios.
public class TestaPassagemValor {
public static void main(String[] args) {
int i = 10;
// Imprime valor de i
System.out.println(inicia mtodo main e i = + i);
// Chama mtodo test, que est defnido abaixo
// e passa valor inteiro como um parmetro. Uma vez que
// int um tipo primitivo, este argumento e passado
// por valor.
test(i);
// imprime o valor de i, note que valor de i no muda
System.out.println(termina o mtodo main e i = + i);
}
// Mtodo esttico na classe
public static void test(int j) {
System.out.println(inicia mtodo test e j = + j);
// muda valor parmetro i
j = 33;
System.out.println(termina mtodo test e j = + j);
}
}
Listagem 2.5 Passagem de parmetro por valor
2. Modifque TestaPassagemValor.java como segue abaixo e execute a classe.
2.1. Passe um segundo parmetro de tipo primitivo para o mtodo test, exemplo test(int
j, int k) - voc pode escolher qualquer parmetro de tipo primitivo (tal como long ou boolean).
2.2. Atribua um valor ao segundo parmetro antes de chamar o mtodo test(...). E mude o
valor do parmetro passado dentro do mtodo test(...), como voc fez com o primeiro parmetro
na Listagem-2.5 acima.
2.3. Modifque os mtodos System.out.println(...) para indicar os valores do primeiro
parmetro e do segundo parmetro.
5
43 www.3way.com.br
Java OO | Laboratrio
3.2 | Passagem de parmetros por referncia
1. Escreva, compile e execute a Listagem-2.6, TestaPassagemReferencia.java, preste
bastante ateno aos comentrios.
import java.util.Arrays;
public class TestaPassagemReferencia {
public static void main(String[] args) {
// criando um array de inteiros
int[] i = { 10, 20, 30 };
// Imprime valor de i
System.out.println(inicia metodo main e i = + Arrays.toString(i));
// Chama mtodo test que est defnido abaixo,
// e passa por referncia o array de inteiro como um parmetro.
// Uma vez que um array do tipo referncia,
// este argumento e passado
// por referncia.
test(i);
// imprime o valor de i. Note que o valor de i no muda
System.out.println(termina o mtodo main e i = + Arrays.toString(i));
}
// Mtodo esttico na classe
public static void test(int[] j) {
System.out.println(inicia mtodo test e j = + Arrays.toString(j));
// muda valor do parmetro i
j[0] = 33;
j[1] = 66;
System.out.println(termina mtodo test e j = + Arrays.toString(j));
}
}
Listagem 2.6 Passagem de parmetros por referncia
2. Observe que a classe utiliza o mtodo toString() da classe java.util.Arrays para
podermos imprimir o conjunto de elementos do array, apesar de ainda no termos visto arrays em
Java o exerccio demonstra bem o conceito.
3. bom saber que a referncia tratada como um tipo primitivo, a fnal ele simplesmente
armazena o endereo de um objeto, logo a referncia passada por valor. Pense nisso.
Exerccio 4 | Escopo de variveis
Neste exerccio, voc praticar o conceito de escopo de varivel. Voc tambm aprender como
declarar trs tipos de variveis: varivel esttica, varivel de instncia e a varivel local.
5
44 www.3way.com.br
Java OO | Laboratrio
4.1 | Um programa que demonstra escopo de variveis
1. Escreva, compile e execute a Listagem-2.7, EscopoDeVariavel.java, preste bastante
ateno aos comentrios.
public class EscopoDeVariavel {
public static void main(String[] args) {
int var1 = 10;
if (var1 < 100) {
int var2 = 20;
} else {
int var2 = 21;
}
// Acesso a var1 permitido, ento no h erro de compilao.
System.out.println(valor de var1 = + var1);
// Acesso a var2 no permitido, ento erro de compilao ser gerado
System.out.println(valor de var2 = + var2);
}
}
Listagem 2.7 Escopo de varivel
2. Observe que haver um erro de compilao. Isto era esperado porque voc est tentando
ter acesso a varivel var2 e ela foi declarada dentro das { } do bloco if/else, ento o escopo de
acesso somente dentro das { } e no pode usada fora de seu escopo.
3. Modifque EscopoDeVariavel.java, como mostra a Listagem-2.8. Observe os
comentrios.
public class EscopoDeVariavel {
public static void main(String[] args) {
int var1 = 10;
// var2 agora esta defnida em todo escopo do metodo main
int var2 = 15;
if (var1 < 100) {
// int var2 = 20;
var2 = 20;
} else {
// int var2 = 21;
var2 = 21;
}
// Acesso a var1 permitido, ento no h erro de compilao.
System.out.println(valor de var1 = + var1);
// Acesso a var2 agora permitido, no h erro de compilao
System.out.println(valor de var2 = + var2);
}
}
Listagem 2.8 EscopoDeVariavel.java modifcado
5
45 www.3way.com.br
Java OO | Laboratrio
4. Compile e execute o programa modifcado.
4.2 | Um programa que usa trs tipos de variveis
1. Escreva, compile e execute a Listagem-2.9, TresTiposDeVariaveis.java, preste
bastante ateno aos comentrios.
public class TresTiposDeVariaveis {
// Exemplo de varivel esttica
static String staticVariable = Varivel de classe, ou esttica;
// Exemplo de varivel de instncia
String instanceVariable = varivel de instncia;
public static void main(String[] args) {
String localVariable = varivel local;
System.out.println(Varivel esttica = + staticVariable);
System.out.println(Varivel de instncia = + instanceVariable);
System.out.println(Varivel local = + localVariable);
}
}
Listagem 2.9 TresTiposDeVariaveis.java
2. Observe que variveis de instncia no podem ser referenciadas dentro de um contexto
esttico, o mtodo main() esttico.
3. Comente a linha de cdigo contendo o erro, compile e execute o programa.
4. Pense em outra forma de resolver este problema se for necessrio acessar a varivel de
instncia instanceVariable.
Exerccio 5 | Casting de tipos primitivos e classe Wrapper
Neste exerccio, voc praticar a moldagem (casting) de tipos primitivos e como converter
primitivos s classes de empacotamento (Wrapper) correspondentes e vice versa. Casting de
tipos de referncia sero exercitados em outro laboratrio.
1. Casting de tipos primitivos.
2. Convertendo primitivos para classes Wrapper.
5.1 | Casting de tipos primitivos
1. Escreva, compile e execute a Listagem-2.10, CastingPrimitivos.java, preste bastante
ateno aos comentrios.
public class CastingPrimitivos {
public static void main(String[] args) {
// casting implicito exemplo 1
int numInt = 10;
5
46 www.3way.com.br
Java OO | Laboratrio
double numDouble = numInt;
System.out.println(int + numInt + e implicitamente moldado para double + numDouble);
// casting implicito exemplo 2
int numInt1 = 3;
int numInt2 = 2;
double numDouble2 = numInt1 / numInt2;
System.out.println(numInt1/numInt2 + numInt1 / numInt2 + e implicitamente moldado para
+ numDouble2);
// casting explicito exemplo 1
double valDouble = 10.12;
int valInt = (int) valDouble;
System.out.println(double + valDouble + e explicitamente moldado para int + valInt);
// casting explicito exemplo 2
double x = 10.2;
int y = 2;
int resultado = (int) ( x / y );
System.out.println(x/y + x / y + e explicitamente moldado para int + resultado);
}
}
Listagem 2.10 CastngPrimitvos.java
2. Compile e execute o programa, veja o resultados:
int 10 e implicitamente moldado para double 10.0
numInt1/numInt2 1 e implicitamente moldado para 1.0
double 10.12 e explicitamente moldado para int 10
x/y 5.1 e explicitamente moldado para int 5
Em (1) e (2) ocorre uma converso explicita dos tipos, ou seja, o Java o faz automaticamente.
Em (2) ocorre uma diviso de nmeros inteiros resultado em um nmero inteiro que transformado
em double. J em (3) h uma diviso de inteiro/double resultando em um double. Neste caso
dizemos que est ocorrendo uma promoo numrica ou um alargamento do tipo.
3. Modifque o programa para fazer casting dos tipos long ->byte, foat->short, int-> char.
5.2 | Convertendo primitivos para classes Wrapper
1. Escreva, compile e execute a Listagem-2.10, CastingPrimitivos.java, preste bastante
ateno aos comentrios.
public class PrimitivaParaWrapper {
public static void main(String[] args) {
// cria uma instncia de objeto Integer
Integer intObjeto = new Integer(7801);
// Converte de Integer para primitivo int usando mtodo intValue()
int intPrimitiva = intObjeto.intValue();
System.out.println(int intPrimitiva = + intPrimitiva);
// Usando mtodo esttico da classe empacotadora Integer
// para converter uma String para o tipo primitivo int
String strInt = 65000;
int intConvertida = Integer.parseInt(strInt);
5
47 www.3way.com.br
Java OO | Laboratrio
System.out.println(int intConvertida = + intConvertida);
// Converte int primitivo para tipo Integer
Integer intObjeto2 = new Integer(intConvertida);
System.out.println(Integer intObjeto2 = + intObjeto2);
}
}
Listagem 2.10 PrimitvaParaWrapper.java, converte de primitvos para empacotadora e vsv
2. Compile e rode o programa, observe e procure entender o resultado.
3. Modifque o programa da Listagem-2.10 para criar uma varivel do tipo Long e
convert-la em seu tipo primitivo long, depois mostre seu valor.
4. Em Java 5.0 estas converses ocorrem implicitamente, pois agora h o recurso de
Autobox (empacotar) e AutoUnbox (desempacotar). Modifque a Listagem-2.10 para
que fque como na Listagem-2.11. Perceba como isso torna menos burocrtico o processo de
converso de primitivos para Wrapper e vice-versa.
public class AutoBoxUnbox {
public static void main(String[] args) {
// cria uma instncia de objeto Integer, autobox
Integer intObjeto = 7801;
// Converte de Integer para primitivo int, auto-unbox
int intPrimitiva = intObjeto;
System.out.println(int intPrimitiva = + intPrimitiva);
// Usando mtodo esttico da classe empacotadora Integer
// para converter uma String para o tipo Integer, autobox
String strInt = 65000;
Integer intConvertida = Integer.parseInt(strInt);
System.out.println(int intConvertida = + intConvertida);
// Converte Integer para primitivo int, autoUnbox
int intPrimitiva2 = intConvertida;
System.out.println(Integer intObjeto2 = + intPrimitiva2);
}
}
Listagem 2.11 - AutoBoxUnbox.java
Exerccio 6 | Comparando objetos
1. Escreva, compile e execute a Listagem-2.12, TestaIgualdadeObjeto.java, preste bastante
ateno aos comentrios.
public class TestaIgualdadeObjeto {
public static void main(String[] args) {
// Declara duas variveis do tipo String, str1 e str2
String str1, str2;
// Inicializando as variveis. Note que as variveis contem
// ponteiros para instncia de mesmo objeto atual.
str1 = Viver sem Deus...no viver!;
5
48 www.3way.com.br
Java OO | Laboratrio
str2 = str1;
// Mostra o valor das variveis str1 e str2
System.out.println(String1: + str1);
System.out.println(String2: + str2);
// A notao ==, quando e usada com variveis de referncia,
// se retornar true signifca que as variveis apontam para
// mesma instncia de um objeto, e se false no, so referencias diferentes
// Checa se str1 e str2 so o mesmo objeto para as duas variveis
// apontando para mesma instncia de um objeto do tipo String
System.out.println(Mesmo objeto? + ( str1 == str2 ));
// Reinicializa varivel str2. Ela agora aponta para um nova
// instncia de objeto String
str2 = new String(str1);
// Mostra valor das variveis str1 e str2
System.out.println(String1: + str1);
System.out.println(String2: + str2);
// Checa novamente se str1 e str2 so os mesmos
// objetos para as duas variveis
// apontando para mesma instncia de um objeto do tipo String
System.out.println(Mesmo objeto? + ( str1 == str2 ));
// Checa se str1 e str2 tem o mesmo valor
System.out.println(Mesmo valor? + str1.equals(str2));
}
}
Listagem 2.12 TestaIgualdadeObjeto.java
2. Compile e execute o programa.
3. Crie um programa como da Listagem-2.12 para criar e comparar dois objetos da
classe Integer.
4. String so objetos especiais em Java, podemos criar instncias de objetos apenas
atribuindo um literal a uma varivel do tipo String, exemplo:
String str1 = Viver sem Deus...no viver!;
String str2 = Viver sem Deus...no viver!;
Alm disso, cada objeto String criado desta forma apontam para mesma instncia do objeto,
ou seja qualquer literal String igual ao anterior apontar para o mesmo objeto.
Modifque o programa da Listagem-2.12 para demonstrar essa propriedade
Exerccio 7 | mtodo getClass() e o operador instanceof
Neste exerccio, voc usar o mtodo do getClass() da classe Object para encontrar uma
instncia de um objeto fora da classe. Voc aprender tambm como usar o operador instanceOf
para testar se uma instncia de objeto qualquer de um tipo particular de classe.
1. Usando mtodo getClass()
2. Usando operador instanceOf
5
49 www.3way.com.br
Java OO | Laboratrio
7.1 | Usando mtodo getClass()
1. Escreva, compile e execute a Listagem-2.13, TestaGetClass.java, preste bastante ateno
aos comentrios.
public class TesteGetClass {
public static void main(String[] args) {
// Cria instncia de objeto String
String str1 = A vida e para ser vivida... com Deus!;
// Encontrar informao externa de uma instncia de String
// via mtodo getClass(). Note que ele retorna uma instncia
// de objeto da classe Class
Class str1Class = str1.getClass();
System.out.println(A classe de str1 e uma instncia de + str1Class);
// O nome da classe da instncia de objeto Class.
String str1ClassName = str1Class.getName();
System.out.println(Nome da classe e + str1ClassName);
// Cria instncia de objeto Integer
Integer int1 = new Integer(34);
// Encontrar informao externa de uma instncia de Integer
// via mtodo getClass(). Note que ele retorna uma instncia
// de objeto da classe Class
Class int1Class = int1.getClass();
System.out.println(A classe de int1 uma instncia de + int1Class);
// O nome da classe da instncia de objeto Class.
String int1ClassName = int1Class.getName();
System.out.println(Nome da classe + int1ClassName);
}
}
Listagem 2.13 TestaGetClass.java
2. Monte, compile e execute.
3. Modifque o programa para criar uma instncia de objeto da classe java.util.Date e
mostre informaes desta classe.
7.2 | Usando operador instanceOf
1. Escreva, compile e execute a Listagem-2.14, TestaInstanceOf.java, preste bastante
ateno aos comentrios.
public class TestaInstanceOf {
public static void main(String[] args) {
// Criar objeto String
String str1 = Aprenda Java em Dez anos!;
Integer int1 = new Integer(40);
5
50 www.3way.com.br
Java OO | Laboratrio
// Checa se str1 do tipo String usando operador instanceof.
// Checa tambm se do tipo Object.
boolean b1 = str1 instanceof String;
System.out.println(str1 String: + b1);
boolean b2 = str1 instanceof Object;
System.out.println(str1 Object: + b2);
// Checa se int1 do tipo Integer usando operador instanceof.
// Checa tambm se do tipo Object.
b1 = int1 instanceof Integer;
System.out.println(int1 do tipo Integer: + b1);
b2 = int1 instanceof Object;
System.out.println(int1 Object: + b2);
b2 = int1 instanceof Number;
System.out.println(int1 do tipo Number: + b2);
}
}
Listagem 2.14 TestaInstanceOf.java
2. Consultando a documentao da API Java, voc vai observar que classe Integer uma
classe flha da classe java.lang.Number, e que esta flha de java.lang.Object. Por isto o teste de int1
instanceof Number retorna true.
3. Modifque o programa para criar uma instncia de objeto da classe Long e mostre que o
objeto do tipo Object, Number e da prpria classe Long.
5
51 www.3way.com.br
Java OO | Laboratrio
Lab 6 | Criando suas prprias classes
Neste laboratrio voc ir aprender a criar e usar suas prprias classes. A patir deste
laboratrio os exerccios dos prximos laboratrios possuem dependncias, ento deve ser feito
todos os exerccios, no pule nenhum exerccio porque ir precisar das classes que sero criadas e
das alteraes dos mtodos soliticadas. Lei atentamente os comentrios nos cdigos citados, eles
so importantes para voc entender o que est fazendo ou para qual utilidade do cdigo.
O projeto destes laboratrios a partir deste chegar ao fnal do curso com uma aplicao
completa representando o sistema de um banco ou empresa que trabalha com dinheiro e vrias
contas para armazenar os saldos. muito importante que seja feito os exerccios corretamente
para que a aplicao no tenha comportamentos estranhos. Em caso de dvida para resolver um
exerccio consulte o instrutor para a melhor soluo ou para descobrir o erro.
Apesar de a ferramenta sugerir o que deve ser feito para resolver alguns erros de
compilao, se voc no sabe ou no entende a soluo proposta, ento no a faa e tome cuidado
com a importao de classes de pacotes diferente do solicitado.
O diagrama abaixo mostra como fcar a parte de modelo do projeto, onde um cliente ter
UMA ou vrias CONTAS, uma CONTA de apenas uma AGNCIA e uma AGNCIA de um banco,
agora lendo o contrrio, um BANCO no tem nenhuma ou tem vrias AGNCIAS, uma AGNCIA
no tem nenhuma ou tem vrias CONTAS, uma CONTA no tem nenhum ou tem vrios clientes.
Figura 5.1 Diagrama UML para aplicao Banco
6
52 www.3way.com.br
Java OO | Laboratrio
Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse.
Durao prevista: 80 minutos
Exerccios
Exerccio 1: Defnindo e usando classes ( 20 minutos)
Exerccio 2: Membros estticos (10 minutos)
Exerccio 3: Sobrecarga (20 minutos)
Exerccio 4: Construtores (10 minutos)
Exerccio 5: referencia this (20 minutos)
Exerccio 1 | Defnindo e usando classes
1. Criando uma classe Conta.java, que representa uma conta de banco.
1.1 | Defnindo a nova classe Conta.java
1. Crie um novo projeto com o nome Banco e crie sua classe para que fque conforme a
especifcao UML abaixo.

Figura 5.1 Diagrama UML classe Conta
import java.util.Date;
public class Conta {
private int numero;

private String titular;

private double saldo;

private Date dataAbertura;
}
Listagem 5.1 Conta.java
2. Crie os mtodos getters e setters para todos os atributos da classe Conta.java
conforme exemplo abaixo:
public int getNumero() {
return numero;
}
6
53 www.3way.com.br
Java OO | Laboratrio
public void setNumero(int numero) {
this.numero = numero;
}
3. Crie a classe ContaService.java com os mtodos depositar(), sacar() e transferir()
conforme o cdigo na Listagem-5.2.
Figura 5.2 Diagrama UML classe ContaService
public class ContaService {
public void depositar(Conta contaDestino, double valor) {
// credita na conta e debita no caixa
contaDestino.setSaldo(contaDestino.getSaldo() + valor);
}
public void sacar(Conta contaSaque, double valor) {
// debita na conta e credita no caixa
contaSaque.setSaldo(contaSaque.getSaldo() - valor);
}
public void transferir(Conta contaSaque, double valor, Conta contaDestino) {
// transfere valor da conta para conta destino
this.sacar(contaSaque, valor);
this.depositar(contaDestino, valor);
}
}
Listagem 5.2 Classe ContaService.java
4. Agora crie uma nova classe TestaConta.java para fazer uso da classe Conta.java e
testarmos os seus mtodos conforme abaixo:
import java.util.Scanner;
public class TestaConta {
public static void main(String[] argv) {
// objeto para ler dados da console, captura o que for digitado
Scanner c = new Scanner(System.in);
// declara e inicializa saldo com valor digitado pelo usurio
System.out.println(Digite o saldo inicial da conta);
double saldoConta = c.nextDouble();
// declara e inicializa o numero da conta digitado pelo usurio
System.out.println(Digite o numero da conta);
int numeroConta = c.nextInt();
6
54 www.3way.com.br
Java OO | Laboratrio

// Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta
ContaService operacoesConta = new ContaService();

// cria uma instncia da classe Conta
Conta conta1 = new Conta();
// altera valor dos atributos da instncia da classe Conta
conta1.setNumero(numeroConta);
conta1.setSaldo(saldoConta);
// Nova instncia de Conta para transferncia
Conta conta2 = new Conta();
// Nova instncia de Conta para transferncia
Conta conta3 = new Conta();
// Mostra dados da instncia da classe Conta
System.out.println(O numero da Conta1 : + conta1.getNumero());
System.out.println(O saldo da Conta1 : + conta1.getSaldo());
// chamada ao mtodo depositar para adicionar saldo da conta
System.out.println(Ser creditado 100 reais na conta );
operacoesConta.depositar(conta1, 100.00);
System.out.println(Saldo da Conta1 : + conta1.getSaldo());
// chamada ao mtodo sacar para debitar no saldo da conta
System.out.println(Ser debitado 56.43 reais na conta );
operacoesConta.sacar(conta1, 56.43);
System.out.println(Saldo da Conta : + conta1.getSaldo());
System.out.println(Saldo da Conta 1 : + conta1.getSaldo());
System.out.println(Saldo da Conta 2 : + conta2.getSaldo());
System.out.println(Saldo da Conta 3 : + conta3.getSaldo());

// chamada ao mtodo tranferir para retirar o valor de conta1 para conta2
System.out.println(Transferir 50.00 de conta 1 para conta2 );
operacoesConta.transferir(conta1, 50.00, conta2);

System.out.println(Saldo da Conta 1 : + conta1.getSaldo());
System.out.println(Saldo da Conta 2 : + conta2.getSaldo());
System.out.println(Saldo da Conta 3 : + conta3.getSaldo());

}
}
Listagem 5.3 Classe TestaConta.java
4. Modifque sua classe para criar uma terceira instncia da classe Conta.java em sua
classe TestaConta.java como o nome da varivel conta3 e transfra 100,23 da varivel conta2
para conta3. Mostre o saldo de cada conta antes e depois da transferncia.
5. Confgure o campo dataAbertura de Conta.java para armazenar a data de criao
da instncia, ou seja, quando for instanciado o objeto Conta.java deve ser atribudo a data do
sistema operacional para a varivel e mostre o valor do atributo na tela aps a ser instanciado o
objeto para cada varivel na classe TestaConta.java.
Dica: Deve ser alterado o construtor da classe para possuir este comportado evitando que
seja criada uma instncia e no seja atribudo um valor para o atributo dataAbertura.
6
55 www.3way.com.br
Java OO | Laboratrio
Exerccio 2 | Membros estticos
1. Usando variveis estticas
2. Usando mtodos estticos
2.1 | Criando aplicativos que usam variveis estticas
1. Crie uma classe de UtilData.java, esta classe ser uma classe utilitria para podermos
manipular datas no projeto, ela defne variveis estticas que representam os nomes dos dias da
semana em Portugus. Crie a classe para que fque conforme a Listagem-5.4, UtilData.java.
import java.util.Calendar;
import java.util.Date;
public class UtilData {
// DiaDaSemana que representa Domingo
static int DOMINGO = Calendar.SUNDAY;
// DiaDaSemana que representa Segunda-Feira
static int SEGUNDA = Calendar.MONDAY;
// DiaDaSemana que representa Tera-Feira
static int TERA = Calendar.TUESDAY;
// DiaDaSemana que representa Quarta-Feira
static int QUARTA = Calendar.WEDNESDAY;
// DiaDaSemana que representa Quinta-Feira
static int QUINTA = Calendar.THURSDAY;
// DiaDaSemana que representa Sexta-Feira
static int SEXTA = Calendar.FRIDAY;
// DiaDaSemana que representa Sbado
static int SBADO = Calendar.SATURDAY;
// MesDoAno que representa Janeiro
int JANEIRO = Calendar.JANUARY;
// MesDoAno que representa Fevereiro
int FEVEREIRO = Calendar.FEBRUARY;
// MesDoAno que representa Maro
int MARO = Calendar.MARCH;
// MesDoAno que representa Abril
int ABRIL = Calendar.APRIL;
// Dia do Ms
static int DiaDoMes = Calendar.DAY_OF_MONTH;
// Dia da semana
static int DiaDaSemana = Calendar.DAY_OF_WEEK;
// Mtodo esttico annimo. As instrues dentro deste bloco
// esttico so executadas quando a classe carregada,
// ou seja, somente uma vez.
static {
System.out.println(Entrando no bloco esttico.);
Date data = Calendar.getInstance().getTime();
System.out.println(Saindo do mtodo esttico data = + agora(data));
6
56 www.3way.com.br
Java OO | Laboratrio
}
// mtodo esttico que retorna o valor da data formatado como String
static String agora(Date data) {
return new java.text.SimpleDateFormat(dd/MM/yyyy HH:mm).format(data);
}
// mtodo de instncia
// Formata uma data no formato dd/mm/aaaa hh:mm
String DDMMAAAAHHMM(Date data) {
return new java.text.SimpleDateFormat(dd/MM/yyyy HH:mm).format(data);
}
}
Listagem 5.4 Classe Data.java, membros esttcos
2. Agora crie outra classe ExemploVariavelEstatica.java conforme Listagem-5.5.
Observe o uso das variveis estticas, veja os comntrios.
public class ExemploVariavelEstatica {
public static void main(String[] args) {
// Acessando variveis estaticas da classe UtilData
// veja que voc no precisou criar uma instncia da classe UtilData
System.out.println(Dia da semana + UtilData.DOMINGO);
System.out.println(Dia da semana + UtilData.SEGUNDA);
System.out.println(Dia da semana + UtilData.QUARTA);
System.out.println(Dia da semana + UtilData.SBADO);
// Acesso a varivel de instncia data da classe UtilData
// Voc tem que criar uma instncia da classe antes de voc poder acessar seu valor.
UtilData data = new UtilData();
System.out.println(Mes do ano + data.JANEIRO);
System.out.println(Mes do ano + data.FEVEREIRO);
System.out.println(Mes do ano + data.ABRIL);
System.out.println(Mes do ano + data.MARO);
// A varivel esttica pode ser acessada por varivel de instncia de objeto
System.out.println(Dia da Semana + data.DiaDaSemana);
data.DiaDaSemana = 3;
System.out.println(Mudou Dia da Semana + data.DiaDaSemana);
// Variveis estticas podem sem acessada de mltiplas instncias
UtilData data2 = new UtilData();
System.out.println(instancia 1 Dia do Mes + UtilData.DiaDoMes);
System.out.println(instancia 2 Dia do Mes + data2.DiaDoMes);
data2.DiaDoMes = 20;
System.out.println(instancia 1 Mudou Dia do Mes + UtilData.DiaDoMes);
System.out.println(instancia 2 Mudou Dia do ms + data2.DiaDoMes);
}
}
Listagem 5.5 ExemploVarivelEsttca.java
3. Agora modifque a classe UtilData.java para que os membros no estticos
(Janeiro,Fevereiro, etc) se tornem estticos.
6
57 www.3way.com.br
Java OO | Laboratrio
4. Modifque a Listagem-5.5 para imprimir os valores dos novos membros estticos que
voc modifcou no exerccio anterior.
2.2 | Criando aplicativos que usam mtodos estticos
1. Observe a Listagem-5.6, ela apresenta o uso de mtodos estticos, compile o programa e
veja as notas da compilao.
import java.util.Date;
public class ExemploMetodoEstatico {
public static void main(String[] args) {
Date data = new Date();
// Invocando metodo estatico da classe UtilData, nao preciso instanciar a classe UtilData
System.out.println(UtilData.agora(data));
// Metodo esttico pode ser invocado por uma instancia da classe UtilData
UtilData idata = new UtilData();
System.out.println(idata.agora(data));
// Metodo de instancia so pode ser invocado por uma instancia
System.out.println(idata.DDMMAAAAHHMM(data));
// Metodos de instancia nao podem ser invocados diretamente ocorre erro de compilacao
UtilData.DDMMAAAAHHMM(data);
}
}
Listagem 5.6 ExemploDeMetodosEstatcos.java
2. Modifque a listagem anterior de modo a corrigir o erro de compilao e poder executar o
programa. Voc ter que alterar o modifcador de acesso de alguns mtodos da classe UtilData.java
e alterar a referncia a chamada de um mtodo na classe ExemploDeMetodoEstaticos.java.
Exerccio 3 | Sobrecarga
1. Mtodos sobrecarregados
3.1 | Adicionando mtodos sobrecarregados
1. Modifque a classe ContaService.java conforme abaixo, observe as duas verses do
mtodo transferir() apresentadas abaixo.
public class ContaService {
public void depositar(Conta contaDestino, double valor) {
// credita na conta e debita no caixa
contaDestino.setSaldo(contaDestino.getSaldo() + valor);
}
public void sacar(Conta contaSaque, double valor) {
6
58 www.3way.com.br
Java OO | Laboratrio
// debita na conta e credita no caixa
contaSaque.setSaldo(contaSaque.getSaldo() - valor);
}
// Para no implementar a mesma regra duplicado este mtodo chama o segundo transferir
// e informa o limite com valor zero para representando que no possui saldo.
public void transferir(Conta contaSaque, double valor, Conta contaDestino) {
// transfere valor da conta para a conta destino
transferir(contaSaque, valor, contaDestino, 0);
}
// Sobrecarga do mtodo com argumentos diferentes, quando for invocado este mtodo
// dever ser informado um valor para limite (cheque especial) que ser adicionado ao
// saldo da conta para verifcar se pode ocorrer a transferncia.
public void transferir(Conta contaSaque, double valor, Conta contaDestino, double limite) {
if (( contaSaque.getSaldo() + limite ) < valor) {
System.out.print(Saldo insufciente para esta operao);
return;
}
// transfere valor da conta para conta destino
this.sacar(contaSaque, valor);
this.depositar(contaDestino, valor);
}
}
Listagem 5.7 Mtodos sobrecarregado
2. Execute a classe TestaConta.java para testar se ir executar corretamente.
3. Para testar a execuo dos dois mtodos transferir da classe ContaService.java que
foram criados crie a classe SobrecargaTransferir.java confome abaixo:
public class SobrecargaTransferir {
public static void main(String[] argv) {
// Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta
ContaService operacoesConta = new ContaService();
// cria uma instncia da classe Conta
Conta conta1 = new Conta();
// confgura instncia da classe Conta
conta1.setNumero(1234567890);
conta1.setSaldo(500.00);
// cria nova instancia de Conta para tranferencia
Conta conta2 = new Conta();
conta2.setSaldo(50.00);
// cria nova instancia de Conta para tranferencia
Conta conta3 = new Conta();
System.out.println(Transferir 400.00 de conta 1 para conta2 );
// tranferindo valor de conta1 para conta2 utilizando transferencia sem limite
operacoesConta.transferir(conta1, 400.00, conta2);
System.out.println(Saldo da Conta 1: + conta1.getSaldo());
6
59 www.3way.com.br
Java OO | Laboratrio
System.out.println(Saldo da Conta 2: + conta2.getSaldo());
System.out.println(Saldo da Conta 3: + conta3.getSaldo());
// tranferindo valor de conta1 para conta2 utilizando transferencia com limite
operacoesConta.transferir(conta1, 200.00, conta2, 300);
System.out.println(Saldo da Conta 1: + conta1.getSaldo());
System.out.println(Saldo da Conta 2: + conta2.getSaldo());
System.out.println(Saldo da Conta 3: + conta3.getSaldo());
}
}
Listagem 5.8 Usando mtodos sobrecarregados
4. Crie uma terceira instncia da classe Conta.java com nome da varivel conta3 na
Listagem-5.8 e transfra 100.00 com e sem limite de conta2 para conta3. Mostre o saldo de cada
conta antes e depois de cada transferncia, usando os mtodos sobrecarregados.
5. Modifque a classe UtilData.java como mostrado abaixo. Perceba que foi alterado o tipo
das variveis data para Calendar e defnido mtodos utilitrios para retornar o valor respectivo
de uma data e para retornar uma data baseado nor argumentos passados.
import java.util.Calendar;
import java.util.Date;
public class UtilData {
// representa Domingo
static fnal int DOMINGO = Calendar.SUNDAY;
// Segunda-Feira
static fnal int SEGUNDA = Calendar.MONDAY;
// Tera-Feira
static fnal int TERA = Calendar.TUESDAY;
// Quarta-Feira
static fnal int QUARTA = Calendar.WEDNESDAY;
// Quinta-Feira
static fnal int QUINTA = Calendar.THURSDAY;
// Sexta-Feira
static fnal int SEXTA = Calendar.FRIDAY;
// Sbado
static fnal int SBADO = Calendar.SATURDAY;
// Constri uma data representando agora
public static Date data() {
return Calendar.getInstance().getTime();
}
// Constri uma data representando um dado dia.
// Para efetuar comparaes entre datas, hora ser 00:00:00.0 (0 horas, 0 minutos, 0 segundos, 0
milissegundos)
public static Calendar data(int dia, int mes, int ano) {
return data(dia, mes, ano, 0, 0, 0);
}
6
60 www.3way.com.br
Java OO | Laboratrio
// Constri uma data representando um dado dia e hora.
// Para permitir comparaes de datas, os milissegundos da data so zerados.
public static Calendar data(int dia, int mes, int ano, int hora, int min, int seg) {
Calendar data = Calendar.getInstance();
data.set(ano, --mes, dia, hora, min, seg);
data.set(Calendar.MILLISECOND, 0);
return data;
}
// Retorna uma data com dia, mes e ano passado como String e formato como argumento
public static Calendar data(String data) {
return data(Integer.valueOf(data.split(/)[0]), Integer.valueOf(data.split(/)[1]),
Integer.valueOf(data.split(/)[2]));
}
public static Date getDate(Calendar data) {
return data.getTime();
}
// Formata uma data no formato dd/mm/aaaa
public static String DDMMAAAA(Date data) {
return new java.text.SimpleDateFormat(dd/MM/yyyy).format(data);
}
// Formata uma data no formato dd/mm/aaaa hh:mm
public static String DDMMAAAAHHMM(Date data) {
return new java.text.SimpleDateFormat(dd/MM/yyyy HH:mm).format(data);
}
// mtodo esttico que retorna o valor da data formatado como String
public static String agora(Date data) {
return new java.text.SimpleDateFormat(dd/MM/yyyy HH:mm).format(data);
}
// Retorna o Ano correspondente a esta data
public int getAno(Date data) {
fnal Calendar calendario = Calendar.getInstance();
calendario.setTime(data);
return calendario.get(Calendar.YEAR);
}
// Retorna o ms correspondendo a esta data.
public int getMes(Date data) {
fnal Calendar calendario = Calendar.getInstance();
calendario.setTime(data);
return calendario.get(Calendar.MONTH);
}
// Retorna o dia correspondendo a esta data.
public int getDia(Date data) {
fnal Calendar calendario = Calendar.getInstance();
calendario.setTime(data);
6
61 www.3way.com.br
Java OO | Laboratrio
return calendario.get(Calendar.DAY_OF_MONTH);
}
// Acrescenta um nmero de dias data.
public void somarDia(Date data, int numDias) {
fnal Calendar calendario = Calendar.getInstance();
calendario.setTime(data);
calendario.add(Calendar.DAY_OF_MONTH, numDias);
}
}
Listagem 5.9 UtlData.java com sobrecarga de contrutores
Exerccio 4 | Construtores
1. Usando mltiplos construtores
2. Encadeando construtores com o mtodo this()
4.1 | Defnindo mltiplos construtores numa classe
1. Crie um construtor na classe Conta.java que receba como argumento o nome do titular e
o nmero da conta e armazene esses valores nas suas respectivas variveis e armazene o valor 0
(zero) no atributo saldo conforme abaixo:
// construtor com dois parametros
public Conta( String nome, int nconta ) {
numero = nconta;
titular = nome;
saldo = 0.0; // Conta em reais e zerada
}
2. Tnhamos defnido que todo objeto da classe Conta.java ao ser criado deve ser atribudo
a data de abertura conforme construtor padro criado. Para que no seja necessrio reescrevermos
esta regra de negcios vamos fazer com que ao ser chamado o construtor com nome e numero de
conta, este construtor automaticamente invoque o construtor que atribui a data de criao com
this() conforme abaixo.
public Conta( String nome, int nconta ) {
this();
numero = nconta;
titular = nome;
saldo = 0.0; // Conta em reais e zerada
}
3. Crie a classe TestaConstrutor.java para criar duas variveis de Conta.java, cada uma
utilizando um construtor que foi criado e imprima a data de abertura.
6
62 www.3way.com.br
Java OO | Laboratrio
Exerccio 5 | Referncia this
1. Invocando mtodos com this
2. this como parmetro
5.1 Invoque mtodos com this
1. Nossa classe ContaService.java precisa registrar o histrico de transaes (dbito, crdito),
para fcar mais dinmico precisamos de uma classe que armazene as informao das transaes.
Ento crie o enum EnumTipoTransacao.java e a classe Transacao.java como abaixo Listagem-5.10:
Arrume os importes para as classes dos pacotes corretos.
public enum EnumTipoTransacao {
SAQUE, DEPOSITO, TRANSFERENCIA;
}
import java.util.Calendar;
public class Transacao {
private Date data;
private Conta contaDebito;
private Conta contaCredito;
private double valor;
private String descricao;
private EnumTipoTransacao tipoTransacao;
public Transacao( Date data, Conta contaDebito, Conta contaCredito, Double valor, String
descricao, EnumTipoTransacao tipoTransacao ) {
this.data = data;
this.contaDebito = contaDebito;
this.contaCredito = contaCredito;
this.valor = valor;
this.descricao = descricao;
this.tipoTransacao = tipoTransacao;
}
//get e set

public String toString() {
if (EnumTipoTransacao.TRANSFERENCIA == getTipoTransacao()) {
return Transacao data + UtilData.DDMMAAAAHHMM(getData()) + , conta debito +
getContaDebito().getNumero() + , conta credito + getContaCredito().getNumero() + , valor +
getValor() + , descricao -> + getDescricao();
} else if (EnumTipoTransacao.DEPOSITO == getTipoTransacao()) {
return Deposito data + UtilData.DDMMAAAAHHMM(getData()) + , conta +
getContaCredito().getNumero() + , valor + getValor() + , descricao -> + getDescricao();
} else if (EnumTipoTransacao.SAQUE == getTipoTransacao()) {
6
63 www.3way.com.br
Java OO | Laboratrio
return Saque data + UtilData.DDMMAAAAHHMM(getData()) + , conta +
getContaCredito().getNumero() + , valor + getValor() + , descricao -> + getDescricao();
}

return Nenhum tipo de transao;
}
}
Listagem 5.10 Classe Transao.java
2. Modifcaremos nossa classe Conta.java afm de mantermos o histrico de transaes, ser
criado uma varivel do tipo ArrayList para guardar uma lista de transaes ocorridas na conta.
import java.util.ArrayList;
import java.util.Calendar;
public class Conta {
private int numero;
private String titular;
private Date dataAbertura;
private double saldo;
private ArrayList movimento;
// construtor padro da classe Conta que defne a data de criao da conta e inicializa o array de
transacao
public Conta() {
dataAbertura = UtilData.data();
movimento = new ArrayList();
}
// construtor com dois parametros
public Conta( String nome, int nconta ) {
this();
numero = nconta;
titular = nome;
saldo = 0.0; // Conta em reais e zerada
}
// INSIRA OS MTODOS GETTERS E SETTERS
}
Listagem 5.11 Classe Conta
3.Modifque a classe ContaService.java inserindo os mtodos para manter o histrico de
transaes conforme abaixo Listagem-5.12.
public class ContaService {
public void depositar(Conta contaDestino, double valor) {
// credita na conta e debita no caixa
contaDestino.setSaldo(contaDestino.getSaldo() + valor);
6
64 www.3way.com.br
Java OO | Laboratrio
this.historicoTransacao(null, contaDestino, valor, deposito na conta + contaDestino.
getNumero(), EnumTipoTransacao.DEPOSITO);
}
public void sacar(Conta contaSaque, double valor) {
// debita na conta e credita no caixa
contaSaque.setSaldo(contaSaque.getSaldo() - valor);
this.historicoTransacao(null, contaSaque, valor, saque na conta + contaSaque.
getNumero(), EnumTipoTransacao.DEPOSITO);
}
// mtodo sobrecarregado, transfere dados desta conta (this) para outra
public boolean transferir(Conta contaSaque, double valor, Conta contaDestino) {
return transferir(contaSaque, valor, contaDestino, transferencia para conta +
contaDestino.getNumero());
}
// mtodo sobrecarregado, transfere valor desta conta (this) para outra conta e registra a
transao
public boolean transferir(Conta contaSaque, double valor, Conta contaDestino, String descr) {
if (contaSaque.getSaldo() - valor >= 0) {
this.debito(contaSaque, valor);
this.credito(contaDestino, valor);
this.historicoTransacao(contaSaque, contaDestino, valor, descr, EnumTipoTransacao.
TRANSFERENCIA);
return true;
} else {
return false;
}
}
// subtrai valor do saldo
protected void debito(Conta contaOperacao, double valor) {
contaOperacao.setSaldo(contaOperacao.getSaldo() - valor);
}
// adiciona valor ao saldo
protected void credito(Conta contaOperacao, double valor) {
contaOperacao.setSaldo(contaOperacao.getSaldo() + valor);
}
// cria um objeto transao e registra adicionando no movimento da conta
protected void historicoTransacao(Conta contaDebito, Conta contaCredito, double valor, String
descr, EnumTipoTransacao tipoTransacao) {
Transacao transacao = new Transacao(UtilData.data(), contaDebito, contaCredito, valor,
descr, tipoTransacao);
if (contaDebito != null) {

6
65 www.3way.com.br
Java OO | Laboratrio
contaDebito.getMovimento().add(transacao);

}

contaCredito.getMovimento().add(transacao);
}
} Listagem 5.12 Classe Conta
4. Observe como fazemos uso da referncia this no mtodo transferir(), neste caso
queremos evidenciar o uso dos mtodos pelo prprio objeto. Como so objetos da mesma classe
dizemos que h um auto-relacionamento. Perceba que todas operaes que podem ser realizadas
por ContaService.java agora esto sendo direcionadas internamente pelos mtodos invocados
para o mtodo transferir que registra o histrico de Transao no atributo movimento.
5. Crie a classe MovimentoContaCaixa.java como defnida abaixo para testarmos se o
histrico de transaes esta sendo gravado corretamente.
public class MovimentoContaCaixa {
public static void main(String[] args) {
// Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta
ContaService operacoesConta = new ContaService();
// cria conta caixa
Conta caixa = new Conta(ContaCaixa, 0);
caixa.setSaldo(100000);
Conta correntista1 = new Conta(Hinfe Liz, 1001);

// faz deposito
operacoesConta.depositar(correntista1, 1000);
Conta correntista2 = new Conta(ZILEF DAVIDA, 1002);

// faz deposito, transferir para conta caixa
operacoesConta.depositar(correntista2, 2000);
// Mostra saldo correntista 1
System.out.println(correntista1 saldo = + correntista1.getSaldo());
// Mostra saldo correntista 2
System.out.println(correntista2 saldo = + correntista2.getSaldo());
if (operacoesConta.transferir(correntista1, 100.00, correntista2)) {
System.out.println(transferencia ok);
} else {
System.out.println(nao pode transferir !);
}
// Mostra saldo correntista 1
System.out.println(correntista1 saldo = + correntista1.getSaldo());
// Mostra saldo correntista 2
System.out.println(correntista2 saldo = + correntista2.getSaldo());
// faz saque
operacoesConta.sacar(correntista2, 120.00);
System.out.println(saque ok);
6
66 www.3way.com.br
Java OO | Laboratrio
// Mostra saldo correntista 2
System.out.println(correntista2 saldo = + correntista2.getSaldo());
// mostra movimento correntista 1
System.out.println(correntista1.getMovimento());
// mostra movimento correntista 2
System.out.println(correntista2.getMovimento());
}
}
Listagem 5.13 MovimentoContaCaixa.java
6
67 www.3way.com.br
Java OO | Laboratrio
Lab 7 | Herana
Herana um dos conceitos mais importantes em Programao Orientada a Objeto
juntamente com Encapsulamento e Polimorfsmo. Basicamente herana permite o reuso de
cdigo, j que uma sub-classe (classe flha) pode usar as propriedade e mtodos defnidos na
super classe (classe pai).
O objetivo deste laboratrio permitir que voc entenda os conceitos de herana em Java.
Estaremos reutilizando muito dos exerccios anteriores, portanto classes citadas neste laboratrio
cuja listagem no esteja presente aqui porque voc j possui o cdigo como resultado de outros
laboratrios.
Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse.
Durao prevista: 90 minutos
Exerccios
Exerccio 1: Construindo programas que criam classes com herana (30 minutos)
Exerccio 2: Invocando construtores com palavra chave super (20 minutos)
Exerccio 3: Type Casting (20 minutos)
Exerccio 4: Palavra chave fnal em classes e mtodos (20 minutos)
Exerccio 1 | Construindo programas que criam classes atravs
1. Neste exerccio vamos construir uma classe Pessoa.java, onde Pessoa ser a classe pai
das demais classes que ir herdar suas caractersticas.
Figura 6.1 Diagrama UML classe Pessoa
public class Pessoa {
private String nome;
private String telefone;
private String endereco;
public Pessoa() {}
public Pessoa( String nome ) {
this.nome = nome;
}
//get e set
public void ImprimeNome() {
System.out.println(O nome da pessoa : + nome);
}
}
Listagem 6.1 classe Pessoa.
7
68 www.3way.com.br
Java OO | Laboratrio
2. Crie a classe Cliente.java abaixo, perceba que ela extends da classe Pessoa.java, isso
porque ele uma Pessoa, mas possui algumas caractersticas distintas.
public class Cliente extends Pessoa{
private String cpf;
private String rg;
public Cliente() {
}
public Cliente(String cpf) {

this.cpf = cpf;
}
//get e set
}
Listagem 6.2 classe Cliente herdando caracterstcas de Pessoa.
3. Altere a classe TesteHeranca.java conforme abaixo, compile e execute o programa,
veja o resultados.
public class TesteHeranca {
public static void main(String[] args) {
// cria uma pessoa
Pessoa pessoa = new Pessoa();
pessoa.setNome(Fulano de tal);
// Mostra toString() metodo sobrescrito na classe Cliente
pessoa.ImprimeNome();
// cria um cliente
Cliente cliente = new Cliente();
cliente.setNome(Fulano de tal);
cliente.setCpf(999.999.999-99);
// Mostra toString() metodo sobrescrito de Pessoa dentro da classe Cliente
cliente.ImprimeNome();
// metodo de acesso a atributo presente no objeto Pessoa
cliente.setTelefone((99)9999-9999);
// Mostra toString() metodo sobrescrito de Pessoa dentro da classe Cliente
cliente.ImprimeNome();
}
}
Listagem 6.3 classe TesteHeranca
7
69 www.3way.com.br
Java OO | Laboratrio
Exerccio 2 | Invocando construtores com palavra chave super
1. Modifque a Listagem-6.2, adicionando o trecho de cdigo abaixo para sobrepor o
construtor da superclasse Pessoa.java em Cliente.java, observe o uso do mtodo super() para
referenciar um construtor da classe Pessoa.java a ser invocado.
// construtores
public Cliente(String nome, String cpf ) {
super(nome);

this.cpf = cpf;
}
Listagem 6.4 Usando super em cadeia de contrutores.
2.Modifque a Listagem-6.2, faa override do mtodo ImprimeNome() de modo que deixe
claro qual instancia de Pessoa.
@Override
public void ImprimeNome() {
System.out.println(Nome do cliente : + getNome() + N CPF: + cpf + Seu endereco
: + getEndereco());
}
Listagem 6.5 Override mtodo transferir() classe ContaOuro.java
Exerccio 3 | Type Casting e Polimorfsmo
1. Modifque a classe TesteHeranca.java conforme Listagem-6.6 para testar a classe
Polimorfsmo em tempo de execuo e verifcar a referncia de instncia de uma varivel.
// referencia subclasse Cliente, upper casting
Pessoa pessoaCliente = new Cliente(Ze, 777.777.777-77);
// polimorfsmo no tempo de execucao
pessoaCliente.ImprimeNome();

Cliente pessoaCliente1 = (Cliente) pessoa; //Erro de compilao Pessoa no e tipo de Cliente
pessoaCliente1.ImprimeNome();
Listagem 6.6 TesteHeranca.java.
Exerccio 4 | Palavra chave fnal em classes e mtodos
1. Modifque Listagem-6.2 para no mais permitir herana da classe Cliente.java, usando
palavra chave fnal.
fnal public class Cliente extends Pessoa {...}
2. Crie e compile nova classe ClienteEspecial.java abaixo para testar se no ser mais
permitido uma classe herdar da classe Cliente.java, conseqentemente no sobrepondo o seu
comportamento.
public class ClienteEspecial extends Cliente{...}
7
70 www.3way.com.br
Java OO | Laboratrio
Voc ir ver que a classe no compilar porque esta tentando herdar de uma classe que foi
atribuda como fnal. Se voc retirar a declarao fnal da classe Cliente.java a classe compilar
sem erros, mas o correto apagar esta classe ClienteEspecial.java do projeto, este exerccio s
para mostrar que no possvel herdar de uma classe atribuda como fnal.
3. Modifque sua classe Cliente.java resultante do Exerccio 2 item 2, para no permitir
override do mtodo ImprimeNome() usando palavra chave fnal na defnio do mtodo.
@Override
public fnal void ImprimeNome() {
System.out.println(Nome do cliente : + getNome() + N CPF: + cpf + Seu endereco
: + getEndereco());
}
Listagem 6.7 mtodo fnal
4. Crie e tente compilar classe ClienteDosSonhos.java abaixo.
public class ClienteDosSonhos extends Cliente {
public ClienteDosSonhos ( String nome, int cpf ) {
super(nome, cpf);
}
public boolean ImprimeNome() {
System.out.println(Esse e o cliente dos sonhos, seu nome : + getNome() + N
CPF: + cpf + Seu endereco : + getEndereco());
}
}
Listagem 6.8 mtodo fnal no pode ser override
Voc ir perceber que a classe no compilar porque voc esta tentando sobrepor um
mtodo que foi declarado na super classe como fnal, para que a classe compile corretamente voc
pode remover a defnio de fnal do mtodo na super classe ou apagar o mtodo escrito na sub-
classe. Mas esta classe deve ser excluda do projeto porque este exerccio foi s para mostrar que
no possvel reescrever um mtodo declarado como fnal.
7
71 www.3way.com.br
Java OO | Laboratrio
Lab 8 | Interfaces e Classes Abstratas
Interface uma caracterstica da Linguagem de Programao Java que permite
fexibilidade e agilidade no desenvolvimento de aplicaes. Neste laboratrio voc ir explorar
o conceito de interfaces e classes abstratas. Ressaltamos que os exemplos deste laboratrio
dependem de outras listagens de cdigo desenvolvidas nos laboratrios anteriores.
Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse.
Durao prevista: 50 minutos
Exerccios
Exerccio 1: Classes Abstratas (25 minutos)
Exerccio 2: Interface como um tipo (25 minutos)
Exerccio 1 | Classes Abstratas
1. As classes do projeto Banco precisam de um padro de comportamento que identifque
que instancias dessas classes so referentes ao projeto, ser criada uma entidade que ir ser a
classe pai de todas as classes do projeto.
2. Crie uma classe EntdadeBanco.java abstrata, nesta crie um mtodo que retorne o
identifcador da classe, como na Listagem-7.1.
public abstract class EntidadeBanco {
public abstract Long getIdentifcador();
}
Listagem 7.1 Classe EntdadeBanco.java
3. Agora modifque as classes Pessoa.java, Conta.java e Transacao.java, de forma que
essas classes se tornem sub-classe de EntidadeBanco.java.
Observao: Como a classe EntidadeBanco.java abstrata contm um mtodo
abstrato getIdentifcador(), esta te forar a criar um atributo identifcador do tipo Long e
implementar os mtodos Get e Set. Este procedimento ser feito em todas as classes modifcadas.
private Long identifcador;

@Override
public Long getIdentifcador() {

return identifcador;
}

public void setIdentifcador(Long identifcador) {

this.identifcador = identifcador;
}
8
72 www.3way.com.br
Java OO | Laboratrio
Exerccio 2 | Interface como um tipo
1. Crie a Interface Entidade.java como defnida abaixo:
public interface Entidade {
Long getIdentifcador(); }
Listagem 7.2 Classe Entidade.javA
2. Implemente a classe EntidadeBanco.java de forma que implemente essa interface entidade.
public abstract class EntidadeBanco implements Entidade{...}

3. Crie a Interface IExtrato.java como defnida abaixo:
public interface IExtrato {
/**
* Formata o movimento como string.
*/
public String formatar() ;
}
Listagem 7.3 Interface Extrato
4. Agora crie a classe ExtratoTXT.java que implementa a interface IExtrato.java e implemente o
mtodo formartar() conforme abaixo:
import java.util.Iterator;
public class ExtratoTXT implements IExtrato {
protected Conta conta;
public ExtratoTXT(Conta conta) {
this.conta = conta;
}
public String formatar() {
String newLine = System.getProperty(line.separator);
String resultado = Extrato de conta + newLine;
resultado += String.format(%-20.20s, Data) +
+ String.format(%7.7s, Debito) +
+ String.format(%7.7s, Credito) +
+ String.format(%15.15s, Valor) +
+ String.format(%s, Descricao) + newLine;
Iterator it = conta.getMovimento().iterator();
while (it.hasNext()) {
Transacao t = (Transacao) it.next();
if(t.getTipoTransacao() == EnumTipoTransacao.TRANSFERENCIA){
resultado += String.format(%-20.20s, UtilData.DDMMAAAAHHMM(t.getData()))
+
+ String.format(%7d, t.getContaDebito().getNumero())
+
+ String.format(%7d, t.getContaCredito().getNumero())
+ + String.format(%15.15s, t.getValor()) +
8
73 www.3way.com.br
Java OO | Laboratrio
+ String.format(%s, t.getDescricao()) + newLine;
}
}
return resultado;
}
}
Listagem 7.4 ExtratoTXT.java

5. Crie a classe ExtratoHTML.java que implementa a interface IExtrato.java.
import java.util.Iterator;
public class ExtratoHTML implements IExtrato {
protected Conta conta;
public ExtratoHTML( Conta conta ) {
this.conta = conta;
}
public String formatar() {
String newLine = System.getProperty(line.separator);
String resultado = <html> + newLine;
resultado += <head> + newLine;
resultado += <title>Extrato de Conta</title> + newLine;
resultado += <style type=\text/css\> + newLine;
resultado += <!-- + newLine;
resultado += body { font-family: Verdana, Arial,Helvetica, + sans-serif; font-weight:
normal; font-variant: normal} + newLine;
resultado += .clsIndex { } + newLine;
resultado += .clsTitle { background-color: #CCCCCC; + text-align: center } + newLine;
resultado += td { font-size: 9pt; font-family: Verdana, Arial, + Helvetica, sans-serif;
background-color: #EEEEEE} + newLine;
resultado += --> + newLine;
resultado += </style> + newLine;
resultado += </head> + newLine;
resultado += <body> + newLine;
resultado += <h2>Extrato de conta</h2> + newLine;
resultado += <TABLE CLASS=\clsIndex\> + newLine;
resultado += <tr> + newLine;
resultado += <TD CLASS=\clsTitle\><B>Data</B></TD> + newLine;
resultado += <TD CLASS=\clsTitle\><B>Debito</B></TD> + newLine;
resultado += <TD CLASS=\clsTitle\><B>Credito</B></TD> + newLine;
resultado += <TD CLASS=\clsTitle\><B>Valor</B></TD> + newLine;
resultado += <TD CLASS=\clsTitle\><B>Descricao</B></TD> + newLine;
resultado += </tr> + newLine;
Iterator it = conta.getMovimento().iterator();
while (it.hasNext()) {
Transacao t = (Transacao) it.next();
if(t.getTipoTransacao() == EnumTipoTransacao.TRANSFERENCIA){
resultado += <tr> + newLine;
resultado += <TD align=\left\> + UtilData.DDMMAAAAHHMM(t.
getData()) + </TD> + newLine;
resultado += <TD align=\right\> + t.getContaDebito().getNumero()
+ </TD> + newLine;
resultado += <TD align=\right\> + t.getContaCredito().getNumero()
+ </TD> + newLine;
resultado += <TD align=\right\> + t.getValor() + </TD> +
8
74 www.3way.com.br
Java OO | Laboratrio
newLine;
resultado += <TD align=\left\> + t.getDescricao() + </TD> +
newLine;
resultado += </tr> + newLine;
}
}
resultado += </table> + newLine;
resultado += </body> + newLine;
resultado += </html> + newLine;
return resultado;
}
}
Listagem 7.5 ExtratoHTML.java
6. Crie a classe ExtratoContaCorrente.java para imprimir as movimentaes da classe
Conta.java.
public class ExtratoContaCorrente {
public static void main(String[] args) {
// Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta
ContaService operacoesConta = new ContaService();
Conta correntista1 = new Conta(Aluno, 1001);
Conta correntista2 = new Conta(Professor, 2002);
// faz deposito
operacoesConta.depositar(correntista1, 1000);
// faz transferencia de correntista1 para correntista2 e salva em memoria a transao
operacoesConta.transferir(correntista1, 450.00, correntista2);
// faz transferencia de correntista1 para correntista2 e salva em memoria a transao
operacoesConta.transferir(correntista2, 50.00, correntista1);
//IExtrato movimento = new ExtratoTXT(correntista1);
//System.out.println(movimento.formatar());
IExtrato movimento1 = new ExtratoHTML(correntista1);
System.out.println(movimento1.formatar());
}
}
Listagem 7.6 Imprime extrato Conta corrente.
7. Modifque a Listagem-7.6, para usando ExtratoHTML.java, Listagem-7.5, no lugar de ExtratoTXT.java.
8. Melhore o extrato imprimindo no cabealho o nome do cliente, numero da conta e data
de impresso.
resultado += Titular: + conta.getTitular() + Conta: + conta.getNumero() + + newLine;
resultado += Data de Impresso: + UtilData.DDMMAAAAHHMM(UtilData.data()) + + newLine;
8
75 www.3way.com.br
Java OO | Laboratrio
Lab 9 | Excees
Neste laboratrio faremos uso das estruturas de tratamento de erros, usando
Exceptions e Assertions. A linguagem de programao Java possui uma estrutura de
manipulao de exceo muito bem elaborado, que ajuda os desenvolvedores a separar a lgica de
tratamento de excees de sua lgica de negcios.
Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse.
Durao prevista: 60 minutos
Exerccios
Exerccio 1: Criando excees (30 minutos)
Exerccio 2: Usando excees (30 minutos)
Exerccio 1 | Criando excees
1. Quando sacamos e transferimos dinheiro de uma instncia da classe ContaService.
java, Laboratrio 5 exerccio 3, item 1, espera-se que o saldo seja sufciente para cobrir a
operao, porm pode ocorrer uma situao de exceo, ou seja, situao inesperada. Neste caso
podemos usar os mecanismos de controle de exceo em Java para contornar a situao. Veja o
cdigo abaixo, nele criamos uma nova classe de exceo SaldoInsufcienteException.java, para
indicarmos que no h saldo sufciente para que uma operao saque/transferncia ocorra.
public class SaldoInsufcienteException extends Exception {
public SaldoInsufcienteException() {
super(Saldo insufciente.);
}
public SaldoInsufcienteException( String mensagem ) {
super(mensagem);
}
}
Listagem 8.1 SaldoInsufcienteExcepton
2. Modifque o mtodo transferir() da classe ContaService.java, como na listagem
abaixo, ou seja, quando tentar fazer uma operao em uma conta, que seja necessrio verifcar se
possui saldo e o saldo for insufciente, ento aplicao lanar uma exceo.
@Override
public boolean transferir(Conta destino, double valor) throws SaldoInsufcienteException{
if (getSaldo() - valor >= 0) {
this.debito(valor);
destino.credito(valor);
historicoTransacao(this, destino, valor, transferencia para conta + destino.
getNumero());
return true;
9
76 www.3way.com.br
Java OO | Laboratrio
} else {
throw new SaldoInsufcienteException();
}
}
Listagem 8.2 Exceo mtodo transferir() classe ContaCorrente.java
3. A compilao da classe ContaService.java ir gerar um erro, isto se deve ao fato do
mtodo transferir() usado na sobrecarga como voc j viu necessrio fazer o tratamento da
exceo SaldoInsufcienteException. Modifque a classe ContaService.java, no mtodo
transferir() para desviar a exceo usando throws na assinatura do mtodo. Faa o mesmo
tratamento de exceo para o mtodo sacar().
Exerccio 2 | Usando excees
1. Crie a classe MovimentoContaCorrente.java conforme Listagem-8.3, para testar e
manipular a exceo que acabou de ser criada e adicionado ao mtodo transferir().
public class MovimentoContaCorrente {
public static void main(String[] args) {
// Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta
ContaService operacoesConta = new ContaService();
Conta correntista1 = new Conta(Aluno, 1001);
Conta correntista2 = new Conta(Aluna, 21);
// faz deposito
operacoesConta.depositar(correntista1, 100);
// faz Transferencia proibida
try {
operacoesConta.transferir(correntista1, 600, correntista2);
} catch (Exception e) {
System.out.println(e.getMessage());
}
// faz Transferencia autorizada
try {
operacoesConta.transferir(correntista1, 99.00, correntista2);
} catch (Exception e) {
System.out.println(e.getMessage());
}
ExtratoTXT movimento = new ExtratoTXT(correntista1);
System.out.println(movimento.formatar());
}
}
Listagem 8.3 MovimentoContaCorrente
9
77 www.3way.com.br
Java OO | Laboratrio
Lab 10 | Generics
O J2SE 5.0, introduziu vrias extenses linguagem Java. Uma foi de Generics
(genericidade), lhe permite abstrao de tipos. O exemplo mais comum so os tipos conteiner,
tal como os da hierarquia de classes em Collection. Antes de J2SE 5.0, quando voc extrai um
elemento de uma coleo, voc precisa fazer o cast do tipo do elemento armazenado na coleo.
Alm de ser inconveniente tambm inseguro. O compilador no checa se o tipo em cast
o mesmo do elemento na coleo, ento o cast pode falhar em tempo de execuo. Generics
prov uma maneira para voc comunicar o tipo da coleo ao compilador, assim ele poder fazer a
checagem em tempo de compilao. Uma vez que o compilador sabe o tipo do elemento da coleo,
o compilador pode checar se voc est usando a coleo de forma consistente e pode associar o
cast correto aos itens extrados da coleo.
Neste laboratrio, voc vai aprender como usar Generics fazendo uma extenso ao modelo
de classes utilizado at o momento. Sugerimos que estes exemplos sejam feitos com uso da IDE
Eclipse, com ela os erro de programao vo sendo mostrados imediatamente medida que voc
escreve o cdigo.
Durao prevista: 70 minutos
Exerccios
Exerccio 1: Construindo uma classe Genrica (30)
Exerccio 2: Generics e subtipagem (40)
Exerccio 1 | Construindo uma classe Genrica
1. A respeito da real necessidade, vamos criar uma nova classe chamada Movimento.
java que guardar todos as transaes realizadas em uma Conta.java conforme abaixo na
Listagem-9.1.
import java.util.*;
/**
* Classe que implementa um movimento de transacoes.
* Um movimento apenas uma serie de transacoes feitas.
* Todas as transacoes devem entrar aqui em ordem cronologica.
*/
public class Movimento<T> {
// uma colecao deve manter a ordem de inserao
private ArrayList<T> transacoes;
// Construtores
/**
* Controi um Movimento vazio (sem transacoes).
*/
public Movimento() {
this.transacoes = new ArrayList<T>();
}
/**
* Adiciona uma transacoes ao movimento.
10
78 www.3way.com.br
Java OO | Laboratrio
*/
public void add(T transacao) {
transacoes.add(transacao);
}
/**
* Fornece um Iterator para varrer as transacoes por data.
*/
public Iterator<T> getTransacoes() {
return transacoes.iterator();
}
}
Listagem 9.1 classe Movimento
2. Crie a classe TesteMovimento.java conforme a Listagem-9.2 e veja o uso da nova
classe. Ela funciona como um conteiner de um tipo de dados qualquer.
import java.util.Iterator;
public class TesteMovimento {
public static void main(String[] args) {
Movimento<Transacao> m1 = new Movimento<Transacao>();
Movimento<String> m2 = new Movimento<String>();
m1.add(new Transacao(UtilData.data(), new Conta(Fulano, 1000), new
Conta(Ciclano, 2000), 0.0, nda, EnumTipoTransacao.TRANSFERENCIA));

// erro compilacao
// m1.add(new String(qq coisa));
m2.add(new String(nda de +));
Iterator it;
it = m1.getTransacoes();
while (it.hasNext())
System.out.println(it.next());
it = m2.getTransacoes();
while (it.hasNext())
System.out.println(it.next());
}
}
Listagem 9.2 - TesteMovimento
3. A nova classe Movimento.java tem muito mais um fm didtico que funcional no
contexto da aplicao que voc est desenvolvendo ao longo destes laboratrios. Voc deve exclui-
la aps o termino desse laboratrio.

10
79 www.3way.com.br
Java OO | Laboratrio
Lab 11 | Colees
Neste laboratrio voc exercitar o uso de Collections desenvolvendo aplicaes.
Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse.
Durao prevista: 190 minutos
Exerccios
Exerccio 1: UML e Colees (60 minutos)
Exerccio 2: Usando a coleo Set (30 minutos)
Exerccio 3: Usando a coleo List (30 minutos)
Exerccio 4: Usando a coleo Map (20 minutos)
Exerccio 5: Ordenao, Busca e Manipulao de Dados (20 minutos)
Exerccio 1 | UML e Colees
1. A Figura-10.1 a representao parcial em UML do digrama de classes da aplicao
Banco que voc est escrevendo ao realizar os laboratrios. Crie e/ou modifque as classes
conforme mostrado s listagens abaixo.
Figura 10.1 Diagrama UML para aplicao Banco
11
80 www.3way.com.br
Java OO | Laboratrio
O diagrama te apresenta as relaes entre as classes, essas relaes so relaes do tipo has-
one. Logo, o diagrama nos informa que a classe Banco.java possui nenhuma ou vrias referncias
de objetos da classe Agencia.java, que Agencia.java tem zero ou mais referncias de objetos
da classe Conta.java, que a classe Conta.java tem zero ou mais referncias de objetos da classe
Cliente.java. Essas relaes so denominadas de agregao em UML.
Abaixo mostrado um possvel cdigo para esta representao grfca das relaes entre
as classes. Observe que a cardinalidade, relao numrica entre instncias de objetos das classes,
est sendo implementada para variveis do tipo java.util.Collection. Isto satisfaz o conceito da
cardinalidade representada no Diagrama UML. Pense o que seria necessrio fazer se voc tivesse
que usar um Array! A classe Collection uma das classes que faz parte do Framework Java
Collections, essas classes implementam algoritmos efcientes de busca, insero e remoo de
objetos dentro de estruturas que implementam conceitos de Lista, Fila, Mapas e Conjuntos,
facilitando o trabalho do programador, que s tem a responsabilidade de escolher a implementao
mais adequada para seu programa.
import java.util.Collection;
public class Banco extends EntidadeBanco {
private Long identifcador;
private int numero;
private String nome;
private Collection<Agencia> agencias;
//get e set
}
Listagem 10.1 Codifcao simplifcada da classe Banco
import java.util.ArrayList;
import java.util.Collection;
public class Agencia extends EntidadeBanco {
private Long identifcador;
private String nome;
private Banco banco;
private Collection<Conta> contas;
public Agencia( String nome ) {
this.nome = nome;

contas = new ArrayList<Conta>();
}
}
Listagem 10.2 Codifcao simplifcada da classe Agencia
11
81 www.3way.com.br
Java OO | Laboratrio
public class Pessoa extends EntidadeBanco {
private Long identifcador;
private String nome;
private String telefone;
private String endereco;
}
public class Cliente extends Pessoa {
private String cpf;
private String rg;
}
Listagem 10.3 Codifcao simplifcada da classe Cliente
public class Conta extends EntidadeBanco {
private Long identifcador;
private int numero;
private double saldo;
private Date dataAbertura;
private Collection<Transacao> transacoes;
private Cliente titular;
private Agencia agencia;
}
Listagem 10.4 Codifcao simplifcada da classe Conta
2. Modifque a classe Conta.java, para que o campo titular seja do tipo da classe Cliente.
java. Modifque tambm os construtores e mtodos da classe que fazem referncia ao campo
titular como String alterando para que seja do tipo Cliente.java.
Isto ir gerar erros em outras classes que estava sendo passado o titular como String e
agora deve ser um objeto do tipo Cliente.java, mas no se preocupe por enquanto, logo iremos
defnir uma soluo pratica para resolver esses erros de compilao.
3. Modifque a classe Cliente.java adicionando um construtor com parmetro String para
inicializar o atributo nome do tipo String.
Agora para resolver os erros de compilao quando utilizado o construtor de Conta(titular,
1) substitua por Conta(new Cliente(titular), 1), com esta alterao voc obedece a regra
do construtor passando um cliente como parmetro e ao mesmo tempo criando o objeto Cliente
passando para ele o nome que obrigatrio para o construtor da classe Cliente.java.
11
82 www.3way.com.br
Java OO | Laboratrio
Exerccio 2 | Usando coleo Set
A Interface Set herda da Interface Collection e, por defnio, probe elementos
duplicados dentro da coleo. Todos os mtodos da super-classe esto presentes e nem um
novo mtodo foi introduzido. As classes concretas que implementam Set dependem do mtodo
equals() do objeto adicionado para checar a igualdade dos objetos adicionados.
O Framework Collection Java fornece duas implementaes de propsito geral para
interface Set: HasSet e TreeSet. Com freqncia voc ir usar um HashSet para manter
colees sem elementos duplicados. Por razes de efcincia, objetos adicionados numa HashSet
necessitam da implementao do mtodo hashCode() de forma que o cdigo de hash seja
distribudo adequadamente. Para todo sistema em que voc criar suas prprias classes e desejar
armazen-los em um HashSet, lembre-se que voc dever sobrescrever o mtodo hashCode()
de Object.
A implementao TreeSet til quando voc precisa extrair elementos de uma coleo
de uma maneira ordenada. Para que o TreeSet trabalhe corretamente os objetos adicionados
devem ser classifcveis. O Framework Collection adiciona suporte para elementos que
implementam a Interface Comparable, que veremos mais adiante.
2.1 | Descartando elementos duplicados com HashSet
1. Sobreponha (override) o mtodo toString(), retornando o campo nome, na classe
Cliente.java.
2. Lembrando que dois objetos so iguais se ob1.equals(ob2) = true ento ob1.
hashCode() = ob2.hashCode(), assim os dois mtodos equals() e hashCode() sempre
devem ser modifcados juntos. Modifque a classe Conta.java, sobrepondo o mtodo equals(),
hashCode() e toString() de Object como na listagem abaixo.
/**
* Testa a igualdade de um objeto com este
*/
@Override
public boolean equals(Object objeto) {
boolean resultado = false;
if (( objeto != null ) && ( objeto instanceof Conta )) {
Conta c = (Conta) objeto;
if (getNumero() == c.getNumero()) {
resultado = true;
}
}
return resultado;
}
/**
* Gera cdigo hash para tabelas de epalhamento
*/
@Override
public int hashCode() {
return getNumero();
}
11
83 www.3way.com.br
Java OO | Laboratrio
@Override
public String toString() {
return getNumero() + - + getTitular().getNome();
}
Listagem 10.5 Override do mtodo equals() e hashCode()
3. Crie, compile e execute o cdigo abaixo para comprovar que a lista no aceitar registros
duplicados somente quando for implementado o equals e hashCode, o override no mtodo
toString simplesmente para simplifcar o valor a ser mostrado na console. Se quiser fazer um
teste no implementado o toString ir notar que a regra de no duplicidade ser mantida mas o
valor impresso na console ser desconhecido, ir mostrar o nome da classe concatenado com @ e
um nmero.
import java.util.HashSet;
public class TesteHashSet {
public static void main(String[] args) {
HashSet<Cliente> clientes = new HashSet<Cliente>();
clientes.add(new Cliente(Jesus));
// duplicado
clientes.add(new Cliente(Jesus));
clientes.add(new Cliente(Mateus));
clientes.add(new Cliente(Maria));
// duplicado
clientes.add(new Cliente(Maria));
clientes.add(new Cliente(Paulo));
clientes.add(new Cliente(Joo));
// imprimir com toString() de Cliente sem override de equals() e hashCode
System.out.println(clientes);
HashSet<Conta> contas = new HashSet<Conta>();
contas.add(new Conta(new Cliente(Ze), 5));
contas.add(new Conta(new Cliente(Lucas), 2));

contas.add(new Conta(new Cliente(Pedro), 1));
// duplicado o numero da conta
contas.add(new Conta(new Cliente(Maria), 1));

contas.add(new Conta(new Cliente(Joao), 0));
contas.add(new Conta(new Cliente(Ana), 4));
// imprimir com override de equals() e hashCode()
System.out.println(contas);
}
}
Listagem 10.6 Testando HashSet com elementos duplicados
Com a execuo do exemplo acima ir perceber que os primeiros registros que ser
mantido, os registros que tentou inserir mas que o valor retornou o mesmo de um existente na lista
foi ignorado e no adicionados.
11
84 www.3way.com.br
Java OO | Laboratrio
2.2 | Classifcando os elementos com TreeSet
1. Crie a classe TesteTreeSet.java conforme abaixo na Listagem-10.7, tente compilar e
executar.
import java.util.TreeSet;
public class TesteTreeSet {
public static void main(String[] args) {
TreeSet<Cliente> clientes = new TreeSet<Cliente>();
clientes.add(new Cliente(Jesus));
// duplicado
clientes.add(new Cliente(Maria));
clientes.add(new Cliente(Mateus));
clientes.add(new Cliente(Maria));
// duplicado
clientes.add(new Cliente(Maria));
clientes.add(new Cliente(Paulo));
clientes.add(new Cliente(Joo));
// imprimir com toString() de Cliente
// sem implementar Comparable
System.out.println(clientes);
}
}
Listagem 10.7 Usando TreeSet
2. Ao executar voc dever ser notifcado de que ocorre uma exceo do tipo
ClassCastException, isso deve-se ao fato de TreeSet tentar comparar os objetos que esto
sendo adicionados atravs do mtodo add(). O mtodo lana essa exceo toda vez que no
consegue comparar um objeto inserido na coleo. Para resolver este problema h duas solues:
implementar a interface Comparable ou usar um objeto comparador que implemente
Comparator atravs do construtor TreeSet(Comparator<? super E> comparator).
3. Modifque a classe Cliente.java para implementar a interface Comparable como
segue abaixo e compile e execute novamente a classe TesteTreeSet.java.
import java.util.Vector;
public class Cliente implements Comparable<Cliente> {
/**
* Permite comparaes, usando para classifcar
*/
public int compareTo(Cliente o) {
// comparando somente campo nome
return getNome().compareTo(o.getNome());
}
}
Listagem 10.8 Implementando Comparable
11
85 www.3way.com.br
Java OO | Laboratrio
Exerccio 3 | Usando coleo List
A interface List herda a interface Collection para defnir uma coleo ordenada,
permitindo elementos duplicados. A interface possui operaes orientadas pela posio, habilidade
de trabalhar com somente partes da lista.
H duas implementaes de propsito geral na Framework Collection: ArrayList e
LinkedList. Qual das duas implementaes utilizar vai depender de suas necessidades especifcas.
Se voc precisar de suporte para acesso aleatrio, com insero ou remoo de elementos em
qualquer parte da lista alm do fnal desta, ento ArrayList oferece uma implementao mais
otimizada. Se com freqncia voc precisar adicionar e remover elementos do meio da lista e s
acessar elementos seqencialmente, ento a LinkedList oferece o melhor algoritmo.
1. Crie a classe TesteArrayList.java compile e execute a listagem abaixo:
import java.util.ArrayList;
import java.util.List;
public class TesteArrayList {
public static void main(String[] args) {
List<String> al = new ArrayList<String>(2);
System.out.println(al + , size = + al.size());
// Adiciona itens ao ArrayList
al.add(Robaum);
al.add(Usurpa);
al.add(Omitte);
System.out.println(al + , size = + al.size());
// Remove item, usa equals e hashCode
al.remove(Usurpa);
System.out.println(al + , size = + al.size());
// Checa se a lista contem o elemento especifcado
Boolean b = al.contains(Omitte);
System.out.println(A lista contem Omitte = + b);
b = al.contains(Paumdu);
System.out.println(A lista contem Paumdu = + b);
}
}
Listagem 10.9 TesteArrayList
2. Modifque sua classe Agncia.java, Listagem-10.10, como segue o cdigo abaixo
adicionando os construtores:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Agencia {

//mantenha os atributos
public Agencia( String nome ) {
11
86 www.3way.com.br
Java OO | Laboratrio
this.nome = nome;
contas = new HashSet<Conta>();
}
public Agencia( String nome, Banco banco ) {
this(nome);
this.banco = banco;
}
Listagem 10.10 Classe Agencia
3. Crie a classe TesteLinkedList.java conforme abaixo, para testar uso de LinkedList.
import java.util.LinkedList;
public class TesteLinkedList {
public static void main(String[] args) {
// Cria LinkedList e adiciona 2 contas.
LinkedList<Conta> ll = new LinkedList<Conta>();

ll.add(new Conta(new Cliente(Falula), 1));
ll.add(new Conta(new Cliente(Bolula), 2));
System.out.println(ll + , tamanho = + ll.size());
// Insere novo cliente no inicio e fm da LinkedList.
ll.addFirst(new Conta(new Cliente(Zelula), 3));
ll.addLast(new Conta(new Cliente(Solula), 4));
System.out.println(ll);
System.out.println(ll.getFirst() + , + ll.getLast());
System.out.println(ll.get(1) + , + ll.get(2));
// Remove o primero e o ultimo
ll.removeFirst();
ll.removeLast();
System.out.println(ll);
// Adiciona outro cliente na posicao 2 da lista
ll.add(1, new Conta(new Cliente(Zoiudinha), 5));
System.out.println(ll);
// Substitui objeto no indice 2
ll.set(2, new Conta(new Cliente(Zoiudinha), 5));
System.out.println(ll);
}
}
Listagem 10.11 TesteLinkedList
Exerccio 4 | Usando coleo Map
A interface Map no uma extenso da interface Collection. Ao contrrio, a interface
Map possui sua prpria hierarquia, mantendo uma associao chave-valor. A interface
descreve um mapa de chaves para valores, sem chaves duplicadas, por defnio.
Os mtodos da interface podem ser vistos como trs conjuntos de operaes: alterao,
consultas e vises alternativas.
11
87 www.3way.com.br
Java OO | Laboratrio
As operaes de alterao permitem que voc adicione e remova uma chave-valor de um
mapa. Ambos, chave e valor podem ser null. Entretanto voc no deve adicionar um Map nele
mesmo como uma chave ou valor.
As operaes de consulta permitem que voc verifque o contedo do mapa.
Outras operaes lhe permitem trabalhar com um grupo de chaves ou valores da coleo.
Uma vez que as chaves no mapa devem ser nicas, voc pode recuperar estas chaves como um Set.
E como os valores no necessitam ser nicos, voc pode t-los de volta como um Collection.
Em especial, possvel retornar uma coleo Set de elementos que implementa a interface
Map atravs do mtodo entrySet(). Cada objeto na coleo um par de chave-valor especifco no
Map em questo. Atravs desta coleo, voc pode retornar uma chave ou valor, bem como mudar
o valor de cada entrada. Entretanto, o conjunto de entradas se tornar invalido, podendo deixar
seu comportamento indefnido, caso o Map em questo, seja modifcado sem o uso do mtodo
setValue() da interface Map.
O Framework Collections prov duas implementaes de propsito geral para interface
Map: HashMap e TreeMap. Assim como todas as implementaes, voc vai usar a mais
adequada a sua necessidade especifca. Para inserir, remover e localizar elementos no Map, o
HashMap sua melhor escolha. Entretanto se voc precisar percorrer as chaves numa ordem
classifcada, ento TreeMap sua melhor alternativa. Dependendo do aumento de tamanho da
coleo, pode ser mais rpido inserir elementos a um HashMap, ento converter o mapa para um
TreeMap e desta forma percorrer a coleo ordenada de chaves. O uso de um HashMap requer
que a classe dos objetos das chaves adicionadas tenham uma implementao bem defnida de
hashCode(). Com um TreeMap os elementos adicionados devem ser classifcveis.
4.1 | Usando HashMap
1. Modifque a classe Agencia.java sobreponto os mtodos equals, hashCode e
toString da classe Object utilizando o seu atributo nome.
2. Crie, compile e execute listagem abaixo.
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
public class TesteHashMap {
public static void main(String[] args) {
HashMap<Agencia, Cliente[]> hm = new HashMap<Agencia, Cliente[]>();
// adiciona chave - agencia e valor = array Cliente
hm.put(new Agencia(ag01), new Cliente[] { new Cliente(Enricando Cardoso), new
Cliente(Inacio Estole), new Cliente(Luiz Ladrum), });
hm.put(new Agencia(ag02), new Cliente[] { new Cliente(Henri Cando), new Cliente(Stolin
Lu La), new Cliente(Lara Pio), });
hm.put(new Agencia(ag03), new Cliente[] { new Cliente(Sony Gando), new Cliente(Leiro
Pisto), new Cliente(Waga Oubum Du), });
// imprime a colecao
System.out.println(hm);
// pega as chaves
11
88 www.3way.com.br
Java OO | Laboratrio
Set chaves = hm.keySet();
// imprime as chaves
System.out.println(chaves);
// pega os valores
Collection<Cliente[]> valores = hm.values();
// imprime os valores
for (Cliente[] cs : valores) {
for (Cliente c : cs) {
System.out.println(c);
}
}
}
}
Listagem 10.12 Agncias e Clientes
4.2 | Usando TreeMap
1. Para usar um TreeMap necessrio satisfazer o requisito da chave, que deve se
comparvel. Como nossa chave no exemplo a classe Agencia.java devemos garantir que
ele comparvel. Modifque a classe Agencia.java, redefnindo-a, de forma a implementar a
interface Comparable como voc fez para classe Cliente.java.
2. Crie, compile e execute listagem abaixo.
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeMap;
public class TesteTreeMap {
public static void main(String[] args) {
HashMap<Agencia, Cliente[]> hm = new HashMap<Agencia, Cliente[]>();
// adiciona chave - agncia e valor = array Cliente
hm.put(new Agencia(ag01), new Cliente[] { new Cliente(Enricando Cardoso), new
Cliente(Inacio Estole), new Cliente(Luiz Ladrum), });
hm.put(new Agencia(ag02), new Cliente[] { new Cliente(Henri Cando), new Cliente(Stolin
Lu La), new Cliente(Lara Pio), });
hm.put(new Agencia(ag03), new Cliente[] { new Cliente(Sony Gando), new Cliente(Leiro
Pisto), new Cliente(Waga Oubum Du), });
// criando TreeMap
TreeMap<Agencia, Cliente[]> tm = new TreeMap<Agencia, Cliente[]>(hm);
// imprime a coleo
System.out.println(tm);
// pega as chaves
Set chaves = tm.keySet();
// imprime as chaves
11
89 www.3way.com.br
Java OO | Laboratrio
System.out.println(chaves);
// pega os valores
Collection<Cliente[]> valores = tm.values();
// imprime os valores
for (Cliente[] cs : valores) {
for (Cliente c : cs) {
System.out.println(c);
}
}
}
}
Listagem 10.13 Agncias e Clientes
Exerccio 5 | Ordenando e Comparando Objetos nas Colees
Sabemos agora que a comparao, classifcao e outras regras utilizadas nas colees
dependem de mtodos a serem sobrescritos e interfaces a serem implementadas.
1. Implemente os mtodos equals(), hashCode() e toString() para as classes Banco.
java e Pessoa.java.
2. Implemente a interface Comparable na classe Banco.java e Conta.java.
11
90 www.3way.com.br
Java OO | Laboratrio
Lab 12 | Manipulando arquivos
Neste laboratrio voc exercitar a manipulao de arquivos em Java.
Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse.
Durao prevista: 40 minutos
Exerccios
Exerccio 1: Carregar um arquivo .txt, escrever e posteriormente fazer a leitura desse
arquivo.(40 minutos)
Exerccio 1 | Manipulando arquivos em java
1. Crie um arquivo .txt na raiz [Windows: C:/teste.txt] [Linux: /home/teste.txt] de seu SO.
Faa a leitura do mesmo utilizando objeto File.
2. Utilizando BufferedWriter escreva helloWorld nesse arquivo.
3. Utilizando BufferedReader leia o arquivo.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TesteManipulacaoArquivo {
public static void main(String[] args) {
File arquivo = new File(C:\\teste.txt);
try {
if (!arquivo.exists()) {
// cria um arquivo (vazio)
arquivo.createNewFile();
}
// caso seja um diretrio, possvel listar seus arquivos e diretrios
File[] arquivos = arquivo.listFiles();
// escreve no arquivo
FileWriter fw = new FileWriter(arquivo, true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(hello World);
bw.newLine();
bw.close();
fw.close();
// faz a leitura do arquivo
FileReader fr = new FileReader(arquivo);
12
91 www.3way.com.br
Java OO | Laboratrio
BufferedReader br = new BufferedReader(fr);
// equanto houver mais linhas
while (br.ready()) {
// l a proxima linha
String linha = br.readLine();
// faz algo com a linha
System.out.println(linha);
}
br.close();
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
12
92 www.3way.com.br
Java OO | Laboratrio
Lab 13 |Threads
Neste laboratrio voc far o uso bsico de thread em Java.
Exerccios
Exerccio 1: Herdando a classe Thread
Exerccio 2: Implementando Interface Runnable
Exerccio 3: Sincronizando threads
Exerccio 1 | Herdando a classe Thread
1.1 | O mtodo start() sem o construtor da subclasse
1. Crie um projeto Java, depois crie a classe ImprimeNomeThread.java conforme
cdigo abaixo.
// Subclass extends Thread class
public class ImprimeNomeThread extends Thread {
public ImprimeNomeThread( String nome ) {
super(nome);
}
// Sobrescreve metodo run() da classe Thread.
// Este metodo toma a execucao metodo start() for invocado
public void run() {
System.out.println(metodo run() da thread + this.getName() + e chamado);
for (int i = 0; i < 10; i++) {
try {
sleep(1000);
System.out.println(i + : + this.getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2. Agora vamos adicionar o mtodo main a classe ImprimeNomeThread.java, para que
crie execute nossa thread e a inicialize chamando o mtodo start() conforme abaixo.
// Cria instancia de uma classe que e
// subclasse da classe Thread
public static void main(String[] args) {
System.out.println(Criando instancia de ImprimeNomeThread...);
ImprimeNomeThread minhaThread = new ImprimeNomeThread(A);
// Inicia thread pela invocacao do metodo start()
System.out.println(Chamando metodo start() da thread + minhaThread.getName());
minhaThread.start();
}
13
93 www.3way.com.br
Java OO | Laboratrio
3. Execute o arquivo como aplicao java e fque de olho na console do Eclipse o
resultado que ser impresso. Perceba que enquanto eu no encerro o processo ou termine a
execuo forada da aplicao, o sistema no ir para de imprimir os valores na console.
1.2 | O mtodo start() est no construtor da subclasse
1. Modifque a thread ImprimeNomeThread.java, adicionado ao construtor a chamada
ao mtodo start() conforme abaixo. Esta alterao dispensa a necessidade de aps ser criado o
objeto pelo NEW tenha que chamar o mtodo start() para iniciar, ou seja, a thread ser criada e
inicializada por uma chamada ao seu construtor.
public ImprimeNomeThread(String nome) {
super(nome);
//metodo start() dentro do construtor da subclasse
start();
}
2. Modifque o mtodo main alterando o cdigo que foi adicionado no exerccio 2 anterior
para que fque conforme abaixo e execute novamente a aplicao para ver o que ir acontecer.
// Cria instancia de uma classe que e
//subclasse da classe Thread
System.out.println(Criando instancia de ImprimeNomeThread...);
ImprimeNomeThread pnt1 = new ImprimeNomeThread(A);
ImprimeNomeThread pnt2 = new ImprimeNomeThread(B);
ImprimeNomeThread pnt3 = new ImprimeNomeThread(C);

13
94 www.3way.com.br
Java OO | Laboratrio
Exerccio 2 | Implementando Interface Runnable
2.1 | Iniciando fora do construtor da classe que implementa Runnable
1. Agora vamos criar uma thred implementado a interface Runnable, crie a classe
ImprimeNomeRunnable.java conforme abaixo.
public class ImprimeNomeRunnable implements Runnable {
String nome;
public ImprimeNomeRunnable( String nome ) {
this.nome = nome;
}
// implementacao do metodo run() da interface Runnable
public void run() {
for (int i = 0; i < 10; i++) {
// sleep(1000); ERRO de compilao porque no herda Thread
System.out.println(i + : + nome);
}
}
}

2. Agora vamos adicionar o mtodo main a classe ImprimeNomeRunnable.java, para
que seja criado threads da classe que implementa Runnable.
public static void main(String[] args) {
ImprimeNomeRunnable pntr1 = new ImprimeNomeRunnable(RA);
Thread t1 = new Thread(pntr1);
13
95 www.3way.com.br
Java OO | Laboratrio
t1.start();
ImprimeNomeRunnable pntr2 = new ImprimeNomeRunnable(RB);
Thread t2 = new Thread(pntr2);
t2.start();
ImprimeNomeRunnable pntr3 = new ImprimeNomeRunnable(RC);
Thread t3 = new Thread(pntr3);
t3.start();
}
2.2 | Iniciando dento do construtor da classe que implementa Runnable
1. Vamos alterar a classe ImprimeNomeRunnable.java para iniciar a thread no
momento em que for criado o objeto, atravs do construtor, da mesma forma que fzemos
anteriormente com a classe que herdava de Thread. Altere a classe para que fque conforme
abaixo.
public class ImprimeNomeRunnable implements Runnable {
Thread thread;
public ImprimeNomeRunnable( String nome ) {
thread = new Thread(this, nome);
thread.start();
}
// implementacao do metodo run() da interface Runnable
13
96 www.3way.com.br
Java OO | Laboratrio
public void run() {
for (int i = 0; i < 10; i++) {
try {
thread.sleep(1000); // Agora permitido porque uma thread
System.out.println(i + : + thread.getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2. Altere o cdigo que foi adicionado ao mtodo main no exerccio 2 para que fque
conforme abaixo, ou seja, sem ter que declarar um objeto do tipo Thread e depois invocar o
mtodo start() e execute a aplicao para ver o resultado.
ImprimeNomeRunnable pntr1 = new ImprimeNomeRunnable(RA);
ImprimeNomeRunnable pntr2 = new ImprimeNomeRunnable(RB);
ImprimeNomeRunnable pntr3 = new ImprimeNomeRunnable(RC);
Exerccio 3 | Sincronizando threads
3.1 | Threads no sincronizados
1. Crie a classe DuasStrings.java que ser utilizada para imprimir valores e para a
thread em execuo.
13
97 www.3way.com.br
Java OO | Laboratrio
public class DuasStrings {
// este mtodo no est synchronized
static void print(String str1, String str2) {
System.out.print(str1);
try {
// interrompe a thread
Thread.sleep(500);
} catch (InterruptedException ie) {
}
System.out.println(str2);
}
}
2. Escreva a nova classe de thread implementando a interface Runnable conforme abaixo.
public class ImprimeStringsThread implements Runnable {
Thread thread;
String str1, str2;
ImprimeStringsThread( String str1, String str2 ) {
this.str1 = str1;
this.str2 = str2;
thread = new Thread(this);
thread.start();
}
public void run() {
DuasStrings.print(str1, str2);
}
}
3. Crie a classe abaixo e execute como uma aplicao Java e veja o resultado na console do
Eclipse. Este exemplo mostra resultados no desejados uma vez que o thread no foi sincronizado.
public class ThreadNaoSincronizada {
public static void main(String[] args) {
new ImprimeStringsThread(Voce , aqui ?);
new ImprimeStringsThread(Muito bem , obrigado!);
new ImprimeStringsThread(Como voce , esta?);
}
}
13
98 www.3way.com.br
Java OO | Laboratrio
3.2 | Sincronizando threads atravs de mtodos
1. Para sincronizar threads necessrio utilizar synchronized, ento altere a classe
DuasString.java conforme cdigo abaixo fazendo com que o mtodo print seja sincronizado.
public class DuasStrings {
// este mtodo no est synchronized
synchronized static void print(String str1, String str2) {
System.out.print(str1);
try {
// interrompe a thread
Thread.sleep(500);
} catch (InterruptedException ie) {
}
System.out.println(str2);
}
}
2. Crie a classe ThreadSincronizada.java conforme cdigo abaixo, para testar a
execuo de Threads sincronizadas e execute a classe como uma Aplicao Java e veja o
resultado na console do Eclipse.
3.3 | Sincronizando threads atravs de sentenas
1. Modifque a classe ImprimeStringsThread.java adicionando mais um atributo e um novo
construtor, fazendo sobrecarga de construtores na classe, conforme na listagem abaixo:
DuasStrings ds = new DuasStrings();
ImprimeStringsThread(String str1, String str2,DuasStrings ds) {
13
99 www.3way.com.br
Java OO | Laboratrio
this.str1 = str1;
this.str2 = str2;
this.ds = ds;
thread = new Thread(this);
thread.start();
}
2. Agora modifque o mtodo run() para que fque conforme o cdigo abaixo:
public void run() {
//sincronizando sobre objeto DuasStrings
synchronized(ds){
ds.print(str1, str2);
}
}
3. Execute novamente a classe ThreadSincronizada.java e veja o resultado na
console do Eclipse.
13
100 www.3way.com.br
Java OO | Laboratrio
Lab 14 | Criando GUI com Swing
Neste laboratrio ir desenvolver uma interface grfica com eventos que ser
construda ao longo deste laboratrio.
Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse.
Durao prevista: 40 minutos
Exerccios
Exerccio 1: Desenvolver a janela abaixo. (30 minutos)

Exerccio 2: Manipulao de eventos com Java Swing (10 minutos)
Exerccio 1 | Desenvolver janela swing.
1. Crie uma classe chamada Janela que herde as caractersticas da superclasse javax.swing.
JFrame. Essa janela deve ter as seguintes caractersticas:
public fnal class Janela extends JFrame {}
a. O tamanho da Janela deve ser de 400 x 255 pixels
b. O ttulo da Janela deve ser Linguagem de Programao II
public Janela() {
setSize(400, 255);
setTitle(Linguagem de Programao II);
}
c. Implemente o mtodo centralizar(), para centralizar a janela na rea de trabalho do usurio.
Esse mtodo deve ser chamado dentro do construtor da classe Janela
private void centralizar() {
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
Dimension janela = getSize();
14
101 www.3way.com.br
Java OO | Laboratrio
if (janela.height > screen.height) {
setSize(janela.width, screen.height);
}
if (janela.width > screen.width) {
setSize(screen.width, janela.height);
}
setLocation((screen.width - janela.width) / 2,
(screen.height - janela.height) / 2);
}
d. Para evitar que o usurio redimensione a janela, adicione o cdigo abaixo no construtor da
classe Janela:
setResizable(false);
e. Para poder ajustar os componentes livremente na Janela, voc deve defnir o gerenciador
de Layouts do container JFrame como nulo. Para isso, adicione o cdigo abaixo dentro do
construtor da classe Janela:
getContentPane().setLayout(null);
f. Para evitar que a aplicao continue executando aps o usurio clicar no boto fechar da
janela, adicione o cdigo abaixo dentro do construtor da classe Janela:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
2. Para executar a classe Janela, adicione um mtodo main() com o seguinte cdigo:
public static void main(String args[]) {
Janela janela = new Janela();
janela.setVisible(true);
}
3. Crie os seguintes atributos na classe Janela:
g. jlAgencia (javax.swing.JLabel): Rtulo do campo agncia
h. jtfAgencia (javax.swing.JTextField): Campo de texto para digitar o nmero da agncia
i. jlConta (javax.swing.JLabel): Rtulo do campo conta
j. jtfConta (javax.swing.JTextField): Campo de texto para digitar o nmero da conta
k. jSeparator01 (javax.swing. JSeparator): Separador que vamos utilizar para separar as
informaes bancrias das informaes do cliente
l. jlNome (javax.swing.JLabel): Rtulo do campo nome
m. jtfNome (javax.swing.JTextField): Campo de texto para digitar o nome do cliente
n. jlEndereco (javax.swing.JLabel): Rtulo do campo endereo
o. jtfEndereco (javax.swing.JTextField): Campo de texto para digitar o endereo do cliente
p. jlTelefone (javax.swing.JLabel): Rtulo do campo telefone
q. jtfTelefone (javax.swing.JTextField): Campo de texto para digitar o telefone do cliente
r. jlCpf (javax.swing.JLabel): Rtulo do campo CPF
s. jtfCpf (javax.swing.JTextField): Campo de texto para digitar o CPF do cliente
t. jrbCorrente (javax.swing.JRadioButton): Boto de rdio para selecionar contas do tipo
Conta Corrente
14
102 www.3way.com.br
Java OO | Laboratrio
u. jrbPoupanca (javax.swing.JRadioButton): Boto de rdio para selecionar contas do tipo
Conta Poupana
v. bgContas (javax.swing.ButtonGroup): Continer para agrupar os componentes do tipo
JRadioButton
w. jSeparator02 (javax.swing.JSeparator): Separador que vamos utilizar para separar as
informaes do cliente do botes da janela
x. jbConsultar (javax.swing.JButton): Boto utilizado para realizar uma consulta nas contas da
agncia bancria
y. jbAtualizar (javax.swing.JButton): Boto utilizado para atualizar as informaes da conta
bancria
z. jbFechar (javax.swing.JButton): Boto utilizado para fechar a aplicao
private JLabel jlAgencia;
private JTextField jtfAgencia;
private JLabel jlConta;
private JTextField jtfConta;
private JSeparator jSeparator01;
private JLabel jlNome;
private JTextField jtfNome;
private JLabel jlEndereco;
private JTextField jtfEndereco;
private JLabel jlTelefone;
private JTextField jtfTelefone;
private JLabel jlCpf;
private JTextField jtfCpf;
private JRadioButton jrbCorrente;
private JRadioButton jrbPoupanca;
private ButtonGroup bgContas;
private JSeparator jSeparator02;
private JButton jbConsultar;
private JButton jbAtualizar;
private JButton jbFechar;
4. Crie a instncia do componente jlAgencia e confgure as seguintes opes:
aa. O texto do componente jlAgencia deve ser Cdigo da Agncia:
ab. O tamanho do componente jlAgencia deve ser de 110 x 18 pixels.
ac. O componente jlAgencia deve ser posicionado no pixel 10 x 10 da janela
ad. Adicione o componente jlAgencia no container da Janela
jlAgencia = new JLabel(Cdigo da Agncia:);
jlAgencia.setBounds(10, 10, 110, 18);
add(jlAgencia);
5. Crie a instncia do componente jtfAgencia e confgure as seguintes opes:
ae. O tamanho do componente jtfAgencia deve ser de 50 x 20 pixels
af. O componente jtfAgencia deve ser posicionado no pixel 125 x 10 da janela
ag. Adicione o componente jtfAgencia no container da Janela
jtfAgencia = new JTextField();
jtfAgencia.setBounds(125, 10, 50, 20);
add(jtfAgencia);
14
103 www.3way.com.br
Java OO | Laboratrio
5. Crie a instncia do componente jlConta e confgure as seguintes opes:
ah. O texto do componente jlConta deve ser Nmero da Conta:
ai. O tamanho do componente jlConta deve ser de 105 x 18 pixels.
aj. O componente jlConta deve ser posicionado no pixel 205 x 10 da janela
ak. Adicione o componente jlConta no container da Janela
6. Crie a instncia do componente jtfConta e confgure as seguintes opes:
al. O tamanho do componente jtfConta deve ser de 60 x 20 pixels
am. O componente jtfConta deve ser posicionado no pixel 315 x 10 da janela
an. Adicione o componente jtfConta no container da Janela
7. Crie a instncia do componente jSeparator01 e confgure as seguintes opes:
ao. O tamanho do componente jSeparator01 deve ser de 365 x 10 pixels
ap. O componente jSeparator01 deve ser posicionado no pixel 10 x 40 da janela
aq. Adicione o componente jSeparator01 no container da Janela
jSeparator01 = new JSeparator();
jSeparator01.setBounds(10, 40, 365, 10);
add(jSeparator01);
8. Crie a instncia do componente jlNome e confgure as seguintes opes:
ar. O texto do componente jlNome deve ser Nome:
as. O tamanho do componente jlNome deve ser de 60 x 18 pixels.
at. O componente jlNome deve ser posicionado no pixel 10 x 50 da janela
au. Alinhe o texto do componente direita.
jlNome.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
av. Adicione o componente jlNome no container da Janela
9. Crie a instncia do componente jtfNome e confgure as seguintes opes:
aw. O tamanho do componente jtfNome deve ser de 300 x 20 pixels
ax. O componente jtfNome deve ser posicionado no pixel 75 x 50 da janela
ay. Adicione o componente jtfNome no container da Janela
10. Crie a instncia do componente jlEndereco e confgure as seguintes opes:
az. O texto do componente jlEndereco deve ser Endereo:
ba. O tamanho do componente jlEndereco deve ser de 60 x 18 pixels.
bb. O componente jlEndereco deve ser posicionado no pixel 10 x 75 da janela
bc. Alinhe o texto do componente jlEndereco direita.
14
104 www.3way.com.br
Java OO | Laboratrio
bd. Adicione o componente jlEndereco no container da Janela
11. Crie a instncia do componente jtfEndereco e confgure as seguintes opes:
be. O tamanho do componente jtfEndereco deve ser de 300 x 20 pixels
bf. O componente jtfEndereco deve ser posicionado no pixel 75 x 75 da janela
bg. Adicione o componente jtfEndereco no container da Janela
12. Crie a instncia do componente jlTelefone e confgure as seguintes opes:
bh. O texto do componente jlTelefone deve ser Telefone:
bi. O tamanho do componente jlTelefone deve ser de 60 x 18 pixels.
bj. O componente jlTelefone deve ser posicionado no pixel 10 x 100 da janela
bk. Alinhe o texto do componente jlTelefone direita.
bl. Adicione o componente jlTelefone no container da Janela
13. Crie a instncia do componente jtfTelefone e confgure as seguintes opes:
bm. O tamanho do componente jtfTelefone deve ser de 300 x 20 pixels
bn. O componente jtfTelefone deve ser posicionado no pixel 75 x 100 da janela
bo. Adicione o componente jtfTelefone no container da Janela
14. Crie a instncia do componente jlCpf e confgure as seguintes opes:
bp. O texto do componente jlCpf deve ser CPF:
bq. O tamanho do componente jlCpf deve ser de 60 x 18 pixels.
br. O componente jlCpf deve ser posicionado no pixel 10 x 125 da janela
bs. Alinhe o texto do componente jlCpf direita.
bt. Adicione o componente jlCpf no container da Janela
15. Crie a instncia do componente jtfCpf e confgure as seguintes opes:
bu. O tamanho do componente jtfCpf deve ser de 300 x 20 pixels
bv. O componente jtfCpf deve ser posicionado no pixel 75 x 125 da janela
bw. Adicione o componente jtfCpf no container da Janela
16. Crie a instncia do componente jrbCorrente e confgure as seguintes opes:
bx. O tamanho do componente jrbCorrente deve ser de 111 x 20 pixels
by. O componente jrbCorrente deve ser posicionado no pixel 100 x 150 da janela
bz. Confgure o atalho (alt + c) para o componente jrbCorrente
jrbCorrente.setMnemonic(C);
14
105 www.3way.com.br
Java OO | Laboratrio
ca. Por padro, o radio da Conta Corrente estar selecionado quando o usurio abrir a janela.
Para isso, adicione o cdigo abaixo:
jrbCorrente.setSelected(true);
cb. Adicione o componente jrbCorrente no container da Janela
17. Crie a instncia do componente jrbPoupanca e confgure as seguintes opes:
cc. O tamanho do componente jrbPoupanca deve ser de 118 x 20 pixels
cd. O componente jrbPoupanca deve ser posicionado no pixel 225 x 150 da janela
ce. Confgure o atalho (alt + p) para o componente jrbPoupanca
jrbPoupanca.setMnemonic(P);
cf. Adicione o componente jrbPoupanca no container da Janela
18. Para garantir que apenas um boto radio seja selecionado pelo usurio, temos que
agrupar os componentes jrbCorrente e jrbPoupanca em um container do tipo ButtonGroup. Crie
a instncia do container bgContas e adicione os componentes jrbCorrente e jrbPoupanca nele.
bgContas = new ButtonGroup();
bgContas.add(jrbCorrente);
bgContas.add(jrbPoupanca);
19. Crie a instncia do componente jSeparator02 e confgure as seguintes opes:
cg. O tamanho do componente jSeparator02 deve ser de 365 x 10 pixels
ch. O componente jSeparator02 deve ser posicionado no pixel 10 x 180 da janela
ci. Adicione o componente jSeparator02 no container da Janela
20. Crie a instncia do componente jbConsultar e confgure as seguintes opes:
cj. O tamanho do componente jbConsultar deve ser de 100 x 23 pixels
ck. O componente jbConsultar deve ser posicionado no pixel 35 x 190 da janela
cl. Confgure o atalho (alt + s) para o componente jbConsultar
cm. Adicione o componente jbConsultar no container da Janela
jbConsultar = new JButton(Consultar);
jbConsultar.setBounds(35, 190, 100, 23);
jbConsultar.setMnemonic(S);
add(jbConsultar);
21. Crie a instncia do componente jbAtualizar e confgure as seguintes opes:
cn. O tamanho do componente jbAtualizar deve ser de 100 x 23 pixels
co. O componente jbAtualizar deve ser posicionado no pixel 145 x 190 da janela
cp. Confgure o atalho (alt + a) para o componente jbAtualizar
cq. Por padro, o componente jbAtualizar deve fcar desabilitado. Para isso, adicione o cdigo abaixo:
jbAtualizar.setEnabled(false);
14
106 www.3way.com.br
Java OO | Laboratrio
cr. Adicione o componente jbAtualizar no container da Janela
22. Crie a instncia do componente jbFechar e confgure as seguintes opes:
cs. O tamanho do componente jbFechar deve ser de 100 x 23 pixels
ct. O componente jbFechar deve ser posicionado no pixel 225 x 190 da janela
cu. Confgure o atalho (alt + f) para o componente jbFechar
cv. Adicione o componente jbFechar no container da Janela
Exerccio 2 | Manipulao de eventos com Java Swing.
1. Utilizando a janela implementada no exerccio anterior crie os seguintes eventos.
1.1. Utilize o mtodo windowOpened() da interface WindowListener, para exibir a caixa de
dilogo abaixo no momento em que o usurio abrir a aplicao.
a. Dentro do construtor da classe Janela, faa uma chamada ao mtodo addWindowListener().
Esse mtodo adiciona um ouvinte a sua Janela.
b. Dentro do parmetro do mtodo addWindowListener() crie uma classe do tipo java.awt.
event.WindowAdapter
c. Dentro da classe WindowAdapter, sobrescreva o mtodo windowOpened() da interface
WindowListener
d. Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela.
e. Dentro desse mtodo, voc deve criar uma caixa de dilogo (JOptionPane) para exibir a
mensagem na tela. Veja o exemplo abaixo:
addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent evt) {
JOptionPane.showMessageDialog(null, Programao Java OO, 3Way NetWorks,
JOptionPane.INFORMATION_MESSAGE);
}
});
1.2. Utilize o mtodo windowClosing() da interface WindowListener, para exibir a caixa de
dilogo abaixo no momento em que o usurio fechar a aplicao.
a. Dentro da classe WindowAdapter (criada anteriormente),sobrescreva o mtodo
windowClosing() da interface WindowListener
b. Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela onde
ser exibida a caixa de dilogo acima.
1.3. A janela contm seis caixas de textos (jtfAgencia, jtfConta, jtfNome, jtfEndereco,
jtfTelefone e jtfCpf). No momento em que o usurio ativar algum desses componentes,
14
107 www.3way.com.br
Java OO | Laboratrio
a cor do componente selecionado ser alterado para amarelo. No momento em que o
usurio sair do componente, a cor deve voltar a ser branca. Para isso, implemente a
lgica abaixo em todos os componentes citados anteriormente.
a. Dentro do construtor da classe Janela, aps defnir o tamanho e a posio de cada
JTextField, faa uma chamada ao mtodo addFocusListener() a partir do componente
criado. Esse mtodo adiciona um ouvinte que gerencia os focus do seu componente.
b. Dentro do parmetro do mtodo addFocusListener() crie uma classe do tipo java.awt.
event.FocusAdapter
c. Dentro da classe FocusAdapter, sobrescreva o mtodo focusGained() da interface
FocusListener
d. Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela. Veja o
exemplo abaixo:
e. Dentro desse mtodo, voc deve alterar a cor do componente selecionado pelo usurio:
f. Essa mesma lgica deve ser utilizada para gerenciar quando o componente perde o
focus. Dentro da classeFocusAdapter (criada anteriormente), sobrescreva o mtodo
focusLost() da interface FocusListener
g. Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela onde
ser alterada a cor do componente.
h. O resultado dessa implementao deve ser parecida com o exemplo abaixo:
jtfAgencia.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent evt) {
jtfAgencia.setBackground(Color.YELLOW);
}
@Override
public void focusLost(FocusEvent evt) {
jtfAgencia.setBackground(Color.WHITE);
}
});
1.4. As caixas de textos jtfAgencia, jtfConta, jtfTelefone e jtfCpf so todas numricas. Desse modo,
adicione aos componentes uma mscara para permitir que somente caracteres numricos
sejam digitados pelo usurio. J que estamos trabalhando com mscaras, vamos formatar o
texto digitado pelo usurio.
a. A classe que controla as mscaras das caixas de texto ajavax.swing.text.MaskFormatter.
A classe MaskFormatter contm um construtor alternativo que recebe uma String com
14
108 www.3way.com.br
Java OO | Laboratrio
a mscara formatada. Por exemplo, para criar uma mscara para o CPF devemos criar o
objeto com a String: ###.###.###-##
b. A mscara no pode ser aplicada diretamente em objetos do tipo JTextField. Mantenha
a declarao das caixas de texto como JTextField, porm as instncias criadas para esses
objetos sero do tipo JFormattedTextField (polimorfsmo).
c. O componente jtfAgencia deve ter a seguinte mscara:####-#
d. O componente jtfConta deve ter a seguinte mscara: #####-#
e. O componente jtfTelefone deve ter a seguinte mscara: (0xx##) ####-####
f. O componente jtfCpf deve ter a seguinte mscara: ###.###.###-##
g. O caractere # serve como um coringa, e s pode ser substitudo por um caractere numrico
h. Para utilizar a classe MaskFormatter necessrio fazer o tratamento de exceo do tipo
ParseException. Veja um exemplo abaixo:
try {
jtfAgencia = new JFormattedTextField(new MaskFormatter(####-#));
} catch (ParseException e) {
e.printStackTrace();
}
1.5. Finalizando essa lista de exerccio, vamos adicionar os eventos paracomponentes do tipo
JButton ao nosso projeto. Para isso:
a. Utilize o mtodo actionPerformed() da interface ActionListener, para controlar os
eventos nos botes jbConsultar, jbAtualizar e jbFechar
b. Dentro do construtor da classe Janela, aps defnir o tamanho, a posio e o atalho de
cada JButton, faa uma chamada ao mtodo addActionListener() a partir do componente
criado. Esse mtodo adiciona um ouvinte que gerencia todos os eventos que o usurio
pode provocar nos botes a partir do teclado ou do mouse
c. Dentro do parmetro do mtodo addActionListener() crie uma classe do tipo java.awt.
event.ActionListener
d. Dentro da classe ActionListener, implemente o mtodo actionPerformed()
e. Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela.
f. Adicione um evento para o componente jbConsultar, que exiba a caixa de dilogo abaixo
caso o usurio no preencha ao menos um dos campos jtfAgencia e jtfConta. Veja o
exemplo abaixo:
jbConsultar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {

if(jtfAgencia.getText().equals( - ) || jtfConta.getText().equals( - )){
JOptionPane.showMessageDialog(null, E necessrio informar a agncia e a conta,
3Way NetWorks, JOptionPane.INFORMATION_MESSAGE);
}

}
});
g. Adicione um evento para o componente jbFechar, que feche a aplicao caso o usurio
14
109 www.3way.com.br
Java OO | Laboratrio
clique no boto Fechar. Para fechar a aplicao, utilize o comando abaixo:
jbFechar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
14
110 www.3way.com.br
Java OO | Laboratrio
Projeto | Criando Aplicao Orientada a Objeto + Swing
Neste laboratrio ir desenvolver para aplicao Banco que est sendo construda ao longo
deste laboratrio.
Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse.
1 | Descrio do Problema
O Sistema proposto e um sistema que ter um CRUD de clientes, ou seja, incluso,
alterao, excluso e listagem de clientes. Cada cliente ter possibilidade de realizar operaes
bancarias, tais como:
- Saque
- Deposito
- Transferncia entre contas
O Sistema uma sequencia das atividades realizadas at o momento, utilize da boa prtica
de reutilizao de cdigo.
O Sistema dever ser modularizado conforme a fgura 2 deste documento.
Ao fnal deste documento vai ser anexada a soluo para o problema, porm e de grande
importncia que voc tente desenvolver a soluo, esta que ser usada durante todo o curso.
Projeto
111 www.3way.com.br
Java OO | Laboratrio
Figura 1 Diagrama UML para aplicao Banco
Figura 2 Diviso de pacotes para aplicao Banco
2 | Criao do projeto
1. Crie trs projetos Java e os respectivos pacotes conforme a fgura 3 abaixo:
- Banco-Modelo
- Banco-Servico
- Banco-SwingWeb
Figura 3 Diviso de pacotes e criao de projeto para aplicao Banco
Projeto
112 www.3way.com.br
Java OO | Laboratrio
2. Confgure as dependncias dos projetos. No build path do projeto Banco-Servico adicione
o projeto Banco-Modelo, e no projeto Banco-SwingView adicione Banco-Servico.
3. Copie todas as classes que voc utilizou nos laboratrios e distribua conforme a fgura 4.
Caso voc no tenha desenvolvido anteriormente a classe, crie no pacote conforme a imagem abaixo.

Figura 4 Classes do projeto Banco
3 | Prototipao Crie as telas de acordo com os prottipos.
Utilize o windowBuilder.
Figura 5 Prototpao tela inicial (Frame)
Projeto
113 www.3way.com.br
Java OO | Laboratrio
Figura 6 Prototpao tela Manter Clientes (JInternalFrame)
Figura 7 Prototpao tela Operaes Bancarias (JInternalFrame)
Projeto
114 www.3way.com.br
Java OO | Laboratrio

Figura 8 Prototpao tela Abrir Conta (JDialog)
Figura 9 Prototpao tela Transferncia entre contas (JDialog)
Projeto
115 www.3way.com.br
Java OO | Laboratrio
4 | Aes de tela
4.1. Figura 5 - Tela inicial do sistema Banco
- Label com o nome do banco e agncia ser defnida na classe AgenciaService.java
- Boto Manter clientes instanciar o JInternalFrame de Manter Clientes dentro de um
JDesktopPane.
- Boto Operaes Bancarias instanciar o JInternalFrame de Operaes Bancarias
dentro de um JDesktopPane. Manter a instancia do cliente selecionado para aes do mesmo.
- Somente o boto de Manter Clientes estar habilitado, enquanto um cliente no estiver
sido selecionado o boto de Operaes bancarias estar desabilitado.
4.2. Figura 6 - Tela Manter Clientes (JInternalFrame)
- O boto (JButton) limpar ter funo de limpar os campos de entrada (JTextField).
Sempre estar habilitado.
- O boto de salvar ter funo de salvar e validar os dados digitados pelo cliente. A
validao vai ser a obrigatoriedade de inserir os valores de nome e CPF, caso estes no sejam
inseridos o sistema dever emitir uma mensagem avisando que os campos so de carter
obrigatrio. Estar desabilitado quando um cliente for selecionado na lista.
- O boto atualizar ter funo de validar e atualizar dados de um determinado cliente
selecionado na lista. A validao vai ser a obrigatoriedade de inserir os valores de nome e CPF,
caso estes no sejam inseridos o sistema dever emitir uma mensagem avisando que os campos
so de carter obrigatrio. Estar habilitado somente quando um cliente for selecionado.
- O boto de excluir ter funo de excluir um determinado cliente selecionado na lista.
Estar habilitado somente quando um cliente for selecionado.
- A tabela (JTable) listar todos os clientes cadastrados do sistema. Ter ao de
MouseListener, ou seja quando houver click em algum cliente da tabela devera ocorrer a ao de
preenchimento dos campos de acordo com o cliente selecionado. Est funo habilitar o boto de
atualizar, excluir e operaes bancarias e desabilitar o boto de salvar.
4.3. Figura 7 - Tela Operaes Bancarias (JInternalFrame)
- Boto de abrir conta ter funo de instanciar e mostrar a tela de abrir conta (JDialog).
Caso j exista uma conta para o cliente selecionado o boto fcar desabilitado.
- Se houver alguma conta para o cliente, os botes de saque, depsito e transferncia
fcaro habilitados.
- Boto de Saque ter a ao de abrir um JOptionPane para o usurio informar o valor do
saque que deseja fazer. Ao informar o valor ser validado o formato que o usurio inseriu os dados
e se h saldo sufciente para ao de saque, assim informando a mensagem de validao.
- Boto de Deposito ter a ao de abrir um JOptionPane para o usurio informar o valor
Projeto
116 www.3way.com.br
Java OO | Laboratrio
do depsito que deseja fazer. . Ao informar o valor ser validado o formato que o usurio inseriu os
dados, assim informando a mensagem de validao.
- Boto de transferncia ter funo de instanciar e mostrar a tela de transferncia (JDialog).
- A tabela (JTable) listar todas as transaes feitas naquela conta, depsitos, saques e
transferncias.
4.4. Figura 8 - Tela Abrir Conta (JDialog)
- O boto cancelar ter ao de fechar a janela.
- O boto salvar ter a ao de validar e criar uma conta para o cliente. A validao vai ser a
obrigatoriedade de inserir o numero da conta, caso este no seja inserido o sistema dever emitir
uma mensagem avisando que o campo de carter obrigatrio.
4.5. Figura 8 - Tela Transferncia (JDialog)
- O boto cancelar ter ao de fechar a janela.
- O boto realizar transferncia ter a ao de validar e realizar a transferncias entre as
contas. A validao vai ser a obrigatoriedade dos campos numero de conta destino e valor da
transferncia, caso estes no sejam inseridos o sistema dever emitir uma mensagem avisando
que os campos so de carter obrigatrio. Outra validao ser de numero de conta inexistente, ou
seja, caso no exista uma conta com o numero informado o sistema dever emitir uma mensagem
avisando que no existe conta com esse numero. Outra validao ser que o valor de, caso o valor
informado no esta de acordo com o formato o sistema devera emitir uma mensagem informando
o usurio a informar o valor corretamente.
5 |Passo a Passo do cdigo fonte do sistema
5.1. Dao Data Access Object
- Crie a interface Dao.java conforme a listagem 1 abaixo, todas suas classes Dao
implementaro essa interface. Lembre-se de sempre seguir a modelagem UML fgura 1 e a ordem
de pacotes e projetos conforme a fgura 4 deste documento.

package threeway.projeto.service.Dao;
public interface Dao<E extends Entidade> {
/**
* Busca a entidade pelo seu identifcador.
*
* @param identifcador da entidade
*
* @return Entidade pesquisada
*/
E obter(fnal Serializable identifcador);
/**
* Altera a entidade.
*
* @param entidade
*/
void alterar(fnal E entidade);
/**
Projeto
117 www.3way.com.br
Java OO | Laboratrio
* Insere a entidade.
*
* @param entidade
*/
void salvar(fnal E entidade);
/**
* Remove a entidade.
*
* @param entidade
*/
void remover(fnal E entidade);

/**
* Consulta os objetos que possuirem os valores dos atributos do objeto informado.
*
* @param entidade que ser utilizado como parmetro na consulta.
*
* @return Collection<E>
*/
Collection<E> consultar(fnal E entidade);
/**
* Lista todos os objetos da entidade.
*
* @return Collection<E>
*/
Collection<E> listar();
}
Listagem 1 Dao.java
5.2. Figura 5 - Tela inicial do sistema Banco
Banco e Agncia do sistema sero estticos, ou seja ser criada uma classe para
cada um para criao de instancias estticas para acesso de todo o sistema. As classes sero
AgenciaService.java e BancoService.java, siga a fgura 4.

import threeway.projeto.modelo.Banco;
public class BancoService {
public static fnal Banco bancoSistema() {
Banco bancoSistema = new Banco(1);
bancoSistema.setNome(Banco Java Brasil);
return bancoSistema;
}
}
Listagem 2 BancoService.java
import threeway.projeto.modelo.Agencia;
import threeway.projeto.modelo.Banco;
public class AgenciaService {
public static fnal Agencia agenciaSistema() {
Banco bancoSistema = BancoService.bancoSistema();
Agencia agenciaSistema = new Agencia(3way NetWorks!);
Projeto
118 www.3way.com.br
Java OO | Laboratrio
agenciaSistema.setBanco(bancoSistema);
bancoSistema.getAgencias().add(agenciaSistema);
return agenciaSistema;
}
}
Listagem 3 AgenciaService.java
Crie a Classe Inicial.java pelo windowBuilder como um JFrame. Utilize o Design do
window builder para criar o JFrame conforme o prottipo. Deixe os atributos necessrios com
visibilidade para toda a classe. Instancie ClienteService.java e ContaService.java pois estas
instancias sero necessrias em outras telas, e assim podem ser passadas por parmetro.
package threeway.projeto.gui;
public class Inicial {
private ClienteService clienteService = new ClienteService();
private ContaService contaService = new ContaService();
private JFrame frmGereciamentoDeBanco;
private JDesktopPane panelInterno;
private JInternalFrame frameInterno;
private JLabel lblBancoResult;
private JLabel lblAgenciaResult;
private JButton btnManterClientes;
private static JButton btnOperaesBancarias;
private static Cliente clienteSelecionado;
} Listagem 4 Inicial.java
Inicialize as variveis pelo mtodo initialize();
/**
* Mtodo responsvel por inicializar todos os componentes swing deste frame
*
*/
private void initialize() {
frmGereciamentoDeBanco = new JFrame();
frmGereciamentoDeBanco.setResizable(false);
frmGereciamentoDeBanco.setTitle(Sistema de Gereciamento de Banco);
frmGereciamentoDeBanco.setBounds(100, 100, 800, 600);
frmGereciamentoDeBanco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmGereciamentoDeBanco.getContentPane().setLayout(null);
frmGereciamentoDeBanco.setLocationRelativeTo(null);
JLabel lblBanco = new JLabel(Banco:);
lblBanco.setFont(new Font(Tahoma, Font.BOLD, 14));
lblBanco.setBounds(10, 11, 74, 23);
frmGereciamentoDeBanco.getContentPane().add(lblBanco);
JLabel lblAgencia = new JLabel(Agncia:);
lblAgencia.setFont(new Font(Tahoma, Font.BOLD, 14));
Projeto
119 www.3way.com.br
Java OO | Laboratrio
lblAgencia.setBounds(10, 45, 74, 23);
frmGereciamentoDeBanco.getContentPane().add(lblAgencia);
btnManterClientes = new JButton(Manter Clientes);
btnManterClientes.setBounds(10, 89, 170, 37);
frmGereciamentoDeBanco.getContentPane().add(btnManterClientes);
btnOperaesBancarias = new JButton(Operaes Bancarias);
btnOperaesBancarias.setBounds(190, 89, 170, 37);
btnOperaesBancarias.setEnabled(Boolean.FALSE);
frmGereciamentoDeBanco.getContentPane().add(btnOperaesBancarias);
lblBancoResult = new JLabel(...);
lblBancoResult.setFont(new Font(Tahoma, Font.BOLD, 14));
lblBancoResult.setBounds(94, 11, 480, 20);
frmGereciamentoDeBanco.getContentPane().add(lblBancoResult);
lblAgenciaResult = new JLabel(...);
lblAgenciaResult.setFont(new Font(Tahoma, Font.BOLD, 14));
lblAgenciaResult.setBounds(94, 45, 480, 20);
frmGereciamentoDeBanco.getContentPane().add(lblAgenciaResult);
JSeparator separator = new JSeparator();
separator.setBounds(10, 79, 764, 11);
frmGereciamentoDeBanco.getContentPane().add(separator);
panelInterno = new JDesktopPane();
panelInterno.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
panelInterno.setBounds(10, 137, 764, 414);
frmGereciamentoDeBanco.getContentPane().add(panelInterno);
panelInterno.setLayout(null);
frameInterno = new JInternalFrame(New JInternalFrame);
frameInterno.setBounds(10, 11, 744, 392);
panelInterno.add(frameInterno);
frameInterno.setVisible(false);
}
Listagem 6 Inicial.java mtodo initalize();
No construtor da classe Inicial.java chame o mtodo initialize() e preencha os label com
o resultado da listagem 3 informando a agncia e banco do sistema. Acessando o mtodo esttico
da classe AgenciaService.java.
/**
* Responsvel pela criao de novas instncias desta classe.
*/
public Inicial() {
initialize();
lblAgenciaResult.setText(AgenciaService.agenciaSistema().getNome());
lblBancoResult.setText(AgenciaService.agenciaSistema().getBanco().getNome());
eventoDosBotoes(); // mtodo que adiciona evento aos botes
}
Listagem 6 Inicial.java - Contrutor
Crie o mtodo eventoDosBotoes(), onde ser instanciado os eventos dos botes da tela.
/**
* Mtodo responsvel por adicionar evento aos botes
Projeto
120 www.3way.com.br
Java OO | Laboratrio
*
*/
public void eventoDosBotoes() {
btnOperaesBancarias.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mostraTelaOperacoesBancarias();
}
});
btnManterClientes.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mostraTelaManterClientes();
}
});
}
Listagem 7 Inicial.java eventoDosBotoes()
Foi criado os mtodos mostraTelaOperacoesBancarias() e mostraTelaManterClientes(),
isso para deixar o cdigo mais organizado e diminuindo a complexidade dos mtodos.
/**
* Mtodo responsvel por instanciar e mostrar a tela de Manter Clientes
*
*/
public void mostraTelaManterClientes() {
try {
JInternalFrame newFrame = new ManterCliente(clienteService);
newFrame.setBounds(frameInterno.getBounds());
panelInterno.add(newFrame);
newFrame.show();
} catch (ParseException e1) {
e1.printStackTrace();
}
}
/**
* Mtodo responsvel por instanciar e mostrar a tela de Operaes Bancarias
*
*/
public void mostraTelaOperacoesBancarias() {
JInternalFrame newFrame = new OperacoesBanco(this.contaService, clienteSelecionado);
newFrame.setBounds(frameInterno.getBounds());
panelInterno.add(newFrame);
newFrame.show();
}
Listagem 8 Inicial.java mostraTelaOperacoesBancarias() e mostraTelaManterClientes()
Projeto
121 www.3way.com.br
Java OO | Laboratrio
Repare que no existe os construtores para OperacoesBanco() e ManterCliente(), iremos
criar estes a seguir.
Crie o mtodo esttico para mudar habilitar o boto operaes bancarias e setar o objeto
cliente para tornar possveis as aes da tela de operaes bancarias.
5.3. Figura 6 - Tela Manter Clientes
Crie a Classe ClienteDao.java implementando a interface Dao<?>. Siga a listagem 9 abaixo.

package threeway.projeto.service.Dao;
public class ClienteDao implements Dao<Cliente> {
private Collection<Cliente> clientesMemoria = new ArrayList<Cliente>();
@Override
public Cliente obter(Serializable identifcador) {
return null;
}
@Override
public void alterar(Cliente entidade) {
for (Cliente cliente : clientesMemoria) {
if (entidade.equals(cliente)) {
clientesMemoria.remove(cliente);
clientesMemoria.add(entidade);
break;
}
}
}
@Override
public void salvar(Cliente entidade) {
this.clientesMemoria.add(entidade);
}
@Override
public void remover(Cliente entidade) {
this.clientesMemoria.remove(entidade);
}
@Override
public Collection<Cliente> consultar(Cliente entidade) {
return null;
}
@Override
public Collection<Cliente> listar() {
if (this.clientesMemoria.size() < 1) {
Cliente correntista1 = new Cliente(correntista 1, 111.111.111-11);
Projeto
122 www.3way.com.br
Java OO | Laboratrio
Cliente correntista2 = new Cliente(correntista 2, 222.222.222-22);
this.clientesMemoria.add(correntista1);
this.clientesMemoria.add(correntista2);
}
return this.clientesMemoria;
}
}
Listagem 9 ClienteDao.java
Crie a Classe ClienteService.java instanciando um objeto do tipo ClienteDao para
acesso aos dados em memoria. Siga a listagem 10 abaixo.
package threeway.projeto.service;
public class ClienteService {
private ClienteDao dao = new ClienteDao();

/**
* Mtodo responsvel por Atualizar entidade cliente
*
* @param cliente
*
* @throws CamposObrigatoriosException
*/
public void atualizar(Cliente cliente) throws CamposObrigatoriosException {
this.validarCamposObrigatorios(cliente);

this.getDao().alterar(cliente);
}
/**
* Mtodo responsvel por excluir entidade cliente
*
* @param cliente
*/
public void excluir(Cliente cliente) {
this.getDao().remover(cliente);
}
/**
* Mtodo responsvel por listar todos os clientes
*
* @return ArrayList<Cliente>
*/
public ArrayList<Cliente> listarTodosClientes() {
return new ArrayList<Cliente>(this.getDao().listar());
}
/**
* Mtodo responsvel por salvar a entiade cliente
*
* @param cliente
*
* @throws CamposObrigatoriosException
*/
public void salvar(Cliente cliente) throws CamposObrigatoriosException {
this.validarCamposObrigatorios(cliente);
Projeto
123 www.3way.com.br
Java OO | Laboratrio
this.getDao().salvar(cliente);
}
/**
* Mtodo responsvel por validar campos obrigatorios Nome e CPF de cliente
*
* @param cliente
*
* @throws CamposObrigatoriosException
*/
private void validarCamposObrigatorios(Cliente cliente) throws CamposObrigatoriosException {
if (cliente == null || cliente.getNome().equals() || cliente.getCpf().
replace(-, ).replace(., ).trim().equals()) {
throw new CamposObrigatoriosException();
}
}

/**
* Mtodo responsvel por retornar a instancia de ClienteDao
*
* @return
*/
public ClienteDao getDao() {
return dao;
}
}
Listagem 10 ClienteService.java
Veja que voc precisar implementar a classe CamposObrigatoriosException.java
para tratar a exceo quando o usurio no informar os campos obrigatrios defnidos. Siga a
listagem 11 abaixo.
package threeway.projeto.service.excecoes;
public class CamposObrigatoriosException extends Exception {
private static fnal long serialVersionUID = -5487345156293002556L;
/**
* Responsvel pela criao de novas instncias desta classe.
*/
public CamposObrigatoriosException() {
super(Por Favor preencha todos campos obrigtorios!);
}
/**
* Responsvel pela criao de novas instncias desta classe.
*
* @param mensagem
*/
public CamposObrigatoriosException( String mensagem ) {
super(mensagem);
}
}
Listagem 11 CamposObrigatoriosExcepton.java
Projeto
124 www.3way.com.br
Java OO | Laboratrio
Crie a Classe ManterCliente.java pelo windowBuilder como um JInternalFrame. Utilize
o Design do window builder para criar conforme o prottipo. Deixe os atributos necessrios com
visibilidade para toda a classe.
package threeway.projeto.gui;
public class ManterCliente extends JInternalFrame {
private ClienteService service;
private JTextField tfNome;
private JTextField tfEndereco;
private JTextField tfRg;
private JFormattedTextField ftfCpf;
private JFormattedTextField ftfTelefone;
private JTable tableClientes;
private JButton btnSalvar;
private JButton btnAtualizar;
private JButton btnExcluir;
private JButton btnLimpar;
private JPanel panelLista;
private Boolean clienteSelecionado = Boolean.FALSE;
private Cliente cliente = new Cliente();
}
Listagem 12 ManterCliente.java
Inicialize as variveis pelo mtodo initialize(). Siga a listagem 13 abaixo.
/**
* Mtodo responsvel por inicializar componentes da tela
*
* @throws ParseException
*/
private void initialize() throws ParseException {
setClosable(true);
setTitle(Manter Clientes);
setBounds(100, 100, 750, 375);
getContentPane().setLayout(null);
JPanel panelCad = new JPanel();
panelCad.setBorder(new TitledBorder(UIManager.getBorder(TitledBorder.border),
Cadastrar Cliente, TitledBorder.LEADING, TitledBorder.TOP, null, null));
panelCad.setBounds(10, 11, 714, 142);
getContentPane().add(panelCad);
panelCad.setLayout(null);
JLabel lblNome = new JLabel(Nome *:);
lblNome.setBounds(10, 24, 91, 14);
panelCad.add(lblNome);
JLabel lblTelefone = new JLabel(Telefone:);
lblTelefone.setBounds(444, 24, 62, 14);
Projeto
125 www.3way.com.br
Java OO | Laboratrio
panelCad.add(lblTelefone);
JLabel lblEndereo = new JLabel(Endereo:);
lblEndereo.setBounds(10, 52, 91, 14);
panelCad.add(lblEndereo);
JLabel lblRegistroGeral = new JLabel(Registro Geral:);
lblRegistroGeral.setBounds(10, 80, 91, 14);
panelCad.add(lblRegistroGeral);
JLabel lblCpf = new JLabel(CPF *:);
lblCpf.setBounds(400, 80, 34, 14);
panelCad.add(lblCpf);
tfNome = new JTextField();
tfNome.setBounds(111, 21, 311, 20);
panelCad.add(tfNome);
tfNome.setColumns(10);
ftfTelefone = new JFormattedTextField(new MaskFormatter((##)####-####));
ftfTelefone.setBounds(516, 21, 188, 20);
panelCad.add(ftfTelefone);
tfEndereco = new JTextField();
tfEndereco.setBounds(111, 49, 593, 20);
panelCad.add(tfEndereco);
tfEndereco.setColumns(10);
tfRg = new JTextField();
tfRg.setBounds(111, 77, 202, 20);
panelCad.add(tfRg);
tfRg.setColumns(10);
ftfCpf = new JFormattedTextField(new MaskFormatter(###.###.###-##));
ftfCpf.setBounds(444, 77, 260, 20);
panelCad.add(ftfCpf);
ftfCpf.setColumns(10);
btnSalvar = new JButton(Salvar);
btnSalvar.setBounds(417, 108, 89, 23);
panelCad.add(btnSalvar);
btnAtualizar = new JButton(Atualizar);
btnAtualizar.setBounds(516, 108, 89, 23);
panelCad.add(btnAtualizar);
btnExcluir = new JButton(Excluir);
btnExcluir.setBounds(615, 108, 89, 23);
panelCad.add(btnExcluir);
JLabel lblCamposObrigatrios = new JLabel((*) Campos Obrigatrios);
lblCamposObrigatrios.setBounds(10, 117, 174, 14);
panelCad.add(lblCamposObrigatrios);
btnLimpar = new JButton(Limpar);
btnLimpar.setBounds(318, 108, 89, 23);
panelCad.add(btnLimpar);
panelLista = new JPanel();
panelLista.setBorder(new TitledBorder(UIManager.getBorder(TitledBorder.border),
Clientes Cadastrados, TitledBorder.LEADING, TitledBorder.TOP, null, null));
panelLista.setBounds(10, 164, 714, 175);
getContentPane().add(panelLista);
panelLista.setLayout(null);
}
Listagem 13 ManterCliente.java initalize()
Projeto
126 www.3way.com.br
Java OO | Laboratrio
No construtor da classe ManterCliente.java chame o mtodo initialize() e faa com que
receba uma instancia de ClienteService.java.
/**
* Responsvel pela criao de novas instncias desta classe.
*
* @param service
*
* @throws ParseException
*/
public ManterCliente( ClienteService service ) throws ParseException {
this.service = service;
initialize();
defneEnabledBotoes();
iniciaJTable();
atualizaDadosTabela();
addEventoMouseListenerTabela();
acaoBotaoSalvar();
acaoBotaoLimpar();
acaoBotaoExcluir();
acaoBotaoAtualizar();
}
Listagem 14 ManterCliente.java construtor()
Crie os mtodos que esto sendo chamados no construtor. Siga a listagem 15 abaixo.
/**
* Mtodo responsvel por defnir quando os botoes estaro habilitados
*
*/
private void defneEnabledBotoes() {
btnExcluir.setEnabled(clienteSelecionado);
btnAtualizar.setEnabled(clienteSelecionado);
btnSalvar.setEnabled(!clienteSelecionado);
ftfCpf.setEditable(!clienteSelecionado);

Inicial.modifcaBotaoOperacoes(clienteSelecionado, cliente);
}
/**
* Mtodo responsvel por adicionar evento de click na tabela de clientes
*
*/
private void addEventoMouseListenerTabela() {
tableClientes.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
int l = tableClientes.getSelectedRow();
cliente = service.listarTodosClientes().get(l);
carregarValores(cliente);
Projeto
127 www.3way.com.br
Java OO | Laboratrio
}
});
}
/**
* Mtodo responsvel por carregar os valores de cliente
*
* @param cliente
*/
public void carregarValores(Cliente cliente) {
ftfCpf.setText(cliente.getCpf());
ftfTelefone.setText(cliente.getTelefone());
tfEndereco.setText(cliente.getEndereco());
tfNome.setText(cliente.getNome());
tfRg.setText(cliente.getRg());
this.clienteSelecionado = Boolean.TRUE;
defneEnabledBotoes();
}
/**
* Mtodo responsvel por inicializar componente JTable
*
*/
private void iniciaJTable() {
tableClientes = new JTable();
tableClientes.setModel(new DefaultTableModel(new Object[][] {}, retornaNomeColunas()));
tableClientes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tableClientes.setBounds(703, 24, -690, 140);
tableClientes.getTableHeader().setReorderingAllowed(false);
JScrollPane scrollPane = new JScrollPane(tableClientes);
scrollPane.setViewportView(tableClientes);
scrollPane.setBounds(10, 24, 694, 140);
panelLista.add(scrollPane);
}
/**
* Mtodo responsvel por atualizar dados da JTable
*
*/
private void atualizaDadosTabela() {

tableClientes.setModel(new DefaultTableModel(new Object[][] {}, retornaNomeColunas()));
tableClientes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
DefaultTableModel dtm = (DefaultTableModel) tableClientes.getModel();

Cliente cli = new Cliente();
ArrayList<Cliente> listaCliente = service.listarTodosClientes();
Collections.sort(listaCliente);
Iterator<Cliente> it = listaCliente.iterator();
while (it.hasNext()) {
Projeto
128 www.3way.com.br
Java OO | Laboratrio
cli = it.next();
dtm.addRow(new Object[] { cli.getNome(), cli.getEndereco(), cli.getTelefone(), cli.
getRg(), cli.getCpf() });
}
}
/**
* Mtodo responsvel por retornaqr o nome das colunas da tabela clientes
*
* @return String[]
*/
private String[] retornaNomeColunas() {
String[] columnNames = new String[5];
columnNames[0] = ( Nome );
columnNames[1] = ( Endereo );
columnNames[2] = ( Telefone );
columnNames[3] = ( RG );
columnNames[4] = ( CPF );
return columnNames;
}
/**
* Mtodo responsvel por adicionar ao ao boto limpar
*
*/
private void acaoBotaoLimpar() {
btnLimpar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
limpar();
clienteSelecionado = Boolean.FALSE;
defneEnabledBotoes();
}
});
}
/**
* Mtodo responsvel por adicionar ao ao boto salvar
*
*/
private void acaoBotaoSalvar() {
btnSalvar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
preencheClienteComCampos();
service.salvar(cliente);
JOptionPane.showMessageDialog(null, Cliente salvo com sucesso!);
limpar();
} catch (CamposObrigatoriosException ex) {
Projeto
129 www.3way.com.br
Java OO | Laboratrio
JOptionPane.showMessageDialog(null, ex.getMessage());
} fnally {
atualizaDadosTabela();
}
}
});
}
/**
* Mtodo responsvel por adicionar ao ao boto excluir
*
*/
private void acaoBotaoExcluir() {
btnExcluir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
service.excluir(cliente);
limpar();
clienteSelecionado = Boolean.FALSE;
defneEnabledBotoes();
atualizaDadosTabela();
JOptionPane.showMessageDialog(null, Cliente removido com sucesso!);
}
});
}

/**
* Mtodo responsvel por adicionar ao ao boto atualizar
*
*/
private void acaoBotaoAtualizar() {
btnAtualizar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
preencheClienteComCampos();
service.atualizar(cliente);
limpar();
clienteSelecionado = Boolean.FALSE;
defneEnabledBotoes();
JOptionPane.showMessageDialog(null, Cliente atualizado com
sucesso!);
} catch (CamposObrigatoriosException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
} fnally {
atualizaDadosTabela();
}
}
});
}
Projeto
130 www.3way.com.br
Java OO | Laboratrio
/**
* Mtodo responsvel por recuperar dados do JTextField e setar em cliente
*
*/
public void preencheClienteComCampos() {
cliente = new Cliente();
cliente.setNome(tfNome.getText());
cliente.setEndereco(tfEndereco.getText());
cliente.setCpf(ftfCpf.getText());
cliente.setRg(tfRg.getText());
cliente.setTelefone(ftfTelefone.getText());
}
/**
* Mtodo responsvel por limpar campos JTextField
*
*/
public void limpar() {
ftfCpf.setText();
ftfTelefone.setText();
tfEndereco.setText();
tfNome.setText();
tfRg.setText();
cliente = new Cliente();
}
Listagem 15 ManterCliente.java mtodos da classe
5.4. Figura 7 - Tela Operaes Bancarias
Crie a Classe ContaDao.java implementando a interface Dao<?>. Siga a listagem 16
abaixo. Observe que os mtodos que no sero utilizados no foi implementado, pois os requisitos
do sistema no contemplam tais aes.
package threeway.projeto.service.Dao;
public class ContaDao implements Dao<Conta> {
private Collection<Conta> contasMemoria = new ArrayList<Conta>();
@Override
public Conta obter(Serializable identifcador) {
return null;
}
@Override
public void alterar(Conta entidade) {}
@Override
public void salvar(Conta entidade) {
Projeto
131 www.3way.com.br
Java OO | Laboratrio
contasMemoria.add(entidade);
}
@Override
public void remover(Conta entidade) {}
@Override
public Collection<Conta> consultar(Conta entidade) {
return null;
}
@Override
public Collection<Conta> listar() {
return contasMemoria;
}
}
Listagem 16 ContaDAO.java
Modifque a Classe ContaService.java que veio sendo modifcada ao longo dos
laboratrios realizados, instanciando um objeto do tipo ContaDao para acesso aos dados em
memoria e TransacaoService para manipular aes direcionados as transaes efetuadas. Siga a
listagem 17 abaixo.
package threeway.projeto.service;
public class ContaService {
private ContaDao dao = new ContaDao();
private TransacaoService transacaoService = new TransacaoService();
/**
* Mtodo responsvel por realizar ao de deposito
*
* @param contaDestino
*
* @param valor
*/
public void depositar(Conta contaDestino, double valor) {
contaDestino.setSaldo(contaDestino.getSaldo() + valor);
this.historicoTransacao(null, contaDestino, valor, deposito na conta +
contaDestino.getNumero(), EnumTipoTransacao.DEPOSITO);
}
/**
* Mtodo responsvel por realizar ao de saque caso no tenha saldo sufciente e lanado uma
exceo
*
* @param contaSaque
*
* @param valor
*
* @throws SaldoInsufcienteException
*/
public void sacar(Conta contaSaque, double valor) throws SaldoInsufcienteException {
if (contaSaque.getSaldo() - valor >= 0) {
contaSaque.setSaldo(contaSaque.getSaldo() - valor);
Projeto
132 www.3way.com.br
Java OO | Laboratrio
this.historicoTransacao(null, contaSaque, valor, saque na conta +
contaSaque.getNumero(), EnumTipoTransacao.SAQUE);
} else {
throw new SaldoInsufcienteException();
}
}
/**
* Mtodo responsvel por realizar transferencia entre contas caso no tenha saldo sufciente e
lanado uma exceo
*
* @param contaSaque
*
* @param valor
*
* @param contaDestino
*
* @return boolean true se a transferencia for realizada com sucesso
*
* @throws SaldoInsufcienteException
*/
public boolean transferir(Conta contaSaque, double valor, Conta contaDestino) throws
SaldoInsufcienteException {
return transferir(contaSaque, valor, contaDestino, transferencia para conta +
contaDestino.getNumero());
}
/**
* Mtodo responsvel por realizar transferencia entre contas caso no tenha saldo sufciente e
lanado uma exceo
*
* @param contaSaque
*
* @param valor
*
* @param contaDestino
*
* @param descr
*
* @return boolean true se a transferencia for realizada com sucesso
*
* @throws SaldoInsufcienteException
*
*/
public boolean transferir(Conta contaSaque, double valor, Conta contaDestino, String descr)
throws SaldoInsufcienteException {
if (contaSaque.getSaldo() - valor >= 0) {
this.debito(contaSaque, valor);
this.credito(contaDestino, valor);
this.historicoTransacao(contaSaque, contaDestino, valor, descr,
EnumTipoTransacao.TRANSFERENCIA);
return true;
} else {
throw new SaldoInsufcienteException();
}
}
/**
* Mtodo responsvel por realizar debitos na conta
*
* @param contaOperacao
*
* @param valor
Projeto
133 www.3way.com.br
Java OO | Laboratrio
*/
protected void debito(Conta contaOperacao, double valor) {
contaOperacao.setSaldo(contaOperacao.getSaldo() - valor);
}
/**
* Mtodo responsvel por realizar operaes de credito na conta
*
* @param contaOperacao
*
* @param valor
*/
protected void credito(Conta contaOperacao, double valor) {
contaOperacao.setSaldo(contaOperacao.getSaldo() + valor);
}
/**
* Mtodo responsvel por instanciar e gravar historico de transaes
*
* @param contaDebito
*
* @param contaCredito
*
* @param valor
*
* @param descr
*
* @param tipoTransacao
*/
protected void historicoTransacao(Conta contaDebito, Conta contaCredito, double valor, String
descr, EnumTipoTransacao tipoTransacao) {
Transacao transacao = new Transacao(UtilData.data(), contaDebito, contaCredito, valor,
descr, tipoTransacao);
if (contaDebito != null) {
contaDebito.getTransacoes().add(transacao);
}
contaCredito.getTransacoes().add(transacao);
transacaoService.salvar(transacao);
}
/**
* Mtodo responsvel por salvar entidade conta validando campos obrigatorios
*
* @param conta
*
* @throws CamposObrigatoriosException
*/
public void salvar(Conta conta) throws CamposObrigatoriosException {
this.validarCamposObrigatorios(conta);
this.getDao().salvar(conta);
}
/**
* Mtodo responsvel por validar campos obrigatorios
*
* @param conta
*
* @throws CamposObrigatoriosException
*/
private void validarCamposObrigatorios(Conta conta) throws CamposObrigatoriosException {
Projeto
134 www.3way.com.br
Java OO | Laboratrio
if (conta == null || conta.getTitular() == null || conta.getNumero() == 0) {
throw new CamposObrigatoriosException();
}
}
/**
* Mtodo responsvel por buscar conta pelo cliente
*
* @param cliente
*
* @return Conta
*/
public Conta buscaContaPorCliente(Cliente cliente) {
for (Conta conta : getDao().listar()) {
if (conta.getTitular().equals(cliente)) {
return conta;
}
}
return null;
}
/**
* Mtodo responsvel por buscar conta por numero caso nao exista lana exceo de
ContaNaoExisteException
*
* @param numeroConta
*
* @return Conta
*
* @throws ContaNaoExisteException
*/
public Conta buscaContaPorNumero(int numeroConta) throws ContaNaoExisteException {
for (Conta conta : getDao().listar()) {
if (conta.getNumero() == numeroConta) {
return conta;
}
}
throw new ContaNaoExisteException();
}
/**
* Mtodo responsvel por retornar instancia de ContaDao
*
* @return
*/
public ContaDao getDao() {
return dao;
}
}
Listagem 17 ContaService.java
Crie a Classe TransacaoService.java e TransacaoDao.java conforme a listagem 18 e
19 respectivamente.
package threeway.projeto.service.Dao;
public class TransacaoDao implements Dao<Transacao> {
private Collection<Transacao> transacoesMemoria = new ArrayList<Transacao>();
@Override
Projeto
135 www.3way.com.br
Java OO | Laboratrio
public Transacao obter(Serializable identifcador) {
return null;
}
@Override
public void alterar(Transacao entidade) {}
@Override
public void salvar(Transacao entidade) {
this.transacoesMemoria.add(entidade);
}
@Override
public void remover(Transacao entidade) {}
@Override
public Collection<Transacao> consultar(Transacao entidade) {
return null;
}
@Override
public Collection<Transacao> listar() {
return transacoesMemoria;
}
}
Listagem 18 TransacaoDao.java
package threeway.projeto.service;
public class TransacaoService {
TransacaoDao dao = new TransacaoDao();
/**
* Mtodo responsvel por retornar instancia de TransacaoDao
*
* @return TransacaoDao
*/
public TransacaoDao getDao() {
return dao;
}
/**
* Mtodo responsvel por por salvar a entidade transao
*
* @param transacao
*/
public void salvar(Transacao transacao) {
this.getDao().salvar(transacao);
}
}
Listagem 19 TransacaoService.java
Veja que voc precisar implementar a classe ContaNaoExisteException.java para tratar
a exceo quando o usurio informar um numero de conta que no existe. Siga a listagem 11 abaixo.
package threeway.projeto.service.excecoes;
public class ContaNaoExisteException extends Exception{
private static fnal long serialVersionUID = -2692264935862218672L;
/**
Projeto
136 www.3way.com.br
Java OO | Laboratrio
* Responsvel pela criao de novas instncias desta classe.
*/
public ContaNaoExisteException() {
super(Conta no existe.);
}
/**
* Responsvel pela criao de novas instncias desta classe.
*
* @param mensagem
*/
public ContaNaoExisteException(String mensagem) {
super(mensagem);
}
}
Listagem 20 ContaNaoExisteExcepton.java
Crie a Classe OperacoesBanco.java pelo windowBuilder como um JInternalFrame.
Utilize o Design do window builder para criar conforme o prottipo. Deixe os atributos necessrios
com visibilidade para toda a classe, observe que alguns atributos esto estticos, isto ocorre porque
estes esto sendo acessados por mtodos estticos que os acessam ou modifcam sem instanciar a
classe. Siga a listagem 21 abaixo.
package threeway.projeto.gui;
public class OperacoesBanco extends JInternalFrame {
private static Cliente clienteSelecionado;
private static ContaService contaService;
private static Conta contaCliente;
private static JPanel panelDadosConta;
private static JTextField tfNumeroConta;
private static JTextField tfDtAbertura;
private static JTextField tfSaldo;
private static JButton btnAbrirConta;
private static JButton btnSaque;
private static JButton btnDeposito;
private static JButton btnTransferencia;
private static Boolean contaCriada = Boolean.FALSE;
private DialogAbrirConta dialogAbrirConta;
private DialogTransferencia dialogTransferencia;
private static JTable tableTransacoes;
private JPanel panelTransacoes;
}
Listagem 21 OperacoesBanco.java
Projeto
137 www.3way.com.br
Java OO | Laboratrio
Inicialize as variveis pelo mtodo initialize(). Siga a listagem 22 abaixo.
/**
* Mtodo responsvel por inicializar componentes da tela
*
*/
private void initialize() {
setClosable(true);
setBounds(100, 100, 750, 375);
setTitle(Operaes Bancarias);
getContentPane().setLayout(null);
JLabel lblCliente = new JLabel(Cliente:);
lblCliente.setFont(new Font(Tahoma, Font.BOLD, 12));
lblCliente.setBounds(13, 25, 46, 23);
getContentPane().add(lblCliente);
JLabel lblNomeCliente = new JLabel(clienteSelecionado.getNome());
lblNomeCliente.setFont(new Font(Tahoma, Font.BOLD, 12));
lblNomeCliente.setBounds(69, 25, 155, 23);
getContentPane().add(lblNomeCliente);
panelDadosConta = new JPanel();
panelDadosConta.setBorder(new TitledBorder(null, Dados da Conta, TitledBorder.
LEADING, TitledBorder.TOP, null, null));
panelDadosConta.setBounds(234, 11, 490, 53);
getContentPane().add(panelDadosConta);
panelDadosConta.setLayout(null);
JLabel lblNumero = new JLabel(N :);
lblNumero.setBounds(10, 20, 25, 14);
panelDadosConta.add(lblNumero);
tfNumeroConta = new JTextField();
tfNumeroConta.setEditable(false);
tfNumeroConta.setBounds(45, 17, 42, 20);
panelDadosConta.add(tfNumeroConta);
tfNumeroConta.setColumns(10);
JLabel lblSaldo = new JLabel(Saldo:);
lblSaldo.setBounds(361, 20, 36, 14);
panelDadosConta.add(lblSaldo);
JLabel lblDataDeAbertura = new JLabel(Data de Abertura:);
lblDataDeAbertura.setBounds(110, 20, 101, 14);
panelDadosConta.add(lblDataDeAbertura);
tfDtAbertura = new JTextField();
tfDtAbertura.setEditable(false);
tfDtAbertura.setBounds(221, 17, 125, 20);
panelDadosConta.add(tfDtAbertura);
tfDtAbertura.setColumns(10);
tfSaldo = new JTextField();
tfSaldo.setEditable(false);
tfSaldo.setBounds(394, 17, 86, 20);
panelDadosConta.add(tfSaldo);
tfSaldo.setColumns(10);
btnAbrirConta = new JButton(Abrir Conta);
btnAbrirConta.setBounds(293, 80, 101, 37);
getContentPane().add(btnAbrirConta);
btnSaque = new JButton(Saque);
btnSaque.setBounds(504, 80, 90, 37);
getContentPane().add(btnSaque);
btnDeposito = new JButton(Deposito);
btnDeposito.setBounds(404, 80, 90, 37);
getContentPane().add(btnDeposito);
btnTransferencia = new JButton(Transferncia);
btnTransferencia.setBounds(604, 81, 120, 36);
Projeto
138 www.3way.com.br
Java OO | Laboratrio
getContentPane().add(btnTransferencia);
JSeparator separator = new JSeparator();
separator.setBounds(13, 70, 711, 10);
getContentPane().add(separator);
JSeparator separator_1 = new JSeparator();
separator_1.setBounds(13, 128, 711, 10);
getContentPane().add(separator_1);
panelTransacoes = new JPanel();
panelTransacoes.setBorder(new TitledBorder(null, Historico de Transa\u00E7\u00F5es,
TitledBorder.LEADING, TitledBorder.TOP, null, null));
panelTransacoes.setBounds(13, 149, 711, 186);
getContentPane().add(panelTransacoes);
}
Listagem 22 OperacoesBanco.java initalize();
No construtor da classe ManterCliente.java chame o mtodo initialize() e faa com
que receba uma instancia de ContaService.java e Cliente.java como parmetros em seu
construtor. Siga a listagem 23 abaixo
/**
* Responsvel pela criao de novas instncias desta classe.
*
* @param serviceConta
*
* @param cliente
*/
public OperacoesBanco( ContaService serviceConta, Cliente cliente ) {
clienteSelecionado = cliente;
contaService = serviceConta;
initialize();
verifcaExistenciaDeContaParaCliente();
iniciaJTable();
atualizaDadosTabela();
acaoBotaoAbrirConta();
acaoBotaoDeposito();
acaoBotaoSaque();
acaoBotaoTransferencia();
}
Listagem 23 OperacoesBanco.java Construtor
Crie os mtodos que esto sendo chamados no construtor. Siga a listagem 24 abaixo.
/**
* Mtodo responsvel por verifcar se ja existe conta para o cliente selecionado
*
*/
private void verifcaExistenciaDeContaParaCliente() {
Conta conta = contaService.buscaContaPorCliente(clienteSelecionado);
if (conta != null) {
mudaStatusContaCriada(Boolean.TRUE);
Projeto
139 www.3way.com.br
Java OO | Laboratrio
contaCliente = conta;
} else {
mudaStatusContaCriada(Boolean.FALSE);
}
defneEnabledBotoes();
preenchePanelDescricaoConta();
}
/**
* Mtodo responsvel por adicionar evento ao boto de transferencia, este que chamara o
DialogTransferencia[JDialog]
*
*/
private void acaoBotaoTransferencia() {
btnTransferencia.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

dialogTransferencia = new DialogTransferencia(contaService,
contaCliente);
dialogTransferencia.setLocationRelativeTo(null);
dialogTransferencia.show();
}
});
}
/**
* Mtodo responsvel por adicionar evento ao boto de saque, este que chamar um JOptionPane
para informar o valor do saque
*
*/
private void acaoBotaoSaque() {
btnSaque.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
Double valorDeposito = Double.parseDouble(JOptionPane.
showInputDialog(null, Digite o valor para saque. (formato x00.00), Saque em conta bancria,
JOptionPane.QUESTION_MESSAGE));
contaService.sacar(contaCliente, valorDeposito);
JOptionPane.showMessageDialog(null, Saque realizado com
sucesso!);
preenchePanelDescricaoConta();
} catch (SaldoInsufcienteException ex1) {
JOptionPane.showMessageDialog(null, ex1.getMessage());
}catch (Exception ex) {
JOptionPane.showMessageDialog(null, Algum campo pode ter
sido preenchido invlido. Verifque e tente novamente!);
} fnally {
atualizaDadosTabela();
Projeto
140 www.3way.com.br
Java OO | Laboratrio
}
}
});
}
/**
* Mtodo responsvel por adicionar evento ao boto deposito, este que chamar um JOptionPane
para informar o valor do deposito
*
*/
private void acaoBotaoDeposito() {
btnDeposito.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
Double valorDeposito = Double.parseDouble(JOptionPane.
showInputDialog(null, Digite o valor para deposito. (formato x00.00), Depsito em conta
bancria, JOptionPane.QUESTION_MESSAGE));
contaService.depositar(contaCliente, valorDeposito);
JOptionPane.showMessageDialog(null, Deposito realizado com
sucesso!);
preenchePanelDescricaoConta();
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, Algum campo pode ter
sido preenchido invlido. Verifque e tente novamente!);
} fnally {

atualizaDadosTabela();
}
}
});
}
/**
* Mtodo responsvel por adicionar evento ao boto de abrir conta, este que chamara o
DialogAbrirConta[JDialog]
*
*/
private void acaoBotaoAbrirConta() {
btnAbrirConta.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
dialogAbrirConta = new DialogAbrirConta(contaService,
clienteSelecionado);
dialogAbrirConta.setLocationRelativeTo(null);
dialogAbrirConta.show();
} catch (ParseException e1) {
e1.printStackTrace();
}
}
});
}
/**
* Mtodo responsvel por inicializar JTable
Projeto
141 www.3way.com.br
Java OO | Laboratrio
*
*/
private void iniciaJTable() {
tableTransacoes = new JTable();
tableTransacoes.setModel(new DefaultTableModel(new Object[][] {},
retornaNomeColunas()));
tableTransacoes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tableTransacoes.setBounds(703, 24, -690, 140);
tableTransacoes.getTableHeader().setReorderingAllowed(false);
panelTransacoes.setLayout(null);
JScrollPane scrollPane = new JScrollPane(tableTransacoes);
scrollPane.setViewportView(tableTransacoes);
scrollPane.setBounds(10, 21, 691, 154);
panelTransacoes.add(scrollPane);
}
/**
* Mtodo responsvel por retornar nome das colunas da JTable
*
* @return String[]
*/
private static String[] retornaNomeColunas() {
String[] columnNames = new String[5];
columnNames[0] = ( Tipo Transao );
columnNames[1] = ( Titular/Conta Crdito );
columnNames[2] = ( Titular/Conta Debito );
columnNames[3] = ( Data );
columnNames[4] = ( Valor );
return columnNames;
}
/**
* Mtodo responsvel por Atualizar dados da tabela de transaes sempre que alguma transao e
feita esse metodo e chamado
*
*/
public static void atualizaDadosTabela() {
tableTransacoes.setModel(new DefaultTableModel(new Object[][] {},
retornaNomeColunas()));
tableTransacoes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
DefaultTableModel dtm = (DefaultTableModel) tableTransacoes.getModel();
ArrayList<Transacao> listaTransacoes = new ArrayList<Transacao>();
if (contaCliente != null) {
listaTransacoes = new ArrayList<Transacao>(contaCliente.getTransacoes());
}
Collections.sort(listaTransacoes);
Iterator<Transacao> it = listaTransacoes.iterator();
Projeto
142 www.3way.com.br
Java OO | Laboratrio
while (it.hasNext()) {
Transacao tr = it.next();
if (tr.getTipoTransacao() == EnumTipoTransacao.TRANSFERENCIA) {
dtm.addRow(new Object[] { tr.getTipoTransacao(), tr.getContaCredito().
getTitular().getNome() + / + tr.getContaCredito().getNumero(),
tr.getContaDebito().getTitular().getNome() + / +
tr.getContaDebito().getNumero(), UtilData.DDMMAAAAHHMM(tr.getData()), String.format(%15.15s,
tr.getValor()) });
} else {
dtm.addRow(new Object[] { tr.getTipoTransacao(), tr.getContaCredito().
getTitular().getNome() + / + tr.getContaCredito().getNumero(),
--, UtilData.DDMMAAAAHHMM(tr.getData()), String.format(%15.15s,
tr.getValor()) });
}
}
}
/**
* Mtodo responsvel por defnir se os botes abaixo defnidos estaro habilitados ou no
*
*/
public static void defneEnabledBotoes() {
btnAbrirConta.setEnabled(!contaCriada);
btnSaque.setEnabled(contaCriada);
btnDeposito.setEnabled(contaCriada);
btnTransferencia.setEnabled(contaCriada);
panelDadosConta.setVisible(contaCriada);
}
/**
* Mtodo responsvel por mudar fag de contaCriada de acordo com a funo executada no sistema
*
* @param fag
*/
public static void mudaStatusContaCriada(Boolean fag) {
contaCriada = fag;
}
/**
* Mtodo responsvel por recuperar conta de um determinado cliente selecionado
*
*/
public static void recuperaContaCliente() {
contaCliente = contaService.buscaContaPorCliente(clienteSelecionado);
preenchePanelDescricaoConta();
}
/**
* Mtodo responsvel por preencher JTextField com os dados do cliente selecionado
*
*/
public static void preenchePanelDescricaoConta() {
if (contaCliente != null) {
Projeto
143 www.3way.com.br
Java OO | Laboratrio
tfDtAbertura.setText(UtilData.formataData(contaCliente.getDataAbertura()));
tfNumeroConta.setText(contaCliente.getNumero().toString());
tfSaldo.setText(contaCliente.getSaldo().toString());
}
}
Listagem 24 OperacoesBanco.java Mtodos
5.5. Figura 8 - Tela Abrir Conta
Crie a Classe DialogAbrirConta.java pelo windowBuilder como um JDialog. Utilize o
Design do window builder para criar conforme o prottipo. Deixe os atributos necessrios com
visibilidade para toda a classe. Siga a listagem 25 abaixo.
package threeway.projeto.gui;
public class DialogAbrirConta extends JDialog {
private ContaService service;
private Cliente clienteSelecionado;
private Conta conta;
private JTextField tfDtAbertura;
private JTextField tfSaldo;
private JComboBox<EnumTipoConta> comboTipoConta;
private JTextField tfNumero;
private JButton btnCancelar;
private JButton btnSalvar;
private JLabel lblCamposObrigatrios;
}
Listagem 25 DialogAbrirConta.java
Inicialize as variveis pelo mtodo initialize(). Siga a listagem 26 abaixo.
/**
* Mtodo responsvel por inicializar componentes da tela
*
* @throws ParseException
*/
private void initialize() throws ParseException {
setModal(true);
this.setLocationRelativeTo(null);
setTitle(Abertura de Conta);
setBounds(100, 100, 300, 250);
getContentPane().setLayout(null);
JLabel lblNumero = new JLabel(Numero *:);
lblNumero.setBounds(10, 39, 80, 14);
getContentPane().add(lblNumero);
JLabel lblDataDeAbertura = new JLabel(Abertura:);
lblDataDeAbertura.setBounds(10, 11, 80, 14);
Projeto
144 www.3way.com.br
Java OO | Laboratrio
getContentPane().add(lblDataDeAbertura);
JLabel lblSaldoInicial = new JLabel(Saldo Inicial:);
lblSaldoInicial.setBounds(10, 67, 80, 14);
getContentPane().add(lblSaldoInicial);
JLabel lblTipoDeConta = new JLabel(Tipo de Conta *:);
lblTipoDeConta.setBounds(10, 95, 80, 14);
getContentPane().add(lblTipoDeConta);
tfDtAbertura = new JTextField();
tfDtAbertura.setEditable(false);
tfDtAbertura.setBounds(110, 8, 164, 20);
getContentPane().add(tfDtAbertura);
tfDtAbertura.setColumns(10);
btnCancelar = new JButton(Cancelar);
btnCancelar.setBounds(175, 166, 99, 35);
getContentPane().add(btnCancelar);
btnSalvar = new JButton(Salvar);
btnSalvar.setBounds(55, 166, 99, 35);
getContentPane().add(btnSalvar);
JSeparator separator = new JSeparator();
separator.setBounds(10, 153, 264, 2);
getContentPane().add(separator);
comboTipoConta = new JComboBox<EnumTipoConta>();
comboTipoConta.setBounds(110, 92, 164, 20);
getContentPane().add(comboTipoConta);
tfNumero = new JTextField();
tfNumero.setBounds(110, 36, 75, 20);
getContentPane().add(tfNumero);
tfSaldo = new JTextField();
tfSaldo.setBounds(110, 64, 75, 20);
getContentPane().add(tfSaldo);
tfSaldo.setColumns(10);
lblCamposObrigatrios = new JLabel((*) Campos Obrigatrios);
lblCamposObrigatrios.setHorizontalAlignment(SwingConstants.RIGHT);
lblCamposObrigatrios.setFont(new Font(Tahoma, Font.PLAIN, 11));
lblCamposObrigatrios.setBounds(138, 120, 136, 24);
getContentPane().add(lblCamposObrigatrios);
}
Listagem 26 DialogAbrirConta.java initalize()
No construtor da classe DialogAbrirConta.java chame o mtodo initialize() e faa
com que receba uma instancia de ContaService.java e Cliente.java como parmetros em seu
construtor. Siga a listagem 27 abaixo.
/**
* Responsvel pela criao de novas instncias desta classe.
*
* @param service
*
* @param cliente
*
* @throws ParseException
*/
public DialogAbrirConta( ContaService service, Cliente cliente ) throws ParseException {
this.service = service;
this.clienteSelecionado = cliente;
this.conta = new Conta();
Projeto
145 www.3way.com.br
Java OO | Laboratrio
initialize();
tfDtAbertura.setText(UtilData.formataData(new Date()));
tfSaldo.setText(0);
caregaComboTiposConta();
acaoBotaoCancelar();
acaoBotaoSalvar();
}
Listagem 27 DialogAbrirConta.java Construtor
Crie os mtodos que esto sendo chamados no construtor. Siga a listagem 24 abaixo.
/**
* Mtodo responsvel por adicionar evento ao boto salvar
*
*/
private void acaoBotaoSalvar() {
btnSalvar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
montaObjetoConta();
service.salvar(conta);
JOptionPane.showMessageDialog(null, Abertura de conta
realizada com sucesso!);
OperacoesBanco.recuperaContaCliente();
OperacoesBanco.mudaStatusContaCriada(Boolean.TRUE);
OperacoesBanco.defneEnabledBotoes();
setVisible(Boolean.FALSE);
} catch (CamposObrigatoriosException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
} catch (Exception ex1) {
JOptionPane.showMessageDialog(null, Algum campo pode ter
sido preenchido invlido. Verifque e tente novamente!);
}
}
});
}
/**
* Mtodo responsvel por adicionar evento ao boto cancelar
*
*/
private void acaoBotaoCancelar() {
btnCancelar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(Boolean.FALSE);
}
});
Projeto
146 www.3way.com.br
Java OO | Laboratrio
}
/**
* Mtodo responsvel por carregar combo com o EnumTiposConta
*
*/
private void caregaComboTiposConta() {
for (EnumTipoConta tipoConta : EnumTipoConta.values()) {
comboTipoConta.addItem(tipoConta);
}
}
/**
* Mtodo responsvel por montar objeto conta de acordo com os dados que o usuario informar
*
* @author Wilker Machado
*
* @throws Exception
*/
public void montaObjetoConta() throws Exception {
EnumTipoConta tipoConta = (EnumTipoConta) comboTipoConta.getSelectedItem();
this.conta = new Conta(this.clienteSelecionado, Integer.parseInt(tfNumero.getText()),
tipoConta);
this.conta.setSaldo(Double.parseDouble(tfSaldo.getText()));
} Listagem 27 DialogAbrirConta.java Mtodos
5.6. Figura 9 - Tela Transferncia entre Contas
Crie a Classe DialogTransferencia.java pelo windowBuilder como um JDialog. Utilize
o Design do window builder para criar conforme o prottipo. Deixe os atributos necessrios com
visibilidade para toda a classe. Siga a listagem 21 abaixo.
package threeway.projeto.gui;
public class DialogTransferencia extends JDialog {
private TransacaoService transacaoService = new TransacaoService();
private ContaService service;
private Conta contaCliente;
private Conta contaDestino;
private JPanel panelDadosConta;
private JTextField tfNumeroConta;
private JTextField tfDtAbertura;
private JTextField tfSaldo;
private JTextField tfTitularConta;
private JTextField tfNContaDestino;
private JTextField tfValorTranferencia;
private JButton btnCancelar;
Projeto
147 www.3way.com.br
Java OO | Laboratrio
private JButton btnRealizarTransfercia;
private JLabel lblCamposObrigatrios;
} Listagem 28 DialogTransferencia.java
Inicialize as variveis pelo mtodo initialize(). Siga a listagem 29 abaixo.
/**
* Mtodo responsvel por inicializar componentes da tela
*
*/
private void initialize() {
setModal(true);
this.setLocationRelativeTo(null);
setTitle(Transferncia entre contas);
getContentPane().setLayout(null);
setBounds(100, 100, 520, 270);
panelDadosConta = new JPanel();
panelDadosConta.setBorder(new TitledBorder(null, Dados da Conta, TitledBorder.
LEADING, TitledBorder.TOP, null, null));
panelDadosConta.setBounds(10, 11, 484, 77);
getContentPane().add(panelDadosConta);
panelDadosConta.setLayout(null);
JLabel lblNumero = new JLabel(N :);
lblNumero.setBounds(10, 20, 25, 14);
panelDadosConta.add(lblNumero);
tfNumeroConta = new JTextField();
tfNumeroConta.setEditable(false);
tfNumeroConta.setBounds(34, 17, 42, 20);
panelDadosConta.add(tfNumeroConta);
tfNumeroConta.setColumns(10);
JLabel lblSaldo = new JLabel(Saldo:);
lblSaldo.setBounds(343, 20, 36, 14);
panelDadosConta.add(lblSaldo);
JLabel lblDataDeAbertura = new JLabel(Data de Abertura:);
lblDataDeAbertura.setBounds(97, 20, 101, 14);
panelDadosConta.add(lblDataDeAbertura);
tfDtAbertura = new JTextField();
tfDtAbertura.setEditable(false);
tfDtAbertura.setBounds(208, 17, 125, 20);
panelDadosConta.add(tfDtAbertura);
tfDtAbertura.setColumns(10);
tfSaldo = new JTextField();
tfSaldo.setEditable(false);
tfSaldo.setBounds(388, 17, 86, 20);
panelDadosConta.add(tfSaldo);
tfSaldo.setColumns(10);
JLabel lblTitularDaConta = new JLabel(Titular da Conta:);
lblTitularDaConta.setBounds(10, 48, 101, 14);
panelDadosConta.add(lblTitularDaConta);
tfTitularConta = new JTextField();
tfTitularConta.setEditable(false);
tfTitularConta.setBounds(121, 45, 353, 20);
panelDadosConta.add(tfTitularConta);
tfTitularConta.setColumns(10);
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder(null, Dados para Transfer\u00EAncia, TitledBorder.
LEADING, TitledBorder.TOP, null, null));
Projeto
148 www.3way.com.br
Java OO | Laboratrio
panel.setBounds(10, 99, 484, 77);
getContentPane().add(panel);
panel.setLayout(null);
JLabel lblNContaDestino = new JLabel(N Conta Destino *:);
lblNContaDestino.setBounds(10, 24, 140, 14);
panel.add(lblNContaDestino);
JLabel lblValorDaTransferencia = new JLabel(Valor da Transferncia *:);
lblValorDaTransferencia.setBounds(10, 49, 149, 14);
panel.add(lblValorDaTransferencia);
tfNContaDestino = new JTextField();
tfNContaDestino.setBounds(160, 21, 86, 20);
panel.add(tfNContaDestino);
tfNContaDestino.setColumns(10);
tfValorTranferencia = new JTextField();
tfValorTranferencia.setBounds(160, 46, 86, 20);
panel.add(tfValorTranferencia);
tfValorTranferencia.setColumns(10);
lblCamposObrigatrios = new JLabel((*) Campos Obrigatrios);
lblCamposObrigatrios.setHorizontalAlignment(SwingConstants.RIGHT);
lblCamposObrigatrios.setBounds(315, 49, 159, 14);
panel.add(lblCamposObrigatrios);
btnCancelar = new JButton(Cancelar);
btnCancelar.setBounds(343, 187, 151, 33);
getContentPane().add(btnCancelar);
btnRealizarTransfercia = new JButton(Realizar Transfercia);
btnRealizarTransfercia.setBounds(172, 187, 161, 33);
getContentPane().add(btnRealizarTransfercia);
}
Listagem 29 DialogTransferencia.java initalize()
No construtor da classe ManterCliente.java chame o mtodo initialize() e faa com que
receba uma instancia de ContaService.java e Conta.java como parmetros em seu construtor.
Siga a listagem 30 abaixo.
/**
* Responsvel pela criao de novas instncias desta classe.
*
* @param contaService
*
* @param contaCliente
*/
public DialogTransferencia( ContaService contaService, Conta contaCliente ) {
this.service = contaService;
this.contaCliente = contaCliente;
initialize();
preenchePanelDescricaoConta();
acaoBotaoCancelar();
acaoBotaoRealizarTransferencia();
}
Listagem 30 DialogTransferencia.java Construtor
Projeto
149 www.3way.com.br
Java OO | Laboratrio
Crie os mtodos que esto sendo chamados no construtor. Siga a listagem 31 abaixo.
/**
* Mtodo responsvel por adicionar evento ao boto de realizar transferencia
*
*/
private void acaoBotaoRealizarTransferencia() {
btnRealizarTransfercia.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
int numeroConta = Integer.parseInt(tfNContaDestino.
getText());
Conta contaDestino = service.buscaContaPorNumero(numeroConta);
double valorTransferemcia = Double.
parseDouble(tfValorTranferencia.getText());
service.transferir(contaCliente, valorTransferemcia,
contaDestino);
OperacoesBanco.atualizaDadosTabela();
OperacoesBanco.preenchePanelDescricaoConta();
JOptionPane.showMessageDialog(null, Transferncia realizada
com sucesso!);
setVisible(Boolean.FALSE);
} catch (ContaNaoExisteException exConta) {
JOptionPane.showMessageDialog(null, exConta.getMessage());
} catch (SaldoInsufcienteException ex1) {
JOptionPane.showMessageDialog(null, ex1.getMessage());
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, Algum campo pode no ter
sido preenchido ou preenchido invlido. Verifque e tente novamente!);
}
}
});
}
/**
* Mtodo responsvel por adicionar evento ao boto de cancelar
*
*/
private void acaoBotaoCancelar() {
btnCancelar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(Boolean.FALSE);
}
});
}
Projeto
150 www.3way.com.br
Java OO | Laboratrio
/**
* Mtodo responsvel por preencher JPanel com as informaes da contaCliente
*
*/
private void preenchePanelDescricaoConta() {
if (contaCliente != null) {
tfDtAbertura.setText(UtilData.formataData(contaCliente.getDataAbertura()));
tfNumeroConta.setText(contaCliente.getNumero().toString());
tfSaldo.setText(contaCliente.getSaldo().toString());
tfTitularConta.setText(contaCliente.getTitular().getNome());
}
}
Listagem 31 DialogTransferencia.java Mtodos
Projeto
151 www.3way.com.br
Java OO | Laboratrio Tutorial
Tutorial
Instalando e confgurando WindowBuilder Pro no Eclipse
para desenvolver aplicativos Swing
O WindowBuilder composto por SWT Designer e Swing Designer tornando a criao
de aplicaes Java GUI descomplicada, reduzindo com isso o tempo empregado para escrever
cdigos. possvel usar ferramentas visuais de design e layout para criar de formas simples,
janelas complexas, sendo o cdigo Java gerado automaticamente. Os controles podem ser
arrastados e soltos para serem adicionados. Tambm possvel gerenciar os manipuladores de
eventos dos componentes e alterar suas propriedades usando um editor visual entre outras opes
(THE ECLIPSE FOUNDATION, 2011).
Essa ferramenta construdo como um plug-in para o Eclipse e as vrias ferramentas
baseadas em Eclipse. Ele constri uma rvore sinttica abstrata (AST) para navegar no cdigo
fonte e usa GEF para mostrar e gerir a apresentao visual. O cdigo gerado no requer bibliotecas
adicionais personalizados para compilar e executar, podendo ser usado sem ter WindowBuilder
Pro instalado. Ele pode ler e escrever praticamente qualquer formato e engenharia reversa
inclusive cdigo escrito a mo, suportando a edio do cdigo de forma livre permitindo fazer
alteraes em qualquer lugar, e mais, possvel mover, alterar nome e subdividir os mtodos sem
nenhum problema(THE ECLIPSE FOUNDATION, 2011).
A instalao do WindowBuilder Pro simples. Para efetuar, basta acessar o site
da ferramenta e obter o link para usar na ferramenta de instalao do Eclipse. Para isso
primeiramente deve se acessar o link https://developers.google.com/java-dev-tools/download-
wbpro?hl=pt-BR e copiar o endereo de acordo com a verso do Eclipse. Depois, basta ir no menu
help, clicar em Install New Software e colocar o link conforme fgura abaixo:
152 www.3way.com.br
Java OO | Laboratrio
Aps a instalao basta reiniciar o Eclipse que novos componentes iro aparecer na IDE.
Com isso j possvel usar as ferramentas. Na fgura abaixo e demonstrado como criar a tela
principal de uma aplicao Swing.
Como pode ser visto a ferramenta da suporte a outros tipos de interface, mas no tutorial
ser abordado apenas o Swing.
Com a criao do formulrio principal o Eclipse exibir o cdigo fonte do mesmo. Para que
seja possvel trabalhar em modo visual, basta clicar na aba design conforme exibido na Figura
abaixo que tambm j traz mais alguns recortes da tela de desenvolvimento.
153 www.3way.com.br
Java OO | Laboratrio
Ao adicionar, por exemplo, um JTextField, a paleta structure exibir as opes que
podero ser alteradas do componente. Em sua parte superior a mesma tem cinco botes sendo
eles o (1)Show Events que exibe os eventos que podem ser ativados, (2)Goto Defnition que leva
para o cdigo do componente, (3)Convert Field to local/Convert Local to Field que defne se os
componentes sero declarados para serem usados apenas localmente no cdigo ou se em todo o
escopo da classe, (4) Show advanced properties que exibir as opes avanadas do componente e
por fm o boto (5)Restore default value que ir restaurar os valores padres.
Na Figura abaixo exibida a prvia de uma janela criada com WindowBuilder Pro e do lado
esquerdo todos seus componentes.
154 www.3way.com.br
Java OO | Laboratrio
Para efetuar a vinculao faz-se necessrio a biblioteca beansbinding-1.2.1.jar que pode
ser encontrada em http://download.java.net/maven/2/org/jdesktop/beansbinding/1.2.1/. Aps
realizar download do arquivo, necessrio adicion-lo ao CLASSPATH. Para isso pode ser criado
uma nova pasta no projeto com nome de lib onde o arquivo colado e feito os procedimentos da
Figura abaixo.
Aps adicionar o arquivo ao CLASSPATH basta fechar e abrir o formulrio para que uma
nova aba, a Bindings, seja ativada conforme mostrado na Figura abaixo.
155 www.3way.com.br
Java OO | Laboratrio
Nessa aba esto disponveis vrios comandos visuais para confgurao dos vnculos como
pode ser observado na Figura abaixo.
No campo 1b, sero exibidas as vinculaes criadas que, ao serem selecionadas podero ser
alteradas pelos controles do campo 1a. Os controles dos campos 2a e 2b servem para defnir como
o objeto deve ser tratado, isso muito importante, pois algumas opes s aparecero se for feita
a defnio correta. Os campos 3a e 3b estabelecem, respectivamente, qual objeto ser o alvo e o
modelo. O controle do campo 4 serve para criar a vinculao. Por fm, os campos 5a e 5b, permitem
escolher quais propriedades sero vinculadas de ambos os objetos.

Você também pode gostar