Você está na página 1de 201

Formao Bsica de

Programadores Java



Prof. Marcos Vinicius de Andrade Lima





Powered by GreenBeans
/* Programao Descomplicada */

Sumrio

1. ACEITA UM CAFEZINHO? ............................................................ 6
1.1 Um pouco de histria ......................................................... 7
1.2 Caractersticas de Java ........................................................ 9
1.3 Mquina Virtual Java (JVM) .............................................. 11
1.4 Jogo Rpido....................................................................... 14
1.5 Pergunte ao Orculo... ...................................................... 15

2. PREPARANDO O AMBIENTE ...................................................... 16
2.1 Instalando o Java JDK........................................................ 17
2.2 Eclipse IDE ......................................................................... 20
2.3 O Primeiro Programa ........................................................ 21
2.4 Jogo Rpido....................................................................... 23
2.5 Pergunte ao Orculo... ...................................................... 23

3. TIPOS DE DADOS ....................................................................... 24
3.1 Dados e mais dados... ....................................................... 25
3.2 Tipos Primitivos em Java .................................................. 27
3.3 Declarando variveis ........................................................ 30
3.4 Declarando Constantes..................................................... 32
3.5 Operadores ....................................................................... 33
3.6 Casting .............................................................................. 35
3.7 Vamos Treinar................................................................... 36

4. JAVA TEM STRINGS? ................................................................. 37
4.1 Declarando Strings ............................................................ 38
4.2 Alguns mtodos teis... .................................................... 39
4.3 Vamos Treinar................................................................... 40

5. EXIBINDO E LENDO DADOS ....................................................... 41
5.1 Exibindo Dados ................................................................. 42
5.2 Lendo Dados ..................................................................... 43
5.3 Vamor treinar ................................................................... 44




6. ESTRUTURAS DE CONTROLE ..................................................... 45
6.1 Fluxo de Dados ................................................................. 46
6.2 Estruturas Condicionais .................................................... 46
6.3 Vamos Treinar................................................................... 51
6.4 Estruturas de Repetio ................................................... 51
6.5 Vamos pensar um pouco... ............................................... 56
6.6 Vamos treinar ................................................................... 56

7. ARRAYS... ISTO MORDE? ........................................................... 58
7.1 Arrays ................................................................................ 60
7.2 Manipulando Arrays ......................................................... 62
7.3 Arrays Multidimensionais ................................................. 62
7.4 Vamos treinar? ................................................................. 65

8. CONCEITOS INICIAIS DE ORIENTAO A OBJETOS ................... 67
8.1 Introduo ........................................................................ 68
8.2 Paradigma da Orientao a Objetos ................................. 69
8.3 Caractersticas da Orientao a Objetos .......................... 70
8.4 Objetos e Classes .............................................................. 71
8.5 Os Quatro Pilares da OO ................................................... 74
8.6 Jogo Rpido... ................................................................... 79

9. CLASSES E OBJETOS EM JAVA ................................................... 80
9.1 Flash back... ...................................................................... 81
9.2 Definindo classes em Java ................................................ 83
9.3 Criando Objetos ................................................................ 84
9.4 Acessando variveis de instncia ..................................... 85
9.5 Mtodos dos Objetos ....................................................... 86
9.6 A Referncia this ........................................................... 91
9.7 Acessibilidade Pblica e Privada ....................................... 93
9.8 Mtodos Construtores ..................................................... 95
9.9 Sobrecarga de Mtodos ................................................... 96
9.10 Membros Estticos ....................................................... 98
9.11 Vamos treinar? ........................................................... 102



10. PACOTES ................................................................................. 107
10.1 Cad o Meu Pacote? ................................................... 108
10.2 Definindo Subpacotes ................................................. 109
10.3 Nomeando Pacotes..................................................... 111
10.4 Acessibilidade de Pacotes ........................................... 111
10.5 Vamos Treinar? ........................................................... 112

11. O QUE GANHEI DE HERANA? ................................................ 114
11.1 Introduo .................................................................. 115
11.2 Definindo nossas classes ............................................ 115
11.3 Vale a pena ver de novo... .......................................... 118
11.4 Aplicando Herana em Java ........................................ 120
11.5 Mais Sobre o Mecanismo de Herana ........................ 122
11.6 Classes Finais .............................................................. 124
11.7 Vamos treinar? ........................................................... 124

12. REDEFINIO DE MTODOS ................................................... 126
12.1 Mais Sobre Referncia this................................. 127
12.2 O Construtor this() ............................................ 128
12.3 Nem Tudo Eu Fao Igual Papai ................................. 129
12.4 A referncia super ................................................... 131
12.5 O Construtor super() .......................................... 132
12.6 Encadeamento de Construtores ................................. 134
12.7 Mtodos Finais ........................................................... 135
12.8 Vamos Treinar? ........................................................... 136

13. REFERNCIA E CIA... ................................................................ 137
13.1 Manipulando Referncias ........................................... 138
13.2 Casting de Referncias ............................................... 139
13.3 Operador instanceof ............................................ 141
13.4 Unindo casting e instanceof ................................ 142
13.5 Passagem de Parmetros ........................................... 144
13.6 Vamos Treinar? ........................................................... 146

14. CLASSES ABSTRATAS E INTERFACES ....................................... 147
14.1 Classes Abstratas ........................................................ 148


14.2 Mtodos Abstratos ..................................................... 149
14.3 Interfaces .................................................................... 152
14.4 Implementando Interfaces ......................................... 153
14.5 Interfaces e Polimorfismo........................................... 155
14.6 Constantes em Interfaces ........................................... 156
14.7 Vamos Treinar? ........................................................... 157

15. AGREGAO, LISTAS E MAPEAMENTOS ................................. 159
15.1 Agregao ................................................................... 160
15.2 Colees de Selos, Carros... ........................................ 162
15.3 Listas ........................................................................... 164
15.4 Listas Genricas .......................................................... 167
15.5 Mapeamentos............................................................. 168
15.6 Mapeamentos Genricos ........................................... 170
15.7 Vamos Treinar? ........................................................... 171

16. NO FUI EU... .......................................................................... 174
16.1 Introduo .................................................................. 175
16.2 Excees em Java ........................................................ 177
16.3 A Clusula throws .................................................... 180
16.4 A Sentena throw ..................................................... 180
16.5 O bloco try-catch ................................................. 181
16.6 Adicionando Informaes nas Excees ..................... 183
16.7 Vamos Treinar? ........................................................... 184

17. MULTITAREFA COM THREADS ................................................ 187
17.1 Introduo .................................................................. 188
17.2 Threads ................................................................... 188
17.3 Estendendo de Thread ............................................. 190
17.4 Implementando Runnable ...................................... 191
17.5 Estados de Thread ...................................................... 192
17.6 Alterando a Prioridade ............................................... 195
17.7 Sincronizao .............................................................. 196
17.8 Cuidado com os Deadlocks! ........................................ 199
17.9 Vamos Treinar? ........................................................... 200


1. ACEITA UM
CAFEZINHO?
Neste captulo voc conhecer
a linguagem Java: sua origem,
caractersticas e popularidade.
Sinta o aroma de Java se
espalhando por todos os
lugares.
Java is Everywhere

7


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
1.1 Um pouco de histria

Hoje estamos completamente imersos em um mundo de
software. Tudo ao nosso redor controlado por programas:
quer quando voc compra um cafezinho em uma mquina
expressa; ou quando realiza um saque em um caixa de
autoatendimento; na hora de pagar a passagem do nibus; ao
realizar uma chamada telefnica; ao assistir televiso; navegar
na Internet; entre outros. Na realidade, na maioria das vezes,
nem ao menos nos damos conta desta imerso em que
vivemos.

Estamos em uma poca de
profundo uso da tecnologia e
convergncia digital. Se antes
o homem no poderia viver
sozinho em uma ilha; hoje os
equipamentos e servios na
web que no podem.

Mas como realizar tamanha
tarefa com a quantidade de
dispositivos e plataformas existentes? preciso de algo que
consiga funcionar em multiplataformas, seja poderoso,
robusto e orientado a objetos. Hummm... o agente perfeito
para isto chama-se Java!

Java uma linguagem de programao orientada a objetos
lanada em 1995 pela Sun Microsystem. Ela fruto do
trabalho da equipe de Patrick Naughton, Mike Sheridan e
James Gosling, que em 1991 iniciaram seu desenvolvimento
Formao Bsica de Programadores Java 8

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


com o codinome de Projeto Green. Seus idealizadores
acreditavam que em pouco tempo os aparelhos domsticos e
os computadores teriam uma ligao ntima (acho que eles
assistiram muito Os Jetsons quando eram crianas).

Oak (carvalho) seria o nome a ser adotado para
a nova linguagem que estava nascendo, uma
homenagem rvore que Gosling podia
observar da janela do seu escritrio. S que
depois se descobriu que j existia uma
linguagem com este nome (graas a Deus!).
Ento o nome Java surgiu pela grande
quantidade de caf, originrio da ilha de mesmo
nome, que a equipe tomava.

O primeiro produto utilizando a nova
linguagem foi um controle remoto com
interface touchscreen, o *7
(StarSeven). O aparelho tinha uma
mascote que ensinava ao usurio a
utilizar o controle. Durante algum
tempo o projeto passou por
dificuldades visto que o mercado de
produtos eletrnicos da poca no
cresceu como o esperado e infelizmente a tecnologia
existente no estava preparada para tamanho avano.

Aps a grande popularidade alcanada pela Internet em 1993,
a Sun viu o grande potencial que a linguagem tinha para o
desenvolvimento de paginas mais dinmicas. Hoje, Java uma
das linguagens de programao mais populares no mundo!
9


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
1.2 Caractersticas de Java

Java possui algumas palavras chaves que a caracterizam,
como: simples, orientada a objetos, sintaxe parecida com
C/C++, independente de plataforma, multithread, dinmica,
robusta, distribuda e interpretada.

Simples: como dito anteriormente, a motivao
principal do projeto de Java era fazer uma linguagem
para rodar em pequenos dispositivos. Tanto verdade
que o interpretador bsico de somente 40KB, mas se
forem levados em considerao as bibliotecas bsicas,
tem-se um total de 175KB, ainda assim um valor
pequeno.

Orientada a Objetos: Java utiliza um paradigma mais
atual de programao, onde possvel facilmente
realizar reuso de software e o foco est centrado nos
dados e suas interfaces.

Sintaxe parecida com C/C++: Java utiliza uma sintaxe
semelhante ao C/C++ justamente por que a estratgia
dos seus idealizadores era tornar seu aprendizado mais
tranquilo, visto que a maioria dos programadores
conheciam C/C++.

Independente de Plataforma: Java foi criada para
rodas em uma infinidade de dispositivos. E por este
motivo um programa escrito em Java, depois de
compilado, pode rodar em qualquer lugar que possua
uma Mquina Virtual Java. Um programa Java no
Formao Bsica de Programadores Java 10

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


compilado para um determinado tipo de plataforma.
Resumindo, um programa em Java portvel.

Multithread: Foi-se o tempo que os programas faziam
apenas uma determinada tarefa por vez. Hoje as
aplicaes precisam verificar ortografia enquanto se
edita um texto, verificar e-mail enquanto navega na
Internet, etc. Java possui um poderoso e fcil
mecanismo de multitarefa.

Dinmica: em Java muitos dos objetos utilizados em
um sistema so definidos dinamicamente, ou seja, em
tempo de execuo. Este recurso faz toda a diferena
para a aplicao do polimorfismo.

Robusta: Java uma linguagem fortemente tipada
destinada para escrever programas que possam ser
confiveis. Ser fortemente tipada significa que
realizada uma extensiva checagem de tipos em tempo
de compilao, denunciando rapidamente problemas
ou bugs.

Distribuda: em Java possvel escrever sistemas que
acessam partes remotas com a mesma facilidade como
se fossem locais. Diversos protocolos que rodam em
cima de TCP/IP podem ser utilizados, como HTTP e
FTP.

Interpretada: um arquivo fonte em Java precisa ser
compilado para se gerar o bytecode. Aps este
processo, o bytecode interpretado pela Mquina
Virtual Java para que possa ser executado na
11


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
plataforma especfica. Antigamente algumas pessoas
reclamavam dizendo que Java era lenta, mas hoje em
dia os programas em Java so muito rpidos, graas
diversas estratgias, como HotSpot.

1.3 Mquina Virtual Java (JVM)

A Mquina Virtual Java (JVM Java Virtual Machine) a
grande responsvel por fazer Java ser independente de
plataforma. Mas antes de falar mais sobre JVM, vamos
entender como as coisas funcionavam antes do surgimento de
Java para executar um programa em diversas plataformas:







O programador em C precisa conhecer alm da linguagem, as
caractersticas e nuances de cada uma das plataformas em
que trabalha. O cdigo fonte em C, ainda que seja o mais
simples possvel, depois de compilado, no consegue ser
Mais um
cdigo fonte
em C saindo...
compilao
compilao
compilao
Linux
IBM AIX
Windows
Execuo
Execuo
Execuo
Formao Bsica de Programadores Java 12

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


executado em diversas plataformas sem passar novamente
pelo processo de compilao. C no portvel!
Os projetistas de Java resolveram o problema da portabilidade
criando uma camada de software entre o cdigo compilado
(que em Java so chamados de bytecodes) e o sistema
operacional da plataforma alvo. Com isto os programas em
Java s precisam ser compilados uma nica vez! Veja a
ilustrao a seguir e perceba a diferena com o que foi visto
anteriormente:









O programador Java escreve seu cdigo de acordo com a
sintaxe estabelecida pela linguagem. Finalizado o
desenvolvimento do cdigo, este passa por um processo de
compilao. Se no houve nenhum erro gerado, aps o
processo de compilao, um ou vrios arquivos bytecode. Este
arquivo pode ento ser interpretado pela Mquina Virtual
Cdigo fonte
em Java
saindo...
compilao
Linux
IBM AIX
Windows

J
V
M
13


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Java em qualquer plataforma que tenha disponvel uma JVM.

Observe que o cdigo fonte compilado uma nica vez,
independente se o programa simples ou complexo! Outra
maravilha com o uso da JVM que podemos distribuir pacotes
de classes que funcionam em todas as plataformas com JVM
instalada. Antes era preciso gerar bibliotecas especficas para
cada plataforma.





A JVM possui diversos fabricantes, mas todos eles devem
seguir as especificaes Java da Oracle para que possam
executar qualquer bytecode. A verso mais popular pode ser
baixada pelo site da Oracle:

http://www.oracle.com/technetwork/java/javase/downloads/
index.html

L voc encontrar as verses JRE (Java Runtime Environment)
e JDK (Java Development Kit). Voc saberia dizer qual a
diferena entre as duas verses? Abaixo temos uma figura
com a plataforma padro Java:
Enquanto os bytecodes so independentes de
plataforma, a Mquina Virtual Java (JVM)
dependente de plataforma.
Formao Bsica de Programadores Java 14

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /




1.4 Jogo Rpido


a) Quais as principais caractersticas de Java?
b) O que so bytecodes?
c) Quais os passos necessrios para executar um sistema
em Java? (cdigo fonte at a execuo)
d) O que a JVM e qual sua importncia?
e) Qual a diferena entre JDK e JRE?

15


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
1.5 Pergunte ao Orculo...

a) Por que estudar Orientao a Objetos?
b) Como que se chama o compilador Java? E a JVM?
c) O que Garbage Collector?



2. PREPARANDO O
AMBIENTE



Para se tornar um excelente e
poderoso NINJA preciso
preparar todo o ambiente antes
do incio do treinamento dirio!
Neste captulo voc ver como
configurar o ambiente
necessrio para desenvolver suas
habilidades em Java.

Java is Everywhere

17


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2.1 Instalando o Java JDK

O primeiro passo para preparar o ambiente de
desenvolvimento em Java instalar a verso JDK em sua
mquina. Basta acessar o site da Oracle e baixar a ltima
verso Java SE (Standard Edition) de acordo com o seu Sistema
Operacional:


O processo de instalao bastante simples e intuitivo,
bastando ir avanando em cada um dos passos at a que a
instalao da plataforma esteja completa.

O prximo passo, caso deseje compilar e executar programas
em Java no Prompt de Comando ou Terminal Linux,
configurar as variveis de ambiente. A seguir mostrado
como configur-las utilizando o Windows 7:

Passo 1: clique no boto Iniciar e em seguida Painel de
Controle;

Passo 2: selecione a opo Sistema e Segurana;

Passo 3: Agora selecione Sistema;

Passo 4: Selecione Configuraes Avanadas do Sistema;

Passo 5: Agora selecione Variveis de Ambiente;


18

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Passo 6: Em Variveis de Ambiente voc deve adicionar uma
nova varivel do sistema, clicando em Novo no
agrupamento Variveis do Sistema. Adicione a varivel
JAVA_HOME. O endereo de instalao depende de onde
voc instalou o JDK. Abaixo segue um exemplo:


Passo 7: ainda no agrupamento Variveis do Sistema
adicione a varivel CLASSPATH, como mostrado abaixo:



Passo 8: agora procure a varivel path na lista de Variveis
do Sistema e clique no boto Editar.... Cuidado para no
apagar os valores que j existem! No final do valor da varivel
adicione %JAVA_HOME%\bin ; . ;
19


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java


Passo 9: Confirme com OK e em seguida abra o Prompt de
Comando para testar a configurao das variveis. Digite
java e tecle ENTER para verificar a execuo da JVM. Depois
digite javac para verificar a execuo do compilador Java.



20

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
http://www.eclipse.org/downloads/
2.2 Eclipse IDE

Eclipse uma IDE desenvolvida em Java, com cdigo aberto
para a construo de programas de computador. O projeto
Eclipse foi iniciado na IBM, que desenvolveu a primeira verso
do produto e doou-o como software livre para a comunidade.

Hoje, o Eclipse a IDE Java mais utilizada no mundo. Possui
como caractersticas marcantes o uso da SWT e no do Swing
como biblioteca grfica, a forte orientao ao
desenvolvimento baseado em plug-ins e o amplo suporte ao
desenvolvedor com centenas de plug-ins que procuram
atender as diferentes necessidades de diferentes
programadores, at para quem no programa em Java! A
ltima verso, lanada em julho de 2013, foi batizada de
Kepler. Abaixo veja o link para fazer o download:


Para instalar o programa no existe algo mais simples: basta
descompactar o arquivo baixado do site em uma pasta e
executar o arquivo eclipse.exe (no Windows).
OBSERVAO: voc precisa ter o Java previamente instalado
no seu sistema!



21


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
2.3 O Primeiro Programa

