Escolar Documentos
Profissional Documentos
Cultura Documentos
....3 Porqu programar em Java?.............................................................................................................4 Java no mercado de trabalho atual...................................................................................................4 Como programar em Java................................................................................................................4 Ferramentas Java..............................................................................................................................6 JDK (Java Development Kit).......................................................................................................6 O que contm?.............................................................................................................................6 JRE (Java Runtime Evironment).................................................................................................6 Javac.............................................................................................................................................7 Tecnologias Java..............................................................................................................................7 JSE (Java Standart Edition).........................................................................................................7 JEE (Java Enterprise Edition)......................................................................................................7 JME (Java Mobile Edition)..........................................................................................................7 O que instalar?.................................................................................................................................7 Primeiro contato com o Java..........................................................................................................12 Analise da estrutura bsica de um programa java..........................................................................13 public.........................................................................................................................................13 static...........................................................................................................................................13 void............................................................................................................................................13 (String args[]).............................................................................................................................13 { ... }...........................................................................................................................................13 O que uma varivel?...................................................................................................................14 Como declarar uma varivel?....................................................................................................14 Definio de varivel e constantes.................................................................................................15 Declarao de constantes...............................................................................................................16 Como atribuir um valor?................................................................................................................16 Tipos de Dados..............................................................................................................................17 Os tipos primitivos em Java.......................................................................................................17 Comentrios...................................................................................................................................18 Operadores.....................................................................................................................................19 Operadores Aritmticos ................................................................................................................20 Operadores Relacionais.................................................................................................................22 Operadores Lgicos.......................................................................................................................22 Passagem de parmetro..................................................................................................................23 Converso de tipos.........................................................................................................................25 Excees em Java..........................................................................................................................26 Uso da estrutura try catch..............................................................................................................27 Uso do Bloco finally......................................................................................................................28 Uso da clausula throws..................................................................................................................29 Uso da Instruo throw..................................................................................................................30 Exerccios.......................................................................................................................................39 Comandos Condicionais................................................................................................................40 Uso da estrutura if-else..................................................................................................................40
Curso Tcnico em Informtica
Capo Bonito - SP
Estrutura switch-case ....................................................................................................................41 Uso do getMessage e printStackTrace...........................................................................................42 Laos de Repetio........................................................................................................................43 Uso do Lao for.............................................................................................................................43 Uso do Lao while.........................................................................................................................44 Exerccios.......................................................................................................................................45 Funes Matemticas.....................................................................................................................46 Mtodo Ceil...............................................................................................................................47 Mtodo floor..............................................................................................................................47 Mtodo max...............................................................................................................................48 Mtodo min................................................................................................................................49 Mtodo sqrt................................................................................................................................49 Mtodo pow...............................................................................................................................50 Mtodo random..........................................................................................................................51 Formatao com a Classe DecimalFormat....................................................................................52 Internacionalizao com a Classe Locale......................................................................................54 Funes com Strngs......................................................................................................................56 Mtodo length............................................................................................................................57 Mtodo charAt...........................................................................................................................58 Mtodos toUpperCase e toLowerCase......................................................................................59 Mtodo substring.......................................................................................................................59 Mtodo trim...............................................................................................................................61 Mtodo replace..........................................................................................................................62 Mtodo valueOf.........................................................................................................................63 Mtodo indexOf.........................................................................................................................64 Criao de Banners........................................................................................................................65 Programao orientada por objeto.................................................................................................67 Definio e uso de uma classe.......................................................................................................71 Construtores e Herana..................................................................................................................82 Adio de construtores...............................................................................................................82 Herana de classes.........................................................................................................................86 Sobrescrita e Sobrecarga de Mtodos............................................................................................93 Conceito de polimorfismo.........................................................................................................93 Sobrescrita de mtodos..............................................................................................................94 Sobrecarga de mtodos..............................................................................................................97 Classes e mtodos finais..........................................................................................................103 Classes Abstratas, Interfaces e Pacotes........................................................................................107 Classes abstratas: criao e uso...............................................................................................107 Interfaces..................................................................................................................................111 Organizao em pacotes..........................................................................................................112
Capo Bonito - SP
Introduo
Nesta aula aprenderemos o que Java, quais suas principais caractersticas, como funciona. Discorrerei sobre suas tecnologias atuais, onde se aplica cada uma, quais as diferenas entre elas, e, no final, quais programas instalar para podermos comear programar em Java.
Java
Java foi desenvolvida pela Sun Microsystems em 1995, inicialmente usada para rodar Applets via internet por meio do navegador HotJava (que acompanhava a linguagem), como o passar do tempo a Microsoft e a Netscape tambm incorporaram a nova tecnologia em seus navegadores. O que Java? Java uma linguagem de programao. Por favor no confundam Java com Java Script, enquanto uma uma poderosa linguagem de programao com vastos recursos, a outra uma linguagem de script para internet, com recursos limitados se comparados primeira.
Caractersticas da linguagem
Java uma linguagem orientada objetos, interpretada, multiplataforma, case sensitive, e multithread. Segue um breve resumo de cada uma de suas caractersticas. Java Interpretada e multiplataforma Quando desenvolvemos uma aplicao em Java no ficamos presos uma dada plataforma, sendo assim, ao desenvolvermos no sistema operacional Windows por exemplo, no precisaremos recompilar o cdigo inteiro para rodar a mesma aplicao no Linux. Basta somente instalar o interpretador da Java, que tambm mantido pela Sun Microsystems, para o sistema operacional especfico, logo o pacote compilado no Windows vai rodar no Linux, MacOS, Solaris, ou em qualquer outro sistema operacional que possuir um interpretador Java. Java Case Sensitive Dizer que Java case sensitive significa dizer que a mesma sensvel as variaes de letras em maisculo e minsculo, ou seja, se por exemplo, voc declarar uma varivel A e declarar outra varivel a, Java far distino entre as duas. Java Multithread Em Java podemos executar dois comandos simultaneamente, sem um saber que o outro existe, sendo que cada um possui uma chamada diferente na mesma aplicao, tambm possvel
Capo Bonito - SP
retardar uma tarefa enquanto no executemos outra, como por exemplo, esperar at que todas as vendas abertas no momento sejam fechadas para podermos fechar o caixa dirio.
Capo Bonito - SP
O arquivo .class no contm cdigo que nativo para seu processador; ele em seu lugar contm bytecodes a linguagem de mquina da Java Virtual Machine (Java VM).
Como a Java VM disponvel em diferentes sistemas operacionais, os mesmos arquivo .class so capazes de rodar em Microsoft Windows, Solaris Operating System (Solaris OS), Linux, ou Mac OS.
Capo Bonito - SP
Ferramentas Java
A Java contm vrias ferramentas que podem ser chamadas atravs de um terminal, vou descrever as mais usadas no comeo, pois posteriormente, quando precisar das outras, voc utilizar uma IDE que acionar as mesmas automaticamente. JDK (Java Development Kit) JDK o kit de desenvolvimento da linguagem Java, cada Tecnologia Java contm o seu JDK especfico. O que contm? O JDK contm todas as ferramentas necessrias para se desenvolver aplicaes em dada tecnologia Java, por exemplo o JDK SE vem com todas as ferramentas necessrias para desenvolvermos aplicaes para Core/Desktop. JRE (Java Runtime Evironment) O JRE a mquina virtual Java, ele que interpreta da linguagem Java para a o sistema operacional instalado na mquina, traduzindo as instrues da aplicao para o mesmo.
Capo Bonito - SP
Javac O Javac o compilador Java, ele vem junto com o JDK. Atua transformando o cdigo fonte para o cdigo que vai ser interpretado pela JRE.
Tecnologias Java
Com Java podemos desenvolver sistemas para trs setores: Core/Desktop JSE Web JEE Mobile JME JSE (Java Standart Edition) Quando se fala em fazer um curso de Java esto falando de um curso sobre JSE, aqui onde aprende-se as principais funes, a sintaxe e a pensar em Java. Contm os recursos para desenvolvermos aplicaes locais (Core/Desktop). JEE (Java Enterprise Edition) JEE uma extenso da JSE adicionando a mesma mais recursos, a tecnologia mais avanada da Java, justamente por conter todos os recursos da JSE e mais os recursos da JEE, com ela desenvolvemos no somente as aplicaes para Core/Desktop mas tambm aplicaes Web. JME (Java Mobile Edition) JME a tecnologia responsvel pelo desenvolvimento de aplicaes mobile, com ela podemos programar para celulares e palms.
O que instalar?
Para comear a aprender Java voc precisa simplesmente do JDK JSE e de um editor de texto qualquer, nada mais.Para baixar o JDK, simplesmente entre no site da Sun e escolha o apropriado para o seu sistema operacional. Para editor de texto eu recomendo o Notepad++, alm de ter o text hilight para Java ele tambm contm um plugin que completa automaticamente as funes chamadas em Java, parecido com uma mini IDE em modo texto. O processo de instalao transfere todas as ferramentas e pacotes da linguagem para sua mquina. Ao instalar o JDK, criada uma pasta com todos os arquivos do kit de ferramentas da
Curso Tcnico em Informtica
Capo Bonito - SP
Sun. O caminho default da instalao "C:\Arquivos de programas\Java\jdk..............". Ao instalar o JDK, so criadas diversas pastas. Observe que a pasta jdk............ a principal em que esto todas as outras (a Sun chamada de JAVA HOME). Dependendo da verso do JDK instalada, essa pasta pode ter nomes e contedos diferentes. Voc dever se concentrar no nome da verso que voc baixou. Realize as configuraes das variveis de ambiente. A configurao das variveis depende do Sistema Operacional em que voc est instalando o JDK. Os procedimentos apresentados em seguida se referem configurao para o ambiente Windows. No Windows 2000, XP e Vista, devemos configurar as variveis pelo Painel de Controle. Defina as variveis, seguindo os procedimentos:
Clique sobre o cone Meu computador com boto direito do mouse e selecione a opo Propriedades com boto esquerdo
Capo Bonito - SP
Clique sobre aba Avanado e depois clique sobre o boto Variveis de Ambiente
Capo Bonito - SP
Em "Variveis de usurio", clique no boto "Nova". As variveis de ambiente podem tambm ser definidas em "Variveis do sistema" em vez de "Variveis de usurio", como sugerido.
A diferena que, quando definidas em "Variveis de usurios", elas funcionam somente para o seu usurio, e em "Variveis de sistema" funcionam para todos os usurios.
Capo Bonito - SP
10
No campo "Nome da varivel" coloque o nome da varivel que ser includa, por exemplo, JAVA HOME, e no campo "Valor da varivel" coloque o caminho referente varivel que voc nomeou, C:\Arquivos de programas\Java\jdk1.6.0_10 e Clique no boto"OK".
Faa o mesmo procedimento de incluso com as variveis path e classpath, definindo os seus nomes e incluindo os valores correspondentes: C:\Arquivos de programas\Java\jdk1.6.0_03\bin para a varivel path C:\Arquivos de programas\Java\jdk1.6.0_03\lib;.; para a varivel classpath. Verifique se a instalao foi realizada com sucesso. Entre em um diretrio qualquer no prompt de comando e digite javac seguido da tecla Enter. Se aparecer uma mensagem como "javac no reconhecido como um comando interno", porque o Java no foi instalado corretamente. Se ao digitar javac aparecer uma tela com instrues de Help do Java, significa que a instalao e a configurao foram realizadas com sucesso.
Curso Tcnico em Informtica
Capo Bonito - SP
11
Capo Bonito - SP
12
Capo Bonito - SP
13
Toda varivel armazena um tipo especifico de informao, sendo esse tipo definido na sua declarao. Exemplos de tipo: Numricos: (armazena nmeros) Alfa-numricos (armazena letras e nmeros) Lembrando sempre que toda varivel deve possuir um identificador DICAS: Inicie sempre seu identificador com letras, para no gerar erros de compilao; Nunca utilize caracteres especiais na declarao de variveis Ex: , ~, ^. entre outros; Nunca utilize espaos em brancos Ex: salario inicial;
Capo Bonito - SP
14
class Aula1 { public static void main (String args[]) { String nome; int cdigo; double valor; } }
Capo Bonito - SP
15
Declarao de constantes
Na realidade no existem constantes em Java, o que existe um tipo de varivel com comportamento semelhante a uma constante de outras linguagens. Trata-se de um tipo de varivel que no pode alterar seu contedo depois de ter sido inicializado, ou seja, o contedo permanece o mesmo durante toda a execuo do programa. Em Java, essa varivel chamada de final. Essas constantes so usadas para armazenar valores fixos, geralmente definidos no incio de uma classe. Exemplos: o valor de PI na matemtica (3.14), o valor da acelerao na fsica (9 81 m/s2) a quantidade de milissegundos existentes em um segundo (1.000) etc. Para a declarao de "constantes" em Java utiliza-se a palavra reservada final antes da definio do tipo da varivel, como nos exemplos seguintes: final double pi = 3.14; final int miliSegundosPorSegundo = 1000; Caso um segundo valor seja atribudo a uma varivel final no decorrer da classe, o compilador gera uma mensagem de erro. No obrigatrio inicializar o contedo de uma varivel final no momento de sua declarao. possvel realizar esses dois processos em locais distintos, conforme apresentado em seguida. final int milimetrosPorCentimetro; . // linhas de cdigo milimetrosPorCentimetro = 10;
Capo Bonito - SP
16
Tipos de Dados
Assim como em outras linguagens de programao, antes de utilizar variveis necessrio definir que tipo de dado ela vai armazenar. Caso seja necessrio armazenar a quantidade em estoque de um determinado produto, pode-se declarar uma varivel do tipo inteira, ou para armazenar valores monetrios, possvel declarar uma varivel do tipo double e assim por diante. Os tipos de dados em Java so portveis entre todas as plataformas de computadores que suportam essa linguagem. Na maioria das linguagens, quando um tipo de dado utilizado, por exemplo, um tipo inteiro, pode ser que para uma determinada plataforma esse nmero seja armazenado com 16 bits e em outra com 32 bits. Em Java isso no ocorre, uma vez que um tipo de dado ter sempre a mesma dimenso, independentemente da plataforma utilizada. Este e muitos outros recursos de portabilidade de Java permitem que os programadores escrevam programas sem conhecer a plataforma de computador em que eles sero executados. Os tipos primitivos em Java. Tipo Quantidade de bits Valores char 16 '\u0000' a '\uFFFP' byte 8 -128 a+ 127 int 32 -2.147.483.648 a+2.147.483.647 short 16 -32.768 a + 32.767 long 64 -9.223.372.036.854.775.808 a +9.223.372.036.854.775.807 float 32 -3.40292347E+38 a +3.40292347E+38 double 64 -1.79769313486231570E+308a +1.79769313486231570E+308 boolean 8 true ou false At pouco tempo atrs, quando os recursos de hardware da mquina eram mais limitados, existia a preocupao de reduzir ao mximo a quantidade de memria utilizada por um programa. Analisando a tabela acima, um programador chegaria concluso de que para armazenar a idade de uma pessoa, deveria ser utilizado o tipo byte, pois possui uma faixa de valores suficiente para armazenar a idade que uma pessoa normal pode atingir, dispensando outros tipos numricos que ocupariam mais espao na memria.
Capo Bonito - SP
17
Comentrios
Os comentrios so linhas adicionadas ao programa que servem para facilitar seu entendimento por parte do programador, ou ainda por uma outra pessoa que o consulte. Essas linhas no afetam o programa em si, pois no so consideradas parte do cdigo. O Java aceita trs tipos de comentrio: de uma linha, de mltiplas linhas e de documentao. Para inserir comentrios de linha nica utilizam-se // (duas barras) em qualquer local do programa e tudo o que estiver escrito depois desse sinal e na mesma linha ser considerado um comentrio. Para inserir comentrios que envolvam vrias linhas, utiliza-se /* (barra asterisco) para demarcar o incio e */ (asterisco barra) para o final, ou seja, tudo o que estiver entre esses dois sinais ser considerado comentrio. O terceiro tipo semelhante ao comentrio de mltiplas linhas, entretanto tem o propsito de possibilitar a documentao do programa por meio de um utilitrio (javadoc) fornecido pela Sun junto com o SDK. Esse tipo de comentrio inicia-se com /** e encerrado com */. O exemplo abaixo demonstra a utilizao dos comentrios (colocados em negrito).
Capo Bonito - SP
18
/** Exemplo0202: 2. 3. 4. 5. 7. 8. 9. 10. 11. 12. 13. 14. 14. 16. 17. 18. } } Essa classe demonstra a utilizao de variveis em uma classe em Java. So declaradas variveis do tipo int e double. O exemplo tambm demonstra como imprimir o contedo das variveis na tela */ { public static void main (String args []) { int x = 10, y = 20; // declarao de variveis do tipo inteiro double dolar =2.62; /* As linhas seguintes enviam o contedo das variveis para a tela */ System.out.println(x); System.out.printIn(y); System.out.println(dlar);
Operadores
A linguagem Java oferece um amplo conjunto de operadores destinados realizao de operaes aritmticas, lgicas e relacionais, com a possibilidade de formar expresses de qualquer tipo. Alm dos operadores matemticos (aritmticos), existem tambm operadores lgicos e relacionais, conforme abordado em seguida.
Capo Bonito - SP
19
Operadores Aritmticos
Tabela abaixo apresenta os operadores aritmticos usados em Java Funo Adio Subtrao Multiplicao Diviso Resto da diviso inteira Sinal negativo Sinal positivo Incremento unitrio Decremento unitrio Sinal + * / % + ++ -Exemplo X+Y X-Y X*Y X/Y X%Y -X +X ++X ou X++ --X ou X--
Entre os operadores presentes na tabela acima, talvez os de decremento (--) e incremento (++) causem alguma dvida, principalmente para os programadores iniciantes. Entretanto, sua utilizao extremamente simples: como o prprio nome diz, o operador de incremento incrementa (aumenta) o valor de uma varivel qualquer em um, ou seja, supondo que uma varivel chamada idade possua o contedo 10, ao receber o operador de incremento (idade++), seu contedo passa a ser onze (10+1). O mesmo vale para o operador de decremento, logicamente reduzindo em um o contedo da varivel. O exemplo 2.3 mostra um programa em Java com a utilizao de alguns operadores. Os comentrios aparecem no prprio programa com a utilizao das barras duplas ('//'). Em Java, para imprimir diversas variveis na tela uma ao lado da outra, utilizado o operador de concatenao (+), ao contrrio de outras linguagens que utilizam a vrgula (,) como separador. Na linha 8, por exemplo, a seqncia ("X =" + x) indica que o trecho entre aspas ser enviado para a tela concatenado com (+) o contedo da varivel x. Para enviar uma frase qualquer para a tela, necessrio coloc-la entre aspas; j para enviar o contedo de uma varivel, as aspas no devem ser utilizadas.
Capo Bonito - SP
20
class Exemplo0203 { public static void main (String args[]) { // declarao e inicializao de variveis int x = 10; int y = 3; // vrias operaes com as variveis System.out.println("X = "+ x); System.out.println("Y = "+ y); System.out.printIn("-X = "+(-x)); System.out.println("X/Y = "+(x/y)); System.out.println("Resto de X por Y = "+ (x%y)); System.out.println("Inteiro de X por Y = "+ (int)(x/y)); System.out.printIn("X + 1 = "+ (++x)); } }
Outro ponto a ser observado no exemplo 2.3 se refere utilizao do mtodo println da classe System. Conforme indica a figura 2.2, para cada comando println usado ocorre uma mudana de linha na tela. Essa caracterstica controlada pelas letras In inseridas no final do comando println, isto , o comando imprime o que est entre parnteses e em seguida imprime um final de linha. A prxima informao a ser impressa aparece na outra linha. Caso seja necessrio imprimir diversos valores na mesma linha, alm de utilizar o operador de concatenao, pode-se utilizar o comando println sem o In no final da seguinte forma: System.out.print ("Dados a serem impressos"). Ao compilar e executar corretamente o exemplo 2.3, aparece a tela de execuo mostrada na figura abaixo.
Capo Bonito - SP
21
Operadores Relacionais
Os operadores relacionais possibilitam comparar valores ou expresses, retornando um resultado lgico verdadeiro ou falso. A tabela abaixo demonstra os operadores relacionais usados em Java. Funo Igual Igualdade de String Diferente Maior que Maior ou igual a Menor que Menor ou igual a Dica Cabe observar a utilizao do sinal de igualdade (= =) para a comparao de variveis ou expresses. Pelo fato de o sinal de igual simples (=) ser utilizado na maioria das outras linguagens de programao, boa parte dos iniciantes em Java troca o duplo igual (= =) pelo sinal de atribuio (igual simples). Isso nem sempre acarreta erro de compilao, gerando resultados imprevisveis ao programa. Procure prestar muita ateno na sua utilizao nos programas. Caractere(s) utilizado(s) == var.equals(string) != > >= < <= Exemplo X= = Y X.equals(java) X!=Y X>Y X>=Y X<Y X<=Y
Operadores Lgicos
So operadores que permitem avaliar o resultado lgico de diferentes operaes aritmticas em uma expresso. Os operadores lgicos usados em Java so demonstrados na tabela abaixo Funo E lgico ou AND Ou lgico ou OR Negao ou NOT Caractere(s) utilizado(s) && || ! Exemplo X&&Y X||Y !X
Capo Bonito - SP
22
Passagem de parmetro
Uma aplicao em Java pode receber valores a partir da linha de comando (prompt), isto , no momento em que ele executado. Quando um parmetro recebido por um programa, ele pode ser manipulado internamente e usado em um procedimento qualquer. O exemplo seguinte (2.4) demonstra a utilizao da passagem de parmetros a um programa. Ele apresenta na tela as palavras que o usurio digitar no momento da execuo do programa por meio da linha de comando. class Exemplo0204 { public static void main (String args[]) { System.out.println(args[0]); // imprime o l2 argumento na tela System.out.println(args[1]); // imprime o 2- argumento na tela } } Ao executar o exemplo 2.4, o usurio deve colocar o comando no seguinte formato: C:\>java Exemplo0204 argumentol argumento2 Exemplo: C:\>java Exemplo0204 aprendendo Java Ao digitar esta linha de comando, obviamente depois de o programa ter sido compilado, o programa vai imprimir na tela os dois argumentos inseridos pelo usurio. Essas palavras so passadas ao programa por meio do vetor args existente na linha do mtodo main. A varivel args um vetor de string (na realidade string no uma simples varivel e sim um objeto que ser estudado mais frente) que possui o primeiro elemento do vetor com ndice 0 (zero). Sendo assim, cada palavra digitada na linha de comando, separada por um espao, ser armazenada em um ndice do vetor args (args[0] armazena o primeiro argumento, args[1] o segundo e assim sucessivamente). Para que este exemplo funcione corretamente, o usurio deve digitar pelo menos duas palavras
Curso Tcnico em Informtica
Capo Bonito - SP
23
na linha de comando; caso contrrio, um erro apresentado no momento da execuo, por meio da gerao de uma exceo da linguagem (item tratado mais adiante). Esse fato ocorre porque o programa foi elaborado para imprimir na tela os dois primeiros argumentos passados (args[0] e args[1]). A figura 2.3 demonstra a tela de resultado da execuo do exemplo 2.4. Observe que foram enviados dois nmeros no momento da execuo, os quais foram impressos na tela. Os argumentos passados na linha de comando sempre se referem a "variveis" do tipo string devido sintaxe utilizada no mtodo principal (main), ou seja, args um vetor de tipos string. Por este motivo, mesmo que sejam passados nmeros como parmetros, eles sero considerados caracteres.
Tela de execuo do exemplo 2.4. Para que o leitor v se acostumando linguagem, importante alterar este exemplo, trabalhando com mais de dois parmetros. Apesar de o exemplo tratado ser relativamente simples, ele se refere a uma importante caracterstica da linguagem Java: a passagem de parmetros entre mtodos.
Capo Bonito - SP
24
Converso de tipos
O exemplo anterior demonstrou que todos os dados recebidos como argumentos em uma aplicao referem-se a valores do tipo string. Essa caracterstica gera um inconveniente no caso de ser necessria a utilizao de valores de outro tipo. Em diversos tipos de programa em Java, preciso realizar a converso entre os diversos tipos primitivos existentes. A linguagem Java possui uma srie de classes que realizam essa tarefa. A tabela 2.6 apresenta algumas das principais formas de converso de tipos. As palavras principais usadas na converso aparecem em negrito. No decorrer do livro, diversas vezes sero utilizados esses conversores de tipos. Supondo a varivel X int x = 10 int x = 10 float x = 10.5 String x = "10" String x = "20.54" String x = "20.54" String x = "Java" int x = 10 float x = 10.35 double x = 254.34 byte x[] - (x um vetor de bytes) Converte em Float double Int Int Float double Vetor de bytes String String String String y recebe o valor convertido Float y = (float) x double y = (double) x Int y = (int) x int y = Integer.parseInt(x) Float y = Float.parseFloat(x) double y = Double.parseDouble(x) Byte b[] = x.getBytes() String y = String.valueOf(x) String y = String.valueOf(x) String y = String.valueOf(x) String y = new String (x)
As converses mais usadas em Java. O exemplo 2.5 seguinte demonstra a criao de uma classe que recebe trs valores da linha de comando do DOS (notai, nota2 e trabalho) e calcula a mdia entre as notas, utilizando o conversor de tipo string para double. Para que este exemplo seja executado com sucesso, existe a necessidade de o usurio entrar com trs ciados numricos na linha de comando, conforme apresenta o cdigo abaixo:
Capo Bonito - SP
25
class Exemplo0205 { public static void main (String args[]) { double nota1, nota2, trabalho, media; nota1 = Double.parseDouble(args[0]); nota2 = Double.parseDouble(args[1]); trabalho = Double.parseDouble(args[2]); media = (notal+nota2+trabalho)/3; System.out.println("Media = "+ media); } }
Funcionalidades mais importantes do exemplo 2.5: Linha 5: contm a declarao das variveis usadas na classe. Linhas 6 a 8: os parmetros so transferidos para as variveis, com seus tipos devidamente convertidos por meio de Double.parseDouble(). Linha 9: realizado o clculo da mdia. Linha 10: a mdia impressa na tela.
Excees em Java
As excees em Java referem-se aos erros que podem ser gerados durante a execuo de um programa. Esses erros podem e devem ser controlados (tratados) dentro de um programa, pois muito comum que diversos tipos de exceo ocorram durante o processo de execuo. A linguagem Java possibilita a realizao desse controle de erros por meio da estrutura try-catchfinally e da clusula throws.
Capo Bonito - SP
26
Capo Bonito - SP
27
conjunto de instrues entre as chaves; se houver algum erro, execute seu tratamento no catch. Depois de tratado o erro, a execuo do programa continua a partir do final do ltimo catch. Os erros gerados pelo programa sempre esto relacionados com as classes usadas. Por exemplo, o mtodo parseFloat da classe Float (Float.parseFloat) pode gerar um erro de converso numrica (NumberFormatException), isto , esse tipo de erro pode ser tratado quando essa classe for usada no programa. No faz sentido verificar se ocorrer um erro de entrada e sada de dados (lOException) quando a classe Float for utilizada. Portanto, o tratamento de erros deve ser realizado de forma coerente, de acordo com as classes utilizadas no programa. Dica Um erro muito comum entre os iniciantes na linguagem Java usar a estrutura try sem adicionar nenhum catch. Isso gera erro de compilao, pois ao usar try, obrigatria a presena de pelo menos um catch. Outro erro comum esquecer-se de encerrar a chave do try antes de iniciar um catch. Quando isso ocorre, o compilador apresenta uma mensagem de erro do tipo "try without catch", ou seja, se o catch for inserido no try, o compilador achar que ele nem existe. Observao A linguagem Java possui dezenas de erros que podem ocorrer durante a execuo de uma classe. Sero demonstrados e comentados apenas os que forem utilizados em nossos exemplos
Capo Bonito - SP
28
Durante a execuo de um programa, caso nenhuma exceo ocorra, os blocos catch no so executados e o controle prossegue para o bloco finally, que libera o recurso e passa a executar a primeira instruo aps o bloco finally. Caso ocorra alguma exceo, a execuo do programa ser desviada para o grupo de instrues catch. A seguir, independentemente de ter havido ou no uma exceo, o controle passa para o bloco finally para liberao de recursos. Mesmo que no exista nenhuma instruo catch referente exceo gerada, o controle passa pelo bloco finally. Isso pode ser til ao desenvolvedor caso necessite controlar apenas alguns tipos de erro, pois erros diferentes dos tratados podem ser desviados para o finally. A figura abaixo esboa um fluxograma que representa a seqncia de execuo da estrutura try-catch-finally.
Capo Bonito - SP
29
Esse processo pode ser realizado pela clusula throws. Observe o exemplo 3.4. Ele apresenta uma alternativa para entrada de dados pelo teclado sem a obrigatoriedade do tratamento da exceo IOException. 1. 2. 3. 4 5. 6. 7. 8. 9. 10. } } class Exemplo0304 { public static void main (String args[]) throws IOException { BufferedReader dado; System.out.println("Entre com seu nome"); dado= new BufferedReader(new InputStreamReader(System.in)); System.out.println("Seu nome " + dado.readLine());
Funcionalidades mais importantes do exemplo Linha 3: define que a exceo IOException no ser tratada no mtodo main (throws IOException). Esse fato torna desnecessrio definir a estrutura try catch para tratar esse erro, mesmo sendo uma exceo considerada obrigatria pela linguagem Java. Experimente compilar o exemplo sem a clusula "throws IOException". Aparece a seguinte mensagem de erro: "must be caught or declared to be thrown". O compilador est informando que existem duas possibilidades para corrigir o erro: ou realiza seu tratamento (com try catch, por exemplo), ou o define como descartado, conforme fizemos neste exemplo por meio da clusula throws.
Capo Bonito - SP
30
O programa segue sua execuo normal at encontrar a linha 8 em que a exceo forada, na qual est definida por meio de throw new Exception("nome da exceo"). Na linha 10 a exceo tratada. Evidentemente, este exemplo est simples demais e bem longe de uma aplicao real; serve apenas para demonstrar a gerao de uma exceo. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. } } } } catch (Exception MinhaExcecao) { System.out.print("a linguagem Java?"); class Exemplo0305 { public static void main (String args[]) { try { System.out.print("Como aprender "); throw new Exception("MinhaExcecao");
Capo Bonito - SP
31
Capo Bonito - SP
32
Ao ser executada, a classe do exemplo 2.6 solicita os trs valores ao usurio (nota1, nota2 e trabalho) e no final demonstra a mdia dos valores digitados, conforme a figura abaixo
Figura 2.5 - Tela de execuo do exemplo 2.6 Funcionalidades mais importantes do exemplo 2.6: Linha 1: contm uma diretiva de compilao, isto , um apontamento para uma classe externa que ser usada durante o processo de compilao. A instruo import indica que determinado pacote de classes deve ser carregado no momento da compilao. Isso necessrio quando uma classe precisa utilizar recursos j definidos em outras classes. O exemplo chama o pacote java.io que contm uma srie de classes especializadas em entrada e sada de dados. usada a classe DatalnputStream que pertence ao pacote java.io. Entenda o pacote como um grupo de classes de mesmo tipo armazenadas em uma pasta qualquer. O asterisco presente em import java.io.* indica que devem ser carregadas todas as classes do pacote java.io. Uma alternativa realizar a declarao da seguinte forma: import java.io.DatalnputStream, indicando que ser utilizada apenas a classe DatalnputStream. Observao A linguagem Java possui um pacote de classes padro que carregado toda vez que uma classe compilada. Trata-se do pacote java.lang. Se esse pacote default no fosse carregado automaticamente, mesmo para enviar qualquer informao na tela por meio de System.out.println, seria necessrio declarar explicitamente a diretiva. No caso da classe System, seria necessria a seguinte declarao: import java.lang.System. No programa, * no gera overhead (sobrecarga) normalmente utilizado para reduzir o tamanho do cdigo. A utilizao do * pode gerar certa confuso, uma vez que ele deve ser usado apenas para identificar um grupo de classes e no um grupo de pacotes. Por exemplo,
Curso Tcnico em Informtica
Capo Bonito - SP
33
suponha que um programa utiliza os pacotes java.util.* (o asterisco indica todas as classes do pacote til) e java.net.* (o asterisco indica todas as classes do pacote net). No possvel utilizar java.* achando que os dois pacotes (til e net) sero incorporados ao programa. O captulo 7 aborda a manipulao de pacotes com mais detalhes. Linha 8: declara um objeto chamado dado a partir da classe DatalnputStream. No se preocupe com isso ainda. Em outro captulo sero detalhados a criao e o funcionamento de classes e objetos. No momento, entenda DatalnputStream como uma classe que possibilita a entrada de dados via teclado. Linha 9: contm o bloco try (tente). Bloco um trecho de cdigo delimitado por abre e fechachaves. O bloco try sempre atua em conjunto com um ou vrios blocos catch. No exemplo o bloco try formado pelo conjunto de todas as instrues localizadas entre as linhas 10 e 28. Linha 12: o objeto dado recebe o que foi digitado pelo usurio por meio de new DatalnputSream(System.in). Essa linha pode gerar algum tipo de erro, uma vez que manipula troca de dados entre um perifrico (teclado) e a memria. Caso ocorra algum erro, a execuo do programa ser desviada para a linha 25 que trata de erros de entrada e sada de dados. Linha 13: a varivel s recebe o contedo texto do objeto dado. Essa linha contm o mtodo readLine() da classe DatalnputStream responsvel por ler uma linha de texto que foi digitada pelo usurio e atribu-la varivel s. Observa-se que esse mtodo foi descontinuado pela Sun. Por este motivo, ao compilar a classe, aparece uma observao (Note) alertando que o mtodo deprecated, isto , trata-se de um mtodo obsoleto. No entanto, mesmo com essa observao gerada pelo compilador, a classe pode ser executada normalmente. Utilizamos o mtodo readLine() da classe DatalnputStream para poder observar o funcionamento do deprecated. A prpria Sun recomenda que seja utilizado o mtodo readLine, porm da classe BufferedReader, conforme veremos a diante Linha 14: o contedo da varivel s convertido em uma varivel numrica do tipo float por meio de FloatparseFloat. Nesse momento pode ocorrer um erro de converso, caso o usurio tenha digitado um contedo diferente de nmero. Caso ocorra algum erro, a execuo do programa desviada para a linha 33 que trata de erros de converso de tipos.
Curso Tcnico em Informtica
Capo Bonito - SP
34
Linhas 16 a 19 e 21 a 23: so praticamente idnticas s linhas 11 a 14. A diferena se refere utilizao de outras variveis. A seguir apresentado o exemplo 2.7, similar a 2.6, porm utilizando o mtodo readLine da classe BufferedReader. Observe as linhas em negrito. O resultado da execuo idntico ao exemplo 2.6. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 media = (notal+nota2+trabalho)/3;
Curso Tcnico em Informtica
import java.io.*; class Exemplo0207 { public static void main (String args [ ] ) { String s = ""; float notai = 0, nota2 = 0, trabalho = 0, media = 0; BufferedReader dado; try { System.out.println("Entre com a nota 1"); dado = new BufferedReader(new InputStreamReader(System.in)); s = dado.readLine() ; notai = Float.parseFloat(s); System.out.println("Entre com a nota 2"); dado = new BufferedReader(new InputStreamReader(System.in)); s = dado.readLine() ; nota2 = Float.parseFloat(s); System.out.println("Entre com a nota do Trabalho"); dado = new BufferedReader(new InputStreamReader(System.in)); s = dado.readLine(); trabalho = Float.parseFloat(s);
Capo Bonito - SP
35
27 28 29 30 31 32 33 34 35 36 37 38 } Exemplo 2.7 } } } }
System.out.println("Media : "+ media); catch (IOException e) { System.out.println("Houve erro na entrada de dados"); catch (NumberFormatException e) { System.out.println("Houve erro na converso, digite apenas caracteres numricos");
Apesar de os exemplos 2.6 e 2.7 funcionarem perfeitamente, eles no so adequados para o atual padro de ambiente grfico, sobretudo para o ambiente de microcomputadores. A seo seguinte apresenta uma forma mais agradvel de entrada de dados durante a execuo de uma aplicao em Java por meio da classe JOptionPane. Caixa de Dilogo para Entrada de Dados A linguagem Java dispe de uma forma grfica para receber dados do usurio. Trata-se da utilizao de caixas de dilogo, no caso a caixa gerada a partir da classe JOptionPane que ser vista em detalhes no captulo 9, seo 9.11. 0 fato de receber dados de forma grfica parece dar mais motivao aos iniciantes em Java, j que permite descartar a tela preta do prompt. Por este motivo, os exemplos seguintes utilizam essa forma para entrada de dados do usurio. O exemplo 2.8 refaz o exemplo 2.7, utilizando a classe JOptionPane para entrada de dados.
Capo Bonito - SP
36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20J 21 22 23 24J 25 26 27
import javax.swing.JOptionPane; class Exemplo0208 { public static void main (String args[]) { String aux = ""; float nota1 = 0, nota2 = 0, trabalho = 0, media = 0; try { aux = JOptionPane.showInputDialog(null, "Entre com a nota 1"); nota1 = Float.parseFloat(aux); aux = JOptionPane.showInputDialog(null, "Entre com a nota 2"); nota2 = Float.parseFloat(aux); aux = JOptionPane.showInputDialog(null, "Entre com a nota do trabalho"); trabalho = Float.parseFloat(aux); media = (nota1 + nota2 + trabalho) / 3; OptionPane.showMessageDialog(null, "Mdia : "+ media); } catch (NumberFormatException e) { OptionPane.showMessageDialog(null,"Houve erro na converso, digite apenas caracteres numricos"); } System.exit(0); }
28 } Exemplo 2.8
Capo Bonito - SP
37
Ao ser executada, a classe do exemplo 2.8 solicita os trs valores ao usurio (nota1, nota2 e trabalho) e apresenta a mdia dos valores digitados em janelas grficas similares da figura abaixo
Telas de execuo do exemplo 2.8. Funcionalidades diferentes do exemplo 2.8 em relao ao exemplo 2.7: Linha 1: contm a diretiva de compilao referente importao da classe JOptionPane. Diferentemente do exemplo 2.7, em que foi definida a importao de todas as classes do pacote (uso do *), neste exemplo optou-se pela importao de uma nica classe, no caso a JOptionPane. Linhas 10, 13 e 16: utiliza o mtodo showInputDialog da classe JOptionPane, responsvel por abrir a caixa de dilogo e permitir a digitao do valor da nota. O valor digitado armazenado em uma varivel do tipo String chamada aux. Como JOptionPane retorna um valor do tipo String (mesmo que seja digitado um valor numrico), ele precisa ser convertido em nmero por meio de Float.parseFloat. Linha 20: contm a utilizao do mtodo showMessageDialog da classe JOptionPane responsvel por abrir a caixa de dilogo e apresentar o valor da mdia. Observe a diferena entre os mtodos showInputDialog e showMessageDialog. Enquanto o primeiro permite a digitao de um valor, o outro apenas apresenta um valor na caixa. Linha 26: utiliza System.exit(0), responsvel por encerrar a aplicao.
Capo Bonito - SP
38
Exerccios
1. Crie uma classe que receba trs nomes quaisquer por meio da linha de execuo do progra ma (prompt) e os imprima na tela da seguinte maneira: o primeiro e o ltimo nomes sero im pressos na primeira linha um aps o outro e o outro nome (o segundo) ser impresso na segunda linha. 2. Faa uma classe que receba a quantidade e o valor de trs produtos no seguinte formato: Quantidadel Valorl Quantidade2 Valor2 Quantidade3 Valor3. O programa deve calcular esses valores seguindo a frmula total = Quantidadel x Valorl + Quantidaote2 x VaIor2 + QuaoidadeS x ValorS. O valor total deve ser apresentado no final da execuo do programa. 3. Crie uma classe que receba a largura e o comprimento de um lote de terra e mostre rea total existente, conforme a figura 2.9. Utilize a caixa de dilogo com a classe JOptionPane para a entrada de dados. 4. Crie uma classe que receba quatro valores quaisquer e mostre a mdia e o somatrio entre eles e o resto da diviso do somatrio por cada um dos valores, conforme a figura 2.10. Utilize a caixa de dilogo com a classe JOptionPane para a entrada de dados. Para quebrar uma linha dentro da caixa de dilogo, utilize "\n".
5. Uma determinada pessoa que trabalha com piscinas precisa de um programa que calcule o valor das construes solicitadas pelos clientes, sabendo que eles sempre fornecem o comprimento, a largura e a profundidade da piscina a ser construda. Leve em considerao que o valor cobrado por m3 de gua que o preo de R$ 45.00 por m3.
Capo Bonito - SP
39
Comandos Condicionais
Eles so usados em todas as linguagens de programao e possibilitam que a execuo de um programa seja desviada de acordo com certas condies. Os comandos condicionais usados em Java so if-else e switch-case. Essas duas estruturas de desvio existentes na linguagem Java possibilitam executar diferentes trechos de um programa com base em certas condies.
Capo Bonito - SP
40
Estrutura switch-case
A estrutura switch-case se refere a uma outra modalidade de desvio da execuo do programa de acordo com certas condies, semelhante ao uso da instruo if. Ao trabalhar com uma grande quantidade de desvios condicionais contendo instrues if, pode-se comprometer a inteligibilidade do programa, deixando-o difcil de ser interpretado. A estrutura switch-case possibilita uma forma mais adequada e eficiente de atender a esse tipo de situao, constituindose uma estrutura de controle com mltipla escolha. A estrutura switch-case equivale a um conjunto de instrues if encadeadas, fornecendo maior inteligibilidade e eficincia durante a execuo. Sua sintaxe a seguinte: switch (<expresso>) { case 1: instrues; break; case 2: instrues; break; case 3: instrues; break; default:instrues; } Na primeira linha do switch avaliado o resultado da expresso, que normalmente se refere a uma varivel simples. O resultado dessa expresso comparado nas diretivas case, executando o bloco de instrues quando a expresso coincidir com o valor colocado na frente do case. Em outras palavras, supondo que o valor da expresso seja igual a 2, sero executadas as instrues localizadas entre case 2: e break. A cada case o programa compara o valor da expresso com o valor colocado na frente do case. Caso os valores sejam iguais, todas as instrues so executadas at que se encontre uma instruo break, que encerra o switch e faz a execuo do programa desviar para o ponto aps a chave de encerramento do switch. O programa percorre todas as diretivas case at que uma delas seja igual expresso inserida no switch. Caso nenhuma diretiva case possua o valor correspondente da expresso, sero executadas as instrues localizadas na diretiva default que opcional.
Capo Bonito - SP
41
public static void main (String args[]) { int x=10, y=0, z=0; try { z = x / y; // gera uma exceo aritmtica de diviso por zero } catch (Exception erro) { System.out.println(erro.getMessage()); // mostra a mensagem do erro erro.printStackTrace(); } } // mostra a exceo e a linha onde ocorreu o erro
Capo Bonito - SP
42
Linha 12: o mtodo getMessage se encarrega de retornar o erro ocorrido (no caso: / by zero diviso por zero). Linha 13: o mtodo printStackTrace retorna diversas informaes: o tipo de exceo, a mensagem de erro, o nome da classe que gerou o erro, o nome do mtodo em que o erro ocorreu e o nmero da linha do programa. No exemplo so retornadas as seguintes informaes: java.lang.ArithmeticException (tipo da exceo), / by zero (mensagem de erro), Exemplo0306 (nome da classe), main (nome do mtodo) e 8 (linha em que ocorreu o erro).
Laos de Repetio
Os laos de repetio {looping) formam uma importante estrutura nas linguagens de programao por possibilitarem a repetio da execuo de um bloco de instrues em um programa. Eles determinam que um certo bloco seja executado repetidamente at que uma condio especfica ocorra. O mtodo da repetio uma das prticas mais usadas em programao, possibilitando a criao de contadores, temporizadores, rotinas para classificao, obteno e recuperao de dados. Em uma aplicao, provavelmente sempre existir pelo menos um lao de repetio. As principais formas de criao de laos de repetio em Java so construdas a partir das estruturas for e while.
Capo Bonito - SP
43
Incremento ou decremento: o passo com que a varivel de controle ser acrescida ou decrescida. Esse incremento pode ser realizado por meio de uma varivel inteira ou com ponto flutuante, permitindo pequenos incrementos decimais, caso seja necessrio. Exemplo: for (int x=0; x<10; x++) { <conjunto de instrues> } Esta sintaxe pode ser interpretada como: inicialize x com zero e repita o conjunto de instrues enquanto o valor de x for menor que 10. Cada vez que o conjunto de instrues executado, o valor do x incrementado (x++). Observe que a varivel x pode ser declarada e inicializada na prpria estrutura do for. Quando isso ocorre, a varivel passa a ter escopo local ao for, isto , seu valor reconhecido apenas dentro da estrutura em que foi declarada (entre as chaves de abertura e encerramento). Aps o encerramento do lao, a varivel perde sua referncia e no pode mais ser usada, salvo se declarada novamente. Se voc desejar usar o valor de uma varivel aps o encerramento do lao, basta declar-la antes de iniciar o lao, isto , antes da linha que define o for. Outros exemplos: for (double x=5; x<=10; x=x+0.5) Conta de 5 at 10 com passo de 0.5, ou seja: 5.0 -5.5-6.0-6.5-.................9.5-10.0. for (nt x=10; x>=0; x=x-2) Conta de 10 at 0 com passo de -2, ou seja: 10-8-6-4 2-0. for (int x=a;x<=b;x++) Conta de a at b com passo de 1.
Capo Bonito - SP
44
while (<condio>) { <conjunto de instrues> } O comando while avalia o resultado da expresso (condio) antes de executar as instrues do bloco {}, assim possvel que as instrues nunca sejam executadas, caso a condio seja inicialmente falsa. Um problema tpico, relacionado avaliao da condio while. o lao infinito. Caso a condio nunca se torne falsa, o lao ser repetido infinitamente. H outro tipo de lao condicional, o chamado do-while, que bem parecido com o while, porm o conjunto de instrues executado antes da avaliao da expresso lgica. Isso faz com que essas instrues sejam executadas pelo menos uma vez. Veja como a sintaxe do do-while bem parecida com a do while: do { <conjunto de instrues> } while (<condio>); A utilizao da estrutura while ou do-while fica a critrio do desenvolvedor, pois com as duas formas possvel chegar a resultados semelhantes.
Exerccios
1. Crie uma classe que receba dois valores pelo teclado (use JOptionPane): o valor de um produto e um cdigo de aumento, segundo a tabela abaixo: Cdigo 1 3 4 8 % aumento 15 20 35 40
Utilizando a estrutura switch-case, mostre na tela o novo valor do produto depois de acrescida a porcentagem correspondente. Realize tambm o controle dos possveis erros que podem ocorrer durante a execuo do programa.
Capo Bonito - SP
45
2. Faa uma classe que receba trs nmeros inteiros e mostre o maior dentre eles. Observao: para quebrar uma linha dentro da caixa de dilogo, utilize "\n". 3. Apresente uma classe que mostre a soma dos cem primeiros nmeros inteiros (1+2 + 3 + 4 5 + 6 + 7 + ........ + 97 + 98 + 99 + 100) 4. Construa uma classe que calcule o produto dos inteiros mpares de 1 a 15 e exiba o resultado 5. Crie uma classe que receba dois nmeros inteiros e realize a contagem pausadamente (na tela de prompt) do primeiro at o segundo nmero, com passo um. 6. Elabore uma classe para clculo do salrio lquido em que trs valores devem ser informados pelo usurio na linha de comando: a quantidade de horas trabalhadas, o salrio-hora e o nmero de dependentes. O programa deve mostrar na tela as informaes que esto no lado esquerdo da tabela seguinte. Os clculos correspondentes aparecem no lado direito. Informao Salrio Bruto Desconto INSS Desconto IR Salrio Lquido Calculo Horas trabalhadas * Salrio Hora + (50 * N- Dependentes) Se Salrio Bruto <= 1000 INSS= Salrio Bruto * 8.5/100 Se Salrio Bruto > 1000 INSS= Salrio Bruto * 9/100 Se Salrio Bruto <= 500 IR=0 Se Salrio Bruto > 500 e <= 1000 IR= Salrio Bruto * 5/100 Se Salrio Bruto > 1000 IR= Salrio Bruto * 7/100 Salrio Bruto-INSS-IR
Funes Matemticas
A linguagem Java possui uma classe com diversos mtodos especializados em realizar clculos matemticos. Para realizar esses clculos, so utilizados os mtodos da classe Math que devem apresentar a seguinte sintaxe: Math.<nome do mtodo> (<argumentos ou lista de argumentos>) No necessrio importar a classe Math em um programa para poder utilizar seus recursos, pois ela j faz parte do pacote java.lang, importado automaticamente pelo compilador do Java.
Capo Bonito - SP
46
A classe Math define duas constantes matemticas, sendo Math.PI - o valor de pi (71 = 3.14159265358979323846) e Math.E que se refere ao valor da base para logaritmos naturais (2.7182818284590452354). A seguir, so apresentados os mtodos mais comuns da classe Math. Mtodo Ceil Este mtodo tem como funo realizar o arredondamento de um nmero do tipo double para o seu prximo inteiro. Sua sintaxe a seguinte: Math.ceil(<valor do tipo double>) O exemplo 4.1 demonstra a utilizao do mtodo ceil. 1. class Exemplo0401 2. { 3. 4. 5. 6. 7. 8. 9. 10. } No exemplo 4.1 o mtodo ceil da classe Math chamado para realizar o arredondamento do nmero tipo double entre parnteses, representado neste caso por uma varivel (linhas 6 a 8). As variveis entre parnteses compem o argumento (do tipo double) do mtodo ceil. Math.ceil que retorna um resultado arredondado, mantendo o tipo do dado, isto , a varivel retornada tambm ser do tipo double, porm mostrando apenas a parte inteira do nmero verificado. O tipo double o nico que pode ser utilizado, uma vez que o mtodo ceil no aceita o tipo float. Mtodo floor Assim como ceil, o mtodo floor tambm utilizado para arredondar um determinado nmero, mas para o seu inteiro anterior. Sua sintaxe idntica do mtodo ceil: Math.floor(<valor do tipo double>) } public static void main (String args[]) { double a = 5.2, b = 5.6, c = -5.8; System.out.println("Arredondando 5.2 = " + Math.ceil(a)); System.out.printlri("Arredondando 5.6 = " + Math.ceil(b)); System.out.println("Arredondando -5.8 = " + Math.ceil(c));
Capo Bonito - SP
47
O exemplo 4.2 mostra o uso do mtodo floor: 1. class Exemplo0402 2. { 3. 4. 5. 6. 7. 8. 9. 10. } } public static void main (String args[]) { double a = 5.2, b = 5.6, c = -5.8; System.out.println("Arredondando 5.2 = " + Math.floor(a)) System.out.println("Arredondando S.6 = " + Math.floor(b)) System.out.println("Arredondando -5.8 = " + Math.floor(c))
Mtodo max Utilizado para verificar o maior valor entre dois nmeros, que podem ser do tipo double, float, int ou long. A sua sintaxe a seguinte: Math.max(<valorl>,<valor2>) O exemplo 4.3 mostra a utilizao do mtodo max: 1. class Exemplo0403 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. } Observe que o clculo do maior nmero pode ocorrer entre dois nmeros do mesmo tipo de dados ou no, ou seja, pode-se obter o maior entre dois nmeros do tipo double, entre dois nmeros do tipo int ou entre um do tipo double e outro do tipo int.
Curso Tcnico em Informtica
public static void main (String args[]) { int a = 10, b = 15; double c = -5.9, d = -4.5; System.out.println("O maior entre 10 e 15 : " + Math.max(a,b)); System.out.println("O maior entre -5.9 e -4.5 : " + Math.max(c,d)); System.out.println("O maior entre 10 e -5.9 : " + Math.max(a,c)); }
Capo Bonito - SP
48
Mtodo min 0 mtodo min fornece o resultado contrrio do mtodo max, sendo ento utilizado para obter o valor mnimo entre dois nmeros. Do mesmo modo que o mtodo max, esses nmeros tambm podem ser do tipo double, float, int ou long. A sua sintaxe a mesma do mtodo max, mudando apenas para Math.min: Math.min(<valorl>,<valor2>) O exemplo 4.4 utiliza-se dos mesmos valores do exemplo anterior (exemplo 4.3), porm troca o mtodo max() pelo mtodo min(). 1. class Exemplo0404 2. { 3. 4. 5. 6. 7. 8. 9. 11. } public static void main (String args[]) { int a = 10, b = 15; double c = -5.9, d = -4.5; System.out.println("O menor entre 10 e 15 : " + Math.itiin(a,b) ) ; System.out.println("O menor entre -5.9 e -4.5 : " + Math.min(c,d)); System.out.println("O menor entre 10 e -5.9 : " + Math.min(a,c)); ,10. }
Mtodo sqrt Quando h necessidade de calcular a raiz quadrada de um determinado nmero, utiliza-se o mtodo sqrt, porm o nmero do qual se deseja extrair a raiz quadrada deve ser do tipo double e o resultado obtido tambm ser um nmero do tipo double. Veja sua sintaxe: Math.sqrt(<valor do tipo double>)
Capo Bonito - SP
49
O exemplo 4.5 mostra a utilizao do mtodo sqrt. 1. class Exemplo0405 2. { 3. 4. 5. 6. 7. 8. 9. } Assim como na matemtica, no possvel realizar o clculo da raiz quadrada com nmeros negativos. Caso isso seja realizado, retornado um valor NaN (valor inexistente). ' Mtodo pow Assim como possvel extrair a raiz quadrada de um nmero, tambm possvel fazer a operao inversa, ou seja, elevar um determinado nmero ao quadrado ou a qualquer outro valor de potncia. A potenciao de um nmero pode ser calculada pelo mtodo pow. Os nmeros a serem usados no clculo, isto , o valor da base e da potncia, devem ser do tipo double. Sua sintaxe a seguinte: Math.pow(<valor da base>,<valor da potncia>) O exemplo 4.6 demonstra o uso do mtodo pow. 1. class Exemplo0406 2. { 3. public static void main (String args[]) 4. { 5. double base = 5.5, potncia = 2; 6. System.out.println("5.5 elevado a 2 7. System.out.println("25 elevado a 0.5 8. System.out.println("5678 elevado a 0 9. } 10. }
Curso Tcnico em Informtica
public static void main (String argst]) { double a = 900, b = 30.25; System.out.println("A raiz quadrada de 900 : " + Math.sqrt(a)); System.out.println("A raiz quadrada de 30.25 : " + Math.sqrt(b)); }
Capo Bonito - SP
50
Mtodo random utilizado para gerar valores de forma aleatria. Toda vez que o mtodo random chamado, ser sorteado um valor do tipo double entre 0.0 e 1.0 (o valor 1 nunca sorteado). Nem sempre essa faixa de valores suficiente numa aplicao real. Por exemplo, para simular o sorteio de nmeros entre 0 e 99 para um jogo de loteria qualquer, torna-se necessrio o sorteio de nmeros inteiros aleatrios no intervalo de 0 a 99. Para que esses nmeros possam ser sorteados, preciso utilizar o operador de multiplicao (*) em conjunto com o mtodo random. Com isso torna-se possvel definir o intervalo em que o nmero ser sorteado. O conversor (int) tambm pode ser usado para truncar a parte do ponto flutuante (a parte depois do ponto decimal) para que um nmero inteiro seja gerado, da seguinte forma: (int) (Math.random() * 100) Com isso seriam gerados nmeros inteiros entre 0 e 99, atendendo plenamente necessidade exposta. O exemplo 4.7 demonstra o uso do mtodo random para simular a gerao de cinco cartes de loteria com seis nmeros cada. 1. class Exemplo0407 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. } } } System.out.println(); } { int num = (int) (Math.random() * 100); System.out.print(num+" "); public static void main (String args[]) { for(int qtd=l;qtd<=5;qtd++) { for(int x=l;x<=6;x++)
Capo Bonito - SP
51
Capo Bonito - SP
52
Para realizar a formatao de nmeros, vamos usar a classe DecimalFormat. 1. import java.text.DecimalFormat; 2. class Exemplo0408 3. { 4. 5. 6. 7. 8. 9. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. } 31. } String valorEmReais = "2583.75"; df.appIyPattern("R$ #,##0.00"); System.out.println("Valor em Reais: " + df.format(Double.parseDouble (valorEmReais))); double peso = 7 0.25; df.applyPattern("#0.00"); System.out.println("Peso : " + df.format(peso)); float altura = 1.74f; df.appIyPattern("#0.00"); System.out.println("altura : " + df.format(altura)); long estoque = 198564; df.appIyPattern("#,##0,000"); System.out.println("Estoque : " + df.format(estoque)); public static void main(String args[]) { DecimalFormat df = new DecimalFormat(); short idade = 38; df.appIyPattern("000"); System.out.println("Idade : " + df.format(idade)); 10. int quantidade = 9750; df.appIyPattern("#0,000"); System.out.println("Quantidade : " + df.format(quantidade));
Capo Bonito - SP
53
Funcionalidades mais importantes do exemplo 4.8: Linha 1: importa a classe DecimalFormat do pacote java.text, uma vez que ela no pertence ao conjunto de classes defaulto pacote java.lang. Linha 6: declara um objeto (df) da classe DecimalFormat que ser usado para realizar a formatao dos nmeros pelo mtodo format (df.format). Essa linha poderia conter a definio do pattern no momento da inicializao do objeto df. Uma definio vlida pode ser: DecimalFormat df = new DecimalFormat ("000"). possvel observar que a definio do pattern pode ser realizada dentro dos parnteses. Linha 8: contm a definio do pattern pelo mtodo appIyPattern (df.applyPattem("000")). Essa instruo define que todos os nmeros impressos a partir do objeto df sero formatados com trs dgitos, mesmo que eles possuam menos que isso, conforme exemplificado na tabela anterior. As linhas 12,16,20,24 e 28 redefinem o pattern, aplicando novas formataes ao objeto df, isto , aos nmeros que sero impressos pelo mtodo format. Linha 29: apresenta uma maneira de formatar um nmero a partir de um formato string. Observe que a varivel valorEmReais armazena um contedo do tipo string, que no pode ser manipulado diretamente pela classe DecimalFormat. Para que isso seja possvel, o valor string convertido no tipo double pelo mtodo parseDouble da classe Double (Double.parseDouble(valorEmReais)).
Capo Bonito - SP
54
Observe o exemplo 4.9 seguinte. 1. import java.text.DecimalFormat; 2. import java.til.Locale; 3. 4. class Exemplo0409 5. { 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. } Funcionalidades mais importantes do exemplo 4.9: Linhas 1 e 2: importam as classes DecimalFormat do pacote java.text e Locale do pacote java.til, ambas essenciais ao funcionamento do exemplo. Linha 8: declara um objeto (df) da classe DecimalFormat que ser usado para realizar a formatao do valor monetrio, dependendo da regio em que a classe executada. } } System.out.println("valor: " + df.format(valor)); public static void main(String args[]) { DecimalFormat df = new DecimalFormat(); Locale local = Locale.getDefault(); System.out.println("Configuraes do Sistema Operacional:"); System.out.println("Sigla: " + local.getCountry()); System.out.println{"Pais: " + local.getDisplayCountry{)); System.out.println("Lingua: " + local.getDisplayLanguage()); System.out.println("Teclado: " + local.getDisplayName()); System.out.printIn(""); double valor = 1370.25; if (local.getCountry ().equals("BR")) { d.applyPattern("R$ #,##0.00");
Capo Bonito - SP
55
Linha 9: declara um objeto (local) da classe Locale que ser usado para identificar as configuraes definidas no sistema operacional da mquina do usurio. Nessa linha o objeto local passa a armazenar todas as configuraes default do sistema operacional. Linha 11: possui o mtodo getCountry que retorna a sigla do pas configurado no sistema operacional. No caso de a localidade estar configurada como Brasil, aparece a sigla BR na tela. Linha 12: contm o mtodo getDisplayCountry que retorna o nome do pas configurado no sistema operacional. No caso aparece o nome Brasil. Linhas 13 e 14: contm os mtodos getDisplayLanguage e getDisplayName que retornam, respectivamente, o idioma usado no pas e a linguagem configurada no teclado. Linha 17: contm uma comparao que verifica se o local configurado na mquina se refere ao Brasil (sigla BR). Em caso positivo, aplica um pattern (linha 19) para formatar um valor monetrio em reais, de acordo com o padro brasileiro. Outras comparaes semelhantes, de outros pases, podem existir para adequar o formato monetrio regio. Linha 21: imprime na tela o valor de acordo com o formato estabelecido (se existissem diversas comparaes para pases diferentes).
Capo Bonito - SP
56
A seguir, so apresentados os mtodos mais comuns (e mais usados) da classe String. Mtodo length O mtodo length utilizado para retornar o tamanho de uma determinada string, incluindo tambm os espaos em branco presentes nela. Esse mtodo retorna sempre um valor do tipo int. Veja sua sintaxe: <string>.length() Na prtica, o mtodo length muito utilizado quando necessrio ler uma varivel String do comeo at o final, tanto para a busca de caracteres ou palavras quanto para a criao de banners, algo extremamente usado na Internet. O exemplo 4.10 mostra o uso do mtodo length. 1. class Exemplo0410 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. } No exemplo 4.10, a linha 5 contm a declarao da string frase. Cabe uma observao: conforme citado anteriormente, na realidade frase no uma varivel e sim um objeto, pois uma varivel no pode conter mtodos atrelados a ela; somente os objetos que possuem mtodos para manipulao de suas informaes. A linha 7 contm a utilizao de length por meio de frase.length(), isto , retorna o nmero de caracteres armazenado em frase (no caso 15). Em vez de usar frase.length() poderia ser utilizada a forma literal do seguinte modo: tamanho="Aprendendo Java".length(). O resultado seria o mesmo. Da mesma forma que as funes matemticas, existem diversos mtodos para manipulao de strings, os quais acompanham a seguinte sintaxe: <Nome da string>.<nome-do-metodo>(<argumentos>)
Curso Tcnico em Informtica
public static void main (String args[]) { String frase = "Aprendendo Java"; int tamanho; tamanho = frase.length(); System.out.println("String: " + frase); System.out.println("O tamanho da string : " + tamanho); }
Capo Bonito - SP
57
Mtodo charAt Usando para retornar um caractere de determinada string de acordo com um ndice especificado entre parnteses. Esse ndice refere-se posio do caractere na string, sendo 0 (zero) o ndice do primeiro caractere, 1 (um) o do segundo e assim por diante. O mtodo charAt til quando for necessrio verificar a existncia de um caractere na string. Por exemplo: suponha que uma determinada string s possa conter nmeros - a funo charAt pode ser usada para verificar a existncia de dgitos numricos nessa string. A sintaxe do mtodo charAt a seguinte: <string>.charAt(<ndice>) O exemplo 4.11 mostra o uso do mtodo charAt. 1. class Exemplo0411 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. } } } System.out.println(); public static void main (String args[]) { String frase="Aprendendo Java"; System.out.println("String = " + frase); System.out.println{"Caracter = " + frase.charAt(5)); System.out.print("Trecho = "); for (int i=ll;i<=14;i++) { System.out .print (frase.charAt (i)) ;
Capo Bonito - SP
58
Mtodos toUpperCase e toLowerCase Os mtodos toUpperCase e toLowerCase so utilizados para transformar todas as letras de uma determinada string em maisculas ou minsculas. O mtodo toUpperCase transforma todos os caracteres de uma string em maisculos. O mtodo toLowerCase transforma todos os caracteres de uma string em minsculos. Sua sintaxe a seguinte: <string>.toUpperCase() ou <string>.toLowerCase() O exemplo 4.12 demonstra o uso dos mtodos toUpperCase e toLowerCase e dispensa maiores detalhes, dada a simplicidade dessas duas funes. A nica observao se refere ao fato de que esses mtodos no alteram o valor original da string. Mesmo aplicando os mtodos das linhas 6 e 7, o contedo das variveis palavral e palavra2 permanece o mesmo, isto , a transformao ocorre apenas com fins de impresso em tela. Se for necessrio alterar o contedo de uma varivel string, substituindo seu valor original pelo transformado, a prpria varivel deve receber o valor de sua transformao, como, por exemplo, palavral = palavra.toLowerCaseQ. 1. class Exemplo0412 2. { 3. 4. 5. 6. 7. 8. 9. } 10. } Mtodo substring Ele retorna a cpia de caracteres de uma string a partir de dois ndices inteiros especificados, funcionando basicamente da mesma forma que o mtodo charAt dentro de um lopping, conforme indica o item 4.2.2. A sintaxe de substring a seguinte: <string>.substring(<ndice inicial>,[<ndice final>]) 0 primeiro argumento especifica o ndice a partir do qual se inicia a cpia dos caracteres (da mesma forma que charAt, o ndice inicia-se em 0). O segundo argumento opcional e especifica public static void main (String args[]) { String palavral = "ARROZ", palavra2 = "batata"; System.out.println("ARROZ em minscula = " + palavral.toLowerCase()); System.out.println("batata em maiscula = " + palavra2.toUpperCase()); System.out.printIn("SaLaDa em minscula = " + " SaLaDa". toLowerCase O) ;
Capo Bonito - SP
59
o ndice final, em que termina a cpia dos caracteres, entretanto o ndice final deve especificar um ndice alm do ltimo caractere. Para melhor entendimento do mtodo substring, considere a varivel frase com o seguinte contedo: Frase ndice
L 0 I 1 N 2 G 3 U 4 A 5 G 6 E 7 M 8 9 J 10 A 11 V 12 A 13 14
Cada caractere de uma varivel string indexado a partir do 0 (zero). Vamos apresentar alguns exemplos: 1. String x = frase.substring(10) -> x recebe o contedo "JAVA", pois ao passar apenas o primeiro argumento para o mtodo substrng, ele retorna da posio informada (no caso 10, a posio da letra J) at o ltimo caractere da string. 2. String x = frase.substring(3) > x recebe o contedo "GUAGEM JAVA", isto , do caractere de ndice 3 at o ltimo caractere da string frase. 3. String x = frase.substring(3,9) -> x recebe o contedo "GUAGEM", isto , do caractere de ndice 3 at o caractere de ndice 8 (9-1). 4. String x = frase.substring(0,1) -> x recebe o contedo "L", isto , do caractere de ndice 0 at o caractere de ndice 0 (1-1). 5. String x = frase.substring(10,14) -> x recebe o contedo "JAVA", isto , do caractere de ndice 10 at o caractere de ndice 13 (14-1). Observe que o resultado deste exemplo igual ao do exemplo 1. Se os ndices especificados estiverem fora dos limites da string, gerado o erro StringlndexOutOfBoundsException. No exemplo, se voc usar frase.substring(10,20), ocorre o erro citado, uma vez que no existe ndice 20. O exemplo 4.13 apresenta um cdigo que usa o mtodo substrng para separar as palavras de uma frase pela manipulao de seus ndices.
Capo Bonito - SP
60
1. class Exemplo0413 2. { 3. 4. 5. 6. 7. 8. 9. 10. 1112. } } public static void main (String args[]) { String frase = "Eu gosto de java!"; System.out.println("Separando uma frase em palavras:"); System.out.println("Palavra 1: " + frase.substring(0,2)); System.out.println("Palavra 2: " + frase.substring(3,8)); System.out.println("Palavra 3: " + frase.substring(9,11)); System.out.println("Palavra 4: " + frase.substring(12));
Mtodo trim Seu objetivo remover todos os espaos em branco que aparecem no incio e no final de uma determinada string. So removidos apenas os espaos do incio e do fim da string; no so removidos os espaos entre as palavras. Sua sintaxe a seguinte: <string>.trim() O exemplo 4.14 mostra a utilizao do mtodo trim: 1. class Exemplo0414 2. { 3. 4. 5. 6. 7. 8. 9. } } public static void main (String args[]) { String frase = " Jesus Cristo: o rei dos reis. "; System.out.println("Com espaos: " + "*" + frase + "*"); System.out.println("Sem espaos: " + "*" + frase.trim () + "*");
Capo Bonito - SP
61
A varivel frase armazena uma string com espaos em branco no incio e no final. Quando no utilizado o mtodo trim, os espaos permanecem na strng; em contrapartida, ao usar trim, os espaos desaparecem. O mtodo frase.trim() no retirou realmente os espaos em branco da varivel, ou seja, apenas foi mostrado na tela um trim da varivel, que conseqentemente exibe-a sem os espaos em branco, mas a varivel em si ainda continua com os espaos no seu incio e no seu final. Para que realmente os espaos sejam retirados, necessrio que o resultado de trim seja atribudo prpria varivel, como a seguinte instruo: frase=frase.trim(). Isso tornaria a varivel livre dos espaos em branco. Mtodo replace utilizado para substituio de caracteres, ou grupo de caracteres, em uma determinada strng. Para seu funcionamento, necessrio informar o(s) caractere(s) que deseja substituir e por qual(is) caractere(s) ele(s) ser(o) substitudo(s). Caso no haja na strng nenhuma ocorrncia do caractere a ser substitudo, a strng original retornada, isto , no ocorre nenhuma alterao. Veja sua sintaxe: <string>.replace(<caracteres a serem substitudos>,<substituio>) 1. class Exemplo0415 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. } No exemplo 4.15, a linha 5 declara uma String (frase1) que recebe uma frase. A linha 6 armazena essa frase na varivel frase2, porm sem os espaos em branco, uma vez que o mtodo replace foi usado para substituir todos os espaos por vazios ("" por""). As linhas 8 e 9
Curso Tcnico em Informtica
public static void main (String args[]) { String frase1 = "o macaco gosta de banana"; String frase2 = frasel.replace(" ",""); System.out.println("Frase 1: " + frase1); System.out.println("Frase 2: " + frase2); System.out.println("Frase 3: " + frase1.replace(" ", "_")); System.out.println("Frase 4: " + frase1.replace("a", "u")); System.out.println("Frase 5: " + frase1.replace("na", "NA"));
Capo Bonito - SP
62
substituem um caractere por outro ("" por"_" e "a" por "u") e a linha 10 substitui uma palavra por outra ("na" por "NA"). Da mesma forma que trim, o mtodo replace no altera o contedo da varivel. Para fazer com que uma varivel receba o resultado de uma troca de caracteres, faa como apresentado na linha 6. Mtodo valueOf O mtodo valueOf usado para converter diversos tipos de dados em strings. Esse mtodo aceita vrios tipos de argumento (nmeros ou cadeia de caracteres) e transforma-os em strings. Este item aborda apenas a converso de tipos numricos em strings, uma vez que o estudo de arrays (cadeia de caracteres) assunto do captulo 7. Uma das sintaxes possveis para o mtodo valueOf : String.valueOf (<nome da varivel a ser convertidas-) Para facilitar o entendimento, o exemplo 4.16 demonstra a converso de vrios tipos numricos com o uso do mtodo valueOf. 1. class Exemplo0416 2. { 34. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14 . 15. 16. } 17. } { String x = ""; int a = 11; long b = 222; float c = 3333; double d = 4.444; x = x + String.valueOf(a) + " - "; x = x + String.valueOf(b) + " - "; x = x + String.valueOf(c) + " - "; x = x + String.valueOf(d); System.out.println("Valores convertidos:"); System.out.println(x); public static void main (String args[])
Capo Bonito - SP
63
No exemplo 4.16 todas as variveis numricas (a, b, c, d) declaradas nas linhas 6 a 9 so convertidas e acumuladas em uma varivel Strng (x) nas linhas 10 a 13. Esta no a funcionalidade mais importante do mtodo valueOf, uma vez que o mesmo resultado pode ser alcanado sem sua utilizao, por meio da concatenao das variveis com o operador de concatenao (+), conforme demonstrado em seguida: String x = a + " - " + b + " - " + c + " - " + d;
Mtodo indexOf O mtodo indexOf usado para localizar caracteres ou substrings em uma String. Quando realizamos a busca de uma palavra em um texto, usamos algo parecido com o funcionamento de indexOf, isto , ele busca uma palavra e retorna a posio onde ela se encontra. Voc j sabe que um texto (ou uma String) indexado a partir do nmero zero. Caso haja sucesso na busca, retornado um nmero inteiro referente posio do texto (o ndice) onde o caractere foi encontrado, ou a posio do texto onde se inicia a substring localizada. Caso haja insucesso na busca, isto , caso o caractere ou substring no tenha sido encontrada, retornado o valor inteiro -1. De qualquer modo, o retorno de indexOf sempre ser um nmero inteiro (o valor do ndice, ou -1). A sintaxe geral para utilizao do mtodo indexOf : String.indexOf(<caractere ou substring a ser localizada, [posio inicial]>) Existem quatro maneiras de utilizar o mtodo indexOf, conforme indica o exemplo 4.17. 1. class Exemplo0417 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. } } public static void main (String args[]) { String texto = "Livro Java 2 - Ensino didtico"; char caractere = 'a'; System.out.println("ndice: " + texto.indexOf(caractere)); System.out.println("indice: " + texto.indexOf(caractere,10)); System.out.println("indice: " + texto.indexOf("Ensino")); System.out.println("indice: " + texto.indexOf("Java",15));
Capo Bonito - SP
64
No exemplo 4.17 a linha 5 contm o texto que ser usado nas pesquisas. A linha 6 declara um caractere 'a' que ser buscado no texto. As formas de busca so as seguintes: Linha 7: busca o caractere 'a' no texto e retorna o ndice referente sua primeira ocorrncia. No caso, retorna o ndice 7. Linha 8: busca o caractere 'a' no texto a partir do ndice 10 e retorna o ndice referente sua primeira ocorrncia. No caso, retorna o ndice 25. Na realidade, a primeira ocorrncia do caractere 'a' seria na posio 7, entretanto foi solicitado que a busca iniciasse na posio 10. Linha 9: busca a substring "Ensino" no texto e retorna o ndice referente sua primeira ocorrncia. No caso, retorna o ndice 15. Linha 10: busca a substring "Java" no texto a partir da posio 15 e retorna o ndice referente sua primeira ocorrncia. Como no existe a palavra "Java" aps a posio 15, retornado o valor -1 (busca sem sucesso). O mesmo princpio aplicado quando voc procura uma palavra em um editor de textos e ele no a encontra.
Criao de Banners
Os banners (textos rolantes) so muito usados em pginas da Internet. Este item apresenta uma ilustrao que explica a construo de banners com a manipulao de Strings. O exemplo 4.18 mostra uma palavra qualquer, digitada pelo usurio, sendo formada letra a letra na tela de modo temporizado. Evidentemente, o exemplo bem simples, servindo apenas como ilustrao. Seu aperfeioamento cabe ao leitor, explorando sua criatividade. Os aspectos mais importantes do exemplo aparecem no prprio cdigo em negrito e devem ser familiares ao feitor, uma vez que j foram abordados em itens anteriores.
Capo Bonito - SP
65
1. class Exemplo0418 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18 . 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. } } } } else { System.out.println("Entre com uma palavra qualquer."); } System.out.println(); System.out.println("Banner encerrado"); { System.out.println("Mostra a palavra 3 vezes, letra a letra."); palavra = args[0]; while (cont++<3) { for(int i=0;i<palavra.length();i++) { System.out.print(palavra.charAt(i)); // varre os caracteres for(int x=0;x<50000000;x++); // temporizador 1 } System.out.println{); for(int y=0;y<100000000;y++); // temporizador 2 // a varivel palavra recebe a palavra digitada // looping 3 vezes public static void main (String args[]) { int cont = 0; String palavra = ""; // a varivel palavra que ser usada no banner if (args.length != 0) // se o usurio digitou uma palavra no prompt
Capo Bonito - SP
66
Capo Bonito - SP
67
Uma caracterstica interessante da programao orientada por objetos a possibilidade de derivar um objeto de outro, ou seja, criar um novo objeto que possui (herda) todos os atributos e aes do seu antecessor. No exemplo do automvel, o motor poderia ser uma classe base da qual seriam derivam outras, como demonstra o seguinte esquema simblico: CLASSE MOTOR: Cilindros = 4 Refrigerao = gua Posio = transversal Cabeote = alumnio Bloco = ferro fundido FIM DA CLASSE MOTOR CLASSE MOTOR_CARBURADOR DERIVADO DE MOTOR: Alimentao = carburador Combustvel = lcool FIM CLASSE MOTOR_CARBURADOR CLASSE MOTOR_INJECAO DERIVADO DE MOTOR: Alimentao = injeo eletrnica Combustvel = gasolina FIM CLASSE MOTOR_CARBURADOR Em termos de programao, voc poderia, por exemplo, criar uma classe genrica para criao de uma janela principal do programa, com menus e botes de atalho. Quando precisasse desenvolver um novo aplicativo, recorreria a essa classe para montar a tela principal, sem ter de escrever uma linha sequer novamente. Com essa tcnica, cada objeto auto-suficiente, ou seja, capaz de executar uma tarefa inteira sem precisar se preocupar com o resto do programa.
Capo Bonito - SP
68
Anlise de um programa em Java public class ProgramaJava01 { public static void main(String args[]) { short srtAno = 2006; int intSegundos = 809832; System.out.println("Ola pessoal !"); System.out.println("Primeiro programa em JAVA..."); System.out.println("Ano: "+srtAno); System.out.println("Segundos: "+intSegundos); } } Todo programa em Java deve iniciar com a declarao de uma classe, uma vez que um aplicativo considerado uma classe que pode ser estendida. O modificador public indica que ela uma classe pblica, e devido a isso seu nome deve ser o mesmo dado ao arquivo do cdigo--fonte. Esta j uma diferena em relao s linguagens C e C++. public class ProgramaJava01 { Dentro dessa classe vem a definio da funo principal do programa, denominada main, que o ponto de entrada para execuo do programa, como ocorre nas linguagens C e C++. O que difere uma da outra a forma utilizada para declarar essa funo. Em Java so utilizados os modificadores public e static. Outra diferena que a funo main membro da classe. public static void main(String args[]) {
importante notar que essa funo recebe parmetros os quais so armazenados na matriz (array) denominada args, do tipo Strings. Isso significa que voc pode passar valores na linha de comando quando for executar o programa. Dentro do corpo dessa funo vem o cdigo propriamente dito do programa. Primeiramente temos a declarao de algumas variveis. Note que aps a declarao vem a atribuio de valor na prpria linha, algo que tambm difere de C e C++.
Curso Tcnico em Informtica
Capo Bonito - SP
69
short srtAno = 2006; int intSegundos = 809832; Aps a declarao dessas variveis vem uma srie de linhas que contm comandos para impresso no vdeo. Para essa tarefa, precisamos utilizar uma biblioteca de uma classe Java denominada System. feita ento uma referncia ao mtodo println da varivel-membro de nome out. Essas referncias so obtidas atravs do operador de referncia"." (ponto), da mesma forma que ocorre quando desejamos acessar um campo de uma estrutura em C ou C++. System.out.println("Ola pessoal !"); System.out.println("Primeiro programa em JAVA..."); System.out.println("Ano: "+srtAno); System.out.println("Segundos: "+intSegundos); Voc deve ter notado a existncia de abre-chaves ({) e fecha-chaves (}) envolvendo o corpo da funo main e toda a classe. Esses smbolos tm a mesma funcionalidade das linguagens C e C+ +, ou seja, delimitam um bloco de linhas de instrues. Na notao UML, uma classe Java poderia ser apresentada conforme o diagrama da figura abaixo. Nessa representao, tanto os atributos quantos os mtodos podem ser precedidos por um modificador representado por um dos seguintes sinais: - Escopo privativo, ou seja, no h visibilidade externa classe. + Escopo pblico, ou seja, possui visibilidade total para o meio externo classe. # Escopo protegido, ou seja, a visibilidade externa limitada.
Capo Bonito - SP
70
public static void main(String args[]) { short srtAno = 2006; } int intSegundos = 809832; System.out.println("Ola pessoal !"); System.out.println("Primeiro programa em JAVA..."); System.out.println("Ano: "+srtAno); System.out.println("Segundos: "+intSegundos); } Declarao da funo-membro (mtodo)
Nome da classe Declarao de classe figura mostra um esquema que identifica cada seo desse primeiro programa. } Atributos Mtodos Notao UML
Capo Bonito - SP
71
Abra um editor de textos e digite o seguinte cdigo: public class Dimensao { public int intBase,intAltura; } Grave o arquivo com o nome Dimensao.java e depois compile-o com o seguinte comando: javac Dimensao.java Agora digite o cdigo apresentado a seguir no editor de textos e grave-o com o nome AreaQuadrado.java. public class AreaQuadrado { public static void main(String args[]) { int intArea; Dimensao Quadrado = new Dimensao(); Quadrado.intBase = 4 ; Quadrado.intAltura = 4 ; intArea = Quadrado.intBase * Quadrado.intAltura; System.out.println("rea do quadrado = "+intArea); } } Observe que foi declarada uma varivel denominada Quadrado como sendo do tipo Dimenso, que se encontra definido na classe criada anteriormente. Outra curiosidade a expresso new Dimensao() aps a declarao. Nela, new um operador e Dimensao() uma funo-membro especial da classe denominada construtora. essa funo que aloca espao na memria para a varivel de referncia e seus atributos. Em resumo, o que ocorre com essa expresso a criao da varivel de referncia imediatamente aps sua declarao. Em seguida temos a atribuio de valores a duas variveis do objeto Quadrado. O leitor poder ento se perguntar: mas como esse objeto possui essas variveis se elas no foram declaradas no programa? Para encontrar a resposta, basta olhar para a definio da classe Dimenso. Como esse objeto declarado desse tipo, ele herda todos os atributos. Para ter acesso a esses atributos, preciso utilizar a notao do ponto (.).
Curso Tcnico em Informtica
Capo Bonito - SP
72
Depois da atribuio desses dois valores, o programa faz o clculo da rea simplesmente efetuando a multiplicao entre os dois. Caso no se lembre, a rea de um quadrado definida como lado X lado. Interessante como as coisas funcionam direito. Voc tambm deve estar curioso para saber como isso possvel. Quando compilamos o cdigo, o compilador adicionou uma referncia classe Dimenso, que resolvida em tempo de execuo. Se essa classe no existisse, seria gerado um erro no momento da compilao. Assim, os dois cdigos esto, de certa forma, intimamente ligados. Abra novamente o editor de textos e digite o seguinte cdigo: public class AreaTriangulo { public static void main(String args[]) { int intArea; Dimenso Tringulo = new Dimenso(); Tringulo.intBase = 6; Tringulo.intAltura = 3; intArea = (Tringulo.intBase * Tringulo.intAltura) / 2; System.out.println("rea do tringulo = "+intArea); } }
Capo Bonito - SP
73
O prximo programa, que calcula a rea de um trapzio, e cujo cdigo apresentado a seguir, um pouquinho mais complexo. public class AreaTrapezio { public static void main(String args[]) { int intArea, intBaseMenor, intBaseMaior; Dimenso Trapzio = new Dimenso(); intBaseMenor = 3 ; intBaseMaior = 5; Trapezio.intBase = (intBaseMenor + intBaseMaior); Trapezio.intAltura = 4; intArea = (Trapezio.intBase * Trapezio.intAltura) / 2; System.out.println("rea do trapezio = "+intArea); } } Como possvel perceber, foi necessria a declarao de mais duas variveis inteiras. Elas sero utilizadas para armazenar o comprimento da base menor e da base maior do trapzio. Isso se deve ao fato de a frmula para clculo da rea de um trapzio ser definida como ((base menor + base maior) X altura) / 2.0 motivo de somar as duas bases que, se voc duplicar o trapzio e posicion-lo no lado oposto, de forma invertida, ter como resultado um retngulo. Adio de mtodos classe A classe que criamos ainda pode ser melhorada com o acrscimo de um mtodo que realiza parte dos clculos. Dizemos parte porque ele na verdade se resume multiplicao dos dois valores armazenados nas variveis-membro. Depois veremos como possvel fazer com que esse clculo seja mais sofisticado.
Capo Bonito - SP
74
Altere o arquivo Dimensao.java acrescentando as linhas destacadas em negrito na seguinte listagem: public class Dimenso { public int intBase, intAltura; public int rea() { return (intBase * intAltura); } } Esse cdigo que acabamos de incluir uma funo-membro que retorna o resultado da multiplicao das variveis intBase e intAltura. uma funo bastante simples, como se pode ver. Agora podemos adaptar os cdigos dos programas alterando a linha destacada nas seguintes listagens: Arquivo AreaQuadrado.java public class AreaQuadrado { public static void main(String args[]) { int intArea; Dimenso Quadrado = new Dimenso(); Quadrado.intBase = 4; Quadrado.intAltura = 4; intArea = Quadrado.Area(); System.out.println("rea do quadrado = "+intArea); } }
Capo Bonito - SP
75
Arquivo AreaTriangulo.java public class AreaTriangulo { public static void main(String args[]) { int intArea; Dimenso Tringulo = new Dimenso(); Tringulo.intBase = 6; Tringulo.intAltura = 3; intArea = Triangulo.Area( ) / 2; System.out.println("rea do tringulo = "+intArea); } } Arquivo AreaTrapezio.java public class AreaTrapezio { public static void main(String args[]) { int intArea,intBaseMenor,intBaseMaior; Dimenso Trapezio = new Dimenso(); intBaseMenor = 3; intBaseMaior = 5; Trapezio.intBase = (intBaseMenor + intBaseMaior); Trapezio.intAltura = 4; intArea = Trapezio.rea() / 2; System.out.println("rea do trapezio = "+intArea); } } Como possvel notar, a linha em que todo o clculo era efetuado foi simplificada pela chamada ao mtodo Area() do objeto do tipo Dimenso. A classe ainda no est completa, pelo menos da forma que seria considerada ideal. Precisamos fazer modificaes porque as variveis-membro (tambm chamadas atributos) so visveis
Curso Tcnico em Informtica
Capo Bonito - SP
76
externamente classe, uma situao que no aceitvel para uma boa programao orientada por objeto, uma vez que fere as regras de encapsulamento de atributos. O primeiro passo tornar as variveis-membro privadas classe pelo modificador private, da seguinte forma: public class Dimenso { private int intBase,intAltura; public int rea() { return (intBase * IntAltura); } } Agora vem o problema. Tornando as variveis privadas, no podemos acess-las a partir dos programas. Ento como faremos para atribuir os valores a elas? A resposta a utilizao de mtodos. Adicione classe as linhas destacadas em negrito na listagem mostrada a seguir: public class Dimensao { private int intBase,intAltura; public void Base(int intBase) { this.intBase = intBase; } public void Altura(int intAltura) { this.intAltura = intAltura; } public int Area() { return (intBase * intAltura); } }
Curso Tcnico em Informtica
Capo Bonito - SP
77
As alteraes se resumiram a duas novas funes que inclumos. importante notar e entender o operador this existente nelas. Esse operador foi utilizado devido ao fato de os parmetros das funes-membro terem os mesmos nomes das variveis-membro. Desta forma, ele fora uma referncia ao prprio objeto. Se no quisssemos utiliz-lo, seria necessrio dar outros nomes aos parmetros. Os programas tambm precisam ser alterados, conforme indicam as listagens: Arquivo AreaQuadrado.java public class AreaQuadrado { public static void main(String args[]) { int intArea; Dimensao Quadrado = new Dimensao(); Quadrado.Base(4); Quadrado.Altura(4); intArea = Quadrado.Area(); System.out.println("rea do quadrado = "+intArea); } } Arquivo AreaTriangulo.java public class AreaTriangulo { public static void main(String'args[]) { int intArea; Dimenso Tringulo = new Dimenso(); Tringulo.Base(6); Tringulo.Altura(3); intArea = Tringulo.rea() / 2; System.out.println("rea do tringulo = "+intArea); } }
Capo Bonito - SP
78
Arquivo AreaTrapezio.java public class AreaTrapezio { public static void main(String args[]) { int intArea,intBaseMenor,intBaseMaior; Dimenso Trapezio = new Dimenso(); intBaseMenor = 3; intBaseMaior = 5; Trapezio.Base(intBaseMenor + intBaseMaior); Trapezio.Altura(4); intArea = Trapezio.rea() / 2; System.out.println("rea do trapezio = "+intArea); } } Para finalizar, vamos acrescentar uma varivel-membro e uma funo que permitem a especificao do tipo de objeto geomtrico para que o clculo seja efetuado corretamente pela prpria classe. Sendo assim, altere o cdigo do arquivo Dimensao.java adicionando as linhas em destaque mostradas em seguida: public class Dimenso { private int intBase,intAltura; private String strTipo; public void Base(int intBase) { this.intBase = intBase; } public void Altura(int intAltura) { this.intAltura = intAltura; } public void Tipo(String strTipo)
Curso Tcnico em Informtica
Capo Bonito - SP
79
{ this.strTipo = strTipo; } public int rea() { int intArea; intArea = intBase * intAltura; if ((strTipo == "LOSANGO") || (strTipo == "TRAPEZIO") || (strTipo == "TRINGULO")) intArea = intArea / 2; return (intArea); } } A varivel strTipo receber, atravs da funo-membro Tipo(), uma cadeia de caracteres que representa o tipo de objeto geomtrico para que assim a funo Area() consiga saber se o valor da rea deve ser dividido por dois, no caso de o tipo de objeto ser "LOSANGO", "TRAPEZIO" ou "TRINGULO". Agora precisamos adaptar os programas nova realidade. As listagens seguintes apresentam os cdigos novos: Arquivo AreaQuadrado.java public class AreaQuadrado { public static void main(String args[]) { int intArea; Dimenso Quadrado = new Dimenso(); Quadrado.Base(4); Quadrado.Altura(4); Quadrado. Tipo ("QUADRADO") ; intArea = Quadrado.rea(); System.out.println("rea do quadrado = "+intArea); } }
Curso Tcnico em Informtica
Capo Bonito - SP
80
Arquivo AreaTriangulo.java public class AreaTriangulo { public static void main(String args[]) { int intArea; Dimenso Tringulo = new Dimenso(); Tringulo.Base(6); Tringulo.Altura(3); Tringulo.Tipo("TRINGULO"); intArea = Tringulo.rea() / 2; System.out.println("rea do tringulo = "+intArea); } } Arquivo AreaTrapezio.java public class AreaTrapezio { public static void main(String args[]) { int intArea,intBaseMenor,intBaseMaior; Dimenso Trapezio = new Dimenso(); intBaseMenor = 3; intBaseMaior = 5; Trapezio.Base(intBaseMenor + intBaseMaior); Trapezio.Altura(4); Trapezio. Tipo ("TRAPEZIO" ); intArea = Trapezio.rea() / 2 ; System.out.println("rea do trapezio = "+intArea); } }
Capo Bonito - SP
81
Construtores e Herana
Adio de construtores Uma caracterstica muito interessante das classes a possibilidade de inicializao dos objetos criados com elas. Isso significa que os atributos existentes neles podem receber valores automaticamente durante a declarao. Para que isso seja possvel, necessria a definio de um mtodo especial denominado construtor. Um mtodo construtor deve, necessariamente, receber o mesmo nome dado classe e, embora no possua um tipo de retorno, pode receber parmetros cujos valores so atribudos aos atributos do objeto. Essa atribuio ocorre quando a instncia do objeto criada pelo operador new. Deve-se ressaltar que toda classe possui um mtodo construtor, mesmo nos casos em que ele no tenha sido definido explicitamente. Neste caso, o prprio compilador Java se encarrega de adicionar um construtor-padro. Por exemplo, para a classe Dimenso foi criada de forma transparente a seguinte declarao: public Dimenso() { } Isso pde ser verificado nos exemplos anteriores, que chamavam um mtodo denominado Dimensao(), como no seguinte exemplo: Dimenso Losango = new Dimenso(); Uma caracterstica importantssima que deve ser observada que a execuo do construtor de uma classe s ocorre uma nica vez durante todo o tempo de existncia do objeto. Vejamos ento como criar uma classe que possua um mtodo construtor e as alteraes que devem ser feitas nos programas desenvolvidos no captulo anterior para utiliz-la.
Capo Bonito - SP
82
Primeiramente, digite o cdigo mostrado na listagem seguinte num editor de textos e grave-o com o nome FiguraGeometrica.java: public class FiguraGeometrica { private int intBase,intAltura; private String strTipo; public FiguraGeometrica(String strTipo,int intBase,int intAltura) { this.strTipo = strTipo; this.intBase = intBase; this.intAltura = intAltura; } public int Area() { int intArea; intArea = intBase * intAltura; if ((strTipo == "LOSANGO") || (strTipo == "TRAPEZIO") || (strTipo == "TRINGULO")) intArea = intArea / 2; return (intArea); } } Nessa nova classe, temos a declarao das mesmas variveis j vistas no captulo anterior: uma para armazenar o valor da base, outra para o valor da altura e uma ltima para conter o tipo de figura geomtrica. Em seguida temos a definio do construtor (note que ele tem o mesmo nome da classe). So passados a ele trs parmetros: uma cadeia de caracteres que designa o tipo de figura geomtrica, um valor numrico que representa o comprimento da base da figura e um nmero inteiro para o comprimento da altura.
Capo Bonito - SP
83
Esses valores so passados aos atributos da classe. Foi utilizado novamente o operador this como uma forma de se referir ao prprio objeto. Temos por fim, um mtodo que efetua o clculo da rea da figura geomtrica, similar ao j existente na classe Dimenso. Agora altere o cdigo dos programas (que no deixam de ser classes tambm) conforme indicado nas seguintes listagens: Arquivo AreaQuadrado.java public class AreaQuadrado { public static void main(String args[]) { int intArea; FiguraGeometrica Quadrado = new FiguraGeometrica("QUADRADO",4,4); intArea = Quadrado.rea(); System.out.println("rea do quadrado = "+intArea); } } Arquivo AreaTriangulo.java public class AreaTriangulo { public static void main(String args[]) { int intArea; FiguraGeometrica Tringulo = new FiguraGeometrica("TRINGULO",6,3); intArea = Tringulo.rea() / 2; System.out.println("rea do tringulo = "+intArea); } }
Capo Bonito - SP
84
Arquivo AreaTrapezio.java public class AreaTrapezio { public static void main(String args[]) { int intArea,intBaseMenor,intBaseMaior; Dimenso Trapezio = new Dimenso(); intBaseMenor = 3; intBaseMaior = 5; FiguraGeometrica Trapezio new FiguraGeometrica ("TRAPEZIO",(intBaseMenor + intBaseMaior),4); intArea = Trapezio.rea() / 2; System.out.println("rea do trapezio = "+intArea); } } Sem dvida, os cdigos ficaram mais claros e enxutos com essas alteraes. Agora, no momento da criao do objeto, seus atributos j so inicializados automaticamente, sem a necessidade de ter linhas que fazem as atribuies dos valores separadamente. No entanto, preciso ter cuidado com a ordem em que os parmetros so passados, para que no haja problemas na hora da compilao ou na execuo. Antes de finalizar esse tpico, importante deixar claro que, diferentemente de C++, na linguagem Java no precisamos definir um mtodo destrutor. Na verdade, Java nem trabalha com esse conceito. A destruio de um objeto e a recuperao da memria ocupada por ele ficam a cargo do coletor de lixo. Outra diferena em relao ao C++ que os construtores so definidos dentro do prprio corpo da classe, e no fora dela, empregando-se o operador de resoluo de abrangncia (::), que associa a definio da funo com a classe a que pertence.
Capo Bonito - SP
85
Herana de classes
Este tpico apresenta um assunto muito interessante em Java e em outras linguagens orientadas por objeto (como C++): a herana. Basicamente ela pode ser definida como uma classe (denominada subclasse) que criada contendo todas as caractersticas (atributos e mtodos) de uma outra classe (denominada superclasse). subclasse podem ser adicionados outros atributos e mtodos que so especficos dela. Por outro lado, ela reconhece todos aqueles que j se encontram definidos na superclasse. Para estudar esse conceito, vamos criar uma classe base (superclasse) com a seguinte definio: Nome da classe: DadosPessoais Atributos: Nome (String), Endereo (String), Bairro (String), Cidade (String), Estado (String), CEP (String), Telefone (String). Mtodos: DadosPessoais (construtor), getNome, getEndereco, getBairro, getCidade, getEstado, get CEP, getTelefone. Em termos de notao UML, teramos um diagrama similar ao da figura abaixo
Capo Bonito - SP
86
O cdigo para definio dessa classe seria o seguinte: public class DadosPessoais { private String strNome, strEndereco, strBairro, strCidade, strEstado, strCEP, strTelefone; public DadosPessoais(String strNome, String strEndereco, String strBairro, String strCidade, String strEstado, String strCEP, String strTelefone) { this.strNome = strNome; this.strEndereco = strEndereco; this.strBairro = strBairro; this.strCidade = strCidade; this.strEstado = strEstado; this.strCEP = strCEP; this.strTelefone = strTelefone; } public String getNome( ) { return strNome; } public String getEndereco( ) { return strEndereco; } public String getBairro( ) { return strBairro; } public String getCidade( ) { return strCidade; } public String getEstado( ) { return strEstado; } public String getCEP( ) { return strCEP; } public String getTelefone( ) { return strTelefone; } }
Curso Tcnico em Informtica
Capo Bonito - SP
87
Aps a declarao dos atributos temos a definio do construtor e dos mtodos que retornam os valores dos atributos. Uma conveno que normalmente tem sido utilizada na programao em Java o acrscimo da expresso get frente de todos os mtodos que possuem a funo de retornar um valor da classe. Uma vez que as subclasses (classes filhas) no herdam os construtores da superclasse (classe me), precisamos definir um construtor que chama explicitamente o construtor da superclasse atravs da palavra reservada super. Os parmetros necessrios so passados dentro dos parnteses que seguem essa palavra-chave. A palavra reservada extends, por outro lado, utilizada para indicar que uma classe herda/estende outra. Seguindo essa palavra reserva, deve vir o nome da superclasse. Em Java, uma subclasse somente pode estender diretamente uma outra subclasse, no sendo permitida a herana mltipla, como ocorre em C++. O cdigo apresentado a seguir cria outra classe que herda as caractersticas da classe DadosPessoais e estende suas funcionalidades com a adio de novos atributos e mtodos: public class RegistroCliente extends DadosPessoais { private java.til.Date dtNascimento; private double dblLimiteCredito; public RegistroCliente(String strNome, String strEndereco, String strBairro, String strCidade, String strEstado, String strCEP, String strTelefone, java.til.Date dtNascimento, double dblLimiteCredito) { super(strNome,strEndereco,strBairro,strCidade,strEstado,strCEP,strTelefone); this.dtNascimento = dtNascimento; this.dblLimiteCredito = dblLimiteCredito; } public java.til.Date getNascimento() {
Curso Tcnico em Informtica
Capo Bonito - SP
88
return dtNascimento; } public double getLimiteCredito() { return dblLimiteCredito; } } Neste cdigo possvel perceber que foi preciso referenciar de forma explcita o pacote padro java.util para ter acesso classe Date. Observe como foi utilizada a chamada ao construtor da superclasse DadosPessoais dentro do construtor da subclasse RegistroCliente: todos os parmetros necessrios so passados a super. Da superclasse poderamos tambm derivar outras subclasses, como a existente no cdigo da seguinte listagem: public class RegistroFornecedor extends DadosPessoais { private String strCNPJ; private double dblLimiteCredito; public RegistroFornecedor(String strNome, String strEndereco, String strBairro, String strCidade, String strEstado, String strCEP, String strTelefone, String strCNPJ, double dblLimiteCredito) { super(strNome,strEndereco,strBairro,strCidade,strEstado,strCEP,strTelefone); this.strCNPJ = strCNPJ; this.dblLimiteCredito = dblLimiteCredito; } public String getCNPJ( ) {
Curso Tcnico em Informtica
Capo Bonito - SP
89
Capo Bonito - SP
90
Definida a superclasse e as subclasses derivadas, estamos prontos para o programa propriamente dito. Veja o cdigo apresentado na listagem: public class Cadastro { public static void main(String args[]) { java.til.Date dtDataNascimento = new java.util.Date(80, 3,25); RegistroCliente Cliente = new RegistroCliente("Rogrio Alberto Pedro", "Rua Santos Dumont, 1900", "Jd. Aviao", "So Paulo", "SP", "00110-001", "11 0909-1001", dtDataNascimento, 2500) ; RegistroFornecedor Fornecedor = new RegistroFornecedor("Auto-peas MotorBom", "Av. Primavera, 920", "Jd. Estaes", "So Paulo", "SP", "01100-101", "11 1010-0202", "11-001.001/0001-11", 8000) ; System.out.println("Dados do Cliente"); System, out .println ("----------------") ; System.out.println("Nome: "+Cliente.getNome()); System.out.println("Endereo: "+Cliente.getEndereco()); System.out.println("Bairro: "+Cliente.getBairro()); System.out.println("Cidade: "+Cliente.getCidade()); System.out.println("Estado: "+Cliente.getEstado() ) ; System.out.println("CEP: "+Cliente.getCEP()); System.out.println("Nascimento: "+Cliente.getNascimento()); System.out.println("Limite de crdito: "+Cliente.getLimiteCredito()); System.out.println(""); System.out.println("Dados do Fornecedor"); System, out .println ("-------------------") ;
Curso Tcnico em Informtica
Capo Bonito - SP
91
System.out.println("Razo Social: "+Fornecedor.getNome()); System.out.println("Endereo: "+Fornecedor.getEndereco()) ; System.out.println("Bairro: "+Fornecedor.getBairro()); System.out.println("Cidade: "+Fornecedor.getCidade()); System.out.println("Estado: "+Fornecedor.getEstado()) ; System.out.println("CEP: "+Fornecedor.getCEP()); Sys tem.out.println("CNPJ: "+Fornecedor.getCNPJ()) ; System.out.println("Limite de crdito: "+Fornecedor.getLimiteCredito( )); } } Novamente, foi preciso utilizar java.util.Date na declarao da varivel dtDataNascimento. Veja que essa mesma expresso foi empregada para criar a instncia do objeto (new java.util.Date(80,3,25)). Foram passados como parmetros para o construtor o ano, o ms e o dia. Compile os cdigos DadosPessoais.java, RegistroCliente.java e RegistroFornecedor.java, que foram apresentados anteriormente. Compile em seguida o programa cujo arquivo se denomina Cadastro.java. Voc notar que o compilador Java apresenta a mensagem de alerta (no de erro) da figura 6.3. Para ter maiores detalhes sobre o ponto do programa que fora essa mensagem, siga a orientao e compile novamente o cdigo digitando javac -Xlint Cadastro.java. Podemos agora ver que o aviso est relacionado com a linha em que declarado o objeto dtNascimento, mais precisamente com a chamada ao construtor da classe Date. Traduzindo de forma bastante resumida, o compilador informa que a sintaxe utilizada para chamar esse construtor est obsoleta, embora no esteja errada. Isso se deve ao fato de terem sido adicionadas outras maneiras de invocar o construtor nas novas especificaes da API do Java. O leitor deve ter percebido um pequeno problema aps rodar o programa: havamos especificado o valor "3" para o ms, o que significa que deveria ser mostrado como sendo Mar (maro) na impresso da data de nascimento, porm foi impresso Apr (abril). No se trata exatamente de um erro, mas acontece que esse parmetro inicia-se em 0, ou seja, 0 representa janeiro, 1 fevereiro, 2 maro e assim por diante, at 11, que significa dezembro. Estranho, mas assim que funciona. Isso deve ocorrer pelo fato de, provavelmente, haver uma matriz contendo os nomes
Curso Tcnico em Informtica
Capo Bonito - SP
92
dos meses definida dentro da classe, e como os ndices das matrizes sempre iniciam em 0, o mesmo acontece com o parmetro do construtor.
O polimorfismo em Java obtido atravs da sobrescrita e sobrecarga de mtodos. Na sobrescrita, um mtodo da superclasse (classe me) redefinido nas subclasses herdeiras (classes filhas) para modificar seu comportamento, mantendo sua assinatura original. J na sobrecarga, podemos ter um mesmo mtodo definido diversas vezes, e cada um executa uma operao especfica conforme os parmetros recebidos. Neste caso, as assinaturas so diferentes.
Curso Tcnico em Informtica
Capo Bonito - SP
93
Vamos estudar ento cada um desses recursos. Sobrescrita de mtodos Para entendermos como funciona a sobrescrita de mtodos, nada melhor do que trabalhar diretamente com um exemplo concreto. O que faremos agora alterar a classe FiguraGeometrica (apresentada no captulo anterior), criar subclasses a partir dela e adaptar os programas para usar a subclasse. Primeiramente altere o cdigo da classe FiguraGeometrica (arquivo FiguraGeometrica.java) para o seguinte: public class FiguraGeometrica { private int intBase,intAltura; public FiguraGeometrica(int intBase, int intAltura) { this.intBase = intBase; this.intAltura = intAltura; } public int rea( ) { int intArea; intArea = intBase * intAltura; return (intArea); } } Note que, diferentemente da verso .anterior, o construtor no possui mais um parmetro para indicar o tipo de figura. O mtodo Area( ) tambm foi alterado de forma que no h o teste com o comando if para determinar se o valor da multiplicao (base X altura) deveria ser dividido por 2. Esta a superclasse. Vamos criar duas subclasses denominadas Quadrado e Trapzio. A primeira responsvel por calcular o valor da rea do quadrado, enquanto a segunda se encarrega do clculo da rea do trapzio.
Capo Bonito - SP
94
Veja os cdigos apresentados nas seguintes listagens: Arquivo Quadrado.java public class Quadrado extends FiguraGeometrica { public Quadrado(int intBase,int intAltura) { super(intBase,intAltura); } public int rea( ) { int intArea; intArea = super.Area(); return intArea; } } Arquivo Trapezio.java public class Trapezio extends FiguraGeometrica { public Trapezio(int intBase,int intAltura) { super(intBase,intAltura); } public int rea( ) { int intArea; intArea = super.Area() / 2; return intArea; } } importante prestar bastante ateno ao construtor e redefinio do mtodo Area(). Os construtores dessas duas subclasses chamam o construtor da superclasse atravs da palavra reservada super com os parmetros necessrios entre parnteses. J o mtodo Area( ) possui uma chamada ao mtodo de mesmo nome existente na superclasse. Para que isso seja possvel, necessrio utilizar novamente a palavra reservada super, que
Curso Tcnico em Informtica
Capo Bonito - SP
95
informa uma referncia superclasse. Essa construo traduzida pelo compilador como se fosse FiguraGeometrica.Area(). No caso especfico da classe Trapezio, o valor retornado por Area() dividido por 2, como manda a regra. Desta forma temos um cdigo mais limpo e totalmente dentro das normas de uma boa programao orientada por objeto, ou seja, uma classe base e as classes derivadas contendo as caractersticas que lhe so pertinentes. Para utilizar essas duas novas classes, altere o cdigo dos programas mostrados a seguir: Arquivo AreaQuadrado.java public class AreaQuadrado { public static void main(String args[]) { int intArea; Quadrado ObjQuadrado = new Quadrado(4 , 4); intArea = ObjQuadrado.rea(); System.out.println("rea do quadrado = "+intArea); } } Arquivo AreaTrapezio.java public class AreaTrapezio { public static void main(String args[]) { int intArea,intBaseMenor,intBaseMaior; intBaseMenor = 3; intBaseMaior = 5; Trapezio ObjTrapezio = new Trapezio((intBaseMenor + intBaseMaior),4); intArea = ObjTrapezio.rea(); System.out.println("rea do trapezio = "+intArea); } }
Capo Bonito - SP
96
As duas diferenas em relao ao cdigo da verso anterior so a especificao das classes Quadrado e Trapezio no lugar de FiguraGeometrica, e a ausncia da cadeia de caracteres informando o tipo de figura geomtrica. Voc deve compilar o arquivo FiguraGeometrica.java primeiro e depois a classe derivada dela. S ento compile o programa e rode-o. Sobrecarga de mtodos Como j foi mencionado antes, a sobrecarga possibilita que um mesmo mtodo tenha vrias verses. Cada verso deve possuir um ou mais parmetros que tornem possvel a distino. Vamos alterar os mtodos construtores das classes Quadrado e Trapezio de modo que se no for passado nenhum parmetro, seja assumido por padro o valor 1 para a base e para a altura. Abra o arquivo Quadrado.java num editor de textos e acrescente a linha destacada em negrito na seguinte listagem: public class Quadrado extends FiguraGeometrica { public Quadrado( ) { super(1,1); } public Quadrado(int intBase.int intAltura) { super(intBase,intAltura); } public int rea () { int intArea; intArea = super.rea(); return intArea; } } Essas novas linhas definem um outro mtodo construtor que no recebe parmetros. No entanto, ele chama o construtor da superclasse especificando o valor 1 para ambos os parmetros necessrios. Com isso, podemos declarar e criar uma instncia de um objeto do tipo Quadrado
Curso Tcnico em Informtica
Capo Bonito - SP
97
sem especificar nada. Veja o cdigo do programa AreaQuadrado.java alterado: public class AreaQuadrado { public static void main(String args[]) { int intAreal,intArea2; Quadrado ObjQuadrado1 = new Quadrado( ); intAreal = ObjQuadrado1.rea( ); Quadrado 0bjQuadrado2 = new Quadrado(4,4); intArea2 = ObjQuadrado2.rea(); System.out.println("rea do quadrado 1 = "+intAreal); System.out.println("rea do quadrado 2 = "+intArea2); } } Com a classe Trapezio podemos fazer as mesmas alteraes, como indica o cdigo a seguir: public class Trapezio extends FiguraGeometrica { public Trapezio( ) { super(1,1); } public Trapezio(int intBase,int intAltura) { super(intBase,intAltura); } public int rea( ) { int intArea; intArea = super.Area( ) / 2; return intArea; } }
Curso Tcnico em Informtica
Capo Bonito - SP
98
0 programa que usa essa classe tambm precisa de alterao. Veja a listagem: public class AreaTrapezio { public static void main(String args[]) { int intAreal,intArea2,intBaseMenor,intBaseMaior; Trapezio ObjTrapezio1 = new Trapezio( ); intAreal = ObjTrapeziol .rea (); intBaseMenor = 3; intBaseMaior = 5; Trapezio 0bjTrapezio2 = new Trapezio((intBaseMenor + intBaseMaior),4); intArea2 = ObjTrapezio2.rea(); System.out.println("rea do trapezio 1 = "+intAreal); System.out.println("rea do trapezio 2 = "+intArea2); } } Outra possibilidade de uso da sobrecarga na distino de mtodos de acordo com o tipo de um ou mais parmetros que ele recebe. Voltemos classe FiguraGeometrica. Como o leitor j deve ter notado, ela trabalha somente com valores numricos inteiros. Ento vamos adapt-la para que aceite tambm valores decimais. Altere o cdigo de forma que ele fique conforme a listagem: public class FiguraGeometrica { private float fltBase,fItAltura; public FiguraGeometrica(int intBase,int intAltura) { this.fltBase = intBase; this.fItAltura = intAltura; } public FiguraGeometrica(float fltBase,float fItAltura) { this.fltBase = fltBase; this.fItAltura = fItAltura; } public float rea() { float fltArea; fltArea = fltBase * fItAltura; return (fltArea); } }
Curso Tcnico em Informtica
Capo Bonito - SP
99
importante destacar que o mtodo Area() teve alterado o tipo de retorno para float, tendo em vista que a classe agora pode trabalhar com valores decimais. Perceba tambm que os construtores so idnticos, diferenciando apenas no tipo de dado dos parmetros (um int e o outro float). No momento da execuo, se os parmetros forem do tipo int, executado o primeiro construtor. Se forem do tipo float, ento executado o segundo. As classes derivadas tambm precisam de modificaes, conforme as listagens a seguir: Arquivo Quadrado.java public class Quadrado extends FiguraGeometrica { public Quadrado(int intBase,int intAltura) { super(intBase,intAltura); } public Quadrado(float fltBase,float fItAltura) { super(fltBase,fItAltura); } public float Area( ) { float fltArea; fltArea = super.Area(); return fltArea; }
Capo Bonito - SP
100
Arquivo Trapezio.java public class Trapezio extends FiguraGeometrica { public Trapezio(int intBase,int intAltura) { super(intBase,intAltura); } public Trapezio(float fltBase,float fltAltura) { super(fltBase,fltAltura); } public float rea( ) { float fltArea; fltArea = super.rea() / 2; return fltArea; } } Observe que foi necessria a adio de um novo construtor em cada classe para tratar dos parmetros decimais. Para os dois programas os cdigos devem ser os seguintes: Arquivo AreaQuadrado.java public class AreaQuadrado { public static void main(String args[]) { float fltAreal,fltArea2; Quadrado ObjQuadradol = new Quadrado(4,4); fltAreal = ObjQuadradol.rea( ); Quadrado 0bjQuadrado2 = new Quadrado(5.5f,5.5f); fltArea2 = 0bjQuadrado2.rea( ); System.out.println("rea do quadrado 1 = "+fItAreal); System.out.println("rea do quadrado 2 = "+fltArea2); } }
Curso Tcnico em Informtica
Capo Bonito - SP
101
Arquivo AreaTrapezio.java public class AreaTrapezio { public static void main(String args[]) { int intBaseMenor,intBaseMaior; float fltAreal,fltArea2,fltBaseMenor,fltBaseMaior; intBaseMenor = 3; intBaseMaior = 5; Trapezio ObjTrapezio1 = new Trapezio((intBaseMenor + intBaseMaior),4); fltAreal = ObjTrapeziol.rea(); fltBaseMenor = 3.5f; fltBaseMaior = 5.5f; Trapezio 0bjTrapezio2 = new Trapezio((fltBaseMenor + fltBaseMaior) , 4 . 5f) ; fltArea2 = 0bjTrapezio2.rea(); System.out.println("rea do trapezio 1 = "+fItAreal); System.out.println("rea do trapezio 2 = "+fltArea2); } } Um ponto muito importante nessa nova verso, e que o leitor deve ter percebido, o acrscimo da letra "f" aps o nmero decimal (como 5.5f, 3.5f). Isso necessrio para indicar explicitamente que o valor de ponto flutuante. Se esse caractere no fosse includo, um erro seria mostrado no momento da compilao. Antes de encerrarmos este tpico, imprescindvel destacar que em Java no existe a sobrecarga de operadores, como ocorre na linguagem C++. A ausncia desse recurso proposital, tendo em vista que ele est cheio de perigos em potencial. Entre alguns desses perigos est o seu uso excessivo, o que facilita ao programador sobrecarregar um operador num determinado contexto e depois querer utiliz-lo em sua funo original em outro ponto.
Capo Bonito - SP
102
Classes e mtodos finais Quando definimos uma rvore de herana de classes em Java, pode ocorrer de chegarmos a um ponto em que desejamos delimitar essa rvore. Essa delimitao no permite que de uma classe sejam derivadas outras. A esse recurso damos o nome de classes (final class), e no existe na linguagem C++. Com o exemplo de rea de figuras geomtricas podemos aplicar esse conceito perfeitamente. Uma vez que dificilmente ser necessrio criar outra classe herdeira de Quadrado, Trapezio ou Tringulo, podemos torn-las classes terminais. Para que isso seja possvel, basta adicionar o modificador final declarao da classe do seguinte modo: Arquivo Quadrado.java public final class Quadrado extends FiguraGeometrica { public Quadrado(int intBase,int intAltura) { super(intBase,intAltura); } public Quadrado(float fltBase,float fltAltura) { super(fltBase,fltAltura); } public float rea( ) { float fltArea; fltArea = super.rea(); return fltArea; } }
Capo Bonito - SP
103
Arquivo Trapezio.java public final class Trapezio extends FiguraGeometrica { public Trapezio(int intBase,int intAltura) { super(intBase,intAltura); } public Trapezio(float fltBase,float fltAltura) { super(fltBase,fltAltura); } public float Area ( ) { float fltArea; fltArea = super.Area( ) / 2 ; return fltArea; } } Arquivo Triangulo.java public final class Tringulo extends FiguraGeometrica { public Tringulo(int intBase,int intAltura) { super(intBase,intAltura); } public Tringulo(float fltBase,float fltAltura) { super(fltBase,fltAltura); } public float rea( ) { float fltArea; fltArea = super.Areaf) / 2; return fltArea; } }
Capo Bonito - SP
104
Se aps alterar e compilar essas classes, voc criar o cdigo mostrado a seguir e tentar compillo, ter a mensagem de erro da figura abaixo:
public class QuadradoNovo extends Quadrado { public QuadradoNovo( ) { super(1,1); } public QuadradoNovo(int intBase,int intAltura) { super(intBase,intAltura); } public QuadradoNovo(float fltBase,float fltAltura) { super(fltBase,fltAltura); } public float Area( ) { float fltArea; fltArea = super.rea( ); return fltArea; } }
Capo Bonito - SP
105
Voc pode tambm definir como "verso final" um mtodo, seja ele construtor ou no, adicionando o modificador final, como no seguinte exemplo: public class Quadrado extends FiguraGeometrica { public final Quadrado(int intBase,int intAltura) { super (intBase, intAltura); } public final Quadrado(float fltBase,float fltAltura) { super(fltBase,fltAltura); } public final float rea( ) { float fltArea; fltArea = super.rea( ); return fltArea; } } Desta forma a classe pode ser estendida, mas seus construtores e mtodos no podem ser especializados na classe derivada. A seguir temos uma pequena tabela que descreve o resultado da aplicao do modificador final em cada componente de uma classe: Atributo Ele se torna constante, no permitindo que seu valor seja alterado. Mtodo No pode ser reescrito nas classes derivadas. Classe A classe no pode mais ser especializada, ou seja, no possvel derivar dela outras
Capo Bonito - SP
106
Capo Bonito - SP
107
Existe ainda a declarao de um mtodo abstrato (public abstract void Converte()) cuja implementao ser criada nas subclasses. Essa classe deve ser gravada com o nome ConversaoMedida.java. A seguir crie outro arquivofonte com o seguinte cdigo: public class ConvertePolCent extends ConversaoMedida { public ConvertePolCent(float fltMedida) { super(fltMedida); } public void Converte( ) { super.setVlrConvertido(super.getVlrOriginal() * 2.54f); } public float getValor( ) { return super.getMedida( ); } } Essa nova classe herda os mtodos pblicos da superclasse ConversaoMedida. Nela encontramos a definio do construtor, a implementao do cdigo referente ao mtodo abstrato Converte() e um terceiro mtodo responsvel pelo retorno do valor convertido. O construtor dessa subclasse chama, atravs da palavra reservada super, o construtor da superclasse. Na implementao do mtodo abstrato Converte(), o valor da unidade de medida (dado em polegadas) convertido em centmetros atravs da multiplicao pela constante 2.54. Como este um valor de ponto flutuante, devemos adicionar o caractere "f". S para lembrar, a converso de centmetro em decimal dada pela frmula X = Y * 2,54, em que Y representa o valor da medida em polegadas. importante notar como o valor da medida em polegadas recuperado pela chamada ao mtodo getVlrOriginal() da superclasse. Da mesma forma, para o armazenamento do valor convertido no atributo fltVIrConvertido, existente na superclasse, fazemos uso da chamada ao seu mtodo setVlrConvertido. J o mtodo getValor(), que retorna o valor calculado, tambm chama getMedida() da superclasse.
Capo Bonito - SP
108
Vamos escrever o cdigo para testar essa classe. O cdigo o apresentado na listagem a seguir: import javax.swing.JOptionPane; public class TesteConversao1 { public static void main(String args[]) { String StrValorPol; Float fltValorPol,fltValorCent; strValorPol = JOptionPane.showInputDialog ("Entre com a medida em polegadas: ") ; fltValorPol = Float.parseFloat(strValorPol); ConvertePolCent PolCent = new ConvertePolCent(fltValorPol); PolCent.Converte( ); fltValorCent = PolCent.getValor( ); JOptionPane.showMessageDialog(null,"Valor convertido para centmetros = " + fltValorCent,"Ateno",JOptionPane.INFORMATION_MESSAGE); } } Nesse cdigo, primeiramente referenciada a biblioteca de classes SWING com a instruo import javax.swing.JOptionPane, para que seja possvel acessar o mtodo showInputDialog da classe JOptionPane e apresentar uma caixa de dilogo de entrada de valor. O valor retomado por esse mtodo armazenado na varivel strValorPol e posteriormente convertido num valor numrico de ponto flutuante atravs da expresso fltValorPol = Float.parseFloat(strValorPol). Em seguida declarado um objeto para a classe ConvertePolCent e passado ao seu construtor o valor digitado pelo usurio. A converso efetuada quando o mtodo Converte() invocado pela instruo PolCent.Converte(). O valor resultante armazenado ento na varivel fltValorCent e por fim, apresentado ao usurio pelo mtodo showMessageDialog() da classe JOptionsPane. Compile os arquivos ConversaoMedida.java, ConvertePolCent.java e TesteConversaol .java, nessa ordem. Vamos criar ainda uma outra classe derivada de ConversaoMedida que faz o processo inverso, ou seja, converte uma medida dada em centmetros em um valor em polegadas. O clculo feito multiplicando o valor em centmetros por 0,3937.
Capo Bonito - SP
109
Veja a seguir o cdigo para essa classe: public class ConverteCentPol extends ConversaoMedida { public ConverteCentPol(float fltMedida) { super(fltMedida); } public void Converte( ) { super.setVlrConvertido(super.getVlrOriginal( ) * 0.3937f); } public float getValor( ) { return super.getMedida( ); } } Como o leitor deve ter percebido, o cdigo bastante parecido com o anterior, diferenciando--se principalmente na expresso de clculo. O cdigo para utilizar essa classe apresentado a seguir: import javax.swing.JOptionPane; public class TesteConversao2 { public static void main(String args[]) { String strValorCent; float fltValorPol,fltValorCent; strValorCent = JOptionPane.showInputDialog ("Entre com a medida em centmetros:"); fltValorCent = Float .parseFloat(strValorCent); ConverteCentPol CentPol = new ConverteCentPol(fltValorCent); CentPol.Converte( ); fltValorPol = CentPol.getValor( ); JOptionPane.showMessageDialog(null,"Valor convertido para polegadas = "+fltValorPol,"Ateno",JOptionPane.INFORMATION_MESSAGE); } }
Capo Bonito - SP
110
Interfaces De forma similar s classes abstratas, as interfaces foram a reescrita dos mtodos abstratos dentro das subclasses, uma vez que elas contm apenas a declarao. Com isso, so implementadas as suas aes. Uma caracterstica interessante que numa interface no encontramos mtodos concretos, assim como os atributos podem ser somente estticos. No pode haver tambm construtores nas interfaces. A linguagem Java permite que uma interface estenda outra interface, e neste caso, a classe que faz uso da primeira deve, obrigatoriamente, implementar todos os mtodos existentes nas interfaces envolvidas (a ancestral e a herdeira). Vamos criar uma interface para a classe de converso de medidas. Abra o editor de textos e digite o seguinte cdigo: public interface ValorConversao { public float getValor( ); } Observe que ele contm apenas a declarao de um mtodo. Grave o arquivo com o nome ValorConversao.java. A seguir, altere as seguintes linhas do arquivo ConverteCentPol.java: public class ConverteCentPol extends ConversaoMedida implementa ValorConversao { public ConverteCentPol(float fltMedida) { super(fltMedida); } public void Converte( ) { super.setVlrConvertido(super.getVlrOriginal( ) * 0.3937f); } public float getValor() { retum getMedida () ; } } H duas importantes modificaes que devem ser notadas. A primeira diz respeito incluso da expresso implements ValorConversao, logo na declarao da classe. Isso indica que a classe define a implementao para os mtodos existentes na interface. A segunda modificao reside na linha que contm a instruo return do mtodo getValor(). A referncia superclasse, obtida atravs da palavra reservada super, foi removida. Isso necessrio para todos os mtodos da interface.
Curso Tcnico em Informtica
Capo Bonito - SP
111
Compile a interface (arquivo ValorConversao.java), em seguida recompile a classe ConverteCentPol.java e o exemplo TesteConversao2.java. Organizao em pacotes Com a tecnologia Java possvel que as classes utilizadas no desenvolvimento de uma aplicao sejam organizadas no que chamamos de "pacotes". Essa organizao feita com o armazenamento dos arquivos em que se encontram definidas as classes em diretrios. Para indicar que uma classe pertence a um pacote, devemos utilizar a palavra reservada package seguida da especificao do nome do pacote, antes da declarao da classe. Crie a pasta pacotes e dentro dela outra pasta denominada clculos. Copie para essa nova pasta os arquivos FiguraGeometrica.java, Quadrado.java, Trapezio.java e Triangulo.java. Agora adicione a seguinte linha a esses arquivos: package pacotes.calculos; O ponto (.) serve para indicar um outro nvel de subdiretrio ou pasta. similar barra invertida (\). Para especificar o pacote a ser utilizado numa aplicao em Java, necessrio adicionar logo no incio do cdigo a palavra reservada import seguida da sua referncia. Em nosso caso ela definida pela expresso pacotes.calculos. Sendo assim, os trs cdigos devem ser alterados para o seguinte: Arquivo AreaQuadrado.java import pacotes.clculos.*; public class AreaQuadrado { public static void main(String args[]) { float fltAreal,fltArea2; Quadrado ObjQuadradol = new Quadrado(4,4); fltAreal = ObjQuadradol.rea( ); Quadrado ObjQuadrado2 = new Quadrado(5.5f, 5.5f); fltArea2 = ObjQuadrado2.rea( ); System.out.println("rea do quadrado 1 = "+fItAreal); System.out.println("rea do quadrado 2 = "+fltArea2); } }
Capo Bonito - SP
112
Arquivo AreaTrapezio.java import pacotes.clculos.*; public class AreaTrapezio { public static void main(String args[]) { int intBaseMenor,intBaseMaior; float fItAreal,fltArea2,fltBaseMenor,fltBaseMaior; intBaseMenor = 3; intBaseMaior = 5; Trapezio ObjTrapeziol = new Trapezio((intBaseMenor + intBaseMaior),4); fltAreal = ObjTrapeziol.rea(); fltBaseMenor = 3.5f; fltBaseMaior = 5.5f; Trapezio 0bjTrapezio2 = new Trapezio((fltBaseMenor + fltBaseMaior) , 4 . 5f) ; fltArea2 = 0bjTrapezio2.Area( ); System.out.println("rea do trapezio 1 = "+fItArea1); System.out.println("rea do trapezio 2 = "+fltArea2); } } Arquivo AreaTriangulo.java import pacotes.clculos.*; public class AreaTriangulo { public static void main(String args[]) { float fltAreal,fltArea2,fltBaseMenor,fltBaseMaior; Tringulo ObjTriangulol = new Tringulo(6,3); fltAreal = ObjTriangulol.rea( ); Tringulo 0bjTriangulo2 = new Tringulo(8.5f,3.5f); fltArea2 = 0bjTriangulo2.rea( ); System.out.println("rea do trapezio 1 = "+fItAreal); System.out.println("rea do trapezio 2 = "+fltArea2); } } No tente compilar esses arquivos, pois ocorrero diversas mensagens de erro. Mas no pense que isso tudo. Precisamos ajustar a varivel de ambiente CLASSPATH para o disco/diretrio em que se encontra o pacote. Seu valor utilizado pelo compilador javac para localizar as classes no momento da compilao.
Curso Tcnico em Informtica
Capo Bonito - SP
113
Como o pacote est localizado na pasta pacotes\calculos, o valor dessa varivel deve ser a identificao do disco (unidade ou partio) em que se encontram essas pastas. Supondo que o disco tenha a identificao D:, o comando a ser executado na janela de prompt do Windows o seguinte: D:\>SET CLASSPATH=D:\; Agora tente compilar os exemplos. Voc pode ver que so criados automaticamente pelo compilador os arquivos de pseudocdigo das classes (arquivos com extenso .class), como mostra a figura abaixo
Capo Bonito - SP
114