You are on page 1of 66

Java

Java uma linguagem de programaoorientada a objeto desenvolvida na dcada de 90 por umaequipe de programadores chefiada por James Gosling, na empresaSun Microsystems. Diferentemente das linguagens convencionais,que so compiladas para cdigo nativo, a linguagemJava compilada para um "bytecode" que executado por uma mquina virtual. A linguagem de programaoJava a linguagem convencional da Plataforma Java, masno sua nica linguagem.

Histrico
Em 1991, na Sun Microsystems, foi iniciado o GreenProject, o bero do Java, uma linguagem de programaoorientada a objetos. Os mentores do projeto eram Patrick Naughton,Mike Sheridan, e James Gosling. O objetivo do projeto noera a criao de uma nova linguagem de programao,mas antecipar e planejar a prxima onda domundo digital. Eles acreditavam que, em algum tempo, haveria umaconvergncia dos computadores com os equipamentos e eletrodomsticoscomumente usados pelas pessoas no seu dia-a-dia. Para provar a viabilidade desta idia, 13pessoas trabalharam arduamente durante 18 meses. No verode 1992 eles emergiram de um escritrio de Sand Hill Roadno Menlo Park com uma demonstrao funcional daidia inicial. O prottipo se chamava *7 (leia-seStarSeven), um controle remoto com uma interfacegrfica touchscreen. Para o *7, foi criado um mascote,hoje amplamente conhecido no mundo Java, o Duke. O trabalho doDuke no *7 era ser um guia virtual ajudando e ensinando o usurioa utilizar o equipamento. O *7 tinha a habilidade de controlardiversos dispositivos e aplicaes. James Goslingespecificou uma nova linguagem de programao parao *7. Gosling decidiu batiz-la de Oak, quequer dizer carvalho, uma rvore que ele podia observarquando olhava pela sua janela. O prximo passo era encontrar um mercadopara o *7. A equipe achava que uma boa idia seria controlartelevises e vdeo por demanda com o equipamento.Eles construram um demo chamado MovieWood, mas infelizmenteera muito cedo para que o vdeo por demanda bem como asempresas de TV a cabo pudessem viabilizar o negcio. Aidia que o *7 tentava vender, hoje j realidade em programas interativos e tambm na televisodigital. Permitir ao telespectador interagir com a emissora ecom a programao em uma grande rede cabos, eraalgo muito visionrio e estava muito longe do que as empresasde TV a cabo tinham capacidade de entender e comprar. A idiacerta, na poca errada. Entretanto, o estouro da Internet aconteceu e rapidamenteuma grande rede interativa estava se estabelecendo. Era este tipode rede interativa que a equipe do *7 estava tentando vender paraas empresas de TV a cabo. E, da noite para o dia, no eramais necessrio construir a infra-estrutura para a rede,ela simplesmente estava l. Gosling foi incumbido de adaptaro Oak para a Internet e em janeiro 1995 foi lanada umanova verso do Oak que foi rebatizada para Java. A tecnologiaJava tinha sido projetada para se mover por meio das redes dedispositivos heterogneos, redes como a Internet. Agoraaplicaes poderiam ser executadas dentro dos browsersnos Applets Java e tudo seria disponibilizado pela Internet instantaneamente.Foi o esttico HTML dos browsers que promoveu a rpidadisseminao da dinmica tecnologia Java.A velocidade dos acontecimentos seguintes foi assustadora, o nmerode usurios cresceu rapidamente, grandes fornecedores detecnologia, como a IBM anunciaram suporte para a tecnologia Java. Desde seu lanamento, em maio de 1995, aplataforma Java foi adotada mais rapidamente do que qualquer outralinguagem de programao na histria da computao.Em 2003 Java atingiu a marca de 4 milhes de desenvolvedoresem todo mundo. Java continuou crescendo e hoje uma refernciano mercado de desenvolvimento de software. Java tornou-se popularpelo seu uso na Internet e hoje possui seu ambiente de execuopresente em web browsers, mainframes, SOs, celulares, palmtopse cartes inteligentes, entre outros.

Padronizao
Em 1997 a Sun Microsystems tentou submeter a linguagema padronizao pelos orgos ISO/IEC e ECMA,mas acabou desistindo. Java ainda um standard de fato,que controlada atravs da JCP Java Community Process.Em 13 de Novembro de 2006, a Sun lanou a maior parte doJava como Software Livre sob os termos da GNU General Public License(GPL). Em 8 de Maio de 2007 a Sun finalizou o processo, tornandopraticamente todo o cdigo Java como software de cdigoaberto, menos uma pequena poro que a Sun nopossui copyright.

Principais Caractersticas daLinguagem Java


A linguagem Java foi projetada tendo em vista osseguintes objetivos:

Orientao a objeto - Baseado no modelo de Smalltalk e Simula67;

y y y

Portabilidade - Independncia de plataforma - "write once run anywhere"; Recursos de Rede - Possui extensa biblioteca de rotinas que facilitam a cooperao com protocolos TCP/IP, como HTTP e FTP; Segurana - Pode executar programas via rede com restries de execuo;

Alm disso, podem-se destacar outras vantagensapresentadas pela linguagem:

y y y y y y y

Sintaxe similar a Linguagem C/C++. Facilidades de Internacionalizao - Suporta nativamente caracteres Unicode; Simplicidade na especificao, tanto da linguagem como do "ambiente" de execuo (JVM); distribuda com um vasto conjunto de bibliotecas (ou APIs); Possui facilidades para criao de programas distribudos e multitarefa (mltiplas linhas de execuo num mesmo programa); Desalocao de memria automtica por processo de coletor de lixo (garbage collector); Carga Dinmica de Cdigo - Programas em Java so formados por uma coleo de classes armazenadas independentemente e que podem ser carregadas no momento de utilizao.

Mquina Virtual Java


Programas Java no so traduzidospara a linguagem de mquina,como outras linguagens estaticamentecompiladas e sim para uma representao intermediria,chamada de bytecodes. Os bytecodes so interpretados pela mquinavirtual Java (JVM - Java Virtual Machine). Muitas pessoas acreditamque por causa desse processo, o cdigo interpretado Javatem baixo desempenho. Durante muito tempo esta foi uma afirmaoverdadeira. Porm novos avanos tm tornadoo compilador dinmico (a JVM), em muitos casos, mais eficienteque o compilador esttico. Java hoje j possui um desempenho prximodo C++. Isto possvel graas a otimizaescomo a compilao especulativa, que aproveita otempo ocioso do processador para pr-compilar bytecodepara cdigo nativo. Outros mecanismos ainda mais elaboradoscomo o HotSpot da Sun, que guarda informaes disponveissomente em tempo de execuo (ex.: nmerode usurios, processamento usado, memria disponvel),para otimizar o funcionamento da JVM, possibilitando que a JVMv "aprendendo" e melhorando seu desempenho.Isto uma realidade to presente que hoje fcil encontrar programas corporativos e de missocrtica usando tecnologia Java. No Brasil, por exemplo,a maioria dos Bancos utiliza a tecnologia Java para construirseus home banks, que so acessados por milhares de usuriosdiariamente. Grandes stios como o eBay utilizam Java paragarantir alto desempenho. E a cada ano Java tem se tornado maisrpido, na medida que se evolui o compilador dinmico. Essa implementao no entanto temalgumas intrnsecas. A pr-compilaoexige tempo, o que faz com que programas Java demorem um temposignificativamente maior para comearem a funcionar. Soma-sea isso o tempo de carregamento da mquina virtual. Issono um grande problema para programas que rodamem servidores e que deveriam ser inicializados apenas uma vez.No entanto isso pode ser bastante indesejvel para computadorespessoais onde o usurio deseja que o programa rode logodepois de abri-lo. A prxima verso da mquinavirtual produzida pela Sun promete novos recursos que irominimizar este fato.1 O Java ainda possui uma outra desvantagem considervelem programas que usam bastante processamento numrico.O padro Java tem uma especificao rgidade como devem funcionar os tipos numricos. Essa especificaono condiz com a implementao de pontosflutuantes na maioria dos processadores o que faz com que o Javaseja significativamente mais lento para estas aplicaesquando comparado a outras linguagens. Os bytecodes produzidos pelos compiladores Javapodem ser usados num processo de engenharia reversa para a recuperaodo programa-fonte original. Esta uma caractersticaque atinge em menor grau todas as linguagens compiladas. No entantoj existem hoje tecnologias que "embaralham"e at mesmo criptografam os bytecodes praticamente impedindoa engenharia reversa.

Extenses
Extenses em Java:
y y y
J2SE (Standard Edition) J2EE (Enterprise Edition) J2ME (Micro-Edition for PDAs and cellular phones)

y y y y y y y y y y y y y y y y y y y y y y y y y y

JCE (Java Cryptography Extension) JMF (Java Media Framework) JNDI (Java Naming and Directory Interface) JSML (Java Speech API Markup Language) JDBC (Java Database Connectivity) JMS (Java Message Service) JAAS (Java Authentication and Authorization Service) JDO (Java Data Objects) JAIN (Java API for Integrated Networks) JDMK (Java Dynamic Management Kit) Jini (a network architecture for the construction of distributed systems) Jiro JXTA (open source-based peer-to-peer infrastructure) Java Card JavaSpaces JMI (Java Metadata Interface) JMX (Java Management Extensions) JSP (JavaServer Pages) JSF (JavaServer Faces) JNI (Java Native Interface) J3D (A high level API for 3D graphics programming) JOGL (A low level API for 3D graphics programming, using OpenGL) OSGi (Dynamic Service Management and Remote Maintenance) SuperWaba (JavaVMs for handhelds) MARF (Modular Audio Recognition Framework) JavaFX

Frameworks
possvel utilizar frameworks parafacilitar o desenvolvimento de aplicaes. Dentreos mais utilizados pode-se destacar:

y y y y y

Hibernate ferramenta para ORM; Spring ferramenta que auxilia principalmente implementao de injeo de dependncias e inverso de controle; Log4j ferramenta para facilitar a criao de logs na aplicao; Junit ferramenta para auxiliar na criao de testes unitrios; Struts controlador MVC (Model 2) web.

Ambientes de desenvolvimento
possvel desenvolver aplicaesem Java atravs de vrios ambientes de desenvolvimentointegrado (IDE's). Dentre as opes mais utilizadaspode-se destacar:

y y y y y y y y y

Eclipse um projeto aberto iniciado pela IBM; NetBeans um ambiente criado pela empresa Sun Microsystems; JBuilder um ambiente desenvolvido pela empresa Borland; JDeveloper uma IDE desenvolvida pela empresa Oracle; JCreator um ambiente desenvolvido pela Xinox. BlueJ um ambiente desenvolvido por uma faculdade australiana(muito bom para iniciantes). Greenfoot bem parecido com o BlueJ JGRASP bom para intermedirios, feito pela equipe do projeto GRASP. IntelliJ IDEA uma IDE desenvolvida pela JetBrains (considerada por muitos a melhor IDE do mercado).

Certificaes
Existem 8 tipos de certificaesda Sun Microsystems para Java:

y y y y y y y y y

Sun Certified Enterprise Architect (SCEA) Sun Certified Mobile Application Developer (SCMAD) Sun Certified Developer For Java Web Services (SCDJWS) Sun Certified Business Component Developer (SCBCD) Sun Certified Web Component Developer (SCWCD) Sun Certified Java Developer (SCJD) Sun Certified Java Programmer (SCJP) Sun Certified Java Associate (SCJA) Cada certificao testa algum tipo de habilidade dentro da plataforma e linguagem Java. Todos os testes so realizados pela empresa Prometric e so reconhecidos internacionalmente.

Comunidade
A comunidade de desenvolvedores Java rene-seem grupo denominados JUGs (Java User Groups). No Brasil o movimentode grupos de usurios expandiu-se bastante e tem formadoalguns dos maiores grupos de usurios Java do mundo, comopor exemplo o PortalJava e o GUJ.

Licena
A Sun disponibiliza a maioriadas distribuies Java gratuitamente e obtmreceita com programas mais especializados como o Java EnterpriseSystem. Em 13 de novembro de 2006, Sun liberou partes de Javacomo software livre, sob a licena GNU General Public License(GPL). A liberao completa dos programas fontesob a GPL esperada para o primeiro trimestre de 2007.

O que necessrio para programar em JAVA


Para programar em Java, no necessrio ter programado antes. Porm, ficaria mais fcil se tiver conhecimento em linguagem Orientada a Objeto, porque Java totalmente estruturada em objetos (Classes, mtodos, abstrao, etc). Para comear a programar ser necessrio fazer o download do JDK (Java Development Kit - Kit de desenvolvimento Java) que gratuito e pode ser obtido direto do site da Sun Microsystem. Alm disso, tambm, um compilador de Java. Existem vrios tipos, uns mais leves e simples e outros mais pesados e complexos de usar. Se no souber qual usar, veja nossa lista de compiladores Java. Ento, mos obra, instale um compilador e comece seu projeto. V para o primeiro programa em Java.

Primeiro Programa em Java


Veremos aqui o nosso primeiro cdigo em linguagem Java. A nica coisa que esse programa faz imprimir (mostrar) na tela uma mensagem dizendo: Bem vindo ao mundo Java!.

1.//Primeiro programa em Java 2.public class MeuPrimeiroPrograma { 3.public static void main(String[] args) { 4.System.out.println("Bem vindo ao mundo Java!"); 5.} 6.}
Primeiramente, iremos entender algumas estruturas bsicas da linguagem.

//
Usamos // para indicar que foi iniciado um comentrio. Um comentrio serve apenas para documentar o cdigo. Isso quer dizer que, ao ser executado este programa, as linhas marcadas como comentrio sero ignoradas.

Este tipo de comentrio de linha nica, ou seja, comea nas barras e termina no final da linha. Se quisermos criar comentrio de vrias linhas podemos utilizar /* */, no qual /* inicia o comentrio e */ termina. Por exemplo: //Este um comentrio de uma linha /*Este um comentrio de vrias linhas*/

public class MeuPrimeiroPrograma


public class MeuPrimeiroPrograma a criao da classe. Como Java totalmente orientado a objeto, sua programao feita dentro de classes e mais classes. O assunto de classes ser abordado mais afrente. O importante a princpio entender que o programa para funcionar deve ter pelo menos uma classe com o mtodo principal (main).

public static void main


public static void main o mtodo principal do cdigo. Quando executamos um programa esse mtodo que chamado. Em outras palavras, sem ele no h programa.

(String[ ] args)
(String[] args) o argumento passado ao mtodo main. Qualquer programa pode ser iniciado ou no com argumentos que modificam sua execuo, trataremos futuramente de argumentos com programas.

{}
As chaves so usadas para marcar o bloco de dados. No caso deste algortmo, ele marca o cdigo que ser executado na classe MeuPrimeiroPrograma e tambm todo o cdigo que ser executado quando o mtodo main for chamado.

System.out.println
System.out.println a sada padro de Java. este mtodo que indica o que deve aparecer na tela.

("Bem vindo ao mundo Java!")


("Bem vindo ao mundo Java!") o argumento do mtodo System.out.println. Neste caso o que deve ser apresentado na tela. Toda linha de comando em Java termina com um ponto-e-vrgula (;). Bem, isso o necessrio para comearmos a programar em Java. Logicamente, muitos conceitos foram deixados de lado nesta pequena prvia, mas veremos mais aprofundadamente nas prximas pginas.

Regras e convenes de nomenclatura


Quando programamos em Java, devemos levar em considerao as convenes de nomenclatura para deixar nosso cdigo o mais legvel e documentvel possvel, pois um dos objetivos da programao orientada a objetos o reaproveitamento do cdigo. muito provvel que quem no tenha experincia com programao sinta dificuldade de identificar todos os termos utilizados neste artigo, mas garantimos que tudo que ser visto aqui ser detalhado mais adiante, embora que este artigo se torna trivial a medida que programamos. Portanto, quem j conhece programao em algum outro tipo de linguagem (como Delphi ou C++) aconselhamos que prossiga para a prxima pgina. Porm, se nunca programou antes, com certeza, este artigo ser didtico o suficiente para que entenda essas regras. Muitos compiladores como Eclipse e NetBeans do um grande auxilio na hora de criarmos nosso projeto nos informando sobre as convenes de nomenclatura no momento que estamos criando os pacotes, classes, etc...

Nome de Classes
Por conveno, toda classe deve comear com uma letra maiscula e, de preferncia, no pode conter letras no ASCII (caracteres de lngua de origem latina, como caracteres acentuados).

Portanto, no possvel declarar uma classe com qualquer caracter especial (@, #, $, %, &, *, _, etc...) ou nmero. Caso o nome de uma classe seja composto por mais de uma palavra, a primeira letra de cada palavra deve ser em maiscula. O nome da classe deve ser exatamente o mesmo nome de seu arquivo fonte ( .java ). O nome da classe deve fazer referncia total ao seu objeto (atributos e mtodos contidos dentro da classe). Por exemplo: se tivermos uma classe com os atributos canal, volume e sintonia; e os mtodos mudarCanal (), aumentarVolume () e diminuirVolume (); ento, possivelmente chamaramos esta classe de TV ou Televisao. Contudo, em uma classe que contivesse o atributo corDasPenas e o mtodo voar () jamais chamaramos de Pessoa (por que pessoas no tem penas e nem voam). Exemplos de nomes de classes: Pessoa, ImpostoDeRenda, Conta, AgenciaDeEmprego, ...

Nome de Pacotes
Os pacotes devem comear com uma letra minscula e podem usar letras no ASCII. Jamais poderemos iniciar o nome de um pacote com caracteres especiais (@, #, $, %, &, *, _, etc...) ou nmero. Caso o nome de um pacote seja composto por mais de uma palavra, a primeira letra de cada palavra deve ser em maiscula. O nome do pacote deve ser o mesmo nome da pasta a qual ele se refere. Por exemplo, se os arquivos fonte esto na pasta criptografia, ento o nome do pacote deve ser criptografia. O nome do pacote deve fazer referncia total s funes exercidas pelas classes dentro do pacote, pois pacotes servem basicamente para organizar os arquivos de cdigo fonte de nosso projeto. Exemplos de nomes de pacotes: criptografia, usurios, conexesDeBancoDeDados , ...

Nome de atributos ou variveis


Os atributos (variveis) podem comear com qualquer letra e os caracteres $ ou _, porm no podem comear com nmeros. Caso o nome de um atributo (varivel) seja composto por mais de uma palavra, a primeira letra de cada palavra deve ser em maiscula. Exemplos de nomes de atributos ou variveis: x, y, resultado, valorDeX, valorDeY, ligado, ...

Nome de atributos finais ou constantes


Os atributos finais (constantes) devem ser escritos em letras maisculas. Usamos underline (_) para separar nomes compostos de atributos finais (constantes). Exemplos de nomes de atributos finais ou constantes: TAMANHO, PARAR_DE_EXECUTAR, ...

O que so atributos e variveis


Para quem j programou antes em alguma linguagem de programao no orientada a objetos, deve achar estranho o termo atributo porque, na verdade, est mais acostumado com o termo varivel. Mas, qual a diferena entre atributos e variveis? Nenhuma. Atributos e variveis so a mesma coisa em questo de funcionalidade. Ambos so endereos de memria que tem um espao ou tamanho definido de acordo com o tipo de dado que ser guardado, por exemplo: caracter, nmero, nmero decimal, etc. Em Java, costumamos utilizar o termo atributo, que nada alm do que uma varivel que est dentro de uma classe. Como tudo que fazemos em Java est contido dentro de uma classe, ento usamos o termo atributo ao invs de varivel.

Tipos de dados e declarao de atributos


Todo programa de computador deve ser capaz de lidar com dados para conseguir fazer seus processos como, por exemplo, somar, multiplicar, dividir, etc... Usar atributos a melhor forma de manipular os dados.

Os tipos de dados so o que definem a quantidade de memria do computador que ser utilizado para guardar tal dado. Cada tipo de dado tem um tamanho diferente e por consequncia seu alcance tambm. O que queremos dizer que se declararmos um atributo para guardar um nmero inteiro, jamais poderemos guardar um nmero decimal, porque um nmero decimal ocupa mais espao de memria que um inteiro. Para declararmos qualquer tipo de atributo, usamos a seguinte ordem: primeiro o tipo de dado e depois o nome do atributo. Se no souber como nomear um atributo, veja as regras e convenes de nomenclatura. Vamos iniciar com os tipos de dados inteiros que so os mais simples. Em Java, os nmeros inteiros so divididos em quatro tipos: byte, short, int e long. Esses quatro guardam o mesmo tipo de dado, mas ocupam espaos de memria diferente, o que afeta em seu alcance. O tipo byte o de menor alcance entre os inteiros. Como o prprio nome sugere, ele consome apenas um byte (8 bits) e pode guardar valores entre -128 e 127. O tipo short guarda inteiros de 2 bytes (16 bits) e pode guardar nmeros entre -32.768 a 32.767. O tipo int o tipo de dado mais comum. Ele consome 4 bytes (32 bits) e guarda valores entre 2.147.483.648 e 2.147.483.647. Long o tipo de dado com maior alcance entre os inteiros. Consequentemente, tambm o que ocupa mais espao (8 bytes ou 64 bits). Tem um grande alcance que fica entre -9,22E+18 (exatos -9.223.372.036.854.775.808) e 9,22E+18 (exatos 9.223.372.036.854.775.807). Existe os tipos de dados prprios para caracteres que o char. O tipo char ocupa 2 bytes, o que torna Java ideal para programar em lngas latinas, asiticas ou qualquer outra que utilize caracteres diferentes do padro ASCII. O padro ASCII utiliza apenas um byte que fornece 256 letras diferentes, mas o padro utilizado em Java (ISO) nos d a possibilidade de at 65.536 caracteres diferentes. Para nmeros decimais utilizamos dois tipos de dados, dependendo da necessidade de seu alcance e preciso (nmeros aps a vrgula). O tipo de dado mais comum para nmero decimal o float. Em um tipo de dado float, podemos guardar nmeros grandes que vo desde 1,4E-45 at 3,4028235E+38 Para nmero decimais com grande preciso ou valores extraordinrios (geralmente utilizados em matemtica aplicada e complexa como clculos fsicos, qumicos, astrolgicos, meteorolgicos, etc) utilizamos o tipo de dado double. Double o tipo de dado mais complexo que h em Java e o maior valor possvel de se armazenar 1,797.693.134.862.315.7E+308. Muito mais do que qualquer programador precisa. Para ilustra melhor essa explicao, abaixo est um pequeno algortmo com alguns atributos e seus valores mnimos e mximos.

01.public class TiposDeDados { 02.public static void main(String[] args) { 03.System.out.println("Tipos de dados em Java: \n" + 04."\nMenor Byte: " + Byte.MIN_VALUE + 05."\nMaior Byte: " + Byte.MAX_VALUE + 06."\nMenor Short Int: " + Short.MIN_VALUE + 07."\nMaior Short Int: " + Short.MAX_VALUE + 08."\nMenor Int: " + Integer.MIN_VALUE + 09."\nMaior Int: " + Integer.MAX_VALUE + 10."\nMenor Long: " + Long.MIN_VALUE + 11."\nMaior Long:" + Long.MAX_VALUE + 12."\nMenor Float: " + Float.MIN_VALUE + 13."\nMaior Float: " + Float.MAX_VALUE + 14."\nMenor Double: " + Double.MIN_VALUE + 15."\nMaior Double: " + Double.MAX_VALUE); 16.} 17.}

Atribuio de Valores a Variveis ou Atributos


Como vimos, h vrios tipos de dados em Java, cada um com um consumo de memria determinado que afeta diretamente o seu alcance. Veremos agora como atribuir valores a esses endereos de memria (atributo ou varivel). Para atribuirmos valor a uma varivel ou atributo usamos o operador =. Neste caso, o sinal de igual no significa igualdade, mas que um valor ser atribudo. A regra bsica que sempre o que estiver esquerda do "=" receber o valor que estiver direita. Por exemplo: se expressarmos var1 = 10 queremos dizer que a varivel var1 receber o nmero 10. Pronto! Agora, temos o nmero 10 gravado na memria. Podemos tambm atribuir valores contidos em outras variveis. Por exemplo: var1 = 20; var2 = var1; A varivel var1 recebe o nmero 20, depois a varivel var2 recebe o valor de var1 (que 20). Pronto! Agora, temos duas variveis guardando o mesmo nmero (20).

Inicializao de variveis ou atributos


Muitas vezes, precisamos inicializar as variveis ou atributos para que possuam um valor desde o incio do programa. Como h muitos tipos de dados em Java, seus criadores desenvolveram formas de escrita para que diferenciam os vrios tipos de dados. Primeiramente, comearemos com os mais simples: os inteiros. Os nmero inteiros comuns e do tipo byte so os mais simples de se inicializar, pois basta atribuirmos seu valor diretamente. Logicamente, precavendo-se dos limites de alcance do tipo inteiro vistos na pgina de tipos de dados. Por exemplo: int var1 = 10; int var2 = 500; int var3 = 65000; byte var1 = -100; byte var2 = 50; Os nmeros inteiros longos tm duas formas de serem inicializados. Podemos escrev-lo diretamente se, e somente se, seu valor for menor que o alcance de um inteiro comum. Mas se o valor atribudo for maior que o valor permitido por um inteiro comum, ento, no final deve ser acrescentado uma letra L (maiscula ou minscula, no h diferena aqui). Exemplo: long long long long var1 var2 var3 var4 = = = = -65000; 3590; 15000000000L; -6740000000L;

A inicializao do tipo double e float um pouco diferente. possvel apenas digitar um nmero como sendo inteiro que o compilador entender facilmente, porm, se quisermos utilizar as casas decimais, devemos utilizar um ponto para separar a parte inteira da decimal. Outro fato ao utilizar casas decimais que o tipo float deve ser diferenciado do tipo double. Conseguimos fazer isso facilmente digitando uma letra F ao final do nmero (no importa se a letra maiscula ou minscula). Exemplo: double var1 float var1 = double var2 float var2 = = 12045741359; 745621; = 10.658745965; 0.5f;

Char deve ser inicializado com uma letra entre aspas simples. O importante entender que em uma varivel do tipo char s pode ser colocada uma letra, no uma frase. Alm do mais, neste caso h diferena entre maisculas e minsculas. Exemplo: char var1 = 'a'; char var2 = 'A'; Se quisermos criar uma frase devemos guarda-la em uma string. Apesar de String no ser um tipo de dado em Java, mas sim uma classe, este com certeza o elemento mais utilizado. Uma cadeia de caracteres (string) pode ser inicializada de trs formas: 1) Como uma string inexistente, ou

seja, sem valor algum. Para isso utilizamos a palavra reservada null; 2) Como uma frase vazia; 3) Como uma string completa. Com exceo da inexistente, toda string deve estar dentro de aspas duplas ( " " ). Se por acaso, precisarmos digitar uma aspas dentro de uma string, estas aspas devem vir precedidas de uma barra invertida (\). Exemplo: String String String String var1 var2 var3 var4 = = = = null; ""; "Cadeia de caracteres"; "entre aspas: \"String em Java\".";