Agora que todo o ambiente est preparado, vamos
escrever o primeiro programa em Java para testar
tudo. Na verdade este primeiro programa tem
uma importncia gigantesca, no por testar se
tudo foi instalado corretamente, mas para
quebrar a Maldio das Linguagens de
Programao. Isto mesmo! Existe uma maldio que ronda as
linguagens de programao e para que voc tenha sucesso em
Java ser preciso quebr-la! Uns dizem que isto lenda geek,
mas como seguro morreu de velho... melhor no facilitar!

Para este primeiro programa, vamos utilizar algum editor de
texto como o Bloco de Notas do Windows. Abaixo segue o
cdigo que deve ser digitado no editor:

public class HelloWorld
{
public static void main(String[] args)
{
System.out.println(Hello World!);
}
}

Aps voc terminar de digitar o cdigo fonte acima, grave-o
com o nome de HelloWorld.java. Tenha bastante ateno
com relao as letras maisculas e minsculas! Depois no
diga que no avisei...

Agora que seu arquivo fonte foi gravado, a hora de compilar
o programa. Para isto abra um terminal, como o Prompt de
22

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Comando do Windows. Entre na mesma pasta que o arquivo
HelloWorld.java foi gravado e digite conforme abaixo:


Se tudo estiver certo no vai aparecer nenhuma mensagem na
tela, apenas aparece o prompt com o cursor piscando
esperando a entrada de um novo comando. Digite conforme a
figura abaixo e observe a execuo do programa:

23


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Mas, se por algum motivo seu primeiro
programa no funcionar bonito como o da
apostila, no precisa arrancar os cabelos!
Tenha calma! No incio isto normal! Conte
at 10 e verifique se tudo foi digitado
corretamente.

No se esquea das letras maisculas e minsculas (avisando
novamente para ficar grudado no seu crebro, crebro,
crebrooooooo...)

2.4 Jogo Rpido

a) Escreva um programa em Java que mostre na tela o
seu nome.

b) Escreva um programa em Java que mostre na tela seu
nome em uma linha, e na outra o local em que voc
estuda ou trabalha.

2.5 Pergunte ao Orculo...

a) Existe um documento que foi criado em uma
conveno intergalctica (com a participao de ninjas,
jedis, siths, hobbits, etc), que determina o padro que
deve ser seguido por todas as pessoas que trabalham
com Java. O nome do documento Java Code
Conventions. Pesquise mais sobre essas convenes.



3. TIPOS DE DADOS

Neste captulo voc ver o que
so dados e qual sua
importncia. Tambm aprender
o que so variveis, quais so os
tipos primitivos em Java e
quando utilizar cada um deles.
Que a Fora esteja com voc
para conseguir resolver todos os
exerccios...
Java is Everywhere

25


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
3.1 Dados e mais dados...

Hoje a informao tratada como recurso
principal das empresas e organizaes. Mas
de onde ela vem? Ela surge do alm? Vem
de um universo paralelo? O que voc acha?

Informao pode ser definida como um
conjunto de fatos organizados de tal forma
que adquirem valor adicional alm do valor
do fato em si. Complicou? Veja o exemplo abaixo para ver se
melhora... ou no...

O inverno em Nova Iorque comea em dezembro

Esta frase um exemplo de informao por que tem um
conjunto de caracteres organizados dentro de um
determinado contexto.




J as palavras soltas: inverno, Nova Iorque e dezembro
so considerados dados.




Informao:
Dados dotados de relevncia e propsito
Peter Drucker
Dados:
... so puramente sintticos...
Valdemar Setzer
26

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Regras e relaes podem ser estabelecidas para organizar os
dados em informao til e valiosa. Mas claro que o tipo de
informao criada depende diretamente da relao definida
entre os dados existentes. Uma escolha errada dos dados
pode produzir informaes distorcidas e at mascarar a
realidade vivida por uma organizao.

importante observar que relaes podem ser redefinidas e
novas informaes criadas com a incluso de novos dados. E
que informaes podem produzir mais informao.

A tabela abaixo resume as principais diferenas entre dados e
informao:

Dados Informao
Simples observao sobre um
estado.
Dados dotados de
relevncia e propsito.
facilmente estruturados;
facilmente obtidos por
mquinas;
frequentemente
quantificados;
facilmente transfervel.
requer unidade de
anlise;
exige consenso em
relao ao significado;
exige
necessariamente a
medio humana.

Legal saber isto tudo sobre dados e informao, mas como
mesmo que o computador armazena e trabalha com eles?

Grande parte do trabalho realizado pelo computador
baseada na manipulao do contedo contido em sua
memria: dados e programas. Estes dados e programas esto
27


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
em sua forma binria, que o sistema que os computadores
entendem (zeros e uns).

Se na memria tudo representado como zeros e uns, como o
computador consegue diferencias uma palavra de um
nmero?

3.2 Tipos Primitivos em Java

Java uma linguagem tipada estaticamente, ou seja, aps
que um determinado tipo tenha sido atribudo uma varivel,
ela no mudar o seu tipo durante o restante da execuo do
programa. Isto algo que previne o acontecimento de
diversos bugs!

Mas antes de falarmos sobre os tipos primitivos,
interessante entender o que so variveis e qual sua
importncia.

Imagine que voc, em um determinado momento, tire uma
fotografia instantnea do contedo da memria de um
computador. Voc poderia encontrar algo como mostrado a
seguir:

Endereo de Memria Contedo da Memria
(00010110)
2
(16)
16
10011100
(00010111)
2
(17)
16
11110000
(00011000)
2
(18)
16
00000101
(00011001)
2
(19)
16
00000000
... ... ...
(11111110)
2
(FE)
16
10000001
28

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Na figura anterior podemos observar que cada endereo tem
um valor em binrio, e para facilitar, tambm tem um valor
correspondente no sistema hexadecimal. Ento j pensou o
que voc teria que fazer para colocar o valor de dois nmeros
na memria para depois som-los? Uma possvel soluo
seria:

1 colocar o primeiro valor em um
endereo de memria (00010001);

2 colocar o segundo valor em outro
endereo de memria (11100001);

3 somar o contedo do primeiro endereo
de memria (00010001)
2
com o contedo do
segundo endereo (11100001)
2
e guardando o
resultado em um terceiro endereo de
memria (00010011)
2
.

Ser que os passos descritos acima seriam fceis de serem
lembrados? E os nmeros dos endereos? Voc acha que seria
fcil lembr-los? pouco provvel!

por esta dificuldade de lembrar em que posies de
memria os dados foram guardados, que nos primrdios da
computao os programadores no chegavam aos 35 anos!
(brincadeirinha... mas alguns perderam os cabelos sim!).

Para solucionar este problema iniciou-se a utilizao de
variveis! Elas so a salvao da lavoura, ou melhor, a
salvao dos nossos cabelos!

Uma varivel nada mais que uma palavra que associada a
uma posio de memria. Por que claro que mais fcil
29


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
lembrar-se de uma palavra do que de nmeros em binrio ou
hexa. Veja a diferena da soma de dois nmeros usando
variveis:

1 colocar o primeiro valor na varivel
A;

2 colocar o segundo valor na varivel B;

3 somar o contedo da varivel A com o
contedo da varivel B e guardando o
resultado em uma terceira varivel C.

Ento, mais fcil ou no trabalhar desta forma? Se voc
respondeu NO aconselhvel fazer um curso de Assembly
ou primo do Neo da Matrix.

Em Java cada varivel deve ter um tipo associado a ela o tipo
de dado que ela guarda. Por exemplo, se eu quero uma
varivel para guardar o total de alunos de uma sala, essa
varivel deve ter associado a ela o tipo inteiro. Se eu quero
guardar a mdia das notas de uma sala eu poderia associar a
este minha varivel o tipo real ou ponto flutuante. Em Java
temos oito (8) tipos primitivos:

Tipos inteiros:
byte (8 bits)
short (16 bits)
int (32 bits)
long (64 bits)

30

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Tipos reais (ponto flutuante):
float (32 bits)
double (64 bits)

Tipo lgico
boolean (1 bit)

Tipo caractere
char (16 bits)

Java ainda assume que para constantes inteiras o tipo padro
o int (3; 60; -10; -7) e para constantes de ponto flutuante o
tipo padro o double (3.14; 0.1; 12.10).




3.3 Declarando variveis

Agora que voc j sabe a facilidade que o uso de variveis
trouxe para a vida dos programadores e j viu a lista com os
oito tipos primitivos de Java, vamos agora aprender como
declarar variveis. Para declarar uma varivel use:

<tipo> <varivel>;

Exemplo:
char genero;
int idade;
float media, salario;
Quanto maior for a quantidade de bits de um tipo,
maior ser o valor que ele poder alcanar.

31


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Tambm possvel atribuir um valor inicial para uma
determinada varivel na hora da sua declarao (inicializao).

<tipo> <varivel> = <expresso/valor>;

Exemplo:
char genero = f;
int x = 5, y = 10;
double total = 3.14 * 9.99 / 30;

Voc pode atribuir a qualquer tempo um valor para uma
varivel previamente declarada. Veja o exemplo a seguir:

Exemplo:
int i, j;
i = 10;
j = 12;





A seguir mais um cdigo de fixao:

public class DeclarandoVariaveis{
public static void main(String[] args){
int i, j;
float valor = 2.12f;
double distancia = 32982.234;
char vogal = a;
boolean aberto = true;
System.out.println(valor);
System.out.println(distancia);
CUIDADO: O sinal de igual ( = ) em Java utilizado
para atribuio! Depois no diga que no
foi alertado!

32

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
System.out.println(vogal);
System.out.println(aberto);
i = 2011;
j = 7;
System.out.println(i);
System.out.println(j);
}
}

importante saber que variveis locais em Java sempre
devem ser inicializadas antes de serem usadas.
3.4 Declarando Constantes

Em Java tambm podemos utilizar em nossos programas
algumas constantes. Uma constante, como o prprio nome
sugere, possui um valor constante (diferentemente das
variveis em que o valor pode ser alterado).

Para declararmos uma constante em Java precisamos fazer
uso do modificador final.

// varivel de instncia final
public final int UMA_CONSTANTE = 10;
// varivel esttica final
static final String OUTRA_CONSTANTE = Pedro;
Variveis estticas, de instncia e locais podem ser final
(constante), inclusive parmetros.

ATENO: uma varivel final no precisa necessariamente ser
inicializada em sua declarao, porm, uma vez inicializada,
no pode ter seu valor alterado (blank final variables).


33


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo:
final int X;
X = 2; // a partir de agora no muda

O padro de escrita de constantes de Java utilizar letras
maisculas separadas por underscores ( _ ).

Exemplo:
MIN_VALUE, MAX_ QUERY_ROWS

3.5 Operadores

Java possui um conjunto bastante completo de operadores.
Abaixo temos a relao dos mais utilizados:

Operadores Aritmticos:
( + ) Soma;
( - ) Subtrao;
( * ) Multiplicao;
( / ) Diviso;
( % ) - Resto da Diviso .

Operadores de Atribuio:
( = ) Principal operador de atribuio;
( += ) a += b a = a + b;
( -= ) a = b a = a b;
( *= ) a *= b a = a * b;
( /= ) a /= b a = a / b;
( %= ) a %= b a = a % b;


34

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Operadores Unrios:
( + ) Sinal positivo;
( - ) Sinal negativo (mudana de sinal).

Operadores de Incremento e Decremento:
( ++ ) Incrementa a varivel em uma unidade;
( -- ) Decrementa a varivel em uma unidade.

ATENO: os operadores de incremento e decremento
podem ser usados antes da varivel (pr-incremento) ou
depois da varivel (ps-incremento).

Exemplo de Ps-Fixado:
int a = 4;
int b = a++; // b=4; a=5;
int c = a--; // c=5; a=4;

Exemplo de Pr-Fixado:
int a = 4;
int b = ++a; // a=5; b=5;
int c = --a; // a=4; c=4;

Operadores de Comparao (devolvem um valor lgico):
( > ) - Maior que;
( < ) - Menor que;
( == ) - Igual;
( != ) - Diferente;
( >= ) - Maior ou igual que;
( <= ) - Menor ou igual que.


35


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Operadores Lgicos:
( & ) - devolve true se ambos operandos forem
true, avaliando ambos.
( | ) - devolve true se um dos operandos for true,
avaliando ambos;
( ! ) - Negao;
( && ) - devolve true se ambos operandos forem
true;
( || ) - devolve true se algum dos operandos for
true.

3.6 Casting

Algumas vezes quando estamos programando existem
situaes que podem ocorrer perda de preciso (uma
expresso de tipo maior est sendo atribudo a uma varivel
de tipo menor). Nestes casos preciso realizar o que
chamado de casting explcito para que no ocorra erro de
compilao.

Exemplo:
long longValue = 99L;
int intValue2 = (int)longValue; // Ok!
int intValue1 = longValue; // ERRO!

Java tambm pode promover o tipo de uma expresso
automaticamente para um tipo maior. Quando isto ocorre
chamado de casting implcito. Veja o exemplo abaixo:



36

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo:
long longValue;
int intValue = 10;
longValue = intValue;

3.7 Vamos Treinar

a) Escreva um programa que imprima o resultado das
expresses abaixo:
3 2 1 + 2 + 1 + 3
2 + 6 3 / 7 x 9
2 x 3 4 x 5
3 % 4 8

b) Escreva um programa que declare, inicialize e imprima as
seguintes variveis:
Inteiro i de 32 bits com valor 1;
Inteiro j de 64 bits com valor 2;
Ponto-flutuante p de 32 bits com valor 20.0;
Ponto-flutuante q de 64 bits com valor 30.0;
Boolean b com valor verdadeiro;
Caracter c com valor k.




4. JAVA TEM STRINGS?


Neste captulo voc descobrir
onde foram parar as strings em
Java, j que elas no esto
listadas entre os tipos
primitivos vistos no captulo
anterior. Onde esto?

Java is Everywhere

38

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
No captulo anterior a gente viu os oito tipos primitivos de
Java, mas entre eles no foi visto nenhum que contemple as
cadeias de caracteres (as famosas strings). Ento ficou a
pergunta no ar: Java tem strings?

A resposta para esta pergunta sim! Claro que Java tem
strings, ela uma linguagem poderosa! Porm as strings em
Java so objetos e no tipos primitivos.

, voc leu direito e no erro de digitao... strings em Java
so objetos. Bem, voc vai ter que fazer um voto de f, j que
ainda no vimos nada sobre objetos. Prometo que antes do
final do treinamento voc j ser um verdadeiro SHINOBI!

Mas enquanto isto, vamos aprender a manipular strings em
Java (mesmo sem saber o que so objetos). Tenha calma, no
tenha pressa, ser um passo de cada vez (embora no
treinamento tenhamos algumas corridas).




4.1 Declarando Strings

Declarar strings em Java muito simples, como pode ser visto
a seguir:

String <varivel>;

As strings em Java so representadas por uma
cadeira de caracteres entre aspas duplas!
Exemplo: Engenharia de Software

39


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo:
String nome;
String curso = Treinamento NINJA;

possvel fazer concatenao de strings em Java utilizando o
operador mais ( + ).

Exemplo:
String nome = Marcos + Vinicius;
String data = 12 + /outubro;

A varivel nome receber MarcosVinicius. J a varivel
data receber o valor 12/outubro (ocorre casting
implcito).




4.2 Alguns mtodos teis...

Como as strings em Java so objetos, elas possuem algumas
aes especiais denominadas de mtodos. Os mais utilizados
esto descritos a seguir:

length(): retorna o tamanho de uma string;

Exemplo:
String disc = POO e Java";
System.out.print("tamanho="+disc.length());

As strings em Java possuem um toque mgico:
transformam tudo em strings quando a
concatenao utilizada!

40

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
charAt(n): retorna o caractere na posio n;

Exemplo:
System.out.println("disciplina:" + disc);
System.out.print("primeiro caractere: ");
System.out.println(disc.charAt(0)); //P
System.out.print("segundo caractere: ");
System.out.println(disc.charAt(1)); //O
System.out.print("ultimo caractere: ");
System.out.println(disc.charAt(disc.length()-
1));//a




4.3 Vamos Treinar

a) Escreva um programa que concatene as strings:
Tpicos, de , Linguagem e mostre-as na tela.

b) Escreva um programa que imprima as letras em
posies mpares da frase: Fortaleza Cidade do Sol.
CUIDADO: As strings em Java iniciam sempre
na posio de ndice igual a zero (0)!




5. EXIBINDO E LENDO
DADOS


Neste captulo veremos
como mostrar dados na
tela (console) e como ler
dados do teclado.

Java is Everywhere

42

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
5.1 Exibindo Dados

Em Java para escrever dados na sada padro (monitor), use:

System.out.print(dados); ou
System.out.println(dados);

Obs: o println salta a linha aps a impresso.

O comando acima pode ser usado tambm com variveis:

int x = 20;
System.out.println( x );

Podem-se concatenar Strings com variveis:

System.out.println( x = + x );
x = 20;

Escrevendo mais de um dado:

int x = 20;
int y = 30;
System.out.print( x= + x + e y= + y );

Sada:
x=20 e y=30

Escrevendo mais de um dado de outra maneira (printf):

Use System.out.printf com o % e o tipo do dado a ser
impresso.

43


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
%d decimal inteiro
%tamanho.precisao f ponto-flutuante
%s String
%c caractere
%b booleano

Exemplo com printf:
int i = 10;
String s = "formatacao"
double d = 123.456;
char c = 'a';
boolean b = true;
double d2 = 789;
System.out.printf( "dados: %d - %s - %7.3f -
%c - %b \n", i, s, d, c, b );

Sada:
dados: 10 - formatacao - 123,456 - a true

5.2 Lendo Dados

Para ler dados da entrada padro, faa como descrito abaixo:

import java.util.*;
public class Leitura {
public static void main(String args[ ]) {
// crie a varivel de leitura dos dados
Scanner s = new Scanner ( System.in );
// use os mtodos de leitura tipo desejado
System.out.print( "digite uma linha: " );
// l a linha
String linha = s.nextLine();
System.out.print( "digite um numero: " );

44

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
// l um inteiro
int i = s.nextInt() ;
System.out.print( "digite um numero: " );
// l um pontoflutuante
double d = s.nextDouble();

5.3 Vamor treinar

a) Implementar um programa para calcular a rea de um
trapzio, onde: h = altura, b = base menor, bMaior =
base maior area = (h * (b + bMaior)) / 2. Voc deve
ler do teclado os valores da altura e das duas bases e
imprimir a rea calculada.

b) Escreva um programa que leia duas strings do teclado
e compare se so iguais, imprimindo verdadeiro em
caso de igualdade e falso caso contrrio.

c) Escreva um programa que leia uma frase do teclado e
imprima:

Seu tamanho
O primeiro e o ltimo caractere
A palavra que comea na posio 3 e termina na
posio 9, inclusive.



6. ESTRUTURAS DE
CONTROLE






Neste captulo veremos que o destino de um programa em
execuo em Java no precisa ser uma linha reta...
podemos adicionar curvas, retornos, desvios, etc.
Java is Everywhere

46

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
6.1 Fluxo de Dados

Tudo o que fizemos at agora em Java foram
sequncias de comandos, onde o fluxo de
execuo seguia sempre de forma
contnua, ou seja, do incio ao fim,
executando todos os comandos
na ordem que foram inseridos.

Ser que trabalhando desta
forma conseguimos elaborar qualquer programa?

No preciso muito tempo para perceber que uma sequncia
nica no fluxo de execuo, sem a utilizao de outros
caminhos, tornaria impossvel a construo de programas
mais completos e complexos. Ento vamos estudar as
poderosas estruturas de controle de Java!

6.2 Estruturas Condicionais

A estrutura de controle condicional a
estrutura mais simples existente. Ela
utilizada quando preciso decidir qual
caminho o fluxo de execuo deve seguir,
de acordo com a anlise de uma condio.

A estrutura condicional sempre possui:
um teste, com uma expresso lgica;
uma ao, que realizada quando o resultado do teste
verdadeiro.
47


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
E tambm pode ter:
uma ao alternativa, que realizada quando o
resultado do teste falso.

Sintaxe do Condicional if:

if ( < condio > ){
< aes >;
}

Representao em Diagrama UML:








Exemplo:
public class Nota {
public static void main(String[] args) {
float nota;
Scanner sc = new Scanner(System.in);
nota = sc.nextFloat();
if (nota >= 8) {
System.out.println("Parabens!");
} } }


48

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Sintaxe do Condicional if - else:

if ( < condio > ){
< aes >;
} else {
< outras aes >
}

Representao em Diagrama UML:


Exemplo:
public class NotasMelhorado {
public static void main(String[] args) {
float nota;
Scanner sc = new Scanner(System.in);
nota = sc.nextFloat();
if (nota >= 8) {
System.out.println("Parabns!");
} else {
System.out.println(Voc chega l!);
}
}
}

49


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Tambm existe outra estrutura condicional bastante
interessante que permite a seleo da ao de acordo com
diversas opes. Veja a seguir:

Sintaxe da Seleo switch:

switch ( <expresso integral> ) {
case <label1>: <aes1>
case <label2>: <aes2>
...
default: <aes default>
}

Representao em Diagrama UML:







Exemplo:
switch ( valor ) {
case 2:
System.out.print((2));
case 1:
System.out.print((1));
default:
System.out.print((default));
case 3:
System.out.print((3) );
}

50

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java




E se voc no quiser que todo o fluxo continue a executar
todos os cases abaixo at o final? O que fazer? Apelar pro
CRTL+ALT+DEL? Claro que no! Existe algo bem mais elegante:
break. Veja o exemplo abaixo:

switch ( valor ) {
case 2:
System.out.print((2));
break;
case 1:
System.out.print((1));
break;
default:
System.out.print((default));
break;
case 3:
System.out.print((3) );
}

Representao em Diagrama UML:






importante observar que a partir do momento
que uma opo case foi encontrada o fluxo
segue at o final executando tudo!

51


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
6.3 Vamos Treinar

a) Implemente um programa que receba
um nmero de 1 a 7 e imprima o dia da
semana correspondente. Ateno:
utilize if-else.

b) Implemente um programa que receba
um nmero de 1 a 12 e imprima o ms
correspondente. Quando o nmero
estiver fora do intervalo permitido, a
mensagem ms invlido dever ser
exibida. Ateno: utilize switch.

6.4 Estruturas de Repetio

As estruturas de controle de iterao fazem
com que determinadas aes sejam
repetidas at que uma determinada
condio seja satisfeita.

Em Java temos:

while
do...while
for


52

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Sintaxe while: neste tipo de estrutura a condio de
iterao avaliada antes da execuo do bloco do lao.

while ( <condio> ) {
<bloco do lao>
}

Representao em Diagrama UML:









Exemplo:
int x = 0;
while ( x < 10){
System.out.println(x);
x++;
}

Sintaxe do..while: neste tipo de estrutura a condio de
iterao avaliada depois da primeira execuo do bloco do
lao.

do {
<bloco do lao>
} while ( <condio> );


53


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Representao em Diagrama UML:








Exemplo:
int x = 0;
do {
System.out.println(x);
x++;
} while ( x == 0);


Sintaxe for: em Java o for um lao que em sua estrutura
contm todos os parmetros necessrios para a repetio:
inicializao, condio de repetio e incremento ou
decremento.

for(<inic>;<condies>;<inc/dec>){
<bloco do lao>
}

Representao em Diagrama UML:






Quando
54

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
trabalhamos com estruturas de repetio tambm podemos
fazer uso de alguns comandos especiais de transferncia. Em
Java temos trs estruturas de transferncia:

break,
continue
return


break: pode ser usado em blocos com rtulos, laos de
repetio e no switch, para transferir o fluxo para fora do
contexto corrente, ou seja, para o bloco mais externo.

Exemplo 1:
for ( i=0; i<5 ; i++) {
if ( i == 3 ) {
break;
}
System.out.println( "i = " + i );
}

Exemplo 2:
for ( i=0; i<4 ; i++) {
if ( i == 2 )
break;
for ( j=0; j<4; j++) {
if ( j == 2 )
break;
System.out.println( "j = " + j );
}
System.out.println( "i = " + i );
}

55


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
continue: Pode ser usado em laos de repetio for, while, e
do-while, para interromper prematuramente o fluxo,
avanando para a prxima iterao.

Exemplo:
for ( i=0; i<5 ; i++) {
if ( i == 3 ) {
continue;
}
System.out.println( "i = " + i );
}

return: usado para parar a execuo do mtodo corrente e
transferir o controle para o mtodo que o chamou.

Exemplo 1:
private void calc() {
for ( i=0; i<5 ; i++) {
if ( i == 3 )
return;
} }
...
calc ();

Exemplo 2:
private int somar(int a, int b){
int s = 0;
s = a + b;
return s;
}
...
int x = somar( 3, 4 );

56

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
6.5 Vamos pensar um pouco...

O que ser impresso na execuo dos trechos abaixo:

a) for(int i = 2; i < 5; i++) {
switch ( i ) {
case 2 : continue;
case 3 : break;
default : break;
}
System.out.printf("i = %d\n", i);
}

b) for(int i = 2; i < 5; i++) {
for(int j = 5; j > 2; j--) {
if(j > i) continue;
if(j < i) break;
System.out.printf("i=%d j=%d\n",i,j);
}
}

6.6 Vamos treinar

a) Escreva um lao while que execute 20 vezes,
imprimindo o valor da varivel x que inicialmente est
com valor 10. Em seguida faa este mesmo lao s que
agora para um do-while.

b) Escreva um programa que imprima na tela a soma dos
nmeros mpares entre 1 e 30 e a multiplicao dos
nmeros pares entre 1 e 30.
57


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
c) Escreva um programa que percorra dois laos de 0 a
10, um interno ao outro, imprimindo os contadores, e
quando estes forem iguais, o programa deve passar
prxima interao do lao mais externo, caso
contrrio, deve imprimir os valores dos contadores dos
dois laos.



7. ARRAYS... ISTO
MORDE?











Neste captulo
aprenderemos como
manipular poderosas
estruturas atravs dos
Arrays.
Java is Everywhere

59


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Imaginemos que queiramos trabalhar com as notas dos
alunos. Supondo que cada aluno deva ter cinco notas,
podemos criar cinco variveis do tipo int para armazenar as
notas de um nico aluno.

int n1, n2, n3, n4, n5;













Problemas:

mais complicado trabalhar com um nmero
grande de variveis;

Passar as notas para um mtodo exige a utilizao
de muitos parmetros;

A soluo: utilizao de arrays.

60

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
7.1 Arrays

Definio de Array: Um array estrutura de dados que define
uma coleo ordenada de um nmero fixo de elementos de
dados homogneos (mesmo tipo).

Em Java, arrays so objetos, portanto, precisamos cri-los
antes de comearmos a us-los.

importante novamente dizer que no preciso arrancar os
cabelos ou cortar os pulsos com essa histria de objetos... jaj
veremos o que so, como utiliz-los, como cria-los, entre
outros. Espere s um pouco mais.

Sintaxe para declarao de arrays:

1)tipo[] nomeDoArray; 2)tipo nomeDoArray[];

Onde: tipo pode ser um tipo primitivo (int, char, ...), classe ou
interface.

Sintaxe para criao de arrays:

nomeDoArray = new tipo[ tamanho ];

IMPORTANTE: o tamanho do array no fornecido na
declarao, somente na criao.

Exemplos:
Para declarar um array de notas, fazemos:
int notas[]; ou int[] notas;

61


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
CUIDADO: Em Java, uma vez criado um array, seu
tamanho nunca muda!

Para criar o array de notas , fazemos:
notas = new int[5];

Tambm podemos fazer os dois passos de uma vez s:
int notas[] = new int[5];






Quando o array criado, todos os elementos so inicializados
para o valor default do tipo de dado:

int a[] = new int[10]; // 10 int com valor 0
boolean b[] = new boolean[5]; // 5 false

Para saber o tamanho do array, usa-se o atributo length:

// retorna o tamanho do array notas
notas.length;

Para acessar um elemento do array, fazemos:

nomeDoArray[ ndice ];

Exemplos:
notas[0] = 10;
notas[ notas.length-1 ] = 8;
System.out.println(1a nota=+notas[0] );
System.out.println(ltima
nota=+notas[notas.length-1]);


62

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Podemos inicializar o array j na declarao fazendo:
// j cria o array com o tamanho equivalente a
// quantidade de valores
tipo[] nomeDoArray = {valor1,valor2,...};

Exemplos:
int notas [] = {10, 4, 5, 6, 8 };
String[] monitores={ Marcos, Osvaldo,
Renata };

7.2 Manipulando Arrays

Podem-se usar os elementos do array separadamente:

for (int i = 0; i < notas.length; i++ ) {
System.out.println( nota= + notas[ i ];
}

Ou o array todo: atribuio e passagem de parmetro:

calcularMedia ( notas );
int [] novasNotas = notas;

ATENO: Se houver uma tentativa de acesso indevido aos
ndices do array, uma exceo ser gerada:

ArrayIndexOutOfBoundsException

7.3 Arrays Multidimensionais

Arrays podem ter uma ou mltiplas dimenses (arrays de
arrays). Por exemplo, sendo e um array de duas dimenses
63


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
com dois elementos na primeira e quatro na segunda (2x4), a
implementao desse array em Java utilizar trs objetos
array, conforme o esquema abaixo:



Podemos definir arrays multidimensionais conforme a sintaxe:

tipo [][][][] nomeDoArray;

ou

tipo nomeDoArray [][][][] ;


Exemplos:
int[][] mXnArray;
// equivalente a int[] mXnArray[];

int [][] umArray;
// Array de duas dimenses

umArray = new int[4][5];
// Criando array 4x5 de inteiros

int [][] outroArray = new int[4][5];
// combinando declarao e criao

64

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Inicializando Arrays Multidimensionais:

double taxas[][] = { { 1,2,3 }, {4,5,6} };

Para acessar um elemento do array bidimensional, fazemos:

nomeDoArray
[indice1][indice2][indice3]...[indiceN]

Exemplos:
int [][] arr = new int [3][4];
arr[1][2] = 5;
arr[2][3] = 7;
System.out.println ( a[1][2] );
System.out.println ( a[2][3] );

Num array multidimensional, para saber o tamanho da
primeira dimenso, usa-se o atributo length:

int [][] meuArray = new int [4][5];

meuArray.length retorna o tamanho da primeira
dimenso = 4

Para varrer um array bidimensional, precisamos utilizar dois
fors:

int arr[][] = new int[4][5];
for (int i = 0; i < arr.length; i++ )
for (int j = 0; j < arr[i].length; j++ )
System.out.println( arr[i][j] );

IMPORTANTE: na criao de arrays multidimensionais com o
operador new, a profundidade dos arrays mais internos pode
65


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
ser omitida:

double matrix[][] = new double[3][];

A inicializao poderia ser assim:

for (int i = 0; i < matrix.length; ++i)
matrix[ i ] = new double[ i+1 ];

A representao da memria, nesse caso, seria:


7.4 Vamos treinar?

a) Escreva um programa com um lao while que
inicializa um vetor de 50 inteiros com os valores de 50
a 99.

b) Escreva um programa que cria uma matriz
bidimensional de 20 x 10 elementos booleanos,
inicializando as linhas pares com true e as linhas
mpares com false. Depois, imprima na tela todos os
elementos da matriz.


66

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
c) Escreva um programa que receba via teclado trs
palavras e armazene-as num array de Strings. Depois,
imprima o array.

d) Escreva um programa que declara, inicializa e depois
mostra na tela os seguintes arrays:
Um array contendo os nomes dos dias da semana;
Outro array bidimensinal contendo: em uma linha
os meses (1, 2, ...) e em outra linha a quantidade de
dias de cada ms do ano

e) Escreva um programa que cria um array de duas
dimenses, sendo a primeira dimenso de tamanho 3,
e a segunda com tamanhos diferentes (2, 3 e 4),
inicializando os elementos de cada linha com o ndice
da linha, por exemplo, os elementos da linha 0
recebem 0, os da linha 1 recebem 1...

f) Escreva um programa que cria uma matriz de duas
dimenses 2x3 e calcula a soma dos elementos cujos
ndices so pares.




8. CONCEITOS INICIAIS
DE ORIENTAO A
OBJETOS














Neste captulo vamos
finalmente conhecer os
conceitos base para
Programao Orientada
a Objetos!
Java is Everywhere

68

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
8.1 Introduo

Hoje vivemos em uma
poca que somos
completamente
dependentes do uso dos
computadores, e para que
eles faam o que
desejamos preciso
program-los. O detalhe
interessante que um
computador fala a lngua
dos dgitos binrios, ou
seja, zeros e uns (0 1).
Imagine o trabalho que daria programar um sistema de uma
instituio financeira somente utilizando binrios... bem
melhor nem imaginar, s de pensar o corao di.

Para garantir a sanidade mental de programadores,
comearam a serem desenvolvidas as linguagens de
montagem. Elas substituam as funes do cdigo de mquina
por mnemnicos, endereos de memria absolutos por
identificadores. A linguagem de montagem, embora seja da
segunda gerao, ainda considerada de baixo nvel
(Assembly).

Com o passar do tempo surgiram as linguagens procedurais
(alto nvel). Elas utilizam uma sintaxe bastante parecida com a
lngua humana (ingls em sua grande maioria), e esto
focadas nos procedimentos ou funes.

69


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Embora as diversas linguagens desta 3 gerao difiram na
sintaxe e recursos, elas tm em comum a existncia de
compilador ou interpretador (Cobol, Fortran, Pascal, Turbo
Basic, etc).

Na programao procedural ou estruturada utilizada tcnica
da decomposio funcional (dividir um problema complexo
em subproblemas).

As grandes complicaes da programao estruturada que
no temos uma ligao entre as aes (procedimentos e
funes) e os dados.

8.2 Paradigma da Orientao a Objetos

Ainda na dcada de 60, Alan Kay, um dos pais do paradigma
da orientao a objetos, formulou a chamada analogia
biolgica: como seria um sistema de software que
funcionasse como um ser vivo?". Este paradigma
praticamente suplantou o paradigma anterior.





No nosso corpo temos milhes de clulas. Cada clula possui
uma funo especfica (de acordo com o tecido) e interage
com outras clulas por meio de trocas de mensagens. Kay
pensou como poderia construir agentes autnomos que
Um paradigma uma forma de abordar um problema.
Em software, um paradigma tem a ver com a
forma pela qual esse sistema
entendido e construdo.
70

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
interagissem entre si.

Com base nesta analogia, Alan Kay definiu os fundamentos da
Orientao a Objetos:

1. Qualquer coisa um objeto;

2. Objetos realizam tarefas atravs da requisio de
servios a outros objetos;

3. Cada objeto pertence a uma determinada classe. Uma
classe agrupa objetos similares;

4. A classe um repositrio para comportamento
associado ao objeto;

5. Classes so organizadas em hierarquias.


8.3 Caractersticas da Orientao a
Objetos

Hierarquizao:
aps dividir um computador em gabinete, vdeo e
teclado, possvel subdividir o gabinete em
memrias RAM, ROM, disco, processador, etc.

possvel fazer o mesmo com sistemas aplicativos,
hierarquizando-os via diviso em subsistemas.

71


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Classificao:
enquadramento dos objetos em categorias
(classes), conforme suas caractersticas e suas
funes.

mamfero que mia gato, que late cachorro.

uma bicicleta e um automvel so meios de
transporte, tendo em vista sua funcionalidade.

Encapsulamento:
Consiste em separar os aspectos externos de um
objeto, que so acessveis para outros objetos, dos
detalhes internos de implementao do objeto
[Rumbaugh];

forma de esconder detalhes de armazenamento
dos dados e implementao de operaes,
protegendo-os contra acesso indevido;

possibilita o uso de algo sem que se conhea como
foi construdo ou implementado;

usa-se carro com injeo eletrnica sem necessitar
saber detalhes de implementao da mesma.

8.4 Objetos e Classes

Objeto: um objeto uma entidade que possui um
estado e um conjunto definido de operaes definidas
72

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
para funcionar nesse estado. O estado representado
como um conjunto de atributos de objeto. As
operaes associadas ao objeto fornecem servios a
outros objetos (clientes) que solicitam esses servios
quando alguma computao necessria.

Classe: os objetos so criados de acordo com uma
definio de classe de objeto. Uma definio de classe
de objeto funciona tanto como uma especificao
quanto como um modelo (template) para criao de
objetos. Essa definio inclui declaraes de todos os
atributos e operaes que devem ser associados a um
objeto dessa classe.











Imagine o projeto de um carro com a classe e cada
unidade produzida como os objetos desta classe.

Os objetos se comunicam por meio da solicitao de servios
de outros objetos e, se necessrio, por meio da troca de
informaes para o fornecimento do servio.

73


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
As cpias das informaes necessrias para executar o servio
e os resultados da execuo do servio so passados como
parmetros.

Fique ligado:

Os dados e os mtodos de cada objeto esto definidos na
classe. como se a classe servisse de molde para a
formao dos seus objetos.

A classe dita as propriedades e comportamento que seus
objetos devem ter.

Jogo Rpido: Classe vs Objetos

Com base na planta de uma casa, diversas casas podem ser
construdas:

Cada casa construda ter seu endereo, sua cor, seu
proprietrio, ... Propriedades;

A planta representa a Classe;

As casas representam os Objetos.

OBSERVAO: quando partimos de uma classe para o objeto
desta classe falamos de instanciao; e quando partimos de
um objeto para sua classe de origem falamos de classificao.

74

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
8.5 Os Quatro Pilares da OO



Abstrao pode ser entendida, de forma simples, como uma
tcnica para lidar com a complexidade no desenvolvimento de
software. Com ela a gente identifica, em cada instante, o que
essencial, deixando detalhes secundrios para depois.




Refinamento sucessivo de um problema
uma forma de abstrao.
75


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Herana, segundo Rumbaugh o
compartilhamento de atributos e operaes
entre as classes baseado em uma relao
hierrquica. J Yourdon afirma que
qualquer mecanismo que permite a um objeto
incorporar toda ou parte da definio de outro
objeto como parte de sua prpria definio.

Quando um casal constitui famlia e nasce um
filho, este levar caractersticas genticas dos pais, ou seja, ele
receber uma herana gentica.

Comparativamente, uma subclasse (filha) herda de sua
superclasse (pai) tanto os atributos (propriedades) quanto as
operaes (mtodos). Assim como um filho possui
caractersticas prprias, uma subclasse tambm pode ter
atributos e operaes prprias, alm dos que herda da classe
me.

Na Orientao a Objetos podemos encontrar dois tipos de
herana: simples (uma nica superclasse) ou mltipla (vrias
superclasses). Java s possui herana simples!

IMPORTANTE:

Uma operao em uma subclasse pode
redefinir/sobrescrever (override) a operao de
mesmo nome em uma classe ascendente
(extensibilidade).

Objetos da subclasse comportam-se como objetos da
superclasse.
76

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Uma instncia de uma subclasse uma instncia de
todas as suas superclasses.

Abaixo possvel observar um exemplo de herana, onde
Conta Poupana herda tudo de Conta, alm de possuir
atributos e mtodos prprios:

Quando se fala de herana, sempre surge os conceitos de
Generalizao e Especializao.

Generalizao: formao de superclasses a partir de
outras classes; sempre possvel utilizar: ... um...,
... do tipo..., ... um subconjunto de...

Especializao: identificao de subclasses a partir de
uma classe de objetos; cada subclasse tem
caractersticas adicionais.


77


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Veja a seguir um exemplo contendo Generalizao e
Especializao:

Encapsulamento: qualquer mecanismo que nos permita
esconder a implementao do objeto fazendo com que
outros componentes os sistema no tenham conhecimento
do contedo interno dos dados armazenados do objeto
[Yourdon].

Ele protege os dados de um objeto contra o acesso direto de
outros objetos. O acesso aos dados feito somente pelos
mtodos.




Entenda que as operaes formam uma camada protetora em
torno do ncleo que contm os dados. Os dados s podem ser
acessados somente pela classe. Quando se fala encapsular
significa fazer os atributos tornarem-se privados.
O objeto que envia uma mensagem ao outro NO
conhece a estrutura interna do receptor.
78

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java



Acima na figura temos um objeto com seus mtodos e
atributos (pblicos ou privados). Os mtodos e atributos
privados ficam no ncleo, esto encapsulados, e somente
podem ser acessados pela prpria classe; j os mtodos e
atributos pblicos podem ser acessados por qualquer objeto
do universo!

Polimorfismo: a capacidade de tratar uniformemente uma
coleo de objetos, enviando-lhes a mesma mensagem e
verificando diferentes reaes. Veja o exemplo abaixo:
79


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Propriedade pela qual um mesmo mtodo possui
comportamento diferente do objeto no qual foi executado. O
mesmo mtodo Produzir Som vai disparar um som diferente
de acordo com o animal (objeto) selecionado.

Outros exemplos de polimorfismo:

Calcular rea (retngulo, tringulo, crculo);

Sacar dinheiro de conta (poupana, corrente, especial).

8.6 Jogo Rpido...

Com base na figura abaixo veja se possvel construir uma
hierarquia de classes:




9. CLASSES E OBJETOS
EM JAVA




















Objetos droids:
atacar!
Neste captulo vamos
definir classes em Java e
criar objetos destas
classes. Tambm
aprenderemos sobre
atributos e mtodos.
Que a fora esteja com
voc!
Java is Everywhere

81


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
9.1 Flash back...

O paradigma de orientao a objetos consiste basicamente
em organizar o software como uma coleo de objetos que
incorporam a estrutura de dados e o comportamento, e
trocam mensagens entre si.

O foco do sistema voltado aos dados (objetos), no s
funes, j que o comportamento muda mais que a estrutura
de dados.




Veja abaixo a comparao entre a forma de pensar Orientada
a Objetos (focada nos dados) com a Estruturada ou Procedural
(focada nas funes):



Objetos: um objeto qualquer coisa, real ou abstrata, na
qual ns armazenamos dados e as operaes que manipulam
os dados [Martin].
Uma das grandes vantagens da OO que as
abstraes so mais prximas do mundo real.
82

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Um objeto, ou uma instncia, uma abstrao de alguma
coisa no domnio do problema, refletindo as capacidades do
sistema de manter informaes sobre ele, interagir com ele, ou
ambos, um encapsulamento de valores de atributos e seus
servios exclusivo [Yourdon].

Um objeto uma entidade independente (lembra das
clulas?), composta por:

Estado Interno: uma memria interna em que valores
podem ser armazenados e modificados ao longo da
vida do objeto (conjunto de atributos ou variveis de
instncia).

Comportamento: conjunto de aes predefinidas
(denominadas mtodos) atravs das quais o objeto
responder a demanda de processamento por parte de
outros objetos.

FIQUE LIGADO...

Procedimentos e Funes so
representados em Java por mtodos. A
diferena est no tipo de retorno. Se o tipo
de retorno for nulo, indicado pela palavra
void, o mtodo representa um
procedimento. Caso contrrio, ou seja, se
existe um tipo de retorno, o mtodo
representa uma funo.

83


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
9.2 Definindo classes em Java

Suponha que precisemos trabalhar com um tipo de dados
diferente dos tipos de dados primitivos j existentes em Java,
data, por exemplo. (na API Java encontramos tipos para datas,
mas vamos fazer de contas que eles no existem e precisamos
criar o nosso... voc nunca brincou de faz de contas no?)

Mas antes de trabalharmos com variveis do tipo Data,
precisamos primeiro definir esse novo tipo de dados,
conhecido como Tipo Agredado de Dados.

Vamos criar o novo Tipo Agregado de Dados com os seguintes
campos: dia, mes e ano. Veja abaixo:

public class Data {
int dia;
int mes;
int ano;
}




Agora que a nossa classe Data foi criada, podemos utiliz-la
em nossos programas. Veja o cdigo a seguir:




Tipo Agregado de Dados um tipo de dados
definido pelo programador.
84

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
public class TesteData{
public static void main(String[] args){
Data hoje;
}
}

Ento para declarar uma varivel com o tipo recm criado
basta escrever:
Tipo nomeVarivel;
Data hoje;

ATENO: tipos primitivos em Java alocam (gastam) espao
na memria quando so declarados. Por outro lado, objetos
NO alocam espao em memria quando so declarados.




Aps declarada a varivel, a mesma no referencia nenhum
lugar. Nesse caso, diz-se que ela tem referncia nula
(representado pela palavra reservada null). preciso,
portanto, criar um objeto para que ela tenha algo
referenciado!

9.3 Criando Objetos

Em Java para criarmos um novo objeto fazemos uso do
operador new. Veja a seguir:


Variveis declaradas do tipo agregado NO contm
o dado e sim uma referncia para o dado.
85


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
...
Data hoje;
hoje = new Data();
...

O operador new realmente cria o objeto e depois disso, a
memria est alocada e diz-se que o objeto foi criado.

Criar um objeto Instanciar um objeto

IMPORTANTE: A varivel hoje chamada varivel de
referncia, pois referencia o objeto. Ela NO o objeto em si.

J as propriedades de um objeto so chamadas de variveis de
instncia, pois cada instncia tem seus prprios valores para
suas variveis de instncia.

9.4 Acessando variveis de instncia

Para acessarmos as variveis de instncia do objeto
precisamos fazer uso do operador . (ponto). Veja a
alterao abaixo do nosso programa (classe) que testa o tipo
Data:

public class TesteData{
public static void main(String[] args){
Data hoje;
hoje = new Data();
hoje.dia = 12;
hoje.mes = 10;
hoje.ano = 2011;
}}
86

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Somente aps o objeto ter sido criado na memria que foi
possvel colocar valores para as suas variveis de instncia dia,
ms e ano. Antes no seria possvel, pois a referncia na
varivel hoje estava nula (null).

9.5 Mtodos dos Objetos

Vimos que os objetos podem ter propriedades (dia, ms e
ano). Mas eles tambm podem ter aes, aos quais chamamos
de mtodos. Veja abaixo a melhoria da classe Data com a
incluso de um mtodo:

public class Data {
int dia;
int mes;
int ano;

void exibir() {
System.out.print(dia+/+mes+/+ano);
}}

Sintaxe de Mtodos em Java:

public tipoDeRetorno nomeDoMtodo(tipo1 parmetro1,
tipo2 parmetro2, ...) {

// aqui colocado o corpo do mtodo

}

O tipo de retorno pode ser:
qualquer tipo primitivo (int, long, float, ...);
qualquer classe (String, );
87


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
void, para o caso de no retornar nada (lembrando
procedimento da estruturada).

Abaixo se pode observar um exemplo de passagem de
parmetros:

public class DeclaracaoDeMetodos {

// declarando um mtodo (como funo)
public int soma ( int a, int b ){
int s = a + b;
return s;
}

// declarando um mtodo (como procedimento)
public void imprimir ( int a ) {
System.out.println ( a );
}
}

Na classe DeclaracaoDeMetodos temos dois mtodos.
No primeiro mtodo, chamado soma, temos como retorno
um nmero inteiro, resultado da soma de dois valores que
sero passados como argumentos para os parmetros. J no
segundo mtodo, de nome imprimir, no existe nenhum
retorno, apenas a impresso do argumento que ser passado
para o parmetro.







Parmetros...
Argumentos... qual a
diferena entre eles???
88

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Veja abaixo um exemplo de como um determinado mtodo
que foi declarado chamado:

// executando o mtodo
int x = 10;
int z = soma ( x , 20 );


// declarando o mtodo
public int soma ( int a, int b )
{
int s = a + b;
return s;
}

A varivel x e o valor 20 so argumentos que so passados
para os parmetros do mtodo soma.
















OBSERVAES IMPORTANTES PARA TIPOS PRIMITIVOS

O nmero de parmetros passados deve ser igual
ao da definio;
Cada argumento individualmente deve ter tipo
compatvel ao da definio (parmetro);
Para tipos primitivos, a passagem por valor, ou
seja, o valor (e no o endereo) da varivel
passado;
Cada chamada a um mtodo cria suas prprias
instncias dos parmetros formais;
Uma expresso pode ser usada como argumento.
89


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Abaixo mais um exemplo de passagem de parmetros:

public class PassagemPorValor {
public static void incrementar (int x){
x = x + 1;
System.out.println(dentro: x= + x);
}

public static void main (String [] args){
int y = 1;
System.out.println(antes: y= + y);
incrementar (y);
System.out.println(depois: y= + y);
}
}

Em Java, todos os argumentos so passados
por valor, isto significa que o valor (e no
o endereo) da varivel passado.
Assim, as modificaes no
parmetro formal (dentro do
mtodo) no afetam o parmetro real
(valor externo).



Passagem de Parmetros para Objetos: como foi visto, a
passagem de parmetros de tipos primitivos em Java feita
por valor, ou seja, uma cpia do valor original feita:
modificaes no parmetro formal no so refletidas no
parmetro real. J para objetos, uma cpia da referncia para
o objeto passada e no uma cpia do objeto. Analise o
exemplo a seguir:

90

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
public static void somar(int[] x) {
x[2] = x[1] + x[0];
}

public static void main(String args[]){
int[] a = new int[3];
a[0] = 1;
a[1] = 10;
a[2] = 20;
System.out.println(antes >+ a[2]);
somar(a);
System.out.println(depois >+ a[2]);
}

Analisando o que aconteceu graficamente:




Passando Parmetros para o Programa: parmetros tambm
podem ser passados para o programa. Eles so acessveis no
mtodo main() como um array de String.


91


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
public class Classe {
public static void main(String args[]) {
for (int i=0; i<args.length; i++) {
System.out.println(i+=+args[i]);
}
}
}

9.6 A Referncia this

Muitas vezes, principalmente quando estamos trabalhando
com parmetros dos mtodos, precisamos utilizar uma forma
de diferenciar o nome de um parmetro de um nome de uma
varivel de instncia.

Imagine que a classe abaixo fosse criada:

public class Animal{
String nome;
public void setNome(String nome){
nome = nome;
}

Na linha em negrito se pode perceber que o compilador Java
vai ficar confuso (assim como a gente ficaria): o parmetro
nome vai receber o prprio valor? Ou o parmetro nome vai
receber a varivel de instncia nome? Ou ainda, a varivel de
instncia nome vai recebe o parmetro nome? Ou mais ainda,
a varivel de instncia nome vai receber a prpria varivel de
instncia. Ufa! Realmente um grande problema a se
resolver!
Java utiliza a referncia this para resolver o problema
92

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
descrito anteriormente de forma bastante simples e elegante.

O identificador this denotar o objeto no qual o mtodo
chamado. Ele sempre representa o objeto corrente! Veja
abaixo quando devemos fazer uso desta referncia:

1) diferenciar nomes de parmetros e variveis de
instncia:

String nome;
public Estudante(String nome){
this.nome = nome;
}

2) pode ser usada para ativar mtodos como uma
referncia comum:

atribuirNota(int numProva){
this.atribuirNota(numProva, 0.0);
}

3) pode ser passada como parmetro ou atribuda a outra
varivel do mesmo tipo:

processar(this);
Estudante estudanteCorrente=this;






this s pode ser usada na classe de definio!
93


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
9.7 Acessibilidade Pblica e Privada

O estado interno dos objetos deve ser mantido sempre
consistente. Por exemplo, no gostaramos de ver em um
programa o valor de uma data com o dia 30 de fevereiro
(estado inconsistente).

As variveis de instncia so as responsveis pelo estado
interno dos objetos. E o acesso direto a estas variveis atravs
de outras classes pode comprometer o estado interno dos
objetos (situaes inconsistentes).

Ento NO recomendvel tambm deixar que as classes
clientes sejam responsveis pelas validaes das variveis de
instncias de nossas classes. Quem tem que saber se uma
data, por exemplo, est correta a classe especializada em
datas!

Exemplo:








Para evitar que situaes como essa ocorram, uma boa prtica
impedir acesso direto s variveis de instncia dos objetos.
Em Java isto alcanado declarando todas as variveis de
instncia com o modificador de acesso private, isto , a
94

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
varivel de instncia passa a ser visvel (ou acessvel) somente
dentro da prpria classe onde definida.

