O que JAVA?
Java uma linguagem de programao muito poderosa, que serve para desenvolver
programas que rodem em qualquer computador. Vamos detalhar este conceito mais adiante,
mas primeiro vamos entender o que um programa e como ele funciona.
O que um Programa?
Se voc j usou um computador provavelmente usou um dos programas mais
conhecidos como editor de texto (Word, Writer, etc), navegadores de internet (Internet
Explorer, Firefox, etc), tocadores de msica ou DVDs (Windows Media Player, etc) ou outros.
Tomemos como exemplo um editor de textos (como o Word). Quando aprendemos a
usar o editor de texto basicamente temos que aprender a usar os menus e botes que
aparecem na tela principal. No precisamos saber o que est por trs dos botes que clicamos.
Quando selecionamos uma palavra no texto que estamos escrevendo e clicamos no boto
negrito, sabemos que a palavra selecionada fica em negrito, mas no paramos para pensar
em porque isso acontece.
Um computador foi feito para executar instrues. Se ns ligamos o computador e no
passamos nenhuma instruo a ele, ele no faz nada. No passado, os computadores eram bem
simples e quando eram ligados apresentavam uma tela preta com um cursor piscando, o que
era a forma dele dizer ao usurio Estou esperando que voc me passe alguma instruo.
Naquele tempo anda no existiam Sistemas Operacionais grficos como o Windows com
figuras, janelas e botes para serem clicados com o mouse. Alis, nem mouse existia, o
computador era praticamente uma mquina de escrever incrementada, na qual voc passava
as instrues digitando no teclado e aps teclar ENTER o computador executava a instruo
que voc tinha digitado, apresentava o resultado na tela (em forma de texto) e ficava
novamente piscando o cursor espera de novas instrues.
Ento se voc digitasse uma instruo como Mostre a data e a hora e teclasse
ENTER ele mostraria a data e a hora e depois ficaria piscando espera de outra instruo. Se
voc digitasse Escreva BOM DIA na tela, ele escreveria e ficaria piscando e esperando
novamente. Se voc colocasse um disquete no leitor de disquetes e digitasse copie o arquivo
manual.doc para o disquete ele copiaria e ficaria novamente piscando esperando a prxima
instruo.
Se voc tinha apenas algumas instrues para passar para ele, tudo bem. Mas, imagine
que para realizar alguma tarefa mais complexa, como escrever um relatrio, por exemplo,
voc precisasse passar dezenas, ou mesmo centenas dessas instrues, na base do passainstruo-e-tecla-ENTER, passa-outra-instruo-e-tecla-ENTER, e assim por diante, digamos,
duzentas vezes. J imaginou o trabalho? Agora imagine que no dia seguinte voc tivesse que
fazer outro relatrio e tivesse que passar as mesmas duzentas instrues de novo?
Pois , antes de inventarem os programas, no tinha jeito. A cada vez que voc quisesse
repetir aquela operao, tinha que passar as instrues para o computador, uma de cada vez e
aguardar que ele executasse a instruo antes de passar para a prxima e assim
sucessivamente.
Foi a que algum criou um arquivo e colocou em cada linha do arquivo uma instruo.
E disse ao computador Siga as instrues do arquivo. Pronto, estava criado o programa. A
partir da bastava passar ao computador uma nica instruo Execute o arquivo tal que ele
encontrava o arquivo, lia uma linha de cada vez e ia executando uma a uma. Ou seja, no
nosso exemplo do relatrio, voc s ia ter o trabalho de digitar as duzentas instrues no
arquivo uma nica vez e salvar o arquivo. Depois, a cada vez que voc quisesse criar um
Fig. 1
000011010011000010001010000001010011
Fig. 2
Fig. 3
Era bem mais trabalhoso escrever um programa porque eram necessrias muitas
dessas instrues curtas para realizar qualquer tarefa menos as mais simples. Alm disso,
eram linguagens muito difceis de aprender porque no eram to prximas da nossa
linguagem. De qualquer modo era bem mais fcil do que ficar digitando centenas de 0s e 1s. A
figura 2 mostra o mesmo trecho da figura 1 em linguagem de mquina. Essas linguagens eram
chamadas de Linguagens de Baixo Nvel porque estavam mais prximas da linguagem do
computador do que da nossa. Dentre as linguagens de baixo nvel, a mais usada era o
Assembly.
Com o tempo foram surgindo as Linguagens de Alto Nvel, que esto mais prximas da
nossa linguagem do que da linguagem do computador. Eram linguagens mais fceis de
aprender e usar porque era quase como re-aprender a falar usando um conjunto reduzido de
palavras e regras de sintaxe, regncia e concordncia. Para ilustrar, a figura 3 traz a mesma
instruo das figuras 1 e 2, escrita em PASCAL.
Dentre as linguagens de alto nvel que mais se popularizaram podemos citar: o
FORTRAN, o COBAL e o PASCAL. Cada uma tinha caractersticas que facilitavam um uso
especfico e tinham suas legies de fs.
O mesmo acontece com a nossa linguagem. Se pegarmos a palavra cola, por exemplo.
Em portugus cola significa substncia adesiva. Mas se eu for para a Argentina ou Espanha,
as pessoas vo entender outra coisa, porque cola em espanhol quer dizer rabo, cauda de
animal. E se eu for para os EUA, eles entendem uma coisa diferente, porque cola em ingls
quer dizer bebida gasosa. a mesma seqncia de quatro letras, mas cada linguagem
compreende de uma forma diferente.
Voltando ao nosso compilador, ns vimos que para poder fazer a traduo, o compilador
tinha que conhecer a linguagem de programao e a linguagem do computador. A linguagem
de programao era uma s porque cada linguagem tinha o seu prprio compilador
desenvolvido sob medida para ela (um compilador PASCAL s traduz programas escritos em
PASCAL, um compilador COBOL s traduz programas escritos em COBOL, e assim por diante).
Mas a linguagem de mquina era diferente dependendo do fabricante. Como resolver? Simples.
O desenvolvedor da linguagem de programao escolhia um padro de computadores e criava
seu compilador para aquele padro. Com isso, a linguagem ficava restrita quele padro, s
podendo ser usada nele. Quem comprasse um computador IBM s poderia rodar nele os
programas escritos nas linguagens de programao compatveis com o padro IBM. Quem
comprasse um computador da Apple teria que escolher programas escritos em outras
linguagens, desenvolvidos para rodar na Apple.
Essa estrutura de circuitos, componentes e etc., (hardware) bem como o sistema
operacional e programas que fazem o computador funcionar (software), esse padro que
variava de acordo com o fabricante chamado de plataforma.
Com o tempo, alguns fabricantes desistiram de suas plataformas e passaram a fabricar
os seus componentes seguindo o padro estabelecido por outro. Foi o que aconteceu quando a
IBM abriu o seu padro para que outros pudessem copiar. O que poderia parecer loucura,
acabou se revelando uma estratgia genial porque vrios fabricantes de componentes
(impressoras, monitores, teclados, etc) comearam a fabricar seus componentes para o padro
IBM. Com o aumento da oferta os preos caram e cada vez mais as pessoas compravam
computadores IBM porque tinha mais oferta de componentes de vrios fabricantes e preos
mais baixos, todos compatveis com o seu computador. claro que alm dos componentes,
surgiram fabricantes que faziam no apenas um teclado ou mouse, mas todo um computador
seguindo o padro IBM e passando a concorrer diretamente com os computadores fabricados
pela prpria IBM. Eram os clones IBM. Mas sempre houve, como hoje, quem preferisse
comprar um produto de marca a comprar um produto genrico. Com isso as vendas da IBM
dispararam e o padro dominou o mercado.
Outros fabricantes que no aderiram plataforma IBM, ou faliram ou mantiveram sua
plataforma fechada. o caso da Apple que hoje fabrica os computadores Mac. A Apple tem que
desenvolver tudo, desde a placa-me at o software. No existem vrios fornecedores para
voc comparar preos. Ou voc compra deles ou no. por isso que os Mac so to mais caros
em comparao com outros computadores.
Atualmente existem apenas quatro ou cinco plataformas (hardware e software) que
dominam o mercado. Com este nmero reduzido de plataformas uma Linguagem de
Programao no precisa mais ficar presa a um nico padro, como no passado. Ao invs de
escolher uma nica plataforma e criar um compilador para ela, o que os desenvolvedores
fazem criar um compilador para cada plataforma. Por exemplo, a linguagem Perl tem um
compilador Perl para Windows, outro para Linux, outro para Solaris e outro para Mac. Essas
linguagens so chamadas de Linguagens Multiplataforma, justamente porque desenvolveram
compiladores para cada uma das plataformas existentes. Agora um programador pode escolher
qualquer linguagem multiplataforma para escrever seus programas, pois sabe que poder
rod-los em qualquer plataforma.
S que tem mais um pequeno detalhe: lembram que ns vimos que o programador
escreve o cdigofonte e depois tem que compilar este cdigo-fonte para gerar o cdigobinrio, que o cdigo que o computador entende? E que cada computador, dependendo da
sua plataforma, entende o cdigo-binrio (a seqncia de 0s e 1s) de maneira diferente? Isto
significa que o cdigo-binrio que foi gerado por um compilador Windows no poder ser
usado para rodar o programa em um computador Linux, nem em um Mac e nem em um
Windows, porque eles iro entender tudo errado. Para rodar em uma mquina Linux, o
programador ter que compilar o cdigofonte outra vez, usando um compilador Linux, que ir
gerar um cdigo binrio Linux, que os computadores Linux entendem. E o mesmo processo
para os computadores Mac e Windows.
O cdigofonte o mesmo. S o que vai mudar so os cdigos-binrios. Precisa de um
binrio diferente para cada tipo de plataforma. Pode parecer meio trabalhoso, mas melhor do
que ficar preso a uma nica plataforma.
Para ajudar a compreender, vamos fazer uma comparao com a nossa linguagem.
Imaginemos que eu sou um escritor e escrevi um livro para ser vendido aqui no Brasil. Se eu
no quiser que o meu livro fique encalhado nas prateleiras, claro que vou ter que escrever
em portugus. Agora suponhamos que eu fechei um contrato com editoras de outros pases
para vender meus livros na Itlia, Rssia e China. Ora, eu no posso enviar meus livros em
portugus porque ningum vai entender nada. Ento eu contrato um tradutor (compilador) de
italiano que vai ler o meu livro em portugus (cdigofonte) e escrever a verso do livro em
italiano (cdigo-binrio). Agora eu posso vender (executar) a verso em italiano do livro
porque todas as pessoas (computadores) que vivem naquele pas (plataforma) vo conseguir
entender.
Porm eu no posso vender essa verso em italiano na Rssia, pois os russos no vo
entender. Ou seja, eu no posso aproveitar o trabalho de traduo (compilao) que j foi
feito. Eu tenho que chamar um outro tradutor (compilador) para traduzir o meu livro do
portugus (cdigofonte) para o russo (cdigo-binrio) de modo que as pessoas
(computadores) que vivem na Rssia (plataforma) consigam entender. E assim por diante, o
mesmo tem que ser feito para a China ou qualquer outro pas (plataforma) onde eu queira
vender meu livro.
Eu s precisei escrever o meu livro (programa) uma nica vez usando a Lngua
Portuguesa (linguagem de programao). Mas o processo de traduo (compilao) que
transforma o meu livro do portugus (cdigofonte) para outro idioma (cdigo-binrio) teve
que ser feito vrias vezes, uma para cada pas (plataforma) que escolhi para vender (executar)
meu livro (programa).
Ficou claro? Ento vamos seguir em frente.
Bom, e a surgiu no mercado a linguagem JAVA. Seria de se esperar que os criadores
do Java fizessem como as outras linguagens e criassem um compilador Java para cada
plataforma existente. Mas eles fizeram uma coisa diferente: criaram um conceito chamado
Mquina Virtual Java, a JVM (a sigla vem do ingls, Java Virtual Machine). Graas JVM, os
programadores no precisavam mais compilar vrias vezes o seu cdigofonte, uma vez para
cada plataforma. Escrevendo seu programa em Java, bastava compilar uma nica vez e o
cdigo resultante poderia ser executado em qualquer computador de qualquer plataforma.
Essa caracterstica era enfatizada pelo seu slogan: escreva uma vez, execute em qualquer
lugar.
Esta praticidade incomparvel fez do Java um sucesso instantneo. Lanado em maio
de 1995, Java foi adotado mais rapidamente do que qualquer outra linguagem de programao
na histria da computao. Em 2003, o Java atingiu a marca de 4 milhes de desenvolvedores
em todo o mundo. Ele continuou crescendo e hoje uma referncia no mercado de
desenvolvimento de software, estando presente em toda parte: desde mainframes, sistemas
operacionais e navegadores de internet, at celulares, palmtops e cartes inteligentes entre
outros.
Mas espere a! Se o programador tinha que compilar o seu cdigofonte escrito em Java
e como resultado da compilao tinha um cdigo executvel, igualzinho acontecia nas outras
linguagens, como que computadores de outras plataformas conseguiam entender aquele
10
cdigo que tinha sido gerado em uma plataforma diferente da sua? Que mgica era essa? o
que ns vamos descobrir no prximo tpico.
Cdigo Binrio
Compilador
001010100
010001100
101100011
100001000
Figura 4
11
acontecer. A maioria dos Sistemas Operacionais j vem com a JVM instalada. E quando no
vem, basta entrar no site da Sun (desenvolvedora do Java), fazer o download e instalar.
Mas voltando a JVM, dissemos que um computador com a Mquina Virtual JAVA
instalada entende a linguagem de mquina nativa de sua plataforma (os 0s e 1s do cdigobinrio) e tambm a linguagem de mquina do JAVA. E o que essa linguagem da mquina do
Java? So justamente os bytecodes que foram gerados pelo compilador do Java quando
compilamos nosso cdigofonte.
Recapitulando: nas linguagens compiladas tradicionais ns escrevemos o programa em
um editor de texto gerando o cdigo-fonte. A seguir compilamos o cdigo-fonte usando o
compilador de uma determinada plataforma para gerar o cdigo-binrio nativo daquela
plataforma. Em seguida rodamos o cdigo-binrio e o computador l as instrues do binrio e
os executa.
No Java o processo quase o mesmo, a diferena que entre o programador e o
computador de verdade existe um computador virtual: a Mquina Virtual Java. O processo com
Java fica assim: ns escrevemos o programa em um editor de textos gerando o cdigo-fonte.
A seguir compilamos o cdigo-fonte usando o compilador Java para gerar o cdigo-Java
(bytecode). Em seguida rodamos o bytecode e o computador virtual Java (a JVM) l as
instrues do bytecode e as transforma em instrues de mquina escritas em cdigo-binrio
nativo da plataforma do computador de verdade. Finalmente, o computador de verdade recebe
as instrues passadas pela JVM e as executa. A figura abaixo ilustra o processo:
BYTECODE
Cdigo-fonte
class BomDia {
println(Ol!);
}
Compilador
JAVA
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
JVM
0010110100.
..
Figura 5
Observe o trecho da figura que ilustra a JVM. De um lado ela recebe um arquivo com o
bytecode e do outro ela gera cdigo-binrio para o computador de verdade. Ou seja, ela l o
bytecode e traduz para o cdigo-binrio.
Ora, mas ento a JVM um tradutor, ou seja, um compilador? Exatamente.
A diferena da compilao no Java para a compilao nas outras linguagens que nas
linguagens tradicionais a compilao feita em uma etapa e no Java ela feita em duas
etapas.
Nas linguagens compiladas tradicionais o cdigo-fonte lido pelo compilador, que gera o
cdigo binrio, que executado pelo computador (ver fig.4).
No Java o cdigo-fonte lido pelo compilador-Java, que gera o bytecode, que lido pela
JVM, que gera o cdigo-binrio, que executado pelo computador (ver fig5).
Mas se a JVM gera cdigo binrio (0s e 1s) para o computador e cada plataforma
entende esses 0s e 1s de maneira diferente, eu no teria que ter uma JVM diferente para cada
plataforma? Sim. Do mesmo modo que quem criava uma linguagem tinha que criar tambm
um compilador para cada plataforma, tambm os criadores do Java tiveram que fazer uma JVM
para cada plataforma. E cada JVM gera o cdigo-binrio correspondente sua plataforma que
os computadores daquela plataforma conseguem ler e executar.
12
class BomDia{
println(Bom Dia!);
}
Compilador
Java
Bytecode
Bytecode
JVM
01000110
Figura 6
Bytecode
JVM
JVM
10111001
00110100
13
14
15
Uma vez definidos os dados com os quais vamos trabalhar temos que definir o que
fazer com eles. preciso definir os procedimentos para cada tipo de situao e escrever as
instrues que o computador deve seguir dentro de cada procedimento.
Por exemplo, se um cliente aluga um DVD eu tenho que ter um procedimento para
registrar isso no computador.
Se algum perguntar se ns temos um determinado filme para alugar, precisamos de
um procedimento para fazer uma pesquisa no nosso acervo de filmes para ver se ns temos
aquele filme e se ele est disponvel ou alugado.
Se eu quero um relatrio que me mostre quais os filmes mais alugados naquele ms,
eu preciso ter definido um procedimento para pesquisar os dados e gerar um relatrio.
Para ser um bom programador, independente da Linguagem que voc escolher para
escrever os seus programas, voc ter que aprender e dominar dois aspectos da programao:
o algoritmo e a estrutura de dados.
Um algoritmo uma seqncia de passos, bem definidos, necessrios para realizar uma
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Releia a definio de algoritmo que demos no incio do tpico. Veja que usamos o adjetivo
bem-definidos. Pode parecer brincadeira, mas uma das coisas mais difceis escrever instrues
claras e precisas sem deixar margem a dvidas.
Na receita de bolo, a expresso at obter um creme liso pode fazer a diferena entre um
bolo bem feito e um desastre total. Expresses como at ficar com consistncia firme ou outras,
muito comuns em receitas, podem querer dizer uma coisa para quem est escrevendo a receita e ser
16
entendidas de forma diferente por quem est lendo, principalmente se for uma pessoa com pouca
experincia em cozinhar.
J nas instrues para a troca de pneu, a instruo 4 (Levante o carro) deveria ter sido
escrita como Use o macaco para levantar o carro.
Voc deve estar pensando Pera, ningum vai ser burro a ponto de levantar o carro com as prprias
mos!. Pode ser, mas esse s um exemplo de algoritmo mal escrito. Se voc analisar direito vai
ver que a instruo 2 diz para pegar o macaco, a instruo 3 diz para colocar o macaco do lado do
pneu furado e a instruo 11 diz para guardar o macaco. Em nenhum lugar est dizendo para usar o
macaco.
Se eu tivesse escrito este algoritmo, poderia me defender dizendo Tudo bem, eu no deixei
claro, mas voc entendeu o que eu quis dizer .... Num exemplo como esse at d pra entender, mas
em outros no. s vezes, deixamos instrues claras e bem detalhadas para algum realizar alguma
tarefa e quando vamos ver a pessoa fez tudo diferente do que ns queramos. E a pessoa jura que
seguiu exatamente o que estava escrito nas instrues ... a que percebemos que o que estava claro
para ns no era assim to claro para os outros.
A nossa comunicao normal cheia de coisas no ditas mas que os outros entendem, como
no exemplo da troca de pneu. Ou ento de coisas ditas de um jeito mas querendo dizer outro. Se
dizemos a algum Coma um prato de arroz, bvio que queremos que a pessoa coma o arroz e
no o prato.
Porm temos que ter em mente que quando estamos escrevendo para o computador, estamos
passando orientaes para o usurio mais burro e confuso que existe. Ele leva tudo ao p da letra.
Com ele no tem essa de Voc entendeu o que eu quis dizer .... Para escrever para o computador,
voc no pode querer dizer apenas. Voc tem que dizer exatamente o que voc quer em instrues
claras, de preferncia curtas, sem deixar nenhuma margem erros de interpretao como Levante
o carro, Coma um prato e etc. Se estivssemos escrevendo um programa para um computadorcozinheiro, ao invs de passar uma instruo Coloque a mistura no tabuleiro quando estiver fria,
deveramos dizer Coloque a mistura no tabuleiro quando atingir a temperatura de 18 graus
Celsius..
Numa faculdade de informtica, antes de aprender uma linguagem de programao de
verdade, os alunos passam meses aprendendo a escrever algoritmos em pseudo-cdigo, uma
linguagem que no existe de verdade (da o termo pseudo-cdigo). Um programa escrito em
pseudo-cdigo no pode ser compilado e colocado para executar. tudo escrito em portugus
mesmo, simulando uma linguagem de computador, s pra pegar o jeito. A Figura 16 mostra um
exemplo.
Leia NOTA1
Leia NOTA2
MDIA = (NOTA1 + NOTA2) / 2
Imprima MDIA
17
Nos algoritmos do bolo de cenoura e da troca de pneu fizemos uma lista de passos simples
para serem executados em seqncia. Problemas mais complexos exigem algoritmos mais
complexos com estruturas de deciso e de repetio.
Nas estruturas de deciso, testamos uma determinada condio e executamos (ou no) uma
ou mais instrues dependendo do resultado do teste. Veja na Figura 17 um trecho do algoritmo do
pneu alterado para incluir uma estrutura de deciso.
Pegue o estepe
Verifique se o estepe est cheio
SE o estepe est vazio ENTO Leve o estepe para encher no
borracheiro
Coloque o estepe no suporte
...
Fig 17 Pseudo-cdigo com estrutura SE-ENTO
A instruo Leve o estepe para encher no borracheiro s ser executada se o estepe estiver
vazio. Uma estrutura de deciso mais completa apresenta instrues para o caso da condio testada
ser verdadeira e para o caso dela ser falsa. Veja um exemplo aplicado Locadora de DVDs.
Verifique a classificao-etria do filme
Verifique a idade-cliente
SE (classificao-etria = proibido para menores de 18 anos) e
(idade-cliente < 18 )
ENTO Pea ao cliente para escolher outro filme
SENO Alugue o filme
Fig 18 Pseudo-cdigo com estrutura SE-ENTO-SENO
As estruturas de repetio permitem executar as mesmas instrues diversas vezes,
enxugando um cdigo que de outra forma ficaria muito grande. Na Figura 16 vimos um cdigo
para calcular a mdia das notas de um aluno. Imagine que queremos calcular a mdia de cada aluno
de uma turma com 50 alunos. Para no ter que escrever as mesmas instrues 50 vezes, usamos
uma estrutura de repetio. A Figura 19 mostra um exemplo.
ENQUANTO (existem-alunos-cuja-mdia-ainda-no-foi-calculada) FAA
Leia NOTA1
Leia NOTA2
MDIA = (NOTA1 + NOTA2) / 2
Imprima MDIA
Passe para o prximo aluno
FIM DO ENQUANTO
Fig 19 Pseudo-cdigo para calcular a mdia de cada aluno da turma
Uma boa idia escrever o pseudo-cdigo antes de escrever o programa. Isso ajuda a definir
a estrutura e a lgica do programa.
18
19
20
Com isso, tivemos uma idia dos conceitos bsicos da Programao Estruturada. No
prximo tpico vamos ver que as limitaes das Linguagens Estruturadas acabaram levando
criao da Programao Orientada a Objetos e vamos aprender o que Modularizao, uma das
caractersticas mais marcantes dessas linguagens.
Modularizao X Abstrao
Como vimos, quando temos um problema e queremos resolv-lo usando um computador,
escrevemos um programa atravs do qual passamos ao computador as informaes dos dados do
problema e de como lidar com esses dados. O grande desafio do programador estabelecer uma
relao entre o mundo real e o modelo que ele vai transportar para o computador.
Na nossa linguagem, s vezes encontramos dificuldade de expressar algo por que no
encontramos as palavras adequadas para isso. Uma criana que est aprendendo as primeiras
palavras naturalmente vai ter a maior dificuldade em descrever um acontecimento, pois ela conta
com um vocabulrio pequeno e no sabe bem como combinar as poucas palavras que conhece.
Na programao isto tambm acontece, afinal estamos lidando com linguagens que so
verses reduzidas da nossa prpria linguagem, lembram? Dependendo dos recursos disponveis para
cada linguagem de programao podemos ter uma maior ou menor dificuldade de reproduzir no
computador as informaes que observamos no mundo real, relativas ao problema que queremos
resolver. Isto geralmente levava o programador a tentar adaptar o problema ao modelo utilizado em
uma determinada linguagem. Se a linguagem escolhida fosse o LISP, o problema seria traduzido
como listas encadeadas. Se fosse PROLOG, o problema seria transformado em uma cadeia de
decises. Assim, as limitaes da linguagem acabavam limitando a representao do problema,
tornando a escrita muito difcil.
Antigamente, os problemas eram mais simples, pois se usavam os computadores para
utilidades especficas dentro das empresas. Ns tnhamos programas feitos para a rea
administrativa (que eram usados para auxiliar os administradores nas tarefas de controle e tomada
de decises), tnhamos programas desenvolvidos para os setores de produo de uma indstria,
tnhamos programas comerciais que eram usados em bancos e lojas, e etc. Mas de uma forma geral,
os programas atendiam apenas o setor para o qual foram desenvolvidos, de modo que era mais fcil
entender aquele universo especfico e transport-lo para dentro do computador, pois os setores no
interagiam tanto entre si e nem trocavam tanta informao como hoje.
Hoje, com o crescimento e a popularizao dos computadores e da internet, a informtica
est presente em todos os setores da nossa vida, e praticamente impossvel fazer qualquer
atividade que no dependa em algum grau de informaes processadas por computadores. Hoje, no
existem mais setores isolados, nem dentro da mesma empresa e nem entre as empresas e instituies
pblicas e privadas. Todo mundo troca informao com todo mundo o tempo todo. Com isso a
representao dos problemas ficou bem mais complicada porque alm de entender e representar os
dados e procedimentos de uma entidade especfica, temos que ver como ela se relaciona com as
outras entidades e como vamos fazer para traduzir estes relacionamentos para o computador.
Digamos que em uma grande empresa um dos setores, o Setor de Pessoal, desenvolveu um
programa que armazena e processa informaes sobre os funcionrios daquela empresa. Ela est
mais interessada nas informaes sobre a vida profissional do funcionrio dentro da empresa, como
data de admisso, cargo que ocupa, salrio, promoes que recebeu, se tem frias a tirar, e etc, alm
de informaes cadastrais como nome, endereo, data de nascimento, sexo ... Mas outros setores
21
tambm precisam coletar e armazenar dados sobre os funcionrios, como por exemplo, o Setor
Mdico, que precisa de informaes especficas da sua rea (tipo sanguneo, histrico de doenas,
etc) mas tambm precisa conhecer e lidar com as informaes cadastrais. Um outro setor, o Setor de
Treinamentos, responsvel por capacitar os funcionrios atravs de cursos, precisa tambm de
informaes especficas de sua rea (nvel de escolaridade, formao acadmica, cursos que j
foram feitos dentro da empresa, etc) alm de informaes comuns a outros setores. E assim por
diante, vamos verificar que vrios setores coletam e processam algumas informaes em comum.
No passado, em uma situao como essa, era muito comum a duplicidade de cdigos.
O Setor de Pessoal definia e escrevia o seu programa, dentro do qual tinha um trecho de
cdigo que era o responsvel por incluir os dados de um funcionrio quando ele era admitido, um
outro trecho que era o responsvel por deletar os dados de um funcionrio que havia sido demitido,
etc. O Setor Mdico, ao escrever o seu programa, tambm tinha que escrever um trecho de cdigo
referente incluso e excluso de funcionrios. Ele no podia aproveitar o pedao de programa que
j tinha sido escrito pelo Setor de Pessoal, porque os programas eram estanques: cada programa
tinha o seu bloco de dados e o seu bloco de instrues e um programa no interagia com o outro.
Tambm o Setor de Treinamentos precisava escrever um cdigo semelhante, gerando desperdcio de
tempo, e recursos. Muitas vezes, os dados de um funcionrio eram alterados em um programa e no
eram alterados em outro, de modo que um Setor registrava que o funcionrio era solteiro enquanto
outro registrava que ele era casado.
Olhando assim, no parece um grande problema, mas imaginem um sistema enorme com
muitas informaes sensveis, como um sistema bancrio, por exemplo. A comunicao entre os
setores era vital e a duplicidade de cdigo uma porta aberta para problemas em potencial.
Para tentar suprir essas deficincias, surgiu a Orientao a Objetos. Ela geral o suficiente
para no impor um modelo de linguagem ao programador. Cada linguagem continua tendo suas
prprias caractersticas, mas todas tem em comum a mesma maneira de enxergar o mundo real e
transform-lo em um modelo virtual para ser implementado no computador.
As Linguagens de Programao Orientadas a Objetos so muito mais flexveis e permitem
uma comunicao e interao entre os programas permitindo uma implementao modular. Com
elas, o pedao de programa escrito pelo Setor de Pessoal, pode ser aproveitado por todos os demais
setores da companhia. Um mesmo trecho de cdigo, uma vez escrito, pode ser chamado por vrios
outros programas, gerando economia e acabando com o problema de informaes desencontradas
espalhadas por vrios setores.
A coisa funciona assim: criada uma biblioteca de programas onde so armazenados todos
os programas da empresa. Se o Setor de Pessoal precisou escrever um cdigo para
incluir/alterar/deletar dados cadastrais de um funcionrio, ela coloca o cdigo-executvel na
biblioteca de programas. Se eu estou escrevendo um programa que tambm precisa
incluir/alterar/deletar dados cadastrais de um funcionrio, no preciso ter o trabalho de escrever o
mesmo cdigo que j foi escrito pelo Setor de Pessoal. Basta eu incluir no meu programa uma
instruo dizendo ao meu programa para executar o cdigo que o Setor de Pessoal escreveu e que
est disponvel na biblioteca. O meu programa transfere a execuo para o programa do Pessoal.
Quando ele terminar de executar, volta a execuo para o meu programa e ele continua do ponto em
que estava quando fez o desvio para o programa do Pessoal. Para todos os efeitos como se eu
tivesse escrito aquelas instrues dentro do meu cdigo. Dessa forma, a economia e confiabilidade
dos programas muito maior.
Agora imagine que com o crescimento da biblioteca de programas, em um dado momento eu
tenho 30 programas diferentes fazendo meno a esse programa de cadastramento dentro dos seus
22
cdigos. Suponha que acontea uma mudana na legislao que define as regras para
processamento de dados funcionais de empregados e que com isso eu e tenha que fazer alguma
alterao neste programa para refletir a mudana. Basta eu mudar aquele pequeno programinha do
Pessoal (responsvel pelo cadastro dos dados do funcionrio) que automaticamente todos os 30
programas tambm estaro ajustados nova legislao.
Isto possvel porque todas as Linguagens Orientadas a Objeto oferecem suporte
modularizao.
Dissemos que para ser um bom programador, na poca das Linguagens de Programao
Estruturadas, era preciso conhecer e dominar o algoritmo e a estrutura de dados. Com o surgimento
da Programao Orientada a Objetos, o bom programador precisa, alm do algoritmo e da estrutura
de dados, conhecer e saber aplicar a abstrao e a modularizao.
Modularizao a tcnica de dividir um grande problema em partes menores, e cada uma
delas em partes ainda menores, at que cada uma seja suficientemente simples de resolver.
Abstrao o oposto: a capacidade de manter o foco nas partes maiores do problema, evitando
olhar para a riqueza de detalhes das partes menores. Esta uma definio bem resumida. Vamos
explicar melhor
Quando escrevemos um programa temos que decidir se vale mais a pena colocar todo o
cdigo em um nico mdulo ou se melhor divid-lo em mdulos menores. Um problema simples
como calcular as mdias dos alunos de uma sala, ou imprimir um relatrio contendo a relao de
clientes atrasados pode tranquilamente ser resolvido usando um nico programa. Voc consegue
enxergar e escrever todos os passos necessrios dentro do mesmo bloco de programa sem
dificuldade. Para problemas maiores e mais complexos, porm, isto muito simplista. medida
que o problema cresce, vai ficando mais difcil visualizar todos os detalhes ao mesmo tempo.
A soluo para lidar com a complexidade a modularizao: ns dividimos o problema em
sub-problemas, depois novamente em sub-sub-problemas, e assim por diante, at que os problemas
individuais so pequenos o bastante para tornar fcil lidar com eles. Uma vez que resolvemos um
desses pedaos (sub-problemas), no pensamos mais nos detalhes daquele pedao, mas pensamos
nele como uma das peas de uma parte maior.
Vamos analisar estes dois conceitos atravs de um exemplo. Imagine que um fabricante de
carros determinou que uma equipe de engenheiros projete um novo carro. O engenheiro-chefe vai
pensar no problema tentando imaginar o carro como um todo: o desenho da carroceria, o nmero de
portas, o tamanho e a localizao do motor, a quantidade e tamanho das rodas e etc. Para ele, o
motor apenas uma das peas do carro que ele est desenhando. Ele no precisa se preocupar em
saber como vai ser feito o motor, ele s precisa saber que o carro vai ter um motor.
Por outro lado, um outro engenheiro, cuja tarefa justamente projetar o motor, vai se
preocupar em detalhar as vrias partes que compem um motor: os cilindros, o mecanismo de
injeo, o carburador, a bobina, etc. Para ele, o motor no um nico bloco, um complexo
conjunto de pequenas partes. Uma dessas partes a vela (a vela o componente que gera uma
fasca para produzir a queima do combustvel, como nos isqueiros a gs).
Existe um engenheiro (provavelmente em outra fbrica uma fbrica de velas para
automveis) que est trabalhando em desenvolver a vela. Ele enxerga a vela como um artefato
complexo com mltiplas partes. Ele pode estar realizando pesquisas para determinar exatamente
qual o melhor tipo de metal a ser usado para os contatos, ou qual o melhor material cermico a ser
empregado no isolamento da vela. E o mesmo est acontecendo com outras partes do carro.
23
De volta ao engenheiro-chefe, para ele as rodas so uma das partes do carro. Ele sabe que o
carro tem quatro rodas e um estepe e s precisa saber qual o tamanho e espessura das rodas para
poder projetar o espao correspondente na carroceria do carro. Mas algum outro engenheiro l
embaixo na cadeia produtiva deve estar empregando os seus dias pensando na melhor composio
qumica para produzir a borracha dos pneus. Para ele, os pneus so uma coisa muito complexa,
cheias de detalhes a serem resolvidos.
Isso modularizao.
A fbrica de carros, provavelmente no vai fabricar pneus, vai compr-los de um fabricante
de pneus, e para ela o pneu apenas um componente. Ela no se preocupa com os detalhes deste
componente. Um dos engenheiros da fbrica de carros o responsvel pelas rodas. Ele se abstrai
dos detalhes da fabricao de um pneu, para poder se concentrar no projeto da roda. Ele no est
preocupado em saber como se produz um pneu, uma carcaa ou um parafuso. Ele est preocupado
apenas em juntar essas peas para fazer a roda.
Isso abstrao.
O engenheiro-chefe que est desenhando o carro como um todo, abstrai dos detalhes
tcnicos das rodas e do motor e se concentra no desenho do carro. Ele s est interessado em saber
o tamanho do motor e das rodas, para poder fazer o seu desenho de acordo. O mesmo acontece com
todos os outros componentes do carro. Enquanto algum est concentrado em desenhar o espao
interno do carro, tem algum outro trabalhando no material do revestimento dos bancos do carro.
A questo : se for visto em todos os seus inmeros detalhes, um carro tem tantas partes que
seria impossvel uma s pessoa conhecer todos os detalhes ao mesmo tempo. A razo pela qual os
carros so projetados e construdos com sucesso que os engenheiros usam modularizao e
abstrao. Eles dividem o carro em mdulos independentes (rodas, motor, caixa de marchas,
bancos, etc) e atribuem a pessoas diferentes o trabalho de desenvolver cada mdulo
independentemente. Quando um mdulo est construdo, eles usam abstrao. Eles enxergam
aquele mdulo como um simples componente a ser usado para construir componentes mais
complexos.
Modularizao e abstrao, portanto, complementam um ao outro. Modularizao o
processo de dividir partes maiores (problemas, por exemplo) em partes menores, enquanto
abstrao a habilidade de ignorar os detalhes para poder focar no quadro geral.
No prximo tpico vamos finalmente aprender o conceito de Classes e Objetos, que a
base de todas as Linguagens de Programao Orientadas a Objetos, e vamos ver como tudo isto se
encaixa para desenhar um programa.
24
Cachorro
25
cor
raa
idade
Bicicleta
marca
numMarchas
cor
Lmpada
marca
potncia
voltagem
latir
balanarRabo
comer
frear
acelerar
mudarMarcha
acender
apagar
Bicicleta
String marca
int numMarchas
String cor
Lmpada
String marca
int potncia
int voltagem
latir( )
balanarRabo( )
comer( )
frear(percent)
acelerar(percent)
mudarMarcha(numMarcha)
acender( )
apagar( )
26
Veja que aproveitamos para especificar tambm, dentro dos mtodos frear e acelerar, um parmetro
contendo um percentual de diminuio ou de acrscimo de velocidade. Assim, frear(100), indicaria
bicicleta que para ela parar totalmente, ao passo que frear(50) indicaria para reduzir para a
metade da velocidade atual. J acelerar(20) provocaria um aumento de 20% na velocidade da
bicicleta. Uma chamada ao mtodo comer( ), dirigida ao cachorro, seria o suficiente para faz-lo
comer, no havendo necessidade de passar nenhum parmetro. Alis nem que eu quisesse passar um
parmetro, isso seria possvel, porque na definio do mtodo comer, ele foi definido como no
tendo parmetros (no h nada dentro dos parnteses na definio do mtodo).
Os objetos podem se relacionar uns com os outros. Dentro do conceito de abstrao que
vimos no tpico anterior, eu posso ter um ou mais objetos fazendo parte da relao de atributos de
um objeto. No caso do projeto do carro, eu posso ter um objeto carro que tem entre as suas
caractersticas atributos simples como marca, cor, ano de fabricao, tipo-de-combustvel (lcool,
gasolina ou flex) e etc. Mas tambm tenho atributos compostos como motor, roda, bancos e etc.
U, mas motor caracterstica ? sim. Eu posso ter um carro sem motor, no posso? Imaginem
que eu estou descrevendo um daqueles carrinhos de brinquedos de parque de diverses. Ele parece
um carro de verdade, tem rodas e tudo e fica girando, piscando os faris e etc, mas no tem motor.
Ento se eu vou fazer uma representao virtual desse carro no meu computador eu no vou colocar
que ele tem motor, porque ele no tem. J o carro que est sendo projetado na fbrica, vai ter motor,
ento eu preciso colocar entre as suas caractersticas que ele tem motor. Para isso eu uso um objeto
do tipo motor. E tambm quatro objetos do tipo roda. E assim por diante. Eu no preciso me
preocupar em descrever as caractersticas e mtodos de um objeto do tipo motor, porque algum j
teve esse trabalho(modularizao). Eu posso simplesmente pegar esse objeto e inclu-lo na relao
de atributos do meu objeto (abstrao). A Figura 24 mostra esse relacionamento entre dois dos
objetos que estamos descrevendo, a bicicleta e a lmpada.
Bicicleta
marca
numMarchas
cor
farol
luzDeFreio
Lmpada
marca
potncia
voltagem
acender( )
apagar( )
frear(percent)
acelerar(percent)
mudarMarcha(numMarcha)
acenderFarol( )
Fig 24 Objetos (farol e luzDeFreio) fazendo parte da descrio de outro
(bicicleta)
Da mesma forma que eu exemplifiquei o conceito de mtodos dizendo que eu chamava o
mtodo comer( ) do cachorro, para faz-lo comer e o mtodo acender( ) da lmpada para faz-la
acender, o mesmo acontece entre os objetos, Ou seja, os objetos se comunicam entre si. No caso da
Figura 24, eu estou descrevendo uma bicicleta com farol. Se est escurecendo eu digo a bicicleta
para acender o farol atravs de uma chamada ao mtodo acenderFarol( ). O mtodo uma ao,
ento a bicicleta vai realizar os passos necessrios para cumprir aquela ao. Entre esses passos est
includa uma chamada ao mtodo acender( ) do farol (que uma lmpada e portanto sabe acender).
Ou seja, eu peo bicicleta para acender o farol, chamando o mtodo acenderFarol( ) da bicicleta, e
ela por sua vez vira pro objeto farol e pede pra ele acender, chamando o mtodo acender( ) do farol.
No sou em quem dou a ordem de acender ao farol. Eu dou a ordem para a bicicleta e ela quem
vira para o farol e d ordem para ele acender. meio doido n? Mas assim que acontece.
27
Agora que j sabemos o que so objetos, vamos entender o que so Classes. Classe a
descrio dos atributos e mtodos que um determinado objeto pode ter. Olhe de novo as Figuras 22,
23 e 24. O que ns fizemos ao usar esses desenhos do UML? No foi justamente uma descrio de
atributos e mtodos? Exatamente. De onde se conclui que o que ns fizemos at agora foi definir
classes. Por exemplo, definimos a classe Cachorro (Fig. 23). Atravs da definio dessa classe eu
fiquei sabendo que um cachorro tem raa, ou seja, qualquer cachorro que existir, vai ter uma raa. E
sei que, se existir algum cachorro, ele vai saber latir, porque na definio da classe Cachorro est
definido o mtodo latir( ). Mas por enquanto eu tenho apenas uma definio. Eu j sei o que um
cachorro faz, mas cad os cachorros, pra eu poder mandar eles latirem, comerem ou balanarem o
rabo?
No nosso mundo virtual, eu preciso criar um objeto de uma determinada classe para ele
passar a existir. No mundo real eles j existem, vamos imaginar que enquanto ns estamos aqui
estudando, tem dois cachorros l na rua disputando um osso. Um deles o rex e o outro o tot.
Como eu fao para represent-los no mundo virtual? Em primeiro lugar eu tenho que ter uma
definio da classe Cachorro. Ok, isso ns j fizemos, est l na Figura 23. Agora eu estou
escrevendo um programa e quero interagir com esses dois cachorros, rex e tot. Pois bem, em
algum ponto do meu programa, eu vou escrever: Declaro que a partir deste momento passa a
existir o objeto da classe Cachorro chamado rex, sendo que ele da raa Pastor Alemo e tem 3
anos de idade. E logo a seguir eu escrevo : Declaro que a partir deste momento passa a existir o
objeto da classe Cachorro chamado tot, sendo que ele da raa Pequins e tem 1 ano de idade.
claro que no vamos escrever assim dessa maneira, existem um comando e uma forma correta de se
escrever, mas a idia essa.
Agora, o meu programa tem dois objetos da classe Cachorro. Ambos possuem as mesmas
caractersticas e sabem fazer as mesmas coisas mas cada um tem a sua prpria cpia de atributos e
comportamentos. A classe Cachorro descreve um atributo chamado idade. Isto significa que ao criar
o objeto rex, esse objeto tem um campo chamado idade, que armazena o valor 3. Ao criar o objeto
tot, esse objeto tambm tem um campo chamado idade que, no caso do tot, armazena o valor 1.
Se o meu programa usar a varivel idade, assim s escrevendo idade e mais nada, como vamos
saber se uma referncia idade do rex ou idade do tot? Portanto ao usar uma varivel de um
objeto em um programa, temos que associ-la ao objeto especfico que queremos. Fazemos isso
escrevendo o nome do objeto, mais um ponto e mais o nome do campo. Assim, se o meu programa
pede para mostrar na tela tot.idade, ele vai mostrar o valor 1. Se eu pedir rex.idade vai aparecer o
valor 3. A partir do momento da criao desse dois objetos eu passei a ter no meu programa 6
variveis para poder manipular: rex.cor, rex.raa, rex.idade, tot.cor, tot.raa e tot.idade.
A mesma coisa acontece com os mtodos. Se eu chamar o mtodo latir( ) simplesmente,
como que o programa vai saber se um comando para o rex ou para o tot? Aqui tambm eu
tenho que dirigir a ao quele objeto especfico e fazemos isso do mesmo modo que fizemos com
as variveis, escrevendo o nome do objeto, mais um ponto e mais o nome do mtodo. Agora eu
posso direcionar as minhas ordens, escrevendo rex.balanarRabo( ) e tot.latir( ). A partir do
momento da criao desses dois objetos eu passei a ter no meu programa 6 mtodos que eu posso
chamar: rex.latir( ), rex.balanarRabo( ), rex.comer( ), tot.latir( ), tot.balanarRabo( ) e
tot.comer( ).
Num programa, para ajudar a saber quando estamos nos referindo a uma classe e quando
estamos nos referindo a um objeto, escrevemos o nome da classe com a primeira letra em
maiscula, como em Cachorro. E quando estamos usando um objeto daquela classe escrevemos
tudo em minsculas, como em rex e tot. Um objeto chamado de instncia de classe. Assim, rex
uma instncia da classe Cachorro e tot uma outra instncia da mesma classe.
28
Deu pra entender? A diferena entre classe e objeto sutil, normal no entender assim de
imediato. Note que uma classe no tem vida, s um conceito. Mas os objetos (cachorro, lmpada)
possuem vida (ok, lmpada normalmente no tem vida, mas no mundo virtual ela tem ...). A classe
Cachorro no pode latir, comer, etc, ela apenas especifica e define o que um Cachorro. Mas
objetos do tipo Cachorro, ou seja, instncias da classe Cachorro (rex, tot) estes sim, podem latir,
comer e balanar o rabo.
Agora s falta entender como isso tudo se aplica programao. Vamos l.
Os mesmos princpios de modularizao e abstrao que vimos no tpico anterior so
usados no desenvolvimento de um software. Ao olhar para um problema complexo ns tentamos
quebr-lo em sub-componentes que sejam mais fceis de ser codificados (programados) e que ns
iremos tratar como entidades independentes. Depois de criados esses sub-programas, ns iremos
us-los como se fossem simples peas de um programa maior, sem nos preocuparmos com suas
complexidades internas.
Se estivssemos tentando fazer um programa que implementasse no computador as funes
de um carro, tentaramos fazer como os engenheiros da fbrica de carros. Eles olharam para o carro
e viram que o carro era um objeto composto de outros objetos menores (motor, roda, etc). Primeiro
eles construram esses objetos menores e depois os usaram como peas para montar o objeto maior:
o carro. Ns tambm, ao invs de escrevermos um nico e enorme programa contendo todos os
inmeros detalhes da construo do carro, vamos tentar dividir o programa em mdulos menores e
escrever esses mdulos primeiro. Assim, teremos um mdulo para o motor, outro para a roda, outro
para o banco e assim por diante. No final, vamos pegar esses mdulos prontos e vamos us-lo para
escrever o programa principal, que monta o carro. O programa do carro agora vai ficar muito fcil
de ser escrito, porque ele basicamente tem que pegar um motor, quatro rodas, os bancos, a
carroceria e mont-los.
Esses mdulos, na Programao Orientada a Objetos, so as classes. Ento, para escrever
um programa composto de vrios mdulos, na verdade eu vou escrever classes. Normalmente, um
programa composto de um mdulo principal que chama outros mdulos, os quais por sua vez,
chamam outros mdulos e assim por diante. Esse programa principal a classe principal, que usa
outras classes, que tambm usam outras classes.
Uma classe uma descrio de atributos e mtodos. O programa (classe) comea com a
definio dos atributos e depois descreve os mtodos. Os mtodos compem a parte do programa
aonde a ao executada. dentro dos mtodos que eu vou descrever as instrues, os passos que o
computador vai executar em cada situao. A parte inicial, das definies de variveis, mais
descritiva: aqui que eu vou definir que tipo de atributos eu vou ter no programa e quais so eles.
Portanto, aqui que eu vou dizer que sub-classes (mdulos menores) a minha classe vai usar. Mas
aqui ele vai s definir, no vai usar. Para usar temos que ter chamadas de mtodos de objetos e isso
s vai acontecer dentro dos mtodos do nosso programa, que onde a ao se desenvolve.
Portanto eu defino as classes na parte inicial das definies de variveis. Mas as classes no
podem ser usadas, pois como vimos elas no executam aes, s os objetos fazem isso. Ento eu
tenho que criar os objetos das classes que definimos que iriam ser utilizadas. A partir da criao dos
objetos, a ao pode comear a acontecer pois os objetos podem realizar na prtica aquelas aes
que a classe definiu na teoria.
Agora um detalhe importante: quando eu crio uma instncia de uma classe, ou seja quando
eu crio um objeto, eu estou trazendo para dentro do meu programa a possibilidade de usar aqueles
29
atributos e mtodos. Mas no quer dizer que eles vo ser automaticamente usados. Se eu estou
escrevendo um programa para um clnica veterinria, meu programa pode definir que vai usar a
classe Cachorro. Em um determinado momento do meu programa eu crio uma instncia da classe
Cachorro (rex, por exemplo). Na definio da classe Cachorro esto os mtodos latir( ),
balanarRabo( ) e comer( ). Isto no quer dizer que no momento da criao esses mtodos vo ser
executados. Eles esto l, disponveis, mas esperando para serem chamados. S se o meu programa
principal usar o comando rex.latir( ) que a instncia criada vai poder entrar em ao executando o
mtodo latir( ).
Para encerrar este tpico, uma ltima pergunta: se, como dissemos, na Programao
Orientada a Objetos escrever um programa significa escrever classes e sub-classes e sub-subclasses, ento porque no estamos falando de Programao Orientada a Classes? Simples. que as
classes no podem fazer nada, s os objetos podem. Como programar a arte de fazer acontecer, e
s os objetos podem fazer acontecer, ento ficou sendo Programao Orientada a Objetos.
Com isto encerramos esta parte conceitual dos fundamentos da programao. Existem
muitos outros conceitos a serem vistos dentro da Programao Orientada a objetos, como mtodo
principal, construtores, sobrecarga e outros, mas veremos estes conceitos medida que formos
conhecendo e aplicando os comandos e estruturas do Java.
30
Se voc quiser apenas rodar programas JAVA que j esto prontos, basta escolher a
verso JRE 6 Update 7. Se voc quiser escrever e compilar seus prprios programas,
escolha a verso JDK 6 Update 7.
Depois de concludo o download, se sua mquina for Windows, basta clicar duas vezes
sobre o instalador e seguir as instrues. Se for Linux um pouco mais complicado, pea
ajuda a algum mais experiente.
Uma vez instalada a JVM (ou se a sua j estava instalada) abra o editor de texto mais
simples que tiver em seu computador.
se for Windows
V em Iniciar Programas Acessrios Bloco de Notas (notepad)
se for Linux
V em Iniciar Executar Comando digite kedit e tecle ENTER
O cdigo-fonte em JAVA deve ser salvo sempre com a extenso .java (ponto java), por
exemplo:
BomDia.java
Calculadora.java
BatalhaNaval.java
Repare que no h espaos em branco entre as palavras, tudo junto mesmo. Crie
uma pasta chamada CursoJava para armazenar os programas e exerccios que faremos ao
longo do curso. Entre na pasta. Anote o endereo da pasta, pois vamos precisar digit-lo no
console. Para saber qual o endereo, veja no topo da janela do Gerenciador de Arquivos.
se for Windows - est ao lado da palavra Endereo. Exemplo: c:\Documents and
Settings\Mauricio\Meus documentos\Curso Java
se for Linux est ao lado da palavra Localizao. Exemplo:
/home/users/Mauricio/CursoJava
Abra o editor de texto e copie as linhas abaixo (ateno para as maisculas e
minsculas, muito importante copiar exatamente como est escrito):
class BomDia {
public static void main(String[] args) {
System.out.println(Bom dia!);
}
}
No se preocupe em entender o cdigo; apenas um exemplo para voc ver como se
escreve, compila e executa um programa em Java. Explicaremos o significado dessas linhas
mais tarde. Salve o arquivo dentro da pasta CursoJava com o nome de BomDia.java.
Abra a pasta CursoJava. S h um arquivo l dentro, certo? o arquivo BomDia.java
contendo o cdigo que acabamos de escrever.
Agora vamos compilar o nosso cdigofonte (BomDia.java) para gerar o bytecode. Abra
o console e navegue at a pasta CursoJava. Para fazer isto preciso digitar o seguinte
comando:
cd endereo-que-voc-anotou
31
Exemplo:
no Windows:
cd c:\Documents and Settings\Mauricio\Meus documentos\CursoJava
no Linux:
cd /home/users/Mauricio/CursoJava
Agora execute:
javac BomDia.java
Se no aparecer nenhuma mensagem de erro, sinal que correu tudo bem. Se
aparecerem mensagens de erro, abra de novo o BomDia.java (no editor de texto) e confira
para ver se no digitou nada errado, depois abra o console e compile novamente.
Se o prompt (cursor) voltar a ficar piscando porque o arquivo foi compilado com
sucesso.
Porm, se aparecer uma mensagem dizendo que javac um comando desconhecido,
porque o computador no sabe aonde est armazenado o programa javac. Voc vai ter que
indormar isto a ele. Para fazer isso, faa:
se for Windows
V em Iniciar Painel de Controle Sistema Avanado Variveis de
Ambiente na parte de baixo da janela que abrir, seleciona a linha que comea
com Path (clique na linha para selecion-la) Edit na janela que surgir clique
no final da linha (ao lado do cursor que est piscando), acrescente um ponto-evrgula (;) ao final da linha e digite o caminho do diretrio onde esto os binrios
do Java:
C:\Arquivos de programas\Java\jdk1.5.0_02\bin
O nmero pode variar em funo da verso que voc tiver. Use aqui o mesmo
nmero que aparece quando voc usa o comando java version.
Aps digitar, confirme clicando em OK, depois em OK e finalmente em OK.
se for Linux
Abra o console e digite
export PATH=$PATH:/usr/java/jdk1.5.0_02\bin e ENTER (o numero pode
variar em funo da verso que voc tiver. Use aqui o mesmo numero que aparece
quando voc usa o comando java version).
O problema que essa uma alterao temporria, ou seja, se voc desligar o
computador, perde a configurao e vai ter que repetir este procedimento da prxima
vez que ligar o computador. Uma maneira mais permanente de fazer isso editar o
arquivo profile, que est no diretrio /etc (voc dever estar logado como um usurio
que tenha permisso para fazer isso). Outra opo modificar o seu perfil no arquivo
.bashrc (arquivo oculto). Em ambos os casos, a modificao a mesma: adicione ao
final do arquivo o comando:
export PATH=$PATH:/usr/java/jdk1.5.0_02\bin
O numero pode variar em funo da verso que voc tiver. Use aqui o mesmo numero
que aparece quando voc usa o comando java version.
Este procedimento bem mais complicado, se tiver dificuldades pea ajuda a algum
mais experiente.
32
33
34
Vamos fazer um programa bem simples s para ilustrar o processo. Clique em Project
e a seguir em New Project, navegue at a pasta desejada (no nosso caso CursoJava), digite o
nome do projeto e clique em Create (Fig. 8).
35
Veja que agora existe um novo arquivo na rea de trabalho com o nome de classe que
criamos. Reparou que o arquivo est hachurado (cheio de listras diagonais)? Isto significa que
ele ainda no foi compilado.
D um duplo-clique no desenho da classe para abrir o editor de texto. J existe um cdigo
escrito na nossa classe. Este um cdigoexemplo que o BlueJ gera automaticamente ao criar
a classe. Vamos aproveitar apenas um pedao desse cdigo. Delete os as linhas em azul do
comeo do cdigo e todas as linhas que esto entre a primeira chave e a ltima. (para deletar,
selecione as linhas com o mouse e pressione a tecla Delete do seu teclado). O cdigo vai ficar
assim:
36
37
Clique em Ok na prxima janela e abrir uma nova janela com o resultado da execuo.
38
Comentrios
Exemplo de Comentrio
Descrio
/*
A varivel x um nmero
inteiro que representa a
posio no eixo x
*/
int x;
/**
A varivel x um nmero
inteiro que representa a
posio no eixo x
*/
int x;
O programa javadoc (que vem no pacote de instalao do Java), l todos os comentrios iniciados
por /** e gera um documento HTML contendo estas informaes.
Definio de Classe
modificador : pode ser public (que significa que qualquer outra classe pode criar
objetos a partir dessa classe), ou private (que significa que no podem ser criados
objetos dessa classe).
class uma palavra-reservada do Java que significa que esta uma declarao de
uma classe.
<Nome-da-classe> : aqui entra o nome da classe, sempre comeando com letra
maiscula
Exemplo:
public class Cachorro
39
{
// aqui entram as linhas do programa
}
Figura 25 Definio da Classe Cachorro
Definio de Mtodo
Sintaxe da Definio de Mtodo
modificador void <nome-do-mtodo>(<lista de parmetros>)
{
<comandos>...
}
modificador <tipo-de-retorno> <nome-do-mtodo>(<lista de parmetros>)
{
<comandos>...
}
modificador : pode ser public (que significa que qualquer classe externa pode
invocar este mtodo), ou private (que significa que este mtodo somente pode ser
invocado a partir da classe onde ele foi definido).
void uma palavra-reservada do Java que significa que este mtodo no retorna
nenhum dado ao final da execuo das instrues.
<tipo-de-retorno>: o tipo de dado que o mtodo retorna classe que o invocou, ao
final da execuo das instrues. Um mtodo s pode retornar um nico dado.
<nome-do-mtodo> : aqui entra o nome do mtodo, sempre comeando com letra
minscula e sendo de preferncia um verbo.
<lista de parmetros>: so os parmetros que o mtodo recebe da classe que o
chamou. Pode ter nenhum, um ou mais de um parmetro. Se houver mais de um
parmetro, eles devem estar separados por vrgulas. Cada parmetro composto do
tipo-de-dado do parmetro, seguido do nome-do-parmetro. (Ex: int nota, double
preo, String nome, etc).
Observe que a segunda informao que consta do cabealho do mtodo OU void OU o tipo-dedado de retorno. Ou seja, ou o mtodo retorna alguma informao (e nesse caso ele especifica no
cabealho do mtodo qual o tipo de dado) ou ento no retorna nada (e nesse caso ele usa a palavra
void, para indicar isto.).
Outra observao importante que aps o nome do mtodo sempre haver um par de parnteses,
mesmo que no haja nenhuma lista de parmetros.
A combinao do nome do mtodo mais a lista de parmetros chamada de assinatura do mtodo.
40
Exemplos de mtodos:
public void latir() {
System.out.println(Au! Au!);
}
Figura 26 Definio do mtodo latir()
Invocao de Mtodo
Sintaxe da Invocao de Mtodo
<instancia>.<mtodo>()
<variavel> = <instancia>.<mtodo>(<parmetros>...)
Para dar uma ordem de latir a um co rex, por exemplo, o comando seria:
rex.latir();
41
No caso de um mtodo que retorna um valor, eu tanto posso usar o valor diretamente, como posso
armazen-lo em uma varivel para uso futuro. Por exemplo, suponha que eu tenho uma classe
chamada Aluno, que tem no corpo da classe a definio de um mtodo chamado calculaMdia
(como no exemplo anterior). Eis alguns exemplos de invocao deste mtodo para um aluno
chamado aluno1:
System.out.println(aluno1.calculaMdia(9 , 8));
mediaAluno = aluno1.calculaMdia(6 , 10);
No primeiro exemplo, h uma instruo de impresso. Repare que a invocao do mtodo ocorre
dentro dos parnteses do comando de impresso println. Aps terminada a execuo do mtodo, o
valor retornado ser impresso na tela pois a instruo original ter se transformado em:
System.out.println(8.5), aonde 8.5 o valor retornado pelo mtodo, ou seja, a mdia entre as duas
notas passadas como parmetro.
No segundo exemplo o valor retornado pelo mtodo ser armazenado na varivel mediaAluno.
Aps a execuo do mtodo, a instruo original ter se transformado em: mediaAluno = 8, aonde
8 o valor retornado pelo mtodo, ou seja, a mdia entre as duas notas passadas como parmetro..
Mtodo Construtor
Toda classe tem que ter um mtodo construtor. Esse mtodo invocado toda vez que
criada uma instncia daquela classe, ou seja, um objeto daquela classe. Por exemplo, ao
definir uma classe Cachorro, devemos escrever, dentro do corpo da classe, um mtodo
construtor que ser executado toda vez que criarmos uma instncia de Cachorro. Como este
mtodo chamado no ato da criao de um objeto, o lugar ideal para fazer as
inicializaes das variveis da classe (veremos o conceito de inicializao mais adiante).
42
Quando no criamos um mtodo construtor, o prprio Java cria um para ns. Neste caso,
ser um mtodo construtor vazio, que no executa nenhuma tarefa especfica.
O cabealho do mtodo construtor foge um pouco regra que vimos na sintaxe da definio
de mtodos. Ele no retorna nenhum tipo de dados, mas no precisa ter a palavra void para
indicar isto. O nome do mtodo sempre igual ao nome da classe. Como o nome da classe
escrito com a inicial em maiscula, o mtodo construtor o nico mtodo que tem o seu
nome comeando com letra maiscula (como vimos, todos os outros mtodos comeam com
letra minscula e tem nome de verbo). Portanto a sintaxe do mtodo construtor ser:
Sintaxe da Definio de Mtodo Construtor
modificador <Nome-da-classe>(<lista de parmetros>) {
<comandos>...
}
modificador : pode ser public (que significa que qualquer classe externa pode
invocar este mtodo), ou private (que significa que este mtodo somente pode ser
invocado a partir da classe onde ele foi definido).
<Nome-da-classe> : o nome do mtodo sempre ser igual ao nome da classe.
<lista de parmetros>: so os parmetros que o mtodo recebe da classe que o
chamou. Pode ter nenhum, um ou mais de um parmetro. Se houver mais de um
parmetro, eles devem estar separados por vrgulas. Cada parmetro composto do
tipo-de-dado do parmetro, seguido do nome-do-parmetro. (Ex: int nota, double
preo, String nome, etc).
public Cachorro()
public Lmpada()
public Bicicleta()
public Circulo()
Declarao de variveis
Normalmente, a primeira coisa que fazemos em um programa (ou em um mtodo) declarar as
variveis que sero utilizadas. A instruo de declarao serve para dizer ao computador o nome e o
tipo de dados da varivel. Se tentarmos usar uma varivel que no foi declarada, o compilador vai
dar erro indicando que o computador no conhece aquela varivel. Somente a partir da instruo de
declarao que o computador toma conhecimento da existncia da varivel e s a partir da
poderemos us-la em instrues.
Sintaxes da Declarao de variveis
<tipo-de-dado> <variavel>;
43
No primeiro caso, temos a declarao de apenas uma varivel. Primeiro indicamos o tipo de dado e
a seguir indicamos o nome da varivel. No segundo caso temos a declarao de vrias variveis do
mesmo tipo em uma nica instruo. Os vrios nomes de variveis so separados por vrgulas. No
terceiro caso, temos, em uma mesma instruo a declarao de uma varivel e a inicializao da
varivel, ou seja, a atribuio de um valor inicial para a varivel. Note que todas as declaraes
terminam com ponto-e-vrgula.
O tipo-de-dado pode ser um tipo de dado primitivo (int, boolean, char, etc), um tipo de dado
definido pelo sistema (String, JLabel, JOptionPane, etc), ou um tipo de dado definido pelo
usurio (Cachorro, Triangulo, etc). O valor pode ser um literal, ou uma instncia de um tipo
definido pelo usurio, como Cachorro. Literal todo e qualquer valor que a gente escreve
diretamente em uma linha do programa (ex: 57, true, M, caloi, etc).
Exemplos:
int qtdeAlunos;
int idade = 9;
boolean terminou = false;
Cachorro rex = new Cachorro();
Os tipos de dados mais simples so chamados de primitivos. Existem oito tipos de dados primitivos
em Java, sendo seis numricos, um caracter e um booleano. O quadro a seguir mostra os oito tipos.
A primeira coluna mostra como eles so representados no Java, a segunda coluna mostra o tamanho
do espao de memria usado para armazenar o valor e a terceira coluna mostra a faixa de valores
permitidos.
Tipo de Dados
Tamanho
Faixa de Valores
byte
1 byte
-128 at 127
short
2 bytes
-32.768 at 32.767
int
4 bytes
-2.147.648 at 2.147.483.647
long
8 bytes
-9.223.372.036.854.775.808 at
9.223.373.036.854.775.807
float
4 bytes
-3.4x1038 at 3.4x1038
double
8 bytes
-1.8x10308 at 1.8x10308
char
2 bytes
boolean
1 bit
true ou false
44
Os quatro primeiros tipos so usados para armazenar valores numricos inteiros. A diferena entre
eles o espao ocupado na memria (e portanto a faixa de valores permitida).
Por exemplo, se eu estou escrevendo um programa para rodar em um celular, eu preciso economizar
espao de memria pois o celular no tem tanta memria quanto um computador. Ento se eu tenho
uma varivel numrica no meu programa e eu sei que o valor mximo que aquela varivel pode
assumir 100, eu posso usar o tipo byte que permite armazenar nmeros entre -128 e 127. Se eu
usasse o tipo int eu estaria reservando quatro vezes mais memria do que o necessrio, pois o tipo
int ocupa 4 bytes de memria enquanto o tipo byte ocupa apenas 1. Agora, se eu estiver escrevendo
um programa para contar quantas estrelas tem em uma galxia, eu no posso usar os tipos byte,
short ou int, porque eles no comportariam o nmero resultante da contagem. Eu teria que usar o
tipo long, que ocupa 8 bytes de memria, mas me permite armazenar nmeros at nove
quinquilhes, duzentos e vinte e trs quatrilhes, trezentos e setenta e dois trilhes, trinta e seis
bilhes, oitocentos e cinqenta e quatro milhes, setecentos e setenta e cinco mil e oitocentos e
sete ... Ufa!
Na prtica, o tipo mais usado para armazenar nmeros inteiros o int.
Os tipos float e double so usados para armazenar valores reais, ou seja, podem ter casas decimais.
Eles so representados de forma aproximada no computador usando o que chamamos de notao de
ponto flutuante. O tipo float o menor e permite representar nmeros com uma preciso de at 8
casas decimais. O double ocupa o dobro do espao de memria, mas permite armazenar nmeros
com preciso de at 15 casas decimais. No Java, a casa decimal representada com ponto e no
com vrgula. (Ex: 7.5 , 32.58 , 4.8759 , etc).
Na prtica, o tipo mais usado para armazenar nmeros reais o double.
O tipo char usado para armazenar um nico caracter. Este caracter pode ser uma letra
(m,A,etc), um dgito (2,9, etc) ou um caracter especial (/,!,*, etc). Nos programas,
atribumos valores uma varivel do tipo char usando aspas simples (Ex: resposta = A).
Finalmente, o tipo boolean serve para armazenar um dos dois valores booleanos: verdadeiro ou
falso. Como o Java todo em ingls, usam-se os valores true (verdadeiro) ou false (falso).
Nessa lista de tipos de dados est faltando um muito importante e muito utilizado que o string. O
string uma cadeia de caracteres, ou seja, usado para armazenar palavras ou frases. Para atribuir
um valor a uma varivel do tipo string, usam-se aspas duplas (Ex: nome = Joo da Silva, rua =
Avenida Presidente Vargas, etc). Em vrias linguagens de programao o string definido como
um tipo primitivo, porm no Java diferente. O Java definiu uma classe chamada String que est
na biblioteca java.lang. Como uma classe, ele tem uma srie de mtodos que nos permitem fazer
operaes as mais diversas como por exemplo, transformar todo o contedo da varivel em
maisculas, ou ento procurar dentro da String por uma determinada letra e substitu-la por outra.
Existem cerca de 50 mtodos que uma String capaz de realizar.
Esta classe String, to utilizada que no precisamos declarar, no incio do programa, a instruo de
importao de bibliotecas (como fazemos sempre que queremos usar no nosso programa uma das
classes definidas pelo Java). Ela quase como se fosse um tipo de dados primitivo, a diferena
que ela, por ser um objeto de uma classe, sabe realizar uma srie de aes. por isso que o tipo de
dados String escrito com a primeira letra em maiscula (como so todas as classes), ao contrrio
dos tipos de dados primitivos, que so todos escritos com a inicial em minscula.
45
O nome da varivel deve comear com letra minscula e pode ter letras e nmeros, mas no deve
conter espaos, hfens, barras ou coisas assim. Pode ser um nome simples (nome, qtde, nota, etc) ou
composto (nomeCliente, qtdeDiasEmAtraso, notaProva1, etc). No caso de nomes compostos, o
primeiro tem a inicial com letra minsculas e os demais tem a inicial com letra maiscula. Note que
tudo colado mesmo, no h espao entre eles.
Devemos sempre tentar escolher um nome sugestivo, que indique o que aquela varivel ir
armazenar. Por exemplo, se eu vou usar no meu programa uma varivel para contar o nmero de
alunos em uma sala de aula, eu poderia criar uma varivel chamada numAlunos ou qtdeAlunos.
Porm uma varivel chamada num, qtde ou xyz, no indica claramente o contedo da varivel.
Outra coisa importante: o Java aceita qualquer caracter na composio do nome. Isto significa que
podemos criar nomes de variveis com acentos ou cedilhas. Porm devemos evitar usar esses
caracteres porque quando mudamos de plataforma normalmente esses caracteres so substitudos na
outra plataforma. Por exemplo, se eu estou escrevendo um programa usando um computador da
plataforma Windows, ao compilar e levar o bytecode para executar em um computador da
plataforma Linux pode ser que ele transforme os cedilhas, acentos agudos e etc em outros caracteres
e a o programa vai dar erro. O mesmo se eu estou escrevendo em um computador Linux, compilo e
levo o bytecode para executar em um computador Windows. Como queremos que nosso programa
execute em qualquer plataforma, devemos evitar o uso desses caracteres nos nomes das nossas
variveis. O mesmo vale para nomes de classes e nomes de mtodos.
Instruo de Atribuio
Depois de declaradas as variveis, devemos atribuir um valor inicial a elas. Para isso, usamos a
instruo de atribuio. Este procedimento conhecido como inicializao das variveis.
Sintaxe da Operao de Atribuio
<tipo-de-dado> <variavel> = <valor-de-dado>;
<tipo-de-dado> <variavel>;
<comandos diversos>...
<variavel> = <valor-de-dados>;
O sinal de igual (=) no Java no sinnimo de comparao mas sim de atribuio. Usamos a
instruo de atribuio para alterar o contedo de uma varivel. Quando o computador encontra em
uma linha o sinal =, ele pega o que est do lado direito do sinal e joga dentro da varivel que est do
lado esquerdo. Dizemos que ele atribui o que est do lado direito varivel que est do lado
esquerdo.
No primeiro caso eu estou definindo a varivel e fazendo a atribuio do valor inicial em uma nica
linha do meu programa.
No segundo caso, eu uso uma linha do programa para definir a varivel. Depois, seguem-se outras
linhas de comandos diversos (provavelmente outras linhas de definio das demais variveis) e
finalmente aparece uma linha contendo a instruo de atribuio. Ou seja, eu posso definir a
varivel em uma linha e atribuir o valor em outra.
46
Exemplos:
int x = 4;
media = (n1 + n2) / 2;
temperatura = 21.4;
Qtde = qtde + 1;
rex = new Cachorro();
Observe que eu tanto posso ter do lado direito do sinal de igual um valor literal (como em
temperatura = 21.4 ou int x = 4), como posso ter uma expresso (como em media = (n1 + n2) / 2).
Se o computador encontra uma expresso do lado direito da instruo de atribuio, ele primeiro
resolve a expresso e depois atribui o resultado varivel do lado esquerdo. As regras de resoluo
de expresses so as mesmas aplicadas resoluo de expresses matemticas.
47
}
Figura 28 Testando o mtodo latir() da classe Cachorro
Compile as duas classes para ver se no h erros de digitao e a seguir execute o programa
principal. Para executar o programa principal basta clicar sobre ele com o boto direito do mouse e
clicar na opo void main(String[] args) que aparece no menu (se tiver dvidas, consulte as
pginas 16 a 19 para ver como se faz). O programa principal, no nosso caso, a classe
VidaDeCachorro. Ao executar, o programa ir abrir uma tela de console para exibir a mensagem
que ns mandamos imprimir.Veja na Figura 29, o resultado da execuo:
No primeiro caso temos a criao de um objeto de uma classe. No segundo caso temos a criao de
um objeto e a atribuio deste objeto a uma varivel. A forma mais usada a segunda. Na maioria
das vezes, ao criarmos um objeto, armazenamos este objeto em uma varivel para que possamos dar
ordens (chamar os mtodos) deste objeto posteriormente. Foi o que fizemos no nosso programa
VidaDeCachorro.
48
Ao encontrar o comando new, o computador j sabe que deve criar uma instncia de uma classe,
mas precisamos especificar que classe essa. Fazemos isto acrescentando, aps o comando new, o
nome do mtodo construtor. Como vimos, o mtodo construtor tem o mesmo nome da classe e
executado sempre que um novo objeto criado.
Portanto, a segunda parte da primeira linha do nosso mtodo principal (= new Cachorro();) uma
instruo de atribuio de um novo objeto da classe Cachorro. Ou seja, o computador ir criar uma
instncia da classe Cachorro e a seguir atribuir este novo objeto varivel caozinho.
Na linha seguinte, temos uma chamada do mtodo latir() direcionada ao objeto caozinho:
caozinho.latir();
Ao encontrar esta instruo o computador interrompe a execuo do mtodo principal do programa
principal e vai no programa Cachorro (classe Cachorro) procurar pelo mtodo latir() para poder
executar as instrues definidas neste mtodo. O mtodo latir() da classe Cachorro tem apenas uma
instruo, a instruo de impresso:
System.out.println(Au! Au!);
O comando System.out.println() mostra no console o que estiver especificado entre os parnteses.
No nosso caso, o computador ir abrir uma janelinha de console para poder imprimir Au! Au!.
Como vimos, o processo de atribuir uma valor inicial a uma nova varivel chamado de
inicializao. Quando esta nova varivel tem como tipo-de-dado uma classe (como no nosso
exemplo) este processo chamado de instanciao, para ficar bem caracterizado que estamos
atribuindo uma instncia (um objeto) nova varivel.
Sobrecarga de Mtodos
Dentro da minha classe eu posso dois ou mais mtodos com o mesmo nome desde que eles tenham
a assinatura diferente. Assinatura do mtodo corresponde ao nome-do-mtodo mais a lista de
parmetros. Veja por exemplo os cabealhos de mtodos abaixo:
No primeiro exemplo, a assinatura do mtodo latir(). Aqui temos o nome do mtodo e mais a lista
de parmetros, no caso, uma lista vazia porque no h parmetros.
No segundo caso, a assinatura do mtodo mudarTamanho(int novotamanho). Temos o nome do
mtodo seguido da lista de parmetros (int novoTamanho).
No terceiro caso a assinatura do mtodo calcularMedia(double nota1, double nota2). Temos o
nome do mtodo e mais a lista de parmetros (double nota1, double nota2).
Eu posso ter na minha classe Cachorro um segundo mtodo chamado latir desde que as assinaturas
dos dois mtodos latir sejam diferentes. Abra a classe Cachorro do nosso projeto Canil, e acrescente
um novo mtodo latir como descrito na Figura 30:
49
50
programa VidaDeCachorro mais uma vez. Quando aparecer a janela de console, clique em Options
l no alto da janela do console e depois clique em Clear screen at method call (Limpar tela a cada
chamada de mtodo). A partir de agora, cada vez que executarmos o programa, o BlueJ primeiro
apaga o resultado da execuo anterior. Para testar, execute novamente o VidaDeCachorro. Vai
aparecer a janela de console com apenas uma linha Au! Au! como na Figura 29.
Vamos ento prosseguir com os testes. V no projeto Canil e exclua o programa VidaDeCachorro
(basta clicar com o boto direito do mouse sobre a classe VidaDeCachorro e clicar em Remover no
menu que aparecer). Agora crie uma nova classe chamada CoralDeCachorros. Delete as linhas
criadas pelo BlueJ, deixando somente o cabealho da classe e as chaves. Digite o cdigo conforme a
Figura 32 abaixo:
public class CoralDeCachorros
{
public static void main(String[] args)
{
Cachorro rex = new Cachorro();
Cachorro toto = new Cachorro();
rex.latir();
toto.latir("Arf! AU! Arf! AU!");
rex.latir("AUUUUUUUUUUUU");
}
}
Figura 32 Testando a sobrecarga do mtodo latir()
Compile e execute o programa CoralDeCachorros. Se tudo correu bem, voc deve ter recebido
como resultado uma janela igual a da Figura 33.
51
tem parmetros na sua assinatura. Este mtodo latir sem parmetros tem apenas uma instruo:
System.out.println(Au! Au!), que vai imprimir na tela a string Au! Au!.
Na quarta linha temos uma chamada do mtodo latir direcionada varivel toto. Como foi invocado
o mtodo passando um parmetro (a String Arf! AU! Arf! AU!"), ser executado o segundo
mtodo latir, aquele que recebe uma String como parmetro.
Na quinta linha temos uma chamada do mtodo latir direcionada varivel rex. Como foi invocado
o mtodo passando um parmetro (a String AUUUUUUUUUUUU"), ser executado o segundo
mtodo latir, aquele que recebe uma String como parmetro.
Operadores Aritmticos, Relacionais e Lgicos
Operadores so smbolos usados para indicar uma determinada operao. Os operadores aritmticos
so bastante conhecidos pois j estamos habituados a utiliz-los nas expresses matemticas. Por
exemplo, em nota1 + nota2, o sinal de + um operador aritmtico usado para indicar uma operao
de adio. Os operadores usados no Java se dividem em aritmticos, relacionais e lgicos.
Operadores Aritmticos so usados para indicar operaes aritmticas tais como adio, subtrao,
multiplicao e diviso.
Operadores Relacionais so usados para indicar relaes entre valores, tais como maior que,
igual a, menor ou igual a e etc.
Operadores Lgicos so usados em instrues de deciso (SE-ENTO-SENO) ou instrues de
repetio (loop). Sempre que eu fizer um teste mais complexo, aonde eu testo mais de uma
condio, eu uso os operadores relacionais para combinar as vrias condies simples a fim de
formar uma condio complexa. Para isso vou usar os operadores relacionais para expressar a idia
de E, OU e NO.
As tabelas a seguir mostram os operadores mais usados no Java.
Operador
+
*
/
%
Descrio
soma dois nmeros
subtrai dos nmeros
multiplica dois nmeros
divide dois nmeros
Mostra o resto da diviso
Exemplo
3+5
qtde - 7
velocidade * tempo
3.75 / 1.92
7%2
O ltimo operador mostrado na tabela ( %) no tem o mesmo sentido de percentual que estamos
habituados a usar. No Java ele serve para indicar o resto inteiro de uma diviso. No exemplo
mostrado estamos dividindo 7 por 2. O resto da diviso neste caso 1.
O programa a seguir testa os operadores aritmticos.
public class TestaOperadoresAritmticos {
public static void main (String[] args){
int resultado = 1 + 2; // resultado igual a 3
System.out.println(resultado);
resultado = resultado - 1; // resultado agora igual a 2
52
System.out.println(resultado);
resultado = resultado * 2; // resultado agora igual a 4
System.out.println(resultado);
resultado = resultado / 2; // resultado agora igual a 2
System.out.println(resultado);
resultado = resultado + 8; // resultado agora igual a 10
resultado = resultado % 7; // resultado agora igual a 3
System.out.println(resultado);
}
Crie um novo projeto no BlueJ e crie dentro deste projeto uma classe chamada
TestaOperadoresAritmticos para digitar, compilar e executar o programa acima.
O resultado da execuo ser o mostrado na Figura 34.
Descrio
igual a
diferente de
maior que
menor que
maior ou igual a
menor ou igual a
Exemplo
if (idade == 3)
while (Visivel != false)
if (qtdeAlunos > 50)
do {comandos} until (qtde > 30)
while (total >= 100)
if (nota <= 7.5)
igual a 100");
diferente de 100");
maior que 100");
menor que 100");
maior ou igual a 100");
53
Crie um novo projeto no BlueJ, crie uma classe chamada ComparaValores, digite, compile e
execute o cdigo acima. Voc deve receber como resultado uma janela igual a da Figura 35:
54
System.out.println(50 maior que 100); Como (50 > 100) falso, ento o computador no
executa o comando de impresso.
Na sexta linha feito o teste if (valor1 < valor2). Essa instruo testa se valor1 menor que valor2.
O computador ir substituir o nome da varivel pelo seu contedo para poder fazer o teste. Assim, a
instruo se transforma em if (50 < 100). Somente se o resultado do teste for verdadeiro (true) que
o computador executa o comando seguinte: a instruo de impresso System.out.println(50
menor que 100); Como (50 < 100) verdadeiro, ento o computador executa o comando de
impresso e imprime na tela a String 50 menor que 100.
Na stima linha feito o teste if (valor1 >= valor2). Essa instruo testa se valor1 maior que ou
igual a valor2. O computador ir substituir o nome da varivel pelo seu contedo para poder fazer o
teste. Assim, a instruo se transforma em if (50 >= 100). Somente se o resultado do teste for
verdadeiro (true) que o computador executa o comando seguinte: a instruo de impresso
System.out.println(50 maior ou igual a 100); Como (50 >= 100) falso, ento o computador
no executa o comando de impresso.
Finalmente, na oitava linha feito o teste if (valor1 <= valor2). Essa instruo testa se valor1
menor que ou igual a valor2. O computador ir substituir o nome da varivel pelo seu contedo para
poder fazer o teste. Assim, a instruo se transforma em if (50 <= 100). Somente se o resultado do
teste for verdadeiro (true) que o computador executa o comando seguinte: a instruo de
impresso System.out.println(50 menor ou igual a 100); Como (50 <= 100) verdadeiro,
ento o computador executa o comando de impresso e imprime na tela a String 50 menor ou
igual a 100.
Operador
&&
||
!
Descrio
E
OU
NO
Exemplo
if ((x<3) && (y>7))
if ((nota1 < 5) || (nota2 < 5)
if (! estourouLimite)
Os operadores lgicos so usados para testar vrias condies (no caso do && e do ||) ou para
inverter um teste (no caso do !).
No primeiro exemplo, a condio ser verdadeira somente se x for menor que 3 e y for maior que 7.
Ou seja, as duas condies testadas tem que ser verdadeiras para que o resultado da expresso seja
considerado verdadeiro.
No segundo exemplo, a condio ser verdadeira se nota1 for menor que 5 ou se nota2 for menor
que 5. Basta que uma das duas condies seja verdadeira para que o resultado da expresso seja
considerado verdadeiro.
No terceiro exemplo estamos usando uma varivel booleana. As variveis booleanas s podem
armazenar um dos valores booleanos: true (verdadeiro) ou false (falso). O sinal de ! inverte o
contedo da varivel. Assim, supondo que a varivel estourouLimite armazene o valor true, o teste
do exemplo vai dar falso, porque ! true equivale a false. O programa TesteLgico testa os
operadores lgicos, tambm conhecidos como operadores booleanos porque trabalham com valores
verdadeiro ou falso.
55
Crie um novo projeto no BlueJ, crie uma classe chamada TesteLgico, digite, compile e execute o
cdigo acima. Voc deve receber como resultado uma janela igual a da Figura 36:
56
O prximo teste if (valor1 == 250) || (valor2 > valor1)). Essa instruo testa duas condies e
vai executar a instruo de impresso se uma das duas condies (ou as duas) forem verdadeiras.
Ao contrrio do && que s resulta verdadeiro se a primeira condio for verdadeira E a segunda
tambm, o || vai resultar verdadeiro se a primeira condio for verdadeira OU a segunda condio
for verdadeira. Basta que uma seja verdadeira para o resultado do teste dar verdadeiro. O
computador ir substituir o nome da varivel pelo seu contedo para poder fazer o teste. Assim, a
instruo se transforma em if (30 == 250) || (115 > 30). A primeira condio (30 == 250) falsa,
porm a segunda (115 > 30) verdadeira. O resultado do teste verdadeiro e o computador executa
o comando de impresso e imprime na tela a String "30 igual a 250 OU 115 maior que 30".
Finalmente, o ltimo teste if (valor1 == 250) || (valor2 == 7)). Essa instruo testa duas
condies e vai executar a instruo de impresso se uma das duas condies (ou as duas) forem
verdadeiras. O computador ir substituir o nome da varivel pelo seu contedo para poder fazer o
teste. Assim, a instruo se transforma em if (30 == 250) || (115 == 7). A primeira condio
(30 == 250) falsa e a segunda (115 == 7) tambm falsa. O resultado do teste falso e o
computador no executa o comando de impresso.
Concatenao de Strings
O sinal de + no usado apenas para somar valores numricos. Ele tambm pode ser usado para
concatenar (juntar) Strings.
Imagine que eu tenho as seguintes instrues em um programa:
String nome = Joo;
String sobrenome = da Silva;
String nomeCompleto = nome + sobrenome
57
System.out.println(nomeCompleto);
O resultado do comando de impresso seria Joo da Silva.
Incremento e Decremento
Outra forma de aumentar o valor de uma varivel o operador de incremento. Incrementar uma
varivel significa somar 1 ao valor dessa varivel. O Java usa o operador ++ para fazer isso.
Veja no exemplo:
int num = 17;
num++; // num agora vale 18
Aps a execuo da segunda linha, o valor de num passa a ser 18. Isto equivaleria a escrever
num = num + 1 ou ento num += 1.
A mesma coisa vale para o sinal -- . Neste caso estamos diminuindo o valor da varivel. Isto
chamado de decremento.
int num = 17;
num--; // num agora vale 16
O uso do incremento ou decremento depende da posio onde eles se encontram na expresso.
Existem casos em que eu quero que a expresso seja calculada primeiro e o valor seja incrementado
depois. Nesse caso eu uso o ++ depois da varivel. Em outros casos, o valor deve ser incremetado
primeiro e s depois que eu vou calcular a expresso. Nestes casos eu vou colocar o sinal de ++
antes da varivel. Acompanhe o exemplo:
int x = 7;
int y = 7;
int a = 2 * ++x; // a vale 16 e x vale 8
int b = 2 * y++; // b vale 14 e y vale 8
Veja que nos dois casos as variveis foram incrementadas, passando de 7 para 8. Mas no primeiro
caso, o valor de x foi incrementado primeiro, passando de 7 para 8 e s depois foi calculada a
expresso (2 * 8) resultando em 16. No segundo caso, o incremento vem depois de calculada a
expresso. Ou seja, primeiro efetuado o clculo da expresso (2 * 7) que resulta em 14 e s depois
a varivel y incrementada passando de 7 para 8.
Instrues e Blocos de Instrues
Um programa uma sequncia de instrues, ou seja, cada linha do meu programa contm uma
instruo. As instrues podem ser divididas em:
instruo de declarao
instruo de atribuio
instruo de incremento ou decremento (++ ou --)
invocao de mtodos
58
criao de objetos
Circulo sol;
// instruo de declarao
double nota1;
// instruo de declarao
nota1 = 7.5;
// instruo de atribuio;
media = (nota1 + nota2) / 2 // instruo de atribuio
qtdeAlunos++; // instruo de incremento (equivale a qtdeAlunos = qtdeAlunos + 1)
altura--;
// instruo de decremento (equivale a altura = altura 1)
rex.latir();
// chamada de mtodo
sol.mudarTamanho(80); // chamada de mtodo
new Circulo();
// criao de objeto
Observe que todas as instrues terminam com ponto-e-vrgula. Ns podemos em uma mesma linha
combinar duas instrues:
Blocos de instrues so uma ou mais instrues entre chaves. Elas podem ser usadas em qualquer
lugar em que uma instruo simples pode ser usada. Geralmente, usamos os blocos de instrues
quando, por exemplo, temos uma instruo de deciso (if) e temos mais de uma instruo a ser
realizada no then ou no else. Veja um exemplo no cdigo abaixo:
public class CalculaMdia {
59
Instrues de Deciso
As instrues de deciso servem para executar um comando (ou bloco de comandos) dependendo
do resultado do teste de uma condio. A sintaxe a seguinte:
expresso qualquer condio (ou grupo de condies) que resulte em um valor booleano
(verdadeiro ou falso). Pode ser simples (ex: x < 3, x == y , idade != 18 , etc) ou composta
(ex: ((x < 3) && (y == 15)) , ((nota1 < 5) || (nota2 < 5)) , etc). Tambm pode ser uma
varivel booleana. Neste caso a varivel ser substituda pelo seu contedo e ir executar o
comando (ou comandos) do then se o contedo da varivel for true (verdadeiro) e o
comando (ou comandos) do else se o contedo da varivel for false (falso)
(ex: if Visivel ...) .
comando (ou bloco de comandos) a instruo (ou instrues) a ser executada caso o
resultado da expresso seja true (verdadeiro). Se for uma instruo s no h necessidade de
usar chaves, porm no devemos esquecer que toda instruo termina com ponto-e-vrgula.
Exemplo: if media >= 7 System.out.println(Aprovado);
Caso haja mais de uma instruo a ser executada, preciso coloc-las entre chaves,
formando um bloco de comandos.
Exemplo: if media >= 7
{
System.out.println(Aprovado);
System.out.println(:Boas Frias !);
qtdeAprovados++;
}
60
Ao encontrar uma instruo while (while quer dizer enquanto, em portugus), o computador
resolve a expresso. Se o resultado for true (verdadeiro) ento ele executa as instrues que esto
dentro das chaves. Quando terminar de executar as instrues, ele volta a resolver a expresso. Se
ela for igual a true, ele torna a entrar no corpo do while e executar as instrues . E permanece
assim, resolvendo a expresso e executando as instrues at que o resultado seja falso. Quando, ao
resolver a expresso, o resultado for false, ento o computador no entra no corpo do bloco e segue
executando as linhas do meu programa. Veja um exemplo:
public class TestaWhile {
public static void main(String[] args){
int contador = 0;
while (contador < 10) {
System.out.println("Contador : " + contador);
contador++;
}
}
}
Crie um projeto no BlueJ e digite o cdigo acima em uma nova classe TestaWhile. Compile e
execute o programa e o resultado dever ser igual ao da Figura 37.
61
Na primeira linha do mtodo principal declarada uma varivel inteira chamada contador que
inicializada com o valor zero. A seguir testamos a condio do while pela primeira vez. O
computador substitui a varivel pelo seu contedo e a expresso vira (0 < 10) o que verdadeiro e
portanto o computador executa as instrues que esto dentro do while. A primeira instruo dentro
do corpo do while uma instruo de impresso e o computador imprime na tela Contador : 0. A
segunda instruo incrementa o contador, ou seja, soma 1 ao seu valor e portanto contador passa a
guardar o valor 1.
Voltamos a testar a condio do while e agora a expresso (1 < 10) o que tambm verdadeiro, o
que significa que o computador vai imprimir Contador : 1 e vai incrementar o valor de contador
(que passar a ser igual a 2) e volta a testar a condio do while e assim por diante.
Quando o valor da varivel contador for igual a 9 o teste do while ser (9 < 10) o que verdade e o
computador entra novamente no corpo do while, imprime Contador : 9 e incrementa o valor do
contador, que passa a ser 10.
Dessa vez, quando for feito o teste do while (10 < 10) o resultado ser falso, o que vai interromper a
execuo do while e como no h mais nenhuma instruo para ser executada aps o while, o
programa termina.
Vamos ver outro exemplo. V no BlueJ e abra o projeto Canil. Abra a classe Cachorro e acrescente
um novo mtodo latir conforme o cdigo abaixo.
public void latir(int numVezes)
{
while (numVezes > 0)
{
System.out.println(AUAUAU);
numVezes--;
}
}
Agora a classe cachorro tem trs mtodos latir, mas cada um tem uma assinatura diferente. A
assinatura do primeiro o nome do mtodo (latir) mais uma lista de parmetros vazia. A assinatura
do segundo latir e mais o parmetro latido que do tipo String. Este terceiro mtodo latir, que
acabamos de criar, tem como assinatura o nome latir e mais o parmetro numVezes que um
inteiro. Como as assinaturas so diferentes, o computador vai saber qual mtodo latir deve executar
dependendo do(s) parmetro(s) que eu passar quando invocar o mtodo. Compile a classe Cachorro
para se certificar de que no h erros.
Agora abra a classe CoralDeCachorros e altere o seu contedo para ficar igual ao cdigo abaixo:
public class CoralDeCachorros {
public static void main(String[] args){
Cachorro bidu = new Cachorro();
Cachorro duque = new Cachorro();
bidu.latir();
duque.latir(auau);
bidu.latir(3);
}
}
62
63
inicializao - aqui so criadas e inicializadas as variveis que sero usadas para controlar
o numero de iteraes (repeties). Esses comandos so executados apenas uma vez, no
incio da execuo do loop (chamamos de loop um conjunto de instrues que executado
repetidas vezes, como no caso das instrues for e while).
expresso aqui feito o teste para ver se as instrues do corpo do for sero executadas ou
no. Se o resultado do teste for verdadeiro ento ele executa as instrues, seno ele termina
a execuo da instruo for. Ou seja, as instrues sero executadas repetidamente, at que o
teste da expresso resulte em falso. Quando acontecer isto a instruo termina.
incremento ou decremento esses comandos so realizados ao final de cada iterao (ou
seja ao final de cada execuo do bloco de instrues do corpo do for). Normalmente temos
aqui instrues de incremento (somar 1) ou decremento (subtrair 1) das variveis criadas na
inicializao.
Ao encontrar uma instruo for, o computador primeiro executa o(s) comando(s) especificado na
inicializao.
A seguir ele testa a expresso para ver se vai executar as instrues de dentro do loop. Se o
resultado for verdadeiro ele executa as instrues (faz uma iterao). Ao trmino da execuo das
instrues ele executa os comandos que esto na seo incremento ou decremento. Aps executar as
instrues de incremento ou decremento, ele volta a testar a expresso para saber se vai terminar o
loop (caso o resultado da expresso seja igual a falso) ou se vai realizar nova iterao (caso o
resultado da expresso seja verdadeiro). Se o resultado da expresso der verdadeiro ele faz nova
iterao (executa as instrues do corpo do for), depois executa as instrues de
incremento/decremento e torna a testar a expresso e assim por diante at que o teste da expresso
resulte em falso, quando ento o computador ir terminar a execuo da instruo for. O programa
TestaFor traz um exemplo de uso da instruo for.
public class TestaFor {
public static void main(String[] args){
for(int i=1; i<4; i++){
System.out.println("Esta a + i + a iterao do loop);
}
}
}
Crie um novo projeto no BlueJ, crie uma classe chamada TestaFor, digite o cdigo acima,compile e
execute. O resultado deve ser igual ao mostrado na Figura 38.
64
65
em que pasta se encontra a classe que pretendemos utilizar. Fazemos isso usando a instruo de
importao import.
O programa IdadeEmDias mostra um exemplo de utilizao de uma classe importada da biblioteca
do Java:
import javax.swing.JOptionPane;
public class IdadeEmDias
{
public static void main(String[] args)
{
String stringIdade;
int idadeAnos,idadeDias;
stringIdade = JOptionPane.showInputDialog("Digite sua idade");
idadeAnos = Integer.parseInt(stringIdade);
idadeDias = idadeAnos * 365;
}
Crie um novo projeto no BlueJ, crie uma nova classe chamada IdadeEmDias, digite, compile e
execute o programa. Ao executar o programa mostra uma janela para que o usurio digite a sua
idade. Veja na Figura 39:
Figura 39 Janela de Input (o usurio deve digitar sua idade e clicar em OK)
A seguir o programa calcula a idade em dias e mostra outra janela contendo o resultado. Por
exemplo, se o usurio digitar 42, o resultado ser:
66
mtodo. Porm esta classe tem mtodos especiais que no precisam ser direcionados a nenhum
objeto, podem ser chamados somente mencionando o nome da classe. o que o programa faz, ao
invs de escrever nome-de-objeto.nome-do-mtodo, como estamos acostumados a fazer, ele escreve
nome-da-classe.nome-do-mtodo.Este mtodo abre uma janela de input (entrada) de dados, aonde
pede ao usurio para digitar a sua idade. O resultado ser atribudo varivel stringIdade. Foi usada
uma varivel do tipo String para armazenar o resultado porque qualquer coisa que o usurio digite
considerado uma String, mesmo que ele digite um nmero inteiro, como o caso aqui.
A prxima instruo um comando para transformar esta String em um nmero inteiro e o
resultado desta transformao ser atribudo varivel idadeAnos. Por exemplo, se o usurio
digitou 42 na janela, o 42 ser atribudo inicialmente varivel stringIdade como sendo a String
42. Essa String precisa ser transformada em nmero para que possamos fazer o clculo. O
comando Integer.parseInt transforma o 42 em 42. Esse 42 (nmero inteiro) ser armazenado na
varivel idadeAnos.
A seguir feita a converso para dias multiplicando o contedo de idadeAnos por 365. O resultado
armazenado na varivel idadeDias.
Finalmente a ltima instruo mostra uma janela com o resultado da converso da idade em anos
para a idade em dias. Note que showMessageDialog tambm um mtodo especial da classe
JOptionPane que tambm pode ser chamado diretamente sem necessidade da criao de objetos.
A instruo de importao pode importar apenas uma classe (como fizemos no programa
IdadeEmDias) ou um grupo de classes. Para importar um grupo de classes usamos um asterisco (*)
para indicar que queremos ter acesso a todas as classes daquela pasta. Exemplo: import java.awt.*;
No entanto se dentro da pasta indicada h sub-pastas, o uso do asterisco no nos d acesso
automtico a elas, mas somente s classes definidas dentro da pasta.
O ideal sempre colocar as instrues de importao individualmente, uma para cada pasta, mesmo
que haja vrias classes pertencentes mesma pasta. Isto ajudar a documentar o programa e a
mostrar de onde vieram as classes que estamos usando.
Para pesquisar as pastas e sub-pastas da biblioteca do Java basta ir em:
se for Windows
V em C:\Arquivos de Programas\java\jdk1.6.0_07\src.zip
O numero aps o jdk pode variar dependendo da verso que estiver instalada
se for Linux
V em /usr/java/jdk1.5.0_02/src.zip
O numero aps o jdk pode variar dependendo da verso que estiver instalada
67
Porm muito difcil abrir entender o funcionamento das classes abrindo os fontes diretamente.
Existe na pgina de downloads do Java uma pasta com a documentao das classes em HTML. Essa
documentao lista todas as informaes sobre os campos, construtores e mtodos de cada classe.
Essa pasta tem o nome de jdk-6-doc e j est no CD do Curso Bsico Java. S que est tudo em
ingls, infelizmente no existe uma verso em portugus.
68
A seguir clique no boto Continue. Ir abrir uma janela para especificar o nome e local aonde voc
vai salvar o arquivo criado. Navegue at a pasta desejada, digite um nome para o arquivo e clique
em Create (Figura 43).
Concluso
Esta apostila apresentou os aspectos bsicos da Programao e da linguagem Java. O objetivo
principal foi orientar os primeiros passos numa matria bastante extensa. Quem quiser realmente
escrever programas mais complexos ter que aprender vrias outras coisas que foram deixadas de
lado nesta apostila. Porm os conceitos e as idias bsicas por trs de um programa so sempre os
mesmos independente de sua complexidade ou tamanho.
Quem quiser apenas executar os programas criados por outras pessoas, j aprendeu o que est por
trs dos seus programas e jogos favoritos. Quem se interessar pela matria e quiser desenvolver seus
prprios programas ter um longo caminho de aprendizado e descobertas pela frente. Programar
uma das atividades mais criativas, prazerosas e divertidas da informtica. Boa Sorte e divirtam-se!
69
Bibliografia
Curso de Java Bsico Mengue, Fbio. Centro de Computao da Unicamp
Lgica de Programao Celta Informtica (www.celtainformatica.com.br)
Curso de Programao em Java Figueiredo, Luclia Camaro de. Cadernos de Informtica
Secretaria de Estado de Educao MG
Beginning Programming with Java for Dummies Burd, Barry. Wiley Publishing, Inc.
Java Short Course JGuru. (jGuru.com)
The Java Tutorial java.sun.com. (http://java.sun.com/docs/books/tutorial/java/TOC.html)
Objects First with Java a practical introduction using BlueJ Barnes, David e Kolling, Michael.
Pearson Education / Prentice Hall.
Wikipedia www.wikipedia.com.br
70
Nesta seo vamos usar os recursos do BlueJ e dois dos projetos do CD para mostrar na prtica os
conceitos de classes e objetos que vimos na teoria. O BlueJ permite que ns criemos, a partir de
uma classe, instncias (objetos) para que possamos dar ordens (invocar mtodos) sem a necessidade
de digitar um programa, compila-lo e executa-lo. Vamos fazer isto com os projetos formas e
pintura do CD.
Coloque o CD no drive de CDs e copie as pastas formas-pintura para alguma pasta no seu
computador.
Abra o BlueJ. Clique em Project e depois em Open Project (Abrir Projeto). Na janela que abrir,
navegue at a pasta aonde voc copiou as pastas formas e pintura. Repare que estas duas pastas tem
um cone diferente das outras pastas. Isto porque o BlueJ sabe que dentro desta pasta tem cdigosfonte e respectivos bytecodes. D um duplo-clique em formas (ou ento clique uma vez e em
seguida clique em Open (Abrir)).
A parte de cima da janela do BlueJ mostra as classes (programas) que compem este projeto.
Podemos ver que este projeto tm quatro classes. As setas mostram que as classes Circulo,
Quadrado e Tringulo usam objetos da classe Tela.
A parte de baixo o mundo virtual e nele habitam os objetos criados a partir das classes. Sabemos
que a classe no faz nada, ela meramente uma descrio dos atributos e mtodos. Quem pode
fazer alguma coisa (executar as ordens) o objeto. Portanto precisamos ter algum objeto no nosso
mundo virtual para que possamos dar ordens para ele.
No Java criamos objetos atravs do comando new. No BlueJ, podemos testar os mtodos, como se
ns fossemos o programa principal. Clicar nos mtodos de um objeto para dar ordens a ele o
equivalente a escrever as instrues de chamada de mtodo no programa. Os objetos so criados a
partir de uma classe, por isso clicamos com o boto direito do mouse em cima de uma classe e
escolhemos a opo new para criar um objeto (instncia) desta classe. Clique com o boto direito
em cima da classe Circulo e clique em new Circulo(). Todo objeto precisa de um nome, ento o
BlueJ ir abrir uma janela para voc digitar o nome do objeto. Veja que ele sugere um nome (neste
caso circulo1). Voc pode aceitar a sugesto e clicar em OK, ou pode escolher outro nome e clicar
em OK. Vamos aceitar a sugesto. Clique em OK.
Na parte de baixo do BlueJ (o mundo virtual) aparecer um objeto chamado circulo1. Veja que a
inicial do objeto minscula em contraste com a inicial da classe que maiscula. Para podermos
dar ordens ao objeto precisaramos pesquisar seus mtodos. O BlueJ faz isto para ns. Ele l o
cdigo-fonte da classe e anota os cabealhos dos mtodos. Ao clicarmos no objeto com o boto
direito ele mostra a lista de mtodos para que possamos escolher.
Clique com o boto direito do mouse em cima do objeto circulo1. Aparecer uma lista com doze
mtodos que so as aes que o circulo1 sabe executar. Agora vamos dar as ordens para ver o que
acontece. A partir do resultado, poderemos tirar concluses e aprender o que cada mtodo faz.
Clique no mtodo tornarVisvel(). Viu o que aconteceu? Agora clique no mtodo tornarInvisvel().
Torne a clicar no tornarVisivel(). J deu pra perceber o que eles fazem?
71
Clique agora no mtodo moverDireita(). Viu o que ele faz. Clique de novo em moverDireita().
Clique uma terceira vez. Podemos perceber que a cada vez ele move um pouco para a direita. Ser
que ele move uma distncia diferente a cada vez ou sempre a mesma distncia?
Experimente agora os mtodos moverEsquerda(), moverCima() e moverBaixo().
Vamos agora experimentar o mtodo moverHorizontal(int distancia). Repare que ele tem um
parmetro que um valor inteiro. Quando voc clicar em moverHorizontal ir abrir uma janela para
voc digitar o valor do parmetro que voc est passando para o mtodo. Experimente
moverHorizontal(70). E se agora voc ordenar ao circulo1 para moverHorizontal(50), ser que ele
vai mover mais 50 posies (pixels) para a direita ou ser que ele vai para a posio 50 no eixo x ?
Ou seja, ser que o parmetro que estamos passando para o mtodo absoluto ou relativo?
E se agora eu quiser que o circulo1 se mova 100 pixels para a esquerda? Lembre-se que o parmetro
distancia um valor inteiro e valores inteiros podem ser tanto positivos como negativos.
Tente o mtodo moverHorizontalDevagar, passando tanto valores positivos como negativos.
Experimente agora os mtodos moverVertical e moverVerticalDevagar. Lembre-se que o eixo y, na
tela do Java, invertido, ou seja, medida que nos afastamos da origem (aumentamos o valor de y)
o circulo1 vai para baixo e medida que nos aproximamos da origem (diminumos o valor de y) ele
vai para cima.
O mtodo mudarTamanho pede um parmetro inteiro. Experimente este mtodo algumas vezes,
passando valores altos e baixos como 100, 10, 50, 200, 30, etc. O que acontece se passarmos um
valor negativo como parmetro? Ser que este parmetro relativo como o moverHorizontal, que
somava o valor passado como parmetro ao valor da posioX? Ou ser que este mtodo
(mudarTamanho) pega o valor passado como parmetro para ser o novo tamanho do crculo1? Neste
caso o parmetro de mudarTamanho absoluto ou relativo? Preste ateno no nome do parmetro
(novoDimetro). Existe crculo de dimetro negativo?
Por fim o mtodo mudarCor recebe como parmetro uma String. Lembre-se, na hora de passar o
parmetro, que toda String tem que estar entre aspas. Leia o comentrio do mtodo (que aparece no
topo da janela quando invocamos o mtodo) para saber quais as cores vlidas. O que acontece se
passarmos como parmetro uma cor que no est na lista de cores vlidas?
Agora criem instncias de Quadrado e Tringulo e experimentem os seus mtodos. Vocs vo
perceber que eles se comportam de forma idntica ao circulo. A exceo o mtodo
mudarTamanho, direcionado ao triangulo, que pede dois parmetros ao invs de um. Faa vrias
chamadas deste mtodo para tentar descobrir o que o primeiro parmetro e o que o segundo. O
que acontece se voc passar um valor negativo no primeiro parmetro (altura)? E no segundo
(largura)?
Quando j tiver aprendido a movimentar os objetos, clique em Project e Close (Fechar) para fechar
este projeto e depois em Project, Open Project e depois em formas para iniciar um novo teste.
Desta vez voc ter que criar objetos para fazer o desenho abaixo:
72
73
Uma vez terminado o desenho, se voc anotou direito, dever ter feito as paredes em 4 passos, a
janela em 5 passos, o telhado em 5 passos e o sol em 6 passos.
Feche o projeto formas e abra o projeto pintura. Crie uma instncia da classe Pintura. Veja quantos
mtodos tem o pintura1. Invoque o mtodo desenhar(). O que aconteceu? Invoque os mtodos
deixarPretoEBranco() e depois o deixarColorido().
Agora abra o fonte da classe Pintura (Clique na classe Pintura com o boto direito e depois em
Open Editor (Abrir Editor)). Encontre o mtodo desenhar() e veja o seu contedo. So os mesmos
20 passos que voc deu para fazer o seu desenho. Ou seja, para fazer qualquer programa basta
conhecer as classes e saber quais so os atributos e mtodos. Ento s criar objetos da classe e dar
ordens a eles, seguindo as regras e sintaxes do Java.
Tente imaginar quais as ordens que precisam ser dadas (e pra quem elas tem que ser dadas) para
alcanar o resultado do mtodo deixarPretoEBranco. E para o mtodo deixarColorido? Confira no
fonte do Pintura o que ele fez para conseguir este efeito.
Agora altere o mtodo desenhar acrescentando novas instrues. D uma (ou mais) nova ordem
para o sol para que, ao clicar em desenhar(), o computador, alm de desenhar a casinha com o sol,
mostre um efeito de pr-do-sol, ou seja, o sol deslizando lentamente para baixo at desaparecer no
horizonte. Lembre-se que o sol (que um objeto da classe Circulo) s sabe realizar os 12 mtodos
da classe Circulo. Portanto a ordem que voc vai dar tem que ser uma das 12 que ele sabe realizar.
Depois de conseguir este efeito, desfaa a alterao que voc fez, de modo que o mtodo desenhar
fique de novo do jeito que era (desenhe uma casa e um sol parados).
Crie um novo mtodo chamado entardecer() que produz o efeito de pr-do-sol. Ou seja, voc vai
fazer a mesma coisa que antes, mas s que em vez de alterar o mtodo desenhar(), vai criar um
novo mtodo para isso. Agora, ao clicar com o boto direito em cima do objeto pintura1, devero
aparecer quatro mtodos e no apenas trs. O quarto mtodo dever ser justamente o entardecer().
Ao clicar em entardecer() a deveremos ver o sol se pondo. Lembre-se que para testar temos
primeiro que clicar em desenhar() para poder aparecer a casinha e o sol. S ento vamos clicar em
entardecer para ver o sol se por.
Se voc conseguiu fazer o mtodo entardecer() funcionar, crie agora um mtodo chamado
amanhecer(), que faz o contrrio do entardecer(), ou seja, mostra o sol subindo no cu. Lembre-se
que para testar o amanhecer() preciso primeiro desenhar() e depois entardecer().
Estas so apenas algumas idias de atividades a serem feitas com objetos dos projetos formas e
pintura, mas outras podero ser criadas, basta usar a imaginao.
74
Programa 1 - ProgramaComEco
V no BlueJ, crie um novo projeto e crie uma nova classe dentro desse projeto chamada
ProgramaComEco. Delete as linhas de exemplo criadas pelo BlueJ e digite o cdigo abaixo:
import java.util.Scanner;
public class ProgramaComEco
{
public static void main(String[] args)
{
Scanner teclado = new Scanner(System.in);
System.out.println(Digite qualquer coisa e tecle ENTER);
String linha = teclado.nextLine();
System.out.println(linha);
}
}
75
Compile e execute o programa. Este programa pede para voc digitar um texto e a seguir imprime
de volta o texto que voc digitou. O resultado deve ser algo parecido com o da Figura 45 abaixo:
76
Programa 2 - ProgramaGraficoComEco
Vamos agora criar uma verso deste programa usando recursos grficos. Ao invs de usar a janela
de console para receber dados do usurio ou imprimir frases na tela, vamos usar duas janelinhas
grficas da classe JOptionPane. V no BlueJ, crie um novo projeto e crie uma nova classe dentro
desse projeto chamada ProgramaGraficoComEco. Delete as linhas de exemplo criadas pelo BlueJ e
digite o cdigo abaixo:
import javax.swing.JOptionPane;
public class ProgramaGraficoComEco
{
public static void main(String[] args)
{
String linha = JOptionPane.showInputDialog("Digite qualquer coisa");
JOptionPane.showMessageDialog(null, "Voc digitou: " + linha);
}
}
Compile e execute o programa. Eu testei digitando a frase Testando programa grfico e obtive
como resultado a figura abaixo:
Vamos analisar o programa. Este programa pode ser considerado uma aplicao grfica porque usa
componentes grficos. Os programas grficos so bem mais complexos que as aplicaes console.
Neste exemplo vamos usar apenas umas poucas instrues grficas para no dificultar demais.
A classe JOptionPane uma classe grfica que fica armazenada na biblioteca javax.swing, portanto
comeamos o programa com a instruo de importao import javax.swing.JOptionPane;
Esta classe possui 61 mtodos. Entre eles existem alguns mtodos estticos. Um mtodo esttico
um mtodo que pode ser chamado sem a necessidade de criar um objeto e direcionar a chamada do
mtodo a este objeto. Como vimos, o normal criar um objeto (exemplo: Circulo sol = new
Circulo()) e depois chamar um mtodo direcionado quele objeto especfico
(ex: sol.tornarVisivel()).
Porm se o mtodo que pretendemos invocar esttico, no h necessidade de criar um objeto
daquela classe. Mas se no criamos um objeto quem que vai executar o mtodo? A prpria classe.
Ou seja, quem executa um mtodo esttico no o objeto mas sim a classe. A sintaxe de invocao
de um mtodo esttico : Nome-da-classe.nome-do-mtodo(). O que indica se um mtodo esttico
a presena da palavra static no cabealho do mtodo.
A primeira instruo do mtodo principal est declarando uma varivel chamada linha, do tipo
String, e est atribuindo a ela o valor retornado pelo mtodo showInputDialog da classe
JOptionPane. O mtodo showInputDialog mostra na tela uma janelinha e fica esperando o usurio
digitar na tela e clicar em OK (ou teclar ENTER) para retornar ao programa principal. Quando o
usurio digitar e clicar em OK (ou teclar ENTER) ele retorna uma String contendo o texto que o
usurio digitou. Esta String retornada pelo mtodo showInputDialog ser atribuda varivel linha.
Veja que quando chamamos o mtodo showInputDialog, passamos uma String como parmetro.
Essa String ser impressa na janelinha e normalmente digitamos um texto informando ao usurio o
que ele deve digitar. Neste programa passamos como parmetro a String Digite qualquer coisa.
Ao executar o mtodo ir aparecer na tela uma janela igual da Figura 46 abaixo:
77
Programa 3 CalculaFatorial
Este programa pede ao usurio para digitar um nmero inteiro e imprime o fatorial deste nmero.
Fatorial de um nmero igual ao produto dos nmeros 1 at o nmero desejado. Exemplos:
Fatorial de 3 = 1 * 2 * 3 = 6
Fatorial de 7 = 1 * 2 * 3 * 4 * 5 * 6 * 7 = 5.040
Fatorial de 12 = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 9 * 10 * 11 * 12 = 479.001.600
V no BlueJ, crie um novo projeto e crie uma nova classe dentro desse projeto chamada
CalculaFatorial. Delete as linhas de exemplo criadas pelo BlueJ e digite o cdigo abaixo:
78
import java.util.Scanner;
public class CalculaFatorial
{
public static void main(String[] args)
{
Scanner teclado = new Scanner(System.in);
System.out.println(Digite um numero inteiro);
int num = teclado.nextInt();
int total = 1;
int contador = num;
while (contador > 0)
{
total = total * contador;
contador--;
}
System.out.println(O fatorial de + num + : + total);
}
}
Compile e execute o programa. Se voc digitar o nmero 7, o resultado dever ser igual Figura 48:
79
zero. Porm aqui vamos usar a varivel total para multiplicar os nmeros de 1 at num, por isso
inicializamos com o valor 1.
Depois declarada uma varivel inteira chamada contador e inicializada com o valor de num.
Lembre que num est armazenando o numero digitado pelo usurio.
A seguir vem a instruo while. O computador vai executar os comandos dentro do while at que a
condio testada seja falsa. Da primeira vez que testar a condio (contador > 0). Supondo que o
usurio digitou o valor 7, a expresso se transformar em (7 > 0) que verdadeiro e o programa
executa as instrues de dentro do while. A primeira instruo total = total * contador;
Aps as substituies ela se transforma em total = 1 * 7; que resulta em 7 e portanto a varivel
total passar a armazenar o valor 7. A segunda instruo uma instruo de decremento sobre a
varivel contador, ou seja, contador vai ter seu valor diminudo de 1 e passar a valer 6.
Como no h mais instrues a serem executadas dentro do bloco do while, o programa volta a
fazer o teste da expresso (contador > 0) que desta vez se transforma em (6 > 0) o que verdadeiro
e o programa volta a entrar no corpo do while. A primeira instruo do while total = total *
contador; que desta vez se transforma em total = 7 * 6; que resulta em 42 e portanto a varivel
total passa a armazenar o valor 42. A segunda instruo decrementa o contador que passa a valer 5.
Novamente testada a condio do while e desta vez a expresso vira (5 > 0) que verdadeiro e o
programa torna a entrar no while e etc e etc.
O programa vai fazer isto at que na stima vez que ele for testar o while o contador estar valendo
1 e a expresso ser (1 > 0) o que ainda verdadeiro e o programa entra mais uma vez no while,
calcula o valor do total e decrementa o valor do contador. Desta vez contador passa a valer 0 (zero).
Quando for testar novamente a condio do while, a expresso (contador > 0) vai se transformar em
(0 > 0) o que falso e o programa termina de executar a instruo while e passa para a prxima
instruo.
A prxima instruo uma instruo de impresso que imprime o resultado da concatenao de O
fatorial de mais o contedo da varivel num (que 7) mais a String mais o contedo da
varivel total (que 5040). O resultado que vimos na Figura 48.
Programa 4 CalculaFatorial2
Vamos fazer uma outra verso do CalculaFatorial, desta vez usando os mtodos showInputDialog e
showMessageDialog em lugar da janela de console e a instruo for em lugar da instruo while.
V no BlueJ, crie um novo projeto e crie uma nova classe dentro desse projeto chamada
CalculaFatorial2 Delete as linhas de exemplo criadas pelo BlueJ e digite o cdigo abaixo:
80
import javax.swing.JOptionPane;
public class CalculaFatorial2
{
public static void main(String[] args)
{
String numero = JOptionPane.showInputDialog("Digite um numero inteiro");
int num = Integer.parseInt(numero);
int total = 1;
for (int i = 1 ; (i <= num) ; i++)
{
total = total * i;
}
JOptionPane.showMessageDialog(null,O fatorial de + num + : + total);
Este programa faz a mesma coisa que o anterior, pede para o usurio digira um nmero inteiro,
depois calcula o fatorial deste nmero e mostra o resultado em uma janela.
No programa anterior usamos o mtodo nextInt() que retorna um valor digitado pelo usurio. Aqui
estamos usando o mtodo showInputDialog que retorna uma String digitada pelo usurio. A
primeira instruo do mtodo principal declara uma varivel do tipo String chamada numero e
atribui a ela o resultado da chamada do mtodo esttico showInputDialog, aonde pedimos ao
usurio para digitar um numero inteiro. No existe na classe JOptionPane um mtodo para retornar
um valor numrico, como o caso do nextInt usado na aplicao console anterior. Qualquer coisa
que o usurio digitar (mesmo que seja apenas um valor numrico) vai ser retornado para o programa
principal como sendo uma String. Acontece que no podemos fazer clculos em cima de Strings.
Temos que transformar essa String em um valor numrico.
A segunda instruo do mtodo principal, int num = Integer.parseInt(numero); faz exatamente
isto, transforma a String digitada pelo usurio (armazenada na varivel numero) em um nmero
inteiro e armazena este nmero na varivel inteira num.
A classe Integer possui um mtodo esttico chamado parseInt que recebe uma String como
parmetro e retorna um valor inteiro. Como um mtodo esttico, no precisamos criar um objeto
da classe Integer para chamar o mtodo, basta escrever o nome da classe (Integer) mais ponto e
mais o nome do mtodo (parseInt) passando como parmetro a String que queremos transformar em
um nmero inteiro (no nosso caso a varivel numero que guarda a String digitada pelo usurio).
Esta classe Integer est na biblioteca java.lang. Teoricamente deveramos iniciar o programa
escrevendo uma instruo de importao import java.lang.Integer; para podermos ter acesso
esta classe. Ocorre que a biblioteca java.lang armazena as classes mais fundamentais do Java. Elas
so to utilizadas que no preciso importa-las para poder fazer uso delas.Qualquer classe da
biblioteca java.lang pode ser usada sem a necessidade de escrever a instruo import java.lang.
Alis a instruo de impresso (System.out.println), uma das mais usadas nos programas Java
tambm usa uma destas classes. Na verdade ao usarmos o comando de impresso estamos
chamando o mtodo esttico println() direcionado uma varivel chamada out (sada) que foi
definida dentro da classe System. Esta classe System est definida dentro da biblioteca java.lang e
por isso podemos usar o System.out.println sem ter que importar a classe.
A instruo de repetio (que no programa anterior era o while) aqui o for. Na sintaxe do for,
definimos primeiro a varivel que vai contar o numero de repeties. Neste caso estamos
declarando uma varivel inteira chamada i e estamos inicializando com o valor 1. Depois definimos
a expresso que ser testada, neste caso, (i <= num). Por fim, definimos que instruo(es) deve ser
81
executada aps a iterao (execuo dos comandos dentro do for). Neste caso, aps executar os
comandos de dentro do for, o programa vai incrementar o valor de i, ou seja, vai somar 1 ao valor
de i.
Como i foi inicializado com 1, da primeira vez que for testada a expresso (i <= num) ela se
transformar em (1 <= 7) que verdadeiro e o programa executar as instrues dentro do corpo do
for. S h uma instruo (total = total * i;) que aps as substituies virar total = 1 * 1; o que ir
armazenar o valor 1 dentro da varivel total. A seguir executada a instruo i++ que ir
incrementar o valor de i, que passar a valer 2.
No segundo teste, a expresso ser (2 <= 7) que tambm verdadeiro e o programa executar a
instruo total = total * i; que agora se transformar em total = 1 * 2; o que ir armazenar o valor 2
dentro da varivel total. A seguir i ser incrementado passando a valer 3.
No terceiro teste, a expresso ser (3 <= 7) que tambm verdadeiro e o programa executar a
instruo total = total * i; que agora se transformar em total = 2 * 3; o que ir armazenar o valor 6
dentro da varivel total. A seguir i ser incrementado passando a valer 4.
E assim por diante. Quando a varivel i estiver valendo 8, o teste da expresso (i <= num) resultar
em (8 <= 7) o que falso e o programa termina a execuo da instruo de repetio e segue em
frente.
A prxima instruo a JOptionPane.showMessageDialog que vai mostrar uma janelinha de
mensagem com o resultado do clculo.
Programa 5 CalculaRendimentoCarro
O programa a seguir pede ao usurio para digitar o numero de litros que foram necessrios para
abastecer o tanque de combustvel. A seguir pede que o usurio informe quantos quilmetros foram
rodados desde a ltima vez que ele completou o tanque. A seguir mostra o rendimento do carro, ou
seja, quantos quilmetros ele est fazendo por litro de combustvel.
import java.util.Scanner;
public class CalculaRendimentoCarro
{
public static void main(String[] args)
{
Scanner teclado = new Scanner(System.in);
System.out.println("Digite o nmero de litros");
double litros = teclado.nextDouble();
System.out.println("Digite o nmero de quilometros");
double quilometros = teclado.nextDouble();
litro");
}
}
82
Programa 6 ImprimeInvertido
Este programa pede ao usurio para digitar qualquer coisa e depois imprime na tela o texto que ele
digitou, s que impresso ao contrrio.
import java.util.Scanner;
public class ImprimeInvertido
{
public static void main(String[] args)
{
Scanner teclado = new Scanner(System.in);
System.out.println("Digite qualquer coisa e tecle ENTER");
String texto = teclado.nextLine();
String textoInvertido = "";
int tamanho = texto.length() - 1;
for (int i=tamanho ; i >= 0 ; i--)
{
textoInvertido = textoInvertido + texto.charAt(i);
}
System.out.println(textoInvertido);
}
83
84
A seguir declarada a varivel teclado que vai ler os dados digitados pelo usurio e impressa na
tela do console uma mensagem pedindo ao usurio para digitar alguma coisa na tela de console.
Na terceira instruo do mtodo principal feita a leitura do texto digitado pelo usurio e esta
String atribuda varivel texto. A seguir definida a varivel textoInvertido, tambm do tipo
String, e inicializada com o valor , ou seja uma String vazia.
A instruo seguinte invoca o mtodo length() direcionado varivel texto, diminui o valor retorna
de 1 e armazena o resultado em tamanho. Por exemplo, se o usurio digitou varginha a instruo
int tamanho = texto.length() 1; se transformar, aps a chamada de mtodo, em
int tamanho = 8 1; o que armazenar 7 na varivel tamanho.
A prxima instruo a instruo de repetio for. Na primeira seo da instruo for, declarada a
varivel inteira i e inicializada com o valor tamanho (no nosso exemplo tamanho comea com o
valor 7, que o tamanho de varginha (8) menos 1). Na segunda seo definida a expresso a ser
testada: ( i >= 0). Na terceira seo definida a instruo a ser executada ao trmino da iterao:
i--, ou seja, i ter seu valor diminudo de 1.
Na primeira vez que for testar a expresso (i >= 0) o resultado ser (7 >= 0) (lembre-se que i foi
incializada com o contedo de tamanho (7 no nosso exemplo)). Como 7 maior que zero o
resultado verdadeiro e o programa executa as instrues do corpo do for. S h uma instruo de
atribuio que armazena na varivel textoInvertido o resultado da concatenao de textoInvertido
com o resultado da invocao do mtodo texto.charAt(i). Como i comea com o valor 7, o mtodo
invocado texto.charAt(7) que retorna o caracter que ocupa a stima posio da String varginha.
Como as posies so contadas de 0 at 7, a stima posio ocupada pelo caracter a que
retornado para a instruo.
Como a String textoInvertido foi inicializada com , a instruo de atribuio se transformar em
textoInvertido = + a; Concatenar um caracter com uma String transforma o resultado em
uma String. Assim, concatenar o caracter a com uma String vazia transforma o resultado na
Stringa que ser armazenada dentro da varivel textoInvertido. A seguir a varivel i ser
decrementada passando a valer 6.
No segundo teste da expresso (i >= 0) o resultado ser (6 >= 0) que verdadeiro e o programa
entra novamente no corpo do for. Agora o mtodo texto.charAt(6) retorna o caracter h. A instruo
de atribuio ser textoInvertido = a + h; que resultar na String ah que ser armazenada na
varivel textoInvertido. Aps ao decremento, o valor de i passar a ser 5.
No terceiro teste da expresso (i >= 0) o resultado ser (5 >= 0) que verdadeiro e o programa entra
novamente no corpo do for. Agora o mtodo texto.charAt(6) retorna o caracter n. A instruo de
atribuio ser textoInvertido = ah + n; que resultar na String ahn que ser armazenada na
varivel textoInvertido. Aps ao decremento, o valor de i passar a ser 4.
E assim por diante, at que quando o valor de i for igual a 0, a expresso (i >= 0) ser igual a
(0 >= 0) o que verdadeiro e o programa tornar a entrar no corpo do for. O mtodo charAt(0)
retornar o caracter v (lembre-se que o ndice 0 equivale primeira posio da String). A instruo
de atribuio ser textoInvertido = ahnigra + v; que resultar em ahnigrav que ser
armazenada na varivel textoInvertido. Aps o decremento, o valor de i passar a ser -1.
Desta vez, quando for testada a expresso (i >= 0) ela se transformar em (-1 >= 0) o que falso e o
programa termina a execuo da instruo de repetio for e passa para a instruo seguinte.
85
Programa 7 ParOuImpar
Logo no incio pedido ao usurio digitar P se ele quiser escolher PAR ou I se ele escolher
MPAR. O que o usurio digitar ser atribudo varivel parOuImpar.
A instruo parOuImpar = parOuImpar.toUpperCase(); uma chamada ao mtodo toUpperCase()
direcionada varivel parOuImpar. Ela ir transformar a String digitada pelo usurio em maiscula,
caso o usurio digite p ao invs de P (ou i ao invs de I).
A novidade aqui a classe Random que usada para gerar nmeros aleatrios (conhecidos como
nmeros randmicos). A instruo Random aleatrio = new Random() declara uma varivel do tipo
Random chamada aleatorio e a inicializa com um novo objeto da classe Random.. A instruo
int numComputador = aleatorio.nextInt(11); escolhe um nmero inteiro entre 0 e 10 e atribui
varivel numComputador.
86