O tipo booleano possui apenas dois valores: verdadeiro e falso. True para verdadeiro e False para falso. Exemplo: boolean var1 = true; boolean var2 = false; Neste tipo de dado no h possibilidade de ter outro valor.

Mtodo de Sada Padro


Um mtodo de sada utilizado para mostrar alguma coisa ao usurio. No caso de Java, existe um mtodo padro que utiliza uma sada padro (monitor de vdeo) para criar a comunicao com o usurio - estamos falando de println. O mtodo println faz parte da classe System que controla a maioria das funcionalidades do computador, e se tratando de uma sada, mais especificamente de out. Basicamente, o mtodo println imprime na tela uma string (cadeia de caracteres - frase) que passada ao mtodo como argumento entre parnteses. A sada padro exibida sempre no console e no em uma janela. O importante saber que o mtodo PRINTLN sempre pular uma linha quando seu argumento chega ao final. Ento, procedemos da seguinte maneira: 1) A classe ao qual pertence (System); 2) o membro que indica a sada (out); 3) o mtodo (println); 4) O argumento contendo a string que deve ser apresentada na tela. O mtodo, resumidamente, ficaria assim: System.out.println ("string")

1.public class ExemploDeSaidaPadrao { 2.public static void main(String[] args) { 3.System.out.println("Sada Padro em Java"); 4.System.out.println("Linha 1"); 5.System.out.println("Linha 2"); 6.System.out.println("Linha 3"); 7.} 8.}
Uma outra forma de sada padro o print. A nica diferena entre println e print que ao final de seu argumento ele no ir pular nenhuma linha. Dessa forma podemos criar uma linha contnua com vrios print em linhas diferentes.

1.public class ExemploDeSaidaComPrint { 2.public static void main(String[] args) { 3.System.out.print("Sada Padro "); 4.System.out.print("usando "); 5.System.out.print("o mtodo "); 6.System.out.print("print"); 7.} 8.}

Controle de Texto

Outra possibilidade interessante nos mtodos de sada so os controles de texto. Os controles de texto so dados por caracteres chaves que so indicados com uma barra invertida antes dele. Veja a lista abaixo: \n - pula uma linha \t - cria uma tabulao (o mesmo que apertar a tecla TAB) \b - retorna o cursor um caracter \r - retorna o cursor ao incio da linha