public class Data {
private int dia;
private int mes;
private int ano;
...

Dessa forma, um acesso como mostrado a seguir vai acusar
erro de compilao, impedindo que ocorra o acesso direto s
variveis de instncia.

public class Cliente
{
public static void main(String args[])
{
Data hoje = new Data();
hoje.mes = 15; // Erro de compilao!
...

Mas e agora como fazemos para atribuir valores s variveis
dia, mes e ano da classe Data, se no temos acesso fora
dela?

Simples, basta criarmos mtodos pblicos para fazer isso!

Um mtodo pblico declarado com o modificador de acesso
public e torna o membro visvel a partir de qualquer outra
classe da galxia ou at outros universos.

Em Java existem algumas convenes que padronizam os
nomes dos mtodos de acesso s variveis de instncia. Eles
so chamados de mtodos get e set:
95


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Mtodos de alterao do valor set

Mtodos de obteno do valor get

Por conveno o nome do mtodo formado utilizando-se a
palavra get ou set seguido do nome da varivel de instncia:

setNomeDaVariavel
getNomeDaVariavel

Exemplo:
setMes: para atrituir valor varivel de instncia mes
getMes: para obter o valor da varivel instncia mes




9.8 Mtodos Construtores

Construtores so mtodos especiais que so chamados no
momento da criao de um objeto. Eles servem para inicializar
objetos de forma organizada, ou seja, servem para setar o
estado inicial de um objeto quando ele criado.

Pode haver mais de um construtor por classe: overloading
(veremos isto no prximo tpico... segura a curiosidade s
mais um pouco!).


O modificador de acesso private vai permitir
fazer uso do encapsulamento!
96

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Mtodos Construtores possuem algumas restries:

Devem ter o mesmo nome da classe;

No possuem valor de retorno;

Podem ter modificadores de acessibilidade (public, ...);

So chamados somente quando o operador new
executado.


Exemplo:
public class Data {
int dia;
int mes;
int ano;

public Data() {
ano = 2010; }
... }

Utilizando
public class Programa {
public static void main(String args[]){
// construtor default sem parmetros
Data hoje = new Data();
...
9.9 Sobrecarga de Mtodos

Em Java mtodos podem ter o mesmo nome e diferentes
listas de parmetros. Este mecanismo o que chamamos de
sobrecarga de mtodos ou overloading. Ele serve para
97


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
implementarmos uma das facetas do polimorfismo. Veja o
exemplo abaixo:

public class Data {
int dia;
int mes;
int ano;

void exibir() { ... }
int diasDoAno() { ... }

void incrementarAno() {
ano++; }

void incrementarAno( int anos ) {
ano += anos;
} }

Regra para Sobrecarga: mtodos sobrecarregados NO
podem ter a mesma assinatura e os parmetros devem diferir
em tipo, ordem ou nmero.

OBSERVAO: Mtodos Construtores tambm podem ser
sobrecarregados. Veja o cdigo a seguir:

public class Data {
...
public Data() {
ano = 2004; }

public Data( int numAnos ) {
ano = numAnos; }
...
}


98

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Utilizando
public class Programa {
public static void main (String args []) {
Data hoje = new Data();
Data depois = new Data( 2005 );
...

9.10 Membros Estticos

Tanto variveis quanto mtodos podem usar o modificador
static, passando a serem chamados de membros de classe.
Eles so utilizados para representar propriedades da classe
(varivel) ou executar alguma tarefa de interesse da classe
(mtodo).




Os membros estticos so criados e inicializados quando a
classe carregada. O padro Java para membros estticos o
mesmo usado para membros de instncia (ex:
umMetodoEstatico(), umaVariavelEstatica).

Variveis Estticas: voc se lembra de que cada
instncia de uma classe tem seus prprios atributos ou
propriedades, que so as variveis de instncia? Pois
assim como uma instncia tem suas propriedades, uma
classe pode ter suas propriedades tambm!

As propriedades estticas pertencem s classes e so
Membros estticos pertencem classe e NO
a uma instncia especfica!
99


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
compartilhadas por todas as instncias de uma classe.
Elas podem ser acessadas sem necessitar instanciar um
novo objeto (pois se referem classe e no a um
objeto).

As variveis de classe ou estticas so usadas como
variveis globais para os objetos daquela classe. Por
exemplo, vamos supor que desejamos armazenar o
nmero de datas j criadas, ou seja, o nmero de
objetos da classe Data j criados. Essa informao
NO pode ser tratada como uma varivel de instncia,
pois cada instncia teria um valor diferente pra ela.
Devemos ento representar essa ideia como uma
varivel de classe.












Veja o cdigo a seguir:
public class Data
{
public static int numDatas = 0;
private int dia;
private int mes;
private int ano;
100

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java

public Data() {
numDatas++;
dia = 1; mes = 1; ano = 1900;
}

public Data(int d, int m, int a) {
numDatas++;
dia = d; mes = m; ano = a;
} ...

A varivel esttica pode ser acessada: dentro da
prpria classe (usando seu nome) ou fora da classe
(atravs de uma varivel de referncia de qualquer
objeto de sua classe ou atravs do nome da classe).

Exemplo:
public class Cliente {
public static void main(String args[]){
Data hoje = new Data();
Data depois = new Data();
Data amanha = new Data();
// acesso usando um uma varivel de
// referncia de uma instncia da classe
System.out.println(hoje.numDatas);
System.out.println(amanha.numDatas);
// acesso usando o nome da classe
System.out.println(Data.numDatas);
} }

Mtodos Estticos: os mtodos tambm podem ser
estticos (static), ou seja, podem pertencer
classe. Eles representam operaes relativas a toda a
classe e no a um objeto em particular.

101


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo:
public class Empregado
{
public void aumentarSalario() { ... }
public static void feriasColetivas()
{ ... }
}




















Veja o exemplo de visibilidade de membros estticos abaixo e
diga se existe algum problema:

public class Data {
private static int numDatas = 0;
private int dia;


Dentro da prpria classe um mtodo static s pode
acessar membros static, NO pode acessar membros de
instncia. J um mtodo de instncia pode acessar
membros static bem como de instncia.

Fora da prpria classe deve-se usar o nome da classe ou
nome de uma varivel de instncia. Lembre-se que
depende do modificador de acesso utilizado (mesma para
membros de instncia):
public acessvel ou private inacessvel
102

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
private int mes;
private int ano;

public static int getNumDatas() {
System.out.println( dia = + dia );
return numDatas;
}

public void exibir() {
System.out.println(dia+/+mes+/+ano);
System.out.println( numDatas );
}}

A seguir um exemplo de cdigo acessando membros estticos:

public class Cliente
{
public static void main(String args[]) {
Data hoje = new Data();
Data depois = new Data();
Data amanha = new Data();

// acesso usando um uma varivel de
// referncia de uma instncia da classe
System.out.println(hoje.getNumDatas());
System.out.println(amanha.getNumDatas());
// acesso usando o nome da classe
System.out.println(Data.getNumDatas());
} }

9.11 Vamos treinar?

a) Implementar um programa que receba cinco palavras
da linha de comando e as mostre em ordem inversa
em que foram digitadas.
103


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java

b) Escreva um mtodo esttico para calcular a mdia dos
elementos de um array passado como parmetro.

c) Escrever um mtodo esttico em Java chamado
testarPrimo que receba como parmetro um nmero
inteiro e retorne true se N um nmero primo ou false
caso contrrio. Depois disso, implementar um
programa Primo que leia repetidamente da entrada
padro um nmero inteiro N, 1 < N < 1000, e execute o
mtodo testarPrimo para verificar se o nmero
primo ou no, imprimindo o resultado. O programa
deve parar se o nmero for menor ou igual a 0 (zero).

d) Implementar uma classe Estudante com as seguintes
propriedades:
matricula (int)
nome (String)
sexo (char)
um array chamado notas com 4 posies
(double []), sendo uma para cada nota parcial.

e as seguintes operaes:

void exibir() : mostra os dados do Estudante;
void atribuirNota(int numProva, double nota)
: coloca a nota no array na posio numProva-1;
double lerNota(int numProva) : procura no
array e retorna a nota existente na posio
numProva-1.

e) Implementar um programa chamado TesteEstudante
104

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
que realiza as seguintes operaes:

criar um estudante;

atribuir os valores 2004001, Maria Silva e F
para as variveis de instncia matricula, nome e
sexo, respectivamente;

preencher o array de notas com os valores
7.0, 8.2, 6.0, 5.5;

exibir na tela os valores de todas as
propriedades do estudante;

exibir na tela os valores de todas as notas do
estudante;

realizar outras operaes para praticar.

f) Aperfeioar a classe Estudante adicionando as
seguintes funcionalidades:

criar um mtodo sobrecarregado ao mtodo
atribuirNota j existente, para atribuir a nota
0.0 (zero) ao ndice passado como parmetro
atribuirNota(int indice);
criar um mtodo sobrecarregado ao mtodo
exibir passando o ttulo dos dados a
seremexibidos exibir(String titulo);

criar trs construtores sobrecarregados:
um default (sem parmetros), que
105


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
inicializa as variveis de instncia para
os valores default (padres);
outro que recebe somente nome e sexo
do Estudante;
e um terceiro que recebe nome, sexo e
matricula do Estudante.

g) Complementar o programa TesteEstudante com as
seguintes operaes:

criar trs estudantes, cada um utilizando um
construtor diferente:
sem parmetros
passando nome e sexo
passando nome, sexo e matricula

executar os mtodos sobrecarregados para os
estudantes acima:
atribuirNota(1, 7.0);
atribuirNota(2, 5.0);
atribuirNota(3);
atribuirNota(4, 8.5);
exibir();
exibir(dados do estudante).


h) Criar uma varivel de classe (static) privada chamada
numEstudantes para a classe Estudante que faa a
contagem do nmero de estudantes j criados.
Incrementar a varivel de classe criada dentro dos
mtodos construtores.

106

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
i) Implementar um mtodo de classe (static) pblico
chamado getNumEstudantes que retorne o nmero de
estudantes criados.

j) Incrementar o programa TesteEstudante para imprimir
o nmero de estudantes criados, chamando o mtodo
getNumEstudantes a partir de variveis de referncia
ou usando o nome da classe.




10. PACOTES







Neste captulo voc
aprender como
organizar suas classes
em pacotes e qual a
importncia deles.


Java is Everywhere

108

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
10.1 Cad o Meu Pacote?

As classes de um mesmo diretrio em Java so visveis umas
s outras. Mas como fazemos para visualizar classes de outros
diretrios? Utilizar

O esquema de pacotes serve para dois propsitos:

permitir o agrupamento de classes inter-relacionadas;

possibilitar a visualizao de classes empacotadas
em outros diretrios.

Um pacote serve para agrupar classes, interfaces e subpacotes
inter-relacionados. Cada pacote est associado a um diretrio
do Sistema Operacional, mas nem todo diretrio um pacote.

Tambm importante saber que classes de pacotes diferentes
podem ter o mesmo nome e que o uso de pacotes influencia
na acessibilidade dos objetos.




Para declarar que o contedo de um arquivo pertence a
determinado pacote, usa-se a clusula package no incio do
arquivo:

package faculdade;

Pacotes esto associados ao agrupamento de arquivos
.class e no de arquivos .java. Cada pacote deve
ter o seu subdiretrio a partir do CLASSPATH.
109


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Supondo que o diretrio C:\home est no CLASSPATH, as
classes do pacote faculdade devem estar no diretrio
C:\home\faculdade. Em cada arquivo fonte desse
mesmo pacote deve haver a mesma clusula package no
incio.
10.2 Definindo Subpacotes

Para definirmos subpacotes basta fazermos uso do operador
ponto . . Por exemplo, para declarar que o contedo de um
arquivo pertence a determinado subpacote de um pacote,
usa-se a clusula package no incio do arquivo com a
seguinte sintaxe:

package faculdade.classes;

Supondo que o diretrio C:\home est no CLASSPATH, as
classes do subpacote faculdade.classes devem estar
no diretrio C:\home\faculdade\classes.

Classes contidas em pacotes so identificadas prefixando-se o
nome do pacote ao seu nome.

Exemplo:

faculdade.classes.Estudante
(classe Estudante contida no pacote
faculdade.classes)

java.awt.Button
(classe Button faz parte do pacote java.awt)

110

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Observe que ponto (.) permite definir classes com mesmo
nome em diferentes pacotes:

java.sql.Date; diferente de java.util.Date;

As classes de um pacote podem ser utilizadas por outra classe
da seguinte maneira: usando o nome da classe totalmente
qualificado (especificando todo o caminho) ou a partir de um
import usando o operador ponto (.).

Exemplo 1 (nome totalmente qualificado):

class TesteEstudante
{
faculdade.classes.Estudante e;
...

Exemplo 2 (utilizando import):

import faculdade.classes.Estudante;
class TesteEstudante
{
Estudante e;
...

Pode-se ainda usar o asterisco (*) para importar todas as
classes de um mesmo pacote:

import faculdade.classes.*;

ATENO: o asterisco (*) no importa subpacotes, somente as
classes daquele pacote! Podem existir vrios importaes em
um mesmo arquivo.
111


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
10.3 Nomeando Pacotes

H um esquema global de nomes para pacotes, que segue o
padro de nomes de domnio da Internet, escrevendo a URL
das empresas de trs para frente, o que permite identificao
nica de classes em toda Internet. O objetivo evitar conflito
entre classes de fornecedores diferentes.

Exemplo:

Imagine que os pacotes que pertencerem empresa
SoftExport devem ter o seguinte formato:

br.com.softexport.sql

As classes do subpacote sql estariam no diretrio:
\br\com\softexport\sql.
10.4 Acessibilidade de Pacotes

Alm das acessibilidades pblica (public) e privada
(private), h uma outra associada aos pacotes. a
acessibilidade padro (default), que indica que somente
classes dentro de um mesmo pacote podem ter acesso aos
mtodos e variveis. Esse modificador utilizado quando no
se coloca nada em classes, mtodos ou variveis.

Exemplo:
long tamanho;
long getTamanho() {
return tamanho; }

112

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java


NO ESQUECER:


Para Classes e Interfaces s existe dois tipos de acessibilidade:

pblica: a classe (ou interface) visvel de qualquer
lugar. Deve-se usar a palavra-reservada public.

pacote ou default: a classe s visvel dentro do
prprio pacote, no sendo enxergada fora dele, nem
mesmo em seus subpacotes. No usa nenhum
modificador.

Exemplo:

package br.com.softexport.sql;
public class Date
{ ... }
class TestDate
{ ... }


10.5 Vamos Treinar?

a) Trabalhar a aplicao de estudantes para usar pacotes.
Para isso, defina a seguinte rvore de diretrios a
partir do raiz (C:\)

113


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java






O pacote deve comear a partir do diretrio faculdade.

b) Coloque a classe Estudante no pacote
faculdade.classes e TesteEstudante no pacote
faculdade.principal.

c) Importe o pacote faculdade.classes dentro da classe
TesteEstudante.





11. O QUE GANHEI DE
HERANA?
Aqui voc ficar
sabendo o que as
classes fazem
para herdarem
tudo de seus pais.
Ser que foram
boas filhas?
Java is
Everywhere

115


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
11.1 Introduo

No captulo anterior a gente criou uma classe chamada
Estudante (voc fez os exerccios no foi? ). Mas ento,
como faramos para criar outros tipos de estudantes, que
possussem propriedades e realizassem operaes
semelhantes ao estudante que j conhecemos apenas com
algumas poucas diferenas?

Poderamos imaginar, por exemplo, em estudantes tutores,
que realizam tutoria na universidade, e estudantes estagirios,
que desenvolvem estgio em alguma empresa. Esses novos
tipos de estudante possuem as mesmas propriedades e
realizam as mesmas operaes que o estudante comum,
porm, tambm possuem novas propriedades e realizam
novas operaes.

Estudante Estudante Tutor Estudante Estagirio


11.2 Definindo nossas classes

As nossas trs classes (Estudante, EstudanteTutor e
EstudanteEstagiario) sero definidas conforme
apresentado a seguir:

116

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Estudante
Propriedades:
o nome;
o matricula;
o sexo;
o notas.
Operaes:
o exibir();
o atribuirNota();
o lerNota();
o calcularMedia().


Estudante Tutor
Propriedades comuns:
o nome;
o matricula;
o sexo;
o notas.
Novas propriedades:
o bolsa;
o disciplina.
Operaes comuns:
o exibir();
o atribuirNota();
o lerNota();
o calcularMedia().
Novas operaes:
o tirarDuvidas();
o auxiliarProfessor().


117


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Estudante Estagirio
Propriedades comuns:
o nome;
o matricula;
o sexo;
o notas.
Novas propriedades:
o empresa;
o salario.
Operaes comuns:
o exibir();
o atribuirNota();
o lerNota();
o calcularMedia().
Nova operao:
o trabalhar().

Enquanto isto, na cabea do desenvolvedor da programao
estruturadas...













118

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Em uma programao tradicional, o desenvolvedor teria que
definir diversas vezes os mtodos que so comuns as classes
Estudante, EstudanteTutor e EstudanteEstagiario. O
reaproveitamento de cdigo nesse caso se basearia no Copy &
Paste (copiar e colar).

O grande problema que quando algum desses mtodos
precisarem ser alterados, todas as classes correspondentes
precisaro ser alteradas. Resultado: manuteno difcil!

11.3 Vale a pena ver de novo...

Herana de Classes usada na
Programao Orientada a
Objetos para definir novas
classes a partir de uma classe
existente.

A nova classe herda todos os
membros (variveis e mtodos) da classe antiga sem precisar
reescrever o cdigo novamente. A nova classe chamada de:
subclasse, classe derivada, classe filha, etc. J a classe antiga
chamada de: superclasse, classe base, classe me, classe pai,
entre outras.

A subclasse pode (e deve) acrescentar novo comportamento
(mtodos) e/ou propriedades (variveis), e, em algumas
situaes, at mesmo mudar o comportamento herdado.

Herana utilizada caracteristicamente no processo de
Especializao de funcionalidades mais gerais para situaes
119


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
mais especficas, evitando que se tenha que iniciar a
codificao do zero. J a Generalizao segue o processo
inverso, isto , parte de situaes mais especficas para as
mais gerais.






NO ESQUECER:


Herana define uma relao do tipo um (ou relao
superclasse-subclasse), enquanto agregao define
uma relao do tipo tem um (ou relao todo-parte).

Existem dois tipos de Herana de Classes na Orientao
a Objetos: Herana Simples (uma subclasse s pode
ter uma superclasse imediata) e Herana Mltipla
(uma classe pode ter vrias superclasses imediatas).

Em Java, uma classe s pode herdar de, ou estender,
uma nica classe. Em outras palavras, uma classe s
pode ter uma nica superclasse imediata. Assim, Java
s permite herana simples de classes, que tambm
chamada de herana linear de implementao, ou
herana simples de implementao.

Agregao outro mecanismo fundamental
de reuso de cdigo!
120

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
11.4 Aplicando Herana em Java

Em Java, a superclasse especificada por meio da clusula
extends no cabealho da subclasse. Veja o exemplo abaixo:

public class Animal extends SerVivo{
...
}

A subclasse animal possui como superclasse SerVivo.

importante observar que se no for especificada nenhuma
clusula extends, a classe herdar implicitamente da classe
java.lang.Object, que a classe pai de todas as classes.

A subclasse especifica apenas membros novos ou
modificados, sendo o resto da definio herdada da
superclasse.

Vamos relembrar a classe Estudante:

public class Estudante
{
// variaveis de instancia
private int matricula;
private String nome;
private char sexo;
private double notas[] = new double[4];

// metodos de instancia
public void exibir() { ... }
public void atribuirNota(int p,double n)
{ ... }
121


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
public double lerNota(int p) { ... }
public void calcularMedia() { ... }
}

Para estender da classe Estudante, cria-se um novo arquivo
chamado EstudanteTutor.java com o seguinte cdigo:

public class EstudanteTutor extends Estudante{
// novas variveis de instncia
private double bolsa;
private String disciplina;
// as outras variveis so herdadas

// novos mtodos de instncia
public void tirarDuvidas() { ... }
public void auxiliarProfessor() { ... }
// os outros mtodos so herdados
}

E por fim, para representar o estagirio, cria-se um novo
arquivo chamado EstudanteEstagiario.java com o
seguinte cdigo:

class EstudanteEstagiario extends Estudante{
// novas variveis de instncia
private double salario;
private String empresa;
// as outras variveis so herdadas

// novo mtodo de instncia
public void trabalhar() { ... }
// os outros mtodos so herdados
}

122

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java










11.5 Mais Sobre o Mecanismo de
Herana

Quando utilizamos herana em Java existem algumas coisas
interessantes, como por exemplo:

Atributos e mtodos privados so herdados, mas no
podem ser acessados diretamente. Para acess-los
devem-se usar os mtodos get (acessador) e set
(alterador);

Uma instncia de uma subclasse uma instncia de
todas as suas superclasses;

Exemplo:

EstudanteTutor et = new
EstudanteTutor();
Estudante e = et;
Estudante e2 = new EstudanteTutor();

VANTAGENS DO USO DA HERANA

Permite o reuso de cdigo;
Facilita a manuteno dos sistemas;
Melhora o entendimento por parte da equipe de
desenvolvimento;
Acaba com o antipadro Copy & Paste.

123


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Objetos da subclasse comportam-se como objetos da
superclasse;

Exemplo:

EstudanteTutor et;
et = new EstudanteTutor();
et.auxiliarProfessor();
et.atribuirNota(1, 7.5);
et.lerNota(1);

Objetos da subclasse podem ser usados no lugar de
objetos da superclasse.

Exemplo:

