Beruflich Dokumente
Kultur Dokumente
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.
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;
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.
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.
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*/
(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.
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 , ...
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.}
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.
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.}
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)
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 = ?).
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.
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.
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.
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.
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.
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.
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 (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.
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.}
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.
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.
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.
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); }
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.
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
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
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.}
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, ...
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.}
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 "
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.
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 (<>).
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.}
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
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.
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.
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.
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
Long.parseLong(): analisa uma String para tenta atribuir um dado do tipo inteiro
primitivo longo.
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.}
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.}
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;
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.
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.}
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().
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.}
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.}
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.}
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.
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.}
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)
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:
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.}
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");
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);