1.public class ExemploDeControleDeTexto{ 2.public static void main(String[] args) { 3.System.out.print("Site:\t"); // cria uma tabulao 4.System.out.print("tiexpert\n"); //pula uma linha 5.System.out.print("O ponto de encontro do estudante de TI\r"); 6.// pe o cursor no incio da linha 7.} 8.}

Apresentando valores de variveis ou atributos


Podemos facilmente demonstrar o valor de uma varivel ou atributo bastando apenas dar como argumento a varivel. O prprio mtodo println ou print se encarrega de converter o valor em uma string, ou seja, ele transforma o valor nmero em um texto que o representa. Veja o exemplo:

01.public class ApresentandoVariaveis{ 02.public static void main(String[] args) { 03.int inteiro = 200; 04.float decimal = 0.5f; 05.char letra = 'J'; 06.System.out.println (inteiro); 07.System.out.println (decimal); 08.System.out.println (letra); 09.} 10.}
Tambm possvel exibir o resultado de uma operao matemtica (processo) executado dentro da prpria sada padro.

1.public class ApresentandoResultados{ 2.public static void main(String[] args) { 3.int inteiro = 200; 4.float decimal = 0.5f; 5.System.out.println (inteiro + decimal); 6.} 7.}
Obs.: Tenha cuidado ao apresentar resultados de nmeros junto com texto, pois nesse caso haver a concatenao de string, ou seja, a juno de duas ou mais cadeias de caracteres.

Concatenao
Concatenao o ato de unir duas ou mais cadeias de caracteres (strings). Por muito tempo, operaes envolvendo strings eram os pesadelos de qualquer programador, pois havia a necessidade de tratar o elemento pelo seu dado bruto, ou seja, caracter por caracter. Ento, juntar por exemplo, duas frases era um trabalho rduo. Com o surgimentoda orientao a objeto e o advento do Java, as operaes envolvendo strings foram muito simplificadas. A melhoria mais significativa nesse assunto, sem sombra de dvidas, foi utilizar a concatenao de strings. A concatenao de strings dada pelo operador +, mas no o confunda com o operador de adio que utiliza o mesmo smbolo.

Dessa forma, com apenas este smbolo, podemos unir duas cadeias de caracteres diferentes em apenas uma. Veja este exemplo, que apesar de bobo, ilustra exatamente o que acontece na concatenao: Joo + zinho = Joozinho; Passa + tempo = Passatempo; beija + - + flor = beija-flor. Acredite, simples desse jeito. Colocando isso em um cdigo ficaria:

1.public class ConcatenacaoSimples { 2.public static void main(String[] args) { 3.String palavra1 = "tele"; 4.String palavra2 = "fone"; 5.System.out.println(palavra1 + palavra2); 6.} 7.}
O melhor da concatenao que no precisa ser uma palavra que faa sentido porque o computador no verifica se faz sentido, ele simplesmente junta a cadeia de caracteres. Portanto, poderamos muito bem fazer isso:

01.public class ConcatenacaoComposta { 02.public static void main(String[] args) { 03.String part1 = "De"; 04.String part2 = "se"; 05.String part3 = "nc"; 06.String part4 = "or"; 07.String part5 = "aj"; 08.String part6 = "ad"; 09.String part7 = "o"; 10.System.out.println(part1+part2+part3+part4+part5+part6+part7); 11.} 12.}
A concatenao de strings ajuda muito no momento que usamos o mtodo de sada padro println, porque ao invs de utilizarmos vrias vezes o mesmo mtodo, podemos apenas concatenar a string anterior com a string posterior, ou seja, juntar a string de cima com a string da linha de baixo. Veja o exemplo:

1.public class ConcatenacaoComPrintln { 2.public static void main(String[] args) { 3.System.out.println("Bem vindo ao mundo Java!\n\n" + 4."Este um exemplo prtico de concatenao de string.\n" + 5."Aqui, a string da linha de cima " + 6."sempre concatenada com a string da linha de baixo" ); 7.} 8.}

Cuidados ao concatenar
Apesar da concatenao ser algo bem simples de ser feito, devemos ter alguns cuidados. Pois como podemos perceber, ele tambm o smbolo utilizado para fazer operaes de adio. O que queremos dizer que, se por exemplo, quisermos marcar um nmero de telefone em uma nica string e tivermos na verdade dois nmeros inteiros distintos, o resultado ser desastroso. Veja: Telefone: 998 + 1234, resultaria em Telefone: 2232. Acabamos de perder o nmero de telefone. Ento, o mais sensato se lembrar que concatenao s ocorre entre uma string e outro dado (no necessariamente precisa ser uma string tambm). Ento, para conseguirmos juntar os dois nmeros acima, pelo menos um deles deve ser uma string. Telefone: "998" + 1234, ou Telefone: 998 + "1234". Esse pensamento se torna mais complicado a medida que temos que concatenar uma uma operao no meio da string. Exemplo:

"CCXXVI em algarismos romanos so " + 200 + 20 + 6. Aqui, ao invs de representar a soma de 200 + 20 + 6, que seria 226, representada a total concatenao de todos os elementos. O que resultaria em "CCXXVI em algarismos romanos so 200206". Mas este problema fcil de resolver, basta indicarmos com os parnteses que a operao matemtica deve ser executada primeiro. Representando ficaria: "CCXXVI em algarismos romanos so " + (200 + 20 + 6). O que consequentemente, representaria "CCXXVI em algarismos romanos so 226".

Processos
Os processos so contas matemtica (clculos) que podem ser feitos com nmeros, variveis ou ambos. Abaixo est uma tabela com os operadores mais comuns + * / % ++ -adio ou concatenao subtrao multiplicao diviso mdulo (diviso no qual obtido o resto) incremento de 1 decremento de 1

Java segue a conveno de expresses matemticas. Por exemplo: Se voc fizer 10-2/4, o resultado ser -9,5 e no 2, pois a diviso deve ser calculada primeiro. Para esta conta dar 2 devemos indicar que a subtrao deve ser feita antes da diviso. Ela ficaria assim, (10-2)/4. O que est entre parnteses deve ser calculado primeiro. Em Java, podemos facilmente simplificar operaes que envolvam a prpria varivel. Por exemplo, vamos imaginar que o novo valor de var1 seja o valor da prpria varivel var1 mais o valor da varivel var2. Podemos construir, ento, a seguinte sentena -> var1 = var1 + var2, ou podemos simplific-la em -> var1 += var2. Veja abaixo a tabela de todas as operaes possveis: Smbolo += += -= *= /= %= Operao somar (quando os dados forem algum nmero) concatenar (quando um dos dados for String) Ver Concatenao subtrao multiplicao diviso mdulo (a varivel esquerda recebe o resto da diviso dele com a varivel direita)

Estrutura seletiva - IF e ELSE


Uma ao muito importante que o processador de qualquer computador executa, e que o torna diferente de qualquer outra mquina, a tomada de deciso definindo o que verdadeiro e o que falso. Se quisermos fazer um bom programa, esse programa deve ser capaz de definir caminhos diferentes de acordo com decises que o prprio programa toma. Para isso, precisamos de uma estrutura seletiva da qual o nico valor possvel o bit 1 ou 0, resumindo: retornar o valor VERDADEIRO ou FALSO. Em Java, como em muitas linguagens de programao, quem faz isso o IF (SE traduzindo). O ELSE o que chamamos de caso contrrio, ou seja, se for falso execute o que est no ELSE. Exemplificando: Se (IF) for tal coisa, faa isso! Caso contrrio (ELSE), faa aquilo!

Usando IF

Para usar o IF basta digitar entre parnteses o que deve ser comparado. IMPORTANTE: IF uma palavra reservada que no aceita ponto-e-vrgula (;) no final. Se for verdadeiro, o programa executar a primeira linha logo abaixo do if. Mas, e se quisermos executar vrias linhas se if for verdadeiro? Se o if tiver que executar vrias linhas, todas as linhas que devem ser enquadradas dentro do bloco de dados - as chaves ({}).

Usando ELSE
O ELSE s existe se tiver um IF. O else s ser executado se o IF for falso. Else executar s a primeira linha abaixo dele. Se o else tiver que executar vrias linhas, vale a mesma regra de if. Todas as linhas a ser executadas devero estar contidas dentro do bloco de dados ({}). Para que IF chegue a uma deciso de falso e verdadeiro so necessrios operadores lgicos. Dos quais destacam-se 6:

y y y y y y

> - maior que < - menor que >= - maior ou igual a <= - menor ou igula a == - igual a != - diferente de

Importante
O operador lgico ! (negao) server para inverter o valor, ou seja, se algo for falso, ir se tornar verdadeiro e vice-e-versa. Uma construo sem comparao entre duas variveis sempre entendida como sendo verdadeira. Ex.: if (var1) -> entenda como: se var1 for verdadeiro. Uma construo sem comparao entre duas variveis ser entendida como false se usarmos o operador de negao antes da varivel. Ex.: if (!var1) -> entenda como: se var1 for falso.

01.public class UsandoIf { 02.public static void main(String args[]) { 03.boolean var1 = true; 04.// Se var1 for verdadeiro 05.if (var1) { 06.System.out.println("var1: Verdadeiro"); 07.} else { 08.System.out.println("var1: Falso"); 09.} 10.// Se var1 for falso 11.if (!var1) { 12.System.out.println("!var1: Verdadeiro"); 13.} else { 14.System.out.println("!var1: Falso"); 15.} 16.} 17.}

WHILE
While uma estrutura de repetio. While executa uma comparao com a varivel. Se a comparao for verdadeira, ele executa o bloco de instrues ( { } ) ou apenas a prxima linha de cdigo logo abaixo. Procedemos da seguinte maneira: WHILE (comparao)

O problema com estruturas de repetio, principalmente com while, o que chamamos de looping infinito. Damos esse nome ao fato de que o programa fica repetindo a mesma sequncia de cdigos esperando por um resultado que nunca ir acontecer. Portanto, imprescindvel que uma determinada varivel seja modificada de acordo com cada loop. Veja o exemplo

01.public class ExemploWhile { 02.public static void main(String args[]) { 03.int contador = 0; 04.while (contador < 50) { 05.System.out.println("Repetio nr: " + contador); 06.contador++; 07.} 08.} 09.}
Como podemos ver, existe a varivel contador que iniciada valendo 0, a cada loop executado (repetio) somado 1 ao contador. Perceba que o while ir manter a repetio enquanto a varivel contador for menor que 50. Outro ponto importante que a varivel contador inicializada antes de chegar ao while, porque o while ir comparar a sentena e s depois permitir a execuo do bloco. Se quisermos fazer todo o bloco primeiro e s depois fazer a comparao, devemos utilizar o comando DO WHILE

DO WHILE
DO WHILE uma estrutura de repetio, tal como o prprio while. A principal diferena entre os dois que DO WHILE ir fazer a comparao apenas no final do bloco de cdigo, sendo representado da seguinte forma: DO { cdigo } WHILE (comparao); Neste caso, devemos ter as mesmas precaues quanto while, no que diz respeito a looping infinito. Mas no necessrio inicializar a varivel antes do bloco de cdigo como acontece com while, pois a comparao s ser feita aps todo o cdigo ter sido executado.

FOR
FOR uma estrutura de repetio que exerce a mesma funo que WHILE e DO WHILE. A principal diferena entre eles a sintaxe e tambm a forma de trabalhar. O FOR necessita de trs parmetros: a inicializao da varivel, a condio que ir manter o looping (repetio) e o modificador da varivel inicializada que pode ser incrementada ou decrementada, ou seja, pode aumentar seu valor ou diminuir. Um ponto importante que todos os parmetros devem ser separados por ponto-e-vrgula ( ; ). Dessa forma, temos resumidamente a seguinte construo: FOR (inicializao ; condio ; incremento ou decremento). Por exemplo, vamos criar um cdigo que nos d o resultado do fatorial de 5. Como sabemos para calcular o fatorial de algum nmero basta multiplicarmos ele pelo nmero anterior regressivamente at 1, ou seja, seria algo como 5 4 3 2 1. Dessa forma, sabemos exatamente em quanto devemos comear nossa conta (5), sabemos por quanto tempo o looping ir continuar executando (enquanto a varivel for maior que 1) e sabemos quanto devemos modificar essa varivel (para cada repetio ir subtrair - decrementar - 1). Em um cdigo ficaria: public class Fatorial { public static void main (String args[]){ int fator, resultado=1; for (fator=5; fator>1; fator--) resultado*=fator; System.out.println(resultado); } } Observemos apenas um detalhe, como toda varivel automaticamente inicializada como nulo (NULL), ento, necessitamos inicializar a varivel resultado em 1, porque seria impossvel multiplicar a varivel resultado pela varivel fator (ex.: NULL 5 = ?).

Switch, Case e Default


Uma estrutura muito utilizada em programao o switch. A estrutura switch verifica uma varivel e age de acordo com seus cases. Os cases so as possibilidades de resultados que so obtidos por switch. Basicamente, o switch serve para controlar vrias aes diferentes de acordo com o case definido dentro dele. A estrutura do Switch : SWITCH (varivel) { CASE valor : Cdigo a ser executado caso o valor de case seja o mesmo da varivel de switch } Ento, detalhadamente, switch recebe uma varivel e abre um bloco de dados ( { } ), dentro desse bloco de dados h os cases. Cada case recebe um valor nico, ou seja, que no pode ser repetido no mesmo bloco de dados. Ento, marcamos cada case com dois pontos ( : ). Aps os dois pontos colocamos todo cdigo que dever ser executado que pode conter quantas linhas ns quisermos. Dica importante: um bom costume sempre terminar um cdigo aps o case com um comando break. Assim, ns evitamos que o resto do cdigo seja executado por acidente. E vale tambm ressaltar que case no gera resultados booleanos, portanto, no h a possibilidade de fazer comparaes (Ex. Isso est totalmente errado-> case var1 > var2:).

Default
Como switch pode receber vrias possibilidades, pode ocorrer de algum caso estar fora do alcance ou no definido. Nesse momento, default faz seu papel. Default pega qualquer resultado que no esteja definido no case. Ou seja, ele o bloco de cdigo padro que deve ser executado quando nenhum case for satisfeito. Podemos coloca-lo onde quisermos dentro de switch , mas, geralmente, o colocamos no final. Para exemplificar, vamos ver o cdigo abaixo.

01.public class ExemploSwitch { 02.public static void main(String args[]) { 03.int diaDaSemana = 1; 04.switch (diaDaSemana) { 05.case 1: 06.System.out.println("Domingo"); 07.break; 08.case 2: 09.System.out.println("Segunda-feira"); 10.break; 11.case 3: 12.System.out.println("Tera-feira"); 13.break; 14.case 4: 15.System.out.println("Quarta-feira"); 16.break; 17.case 5: 18.System.out.println("Quinta-feira"); 19.break; 20.case 6: 21.System.out.println("Sexta-feira"); 22.break; 23.case 7: 24.System.out.println("Sbado"); 25.break; 26.default: 27.System.out.println("Este no um dia vlido!"); 28.} 29.}

30.}
Como podemos perceber, existe uma varivel inteira chamada diaDaSemana. Essa varivel passada ao switch e dentro desse switch h 7 cases que correspondem aos dias da semana. Como o valor inicial 1, ento, o bloco logo abaixo de case 1 executado, ou seja, ele imprimir Domingo no monitor. Para evitar que o cdigo dos outros cases sejam executados, logo aps o mtodo println h um comando BREAK; Se quiser, baixe este cdigo e modifique o valor inicial de diaDaSemana para verificar os possveis resultados e como este algoritmo funciona.

Break e Continue
Break e Continue so dois comandos de controle de estruturas largamente utilizados em loops (repeties) como for e while.

Break
O comando break serve para determinar uma quebra de estrutura, ou seja, ele faz com que, por exemplo, um loop (repetio) pare. No comando switch, por exemplo, ele determina que no pode ser executado o case seguinte, e assim por diante. No exemplo abaixo, temos uma repetio que se inicia em 1 e deve terminar em mil (1.000), mas dentro desta estrutura h uma condio: se a varivel for igual a 10 saia da estrutura de repetio. Vejamos:

01.public class ExemploBreak { 02.public static void main (String args []){ 03.for (int contador=1; contador<=1000; contador++){ 04.System.out.println("Esta a repetio nr: "+contador); 05.if (contador==10) 06.break; 07.} 08.} 09.}
Como podemos observar, mesmo a estrutura de repetio for determinando que a repetio deve ir at 1000, ao executarmos esse cdigo, apenas conseguimos chegar at a repetio nmero 10. Isso ocorre porque quando iffor verdadeiro ele executa o break. Dessa forma, conseguimos sair do loop sem ele ter terminado.

Continue
Continue tambm muito utilizado em estruturas e repetio e sua funo ignorar o cdigo, e no sair como acontece com o break. Exemplificando, faremos um cdigo contendo uma estrutura de repetio que ir contar de 1 a 100, mas sempre que o nmero no for mltiplo de 5 o cdigo para apresentar o nmero na tela ser ignorado e a repetio continuar com o nmero seguinte.

01.public class ExemploContinue { 02.public static void main (String args []){ 03.for (int contador=1; contador<=100; contador++){ 04.if (contador%5!=0) 05.continue; 06./* Se o contador no for mltiplo de 5 07.* Todo o cdigo abaixo ser ignorado 08.* e o loop continua com o prximo nr */ 09.System.out.println("Contador: "+contador); 10.} 11.} 12.}
Ou seja, desta forma, apenas os mltiplos de 5 entre 1 e 100 aparecem na tela.

Arrays
Arrays, tambm muito conhecidos como vetores, so variveis que servem para guardar vrios valores do mesmo tipo de forma uniforme na memria. Por exemplo, se tivemos que criar 20 variveis do mesmo tipo que querem dizer a mesma coisa, ns no criaramos -> int var1, var2, var3, var4, var5, ... ao invs disso, criaramos apenas uma varivel de array para guardar todos os 20 nmeros de uma vez. Como um array pode guardar vrios valores temos que definir quantos valores ele deve guardar para que seja reservado o espao necessrio em memria. Primeiramente, vamos aprender como declarar um array. Para declarar um array devemos especificar a classe ou o tipo de dado que ser armazenado nele. Aps isso, damos um nome a esse array. E, para finalizar, indicamos que ele um array, simplesmente abrindo e fechando colchetes ( [ ] ). Portanto, se quisssemos um array de nmeros inteiros chamado meu array, declararamos da seguinte forma: int meuArray []; Agora que j declaramos o array, devemos dar um tamanho a ele, para que seja reservado espao suficiente em memria. Para fazermos isso, utilizaremos um instanciador chamado new. New muito importante, pois ele ir criar de fato o array. Para indicarmos o tamanho usamos o instanciador new, depois o tipo de dado do array e entre colchetes o tamanho do array. Tomando o exemplo acima, vamos indicar que meuArray ter o tamanho 4. Ento, a linha de cima ficaria: int meuArray[] = new int [4]; Na memria representado da seguinte forma:

Uma nica varivel com 4 espaos nos quais podem ser guardados nmeros inteiros.

Acessando uma posio no Array


Agora, para acessarmos um local especfico dessa memria devemos indicar entre colchetes a posio desejada no array que chamamos de index. O importante mesmo saber que no importa o tamanho do array, o index (nmero que indica a posio) sempre comea em 0. Ou seja, um array de tamanho 20 vai da posio 0 a 19, um array de tamanho 180 vai da posio 0 a 179. Portanto, um array de tamanho 4 vai da posio 0 a 3.

Agora, se quisermos atribuir os valores 540 na posio 1 e 8456 na posio 3, faramos: meuArray [1]=540; meuArray [3]=8456.

No podemos nunca nos esquecer que o limite do array sempre seu tamanho menos 1. Usando o exemplo: array de tamanho 4, posio mxima 3 (pois 4-1=3). Ento, se atribuirmos um valor a posio 4 ocorrer um erro. Resumidamente, jamais poderamos fazer meuArray [4]=200.

Inicializao direta de Array


Podemos inicializar um array diretamente, sem a necessidade de instanci-lo com new. Para isso, aps a declarao do array, basta colocar seus valores em chaves, separando cada valor por vrgula. Por exemplo, se quisssemos inicializar o meuArray com os valores 450, 200, 1000, 700, faramos: int meuArray [] = { 450, 200, 1000, 700 };

Matrizes
Matrizes so arrays multidimensionais, ou seja, eles no so totalmente lineares, e sim, geomtricos. Enquanto um array tem apenas uma linha com vrios valores, uma matriz pode, por exemplo, tem vrias linhas com vrios valores, que comumente chamamos de linhas e colunas. Para criarmos um array multidimensional (ou matriz), procedemos da mesma forma que um array normal, porm com mais um dimensionador (os colchetes). Ento, se quisermos criar um array (matriz) bidimensional com 3 linha e 5 colunas, faramos: int minhaMatriz [][] = new int [3][5]; Na memria representado como:

Isso tambm pode ser feito para adquirirmos o formato de matriz que quisermos. Ou seja, se fosse uma matriz tridimensional, bastaria ter trs dimensionadores, se fosse 4D, ento, 4 dimensionadores, se fosse 5D (apesar de geometricamente difcil de imaginar) seriam 5 dimensionadores. E assim por diante...

Entendendo Static
Sempre que programamos devemos levar em conta como nosso prprio programa ir acessar os dados que ele mesmo produz. Isso o simples entendimento e visualizao da diferena entre o que local e o que global. Local qualquer tipo de dado que s pode ser acessado em seu prprio contexto. Por exemplo, uma varivel dentro da funo principal (main) s pode ser acessada pela funo main. Global qualquer tipo de dado que pode ser acessado diretamente de qualquer contexto dentro da classe inteira. Por exemplo, podemos declarar uma varivel como sendo da classe e criarmos tambm outras trs funes que podem acessar essa mesma varivel diretamente, pois ela global e no pertence a nenhuma das trs funes especificamente. Portanto, sempre usamos a palavra reservada static para indicar que algo (funo, mtodo, varivel, etc.) global e pode ser acessado diretamente por todos os elementos de uma classe. Para exemplificar de uma maneira bem simples e direta, no cdigo abaixo h trs variveis: duas declaradas no corpo da classe e uma declarada na funo main.

01.public class GlobalELocal { 02.static int x; 03.float y; 04. 05.public static void main(String args[]) { 06.char z; 07.x = 1; 08.z = 'a'; 09.} 10.}
Traduzindo o cdigo acima, a regra a seguinte:

y y y y y y

Quando o cdigo executado, a funo main chamada; Dentro da funo main podemos atribuir um valor para x, porque x um inteiro marcado como global (static) e pode ser acessado de qualquer lugar. y no pode ser modificado dentro da funo main, pois ele s pertence a classe GlobalELocal. z s pode ser modificado dentro da funo main, e no pode ser modificado na classe GlobalELocal.

Constantes
Constantes so o oposto das variveis. A diferena est em no podermos atribuir um novo valor, pois ele recebe um valor final imutvel. Isso ajuda na hora que temos que lembrar de algum nmero muito grande ou muito pequeno, ou at mesmo um valor que aparentemente no nos diz nada, mas que significa alguma coisa. Um exemplo bem simples seria 000000. Mas, o que 000000? difcil saber o que ele significa, mas muito mais fcil entender que preto em Java Color.BLACK. Ou seja BLACK uma constante que guarda sempre o mesmo valor (000000). Para criarmos uma constante em Java muito simples. Primero nos atemos ao fato de que uma constante criada dentro de uma classe deve ser acessada por qualquer membro da classe, ento, por definio, essa constante tambm global ou esttica (static). Como uma constante no muda seu valor, ento, marcamos ela com a palavra chave final, que far com que o valor nunca seja modificado. Toda constante um dado, portanto, o seu tipo de dado tambm obrigatrio declarar. Ento, para declarar uma constante faramos: static final long CONST1 = 1L; ou final long CONST2 = 1L; No qual, CONST1 seria uma constante global (ou seja, foi declarada no corpo da classe) e CONST2 seria uma constante local (ou seja, foi declarada no corpo de alguma funo ou mtodo, por exemplo, dentro de main) Para ilustrar bem o uso de constantes, vamos calcular a rea e o comprimento de um crculo. O porque deste clculo que necessitaremos de um nmero constante chamado PI. PI um nmero irracional, ou seja, no h uma representao exata dele, mas, para o nosso exemplo, usaremos ele com uma preciso de 8 casas decimais. Portanto, nosso pi ser do tipo double que valer 3,14159265. Ento, perceba que muito mais fcil se lembrar da palavra pi do que do nmero 3,14159265. Alm de, obviamente, digitarmos bem menos. Ento, s para esclarecer o que ir acontecer: O clculo da rea do crculo equivale a raio pi, e o comprimento medido em 2 raio pi, no qual o raio a distncia entre a borda do crculo e seu centro. Vamos usar um raio de 25cm. Vejamos o resultado.

y y y y

y y y y y y y y y

01.public class Constantes { 02. 03.static final float PI = 3.14159265f; 04. 05.public static void main(String args[]) { 06.float raio = 25f; 07.float comprimento = raio * 2 * PI; 08.float area = (raio * raio) * PI; 09.System.out.println("Dados de um crculo de " + raio + "cm:\n"

y y y y y

10.+ "comprimento: " + comprimento + "cm\n" 11.+ "rea: " + area + "cm"); 12.} 13.}
Exite uma infinidade de constantes que so implementadas em vrias classes diferentes como por exemplo BLACK da classe Color, PLAIN_MESSAGE da classe JOptionPane e at mesmo o PI da classe Math com muito mais preciso do que este que usamos no exemplo.

Funes
Funes so rotinas ou sub-rotinas automatizadas. Sempre que pretendemos usar a mesma codificao para algo especfico, criamos uma funo. Dessa forma, sempre que quisermos utilizar aquela codificao, ao invs de ns a digitarmos inteira novamente, simplesmente chamamos a funo. Funes so extremamente teis e adaptveis, e o conceito de funes importante para mais a frente entendermos o funcionamento e criao dos mtodos.

Criando funes sem argumentos


Para criar uma funo, temos que ter sempre em mente que toda funo global, ou seja, esttica (static). As funes mais bsicas so aquelas que apenas executam uma rotina, portanto, no recebem nenhum argumento. No cdigo, digitaramos dentro da classe, mas fora da funo main o seguinte: public static void nomeDaFuno () { cdigo da funo } Static porque pode ser acessado globalmente; void porque no retorna nenhum valor; mesmo no tendo argumentos, necessrio ter parnteses. Vamos ver o exemplo:

01.public class ExemploFuncao { 02.//criando a funo 03.public static void mostrarMensagem() { 04.System.out.println("Minha Mensagem"); 05.} 06. 07.public static void main(String[] args) { 08.//chamando a funo dentro do programa 09.mostrarMensagem(); 10.} 11.}
O cdigo acima funciona da seguinte maneira: Primeiro criada a funo mostrarMensagem(), que em seu corpo tem apenas um println com uma mensagem. Depois iniciamos nosso programa com o main. Dentro do main chamamos a funo. Para isso, basta colocar o nome da funo. Quando a funo chamada, o cdigo dentro do corpo da funo executado. Concluindo, o programa acima apenas mostra na tela a mensagem Minha Mensagem.

Funes com argumentos


Funes com argumentos funcionam e so criadas da mesma forma que uma funo sem argumento, porm com uma diferena. A diferena est que haver informaes necessrias para que a funo processe, e essas informaes sero descritas dentro dos parnteses. Uma funo pode ter um ou vrios argumentos desde que separados por vrgula (,). Cada argumento deve ter seu tipo de dado declarado. Ento, todos os exemplos abaixo so funes vlidas: public static void funcao1 (String arg1){} public static void funcao2 (int arg1, int arg2){} public static void funcao3 (String arg1, char arg2, int arg3, float arg4, Object arg5) {}

Para demonstrar este tipo de funo criaremos uma funo que mostra na tela o resultado fatorial de um nmero. Alm disso, colocaremos esta funo dentro de um loop que ir de 1 a 10 para ele mostrar cada um desses fatoriais.

01.public class FatorialComFuncao { 02.public static void fatorar(int numero) { 03.int fator = 1; 04.for (int i = numero; i > 1; i--) { 05.fator *= i; 06.} 07.System.out.println(numero + "! = " + fator); 08.} 09. 10.public static void main(String args[]) { 11.for (int x=1; x<=10; x++) 12.fatorar (x); 13.} 14.}
Simplificando, x que est sendo passado pelo main para fatorar() ser o valor int numero da funo fatorar.

Funes que retornam valores


Aqui veremos a grande vantagem de se criar uma funo. Funes podem retornar valores de um processo executado dentro delas e esse valor pode ser guardado dentro de uma varivel no programa. Isso com certeza deixa nosso cdigo mais simples, pois podemos destacar processos repetitivos e guardar em uma varivel apenas o resultado daquele processo. Para criar uma funo que retorna valores temos que nos ater ao fato retorno. Como todas as outras funes no retornavam valores, ento, seu retorno era vazio - void. Agora, temos que declarar que tipo de retorno vir da funo. O retorno dado pelo comando return, que finaliza a funo e mostra o retorno. A varivel ou valor que utilizarmos para return ser o tipo de retorno da funo. Vamos imaginar que trs funes, sendo que a primeira ir retornar um inteiro, a segunda um double e a terceira uma string. Ento, as criaramos da seguinte maneira: public static int funcaoDeInteiro (){} public static double funcaoDeDouble (){} public static String funcaoDeString (){} No exemplo abaixo, ns criaremos uma funo que ir retornar um valor booleano (verdadeiro ou falso). Usando este retorno, determinaremos o que fazer dentro de uma estrutura seletiva (if).

01.public class Primo { 02.public static boolean ehPrimo(long nr) { 03.if (nr < 2) 04.return false; 05.for (long i = 2; i <= (nr / 2); i++) { 06.if (nr % i == 0) 07.return false; 08.} 09.return true; 10.} 11. 12.public static void main(String[] args) { 13.long x = 5; 14.if (ehPrimo(x)) // se for primo 15.System.out.println(x + " primo"); 16.else // se no for primo 17.System.out.println(x + " no primo"); 18.}

19.}
O algoritmo utilizado acima muito solicitado em cursos de programao e faculdades. O que a funo faz verificar se um nmero primo ou no.

Criao de Classe
Comearemos agora a ver a alma da programao Java que a orientao a objeto. Sempre que programamos em Java, devemos pensar em como montar as definies de nosso objeto. Ou seja, quais atributos uma classe deve conter, simplificando, quais caractersticas tem tal objeto. como pensar em alguma coisa. Por exemplo, se pensarmos em relgio, a primeira coisa que ns vem a cabea hora, minuto, segundo e assim por diante. Ns tambm podemos ajustar as horas, ajustar o alarme, etc. A princpio, vamos nos ater aos detalhes tcnicos da programao de uma classe. Para criar uma classe usamos a palavra chave class, e aps a definio do nome de nossa classe, ns definimos seus atributos. Para exemplificar, criaremos uma classe que ter as caractersticas mais simples de uma televiso.

1.class TV{ 2.int tamanho; 3.int canal; 4.boolean ligada; 5.}


Pronto, esses so os atributos de uma classe, ou seja, ns definimos que existe um objeto chamado TV e que ele tem trs caractersticas: uma dessas caractersticas o tamanho, outra um valor inteiro identificado por canal e mais outra caracterstica que determina se ele est ligado ou no. Como podemos perceber, isso mais um conceito (paradigma) de como devemos pensar. Uma classe (ou objeto) pode ser muito implementado, tornando-se um objeto com vrias caractersticas que pode ser facilmente manipulado e incorporado por outros objetos. Isso o que chamamos de reutilizao de cdigo, que envolve vrios apectos importantes da orientao a objeto como herana, interface, enumeradores, sobrecarga de mtodos entre outros que ns estudaremos nas prximas pginas.

Mtodo Construtor
Vimos anteriormente que simples criar uma classe. Mas, para realmente conseguirmos utilizar a classe, ela deve conter pelo menos um mtodo construtor. O mtodo construtor desenvolvido da mesma forma que uma funo, a nica diferena que ele tem o mesmo nome da classe. Isso se deve ao fato de que um objeto deve ser construdo cada vez que chamamos a classe. E a responsabilidade de fazer isso do construtor. Isso parte do princpio que podemos ter dois objetos com a mesma caracterstica, mas que no so os mesmos objetos. Ou seja, ns podemos ter uma TV de 29" ligada no canal 15 e nosso amigo tem uma outra TV que tambm de 29" e est ligada no canal 15. Perceba que ambas as TVs tm as mesmas caractersticas, mas continuam sendo duas TVs diferentes. Sempre que criamos uma classe, Java automaticamente vincula um mtodo construtor padro interno com o mesmo nome da classe, mas sem inicializar nenhum atributo. Para demonstrar um mtodo construtor, criaremos um construtor padro sem argumentos no qual j contm os valores dos atributos definidos por ns mesmos. Ento, vamos imaginar que sempre que uma TV construda, o seu padro tamanho 21", desligada e no canal 0. Ento, podemos defin-lo como: class TV { int tamanho; int canal;

boolean ligada; TV(){ tamanho=21; canal=0; ligada=false; } } Pronto! Com isso, ns j somos capazes de instanciar nossa classe.

Instanciar Objetos
Objetos so estruturas de dados definidas e agrupas dentro de uma classe. Sempre que utilizamos um objeto ou classe devemos reservar espao em memria para que aquele objeto seja manipulado sem maiores problemas. Alm do mais, tambm podemos utilizar a mesma classe (com todos os seus mtodos e atributos) para manipular outros objetos que sero tratados de forma diferente (mesmo se tiverem as mesmas caractersticas do objeto anterior), pois sero dois endereos de memria diferentes. A vantagem de Java nos possibilitar uma instanciao rpida e simples, sem termos que nos preocupar com referncia a endereos e alocao dinmica de memria, pois quem trata de manipular a memria o prprio Java. Sem contar que, se um objeto no mais referenciado dentro do programa, o prprio Java trata de liberar os recursos de memria consumidos pelo objeto usando o Garbage Colletor - Coletor de Lixo. Quem faz o papel de instanciador em Java o new. New trata de reservar memria o suficiente para o objeto e criar automaticamente uma referncia a ele. Para new conseguir determinar o objeto, precisamos usar o mtodo construtor que ser usado como base para instanciar a classe e gerar o objeto. Tecnicamente, declaramos uma varivel qualquer como sendo do tipo da classe (ex.: TV minhaTV; ), depois instanciamos o objeto atribuindo a varivel o resultado obtido por new mais o mtodo construtor (ex.: minhaTV = new TV(); ). Apesar de parecer muitos detalhes, isso fica mais facilmente visualizado no cdigo abaixo. public class TV { int tamanho; int canal; boolean ligada; TV() { tamanho = 21; canal = 0; ligada = false; } public static void main(String[] args) { TV objeto1 = new TV(); TV objeto2; objeto2 = new TV(); } } No cdigo acima, criamos uma classe chamada TV com os mesmos atributos do exemplo da pgina Criao de Classes, e criamos um mtodo construtor que inicializa os atributos da classe TV com alguns valores. Declaramos duas variveis chamadas objeto1 e objeto2 sendo do tipo TV. Depois, instanciamos o objeto usando new e o mtodo construtor.

This
This usado para fazer auto-referncia ao prprio contexto em que se encontra. Resumidamente, this sempre ser a prpria classe ou o objeto j instanciado. Esse conceito de auto-referncia importante para que possamos criar mtodos construtores sobrecarregados e mtodos acessores mais facilmente.

Por base, se criarmos um mtodo que receba um argumento chamado ligado que queremos atribuir para o atributo da classe, que tambm se chama ligado, devemos diferenciar ambos mostrando a quem cada um pertence. Como this se refere ao contexto empregado, ento o usamos para identificar que ligado ser o atributo da classe e ligado sem o this se refere ao parmetro do mtodo. O que resultaria nisto:

01.public class TV { 02.//atributos 03.int tamanho; 04.int canal; 05.boolean ligada; 06. 07.// mtodo contrutor com parmetro 08.TV(boolean ligada) { 09.this.ligada = ligada; 10./** 11.* Onde this.ligada o atributo 12.* e ligada o valor do parmetro 13.*/ 14.} 15.}
Traduzindo, this.ligada seria: a varivel ligada desta classe recebe o valor de ligada, ou seja, o nico ligada que existe fora o atributo o parmetro.

Sobrecarga de mtodos
Java nos permite criar vrios mtodos com o mesmo nome desde que tenham parmetros diferentes. Isso o que chamamos de sobrecarga de mtodos. A sobrecarga de mtodos consiste em criarmos o mesmo mtodo com possibilidades de entradas diferentes. Essas entradas, caracterizadas como parmetros, devem sempre ser de tipos diferentes, quantidades de parmetros diferentes ou posies dos tipos diferentes. Para visualizarmos um cenrio, vejamos a classe abaixo:

1.public TV { 2.int canal; 3.int volume; 4.boolean ligada; 5.int tamanho; 6.}
Agora, criaremos o mtodo ligar. O mtodo ligar, simplesmente, muda o valor dos atributos canal e volume para 3 e 25, respectivamente.

1.void ligar (){ 2.canal = 3; 3.volume = 25; 4.ligada = true; 5.}


Agora, vamos personalizar este mtodo para que ele mude o atributo ligada de acordo com o parmetro.

1.void ligar (boolean ligada){ 2.canal = 3; 3.volume = 25; 4.this.ligada = ligada; 5.}
Poderamos utilizar ambos os mtodos na mesma classe se quisermos, porque um possui argumentos e o outro no.

01.void ligar (){

02.canal = 3; 03.volume = 25; 04.ligada = true; 05.} 06. 07.void ligar (boolean ligada){ 08.canal = 3; 09.volume = 25; 10.this.ligada = ligada; 11.}
Porm, o mesmo no pode ser aplicado aos atributos canal e volume. Porque no possvel criar um mtodo que recebe um inteiro e criar um outro mtodo com o mesmo nome que tambm recebe um inteiro, mesmo que estes dois inteiros sejam totalmente diferentes. Se visualizarmos como Java interpreta o mtodo, veramos: void ligar (int volume) = void ligar (int canal) void ligar (int) = void ligar (int) Por outro lado, perfeitamente possvel criarmos dois mtodos que recebam um booleano e um inteiro, inclusive se forem os mesmos, mas em posies diferentes. Isso acontece porque Java no verifica o nome do parmetro, mas apenas o tipo dele. void ligar (boolean ligada, int canal) void ligar (int canal, boolean ligada) void ligar (boolean, int) void ligar (int, boolean) Portanto, podemos fazer muitas combinaes desde que essas combinaes no sejam em nmeros iguais, de tipos iguais e nas mesmas posies. Abaixo, est a classe com algumas combinaes possveis. um bom costume sempre referenciar para o mtodo que recebe mais argumentos.

01.public class TV { 02.int canal; 03.int volume; 04.boolean ligada; 05.int tamanho; 06. 07.void ligar() { 08.this.ligar(3, 25, true); 09.} 10. 11.void ligar(boolean ligada) { 12.this.ligar(3, 25, ligada); 13.} 14. 15.void ligar(int canal, int volume) { 16.this.ligar(canal, volume, true); 17.} 18. 19.void ligar(int canal, int volume, boolean ligada) { 20.this.canal = canal; 21.this.volume = volume; 22.this.ligada = ligada; 23.} 24.}

Acesso a Atributos e Mtodos

Vimos, at agora, como criar uma classe, definir um mtodo construtor, sobrecarregar mtodos e instnciar objetos. Nesse momento, vamos ver como acessar seus membros e mtodos. Os acessos a membros ou mtodos de uma classe so dados a partir do objeto instanciado usando um separador que o ponto (.). Portanto, para acessar qualquer membro da classe, basta que usemos o nome do objeto, mais um ponto e o nome do membro que queremos acessar. Ainda tomando como exemplo a classe TV j vista antes, vamos modificar dentro do programa dois atributos: os atributos canal e volume.

01.public class TV { 02.int canal; 03.int volume; 04.boolean ligada; 05.int tamanho; 06. 07.public TV(){ 08.this.tamanho = 21; 09.this.ligada = true; 10.} 11. 12.public static void main (String args []){ 13.TV minhaTV = new TV(); 14.minhaTV.canal = 3; 15.minhaTV.volume = 25; 16.} 17.}
Como percebemos construdo um objeto chamado minhaTV da classe TV com o tamanho de 21" e j ligada. Durante a execuo do programa modificamos diretamente seu canal e volume usando o objeto que instanciamos. Da mesma forma que acessamos um atributo, tambm podemos acessar um mtodo. No exemplo abaixo, criaremos o mtodo para aumentar volume da TV.

01.public class TV { 02.int canal; 03.int volume; 04.boolean ligada; 05.int tamanho; 06. 07.public TV(){ 08.this.tamanho = 21; 09.this.ligada = true; 10.this.canal = 3; 11.this.volume = 25; 12.} 13. 14.public void aumentarVolume(){ 15.this.volume += 5; 16.} 17. 18.public static void main (String args []){ 19.TV minhaTV = new TV(); 20.minhaTV.aumentarVolume(); 21.} 22.}

Aqui, o objeto minhaTV comea com volume 25 e depois de chamar seu mtodo aumentarVolume() fica com 30. Algumas consideraes que devemos ter saber diferenciar funes de mtodos. Apesar da essncia de ambos ser a mesma coisa, funes so chamadas estaticamente, ou seja, ela pode ser chamada diretamente sem o intermdio de nenhum objeto. J os mtodos so chamados de dentro das classes, portanto, obrigatoriamente devemos ter um objeto instanciado para conseguirmos utilizar o mtodo. Vejamos a diferena:

01.public class TV { 02.int canal; 03.int volume; 04.boolean ligada; 05.int tamanho; 06. 07.public TV(){ 08.this.tamanho = 21; 09.this.ligada = false; 10.this.canal = 0; 11.this.volume = 0; 12.} 13. 14.// mtodo da classe 15.public void ligar(boolean ligada){ 16.this.ligada = ligada; 17.} 18. 19.// funo 20.public static void estahLigada (TV objeto){ 21.if (objeto.ligada) 22.System.out.println ("est ligada"); 23.else 24.System.out.println ("no est ligada"); 25.} 26. 27.public static void main (String args []){ 28.TV televisao1 = new TV(); 29.TV televisao2 = new TV(); 30.// chamando o mtodo ligar 31.televisao1.ligar(true); 32.televisao2.ligar(false); 33.System.out.print ("A televiso 1 "); 34.// chamando a funo estahLigada 35.estahLigada (televisao1); 36.System.out.print ("A televiso 2 "); 37.estahLigada (televisao2); 38.} 39.}
Observemos que chamamos o mtodo ligar() de cada objeto, portanto, existem dois mtodos ligar distintos - o mtodo ligar() da televisao1 e o mtodo ligar() da esttica, portanto, existe apenas uma funo estahLigada().

televisao2. A funo

Pacotes
Usamos pacotes para organizar as classes semelhantes. Pacotes, a grosso modo, so apenas pastas ou diretrios do sistema operacional onde ficam armazenados os arquivos fonte de Java e so essenciais para o conceito de encapsulamento, no qual so dados nveis de acesso as classes.

Java posssui um pacote padro que utilizado quando programamos, mesmo embora no seja recomendado pela Sun us-lo.

Criar Pacotes
Muitos compiladores criam automaticamente os pacotes como uma forma eficaz de organizao, mas a criao de pacote pode ser feita diretamente no sistema operacional. Basta que criemos uma pasta e lhe demos um nome. Aps isso, devemos gravar todos os arquivos fonte de java dentro desta pasta.

Definir Pacotes
Agora que j possumos a pasta que ser nosso pacote, devemos definir em nossa classe a qual pacote ela pertence. Isso feito pela palavra reservada package. Package deve ser a primeira linha de comando a ser compilada de nossa classe. Portanto, se tivssemos criado uma pasta chamada tiexpert e fossemos criar uma classe nesta pasta (pacote), o comeo de nosso cdigo seria: package tiexpert;.

Importar Pacotes
Java possui vrios pacotes com outros pacotes internos e vrias classes j prontas para serem utilizadas. Dentre os pacotes Java podemos determinar dois grandes pacotes: o pacote java, que possui as classes padres para o funcionamento do algortmo; e o pacote javax, que possui pacotes de extenso que fornecem classes e objetos que implementam ainda mais o pacote java. Exemplo: o pacote AWT (Abstract Windowing Toolkit) possui as classes necessrias para se criar um ambiente grfico API (Janelas) e est fortemente ligado as funes nativas do Sistema Operacional, ou seja, ele pertence ao pacote java. Mas, o pacote SWING no ligado fortemente as funes nativas do Sistema Operacional, mas as funes do AWT, ou seja, SWING complementa o AWT, portanto SWING faz parte do pacote de extenso javax. Para utilizar as milhares de classes contidas nos inmeros pacotes de Java devemos ou nos referenciar diretamente a classe ou import-la. Para importar um pacote usamos o comando import. Para separar um pacote de seu sub-pacote usamos um ponto (como no acesso a membros de classe). Ao importarmos um pacote podemos utilizar um coringa, o astersco (*). O astersco serve para importar todos os sub-pacotes e classes do pacote que est definido. Ex.: import java.awt.*;. Isso importar todos os sub-pacotes pertencentes ao pacote AWT. Ou podemos definir diretamente qual pacote desejamos. Ex.: import javax.swing.JOptionPane;. Isso ir importar apenas o sub-pacote JOptionPane do pacote SWING. A diferena entre as duas formas de importao de pacotes o consumo de recursos do computador. Como o astersco importa todos os sub-pacotes, o consumo de memria ser alto e, muito provavelmente, no usaremos todas as classes de todos os pacotes importados. Por isso, o recomendado sempre importar apenas o pacote que ser utilizado. Para consolidar o que foi visto at aqui, o cdigo abaixo ilustra o uso de pacotes.

01.package tiexpert; 02. 03.import javax.swing.JOptionPane; 04. 05.public class Mensagem { 06.public static void main (String args[]){ 07.JOptionPane.showMessageDialog(null, 08."Bem vindo ao mundo de Java!"); 09.} 10.}
A classe acima est no pacote tiexpert. No nosso programa estamos utilizando o mtodo showMessageDialog que pertence classe JOptionPane que est no pacote de extenso SWING que tivemos que importar.

public, private e protected


Encapsulamento
Se outros programadores usam nossa classe, ns queremos garantir que erros pelo mau uso no ocorram. Encapsulamento serve para controlar o acesso aos atributos e mtodos de uma classe. uma forma eficiente de proteger os dados manipulados dentro da classe, alm de determinar onde esta classe poder ser manipulada. Usamos o nvel de acesso mais restritivo que faa sentido para um membro particular. Sempre usamos private, a menos que tenhamos um bom motivo para deix-lo com outro nvel de acesso. No devemos permitir o acesso pblico aos membros, exceto em caso de ser constantes. Isso porque membros pblicos tendem a nos ligar a uma implementao em particular e limita a nossa flexibilidade em mudar o cdigo. Basicamente, usamos quatro tipos de encapsulamento que so divididos em dois nveis:

y y

Nvel de classe ou topo: Quando determinamos o acesso de uma classe inteira que pode ser public ou package-private (padro); Nvel de membro: Quando determinamos o acesso de atributos ou mtodos de uma classe que podem ser public, private, protectedou package-private (padro).

Para utilizarmos estes modificadores de acesso, basta que ns os digitemos antes do nome da varivel, atributo, mtodo, funo ou classe, com exceo de package-private, que entendido como padro, portanto, qualquer membro ou classe que no tenha modificador especificado. Exemplo:

1.public class MinhaClasse { //classe public 2.private int inteiro; //atributo inteiro private 3.protected float decimal; //atributo float protected 4.boolean ativado; //atributo booleano package-private 5.}

Public
O modificador public deixar visvel a classe ou membro para todas as outras classes, subclasses e pacotes do projeto Java.

Private
O modificador private deixar visvel o atributo apenas para a classe em que este atributo se encontra.

Protected
O modificador protected deixar visvel o atributo para todas as outras classes e subclasses que pertencem ao mesmo pacote. A principal diferena que apenas as classes do mesmo pacote tem acesso ao membro. O pacote da subclasse no tem acesso ao membro.

Sem Modificador (Padro)


Por padro, a linguagem Java permite acesso aos membros apenas ao pacote em que ele se encontra. De forma ilustrativa, abaixo est uma tabela demonstrando todas estas caractersticas. Modificador Public Protected Sem Modificador (Padro) Private Classe Pacote Subclasse Globalmente sim sim sim sim sim sim sim sim no sim no no

sim no no no Fonte: Controlling Access to Members of a Class

Get e Set - Mtodos Acessores

Como visto anteriormente, o encapsulamento "protege" os atributos ou mtodos dentro de uma classe, portanto devemos prover meios para acessar tais membros quando eles so particulares, ou seja, quando possuem o modificador private. O que torna isso possvel a criao de mtodos. Em programao orientada a objetos, esses mtodos so chamados de mtodos acessores ou getters e setters, pois eles provm acesso aos atributos da classe, e geralmente, se iniciam com get ou set, da a origem de seu nome. Na verdade, no h nada de diferente entre os mtodos comuns e os mtodos acessores. A nica importncia est no fato da orientao a objeto. Pois, sempre que formos acessar um membro em Java usaremos get ou set.

Set
Nomeamos um mtodo acessor com set toda vez que este mtodo for modificar algum campo ou atributo de uma classe, ou seja, se no criarmos um mtodo acessor set para algum atributo, isso quer dizer que este atributo no deve ser modificado. Portanto, como o valor de um atributo da classe ser modificado, no necessrio que este mtodo retorne nenhum valor, por isso, os mtodos setters so void. Porm, obrigatoriamente, eles tem que receber um argumento que ser o novo valor do campo.

Get
Nomeamos um mtodo acessor com get toda vez que este mtodo for verificar algum campo ou atributo de uma classe. Como este mtodo ir verificar um valor, ele sempre ter um retorno como String, int, float, etc. Mas no ter nenhum argumento.

Is
Nomeamos um mtodo acessor com is toda vez que este mtodo for verificar algum campo ou atributo de uma classe que tenha retorno do tipo boolean. Levando em considerao as informaes acima, nossa classe de exemplo TV ficaria:

01.public class TV { 02.private int tamanho; 03.private int canal; 04.private int volume; 05.private boolean ligada; 06. 07.public TV(int tamanho, int canal, int volume, boolean ligada) { 08.this.tamanho = tamanho; 09.this.canal = canal; 10.this.volume = volume; 11.this.ligada = ligada; 12.} 13. 14.public int getTamanho() { 15.return tamanho; 16.} 17. 18.public void setTamanho(int tamanho) { 19.this.tamanho = tamanho; 20.} 21. 22.public int getCanal() { 23.return canal; 24.} 25. 26.public void setCanal(int canal) { 27.this.canal = canal;

28.} 29. 30.public int getVolume() { 31.return volume; 32.} 33. 34.public void setVolume(int volume) { 35.this.volume = volume; 36.} 37. 38.public boolean isLigada() { 39.return ligada; 40.} 41. 42.public void setLigada(boolean ligada) { 43.this.ligada = ligada; 44.} 45.}

Herana
Enquanto programamos em Java, h a necessidade de trabalharmos com vrias classes. Muitas vezes, classes diferentes tem caractersticas comuns, ento, ao invs de criarmos uma nova classe com todas essas caractersticas usamos as caractersticas de um objeto ou classe j existente. Ou seja, herana , na verdade, uma classe derivada de outra classe. Para simplificar de uma forma mais direta, vejamos: Vamos imaginar que exista uma classe chamada Eletrodomestico, e nela esto definidos os seguintes atributos: ligado (boolean), voltagem (int) e consumo (int). Se levarmos em conta a classe TV que estamos usando de exemplo at agora, podemos dizer que TV deriva de Eletrodomestico. Ou seja, a classe TV possui todas as caractersticas da classe Eletrodomestico, alm de ter suas prprias caractersticas.

Extends e Super
Para fazermos uma classe herdar as caractersticas de uma outra, usamos a palavra reservada extends logo aps a definicao do nome da classe. Dessa forma: class NomeDaClasseASerCriada extends NomeDaClasseASerHerdada Importante: Java permite que uma classe herde apenas as caractersticas de uma nica classe, ou seja, no pode haver heranas mltiplas. Porm, permitido heranas em cadeias, por exemplo: se a classe Mamifero herda a classe Animal, quando fizermos a classe Cachorro herdar a classe Mamifero, a classe Cachorro tambm herdar as caractersticas da classe Animal.

Como estamos tratando de herana de classes, toda classe tem seu mtodo construtor. Portanto, se estamos trabalhando com duas classes, temos dois mtodos construtores. Para acessarmos o mtodo construtor da classe que est sendo herdada usamos o super(). Podemos usar o super para qualquer construtor da classe pai, pois o Java consegue diferenciar os construtores por causa da sobrecarga de mtodos. Para finalizar, iremos mostrar o exemplo citado mais acima da classe Eletrodomestico e TV. Observe:

Classe 1: Eletrodomestico

01.package tiexpert; 02. 03.public class Eletrodomestico { 04.private boolean ligado; 05.private int voltagem; 06.private int consumo; 07. 08.public Eletrodomestico(boolean ligado, int voltagem, int consumo) { 09.this.ligado = ligado; 10.this.voltagem = voltagem; 11.this.consumo = consumo; 12.} 13.// (...) 14.}
Classe 2: TV

01.package tiexpert; 02. 03.public class TV extends Eletrodomestico { 04.private int canal; 05.private int volume; 06.private int tamanho; 07. 08.public TV(int voltagem, int consumo, int canal, int volume, int tamanh o) { 09.super(false, voltagem, consumo); 10.this.canal = canal; 11.this.volume = volume; 12.this.tamanho = tamanho; 13.} 14.//(...) 15.}
Classe que mostra a instanciao de TV.

01.package tiexpert; 02. 03.public class ExemploHeranca { 04.public static void mostrarCaracteristicas(TV obj) { 05.System.out.print("Esta TV tem as seguintes caractersticas:\n" 06.+ "Tamanho: " + obj.getTamanho() + "\"\n" 07.+ "Voltagem Atual: "+ obj.getVoltagem() + "V\n" 08.+ "Consumo/h: " + obj.getConsumo() + "W\n"); 09.if (obj.isLigado()) { 10.System.out.println("Ligado: Sim\n" 11.+ "Canal: " + obj.getCanal() + "\n" 12.+ "Volume: " + obj.getVolume()+"\n"); 13.} else { 14.System.out.println("Ligado: No\n"); 15.} 16.} 17. 18.public static void main(String args[]) { 19.TV tv1 = new TV(110, 95, 0, 0, 21);

20.TV tv2 = new TV(220, 127, 0, 0, 29); 21.tv2.setLigado(true); 22.tv2.setCanal(3); 23.tv2.setVolume(25); 24.mostrarCaracteristicas(tv1); 25.mostrarCaracteristicas(tv2); 26.} 27.}
O cdigo acima ir mostrar o seguinte resultado: Esta TV tem as seguintes caractersticas: Tamanho: 21" Voltagem Atual: 110V Consumo/h: 95W Ligado: No Esta TV tem as seguintes caractersticas: Tamanho: 29" Voltagem Atual: 220V Consumo/h: 127W Ligado: Sim Canal: 3 Volume: 25

Enum
Java nos possibilita criar uma estrutura de dados enumarada. Essas estruturas de dados enumeradas so conjuntos de constantes organizados em ordem de declarao, ou seja, o que declarado primeiro vir primeiro. A funcionalidade principal de enum agrupar valores com o mesmo sentido dentro de uma nica estrutura, como por exemplo, meses, dias da semana, cores, tabela peridica, etc. e tambm limitar ou determinar um nmero de valores que podem ser usados na programao. Embora sua funcionalidade totalmente diferente, a criao de uma estrutura enumerada parecida com uma classe. Basta trocarmos a palavra-chave class pela palavra-chave enum. Mas, devemos levar em considerao alguns fatores: 1. Uma estrutura enum deve ter seu prprio arquivo da mesma forma que acontece com as classes pblicas. Por exemplo, se ns implementarmos uma classe pblica chamada HelloWorld, ento, deve haver um arquivo chamado HelloWorld.java. Se criarmos um enumerador chamado Cores, ento, deve haver um arquivo chamado Cores.java. Estruturas enum no so instanciveis. Ou seja, estruturas enum no possuem um mtodo construtor, portanto, no h como usar o instanciador new. Estruturas enum so apenas declarveis. Portanto, toda a lista de constantes declaradas dentro desta estruturas so acessados estaticamente. Ou seja, nome da varivel, mais ponto (.) e o nome da constante (Suposio: mes.JANEIRO). Toda estrutura enum possui um mtodo para acessar seus valores em forma de array (vetor) chamadovalues().

2. 3.

4.

Abaixo est uma estrutura enum:

1.public enum Cores { 2.PRETO, BRANCO, PRATA; 3.}


Agora que temos nosso "kit de constantes" podemos usar em nossa classe.

01.public class TV { 02.private int tamanho; 03.private int canal; 04.private int volume;

05.private boolean ligada; 06.//declarao da varivel do tipo Enum Cores 07.private Cores cor; 08. 09.public TV(int tamanho, Cores cor) { 10.this.tamanho = tamanho; 11.this.canal = 0; 12.this.volume = 25; 13.this.ligada = false; 14.this.cor = cor; 15.} 16. 17.public int getTamanho() { 18.return tamanho; 19.} 20.public int getCanal() { 21.return canal; 22.} 23.public int getVolume() { 24.return volume; 25.} 26.public Cores getCor() { 27.return cor; 28.} 29. 30.public static void main(String args[]) { 31.TV minhaTV = new TV(29, Cores.PRATA); 32./** 33.* acessando estaticamente (diretamente) 34.* o valor PRATA do enum Cores 35.**/ 36.System.out.println("Caractersticas da minha TV:" + 37."\nTamanho:" + minhaTV.getTamanho() + 38."\nCanal atual:" + minhaTV.getCanal() + 39."\nVolume atual:" + minhaTV.getVolume() + 40."\nCor: " + minhaTV.getCor()); 41.} 42.}
Estruturas enum tambm podem ser determinadas. Dessa forma, podemos atribuir mais valores a mesma constante. Por exemplo, podemos fazer uma estrutura enum da tabela peridica com os smbolos qumicos tendo todos os valores possveis da tabela (Nmero Atmico, Peso Atmico e Nome do Elemento). Para fazer isso, no final da enumerao, temos que declarar as constantes que foram usadas, assim:

1.... 2.private final int numero; //constante para nmero atmico 3.private final double peso; //constante para peso atmico 4.private final String nome; //constante para nome do elemento 5....
O fator do encapsulamento usando private aqui ser muito importante, pois dessa forma no haver um meio de alterar o valor dessas constantes por acidente. Aps isso, criamos mtodos para acessar esses valores.

1....

2.private int numero(); 3.private double peso(); 4.private String nome(); 5....
Ento, criamos a definio usada nas constantes. Essas definies se parecem muito com os construtores de classes, mas sua funo apenas indicar o que cada uma das informaes contidas em cada constante.

1.... 2.NomeDoEnum (int numero, double peso, String nome){ 3.this.numero = numero; 4.this.peso = peso; 5.this.nome = nome; 6.} 7....
Relembrando: Todas estas definies sempre devem vir aps a definio das constantes. No exemplo abaixo, est esta estrutura com apenas trs elementos qumicos. Visualizar Codigo Fonte Imprimir?

01.public enum TabelaPeriodica { 02.// Declarao das constantes 03.H (1, 1.00794, "Hidrognio"), 04.HE (2, 4.002602, "Hlio"), 05.O (8, 15.9994, "Oxignio"); 06./** 07.* Por ser um exemplo, 08.* no foram colocados 09.* todos os elementos qumicos 10.* da Tabela Peridica 11.**/ 12. 13.// Definio das constantes 14.private final int numero; 15.private final double massa; 16.private final String nome; 17. 18.// mtodos para acessar os valores 19.private int numero() { 20.return this.numero; 21.} 22.private double massa() { 23.return this.massa; 24.} 25.private String nome() { 26.return this.nome; 27.} 28. 29.//mtodo que define as constantes 30.private TabelaPeriodica(int numero, double massa, String nome) { 31.this.numero = numero; 32.this.massa = massa; 33.this.nome = nome; 34.} 35. 36.public static void main(String args[]) { 37.System.out.println("Dados do elemento qumico H:");

38.System.out.println("\nNmero: " + TabelaPeriodica.H.numero() + 39."\nMassa: " + TabelaPeriodica.H.massa() + 40."\nElemento: " + TabelaPeriodica.H.nome()); 41.} 42.}

Interfaces
Interface um recurso da orientao a objeto utilizado em Java que define aes que devem ser obrigatoriamente executadas, mas que cada classe pode executar de forma diferente. Interfaces contm valores constantes ou assinaturas de mtodos que devem ser implementados dentro de uma classe. E por que isso? Isso se deve ao fato que muitos objetos (classes) podem possuir a mesma ao (mtodo), porm, podem execut-la de maneira diferente. Usando um exemplo bem drstico, podemos ter uma interface chamada areo que possui a assinatura do mtodo voar(). Ou seja, toda classe que implementar areo deve dizer como voar(). Portanto, se eu tenho uma classe chamada pssaro e outra chamada avio, ambas implementando a interface areo, ento, nestas duas classes devemos codificar a forma como cada um ir voar(). Uma interface criada da mesma forma que uma classe, mas utilizando a palavrachave interface no lugar declass. interface nomeDaInterface { mtodoAbstrato (argumentos); }

Usando uma Interface em uma Classe


Como vimos anteriormente, uma classe pode extender suas funcionalidades obtendo as caractersticas de outra classe num processo que chamamos de herana. Uma interface no herdada, mas sim, implementada. Porque todo o cdigo dos mtodos da interface deve ser escrito dentro da classe que o chama. Dessa forma, obtemos as assinaturas dos mtodos da interface em uma classe usando a palavra-chave implements. A vantagem principal das interfaces que no h limites de quantas interfaces uma classe pode implementar. O que ajuda no caso de heranas mltiplas que no possvel ser feito em Java, pois uma classe apenas pode herdar as caractersticas de uma outra classe. Trazendo ao exemplo j usado por ns, teramos o seguinte conceito. 1) Teramos a classe principal que caracteriza a TV.

01.public class TV { 02.private int tamanho; 03.private int canal; 04.private int volume; 05.private boolean ligada; 06. 07.public TV(int tamanho) { 08.this.tamanho = tamanho; 09.this.canal = 0; 10.this.volume = 0; 11.this.ligada = false; 12.} 13. 14.// abaixo teramos todos os mtodos construtores get e set... 15.}
2) Teramos as aes que comumente toda televiso executa, mas que cada modelo pode executar de forma diferente. Como geralmente toda ao da TV executada pelo controle remoto, ento chamaremos esta interface de controle remoto.

01.public interface ControleRemoto { 02./*

03.* Perceba que apenas a assinatura dos mtodos esto aqui. 04.* E cada mtodo termina com um ponto-e-vrgula (;) 05.*/ 06.void mudarCanal(int canal); 07.void aumentarVolume (int taxa); 08.void diminuirVolume (int taxa); 09.boolean ligar(); 10.boolean desligar(); 11.}
3) Agora que temos nossa interface e a definio do que a TV, vamos desenvolver duas TVs diferentes, imaginando que fossem duas marcas completamente distintas e que uma no tem nenhuma relao com a outra. Como ambas as TVs iro implementar a interface ControleRemoto, ento, no corpo das duas classes devem conter todos os mtodos da interface. No exemplo usado abaixo, apenas implementaremos os mtodos ligar e desligar. A TV modelo 001 uma TV simples, sem muitos recursos que quando acionarmos o comando desligar ir simplesmente desligar.

01.public class ModeloTV001 extends TV implements ControleRemoto { 02.public final String MODELO = "TV001"; 03. 04.public ModeloTV001(int tamanho) { 05.super(tamanho); 06.} 07. 08.public void desligar() { 09.super.setLigada(false); 10.} 11. 12.public void ligar() { 13.super.setLigada(true); 14.} 15. 16.public void aumentarVolume(int taxa) { } 17.public void diminuirVolume(int taxa) { } 18.public void mudarCanal(int canal) { } 19.}
O modelo SDX uma TV mais moderna, que quando acionarmos o comando desligar ir apresentar uma mensagem dizendo "tchau!".

01.public class ModeloSDX extends TV implements ControleRemoto { 02.public final String MODELO = "TV-SDX"; 03. 04.public ModeloSDX(int tamanho) { 05.super(tamanho); 06.} 07. 08.public void desligar() { 09.System.out.println("Tchau!"); 10.super.setLigada(false); 11.} 12. 13.public void ligar() { 14.super.setLigada(true); 15.}

16. 17.public void aumentarVolume(int taxa) { } 18.public void diminuirVolume(int taxa) { } 19.public void mudarCanal(int canal) { } 20.}
Como pode ser visto, ambos possuem a mesma ao que desligar, porm cada um executa de forma diferente.

01.public class ExemploInterfaceamento { 02.public static void main(String[] args) { 03.ModeloTV001 tv1 = new ModeloTV001(21); 04.ModeloSDX tv2 = new ModeloSDX (42); 05. 06.tv1.ligar(); 07.tv2.ligar(); 08. 09.System.out.print("TV1 - modelo " + tv1.MODELO + " est "); 10.System.out.println(tv1.isLigada() ? "ligada" : "desligada"); 11.System.out.print("TV2 - modelo " + tv2.MODELO + " est "); 12.System.out.println(tv1.isLigada() ? "ligada" : "desligada"); 13. 14.// ambas as TVs esto ligadas e vamos deslig-las 15.System.out.println("Desligando modelo " + tv1.MODELO); 16.tv1.desligar(); 17.System.out.println("Desligando modelo " + tv2.MODELO); 18.tv2.desligar(); 19.} 20.}
Se prestarmos ateno, apenas a TV2 mostrar uma mensagem quando for desligada. Para visualizar melhor este exemplo, baixe o cdigo exemplo e implemente os mtodos que faltam.

Annotations
Annotations, traduzindo, quer dizer anotaes. Annotations do informaes sobre o cdigo que est sendo escrito ou at mesmo do prprio programa, o que se assemelha aos comentrios. Porm, annotations podem ser usados como objeto semntico de compiladores, ou seja, compiladores podem interpretar as annotations. Dessa forma possvel que compiladores entendam que, por exemplo, no para mostrar mensagens de advertncias (Warnings), ou usar as annotations para detectar erros de cdigo, criar documentaes usando XML, etc. Annotations podem possui elementos ou no. Seus elementos so sempre pair values, ou seja, elemento tem um nome e um valor.

Uso de Annotations
As annotations so sempre precedidas de arroba (@). Por conveno, usamos annotations antes de um elemento qualquer, por exemplo, antes da criao de uma classe ou do uso de um mtodo. Existem annotations com vrios pair values (valores diferentes) que so separados por vrgula, que contenham apenas um valor ou simplesmente nenhum valor. Exemplo: @SuppressWarnings(value = "unchecked"). Quando uma annotation possui apenas um elemento chamado value, ento, apenas necessrio atribuir seu valor sem declarar o nome value. Exemplo: @SuppressWarnings("unchecked"). Quando uma annotation no possui elementos, no necessrio usar os parnteses. Exemplo: @Override.

Abaixo est uma lista com algumas das annotations mais utilizadas.

@Deprecated: Sempre que algum mtodo tem seu uso desencorajado por ser perigoso ou por ter uma alternativa melhor desenvolvida, ento, ele recebe a anotao @Deprecated. @Override: Usado principalmente em casos de polimorfismo, sempre que formos sobrescrever um mtodo da classe-pai (superclasse) devemos indicar ao compilador com @Override. Mas, devemos tomar cuidado ao utilizar @Override, pois se marcarmos o mtodo e ele no sobrescrever nenhum mtodo da classe-pai (superclasse), ento, o compilador gerar uma mensagem erro. @SuppressWarnings ("deprecation"): Todos os avisos da categoria "inadequado" so ignorados. @SuppressWarnings ("unchecked"): Todos os avisos da categoria "no verificado" so ignorados. @SuppressWarnings ({"unchecked", "deprecation"}): Todos os avisos de qualquer categoria so ignorados.

y y y

Criar uma Annotation


Antes de criarmos uma annotation, primeiramente temos que nos ater ao fato de que annotations apenas podem ser criadas em projetos que so compatveis com JDK 5.0. Annotations so criadas de forma muito parecida com interfaces, diferenciando pelo fato de antes da palavra-chave interface h um smbolo arroba (@), cada elemento se parece com a declarao de um mtodo abstrato, a nomenclatura utilizada a mesma utilizada para nomear Classes e cada annotation fica em um arquivo .java da mesma forma que uma classe, classe abstrata ou interface.

1.public @interface MinhaAnnotation { 2.String elemento1(); 3.int elemento2(); 4.}


Podemos definir um valor padro para um elemento utilizando a palavra-chave default.

1.public @interface MinhaAnnotation { 2.String elemento1() default "VALOR"; 3.int elemento2() default 123; 4.}
Tambm podemos utilizar vetores para a definio de um elemento.

1.public @interface MinhaAnnotation { 2.String elemento1(); // elemento de String 3.float elemento2(); // elemento de ponto flutuante 4.int elemento3() default 1; // elemento inteiro que vale 1 por padro 5.String[] elemento4(); // elemento de VETOR de Strings 6.}
Abaixo est um exemplo de como usar nossa prpria annotation.

1.public @interface DetalhesSoftware { 2.String [] desenvolvedor (); 3.String nomeProjeto (); 4.String software (); 5.float versao () default 1.0f; 6.}
Agora que temos nossa anotao, basta cham-la.

01.@DetalhesSoftware ( 02.desenvolvedor = ("Desenvolvedor1", "Desenvolvedor2", "Desenvolvedor3"), 03.nomeProjeto = "Java Resources Checker", 04.software = "JRC", 05.versao = 1.0f

06.) 07. 08.public class AlgumaClasse { 09.//cdigo da classe 10.}

Adicionar Annotations ao Javadoc


Para fazer com que nossas annotations fiquem registradas no Javadoc toda vez que ele for gerado, devemos importar o pacote java.lang.annotation.Documented e antes de criarmos nossa annotation usarmos@Documented. Vejamos o exemplo abaixo: Visualizar Codigo Fonte Imprimir?

01.import java.lang.annotation.Documented; 02. 03.@Documented 04.public @interface DetalhesSoftware { 05.String software (); 06.String nomeProjeto (); 07.float versao () default 1.0f; 08.String [] desenvolvedor (); 09.}

Classes Abstratas e Mtodos Abstratos


Classes abstratas tem uma funo importante na orientao a objeto em Java. De forma objetiva, uma classe abstrata serve apenas como modelo para uma classe concreta (classe que comumente usamos). Como classes abstratas so modelos de classes, ento, no podem ser instanciadas diretamente com o new, elas sempre devem ser herdadas por classes concretas. Outro fato importante de classes abstratas que elas podem conter ou no mtodos abstratos, que tem a mesma definio da assinatura de mtodo encontrada em interfaces. Ou seja, uma classe abstrata pode implementar ou no um mtodo. Os mtodos abstratos definidos em uma classe abstrata devem obrigatoriamente ser implementados em uma classe concreta. Mas se uma classe abstrata herdar outra classe abstrata, a classe que herda no precisa implementar os mtodos abstratos. Para criarmos uma classe ou mtodo abstrato usamos a palavra-chave abstract. Para demonstrar, usaremos uma classe abstrata chamada Eletrodomestico, que servir de modelo para todos os objetos que possam ser eletrodomsticos.

01.package classeAbstrata; 02. 03.public abstract class Eletrodomestico { 04.private boolean ligado; 05.private int voltagem; 06. 07.// mtodos abstratos // 08./* 09.* no possuem corpo, da mesma forma que 10.* as assinaturas de mtodo de uma interface 11.*/ 12.public abstract void ligar(); 13.public abstract void desligar(); 14. 15.// mtodo construtor // 16./* 17.* Classes Abstratas tambm podem ter mtodos construtores, 18.* porm, no podem ser usados para instanciar um objeto diretamente 19.*/

20.public Eletrodomestico(boolean ligado, int voltagem) { 21.this.ligado = ligado; 22.this.voltagem = voltagem; 23.} 24. 25.// mtodos concretos 26./* 27.* Uma classe abstrata pode possuir mtodos no abstratos 28.*/ 29.public void setVoltagem(int voltagem) { 30.this.voltagem = voltagem; 31.} 32. 33.public int getVoltagem() { 34.return this.voltagem; 35.} 36. 37.public void setLigado(boolean ligado) { 38.this.ligado = ligado; 39.} 40. 41.public boolean isLigado() { 42.return ligado; 43.} 44.}
Como podemos observar, criamos um modelo de classe que compreende a uma gama enorme de outros objetos. Agora, qualquer objeto que derivar desse modelo deve ter sua voltagem especificada e dizer se est ligado ou no. Ento, vamos criar outras duas classes que herdam as caractersticas da classe abstrata (modelo). A primeira a classe TV:

01.package classeAbstrata; 02. 03.public class TV extends Eletrodomestico { 04.private int tamanho; 05.private int canal; 06.private int volume; 07. 08.public TV(int tamanho, int voltagem) { 09.super (false, voltagem); // construtor classe abstrata 10.this.tamanho = tamanho; 11.this.canal = 0; 12.this.volume = 0; 13.} 14. 15./* implementao dos mtodos abstratos */ 16.public void desligar() { 17.super.setLigado(false); 18.setCanal(0); 19.setVolume(0); 20.} 21. 22.public void ligar() { 23.super.setLigado(true);

24.setCanal(3); 25.setVolume(25); 26.} 27. 28.// abaixo teramos todos os mtodos construtores get e set... 29. 30.}
E essa a classe Radio.

01.package classeAbstrata; 02. 03.public class Radio extends Eletrodomestico { 04.public static final short AM = 1; 05.public static final short FM = 2; 06.private int banda; 07.private float sintonia; 08.private int volume; 09. 10.public Radio(int voltagem) { 11.super(false, voltagem); 12.setBanda(Radio.FM); 13.setSintonia(0); 14.setVolume(0); 15.} 16. 17./* implementao dos mtodos abstratos */ 18.public void desligar() { 19.super.setLigado(false); 20.setSintonia(0); 21.setVolume(0); 22.} 23. 24.public void ligar() { 25.super.setLigado(true); 26.setSintonia(88.1f); 27.setVolume(25); 28.} 29. 30.// abaixo teramos todos os mtodos construtores get e set... 31. 32.}
Pronto, como podemos ver, temos duas classes totalmente diferentes que tem como base o mesmo modelo. Tambm perceptvel o fato de que em ambas as classes, os mtodos abstratos ligar() e desligar() foram implementados, porm, no h a implementao dos outros mtodos como setVoltagem() ou isLigado(). As classes abstratas servem de base para codificao de uma classe inteira, diferentemente das interfaces que so apenas assinaturas dos mtodos. Sumarizando, quando temos que definir variveis, constantes, regras, e pequenas aes definidas devemos usar classes abstratas. Mas, se formos apenas criar a forma como objetos devem realizar determinadas aes (mtodos) devemos optar por interfaces. A boa combinao de heranas e implementaes de classes abstratas e interfaces proporciona uma forma robusta de criao de softwares e uma tima alternativa para heranas mltiplas comumente usadas em C++. Abaixo est uma classe que testa a funcionalidade dessas classes.

01.package classeAbstrata;

02. 03.public class Main { 04. 05.public static void main(String[] args) { 06.TV tv1 = new TV(29, 110); 07.Radio radio1 = new Radio(110); 08. 09./* 10.* chamando os mtodos abstratos implementados 11.* dentro de cada classe (TV e Radio) 12.*/ 13.tv1.ligar(); 14.radio1.ligar(); 15. 16.System.out.print("Neste momento a TV est "); 17.System.out.println(tv1.isLigado() ? "ligada" : "desligada"); 18.System.out.print("e o Rdio est "); 19.System.out.println(radio1.isLigado() ? "ligado." : "desligado."); 20.} 21.}

Polimorfismo
Polimorfismo, que vem do grego "muitas formas". o termo definido em linguagens orientadas a objeto - como o Java - para a possibilidade de se usar o mesmo elemento de forma diferente. Especificamente em Java, polimorfismo se encontra no fato de podemos modificar totalmente o cdigo de um mtodo herdado de uma classe diferente, ou seja, sobrescrevemos o mtodo da classe pai. Portanto, polimorfismo est intimamente ligado a herana de classes. Um pequeno exemplo para simplificar essa caracterstica segue abaixo: a. b. c. Classe 1 possui 2 mtodos: mtodoA() e mtodoB(). Classe 2 herda a classe 1. Classe 2 reescreve todo o mtodoA() que pertence a classe 1.

Levando isso a um patamar mais prtico. Sabemos que toda classe em Java herda implicitamente a classe Object. A classe Object possui alguns mtodos, dentre eles o mtodo toString(). O mtodo toString() original, descreve qual instncia de objeto est sendo utilizada. Resumidamente, ele cria um texto com o nome da classe mais um cdigo hexadecimal que cada instncia possui diferente de outra, chamado hash code ( como um RG daquela instncia). Ento, se tivssemos a classe TV dentro do pacote tiexpert e usssemos o comando: System.out.println (tv1.toString()). O que apareceria no console seria algo como: tiexpert.TV@c17124. Ento o que faremos para melhorar ser usar o polimorfismo para sobrescrever o mtodo toString(), colocando o texto da forma que desejarmos.

01.package tiexpert; 02. 03.public class TV { 04.private String marca; 05.private String modelo; 06.private int tamanho; 07.private int canal; 08.private int volume; 09.private boolean ligada;

10. 11.public TV(String marca, String modelo, int tamanho) { 12.this.marca = marca; 13.this.modelo = modelo; 14.this.tamanho = tamanho; 15.this.canal = 1; 16.this.volume = 0; 17.this.ligada = false; 18.} 19. 20.// mtodos getters e setters 21. 22.public String toString() { 23.return "TV" + 24."\nMarca: " + this.marca + 25."\nModelo: " + this.modelo + 26."\nTamanho: " + this.tamanho; 27.} 28. 29.public static void main(String args[]) { 30.TV tv1 = new TV("Marca1", "SDX-22", 29); 31.System.out.println(tv1.toString()); 32.} 33.}
Agora, o resultado da linha System.out.println (tv1.toString()) no ser mais: tiexpert.TV@c17124 Agora, ser: TV Marca: Marca1 Modelo: SDX-22 Tamanho: 29 possvel que dependendo do seu JRE e compilador seja necessrio o uso da annotation @override antes de sobrescrever o mtodo toString();

Typecast
Induo de tipo
Quando lidamos com linguagens de programao fortemente tipadas como Java, nos confrontamos muitas vezes com a necessidade de variar de um tipo de dado para outro. H casos, tambm, em que at mesmo o compilador no compreende que tipo de dado estamos atribuindo a umavarivel. Em Java, ns podemos fazer uso do que chamamos de induo de tipo ou typecast. O typecast dita ao compilador como tal dado deve ser interpretado e manipulado. Essa induo de tipo ou typecast pode ser implcita ou explcita. O typecast implcito feito automaticamente pelo compilador quando um tipo de dado pode ser facilmente manipulado no lugar de outro tipo de dado. O typecast explcito feito diretamente no algortmo para indicar ao compilador qual a forma de interpretao de um dado quando ele entende que h ambiguidade ou formatos incompatveis. O typecast explcito dado sempre dentro de parnteses que sempre vem antes do dado a ser induzido. Ex.: (int) var1, (float) var2, (Object) var3, ...

Typecast de Dados Primitivos


O typecast de dados primitivos dado basicamente em questo de seu consumo de memria. Se tentamos designar um tipo de dado que consome menos memria para um que consome mais

memria, o typecast realizado implicitamente. No exemplo abaixo, atribuimos um dado inteiro (varInt) a uma varivel do tipo float (varFloat).

01.public class ExemploTypecast1 { 02.public static void main(String[] args) { 03.float varFloat; 04.int varInt; 05.varInt = 200; 06.varFloat = varInt; 07.System.out.println(varFloat); 08.} 09.}
O contrrio no se aplica. Tentar atribuir um tipo de dado maior para um tipo de dado menor ir resultar em um erro de tipos incompatveis (type mismatch). Para demonstrar isso, usaremos dois tipos de dados inteiros. Porm, iremos atribuir um inteiro longo (que consome mais memria) a um dado inteiro que consome menos. Nesse caso, somos obrigados a usar typecast explcito.

01.public class ExemploTypecast2 { 02.public static void main(String[] args) { 03.long varLong; 04.int varInt; 05.varLong = 200; 06.varInt = (int) varLong; 07.System.out.println(varInt); 08.} 09.}

Typecast de Classes e Objetos


Typecast tambm pode ser usado em Classes e Objetos. Sempre e uma classe for genrica, ela poder receber qualquer tipo de objeto que ser feito o typecast implicitamente. Por exemplo, vamos utilizar a classe TV que vinhamos criando at agora.

01.package tiexpert; 02. 03.public class TV { 04.int tamanho; 05.int canal; 06.int volume; 07.boolean ligada; 08. 09.public TV(int tamanho, int canal, int volume, boolean ligada) { 10.this.tamanho = tamanho; 11.this.canal = canal; 12.this.volume = volume; 13.this.ligada = ligada; 14.} 15.}
Agora, vamos instanciar uma varivel da classe genrica Object com a classe TV.

01.package tiexpert; 02. 03.public class ExemploTypecast3 { 04.public static void main(String[] args) { 05.Object obj = new TV(29, 1, 0, false); 06.System.out.println("A varivel obj "

07.+ obj.getClass()); 08.} 09.}


Como podemos perceber, o resultado de getClass da varivel obj no sua classe original (Object), mas sua instncia: class tiexpert.TV. Agora, no ser possvel criar uma cpia desse objeto para uma varivel do mesmo tipo de sua instncia. Neste caso, devemos fazer o typecast explcito da classe.

01.package tiexpert; 02. 03.public class ExemploTypecast4 { 04.public static void main(String[] args) { 05.Object obj = new TV(29, 1, 0, false); 06.TV tv = (TV) obj; 07.TV tv2 = new TV(29, 1, 0, false); 08.System.out.println("A varivel tv cpia de obj" + 09."\nobj: " + obj.toString() + 10."\ntv: " + tv.toString()); 11.System.out.println("TV2 outro objeto: " + tv2.toString()); 12.} 13.}
O resultado do cdigo acima seria algo como: A varivel tv cpia de obj obj: tiexpert.TV@12345f tv: tiexpert.TV@12345f TV2 outro objeto: tiexpert.TV@abcde1

Instanceof
No exemplo anterior, se tentssemos atribuir obj diretamente a tv ocorreria um erro de tipos incompatveis (type mismatch). Quando lidamos com classes, podemos testar qual seu tipo de instancia usando o operador instanceof.

Instanceof indica se um objeto (j instanciado) pertence a uma classe.


O uso de instanceof : objeto instanceof nomeDaClasse. Para melhorar o exemplo anterior, usaremos instanceof antes de atribuirmos obj a tv.

01.package tiexpert; 02. 03.public class ExemploTypecast { 04.public static void main(String[] args) { 05.Object obj = new TV(29, 1, 0, false); 06.TV tv = null; 07.if (obj instanceof TV) { 08.tv = (TV) obj; 09.} 10.TV tv2 = new TV(29, 1, 0, false); 11.System.out.println("A varivel tv cpia de obj" + 12."\nobj: " + obj.toString() + 13."\ntv: " + tv.toString()); 14.System.out.println("TV2 outro objeto: " + tv2.toString()); 15.} 16.}

Generics

No artigo anterior de Java, vimos como usar typecast e instanceof. Aqui, veremos uma pequena introduo de Generics ou programao genrica, na qual ser muito importante quando formos tratar de classes e interfaces de coleo como, por exemplo, a classe Vector. Generics, ou programao genrica, serve para determinar para o compilador, qual tipo de classe deve ser interpretada. Por exemplo, vamos imaginar que ser criada uma classe chamada Aparelho que ir conter um objeto de alguma outra classe. Para que essa classe possa aceitar qualquer tipo de classe, devemos fazer uso de generics. Generics indicado como um identificador entre os sinais de maior e menor (<>).

Criar classes usando generics


Para criar uma classe usando generics, basta que logo aps o nome da classe coloquemos o indicador genrico. Esse indicador genrico simplesmente uma letra na qual ser substituda dentro da classe no momento da execuo.

01.package tiexpert; 02. 03.public class Aparelho <T> { 04.T objeto; 05. 06.public Aparelho(T objeto) { 07.this.objeto = objeto; 08.} 09. 10.public T getObjeto() { 11.return objeto; 12.} 13. 14.public void setObjeto(T objeto) { 15.this.objeto = objeto; 16.} 17.}
Como a letra T identifica um tipo genrico, ela ser substituda por qualquer classe. Vamos imaginar agora que temos duas classes distintas. A classe TV:

01.package tiexpert; 02. 03.public class TV { 04.int tamanho; 05.int canal; 06.int volume; 07.boolean ligada; 08. 09.public TV(int tamanho, int canal, int volume, boolean ligada) { 10.this.tamanho = tamanho; 11.this.canal = canal; 12.this.volume = volume; 13.this.ligada = ligada; 14.} 15. 16.// mtodos get e set 17. 18.}
E a classe Radio:

01.package tiexpert;

02. 03.public class Radio { 04.public static int AM = 1; 05.public static int FM = 2; 06.private float frequencia; 07.private int volume; 08.private int banda; 09. 10.public Radio(float frequencia, int volume, int banda) { 11.this.frequencia = frequencia; 12.this.volume = volume; 13.this.banda = banda; 14.} 15. 16.// mtodos get e set 17. 18.}

Instanciar uma classe genrica


Se fossemos criar um programa que usa as duas classes de aparelhos acima, faramos:

01.package tiexpert; 02. 03.public class MinhaClasse { 04.public static void main(String[] args) { 05.Aparelho<TV> aparelho1 = new Aparelho<TV>(new TV(29, 0, 0, false)); 06.Aparelho<Radio> aparelho2 = new Aparelho<Radio>(new Radio(88.1f, 0, Radio.FM)); 07.System.out.println(aparelho1.getObjeto().getClass()); 08.System.out.println(aparelho2.getObjeto().getClass()); 09.} 10.}
Perceba o seguinte: sem o uso de generics, o compilador no conseguiria saber qual a diferena entre aparelho1 eaparelho2, pois ele os trataria da mesma forma. Nesse caso, seria obrigatrio o uso de typecast para determinar ao compilador que dado est sendo processado. Se pensarmos em uma aplicao muito grande, alm de ficar cansativo ter que usar typecast toda vez que fossemos usar um aparelho, seria muito provvel que erraramos em algum momento. Java usa uma pequena conveno de nomenclatura para as letras de identificao de generics (que so vastamente utilizadas no Framework de colees Java), sendo:

y y y y y

E - Elemento K - Chave N - Nmero T - Tipo V - Valor

Generics um assunto bastante extenso com vrios tpicos que podem ser abordados, dentre os quais podemos citar:

y y y y

Multiplos tipos genricos. Ex.: <T, E, N>; Tipos genricos limitados. Ex.: <U extends Number>; Wildcards; e Subtipos;

O intuito deste artigo apenas introduzir um conceito geral de programao genrica (generics) para compreenso de classes e mtodos que utilizam generics.

Try e Catch
Tratamento de Excees e Erros
Umas das utilidades proporcionadas pela orientao a objetos de Java a facilidade em tratar possveis erros de execuo chamados de excees. Sempre que um mtodo de alguma classe passvel de causar algum erro, ento, podemos usar o mtodo de tentativa - o try. Tudo que estiver dentro do bloco try ser executado at que alguma exceo seja lanada, ou seja, at que algo d errado. Quando uma exceo lanada, ela sempre deve ser capturada. O trabalho de captura da exceo executado pelo bloco catch. Um bloco try pode possuir vrios blocos de catch, dependendo do nmero de excees que podem ser lanadas por uma classe ou mtodo. O bloco catch obtm o erro criando uma instncia da exceo. Portanto, a sintaxe do bloco try catch : try { // cdigo a ser executado } catch (ClasseDeExceo instnciaDaExceo) { // tratamento da exceo }

Excees
As excees so, na verdade, instncias de classes. E como qualquer classe ou objeto, podemos facilmente manipular. Existem mtodos comuns entre todas as classes de Excees, dentre as quais podemos citar:

y y

toString(): Converte os dados da exceo para String para visualizao. printStackTrace(): Imprime na sada de erro padro (geralmente console) todos os
frames de onde foram detectados erros. til para depurao no desenvolvimento, pois mostra todo o histrico do erro, alm das linhas onde foram ocasionados. getCause(): Retorna a causa da Exceo, ou null se a causa for desconhecida ou no existir. getMessage(): Retorna uma string com o erro. uma forma simples e elegante de mostrar a exceo causada, geralmente, utilizada como forma de apresentao ao usurio.

y y

Finally Finally o trecho de cdigo final. A funo bsica de finally sempre executar seu bloco de
dados mesmo que uma exceo seja lanada. muito til para liberar recursos do sistema quando utilizamos, por exemplo, conexes de banco de dados e abertura de buffer para leitura ou escrita de arquivos.

Finally vir aps os blocos de catch.


try { // cdigo a ser executado } catch (ClasseDeExceo instnciaDaExceo) { // tratamento da exceo } finally { // cdigo a ser executado mesmo que uma exceo seja lanada } Abaixo est um exemplo de tratamento de erro ou exceo. Tentaremos atribuir uma string de letras a um objeto inteiro. Como no possvel atribuir uma string de letras a um objeto inteiro, uma exceo de formato de nmero lanada.

01.public class ExemploDeExcecao { 02.public static void main(String[] args) {

03.String var = "ABC"; 04.try { 05.Integer i = new Integer(var); 06.System.out.println("A varivel i vale " + i); 07.} catch (NumberFormatException nfe) { 08.System.out.println("No possvel atribuir a string " + var 09.+ " a um Objeto Inteiro.\n" 10.+ "A seguinte mensagem foi retornada:\n\n" 11.+ nfe.getMessage()); 12.} 13.} 14.}
O cdigo acima apresentar algo como: No possvel atribuir a string ABC a um Objeto Inteiro. A seguinte mensagem foi retornada: For input string: "ABC" Perceba que a linha System.out.println("A varivel i vale " + i) no foi executada, pois houve um erro na linha anterior. Portanto, apenas a mensagem de tratamento do erro NumberFormatException foi impressa na tela.

Classes Numricas
Estamos seguindo para, em breve, entrarmos nos tutoriais de programao usando SWING e AWT, resumidamente, janelas. Mas antes, veremos classes que se tornaro de extrema importncia para o uso da manipulao dos dados. Essas classes so as que tem por base a classe abstrata Numbers e a classe String. Em Java, alm de podermos utilizar os tipos primitivos de dados, tambm podemos usufruir de classes completas para o tratamento desses tipos primitivos. Isso uma grande vantagem quando mtodos necessitam ou retornam objetos ao invs de tipos primitivos (o que muito comum com os objetos do pacote SWING e AWT). Outra vantagem dessas classes que o prprio compilador capaz de extrair os dados do objeto implicitamente e manipular seus dados como sendo simples dados primitivos, num processo descrito como box e unbox (encaixotar e desencaixotar). Por exemplo, se quisermos somar dois inteiros que esto dentro de dois objetos inteiros, no precisaramos fazer nada de especial, a no ser som-los de fato, como se fossem dados primitivos. Veja:

1.public class SomarIntegers { 2.public static void main(String[] args) { 3.Integer var1 = 25; 4.Integer var2 = 75; 5.int resultado = var1 + var2; // somando dois objetos 6.System.out.println(resultado); 7.} 8.}
A princpio, a classe abstrata Number nos proporciona um conjunto de mtodos que, logicamente, so possveis acessar de qualquer classe numrica.

Obter Tipo Primitivo de um Objeto Numrico


Podemos utilizar os mtodos *Value para obter um tipo primitivo de qualquer objeto numrico.

y y y y y y

byteValue(): Obtm um valor primitivo byte. shortValue(): Obtm um valor primitivo short (inteiro curto). intValue(): Obtm um valor primitivo int (inteiro). longValue(): Obtm um valor primitivo long (inteiro longo). floatValue(): Obtm um valor primitivo float. doubleValue(): Obtm um valor primitivo double.

Esses mtodos so timos para passar de um tipo de dado para o outro sem nos preocuparmos com induo de tipo ou typecasting, pois a mudana feita diretamente pelo objeto.

01.public class ConverterNumeros { 02.public static void main(String[] args) { 03.Byte meuByte = 5; 04.Integer meuInt = 12345; 05.Double meuDouble = 1234567.89; 06.byte doubleParaByte = meuDouble.byteValue(); 07.int byteParaInteiro = meuByte.intValue(); 08.double inteiroParaDouble = meuInt.doubleValue(); 09.System.out.println("Byte: " + meuByte + 10." - para int: " + byteParaInteiro + 11."\nInteger: " + meuInt + 12." - para double: " + inteiroParaDouble + 13."\nDouble: " + meuDouble + 14." - para byte: " + doubleParaByte); 15.} 16.}

Comparar Nmeros
Para comparao de nmeros, h dois mtodos: compareTo() e equals(). O mtodo compareTo() compara o objeto com um outro objeto da mesma classe ou nmero de tipo primitivo do mesmo tipo. Ele retorna 0 se o nmero comparado for igual, -1 se o nmero for menor ou 1 se o nmero for maior.

Equals() funciona de forma semelhante. Ele indica se o nmero comparado igual ao


argumento deste mtodo, porm no diz se o argumento maior ou menor que o valor do objeto. Outra diferena fica por conta de seu retorno que um valor booleano (true ou false).

Classes Integer, Float, Short, Byte, Long e Double


Agora que temos a base de todas as classes numricas, iremos para a descrio dos mtodos contidos nessas classes, que apesar de diferentes, mantem uma similaridade muito grande.

Anlise de Dados
A anlise de dados consiste em tentar usar uma String que possa ser interpretada como tal objeto numrico usando o comando parse*. Caso a String no possa ser interpretada como um nmero, uma exceo (erro) lanada.

y y y y y y

Byte.parseByte(): analisa uma String para tenta atribuir um dado do tipo


primitivo byte.

Short.parseShort(): analisa uma String para tenta atribuir um dado do tipo


primitivo short.

Integer.parseInt(): analisa uma String para tenta atribuir um dado do tipo


primitivo inteiro.

Long.parseLong(): analisa uma String para tenta atribuir um dado do tipo inteiro
primitivo longo.

Float.parseFloat(): analisa uma String para tenta atribuir um dado do tipo


primitivo float.

Double.parseDouble(): analisa uma String para tenta atribuir um dado do tipo


primitivo double.

Se quisermos que, ao invs de um tipo primitivo de nmero, seja retornado um objeto, podemos trocar qualquerparse* por valueOf(). Em tipos inteiros, alm de valueOf(), tambm podemos trocar parseInt, parseByte, parseShort e parseLongpor decode(). Importante: As classes que se baseiam em nmeros inteiros (Byte, Short, Long e Integer) possuem um segundo argumento do tipo inteiro opcional nos mtodos parse* que indica a base do

nmero inteiro, fazendo com que dessa forma possa ser interpretado nmeros Decimais (base 10), Binrios (base 2), Octais (base 8) e Hexadecimais (base 16).

Decode tambm pode fazer este tipo de interpretao, mas no necessrio um segundo
argumento desde que a String respeite algumas convenes:

y y y y

No so aceitos espaos; No so aceitos nmeros negativos; Nmeros octais devem comear com um 0 (ex.: "0377", "0400", "0401"); Nmeros hexadecimais devem comear com 0x, 0X ou # (ex.: "0xFF", "0X100", "#101").

01.public class ParseEDecode { 02.public static void main(String[] args) { 03.String numero = "256"; 04.// retorna um dado do tipo int (inteiro) 05.int tipoInteiro = Integer.parseInt(numero); 06.// retorna um objeto da classe Integer (inteiro) 07.Integer objetoInteiro = Integer.decode(numero); 08.System.out.println("tipoInteiro: " + tipoInteiro + 09."\nobjetoInteiro: " + objetoInteiro); 10.} 11.}

Converso Para String


Para converter qualquer objeto numrico para uma String podemos fazer uso de toString() como qualquer outra classe.

Classe Math
Vimos anteriormente como tratar nmeros de vrios tipos. Veremos agora, como aplicar conceitos matemticos mais complexos a nossos processamentos usando a classe Math do pacote Java.lang. A classe Math nos proporciona uma srie de operaes e constantes matemticas que so facilmente acessadas estaticamente, ou seja, no precisamos instanciar um objeto para podermos usar seus mtodos. Dentro desta classe encontramos vrios mtodos e categorizamos os mais utilizados da seguinte forma:

y y y y y y

Mximo e Mnimo; Potncias e Razes; Logaritmo; Arredondamentos e Valores Absolutos; Trigonometria; Nmeros Randmicos.

Constantes
A classe Math possui duas constantes que so o (pi) e E (base de logaritmos naturais ou neperianos) cada uma com o valor de 3,141592653589793 e 2.718281828459045, respectivamente. Abaixo est um exemplo simples com o clculo do comprimento do crculo:

1.public class ComprimentoCirculo { 2.public static void main(String[] args) { 3.float raio = 2.4f; 4.double comprimento = 2 * raio * Math.PI; 5.System.out.println(comprimento); 6.} 7.}

Mximo e Mnimo

Como o ttulo j sugere, a classe Math de Java possui dois mtodos que retornam o maior e o menor valor de seus argumentos. Esses mtodos so max() e min().

01.public class MenorMaior { 02.public static void main(String[] args) { 03.float precoProdutoA[] = { 11.2f, 15.12f }; 04.float precoProdutoB[] = { 19.7f, 20 }; 05.System.out.println("O maior preo do produto A " 06.+ Math.max(precoProdutoA[0], precoProdutoA[1])); 07.System.out.println("O menor preo do produto B " 08.+ Math.min(precoProdutoB[0], precoProdutoB[1])); 09.} 10.}

Potncias e razes
Podemos fazer clculos de potncia e razes com facilidade usando os mtodos disponveis em Math.

y y y y

pow (base, expoente) - calcula a potncia da base elevada ao expoente. sqrt (nmero) - calcula a raz quadrada de um nmero cbrt (nmero) - calcula a raiz cbica de um nmero exp (expoente) - calcula o valor da constante de Euler (E) elevado ao expoente

1.public class PotenciasRaizes { 2.public static void main(String[] args) { 3.System.out.println("1 MB tem " + Math.pow(2, 10) + " KB"); 4.System.out.println("A raiz quadrada de 121 " + Math.sqrt(121) 5.+ " e a raiz cbica de 1331 tambm " + Math.cbrt(1331)); 6.} 7.}

Logaritmo
Na classe Math encontramos funes para clculo de logaritmo natual, na base de 10 e a soma do nmero mais 1. Tais mtodos so:

y y y

log (nmero) - logaritmo natural de um nmero. log10 (nmero) - logaritmo natural de um nmero na base 10 log1p (nmero) - logaritmo natual de um nmero somado a 1. Esse mtodo retorna
um resultado mais confivel se o nmero em questo for muito prximo a 0 ou um nmero fracionado. Ou seja, o resultado no o mesmo entre os mtodos log1p (0.1f) e log (1+0.1f).

1.public class Exemplo { 2.public static void main(String[] args) { 3.float nr = 0.1f; 4.System.out.println("Resultado 1: " + Math.log(nr+1)); 5.System.out.println("Resultado 2: " + Math.log1p(nr)); 6.} 7.}

Arredondamentos e Valores Absolutos


Existem algumas formas de arredondar um nmero fracionado (float e double) transformando-o em um nmero inteiro e tambm como obter o valor absoluto de qualquer nmero..

abs (nmero) - retorna o valor absoluto do mesmo tipo do parmetro (ex.: inteiro retorna int positivo, decimal retorna float positivo, etc)

y y y y

ceil (decimal) - este mtodo retorna o valor decimal do parmetro sem a parte fracionada. Ex.: 2.1 ser 2, 6.0 ser 6, 10.8 ser 10... floor (decimal) - este mtodo retorna o primeiro inteiro aps o valor decimal. Ex.: 2.1 ser 3, 6.0 ser 6, 10.8 ser 11... rint (decimal) - retorna um valor double mais prximo do valor do parmetro. round (decimal) - retorna o arredondamento aritmtico do nmero decimal passado
como parmetro

01.public class Exemplo { 02.public static void main(String[] args) { 03.float nr = -5.75f; 04.System.out.println("Absoluto: " + Math.abs(nr) + 05."\nInteiro mais baixo: " + Math.ceil(nr) + 06."\nInteiro mais alto: " + Math.floor(nr) + 07."\nDouble mais prximo: " + Math.rint(nr) + 08."\nArredondamento: " + Math.round(nr)); 09.} 10.}

Trigonometria
A maior parte dos mtodos encontrados na classe Math so trigonomtricas, o que ajuda muito em clculos mais complexos que envolvem figuras.

y y y y y y y y y y y y

sin (graus) - este mtodo retorna o valor do seno de acordo com o nmero de graus passado como parmetro. cos (graus) - este mtodo retorna o valor do coseno de acordo com o nmero de graus passado como parmetro. tan (graus) - este mtodo retorna o valor da tangente de acordo com o nmero de graus passado como parmetro. asin (graus) - este mtodo retorna o valor do arco seno de acordo com o nmero de graus passado como parmetro. acos (graus) - este mtodo retorna o valor do arco coseno de acordo com o nmero de graus passado como parmetro. atan (graus) - este mtodo retorna o valor do arco tangente de acordo com o nmero de graus passado como parmetro. sinh (graus) - este mtodo retorna o valor hiperblico do seno de acordo com o nmero de graus passado como parmetro. cosh (graus) - este mtodo retorna o valor hiperblico do coseno de acordo com o nmero de graus passado como parmetro. tanh (graus) - este mtodo retorna o valor hiperblico da tangente de acordo com o nmero de graus passado como parmetro. hypot (x , y) - retorna o valor da hipotenusa, ou, basicamente, a distncia entre dois pontos fundamentada na frmula x +y [ sqrt (pow(x, 2) + pow(y,2))]. toRadians (graus) - retorna um valor aproximado de radianos de acordo com o ngulo medido em graus. toDegrees (raio) - retorna um valor aproximado de graus de acordo com o ngulo medido em raios.

01.public class Hipotenusa { 02.public static void main(String[] args) { 03.double ponto1 = 30; 04.double ponto2 = 40; 05.System.out.println("A distancia entre o " 06.+ ponto1 + " e o " + ponto2 + " " 07.+ Math.hypot(ponto1, ponto2)); 08.}

09.}

Nmeros Randmicos
Os nmeros randmicos so obtidos usando o mtodo random(). O mtodo random() retorna um valor double em 0.0 e 1.0. Para conseguirmos um valor limite ou um alcance (comumente chamado de range) delimitado, devemos fazer pequenas operaes matemticas. Essas operaes so simples e podem ser resumidas da seguinte maneira.

y y

O limite inferior, ou valor inicial (start value) ser sempre somado ao nmero randmico. O limite superior, ou alcance (range) ser sempre o limite superior subtrado o limite inferior e depois multiplicado ao nmero randmico.

Por exemplo, se quisermos que um nmero randmico sempre fique entre 5 e 10, procederamos da seguinte maneira: O menor nmero possvel 5, portanto ele ser nosso start value ou limite inferior. O maior nmero possvel 10, ento 10 ser nosso limite superior. Como temos ambos os limites (inferior e superior) devemos criar um alcance (range). Para obtermos isso, subtrairemos o limite superior com o limite inferior (10-5=5). Visualizar Codigo Fonte Imprimir?

01.public class Exemplo { 02.public static void main(String[] args) { 03.int limiteInferior = 5; 04.int limiteSuperior = 10; 05.int alcance = limiteSuperior - limiteInferior; 06.double nrRandomico = Math.random(); 07.System.out.println("O nmero randmico escolhido entre 5 e 10 foi " 08.+ Math.round(limiteInferior + nrRandomico * alcance)); 09.} 10.}

String
Strings so utilizadas frequentemente em vrias linguagens de programao, no apenas Java. Embora Strings sejam uma sequncia de caracteres em Java, e no um array de caracteres. Em Java, o importante entender que string no um tipo de dado, mas sim uma classe. E suas variveis so, na verdade, objetos dessa classe. Em sntese, tanto um array de caracteres como uma string se apresentam da mesma forma. Ento, qual a vantagem de se usar uma classe e no um array de tipo primitivo? A resposta se baseia exatamente no uso da orientao a objetos e no fato de que existem muitos mtodos que podemos utilizar em um objeto instanciado da classe String, mesmo sendo os objetos desta classe imutveis, ou seja, uma vez instanciados no podemos mudar o que est guardado dentro do objeto String. Dentre as possibilidades oferecidas pela classe String podemos destacar algumas como:

y y y y y y y y y

Concatenao; Tamanho da String; Converter para maisuculas ou minsculas; Fazer comparaes que incluem verificaes no incio e no fim; Extrair um caracter especfico da string; Achar um ndice da string, inclusive recursivamente (de trs para frente); Substituir uma parte da string ou ela completamente; Verificar se uma string contm outra; Dividir uma string em array ou vetor;

Obter uma poro da string inteira, o que chamamos de substring.

Objetos Strings podem ser instanciadas usando um array de caracteres ou bytes com o operador new. Ou por meio de uma string literal. String literal qualquer sequncia de caracteres que estiver entre aspas (").

01.public class ExemploCriarString { 02.public static void main(String[] args) { 03.char[] charArray = { 'T', 'I', ' ', 'E', 'x', 'p', 'e', 'r', 't'}; 04./* construindo uma string a partir de um array de char */ 05.String string1 = new String(charArray); 06./* construindo uma string a partir de uma string literal */ 07.String string2 = "www.tiexpert.net"; 08. 09.System.out.println(string1); 10.System.out.println(string2); 11.} 12.}

Concatenao
Concatenao nada mais do que juntar strings numa s. Isto pode ser feito de duas formas: uma usando o mtodo concat() da classe String ou usando o sinal de adio (+) como operador de concatenao. O mtodo concat() retorna uma nova string formada da juno da string principal com a string indicada como parmetro. De uma forma mais simples, podemos usar o + para juntar vrias strings ao mesmo tempo. Para mais detalhes, veja o artigo principal sobre concatenao.

Tamanho da string - length()


A classe String possui um mtodo acessor que retorna o tamanho da String. Esse mtodo length().

1.public class TamanhoString { 2.public static void main(String[] args) { 3.String str = "TI Expert"; 4.System.out.println(str + " possui " + str.length() + " caracteres."); 5.} 6.}

Letras Maisculas e Minsculas


Podemos facilmente deixar todas as letras de uma sequncia de caracteres maiscula ou minscula usando os mtodos toUpperCase() e toLowerCase() respectivamente.

1.public class StringMaiusculoMinusculo { 2.public static void main(String[] args) { 3.String email = "MeuNoMe@MEUDominiO.coM.bR"; 4.String hexadecimal = "#aa33ff"; 5.System.out.println(email.toLowerCase()); 6.System.out.println(hexadecimal.toUpperCase()); 7.} 8.}

Comparao
H vrias formas de se fazer comparaes com uma string, mas vale sempre lembrar que Java case sensitive - diferencia letras maiscula de minsculas e vice-versa. Embora haja mtodos prprios para comparaes em que no h importncia em diferenciar letras maisculas e minsculas. A comparao mais simples usando o prprio operador de igualdade (==), mas por se tratar de um objeto prefervel que se use o mtodo especfico chamado equals().

O mtodo equals() compara o objeto string com outro objeto, se ambos possurem contedos iguais, ento, retornado verdadeiro (true), caso contrrio falso (false). Isso quer dizer que se, por exemplo, tiver um objeto da classe Integer que vale 15 e uma string contendo os caracteres 1 e 5, a comparao de ambos resultar em verdadeiro. A funo equals() case sensitive, para fazer uma comparao ignorando esta caracterstica basta usar o mtodoequalsIgnoreCase().

01.public class ComparacaoIgualdadeString { 02.public static void main(String[] args) { 03.String string1 = "TI Expert"; 04.String string2 = "ti expert"; 05.System.out.println("So iguais? (case sensitive)"); 06.System.out.println(string1.equals(string2) ? "sim" : "no"); 07.System.out.println("So iguais? (sem case sensitive)"); 08.System.out.println(string1.equalsIgnoreCase(string2) ? "sim" : "no"); 09.} 10.}
H tambm uma forma de comparar strings lexicograficamente. Dessa forma, podemos verificar se uma string identica (quando retorna-se 0), ou se ela tem um valor menor (quando retorna-se um nmero abaixo de 0) ou se ela tem um valor maior (quando retorna-se um nmero acima de 0). O mtodo para fazer tais comparaes o compareTo() (case sensitive) ou compareToIgnoreCase() (sem case sensitive).

01.public class ComparacaoString { 02.public static void main(String[] args) { 03.String string1 = "TI Expert"; 04.String string2 = "ti expert"; 05.int comparacao = string1.compareTo(string2); 06.System.out.println("Comparao entre string1 e string2 case)"); 07.if (comparacao > 0) { 08.System.out.println("string1 lexicograficamente maior string2"); 09.} else if (comparacao < 0) { 10.System.out.println("string1 lexicograficamente menor string2"); 11.} else { 12.System.out.println("string1 lexicograficamente igual 13.} 14.} 15.}

(sensitive

que

que

a string2");

Incio e fim
Outra forma de fazer comparaes fazer testes no incio e no fim de uma string. Podemos fazer tais comparaes usando dois mtodos: startsWith() e endsWith().

StartsWith() verifica se h uma string no comeo de outra string. StartsWith() tambm


possui um segundo parmetro opcional que determina a compensao inicial, ou seja, caso necessite verificar a string no da posio 0, mas de uma posio mais adiante.

EndsWith() verifica se h uma string no final de outra string. Diferentemente de startsWith(), o mtodoendsWith() no possui compensao. 01.public class InicioFim { 02.public static void main(String[] args) { 03.String string1 = "http://www.tiexpert.net"; 04.System.out.println("A string " + string1 + " :"); 05.// verifica se h 'http:' no inicio da string

06.if (string1.startsWith("http:")) { 07.System.out.println("uma URL"); 08.} 09./* 10.* verifica se h 'www' no incio da string, mas apenas a partir do 11.* 8o. caracter, ou seja, aps o prefixo 'http://', portanto dever 12.* ser compensado 7 caracteres 13.*/ 14.if (string1.startsWith("www", 7)) { 15.System.out.println("uma pgina da web"); 16.} 17.if (string1.endsWith(".br")) { 18.System.out.println("um site registrado no Brasil"); 19.} else { 20.System.out.println("no um site registrado no Brasil"); 21.} 22.} 23.}

Caracter na posio
Podemos tambm obter um caracter que se encontra em alguma posio dentro da string. Para isso, usaremos o mtodo charAt().

CharAt() recebe um inteiro como argumento que indica a posio que queremos da string.
Importante: Strings seguem o mesmo conceito de vetores e arrays, portanto, seu primeiro caracter no est na posio 1, mas na posio 0.

1.public class ExtrairCaracter { 2.public static void main(String[] args) { 3.String string1 = "TI Expert"; 4.char caracter = string1.charAt(3); 5.System.out.println("O 4o. caracter desta string " + caracter); 6.} 7.}

ndice da String
A classe string possui uma forma de encontrar o ndice da primeira ocorrncia de uma string dentro de outra string. O mtodo indexOf() retorna um nmero inteiro que indica exatamente em que posio ocorre uma string de busca, ou retorna um valor menor que 0 caso no encontre o valor requisitado. Assim como startsWith(), indexOf() tambm possui um segundo argumento que determina a compensao a ser feita caso a busca no possa ser feita desde a posio 0, mas de uma posio posterior. Alm do mtodo indexOf(), h tambm o mtodo lastIndexOf() que faz a mesma coisa que indexOf(), porm de forma recursiva (de trs para frente ou do fim da string para o comeo)

01.public class IndiceString { 02.public static void main(String[] args) { 03.String string1 = "www.tiexpert.net"; 04.int posicao; 05.posicao = string1.indexOf("tiexpert"); 06.if (posicao >= 0) { 07.System.out.println("A string tiexpert comea na posio " + posicao); 08.} else { 09.System.out.println("No h tiexpert na string"); 10.} 11.posicao = string1.lastIndexOf(".com");

12.if (posicao >= 0) { 13.System.out.println("A string .com comea na posio " + posicao); 14.} else { 15.System.out.println("No h .com na string"); 16.} 17.} 18.}

Substituir string ou parte dela


Podemos substituir todas as ocorrncias de uma string por uma nova string resultando em uma nova string de retorno. Para executarmos esta operao usamos o mtodo replace() que tem dois parmetros: o primeiro ser o que desejamos procurar dentro da string e o segundo a string que colocaremos no lugar da antiga. Nota: replace tambm funciona com o tipo primitivo char.

1.public class SubstituirString { 2.public static void main(String[] args) { 3.String string1 = "http://tiexpert.net "; 4.System.out.println(string1.replace("http://", "www.")); 5.} 6.}

Verificar contedo da string


Um mtodo muito til para verificar o contedo de uma string o contains().

Contains() retorna verdadeiro (true) se houver a sequncia de caracteres especificada no


parmetro.

1.public class VerificarConteudo { 2.public static void main(String[] args) { 3.String string1 = "http://www.tiexpert.net "; 4.System.out.println(" uma pgina da web?"); 5.System.out.println(string1.contains("www.") ? "sim" : "no"); 6.} 7.}

Dividir em vrios vetores ou arrays


Tambm possvel dividir uma string em um vetor ou array de strings, o que possibilita trabalhar com pedaos menores e mais lgicos da string. Para dividir a string podemos usar o mtodo split(). O mtodo split usa uma expresso regular para fazer a diviso. Para simplificar o entendimento, podemos usar como parmetro uma outra string como base. Mas vale atentar no fato de que a expresso utilizada para ser feita a quebra desaparece no fim do processo. Ex.: Se minha string for 15:30:00, se utilizarmos os dois pontos (:) para a separao conseguiremos um array com 3 posies que seriam: [0]->15, [1]->30, [2]>00.

01.public class Exemplo { 02.public static void main(String[] args) { 03.String string1 = "15:30:00"; 04.String[] stringDividida = string1.split(":"); 05.for (int i = 0; i < stringDividida.length; i++) { 06.System.out.println("stringDividida[" + i + "]=" + stringDividida[i]); 07.} 08.} 09.}

Substring
Substring uma poro ou parte da string principal da qual pode formar outra string, ou seja, uma substring uma string formada a partir de uma string principal.

Para obtermos uma substring usamos um mtodo homnimo (de mesmo nome) com um ou dois parmetros. O primeiro parmetro, obrigatrio, a posio que a substring deve iniciar (lembrando-se que strings sempre comeam da posio 0). O segundo parmetro, opcional, a posio final da substring, caso este parmetro no seja indicado, a substring sempre ir at o ltimo caracter encontrado. Nota: O caracter na posio inicial far parte da substring, porm o caracter na posio final no faz parte da substring. Vejamos o exemplo: Se tivermos uma string de 9 caracteres, portanto, de 0 a 8 posies, se fizermos a substring da seguinte forma: stringOriginal.substring(3,8); 0 1 2 3 4 5 6 7 8 T I E X P E R T

O resultado ser Exper. Ento, se quisermos que a 8 posio entre, devemos usar a posio seguinte 9, assim:stringOriginal.substring(3,9); Visualizar Codigo Fonte Imprimir?

01.public class ExemploSubstring { 02.public static void main(String[] args) { 03.String url = "www.tiexpert.net"; 04.String dominio = url.substring(4); 05.String site = url.substring(url.indexOf('.') + 1, url.lastIndexOf('.')); 06.System.out.println("Anlise da string:"); 07.System.out.println("Domnio: " + dominio); 08.System.out.println("Site: " + site); 09.} 10.}

JOptionPane
Uma Introduo Programao Visual
Aps apresentarmos os conceitos estruturais principais de linguagem, a idia de orientao a objeto e as classes que mais utilizaremos como String e Numbers, passaremos agora a focar numa programao mais voltada a prticas possveis, demonstrando classes com funes mais avanadas e importantes, alm de abandornamos um pouco o visual de console e partirmos para a programao visual de Java. Para introduzir esta nova fase, iniciaremos descrevendo um pouco sobre JOptionPane do pacote visual Swing. A classe JOptionPane nos proporciona uma srie de mtodos estticos que ao serem invocados criam caixas de dilogos simples e objetivas. Para usar JOptionPane temos sempre que importar o pacote javax.swing.JOptionPane primeiro.

Caixas de Dilogo Input Text


As caixas de dilogo de entrada de texto ou Input Text Dialog servem para fazer uma requisio de algum dado ao usurio de forma bem simples e direta. O que digitado pelo usurio retornado pelo mtodo em forma de string. Existem mais de 10 mtodos sobrecarregados para invocar uma caixa de dilogo Input Text, mas, a princpio, usaremos a mais simples. O mtodo showInputText recebe um argumento que a string contendo a informao desejada, o que na maioria das vezes uma pergunta ou pedido. O exemplo abaixo demonstra um programa pedindo para que digite seu nome.

1.import javax.swing.JOptionPane; 2. 3.public class CaixasDeDialogo { 4.public static void main(String[] args) { 5.JOptionPane.showInputDialog("Qual o seu nome?"); 6.} 7.}

Ser apresentada uma janela a seguir.

Caixas de Dilogo Confirm


Outra caixa de dilogo simples e objetiva do JOptionPane a caixa de dilogo de confirmao ou Confirm Dialog. A Confirm Dialog (caixa de confirmao) consiste de uma caixa contendo uma mensagem, um cone e trs botes: sim, no e cancelar. Apesar deste ser o aspecto padro, esta caixa, como qualquer outra de JOptionPane, pode ser facilmente configurada (assunto que ser tratado com mais detalhes nas prximas pginas). No mtodo padro chamado showConfirmDialog usamos dois argumentos: 1. 2. O primeiro a dependncia ou frame pai, ou seja, de qual janela esta confirmao est sendo gerada. Como nossos exemplos iniciais no possuem nenhuma dependncia, ento, sempre usaremos null neste argumento. O segundo argumento a mensagem que desejamos mostrar ao usurio.

O mtodo showConfirmDialog sempre retorna uma constante que a resposta clicada pelo usurio, que so: Valor Nome da Constante 0 1 2 YES_OPTION NO_OPTION CANCEL_OPTION Equivale ao clicar no boto Yes (sim) ao clicar no boto No (no) ao clicar no boto Cancel (cancelar)

Melhorando o exemplo anterior ficaria assim.

01.import javax.swing.JOptionPane; 02. 03.public class CaixasDeDialogo { 04.public static void main(String[] args) { 05.String nome = null; 06.nome = JOptionPane.showInputDialog("Qual o seu nome?"); 07.JOptionPane.showConfirmDialog(null, "O seu nome " + nome + "?"); 08.} 09.}
A caixa de confirmao pareceria da seguinte forma:

Caixa de Dilogo de Mensagem


A caixa de dilogo de mensagem uma caixa que serve apenas para emitir uma mensagem. Esta caixa tambm muito configurvel e verstil, pois serve para muitas situaes distintas como uma mensagem de erro, um alerta, ou simplesmente uma informao. O mtodo showMessageDialog responsvel em trazer a caixa de mensagem, o qual pode ter muitos argumentos, porm, vamos nos ater ao mais simples.

Assim como o mtodo showConfirmDialog, usaremos null como valor de nosso primeiro argumento, pois, por enquanto, no h dependncia de outras janelas em nosso programa. O segundo argumento a mensagem que desejamos emitir. Para finalizar nosso exemplo, incluiremos as caixas de mensagem de acordo com as respostas.

01.import javax.swing.JOptionPane; 02. 03.public class CaixasDeDialogo { 04.public static void main(String[] args) { 05.String nome = null; 06.int resposta; 07.nome = JOptionPane.showInputDialog("Qual o seu nome?"); 08.resposta = JOptionPane.showConfirmDialog(null, "O seu nome " + nome + "?"); 09.if (resposta == JOptionPane.YES_OPTION) { 10.// verifica se o usurio clicou no boto YES 11.JOptionPane.showMessageDialog(null, "Seu nome " + nome); 12.} else { 13.JOptionPane.showMessageDialog(null, "Seu nome no " + nome); 14.} 15.} 16.}
Abaixo est um exemplo de como ir ficar a caixa de mensagem caso clique no boto YES.

Input Dialogs
Caixas de Entrada de Dados
Como foi introduzido anteriormente, em Java, podemos usufruir de classes e objetos do pacote Swing, o qual facilita a criao de interface grfica sem a necessidade de ficar horas programando. Neste artigo, nos aprofundaremos no uso de JOptionPane, comeando a personalizar algumas caixas de dilogo mais simples. Caixas de dilogo de entrada de dados so importantes para obter informaes ou requisitar algo do usurio. No objeto JOptionPane, h o mtodo showInputDialog() que responsvel em criar uma caixa de dilogo requisitando uma entrada de dado. Este mtodo sobrecarregado de vrias maneiras. A forma mais simples de seus argumentos : 1. A mensagem que deve ser exibida para o usurio.

Com apenas este argumento possvel criar uma caixa de dilogo com o ttulo Input, um cone de interrogao, uma caixa de texto, uma mensagem e dois botes. Igual a figura abaixo:

Porm, h como alterarmos a aparncia dessa caixa, costumizando-a completamente. Outra forma utilizar dois argumentos, sendo: 1. 2. A mensagem que deve ser exibida ao usurio. O valor inicial da caixa de texto.

O valor inicial da caixa de texto a string que deve aparecer dentro do campo onde digitamos nossa entrada. Assim que aparece a caixa, seu campo est preenchido com um valor inicial j selecionado. Ex.: O cdigo JOptionPane.showInputDialog("Qual o seu nome?", "Digite seu nome aqui.") geraria a seguinte caixa:

Uma das formas mais completas desse mtodo inclui alterar, inclusive, o ttulo da caixa. Assim, usa-se 4 argumentos: 1. 2. 3. 4. De qual frame a caixa de dilogo dependente, ou seja, qual a janela principal que chamou a caixa Input Dialog. Caso a caixa de dilogo no dependa de nenhum frame ou janela principal, basta utilizarmos o valor null para este argumento. A mensagem que deve ser exibida ao usurio. O ttulo da caixa de texto. Que tipo de mensagem . O tipo de mensagem define qual o cone ser utilizado, podendo ser utilizados os nmeros inteiros representados pelas constantes: o PLAIN_MESSAGE (valor: -1): Mensagem limpa, sem nenhum cone. o ERROR_MESSAGE (valor: 0): Mensagem de erro. o INFORMATION_MESSAGE (valor: 1): Mensagem informativa. o WARNING_MESSAGE (valor: 2): Mensagem de alerta. o QUESTION_MESSAGE (valor: 3): Mensagem de requisio ou pergunta. Esta a opo padro do mtodo showInputDialog().

Ex.: O cdigo JOptionPane.showInputDialog(null, "Qual o seu Nome?", "Pergunta", JOptionPane.PLAIN_MESSAGE) geraria a seguinte caixa:

Obter valor de showInputDialog O mtodo showInputDialog pode retornar dois valores: ou uma string ou null.
Se o boto OK for clicado a string contida na caixa de texto ser retornada, se o boto Cancel for clicado o valornull ser retornado. Sabendo disso, podemos usar uma varivel string para obter o valor e tratarmos da forma que quisermos. Vejamos o exemplo abaixo:

01.import javax.swing.JOptionPane; 02. 03.public class CaixasDeInput { 04.public static void main(String[] args) { 05.String nome = null; 06.while (nome == null || nome.equals("")) {

07.nome = JOptionPane.showInputDialog("Qual o seu nome?"); 08.if (nome == null || nome.equals("")) { 09.JOptionPane.showMessageDialog(null, 10."Voc no respondeu a pergunta."); 11.} 12.} 13.JOptionPane.showMessageDialog(null, "Seu nome " + nome); 14.} 15.}

Input Dialog com lista de opes


Outra forma de caixa de dilogo de entrada de dados a Input Dialog com lista de opes. o mesmo mtodo showInputDialog, mas com mais argumentos, sendo um deles uma lista de objetos. Esta lista de objetos far com que a caixa de dilogo venha com um combo box ao invs de um campo de texto. Para criar um Input Dialog com um combo box devemos usar os seguintes argumentos na respectiva ordem: 1. 2. 3. 4. 5. 6. 7. De qual frame a caixa de dilogo dependente, ou seja, qual a janela principal que chamou a caixa Input Dialog. Caso a caixa de dilogo no dependa de nenhum frame ou janela principal, basta utilizarmos o valor null para este argumento. A mensagem que deve ser exibida ao usurio. O ttulo da caixa de texto. Que tipo de mensagem . O tipo de mensagem define qual o cone ser utilizado, podendo ser utilizados os nmeros inteiros representados pelas constantes da mesma forma como foi mostrada anteriormente. O quinto argumento representado pelo objeto Icon, que um cone que podemos criar a partir de um jpg, gif, png, etc. O objeto Icon ser comentado com mais detalhes nos prximos artigos. O segredo do combo box est neste argumento. Aqui vir um array (vetor) de objetos que sero nossos valores pr-definidos. O ltimo argumento serve apenas para indicar qual elemento do array (vetor) deve vir selecionado no incio. Caso no desejarmos que um tem seja selecionado no incio basta utilizarmos null.

O array (vetor) de objetos deve ser genrico, portanto, utilizamos a classe Object para criar este array. O mtodo showInputDialog com combo box se diferencia do showInputDialog com caixa de texto pelo seguinte fato: o que retornado dessa vez no ser uma string, mas um objeto. Isso faz sentido se percebermos que agora estamos escolhendo um item dentro de uma lista de objetos. Portanto, o que ser retornado ser um objeto dessa lista, no uma string como acontecia com o Input Dialog com caixa de texto. Ento, se quisermos utilizar o objeto genrico como algum outro tipo de dado, devemos antes fazer uma induo de tipo ou typecasting. Vejamos o exemplo abaixo:

01.import javax.swing.JOptionPane; 02. 03.public class CaixaComComboBox { 04.public static void main(String[] args) { 05.Object[] opcoes = { "sim", "no" }; 06.Object resposta; 07.do { 08.resposta = JOptionPane.showInputDialog(null, 09."Deseja finalizar o programa?", 10."Finalizao", 11.JOptionPane.PLAIN_MESSAGE, 12.null, 13.opcoes, 14."no");

15.} while (resposta == null || resposta.equals("no")); 16.} 17.}


No exemplo acima, criamos uma lista com dois objetos: "sim" e "no". E j definimos "no" como opo pr-selecionada. Removemos qualquer cone com as opes PLAIN_MESSAGE e cone null. Criamos um lao (loop) com while que sempre ir repetir a mesma caixa enquanto o boto Cancel ou a opo "no" forem selecionados. Abaixo est um exemplo mais funcional, divertido e simples de fazer e entender. Trata-se de um jogo de adivinhar onde um nmero escolhido e temos que adivinhar qual nmero foi sorteado. No exemplo, sero usados elementos j estudados no site como a classe Math e Integer.

01.import javax.swing.JOptionPane; 02. 03.public class JogoDeAdivinhar { 04.public static void main(String[] args) { 05.// define um nmero qualquer entre 0 e 10 06.int rndNr = (int) Math.ceil(Math.random() * 10); 07.// lista de opes para o combo box da caixa de dilogo 08.Object[] opcoes = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; 09.// string onde ser retornado o resultado 10.String resposta; 11.while (true) { 12.// loop para evitar que o jogo feche depois da primeira resposta 13.resposta = (String) JOptionPane.showInputDialog(null, 14."Em que nmero estou pensando?", "Jogo de Advinhar", 15.JOptionPane.QUESTION_MESSAGE, null, opcoes, null); 16.if (resposta == null) { 17./* 18.* se clicar no boto Cancel, mostrar uma mensagem de Game Over 19.* e sair do loop para finalizar o programa 20.*/ 21.JOptionPane.showMessageDialog(null, 22."Game Over!\nVoc desistiu do jogo!"); 23.break; 24.} 25.if (Integer.valueOf(resposta) > rndNr) { 26./* 27.* Interpreta string como inteiro e compara com o nmero sorteado 28.* para ver se maior 29.*/ 30.JOptionPane.showMessageDialog(null, 31."Errado!\nO nmero que eu pensei menor."); 32.} else if (Integer.valueOf(resposta) < rndNr) { 33./* 34.* Interpreta string como inteiro e compara com o nmero sorteado 35.* para ver se maior 36.*/ 37.JOptionPane.showMessageDialog(null, 38."Errado!\nO nmero que eu pensei maior."); 39.} else { 40./* 41.* se no for nem maior e nem menor, ento igual. 42.* Finaliza o jogo saindo do loop 43.*/ 44.JOptionPane.showMessageDialog(null, 45."Parabns\nVoc adivinhou!\n" 46.+ "Eu realmente pensei no nmero " + rndNr);

47.break; 48.} 49.} 50.} 51.}