class Turma {
String nome;
Estudante estudantes[];
estudantes = new Estudante[5];
private int numEstudantes = 0;
public void matricular(Estudante e){
estudantes[numEstudantes] = e;
numEstudantes++;
}
}

class Programa{
public static void main(String args[]){
EstudanteTutor et;
et = new EstudanteTutor(Pedro);
Turma t;
t = new Turma(POO Java);
t.matricular( et );
}
}
124

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
11.6 Classes Finais

Muito bom esse negcio de herana, mas existem casos que a
gente no quer que ningum estenda a nossa classe. So
aqueles casos que a herana vai ficar com o alm...

Em Java quando queremos que ningum estenda (herde) de
uma determinada classe, a gente utiliza o modificador final.
Veja o exemplo abaixo:

final class Cachorro extends Animal {
...
}

Agora ningum conseguir estender a classe Cachorro. A
classe j est perfeita e no preciso mais nenhuma alm
dela (pensamento de quem implementou a classe).

11.7 Vamos treinar?

a) Desenhe um diagrama de classes UML que represente
a seguinte hierarquia:
Funcionrio tem nome, matrcula, sexo e data de
nascimento e recebe salrio;
Professor um Funcionrio que tem nmero de
horas aula e leciona;
Contador um Funcionrio que tem inscrio no
Conselho de Contabilidade (CC) e executa a
contabilidade;
Coordenador um Professor que tem cargo e
responsvel por criar turmas.
125


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
b) Codifique classes em Java que implementem a
hierarquia acima. No esquea dos mtodos get e
set!

c) Implemente um programa para criar objetos das
subclasses Professor e Coordenador e executar
mtodos herdados.




12. REDEFINIO DE
MTODOS




















Neste captulo
veremos que o
comportamento
herdado pode ser
alterado facilmente.
Java is Everywhere

127


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
12.1 Mais Sobre Referncia this

Em Java possvel referenciar o objeto
atual que est executando um
determinado mtodo. Para isto basta
fazer uso do identificador this.

A referncia this passada como um
parmetro implcito quando um mtodo
de instncia chamado, representando
sempre o objeto corrente e s pode ser
usada na classe de definio.

A referncia this geralmente usada para:
diferenciar nomes de parmetros e variveis de
instncia:

private String nome;
public Estudante( String nome ){
this.nome = nome; }

pode ser usada para ativar mtodos como uma
referncia comum:

void atribuirNota(int numProva){
this.abribuirNota(numProva,0.0);}

pode ser passada como parmetro ou atribuda a outra
varivel do mesmo tipo:

processar(this);
Estudante e = this;
128

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
12.2 O Construtor this()

Toda classe instancivel possui pelo menos uma definio de
construtor associada a ela, seja diretamente ou em uma
superclasse (utilizando herana). Um construtor da
superclasse imediata sempre chamado, mesmo que
implicitamente. Por isso dizemos que construtores no podem
ser sobrescritos.

Construtores podem ser apenas sobrecarregados, mas
somente na mesma classe.




A chamada de mtodo this() pode ser usada para encadear
construtores sobrecarregados (no confundir com a referncia
this).

A chamada this() s pode ser usada em definies de
construtores, e, quando usada, deve sempre ser a primeira
sentena no cdigo do construtor. Veja a seguir:

public Estudante(String nome,char sexo) {
this.sexo = sexo;
this.nome = nome;
}

public Estudante(String nome,char sexo,int
matricula){
this( nome, sexo );
Um construtor sem parmetros chamado de
construtor default ou padro.
129


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
this.matricula = matricula;
}

12.3 Nem Tudo Eu Fao Igual Papai










J vimos que quando fazemos herana, a subclasse herda tudo
(propriedades e mtodos) da superclasse . Mas o problema
que nem sempre a subclasse quer ter o comportamento que
recebeu por herana igualzinho ao de seu pai. Na verdade, s
vezes, a subclasse quer dar seu toque especial naquele
comportamento herdado. Nestas horas precisamos fazer uso
da sobrescrita. Analise o exemplo abaixo:

class ContaCorrente{
int numero;
double saldo;
public void creditar(double valor){...}
public void debitar(double valor){
if ( valor <= saldo ) saldo -= valor;
}}
class ContaEspecial extends ContaCorrente{
130

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
private double limite;
public void debitar(double valor){
if (valor <= saldo + limite){
saldo=(valor>saldo)?0:saldo-valor;
limite -= (valor saldo); }
} }

Se voc tiver observado com bastante ateno as classes
acima deve ter percebido que o mtodo debitar() de
ContaCorrente no serve para ContaEspecial,
embora seja herdado.

Quando especializamos o comportamento de uma dada
classe, muitas vezes se faz necessrio redefinir mtodos em
subclasses. Uma forma de fazer isso atravs da redefinio
ou sobrescrita (overriding) de mtodos. A redefinio de
mtodos ocorre quando uma classe define um mtodo usando
o mesmo nome, tipo de retorno e argumentos de um mtodo
da superclasse (como foi o caso de ContaCorrente e
ContaEspecial).

Um mtodo sobrescrito um mtodo na subclasse com a
mesma assinatura:
mesmo nome de mtodo;
mesmos parmetros (mesmos nomes, mesmos tipos,
mesma quantidade e mesma ordem);
mesmo tipo de retorno de um mtodo na superclasse.

O que muda somente a implementao que ser diferente
na subclasse. Mas saiba que visibilidade do mtodo, pode ser
aumentada.
private default protected public

131


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Mais um exemplo:
class A {
void f( ) {
System.out.println (Classe A);
}
}

class B extends A{
void f( ) {
System.out.println (Classe B);
}
}

Se o cdigo abaixo for executado, com base nas classes acima,
apareceria o que na tela?

public class TesteSobrescrita1 {
public static void main(String args[ ]){
B b = new B ();
b.f();
A a = new A();
a.f();
a = b;
a.f();
}
}
12.4 A referncia super

A palavra-chave super pode ser usada no corpo de um
mtodo de instncia em uma subclasse para acessar variveis
e invocar mtodos herdados da superclasse. geralmente
usada para invocar mtodos sobrescritos (overridden
methods) ou acessar variveis que foram ocultadas pela
subclasse (shadowed variables). S possvel acessar a
132

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
definio dos mtodos da superclasse imediata!




Exemplo:
class A {
void f( ) {
System.out.println( Classe A );
}
}

class B extends A {
void f( ) {
super.f();
System.out.println( Classe B );
}
}

public class TesteSobrescrita {
public static void main ( String args [ ] )
{
B b = new B ();
b.f();
A a = new A();
a.f();
a = b;
a.f();
}
}

12.5 O Construtor super()

super prov uma referncia ao objeto corrente
como uma instncia de sua superclasse.
133


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Em Java construtores no so herdados, mas podem ser
acessados! A chamada super() invoca um construtor na
superclasse imediata, com os mesmos parmetros da
chamada.

Assim como na chamada this(), a chamada super() s
pode ser usada em definies de construtores.

ATENO: a chamada super(), quando usada, deve sempre
ser a primeira sentena no cdigo do construtor. Isto implica
que s possvel utilizar this() ou super() de cada vez,
nunca os dois!

Exemplo:

class Estudante {
public Estudante( String nome, char sexo,
int matricula) {
this.sexo = sexo;
this.nome = nome;
this.matricula = matricula;
} ...
}

class EstudanteTutor extends Estudante {
public EstudanteTutor(String nome,char sexo,
int matricula,double bolsa,String disciplina){
super( nome, sexo, matricula );
this.bolsa = bolsa;
this.disciplina = disciplina;
}}

134

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
12.6 Encadeamento de Construtores

importante observar que se a classe no definir nenhum
construtor, seu construtor default ser chamado quando da
criao de objetos.

Se no for especificada uma chamada this() ou super()
dentro do construtor, a JVM inclui implicitamente uma
chamada ao construtor default da superclasse.


Fique Ligado: uma boa prtica sempre implementar o
construtor padro de uma classe, por que se a super classe
imediata no possuir construtor default, ocorrer erro de
compilao.



135


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
12.7 Mtodos Finais

J aprendemos que as variveis podem ter o modificador
final, que as transforma em constantes, ou seja, uma vez
que elas tenham sido inicializadas, no podero ter seus
valore alterados.

Mas tambm possvel termos mtodos com o modificador
final. Quando isto acontece, o mtodo no pode ser
redefinido (overriding) em suas subclasses, ou seja, a verso
final do mtodo (ningum vai alterar o comportamento
herdado de papai!).

Exemplo:

class Transporte {
final public void setNumPneus(int pneus){
noOfTyres = tyres;
}
}

class Carro extends Transporte {
public void setNumPneus(int pneus){
noOfTyres = 2 * tyres;
}
}

136

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
12.8 Vamos Treinar?

a) Alterar as subclasses EstudanteTutor e
EstudanteEstagiario da superclasse
Estudante, implementando em seus construtores
chamadas aos construtores this() e super().

b) Sobrescrever os mtodos necessrios nas subclasses
EstudanteTutor e EstudanteEstagiario
(exibir, atribuirNota, etc.), chamando mtodos da
superclasse atravs da referncia super, quando
necessrio.



13. REFERNCIA E CIA...





















Vamos aprender a
manipular as variveis
de referncia de uma
forma mais poderosa
para implementar o
polimorfismo.
Java is Everywhere

138

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
13.1 Manipulando Referncias

De maneira geral, o tratamento dado em Java para converses
de tipo para referncias a objetos anlogo ao que acontece
nas converses de tipos primitivos.

Converses de tipo (classe) para referncias a objetos podem
ocorrer de duas formas:

Implicitamente: em atribuies e passagem de
parmetros;

Explicitamente: por meio de casting explcito.





EstudanteTutor et = new EstudanteTutor();
Estudante e = et;
Converses de tipos mais especficos para tipos
mais gerais (upcasting) so permitidas.
139


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo de Upcasting:
public class Programa {
EstudanteTutor et = new EstudanteTutor();
// situao 1
Estudante e = et;
// situao 2
Turma t = new Turma();
t.matricular( et );
}
public class Turma {
...
public void matricular( Estudante e ) {...}
...
}

J ao contrrio, converses de tipos mais gerais para tipos
mais especficos (downcasting) exigem casting explcito. Isto
vale para a hierarquia completa de herana, incluindo classes
e interfaces.

13.2 Casting de Referncias

Em Java para fazer casting (converso) da
variavelDeReferencia do TipoDeOrigem para o TipoDeDestino,
usa-se a seguinte sintaxe:

TipoReferencia variavelDeReferencia = new
TipoDeDestino();
TipoDeDestino variavelDeDestino =
(TipoDeDestino) variavelDeReferencia;

O casting acima possvel SOMENTE se o objeto denotado
pela variavelDeReferencia, em tempo de execuo :
140

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
uma instncia da classe TipoDeDestino ou
uma instncia de uma subclasse dela.

Jogo Rpido: O cdigo est correto? Ele faz o que?

public class Turma {
...
public Estudante obterEstudante(int mat)
{...}
}
...
EstudanteTutor et;
et = new EstudanteTutor(111, Pedro, M);
Turma t = new Turma()
t.matricular( et );
EstudanteTutor et2 = t.obterEstudante( 111 );

Se voc analisou o cdigo com cuidado deve ter
percebido (diga que percebeu...) que o mtodo
obterEstudante retorna uma referncia
para um objeto do tipo Estudante, mas
na ltima linha estamos tentando atribuir
a referncia retornada (Estudante)
uma varivel de referncia do tipo
EstudanteTutor, gerando um erro de
compilao, por que nem todo Estudante
um EstudanteTutor. Para resolver o problema teramos
que alterar a linha para:

EstudanteTutor et2 =
(EstudanteTutor) t.obterEstudante( 111 );

141


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
A figura abaixo faz todo o resumo sobre casting:
13.3 Operador instanceof

O operador binrio instanceof tem a seguinte sintaxe:

variavelDeReferencia instanceof TipoDeDestino

Este operador retorna true se o objeto denotado pela
variavelDeReferencia, em tempo de execuo, :

uma instncia da classe TipoDeDestino, ou
uma instncia de uma subclasse dela.

IMPORTANTE: em tempo de compilao verificado se o tipo
da variavelDeReferencia e o TipoDeDestino esto
no mesmo ramo da hierarquia de classes. Caso contrrio,
acontecer um erro de compilao.


142

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Com base na hierarquia de classes abaixo, informe qual o
valor retornado para cada um dos instanceof:


C c = new C();

c instanceof C __true___

c instanceof B _________

c instanceof A _________

c instanceof E _________

c instanceof D _________

c instanceof Object _________

13.4 Unindo casting e instanceof

Para os nossos cdigos ficarem mais seguros contra erros em
tempo de execuo podemos fazer uso da combinao de
casting e instanceof. Veja a seguir:

...
EstudanteTutor et = new EstudanteTutor();
Turma t = new Turma()
t.matricular( et );
Estudante e = t.obterEstudante( 111 );
if ( e instanceof EstudanteTutor )
{
( (EstudanteTutor) e ).tirarDuvidas();
}
...

143


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Com isto, agora o mtodo tirarDuvidas()s executado
se o objeto real (que est na memria) for do tipo
EstudanteTutor.
















Veja o trecho de cdigo abaixo e tente explicar o que est
errado:

Estudante e = new Estudante();
EstudanteTutor et = (EstudanteTutor) e;

___________________________________________________

___________________________________________________

___________________________________________________




Tanto o casting quanto o operador instanceof
requerem verificao:

em tempo de compilao: que avalia somente as
referncias, e;
em tempo de execuo: que avalia o objeto
propriamente dito.
144

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
13.5 Passagem de Parmetros

Como j foi visto, a passagem de parmetros de tipos
primitivos em Java feita por valor, ou seja, uma cpia do
valor original feita. Isso significa que modificaes no
parmetro formal no so refletidas no parmetro real. J
para arrays (objetos), uma cpia da referncia para o array
passada.




Ento as mudanas ocorridas nos elementos de um array
dentro de um mtodo, se refletem no lugar onde o mtodo foi
chamado. Veja o exemplo:

public static void somar(int[] x) {
x[2] = x[1] + x[0];
}
public static void main (String args[]) {
int[] a = new int[3];
a[0] = 1;
a[1] = 10;
a[2] = 20;
System.out.println(antes >+ a[2]);
somar(a);
System.out.println(depois >+ a[2]);
}

Antes da chamada ao mtodo somar(a), o valor
armazenado no ndice 2 do array igual a 20. Aps a chamada
ao mtodo o valor foi alterado para 11.
Para objetos, uma cpia da referncia ao objeto
passada, e no uma cpia do objeto.
145


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java





NO ESQUECER:


Apesar da passagem por parmetros em Java ser por
valor, pode-se ter aliasing quando uma referncia a
um objeto passado como parmetro, assim como
acontece na atribuio de referncias.

Exemplo:
public static void main( String args[] ) {
Data hoje;
hoje = new Data();
funcao(hoje);
System.out.println( hoje.getMes() ); // 10
}
static void funcao( Data umaData ) {
umaData.setMes( 10 );
}

Assim que o objeto referenciado por hoje for criado, suas
variveis de instncia estaro todas com o valor padro para
inteiros: zero. Quando o mtodo funcao for chamado ele
receber uma referncia do tipo Data, e em seguida alterar o
ms para 10. Essa alterao ser sentida por hoje.

ATENO: os valores dos campos do objeto podem ser
alterados dentro do mtodo chamado, porm, mudanas na
Quando uma alterao em uma varivel afeta
alguma outra, damos o nome de aliasing.
146

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
prpria referncia dentro do mtodo no afetam a referncia
externa.

Exemplo:
public static void main( String args[] ){
Data hoje;
hoje = new Data();
funcao(hoje);
System.out.println( hoje.getMes() );
}

void funcao( Data umaData ){
umaData.setMes( 10 );
umaData = new Data();
umaData.setDia( 22 );
}

13.6 Vamos Treinar?

a) Criar uma classe chamada Apresentador que possui
um nico mtodo chamado apresentar(Estudante e),
que recebe como argumento um Estudante e exibe
seus dados, ou seja, chama o mtodo exibir do objeto
passado.

b) Codifique um programa para criar um apresentador e
trs estudantes (comum, monitor e estagirio) e pass-
los ao apresentador para exibir seus dados. Observe o
emprego do polimorfismo e da ligao dinmica.



14. CLASSES ABSTRATAS
E INTERFACES



Neste captulo vamos
turbinar o
polimorfismo
aprendendo como
utilizar as classes
abstratas e interfaces
Java is Everywhere

148

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
14.1 Classes Abstratas

No projeto de uma hierarquia de classes, nem todas as classes
so previstas de serem instanciadas. Algumas classes, na
verdade, existem simplesmente para agrupar
comportamentos similares. Observe o exemplo abaixo:










Imagine se a gente criasse um objeto do tipo Animal. Que
animal seria este? No mundo real temos animais desse tipo?
Ou temos apenas ces, gatos, papagaios, entre outros?

Voc pode at dizer que cria um animal em casa, mas seu
bichinho de estimao com certeza nascer de alguma
espcie, que pode ser Cachorro, Gato, Papagaio, ou
outro qualquer, mas nunca da classe Animal. Essa a ideia
principal por trs do conceito de Classes Abstratas!

Se, por outro lado, no existisse a classe abstrata (Animal),
as demais classes (Cachorro, Gato, Papagaio, etc.)
continuariam a existir, mas no haveria nenhuma relao
definida entre elas.

149


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Para declarar uma classe qualquer como sendo abstrata, faa
como o exemplo abaixo:

public abstract class Animal{
...
}

A estratgia de usar classes abstratas ter uma superclasse
que dita o comportamento, enquanto as subclasses concretas
tm a liberdade de prover a implementao que acharem
relevantes.

IMPORTANTE: onde se pode usar uma referncia da
superclasse Animal, mesmo ela sendo abstrata, os objetos
de quaisquer subclasses (Cachorro, Gato e Papagaio),
podem ser utilizados.




14.2 Mtodos Abstratos

Mtodos abstratos so aqueles que no tm implementao,
somente o prottipo fornecido.

CUIDADO: Uma classe que possui um mtodo abstrato no
pode ser instanciada, pois ela parcialmente definida.

As subclasses de uma classe que possui mtodos abstratos
Classes Abstratas so teis no reuso, incrementando
o mecanismo de polimorfismo.
150

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
devem implementar os mtodos abstratos herdados da
superclasse, caso contrrio, tambm no podero ser
instanciadas.

Um mtodo abstrato usa o modificador abstract e possui
apenas sua assinatura seguida de ; .

Exemplo:
abstract public void comer();
abstract public int getNumeroDePneus();


NO ESQUECER:


Um classe abstrata no pode ser instanciada;

especificada com a palavra-chave abstract ;

uma classe que possui algum mtodo abstrato DEVE
ser declarada abstrata;

a subclasse de uma classe abstrata DEVE prover a
implementao dos mtodos abstratos herdados, do
contrrio, tambm ser uma classe abstrata;

uma classe pode ser declarada abstrata mesmo que
no possua mtodos abstratos. Isso evita que se
instanciem objetos dessa classe;

Classes Abstratas podem herdar de classes abstratas e
no abstratas.
151


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo de Classe Abstrata:
abstract class Animal {
abstract public void comer();
abstract public void dormir();
abstract public void moverSe();
}

class Cachorro extends Animal {
public void comer() { ... }
public void dormir() { ... }
public void moverSe() { ... }
}




















Alguns mtodos NO podem ser declarados como
sendo abstratos:

Construtores
Estticos
Privados

Uma classe no pode ser abstrata e final ao mesmo
tempo.
152

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
14.3 Interfaces

As classes Cachorro, Gato e Papagaio so, por essncia,
animais, por isso, podem ser agrupadas debaixo da
superclasse Animal.

Imagine, agora, o que as classes Automovel, Televisao e
MicroOndas tm em comum.

Bem, a gente poderia pensar que elas possuem duas
operaes:

ligar e desligar

Mas importante perceber que ainda que os nomes sejam os
mesmos, as implementaes sero completamente diferentes
nas trs classes!

Quando temos um cenrio como foi apresentado
anteriormente torna-se adequado o uso das Interfaces.

Interfaces, so, portanto, tipos especiais que declaram apenas
nomes de operaes que podem ser comuns a vrias classes.
como se ela definisse um contrato, especificando somente os
prottipos dos mtodos (assinaturas), mas no suas
implementaes.

No nosso exemplo, podemos ter uma interface chamada
Operaes que declara as operaes ligar e desligar.
Veja a seguir como declarada uma interface em Java:

153


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
public interface Operacoes {
void ligar();
void desligar();
}


NO ESQUECER:


Os mtodos de uma interface so por default:
abstract e public. Embora no seja necessrio
declar-los como tal.
14.4 Implementando Interfaces

As implementaes das operaes ficam a cargo das classes
que iro implementar essa interface. Uma classe, ao
implementar uma interface, pode seguir uma das duas
situaes descritas abaixo:

1) Deve prover uma implementao para cada uma das
operaes da interface.

2) Deve declarar a classe como abstrata.

Exemplo:
public class Automovel implements Operacoes {
public void ligar() {
girarChave();
acionarCombustao();
iniciarFuncionamentoDoMotor();
}

154

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
public void desligar() {
girarChaveAoContrario();
desativarFuncionamentoDoMotor();
}

public abstract class Televisao implements
Operacoes{
public void desligar() {
pressionarButao();
apagarImagem();
}

public class TelevisaoPlana extends Televisao{
public void ligar() {
pressionarButao();
capturarSinal();
jogarImagemNaTela(); }}








Uma classe pode implementar zero ou mais interfaces,
listadas na clusula implements;
Uma classe pode ao mesmo tempo estender de outra
classe e implementar zero ou mais interfaces. Nesse
caso, a clusula extends vem antes da implements;
Uma interface pode estender de outras interfaces
usando a clusula extends;
Uma interface NO pode ser instanciada;
Interfaces no possuem construtores.

155


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
14.5 Interfaces e Polimorfismo

Uma referncia de objeto de uma superclasse pode
polimorficamente referenciar objetos do tipo da prpria
superclasse ou de qualquer subclasse.

Como vimos, esta relao de
herana em Java linear,
no permitindo herana
mltipla de implementao
(classes).

TelevisaoPlana tvp =
new TelevisaoPlana();
Televisao tv = tvp;


As interfaces, assim como definies de classes, introduzem
novos tipos que podem ser usados polimorficamente.

Embora interfaces NO
possam ser instanciadas,
pode-se declarar
variveis do tipo definido por
uma interface.

Automovel auto =
new Automovel();
Operacoes op = auto;

156

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Veja abaixo o quadro comparativo entre classes abstratas e
interfaces:

14.6 Constantes em Interfaces

Uma interface, alm de operaes, pode definir constantes. As
constantes so acessveis a qualquer cliente que a implemente
ou estenda (s interfaces estendem de interfaces... no
esquea disto!) , seja classe ou interface.

Todas as variveis definidas em uma interface so por default
(padro):

public
static
final (constantes)


Embora no seja necessrio declar-las como tal.



157


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo:
interface Constantes {
double PI = 3.14;
String AREA_UNITS = " sq.cm.";
String LENGTH_UNITS = " cm.";
}

public class Client implements Constantes {
public static void main(String args[]) {
double radius = 1.5;
// (1) Acesso direto
System.out.println(Area do circulo eh +
(PI*radius*radius) + AREA_UNITS);
// (2) Acesso prefixado com a interface
System.out.println(Circunferencia do
circulo eh + (2*PI*radius) +
Constantes.LENGTH_UNITS); }
}

14.7 Vamos Treinar?

a) Codificar uma classe abstrata chamada Aparelho com
dois mtodos abstratos ligar() e desligar() e um
mtodo no abstrato exibir().

b) Criar duas subclasses Televisao e Microondas que
herdam de Aparelhos e implementam os mtodos
ligar() e desligar() herdados da superclasse de acordo
com suas especificidades, e redefinem o mtodo
exibir(), caso necessrio.

c) Codificar um programa TesteAparelho que declara
variveis da superclasse Aparelho e usa-as com objetos
158

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
das subclasses Televisao e Microondas, ligando e
desligando os objetos.

d) Codificar uma interface chamada Operacoes com os
prottipos dos mtodos ligar() e desligar().

e) Criar trs classes Automovel, Televisao e Microondas
que implementam a interface Operacoes, provendo
cdigo para os mtodos ligar() e desligar().

f) Codificar um programa TesteOperacoes que declara
variveis da interface Operacoes e usa-as com objetos
das classes Automovel, Televisao e Microondas,
ligando e desligando os objetos.




15. AGREGAO, LISTAS
E MAPEAMENTOS



Neste captulo vamos
conhecer como
podemos utilizar
agregao e como
criar colees.
Java is Everywhere

160

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
15.1 Agregao

Alm da herana, existe outro mecanismo fundamental de
reuso de cdigo, chamado agregao. Herana define uma
relao do tipo um (ou relao superclasse-subclasse),
enquanto agregao define uma relao do tipo tem um (ou
relao todo-parte).

Exemplos:

Uma turma composta de estudantes;
Uma empresa composta de departamentos;
Um aparelho composto de peas.

Sempre que tal situao acontecer, pode-se aplicar o conceito
da agregao.

Um objeto agregado criado a partir de outros objetos
constituintes, que so suas partes. Objetos em Java NO
podem conter outros objetos. Eles podem ter apenas
referncias para outros objetos.

Exemplo:
public class Turma {
String nome;
int numEstudantes;
Estudante estudantes[];
...
}

Da mesma forma que podemos ter arrays de tipos primitivos
de dados, podemos ter arrays de objetos. Assim, arrays
161


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
podem representar grupo de dados do mesmo tipo primitivo,
ou ainda, da mesma classe.

Para declarar arrays de objetos e tipos primitivos basta fazer
conforme mostrado abaixo:

double notas[];
Estudante estudantes[];

Quando um array criado, todos os seus elementos so
automaticamente inicializados com os valores default (padro)
do tipo primitivo, ou com null, se forem objetos.

Exemplo:
double notas [] = new double[4];
Estudante estudantes[] = new Estudante[5];




Agora que o array de Estudante e de double foram
criados, podemos manipular os seus elementos. Observe o
cdigo abaixo:

notas[0] = 8.5;
estudantes[1] = new Estudante(Maria);
estudantes[1].setMatricula(120);


162

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java




15.2 Colees de Selos, Carros...

Uma coleo (collection) permite que um grupo de objetos
seja tratado como uma unidade, ou seja, objetos arbitrrios
podem ser armazenados, recuperados e manipulados como
elementos de colees. A hierarquia de classes e interfaces
que trabalham com colees apresentada abaixo:
Em Java NO possvel redimensionar arrays.
Caso seja necessrio, use Listas!
163


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
As colees esto disponveis no pacote java.util e
podem aparecer na forma de listas e conjuntos. As interfaces
que representam colees, listas e mapeamentos, esto
descritas a seguir:

As estruturas de listas e mapeamentos mais utilizadas so:

ArrayList: arrays dinmicos (o tamanho pode
aumentar ou diminuir);

Vector: arrays dinmicos sincronizados (thread-
safe), ou seja, chamadas concorrentes a um objeto no
comprometero sua integridade;

HashMap: tabelas de pares chave-valor;

HashTable: tabelas de pares chave-valor
sincronizadas (thread-safe), ou seja, chamadas
concorrentes a um objeto no comprometero sua
integridade.

164

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
15.3 Listas

Listas so colees que mantm seus
elementos em ordem (tambm chamado
de sequncia), e permitem elementos
duplicados.

Em uma lista no vazia, o primeiro elemento tem ndice 0 e o
ltimo size()-1 (lembra de Strings, arrays? Sempre
comeando pelo ndice zero!).

Uma operao sob um ndice que no existe gera uma
exceo: IndexOutOfBoundsException (voc vai amar
o captulo de excees).

Diferente dos arrays tradicionais de Java, uma Lista pode no
ter um tipo determinado, ou seja, o primeiro elemento pode
ser de um tipo diferente do segundo elemento. Porm, todos
os elementos DEVEM ser objetos tipos primitivos no so
permitidos em listas!

Exemplo:
// declarando e criando a lista
ArrayList lista = new ArrayList();
// adicionando elementos na lista
lista.add(new Object());
lista.add(new Animal(pato));
lista.add(new Estudante(Zezinho));
lista.add(new Professor(Marcos));
lista.add(new Integer(10));


165


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Veja a relao dos principais mtodos disponveis para listas:

int size(): retorna o tamanho da lista.

boolean isEmpty(): retorna true se a lista
estiver vazia.

boolean add(Object element): adiciona um
objeto ao final da lista.

Object get(int index): retorna o elemento no
ndice especificado.

Object set(int index, Object element):
substitui o elemento no ndice especificado com o
parmetro passado.

boolean contains(Object element):
166

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
verifica se o objeto passado como parmetro
membro da coleo.

int indexOf(Object o): retorna o ndice da
primeira ocorrncia do elemento especificado na lista,
se o elemento existir, caso contrrio retorna -1.

void clear(): remove todos os elementos da lista.

Object remove(int index): remove o
elemento no ndice especificado, reduzindo o tamanho
da lista.

Para percorrer um ArrayList faa como o cdigo exemplo
abaixo:

...
public void print( ArrayList a )
{
for( int i = 0; i < a.size(); i++ )
{
System.out.println( a.get(i) );
}
}
}

Tambm existe uma outra forma mais elegante de percorrer
um ArrayList: utilizar o padro de software iterator!

Em Java existe uma interface chamada ListIterator. Ela
um iterator customizado (personalizado) para listas. Com a
utilizao do ListIterator, facilmente podemos percorrer
listas em ambas as direes.
167


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo:
import java.util.*;
public class TesteArrayList3 {
public static void main(String args[]) {
List myList = new ArrayList();
myList.add(1);
myList.add(2);
myList.add(3);
ListIterator it = myList.listIterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}

15.4 Listas Genricas

O mtodo get(int index) do ArrayList retorna um
Object, portanto, pode ser necessrio realizar converses
(casting) se o tipo destino for diferente de Object. Veja o
cdigo abaixo:

public class TesteArrayList4 {
public void print( ArrayList al )
{
for( int i = 0; i < al.size(); i++ )
{
Estudante e = (Estudante)al.get(i);
e.exibir();
}
}}

A verso 1.5 do Java introduziu o conceito de listas de tipos
especficos. Assim, o casting anterior no mais necessrio.
168

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Para fazer uso desta maravilha do Java 5 use parnteses
angulares ( <Tipo>) para definir o tipo de sua lista.

Exemplo:
public class TesteArrayList {
public void static main( String args [] ) {
ArrayList<Integer> li = new
ArrayList<Integer>();
li.add( new Integer(1) );
li.add( 2 );
for (int i=0; i < li.size(); i++) {
int n = li.get(i);
System.out.println( n );
}
} }

15.5 Mapeamentos

Um Map (mapeamento) define mapeamentos de chaves para
valores. Ele no permite chaves duplicadas, ou seja, as chaves
so nicas e cada chave mapeia no mximo um valor.

Em Java o HashMap um dos mapeamentos mais utilizados.

Exemplo:
import java.util.*;
public class TesteHashMap {
public static void main( String args[] )
{
HashMap hm = new HashMap();
Estudante e = new Estudante( Maria );
EstudanteMonitor em =
new EstudanteMonitor( Joo );
hm.put( A, e );
169


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
hm.put( B, em );
hm.put( C, new Object());
hm.put( D, new Integer(12);
...

Perceba que tanto a chave como o valor devem ser objetos
(Object).

Veja a relao dos principais mtodos disponveis para
mapeamentos:

int size(): retorna o tamanho do mapeamentos.

boolean isEmpty(): retorna true se o
mapeamento estiver vazio.

boolean put(Object key, Objetct value):
insere um mapeamento, isto , um par key, value,
tambm chamado de entrada.

170

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Object get(Object key): retorna o valor para
o qual a chave (key) mapeada ou null se nenhum
mapeamento for encontrado.

Object remove(Object key): remove um
objeto do mapeamento.

boolean containsKey(Object o): verifica se
a chave existe.

boolean containsValue(Object o): verifica
se o valor existe.

void clear(): remove todos os elementos do
mapeamento.

Para resgatar um objeto de um HashMap faa como o cdigo
exemplo abaixo:

...
// Buscando o estudante 1
Estudante e1 = (Estudante)hm.get( 1 );
// Buscando o estudante 2
EstudanteMonitor e2 =
(EstudanteMonitor)hm.get( 2 );
e1.exibir();
e2.exibir();
}
}
15.6 Mapeamentos Genricos

A verso 1.5 do Java tambm possui HashMaps de tipos
171


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
especficos. Veja o exemplo:

public class TesteArrayList {
public void static main( String args [] ) {
HashMap<Integer, String> hm =
new HashMap<Integer, String>();
hm.put( 2, "Maria" );
hm.put( 7, "Pedro" );
hm.put( 5, "Madalena" );
String s = hm.get(7);
System.out.println( s );
}
}


NO ESQUECER:


Se voc precisa acessar a lista sequencialmente, use
um ArrayList.

Se voc precisa acessar a lista aleatoriamente,
utilizando uma chave de busca, use HashMap.

15.7 Vamos Treinar?

a) Implementar uma classe Turma com as seguintes
caractersticas:
Nome da turma;
Um array de estudantes de tamanho 10;
Um inteiro numEstundates para contar os estudantes
matriculados na turma;
172

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java

Inclua os seguintes mtodos:

void matricular (Estudante e) inclui estudante na
turma;
void listar mostra os dados de todos os estudantes
da turma;
Estudante pesquisar (int matricula) procura no
array o estudante de matrcula igual ao parmetro
passado e o retorna;
void trancar (int matricula) exclui estudante da
turma;
void trancar (Estudante e) exclui estudante da
turma

b) Implementar um programa TesteTurma com as
seguintes funcionalidades:

cria trs estudantes diferentes (estudante, tutor e
estagirio);
matricula os trs estudantes;
lista os trs estudantes;
pesquisar um dos estudantes e exibir seus dados;
excluir estudantes usando as duas maneiras
diferentes.

c) Crie uma classe TurmaArrayList para funcionar com
estrutura de dados redimensionvel dinmicamente
(ArrayList, por exemplo) ao invs de array. necessrio
modificar todos os mtodos.

d) Escrever uma classe TesteHashMap que cria um map
173


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
de tipos especficos que tem como chaves nmeros
inteiros (Integer) representando as matrculas dos
estudantes, e como valor os respectivos objetos da
classe Estudante.

Crie trs instncias de estudante e os inclua no map.
Depois, consulte o map utilizando a matrcula de algum
estudante, exibindo os dados do estudante consultado.



16. NO FUI EU...











Neste captulo vamos
aprender como
dominar as possveis
excees que podem
ocorrer em um
programa.
Java is Everywhere

175


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
16.1 Introduo

Na execuo de um programa, vrias situaes
so passveis de gerar erros. As operaes
podem gerar diferentes tipos de erros devido a:

Ambiente de execuo
Ex: Acesso a arquivo; acesso rede; falta de memria; entre
outros.

Erros de programao
Ex: Dividir por zero; acessar um array fora dos limites de seu
tamanho; entre outros.

Condies de negcio do programa
Ex: Retirar dinheiro de uma conta sem saldo; diminuir o
salrio de um funcionrio; atribuir uma nota invlida a um
aluno; entre outros.

Na maioria das linguagens de programao, o tratamento de
erros feito geralmente atravs de testes condicionais,
usando if por exemplo, com auxlio de variveis booleanas.
Vamos relembrar o tratamento de situaes onde poderiam
ocorrer erros durante a atribuio da nota de um estudante.

void atribuirNota(int numProva, double nota) {
if ( nota >= 0 && nota <= 10.0 )
{
notas[numProva-1] = nota;
}
}

176

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Se tentarmos atribuir uma nota invlida a uma prova, a
atribuio no ser realizada. Caso no se consiga efetuar a
atribuio, como o mtodo que chamou atribuirNota ficar
sabendo da no realizao da operao?

void processarNota(e, numProva, nota)
{
e.atribuirNota(numProva, nota);
}

Vamos retornar, ento, um valor booleano para indicar o
sucesso ou no da operao.

boolean atribuirNota(int numProva, double
nota){
if ( nota >= 0 && nota <= 10.0 ) {
notas[numProva-1] = nota;
return true;
} else return false;
}

Agora sim, com a nova verso do nosso mtodo
processarNota, podemos tratar esse valor booleano.

void processarNota(e, numProva, nota)
{
if ( !e.atribuirNota(numProva, nota) ) {
System.out.println(Nota Invalida!);
}

PENSE RPIDO: e se o mtodo processarNota no tratar
o erro? O que pode acontecer?


177


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
16.2 Excees em Java

Java prov um mecanismo diferenciado, chamado de Excees
(Exceptions), que estrutura o tratamento de erros e garante
robustez aos sistemas. Uma exceo um sinal que indica a
ocorrncia de alguma condio excepcional.

O compilador Java obriga o usurio da classe a tratar os
possveis erros que um mtodo pode gerar (linguagem
fortemente tipada).

As excees possui um cenrio tpico:

tente fazer algo
faa alguma coisa 1;
faa alguma coisa 2;
faa alguma coisa 3;
capture se ocorrer uma exceo tipo 1:
faa um tratamento especial para exceo do
tipo 1;
capture se ocorrer uma exceo tipo 2:
faa um tratamento especial para exceo do
tipo 2;
...
finalmente:
faa algo final (sempre);

A primeira coisa a fazer para se criar uma exceo definir
uma classe que representa a exceo. Toda nova exceo
deve herdar da classe Exception.

public class NotaInvalidaException
extends Exception
{ }
178

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
H um padro para nomes de Excees, onde os eles
terminam sempre com a palavra Exception.

A classe Exception representa as excees que podem ser
disparadas, capturadas e tratados pelos programas. Cada
exceo especfica subclasse de Exception e contm
informaes sobre o problema ocorrido. Os principais
mtodos para excees:

Exception(): construtor que cria uma exceo.

Exception(String msg): construtor que cria
uma exceo com a mensagem de erro msg.

String getMessage(): retorna a mensagem
especfica daquela exceo.

void printStackTrace(): imprime a pilha de
execuo no momento em que ocorreu o erro.

OBSERVAO: antes de criar uma nova classe de exceo
interessante verificar se j existe alguma igual ou similar
desejada na API Java. Observe o cdigo abaixo:

class TesteExcecao {
public static void main(String argv[]) {
int d1,d2;
d1 = 10;
d2 = 0;
System.out.println(d1/d2);
}
}

179


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
O cdigo acima vai resultar no seguinte erro quando
executado:

Exception in thread "main"
java.lang.ArithmeticException: / by zero at
TesteExececao.main(TesteExececao.java:6)
Press any key to continue...

Isso ocorre porque se tentou dividir um inteiro por zero,
indicada na mensagem do sistema por
ArithmeticException, uma exceo que j est
disponvel na linguagem Java, assim com uma srie de outras
excees. Vamos conhecer a seguir um pouco da hierarquia
de Excees do Java:





180

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
16.3 A Clusula throws

Agora que j criamos a nossa exceo, devemos definir os
mtodos que podem dispar-la. Isto feito usando a clusula
throws (dispara).

Exemplo:
void atribuirNota(int numProva, double nota)
throws NotaInvalidaException {
if ( nota >= 0 && nota <= 10.0 ) {
notas[numProva-1] = nota;
}
}

Assim, dizemos que o mtodo atribuirNota pode disparar
uma exceo, possibilidade essa que deve ser
convenientemente tratada pelos mtodos que chamam o
mtodo atribuirNota.

16.4 A Sentena throw

Agora o prximo passo disparar a exceo dentro do mtodo
atribuirNota, quando ela ocorrer. Isto feito usando a
sentena throw (disparar).

Exemplo:
void atribuirNota(int numProva, double nota)
throws NotaInvalidaException {
if ( nota >= 0 && nota <= 10.0 ) {
notas[numProva-1] = nota;
} else
throw new NotaInvalidaException(); }
181


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Como excees so classes, antes de disparar uma exceo,
temos que criar o objeto. Eis o porqu da construo abaixo:

throw new NotaInvalidaException();

Fazendo assim, todo mtodo que chama o mtodo
atribuirNota deve tratar a possibilidade de ser gerada
uma exceo.

Perceba a diferena:

throws: indica que o mtodo pode disparar uma
exceo;
throw: dispara a exceo.

16.5 O bloco try-catch

Depois que criamos a nossa classe de exceo, sinalizamos os
mtodos que a podem disparar, e inserimos o momento em
que o disparo acontece, temos agora que fazer a captura e o
tratamento com try - catch.

Exemplo:
void processarNota() {
try
{
Estudante e = new Estudante();
e.atribuirNota(1, 11.0);
}
catch (NotaInvalidaException e)
{
System.out.println(Erro na atribuio de
182

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
nota!);
}
}

O bloco try-catch possui ainda uma terceira parte
opcional chamada finally. O bloco finally, quando
existe, sempre executado, ocorrendo ou no uma exceo.

O bloco finally geralmente usado para fechar conexes
com banco de dados, resetar variveis, enfim, aes que
devem ser tomadas caso erros ocorram ou no.

Exemplo:
try {
Estudante e = new Estudante();
e.atribuirNota(1, 11.0);
} catch (NotaInvalidaException e) {
System.out.println(Erro na atribuio
nota!);
} finally {
System.out.println(Sempre passa aqui!);
}

Todas as excees disparadas por um mtodo tm que ser
listadas na assinatura do mtodo.

Exemplo:
void atribuirNota(int numProva, double nota)
throws NotaInvalidaException,
ProvaInvalidaException
{
if ( nota < 0.0 || nota > 10.0 )
throw new NotaInvalidaException();
else if ( numProva < 1 || numProva > 4 )
throw new ProvaInvalidaException();
183


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
else
notas[numProva-1] = nota;
}















16.6 Adicionando Informaes nas
Excees

A gente viu que novos tipos de excees podem ser criados
estendendo-se a classe Exception ou suas subclasses. As
novas excees podem disponibilizar informaes extras
sobre o erro ocorrido para ajudar na soluo.

Lembre-se que excees so classes, ento podemos definir
variveis e mtodos, permitindo assim prover mais
informaes sobre as causas do problema ocorrido e sua
efetiva soluo.



Java permite vrios blocos catch, cada um tratando uma
exceo especfica, ou nenhum.

No caso de tratar vrias excees usando vrios blocos
catch, as excees mais especficas devem vir antes das
mais genricas, pois a primeira exceo que o sistema
conseguir casar tem seu bloco catch executado.
184

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo:
public class NotaInvalidaException extends
Exception
{
private double notaInvalida;
public double getNotaInvalida() {
return notaInvalida;
}
public NotaInvalidaException( double nota ){
super(Nota Invalida);
notaInvalida = nota;
}
}

Agora o mtodo que vai tratar a exceo pode fazer chamada
aos mtodos disponibilizados pela exceo como se estivesse
usando um objeto comum:

void processarNota() {
try {
Estudante e = new Estudante();
e.atribuirNota(1, 11.0);
}
catch (NotaInvalidaException e) {
System.out.println( e.getMessage() );
System.out.println(A nota invlida
+e.getNotaInvalida()); } }

16.7 Vamos Treinar?

a) Implementar a classe de exceo
NotaInvalidaException armazenando tambm
o nmero da prova.

185


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
b) Alterar o mtodo atribuirNota para disparar uma
exceo caso seja tentado atribuir uma nota invlida.

c) Alterar o programa TesteEstudante para criar um
estudante e tentar atribuir notas a ele, oferecendo um
cdigo seguro atravs do bloco try-catch-
finally.

d) Criar uma nova exceo chamada
ProvaInexistenteException, que valida se o
nmero da prova que se deseja atribuir est dentro
dos limites do array de notas.

e) Alterar o mtodo atribuirNota para tambm
disparar uma exceo caso seja tentado atribuir uma
nota a uma prova inexistente.

f) Alterar o programa TesteEstudate para proteger o
cdigo contra erros de prova inexistente.

g) Implementar para a classe Turma o tratamento de erro
das seguintes situaes:

Criar uma turma, mas o nome veio nulo;
Matricular o estudante, mas o estudante veio nulo;
Pesquisar estudante, mas no existe estudante com a
matrcula passada como argumento;
Trancar estudante, mas no existe estudante com a
matrcula igual quela passada como argumento;
Trancar estudante, mas no existe estudante igual
quele passado como argumento.

186

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
h) Identifique outras situaes na classe Estudante, suas
subclasses e na classe Turma onde se poderia usar
excees.



17. MULTITAREFA COM
THREADS






Vivemos em um mundo em que
preciso fazer muitas coisas ao
mesmo tempo. Neste captulo
veremos como trabalhar com
multitarefa em nossos
programas.
Java is Everywhere

188

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
17.1 Introduo

Grande parte dos sistemas operacionais modernos suporta
multitarefa. Um Sistema Multitarefa permite que vrias
atividades ocorram concorrentemente num computador,
como por exemplo, ouvir msica enquanto navega na
Internet.

H dois tipos de Multitarefa:

Multitarefa Baseada em Processo: cada programa
um processo.

Multitarefa Baseada em Thread: cada programa
possui vrias linhas de execuo.

A Multitarefa evita o desperdcio de
tempo da CPU, utilizando o tempo
de forma racional. Quando temos
vrios processos concorrendo
para o uso do processador, cada
processo usar um pouco do
tempo do processador e depois dever
cede a vez para outro processo da fila.
17.2 Threads

Um mesmo programa pode ser executado em mltiplas linhas
de execuo. Cada linha de execuo dentro de um programa
chamado de thread e executada separadamente.

189


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Pense em threads como o suporte a multitarefa dentro de um
mesmo programa.

Por exemplo: no MS Word existe um thread que verifica a
ortografia e permite que voc continue digitando o texto
(outro thread).

Em tempo de execuo, os threads de um programa usam o
mesmo espao de memria e, portanto, compartilham os
dados e cdigo. Java suporta multitarefa baseada em Thread
e prov facilidades de alto nvel para programao usando
multitarefa.

Threads em Java tornam o ambiente de execuo
assncrono, permitindo diferentes tarefas serem executadas
concorrentemente.

Existem duas maneiras de criar um thread em Java:

1) estender a classe Thread e escreva o mtodo
run();

2) implementar a interface Runnable e escreva o
mtodo run().

A classe que estende Thread ou implementa Runnable,
deve ter um mtodo run() que implementar o
comportamento da nova thread.

O cdigo no mtodo run() define um caminho de execuo
independente que termina quando o mtodo finaliza.

190

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
17.3 Estendendo de Thread

A nova classe, que descende de Thread, deve sobrescrever o
mtodo run() para definir o cdigo que ser executado pela
thread. Esta subclasse de Thread pode chamar os
construtores de Thread explicitamente em seus construtores
para inicializar a thread.

O mtodo start() herdado de Thread chamado sobre o
objeto da nova subclasse para tornar a thread candidata a ser
executada.

Exemplo:
public class HelloWorldThread extends Thread {
public void run() {
while ( true ){
System.out.println("Hello World of threads!");
} }

public static void main( String args[] ) {
HelloWorldThread t = new HelloWorldThread();
t.start();
while ( true ){
System.out.println( "Thread 1" );
}
}}

A classe Thread apresenta vrios construtores, dentre eles:
Thread(), Thread(Runnable runner) e
Thread(Runnable runner, String
nomeDaThread).


191


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
O nome da thread pode ser obtido atravs do mtodo
getName().


17.4 Implementando Runnable

Agora vamos ver o procedimento para criar um thread
implementando a interface Runnable:

Assim como foi quando estendemos a classe Thread, a nova
classe tambm deve prover um mtodo run() que ser
executado pela thread.

Um objeto da classe Thread deve ser criado. Um objeto da
nova classe que implementou Runnable ento deve ser
passado como argumento para um construtor da classe
Thread.

O mtodo start() chamado sobre o objeto da classe
Thread criado no passo acima. Isso ativa a nova thread. O
mtodo start() retorna o controle para thread principal
imediatamente aps a nova thread ter sido disparada.

Exemplo:
public class HelloWorldRunnable implements
Runnable {
public void run(){
while ( true ){
System.out.println("Hello World of threads!");
}}


192

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
public static void main( String args[] ) {
HelloWorldRunnable runner = new
HelloWorldRunnable();
Thread t = new Thread( runner );
t.start();
while ( true ){
System.out.println( "Thread 1" );
}
}}

Vantagens de implementar Runnable ao invs de Estender
Thread:

Pensando em orientao a objetos, provavelmente
mais interessante implementar Runnable do que
estender Thread. Estender de Thread significa que
a subclasse no pode estender de outra classe,
enquanto implementando Runnable no perde essa
possibilidade de extenso.

Uma classe pode ter somente a inteno de ser
executvel como uma thread, e portanto herdar todas
as caractersticas da classe Thread seria excessivo.

17.5 Estados de Thread

Um thread ao longo de sua vida no mundo digital pode passar
por diversos estados, como pode ser observado na figura a
seguir:



193


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java


Pronto para Executar: um thread no vai diretamente
para o estado de execuo aps ser criada (start())
ou aps deixar algum dos estados de no execuo.
Ele primeiro vai para o estado de pronto para
executar, significando que agora candidato a ser
executado pelo sistema. Tudo vai depender do
escalonador.

Uma chamada ao mtodo
esttico yield() da classe
Thread suspende a
execuo do thread corrente,
levando-o ao estado de
pronto para executar, e
liberando o processador para
outros threads. Uma vez no
estado de pronto para executar, ele aguardar sua
vez para fazer uso da CPU novamente.

Executando: o processador est realmente executando
o thread. Lembre-se que o escalonador de threads
quem decide qual thread entrar nesse estado.

194

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Morto: um thread chega ao estado de morto ao
completar sua execuo.

No Execuo: um thread pode sair do estado de
execuo e entrar em um dos estados de no
execuo, dependendo da transio. O thread vai
permanecer nesse estado at alguma transio
especial mov-la para o estado de pronto para
executar.

No Execuo Esperando: estando em execuo, um
thread pode chamar o mtodo wait() definido na
classe Object para por a si mesmo em estado de
espera. Esse thread deve ser notificado (notify())
por outro thread para mover-se para o estado de
pronto para executar.



No Execuo Dormindo: uma chamada ao mtodo
esttico sleep(tempo ms) da classe Thread leva
o thread corrente ao estado de dormncia. Ele ir
acordar aps transcorrido o tempo determinado de
dormncia, e migrar para o estado de pronto para
195


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
executar.



No Execuo Bloqueado: um thread em execuo,
ao chamar uma operao requisitando algum recurso
bloqueado, mover-se- para o estado de bloqueado.
Um thread tambm bloqueia se falhar ao tentar
adquirir um monitor de um objeto.

17.6 Alterando a Prioridade

Threads podem ter prioridades que so usadas pelo
escalonador para determinar como elas sero tratadas. O
thread com maior prioridade geralmente colocada para
rodar antes dos demais.

Prioridades so valores inteiros que podem assumir:

1: menor prioridade, indicada pela constante
Thread.MIN_PRIORITY;

10: maior prioridade, indicada pela constante
Thread.MAX_PRIORITY;

196

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
5: se nenhuma prioridade indicada, o thread assume
o valor default definido pela constante
Thread.NORM_PRIORITY;

qualquer outro valor entre Thread.MIN_PRIORITY
e Thread.MAX_PRIORITY.

Para trabalhar com a prioridade de um thread, devem-se usar
os seguintes mtodos:

setPriority() : altera a prioridade da thread;

getPriority() : l a prioridade da thread.




17.7 Sincronizao

Threads compartilham o mesmo espao
de memria, ou seja, podem
compartilhar recursos. Quando
utilizamos mltiplos threads em um
aplicativo podem ocorrer problemas: se
dois threads acessam a mesma varivel
ou o mesmo objeto ao mesmo tempo, e
tentam mudar seu valor, o que fazer?

H situaes onde desejvel ter
Em Java um thread herda a prioridade de
seu pai!
197


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
somente um thread acessando um recurso compartilhado. O
nome disto chama-se sincronizao. Veja o exemplo de cdigo
abaixo e tente identificar algum problema:

class Banco {
public void transferir(Conta ctaOrigem,
Conta ctaDestino, double valor ) {
if (ctaOrigem.getSaldo() < valor )
return;
ctaOrigem.debitar( valor );
ctaDestino.creditar( valor );
}
...
}

O problema do cdigo acima causado pela no atomicidade
do mtodo transferir. A execuo do mtodo pode ser
parada pela metade para que outro thread assuma o controle.

Temos ento que criar uma espcie de semforo para obter
acesso ininterrupto (exclusivo) ao mtodo.

Em Java, isso feito atravs da instruo synchronized.

Existem duas maneiras nas quais um cdigo pode ser
sincronizado:

Mtodos sincronizados: usa o modificador
synchronized e somente um thread executar o
mtodo que foi definido sincronizado de cada vez.



198

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
Exemplo:
class Banco {
public synchronized void transferir(
Conta ctaOrigem, Conta ctaDestino,
double valor ) {
if (ctaOrigem.getSaldo() < valor )
return;
ctaOrigem.debitar( valor );
ctaDestino.creditar( valor );
}
...
}


Blocos sincronizados: tambm utiliza a instruo
synchronized mas agora somente um thread
executar o bloco que foi definido sincronizado por
vez.

Exemplo:
class Banco {
public void transferir(
Conta ctaOrigem, Conta ctaDestino,
double valor ) {
synchronized ( this ) {
if (ctaOrigem.getSaldo() < valor )
return;
ctaOrigem.debitar( valor );
ctaDestino.creditar( valor );
}
}...


199


G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
17.8 Cuidado com os Deadlocks!

Os mtodos ou blocos sincronizados
podem causar uma situao de
impasse conhecida como deadlock.
Um deadlock ocorre quando um
thread bloqueia o acesso a um objeto
e fica esperando por outro objeto,
que por sua vez est bloqueado por
outro thread que est esperando o
desbloqueio do objeto anterior.

Para evitar deadlocks, algumas dicas podem ser seguidas:

1) Mantenha bloqueios o menor tempo possvel;

2) Considere o uso de blocos syncronized ao invs de
mtodos syncronized;

3) Tente escrever cdigo que no precise de mais de um
bloqueio ao mesmo tempo;

4) Crie e use um grande lock ao invs de pequenos locks.
Use essa tcnica de forma que voc tenha excluses
mtuas.

200

G r e e n B e a n s / * P r o g r a m a o D e s c o m p l i c a d a * /


Formao Bsica de Programadores Java
17.9 Vamos Treinar?

a) Escreva uma aplicao que imprima os nmeros pares
de 0 a 1000 em um thread e os mpares em outro.

b) Crie uma aplicao que dado um nmero, calcule o
fatorial em um thread e a srie de fibonacci em outro
thread, imprimindo o resultado de ambos no console.



BIBLIOGRAFIA


DEITEL, H. M.; DEITEL, P.J. - Java Como Programar. So
Paulo: 8. Edio. Editora Pearson- Prentice Hall, 2005.

SIERRA, K., BATES, B. Use a Cabea! Java. Rio de
Janeiro: Alta Books, 2006.

___________________. SCJP: Certificao Sun para
programador Java 5. Rio de Janeiro: Alta Books, 2007.