0 évaluation0% ont trouvé ce document utile (0 vote)
340 vues180 pages
O documento apresenta uma apostila sobre programação em Java com 18 capítulos. O capítulo 1 introduz a linguagem Java, seu desenvolvimento e características principais como orientação a objetos, multiplataforma e robustez. Os próximos capítulos abordam tópicos como tipos de dados, variáveis, operadores, controle de fluxo, orientação a objetos, classes, métodos, construtores, herança, polimorfismo e arrays. Há também capítulos sobre interfaces, pacotes, strings, exceções e acesso a bancos
Description originale:
Apostila de programação de computadores, apresenta a programa em java de maneira fácil e produtiva.
O documento apresenta uma apostila sobre programação em Java com 18 capítulos. O capítulo 1 introduz a linguagem Java, seu desenvolvimento e características principais como orientação a objetos, multiplataforma e robustez. Os próximos capítulos abordam tópicos como tipos de dados, variáveis, operadores, controle de fluxo, orientação a objetos, classes, métodos, construtores, herança, polimorfismo e arrays. Há também capítulos sobre interfaces, pacotes, strings, exceções e acesso a bancos
O documento apresenta uma apostila sobre programação em Java com 18 capítulos. O capítulo 1 introduz a linguagem Java, seu desenvolvimento e características principais como orientação a objetos, multiplataforma e robustez. Os próximos capítulos abordam tópicos como tipos de dados, variáveis, operadores, controle de fluxo, orientação a objetos, classes, métodos, construtores, herança, polimorfismo e arrays. Há também capítulos sobre interfaces, pacotes, strings, exceções e acesso a bancos
Professor: Osvaldo Rodrigues Srgio PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 2 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Captulo 1: Conceitos Gerais
1. Introduo 2. Caractersticas 2.1. Orientada a objetos 2.2. Interpretada e compilada 2.2.1. Bytecode 2.2.2. JVM 2.2.3. JavaAPI 2.3. MuIti-plataforma 2.4. Robusta e confivel 2.4.1. Carbage collector 2.4.2. Exception handling 2.5. Segura 2.6. Portvel 2.7. Multithreaded 3. Princpios da linguagem 3.1. Case sensitive 3.2. Nome do arquivo 3.3. Nomenclatura 3.4. Estrutura 3.5. Comentrios 3.6. Identificadores reservados 4. Estrutura bsica de uma classe 5. Verses do Java 6. JSDK e JRE 7. Ambientes de desenvolvimento 8. Compilando e executando 9. Path
Captulo 2: Tipos de Dados, Valores Literais e Variveis
1. Introduo 2. Tipos Primitivos 3. type casting 3.1. Promoo automtica 3.2. Upcast e downcast 4. Valores Literais 4.1. Literais Inteiros 4.2. Literais de Ponto Flutuante 4.3. Literais Booleanos 4.4. Literais de Caracteres 4.5. Literais de Strings 5. Variveis 5.1. Declarao 5.2. Escopo de Variveis 5.2.1. Aninhamento de Escopos 6. Exibindo Dados na Tela
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 3 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Captulo 3: Operadores
1. Introduo 2. Operadores de atribuio 3. Operadores aritmticos 3.1. Operadores aritmticos de atribuio reduzida 4. Operadores incrementais e decrementais 5. Operadores relacionais 6. Operadores lgicos bit a bit 6.1. Operador and 6.2. Operador or 6.3. Operador xor 6.4. Operador not bit a bit 7. Operadores lgicos 8. Operador instanceof 9. Operador ternrio 10. Precedncia dos operadores
Captulo 4: Controle de Fluxo
1. Introduo 2. Comandos de deciso 2.1. if/ else 2.2. switch / case 3. Comandos de laos de repetio 3.1. While 3.2. Do / while 3.3. For 3.4. Break 3.5. Continue 3.6. Instrues rotuladas 3.7. Instrues no-rotuladas
Captulo 5: Orientao a objetos
1. Introduo 2. Abstrao 3. Objetos 4. Classes 5. Princpios da orientao a objetos
Captulo 6: Classes
1. Introduo 2. Encapsulamento 3. Tipos construdos 4. Instanciao 5. Atribuio entre objetos de tipos construdos 6. Inicializao dos atributos de uma classe 7. Acesso PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 4 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 7.1. Padro 7.2. Pblico 8. Superclasse 9. Classe Object 10. Classes abstratas 10.1. Mtodos abstratos 11. Classes finais
Captulo 7: Mtodos
1. Introduo 2. Estrutura dos mtodos 3. Criando mtodos 4. Chamada de mtodos 5. Passagem de parmetros: por valor e por referncia 6. Comando return 7. Acesso a mtodos 8. Modificadores de mtodos 9. Membros estticos 9.1. Atributos estticos 9.2. Mtodos estticos 10. Mtodo main() 11. Sobrecarga de mtodos 12. Uso do this 1 3. Mtodos recursivos
Captulo 8: Construtores
1. Introduo 2. Construtor padro 3. Princpios dos construtores
Captulo 9: Herana
1. Introduo 2. Criando uma herana 2.1. Acesso aos membros da classe pai 2.2. Acesso aos Membros da classe pai com super 2.3. A Classe pai com sobrecarga do mtodo construtor 3. Relacionamento baseado na herana 4. Relacionamento baseado na utilizao
Captulo 10: Polimorfismo
1. Introduo 2. Run-time binding 3. O uso do polimorfismo
Captulo 11: Arrays
1. Introduo PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 5 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 2. Construo de arrays 2.1. Acesso aos elementos do vetor 2.1.1. Acesso aos elementos do vetor atravs do for aprimorado 2.2. Array com vrias dimenses 2.3. Passando um array como parmetro 2.4. Criando array com tipos construdos
Captulo 12: Interfaces
1. Introduo 2. Varivel de referncia 3. Variveis inicializadas
Captulo 13: Pacotes
1. Introduo 2. Package 3. Import
Captulo 14: Classes String, Math e Wrapper
1. Introduo 2. Classe String 2.1. Inalterabilidade 2.2. Alguns mtodos da classe String 2.3. Classe StringBuffer 2.3.1. Alguns mtodos da classe StringBuffer 2.4. Mtodos encadeados 3. Classe Math 3.1. Alguns mtodos da classe Math 4. Classe Wrapper 4.1. Construtores Wrapper 4.2. Mtodos de converso 4.2.1. Mtodos valueOf() 4.2.2. parseOf() 4.2.3. Value() 5. Autoboxing e auto-unboxing
Captulo 15: Swing
1. Introduo 2. Eventos 2.1. Event Listener 2.2. Eventos do teclado 2.3. Eventos do mouse 2.3.1. Tratamento de eventos 2.3.2. Classes adaptadoras 2.3.3. Classes internas 3. Criando componentes utilizando o swing 4. Gerenciadores de layout 5. Componentes PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 6 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Captulo 16: Applets
1. Introduo 2. Principais mtodos 3. Restries de applets 4. Applet x Awt x Swing 5. Passando parmetros para um applet 6. Imagens e sons
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 7 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Captulo 1
1. Introduo
Java uma linguagem de programao resultante de um projeto desenvolvido em 1991 por um grupo de engenheiros da empresa Sun Microsystems. Na verdade, inicialmente, esses engenheiros tinham a misso de criar uma linguagem que seria utilizada em diversos aparelhos, tais como fornos e telefones. Eles deveriam criar uma linguagem que permitisse a comunicao entre os aparelhos de uma casa e que gerasse pequenos cdigos para serem executados nos mais diversos aparelhos. A fim de desenvolver esse projeto, os engenheiros optaram por utilizar a linguagem C++ em conjunto a um conceito de mquinas virtuais. A opo por essa linguagem deve-se ao fato de ela ser muito poderosa e ser orientada a objetos, caractersticas que indicavam a escolha mais adequada. Quanto ao conceito de mquinas virtuais, esta foi a soluo encontrada para a execuo de diversas arquiteturas, em que cada um dos fabricantes seria responsvel por suportar determinadas funes do programa. No entanto, a linguagem que, em princpio, seria desenvolvida para ambientes residenciais com a finalidade de permitir que aparelhos eletrodomsticos fossem capazes de se comunicar, tornou-se uma das linguagens de programao mais conhecidas e utilizadas no mundo. Os criadores de Java, ento, desenvolvem a primeira plataforma de software em carter mundial, a qual permite que os aplicativos desenvolvidos sejam executados em quaisquer micros. O objetivo desses criadores desenvolver uma linguagem que apresente as seguintes caractersticas:
Fcil aprendizado A linguagem Java foi criada com poucas construes a fim de permitir que eventuais desenvolvedores sejam capazes de aprend-la de forma simples e rpida.
Familiaridade Esses criadores tambm tinham como objetivo desenvolver uma linguagem familiar aos programadores de outras linguagens, uma vez que isso ajudaria na migrao entre linguagens. Contudo, para criar uma linguagem familiar e com poucas construes, eles optaram por excluir recursos presentes em C e C++, essencialmente aqueles pouco utilizados e que no auxiliam em boas prticas de programao.
Dentre os recursos excludos que permitiram a simplificao de Java, temos a possibilidade de manipulao dos ponteiros, bem como sua aritmtica. Esses ponteiros, que tm a funo de alocar memria, permitem o constante surgimento de problemas, tais como bugs. Alm disso, os ponteiros so desnecessrios linguagem Java na medida em que ela no conta com structures, e os objetos representam seus arrays e strings.
Embora a linguagem Java apresente simplicidade, ela bastante completa e poderosa, e pode ser utilizada em trs frentes de programao distintas, que so:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 8 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Frentes de Programao Descrio Applets Os applets so programas criados por meio de recursos oferecidos somente pela linguagem Java. Como esses programas no podem ser executados sozinhos, eles devem ser inseridos em pginas da Web. Uma vez inseridos em uma pgina HTML, esses programas so executados de forma automtica no momento em que tal pgina aberta. Essa pgina, porm, deve ser aberta em um navegador que esteja habilitado para a linguagem Java, dentre os quais temos o Internet Explorer e o Mozilla FireFox. Aplicativos Os aplicativos escritos em diversas linguagens, como C, C++, Visual Basic, entre outras, tambm podem ser facilmente escritos em Java. A vantagem dessa criao deve-se ao fato que um aplicativo escrito em Java pode ser executado em quase todos os micros disponveis no mercado atualmente.
Sistemas Embutidos Sistemas embutidos so aqueles utilizados em outros aparelhos eletrnicos diferentes dos microcomputadores, e Java, devido aos seus recursos e caractersticas, uma linguagem utilizada para o desenvolvimento desses sistemas.
2. Caractersticas
Aps termos visto alguns detalhes a respeito da criao da linguagem Java, teremos, nos subtpicos seguintes, uma breve apresentao de suas caractersticas.
2.1. Orientada a objetos Uma linguagem orientada a objetos aquela na qual os programas so formados por objetos capazes de executar suas prprias operaes e propriedades. Isso significa dizer que essa linguagem possui dados cuja estrutura determinada em conjunto s funes e mtodos que podem ser executados.
2.2. Interpretada e compilada Quando desenvolvemos programas utilizando a linguagem de programao Java, para que esses programas sejam executados em um micro, preciso realizar dois processos distintos: a interpretao e a compilao, diferentemente das outras linguagens, cujos programas precisam ser ou compilados, ou interpretados. A compilao um processo por meio do qual o programa transformado em bytecode, uma linguagem intermediria. O cdigo gerado por essa transformao interpretado posteriormente por um interpretador Java. Destacamos que ao passo que a compilao do programa realizada somente uma vez, sua interpretao ocorre a cada execuo desse programa. Devido ao fato de ser uma linguagem interpretada, Java independente de plataforma. Mais especificamente, temos que o compilador Java responsvel por gerar o bytecode, um cdigo cuja execuo realizada por uma JVM (Java Virtual Machine), uma mquina virtual. Nesta JVM encontra-se o interpretador Java, o qual utilizado na execuo do bytecode para rodar o programa. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 9 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Por conta de o cdigo bytecode no ser dependente de plataforma, a execuo dos programas Java pode ocorrer em quaisquer plataformas para as quais a JVM seja suportada. Em Java, o processo correspondente linkagem envolve somente o carregamento de novas classes no ambiente de execuo da JVM, o que efetuado em tempo de execuo. Destacamos que, em uma mquina virtual JVM, encontramos no apenas o interpretador, mas tambm o sistema de run-time Todo o processo que envolve compilao, linkagem e execuo de um programa, o qual comum em diversas linguagens de programao, no ocorre com o Java, o que possibilita minimizar o tempo utilizado para o desenvolvimento de programas nesta linguagem. Isso possvel porque a linkagem um processo quase inexistente em ambientes interpretados. Entendemos por bytecode um cdigo resultante da compilao de uma programa desenvolvido em Java. O bytecode um cdigo que pertence a uma mquina virtual, cuja idealizao dos criadores da linguagem de programao Java. Por conta desse cdigo, Java tornou-se uma linguagem mais rpida do que aquelas que so simplesmente interpretadas. Ainda, temos o arquivo bytecode que possui a extenso .CLASS e gerado aps a realizao do processo de compilao de uma classe. Esse arquivo pode ser portado para uma outra plataforma sem que um novo processo de compilao do cdigo fonte tenha que ser realizado.
2.2.2. JVM JVM refere-se a uma mquina virtual que cada uma das mquinas deve possuir a fim de que, depois de realizado o processo de compilao, as classes sejam executadas. Alm da mquina JVM, tambm podemos ter o JDK (Java Development Kit) instalado nas mquinas para a execuo de classes.
2.2.3. JavaAPI Definimos Java API (Application Programming Interface) como sendo uma coleo de componentes de software, os quais englobam: Estruturas que permitem o desenvolvimento de aplicaes grficas; Estruturas que permitem manipular arquivos; Entre outros. A organizao de uma API realizada como um conjunto de bibliotecas, as quais contm interfaces e classes, e so chamadas tambm de pacotes.
Nota: O arquivo src.zip que est contido dentro do Kit (JSDK) possui todas as classes e interfaces da Linguagem Java
2.3. Multiplataforma A execuo de uma aplicao Java pode ocorrer em qualquer sistema para o qual haja uma implementao da mquina virtual JVM. Isso possvel porque a compilao de um programa desenvolvido em Java gera um bytecode. Essa caracterstica de ser executada em diversos sistemas essencial para as aplicaes que so distribudas atravs de redes heterogneas e, inclusive, que so distribudas atravs da Internet.
2.4. Robusta e confivel Os softwares que so desenvolvidos em linguagem Java apresentam um grau considervel de confiabilidade e robustez, embora isso no permita desconsiderar a utilizao de procedimentos capazes de manter o software em segurana. A linguagem de programao Java apenas elimina alguns tipos de erros de programao comuns, facilitando o desenvolvimento de softwares confiveis. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 10 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Os itens que caracterizam bastante a confiabilidade e a robustez da linguagem Java so o manuseio de excees e o gerenciamento de memria automtico (garbage collector). Observemos, a seguir, outros itens capazes de justificar essas caractersticas de Java;
Robustez A robustez da linguagem Java deve-se ausncia de ponteiros e sua aritmtica, bem como s checagens realizadas em tempo de execuo. Uma vez que no possui ponteiros, diversos bugs relacionados aos mesmos so eliminados, o que permite a otimizao da robustez apresentada por essa linguagem. Quanto checagem em tempo de execuo, esta realizada sobre todos os acessos efetuados a arrays e strings e sobre as converses de tipos de objetos. A checagem de arrays e strings realizada com a finalidade de verificar se ambos encontram-se dentro dos limites corretos e, portanto, no h a possibilidade de que a memria seja sobrescrita e que os dados sejam corrompidos. J a checagem das converses dos tipos de dados realizada no intuito de verificar se as mesmas so adequadas.
Confiabilidade A confiabilidade da linguagem Java envolve a declarao explcita de mtodos e a tipagem forte, conhecida por strong typing. Esta tipagem permite que, em tempo de compilao, seja realizada uma verificao capaz de eliminar eventuais problemas ocorridos na combinao de tipos. Em se tratando da declarao explcita de mtodos, esta exigida pela linguagem Java a fim de que o compilador possa detectar eventuais erros ocorridos durante uma chamada ao mtodo. Alm disso, diversas tolerncias em tempo de compilao esto presentes em Java. Essas tolerncias foram implementadas para que a linguagem Java preservasse sua compatibilidade com outras linguagens, como C e C++. Todas essas caractersticas de Java fazem com que ela se torne uma linguagem mais confivel.
2.4.1. Garbage collector Antes de definirmos o que vem a ser garbage collector, preciso compreender o processo de criao de objetos em uma linguagem orientada a objetos. Sendo assim, temos que esse processo de criao faz com que diversos segmentos de memria sejam ocupados de forma dinmica. No entanto, para que a dimenso do desenvolvimento de aplicaes por meio dessa linguagem no seja limitada, o espao utilizado deve retornar ao sistema a fim de que seja utilizado novamente. O garbage collector, tambm chamado de gerenciamento automtico de memria, uma das caractersticas mais essenciais de Java. Ele adotado por essa linguagem a qual aps verificar se os objetos no possuem referncias vlidas, recupera os espaos que no so mais utilizados pelos objetos para que os programadores no tenham preocupaes quanto remoo dos mesmos. Isso permite que eventuais problemas com relao alocao e desalocao de memria sejam evitados, bem como impede que ocorra o vazamento de memria, chamado de memory leak. O memory leak ocorre da seguinte maneira: Depois de o programa ter sado, a memria no desalocada pelo objeto; Ento, esse espao permanece reservado, porm, sem que esteja sendo utilizado. Vale destacar que a JVM responsvel por manter em um contador as informaes relacionadas a todas as referncias que so feitas a um determinado objeto a fim de que, dessa maneira, ela saiba a quantidade de referncias que esto apontando para uma certa parte da memria. Assim que o contador zerado, isso indica que o objeto para o qual as referncias foram feitas pode ser eliminado da memria. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 11 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Embora os programadores no sejam capazes de atuar sobre o garbage collector de forma explcita, eles podem invocar o mtodo gc() pertencente classe java.lang.System a fim de recomendar ao sistema que o garbage colletorseja executado. Outra recomendao que pode ser feita ao sistema por parte dos programadores envolve a execuo do mtodo finalize() referente aos objetos que foram eliminados. Para isso, preciso que os programadores utilizem o mtodo runFinalization pertencente mesma classe do mtodo gc(), a java.lang.System. Os programadores tambm so capazes de indicar ao garbage collector o fato de um determinado objeto no mais ser necessrio e, portanto, poder ser excludo. Para isso, preciso que eles removam a referncia a esse objeto de forma explcita. Em suma, o garbage collector o responsvel por remover os objetos que no so utilizados a fim de tornar disponvel a memria alocada que est armazenada. Quando trabalhamos com a linguagem Java, a memria alocada com operaes medida que o programa executado.
2.4.2. Exception handling A robustez dos programas desenvolvidos em Java tambm se deve ao exception handling, ou manuseio de excees, que uma caracterstica bastante importante para essa linguagem porque permite simplificar as tarefas de manipulao e recuperao de erros. A simplificao dessas tarefas possvel no somente por conta do exception handling, mas tambm com o auxlio dos comandos try, catch e finally, os quais possibilitam o agrupamento em um s local do cdigo de manipulao de erros como um todo. Definimos excees como sendo sinais de ocorrncias inesperadas, tais como '\. M ' : . \ erros e problemas.
2.5 Segura A segurana uma das caractersticas mais difundidas de Java. Essa linguagem possui diversas camadas de controle de segurana que so responsveis por oferecer proteo contra cdigos maliciosos. Embora no exista uma linguagem ou um ambiente que oferea segurana total, Java capaz de se defender contra grande parte das tcnicas que vm sendo utilizadas com a finalidade de quebrar a segurana de um programa. Ainda, importante ressaltar que a segurana oferecida pela linguagem Java foi testada no somente por vrios especialistas da rea de segurana, mas tambm por hackers, o que permitiu identificar brechas na segurana das primeiras verses e consert-las. Dessa forma, eventuais brechas que venham a surgir futuramente tambm sero reparadas. A seguir. Veremos quais so as camadas de controle de segurana presentes na linguagem Java:
Acesso memria Tendo em vista que, no nvel mais baixo, no possvel acessar a memria de forma direta, diversos ataques contra a segurana e cdigos maliciosos so evitados. Como principais recursos de defesa, os programas desenvolvidos em Java no tm permisso para forjar ponteiros, acessar a memria que se encontra alm de arrays e strings, bem como no podem estourar os arrays.
Assinatura digital A assinatura digital um recurso de segurana que foi implementado somente a partir da verso 1.1 da linguagem Java. Essa assinatura, quando anexada ao cdigo Java, permite que a origem desse cdigo seja assegurada contra falsificaes na medida em que ele criptografado. Sendo assim, torna-se possvel determinar se algum ou alguma instituio confivel. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 12 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Uma vez determinado como pessoa ou organizao confivel, seus cdigos que possuem assinatura digital podem ser executados em uma sandbox sem quaisquer problemas ou restries.
Sandbox (modelo de caixa de areia) Em uma sandbox, os cdigos cuja origem desconhecida podem ser executados sem que haja quaisquer riscos para o ambiente Java. Isso possvel porque a execuo desse cdigo ocorre em uma sandbox, a qual o mantm isolado, fazendo com que ele tenha diversas restries. A implementao de tais restries realizada pela classe SecurityManager, qual todas as classes de Java que executam operaes arriscadas pedem suas permisses. Sendo assim, para qualquer chamada que realizada por um cdigo de origem desconhecida, uma exceo lanada, evitando que a operao seja realizada.
Verificao do bytecode A verificao do bytecode um processo realizado pelo interpretador da linguagem Java. Essa verificao, que realizada sobre os cdigos de origem desconhecida que so carregados, garante que esses cdigos formem-se de maneira adequada. Garantir que o cdigo seja formado de maneira adequada significa garantir que o mesmo no ultrapasse os limites da pilha, tanto o limite inferior (stack underflow) quanto o superior (stack overflow), bem como significa assegurar que um bytecode ilegal no seja implementado. A verificao de bytecode capaz de impedir que um cdigo corrompido tire proveito de eventuais brechas presentes na implementao do interpretador. Por conta de sua associao com a Internet, a segurana da linguagem de programao Java de suma importncia, uma vez que sem a mesma, os usurios no poderiam confiar nos cdigos de sites desconhecidos que so baixados da Internet, o que ocorre com freqncia.
2.6. Portvel Uma das caractersticas da linguagem Java ser portvel. Isso significa dizer que, alm de ser interpretada, ela uma linguagem capaz de definir um formato bytecode que seja padro e, ainda, que apresente neutralidade em relao s arquiteturas existentes. Destacamos; tambm; que em sua especificao, Java no contm aspectos que dependem de implementao. importante ter em mente que o fato de a linguagem Java ser independente de plataforma deve-se gerao dos bytecodes. Esses arquivos so resultado da transformao do cdigo em alto nvel realizada a partir da compilao do cdigo Java. Essa compilao efetuada pelo compilador javac ou javac_g.
2.7. Multithreaded Dentre as caractersticas de Java, temos que ela uma linguagem mutithreaded, o que facilita a criao de aplicativos tambm multithreaded, nos quais diversas linhas de execuo so rodadas simultaneamente. Quando diversas linhas de execuo (threads) so utilizadas, a performance interativa de aplicativos grficos otimizada.
3. Princpios da linguagem essencial que os princpios da linguagem Java, os quais sero descritos a seguir, sejam considerados no momento em que o programador estiver desenvolvendo aplicaes nesta linguagem.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 13 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
3.1. Case sensitive Case sensitive um princpio da linguagem de programao Java que indica que esta capaz de distinguir letras em caixa alta (maisculas) e letras em caixa baixa (minsculas).
3.2. Nome do arquivo O nome do arquivo tem a extenso .java e, preferencialmente, deve ser o mesmo nome de uma das classes declaradas dentro deste arquivo, por exemplo, para a class Cliente teremos o arquivo com o nome Cliente.Java. Seria um erro definir a classe como class Cliente e o nome do arquivo como cliente.Java.
3.3. Nomenclatura Os nomes atribudos aos identificadores devem ser iniciados plos caracteres underline (_), pelo cifro ($), ou por letras. Dentre os identificadores, temos as classes, os mtodos, as variveis, entre outros.
3.4. Estrutura O incio de um bloco de cdigo ou de uma classe sempre ser marcado pela abertura de chaves - {, e o trmino, pelo fechamento de chaves }. Quanto ao trmino dos comandos, este, em geral, marcado pelo sinal de ponto-e-vrgula
3.5. Comentrios As linhas de comentrio podem ser iniciadas de formas distintas, dependendo dos seguintes fatores:
Comentrio de somente uma linha Comentrios que no ultrapassam uma linha devem ser iniciados por duas barras (//).
Comentrio de mais de uma linha Comentrios que ultrapassam uma linha ou, ainda, blocos que no devem ser executados so marcados por barra e asterisco no incio (/*), e asterisco e barra no final (*/).
Ajuda em HTML Comentrio para gerar arquivo de ajuda em HTML com o Javadoc. Inicia com uma barra e dois asteriscos (/** ) e termina com um asterisco e uma barra ( */).
3.6. Identificadores reservados Os identificadores reservados em Java so palavras especiais que tm uma funcionalidade para o compilador e que no podem ser utilizadas como nome de classes, mtodos ou variveis.
Nota: As palavras reservadas so escritas em caixa baixa.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 14 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
A seguir, listamos as palavras reservadas da verso 5.0: Palabras reservadas abstract instanceof jassert (introduzida no Java 1.4) int boolean interface break long byte native case new catch null char package class private const (no utilizada) protected continue public default return do short double static else strictfp enum (introduzida no Java 5.0) super extends switch false synchronized final this finally throw float throws for transient goto (no utilizada) true if try implements void import volatile while
Literais reservados De acordo com a Java Language Specification, null, true e false so tecnicamente chamados de valores literais. Se tentarmos criar algum identificador com estes valores, haver um erro de compilao.
4. Estrutura bsica de uma classe
Apresentaremos, a seguir, a estrutura bsica de uma classe:
Em que as linhas: PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 15 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
1. Define o nome da classe; 2. Primeira chave aps a definio do nome da classe e que especifica o corpo (incio do bloco) da classe. Tudo o que fizer referncia classe dever estar entre o primeiro abrir de chaves e o ltimo fechar de chaves; 3. Definio do mtodo main(). As instrues public, static, String, args[ ] sero explicadas oportunamente; 4. Abertura da chave (bloco) referente aos comandos que estaro dentro do mtodo main(); 5. Declaraes de variveis dentro do mtodo main(); 6. Comandos dentro do mtodo main(); 7. Fecha chave (bloco) do mtodo main(); 8. Fecha chave (bloco) da classe.
5. Verses do Java
A verso mais atual de Java a 1.6. Vale destacar que, a partir da verso 1.2, na qual as alteraes foram consideravelmente grandes, o nome que denomina a linguagem em questo passou a ser Java 2, indicando, assim, o incio de sua segunda edio. A ltima verso.do Java conhecida como Java 6. A partir da segunda edio de Java, seus pacotes sofreram grandes alteraes a fim de que fossem reestruturados. Trs so os tipos de pacotes com os quais a linguagem Java pode contar atualmente: Java EE 5; J2ME; e Java SE 5.0. Na tabela a seguir, teremos a descrio de cada um desses pacotes:
Pacotes Descrio Java EE 6.0 (Java Enterprise Edition 6.0)
Este pacote conta com os servlets e destinado ao desenvolvimento de grandes aplicaes, as quais utilizam os servidores de aplicao e o EJB (EnterpriseJava Beans). O Java 2 Software Development Kit Enterprise Edition, tambm chamado de J2SDKEE, o responsvel pela implementao padro deste pacote. J2ME (Java 2 Micro Edition) Este pacote a especificao da linguagem Java na qual esto contidas APIs. Essas APIs apresentam as funcionalidades necessrias para que sejam desenvolvidas aplicaes aos dispositivos de pequeno porte. Dentre esses dispositivos temos telefones celulares, agendas eletrnicas e diversos aparelhos que possuem a KVM, ou seja, a Mquina Virtual destinada aos dispositivos de pequeno porte. Java SE 6u1 (Java Standard Edition 6.0)
Este pacote destinado criao da maioria das aplicaes referentes s estaes de trabalho e aos desktops. a verso bsica e, portanto, a normalmente utilizada.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 16 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
A fim de que possamos saber qual a verso de Java que se encontra instalada no micro, preciso realizar o seguinte:
1. Abrir o prompt do DOS; 2. Digitar java -version; 3. Pressionar a tecla ENTER.
As verses de Java para os sistemas Windows, Solaris e Linux encontram-se no site http://java.sun.com e podem ser obtidas a partir do mesmo. Os endereos da Web para baixar os Kits so:
Para que possamos desenvolver aplicativos a partir da linguagem Java, precisamos contar com o conjunto de ferramentas JSDK (Java Servlet Development Kit) instalado na mquina. Esse JSDK j contm o JRE (Java Runtime Environment). Definimos JRE como sendo uma mquina responsvel por realizar as interpretaes Java, e por meio da qual no possvel realizar a compilao do cdigo Java. Sendo assim, uma mquina JRE indicada queles que somente necessitam executar aplicaes Java e contam com um pacote em cujo contedo encontram-se a mquina virtual e as bibliotecas necessrias para essa execuo. Alm da mquina JRE, o conjunto de ferramentas de desenvolvimento Java tambm contm o compilador, a JVM, algumas bibliotecas, cdigos utilizados como exemplos e o appletviewer, o qual permite a execuo de applets.
7. Ambientes de desenvolvimento
A linguagem de programao Java conta com IDEs, que so ambientes de desenvolvimento grfico capazes de auxiliar no desenvolvimento de sistemas de maneira adequada. A seguir, relacionaremos alguns dos principais ambientes de desenvolvimento de Java:
Symantec Caf (www.symantec.com): Inprise Jbuilder (http://www.borland.com/jbuilder); Kawa (www.tek-tools.com): Sun ONE (http://java.sun.com); Ecl i ps (http ://www. ed i pse. o rg); NetBeans (http://www.netbeans.org).
8. Compilando e executando
Para que possamos compreender o processo de compilao e execuo de uma classe em Java, preciso abrir um editor de texto e digitar o exemplo descrito a seguir:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 17 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
class Exemplo1 { public static void main(String args[ ]) { System.out.println("Meu Primeiro Programa em Java!"); } }
Aps digitar o exemplo, salv-lo como Exemplo1.java. J para a compilao desta classe, devemos abrir o prompt do DOS e digitar javac Exemplei.java, em que:
javac o comando do compilador Java.
Exemplo1.java Refere-se ao nome do arquivo a ser compilado.
Uma vez concludo o processo, o compilador javac gera um arquivo de classe chamado Exemplo1.class no diretrio atual.
Caso no haja erros aps o processo de compilao, digitar java Exemplo1 ainda no prompt do DOS para executar o programa.
9. Path
Caso seja exibida uma mensagem de erro no momento da execuo do javac ou do java, isso significa que esses programas no foram encontrados pelo sistema. Normalmente isso ocorre devido falta da informao no path do computador.
Para solucionar esse problema, preciso procurar ajuda no menu do sistema operacional com relao aos processos de alterao ou adio de elementos no path.
Quando trabalhamos com os sistemas operacionais Windows XP/2000, basta efetuar os seguintes passos:
1. Clicar no menu Iniciar. Em seguida, clicar em Configuraes, Painel de Controle e Sistemas;
2. Na janela Propriedades do Sistema, clicar na guia Avanado e depois no boto Variveis de Ambiente;
3. Para alterar o path, basta edit-lo (muito provavelmente ele j existe) e mudar o valor para %PATH%;%JAVA_HOME%\bin;
Por exemplo, levando em considerao que o Java foi instalado no diretrio c:\j2sdk1.4.0_05, a diretiva ficar assim;
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 18 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Exerccios complementares
1. Quais so as frentes de programao para Java?
2. Cite as caractersticas do Java:
3. Qual a funo do Garbaget Collector?
4. O que significa Multithreaded?
5. Qual a diferena entre JSDK e JRE?
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 19 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 2
1. Introduo
O Java, assim como outras linguagens de programao utilizadas atualmente, trabalha com diversos tipos de dados, como byte e char. Ainda, lidamos com valores literais, usados para a criao de valores constantes, e variveis, utilizadas por um programa em Java como unidade bsica de armazenamento. Nos tpicos que seguem, estudaremos em detalhes os tipos de dados, valores e variveis empregados pelo Java. Aprenderemos, tambm, como usar o comando System.out.println() para visualizar dados na tela.
2. Tipos Primitivos
O Java tido como uma linguagem de programao de grande robustez, uma qualidade adquirida pelo fato dela apresentar como caracterstica a tipagem forte. A linguagem em questo tem a capacidade de trabalhar com uma grande variedade de tipos de dados, cuja faixa de valores altamente definida. Um inteiro no Java, por exemplo, no sofre variaes conforme ele executado em ambientes diferentes. Por apresentar valores bem definidos, o Java mostra-se uma linguagem de grande portabilidade. A portabilidade a capacidade que o programa possui de ser executado em outras arquiteturas de computador. No caso de programas em Java, podemos presenciar uma ligeira queda de desempenho quando os mesmos so executados em alguns tipos de ambientes. Contudo, esta perda de performance, provocada pela complexa checagem do tamanho de um inteiro, vista como uma consequncia normal da portabilidade. Outro motivo que explica a popularidade do Java a baixa probabilidade de ocorrncia de erros de cdigo. A diminuio de erros de cdigo est relacionada ao trabalho de verificao que o compilador Java exerce sobre as atribuies. Sem levar em considerao se estas ltimas so explcitas ou por passagens de parmetro com uso de mtodos e chamadas, o compilador inspeciona se os tipos de expresses e parmetros so compatveis. Caso estejamos acidentalmente tentando atribuir um valor de ponto flutuante a um inteiro, tarefa no aceita pelo Java, somos informados pelo compilador que um tipo de erro foi detectado. Depois que um possvel erro tenha sido detectado, cabe a ns sanar tal irregularidade, a fim de que o compilador seja capaz de concluir o processo de compilao da classe. Apesar do Java ser uma linguagem orientada a objetos, os tipos elementares no so objetos, e sim valores individuais, muito semelhantes aos tipos simples utilizados por boa parte das linguagens de programao estruturadas Na tabela a seguir, so apresentados os oito tipos de dados, alm de um especial, utilizados em Java:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 20 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Tipo Descrio byte 1byte-8bits -128a 127 Nmeros inteiros short 2 bytes - 16 bits -32768 a + 32767 Nmeros inteiros Int 4 bytes-32 bits -2147483648 a 2147483647 Nmeros inteiros long
8 bytes - 64 bits
-922337203685477808 a 922337203685477807 Nmeros inteiros
float
4 bytes - 32 bits
Aproximadamente 3.40282347E+38 Ponto flutuante
double
8 bytes - 64 bits
Aproximadamente 1.79769313486231570E+308 Ponto flutuante
char
Caracteres Unicode 16 bits 0 a 256
Caracteres
boolean Possuem valores true e false Boleano String Classe
3. Type Casting
O Java dispe de uma operao especial chamada type casting, por meio da qual podemos provocar uma converso que no pode ser feita diretamente. Um tipo bsico pode normalmente ser promovido a um outro tipo caso no haja perda de informaes durante o processo. Neste caso, temos uma converso por alargamento, que s acontece quando temos dois tipos compatveis envolvidos na converso e quando o tipo de destino grande o suficiente para armazenar os valores do tipo original. J na converso de um tipo mais simples para um mais complexo, devemos fazer uso do type casting. Pelo processo normal, geraramos uma exceo ao tentar converter um caractere (tipo mais simples) para seu tipo inteiro (tipo mais complexo), como a seguinte:
int i = 66; char c = i;
Com o type casting, informaremos ao compilador do Java o fato de que estamos cientes dos riscos de uma possvel perda de informao. Assim, a converso realizada.
int i = 66; char c = (char) i;
Para criarmos um caractere baseado em seu cdigo ASCII, que o valor inteiro correspondente, executamos a operao que segue:
class Cap2_Ex1 { public static void main(String args[]) { int i = 66; char c = (char)i; System.out.println("o numero " + i + " corresponde a letra " + c); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 21 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio O uso da operao especial em questo s ser possvel quando os tipos envolvidos na converso obedecerem a uma relao de hierarquia. Quando fazemos a diviso de um inteiro por outro inteiro no Java, temos como resultado um outro inteiro, mesmo quando utilizada uma varivel real. Tomemos como exemplo os seguintes valores:
class Cap2_Ex2 { public static void main(String args[ ]) { int x = 7, y = 2; float resultado = x / y; System.out.println (" Resultado:"+ resultado); } }
Considerando a conduta do Java em gerar um inteiro a partir da diviso de um inteiro por outro, temos 3 como varivel resultado de 7/2, sendo que pela lgica seria 3.5 (metade de 7). Se quisermos obter um resultado real desta diviso de variveis ou valores inteiros, preciso usar o type casting, por meio do qual o numerador ou o denominador ser convertido para um tipo real, forando para que o resultado seja um valor do mesmo tipo real. Isto feito por meio da seguinte operao (o tipo para o qual desejamos fazer a converso, tratado como operador cast, deve ser especificado entre parnteses):
class Cap2_Ex3 { public static void main(String args[]) { int x = 7, y = 2; float resultado = (float)x/y; System.out.println("Resultado: " + resultado); } }
3.1. Promoo automtica
Quando, em uma expresso, temos um resultado do termo intermedirio que apresenta um alcance maior do que o resultado dos operandos byte, podemos empregar a promoo automtica.
Consideremos o seguinte exemplo:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 22 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap2_Ex4 { public static void main(String args[]) { byte x = 30; byte y = 70; byte z = 100; int i = (x * y)/z; System.out.println ("Resultado:" + i); } }
De acordo com o cdigo anterior, os operandos byte tm um alcance menor do que o apresentado pelo resultado do termo intermedirio. Ao aplicarmos a promoo automtica, teremos o resultado x * y, cujo valor 2100 (30 * 70). Este resultado utiliza tipos ints, e no bytes.
3.2. Upcast e downcast
Outro mecanismo a ser destacado o upcast, o qual est diretamente relacionado ao uso do polimorfismo. Por meio desse mecanismo, uma parte das informaes a respeito de um objeto permanece inacessvel durante um certo perodo. De acordo com a perspectiva da orientao a objetos, o processo oferecido pelo mecanismo upcast fornece segurana na medida em que o tamanho apresentado pela interface da classe base nunca maior do que o tamanho apresentado pela interface referente classe derivada. J o mecanismo downcast deve ser utilizado com o intuito de recuperar a referncia para o tipo original de um determinado objeto. Com isso, possvel obter acesso funcionalidade desse objeto como um todo. Vale destacar, porm, que o mecanismo downcast deve ser utilizado somente aps termos assegurado que o objeto cuja referncia est sendo convertida , de fato, do tipo especificado. Caso no seja do tipo determinado, a manipulao desse objeto no ser adequada depois de realizada a converso no ser adequada. Por meio do mtodo getClass(), indicaes a respeito da classe qual um determinado objeto pertence podem ser obtidas, bem como por meio do mecanismo RTTI (Run-Time Type Identification), por sua vez, permite verificar quaisquer operaes referentes ao downcast so checadas. A sintaxe do mecanismo downcast a seguinte:
Ref_orig = (Tipo_orig) Ref_upcast;
4. Valores Literais
O valor literal utilizado para que possamos criar um valor constante em Java, tambm conhecido como constantes em outras linguagens de programao. Trata-se de uma representao literal do valor, constante, e pode ser aplicada em qualquer parte cujo tipo aceitvel.
4.1. Literais Inteiros
Um valor literal inteiro definido como qualquer valor numrico inteiro, e os tipos mais utilizados so os decimais (base10), octais (base 8) e hexadecimais (base 16). PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 23 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio A base hexadecimal bastante empregada por programadores. Tamanhos de palavras mltiplas de 8, como 8, 16, 32 e 64 bits se encaixam muito bem nesta base. Os algarismos utilizados para representar a base hexadecimal so 0,1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Usamos um 0 (zero) antes do valor para indicar que se trata de um constante hexadecimal e aplicamos as letras de A a F, maisculas ou minsculas, para representar dgitos hexadecimais, que variam de 10 a 15. Um valor octal representado pelo 0 em frente ao algarismo, que pode compreender os nmeros 0, 1, 2, 3, 4, 5, 6 e 7. Toda vez que um valor literal inteiro declarado, um tipo int criado. Este tipo int representado por um inteiro de 32 bits. Caso um literal esteja de acordo com a regra de valores do tipo byte ou long, podemos atribuir normalmente um literal inteiro a uma varivel, como byte ou long, sem que haja problemas de incompatibilidade de tipos. Da mesma forma, podemos atribuir uma varivel long a um literal inteiro, desde que o literal long seja explicitamente especificado ao compilador do Java. Para tal, inclumos a letra L, seja em caixa baixa ou alta, ao valor literal.
4.2. Literais de Ponto Flutuante
Em um programa em Java, uma prtica comum ter que representar valores decimais compostos de frao. Para esta tarefa, contamos com nmeros de ponto flutuante. Em Java, o valor padro dos literais de ponto flutuante o tipo double. Contudo, podemos acrescentar constante um F, maisculo ou minsculo, para especificar um literal como float, cujo tipo padro usa 32 bits de armazenamento contra 64 bits do tipo padro double. Os nmeros de ponto flutuante podem ser exibidos em:
Notao comum; Caracterizada por um componente inteiro, seguido de um ponto decimal e pelo componente fracional. Exemplo: 3.692.
Notao cientfica: Trata-se de um nmero de ponto flutuante em notao comum acompanhado de um sufixo indicando a potncia de 10 pela qual o nmero ser multiplicado. A letra E, maiscula ou minscula, representa o expoente, e seguida por um nmero decimal, positivo ou negativo. Exemplo: 4.0E+05, o mesmo que 4 * 10^5.
4.3. Literais Booleanos
Os valores literais boolean em Java envolvem apenas os valores lgicos true (verdadeiro) e false (falso), sendo que estes no so convertidos para nenhuma representao numrica. Os literais boolean s podem ser utilizados em expresses com operadoras boolean ou, ento, atribudos a variveis declaradas como boolean.
4.4. Literais de Caracteres
Como citado anteriormente, uma das aplicabilidades do Java a criao de Applets, que podem ser utilizados por pessoas de qualquer parte do mundo. Esta versatilidade dos Applets desenvolvidos com a linguagem em questo garantida pela presena do Unicode, um padro internacional unificado capaz de representar os caracteres de todas as lnguas humanas. O Unicode faz do Java uma linguagem globalmente portvel, ainda que lnguas como portugus, francs, espanhol e ingls, cujos caracteres podem ser tranquilamente contidos em 8 bits, no sejam to beneficiadas com a presena do Unicode. A fim de possibilitar que dezenas de conjuntos de caracteres - dentre eles o latim arbico, PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 24 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio grego, hebraico, hangui, cirlico e o katakana - sejam reunidos ao conjunto Unicode, o tipo char em Java foi criado com 16 bits. Este tipo possui alcance de 0 a 65.536 e no adota valores negativos. Com relao aos caracteres utilizados na linguagem Java, importante consider-los como ndices de 16 bits que apontam para caracteres Unicode. fundamental, tambm, considerar que h possibilidade de tais ndices serem convertidos e manipulados. A converso, neste caso, transforma os valores em inteiros. A manipulao, por sua vez, ocorre, por exemplo, com os operadores de subtrao e adio, ambos tidos como operadores de inteiros. Utilizamos um par de aspas simples (') para representar um valor literal de caractere. Podemos digitar entre aspas simples todos os caracteres visveis ASCII. Exemplos: f e'?'. Contudo, existem caracteres que no podem ser representados diretamente dentro de aspas simples, para os quais devemos usar sequncias de escape. Exemplos:
\ Representa o prprio caractere de aspa simples; "\n" Representa um caractere de nova linha.
Podemos entrar diretamente com um valor octal ou hexadecimal. Neste caso, devemos considerar as seguintes informaes:
Para digitar diretamente uma notao octal, usamos uma barra invertida seguida de um nmero de trs dgitos. Exemplo: '\156', que representa a letra 'n';
Para digitar diretamente uma notao hexadecimal, usamos uma barra invertida e a letra u, seguidas de quatro dgitos hexadecimais. Exemplo:
'\u0078', que representa a letra 'x' ISO-Latin-1
Na tabela a seguir, esto descritas as sequncias utilizadas por alguns caracteres de escape: Seqncia de escape Descrio \ddd Caractere em octal (ddd) \uxxxx Caractere Unicode hexadecimal (xxxx) V Aspa simples \" Aspa dupla \\ Barra invertida \r Caractere de retorno \n Nova linha (alimentao de linha) \f Alimentao de formulrio \t Tabulao \v Tabulao vertical \b Backspace
A seguir, apresentado o uso de dois dos exemplos de caracteres da tabela anterior:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 25 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap2_Ex5 { public static void main(String args[]) { System.out.println("Vai saltar uma linha \n " + "saltou...."); System.out.println("Texto sem aspas, \agora texto" + " com aspas\", sem aspas"); } }
4.5. Literais de Strings
Nos itens que seguem, temos as principais consideraes sobre literais de strings em Java:
Comeam e terminam na mesma linha, ao contrrio de outras linguagens, em que h uma sequncia de escape de continuao de linha; So includos entre "" (aspas duplas). Exemplo: "Linguagem Java" e "ETESP"; So tipos de objeto e no arrays de caracteres. Por causa disso, a linguagem Java dispe de prticos e avanados recursos de gerenciamento de strings.
5. Variveis
Varivel um espao da memria utilizado para armazenar temporariamente um valor. Identificada por um nome, a varivel combina um identificador, um tipo e um inicializador opcional. O responsvel por definir a visibilidade de uma varivel e por quanto tempo a mesma ir durar o escopo. A varivel pode receber um valor, que determinado por um programa. Conforme este programa utilizado, o valor que a varivel previamente recebeu pode sofrer alteraes. 5.1. Declarao
Antes de utilizarmos as variveis em uma aplicao Java, devemos declar-las, pois s assim elas sero vlidas. Observemos:
int num; int idade = 22; char sexo = f; String curso = "Linguagem Java", escola = "Etesp"; double VAL_PI = 3.1415; float faixa = 4.21f; boolean resposta = true;
A seguir, apresentado um exemplo de classe utilizando declaraes de variveis:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 26 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap2_Ex6 { public static void main(String args[]) { int a, b; char sexo = 'f'; String curso = "Linguagem Java", escola = "ETESP"; double VAL_PI =3.1415; float faixa =4.21f; boolean resposta = true; a = 10; b = 20; System.out.println("O valor de a : " + a); System.out.println("O valor de b : " + b); System.out.println("O valor de sexo : " + sexo); System.out.println("O valor de VAL_PI : " + VAL_PI); System.out.println("O valor de faixa : " + faixa); System.out.println("O valor de resposta : " + resposta); } }
5.2. Escopo de Variveis
Quando falamos em escopo, estamos nos referindo ao limite ou ciclo de vida de um objeto. Um escopo criado cada vez que um novo bloco iniciado e permite que outros programas possam visualizar os objetos, alm de estipular o tempo de durao destes. Qualquer bloco iniciado pode ser utilizado como local para que uma varivel seja declarada. Se declararmos uma varivel dentro de um escopo, estamos tornando-a uma varivel local, protegida contra acessos e alteraes no-autorizadas. Por outro lado, a varivel torna-se inacessvel para um cdigo definido fora deste escopo. Ressaltamos que as regras de escopo so a base para encapsulamento. Os escopos utilizados pelo modelo orientado a objetos do Java so diferentes das categorias gerais de escopo global e local definidas pela maioria das linguagens de programao. Embora seja possvel manter algo parecido com um escopo global, este no se enquadra como regra em Java. Os dois escopos empregados em Java so o definido por classe e o definido por mtodo. Uma varivel criada assim que seu escopo acessado por um programa. Ao sair do escopo, a varivel destruda, consequentemente no preservando seu valor. O valor de uma varivel tambm no mantido quando esta sai de um bloco, o que significa que o escopo o fator decisivo para a durao da varivel. Quando temos variveis declaradas dentro de um mtodo, estas no preservam seus valores para duas chamadas feitas a um mesmo mtodo. Como citado anteriormente, para que uma varivel seja vlida, preciso declar-la. Dentro de um bloco, podemos escolher qualquer ponto para declarar a varivel. Uma varivel declarada no incio de um mtodo estar acessvel para o cdigo completo deste mtodo. Uma varivel declarada que possua um inicializador ser reinicializada toda vez que uma execuo entrar no bloco onde a varivel estiver localizada.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 27 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
5.2.1. Aninhamento de Escopos
Quando criamos um bloco de cdigo, o Java encarrega-se de gerar um novo escopo aninhado. A regra geral diz que, como resultado da criao do escopo aninhado, o escopo externo engloba o escopo interno, o que significa que o cdigo contido no escopo Interno poder visualizar os objetos que foram declarados no escopo externo. J os objetos declarados no escopo interno no podem ser vistos fora do mesmo. A seguir, temos uma representao de blocos, com as variveis declaradas dentro dos mesmos:
{ | int var1; | { | | int var2; 1 | 2 | { | | 3 | int var3; | | } | } }
De acordo com o exemplo anterior, os nmeros 1, 2 e 3 indicam os blocos existentes. O bloco 1 contm o bloco 2, que por sua vez contm o bloco 3. O bloco 1 o mais externo, e contm os outros dois blocos. O bloco 3 o mais interno. Seguindo a regra geral, var1 pode ser referenciado dentro dos blocos 2 e 3 e var2 s pode ser referenciado dentro do bloco 3. Na primeira condio, temos uma varivel declarada em um bloco mais externo, com referncia em um bloco mais interno. Na segunda condio, teremos um erro de compilao caso tentemos referenciar var2 no bloco 1.
6. Exibindo Dados na Tela
O comando System.out.printIn() utilizado para exibir dados na tela. Por meio de um nico comando System.out.printIn(), possvel mostrar mais de um dado, de tipos iguais ou diferentes. Esta concatenao feita atravs do sinal de +. O exemplo que segue mostra a concatenao de dados:
class Cap2_Ex7 { public static void main(String args[]) { int seculo; String cidade, estado; seculo = 21; cidade=Santos"; estado="SP"; System.out.println("Cidade = " + cidade + " - " + estado); System.out.println(seculo); System.out.println("Cidade = " + cidade); System.out.println("Sculo = " + seculo); } } PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 28 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Exerccios complementares
Os cdigos a seguir contm erros, identifique-os e solucione-os.
class Exercicio1 { public static void main(String args[]) { String cidade, estado cidade = "Curitiba"; estado = "PR"; System.out.print(cidade) ; System.out.print(estado) ; } }
class Exercicio2 { public static void main(String args[]) { int valorl ==50, valor2 == 100, result; result = valori + valor2; System.out.println("Resultado da soma = " + result); System.out.println("Resultado da soma = " valor1 + valor2); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 29 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Captulo 3
1. Introduo
Os operadores indicam o tipo de operao matemtica que ser executada, gerando novos valores a partir de um ou mais operandos (itens direita ou esquerda do operador). Normalmente, o resultado do tipo booleano ou numrico.
2. Operador de atribuio
O smbolo de igualdade (=) representa a atribuio de um valor a uma varivel, em que a varivel e o valor atribudo devem ser de tipos compatveis, ou seja:
uma varivel do tipo char no pode receber um valor do tipo boolean (true ou false).
Observemos:
varivel = atribuio;
Exemplo;
class Cap3_Ex1 { public static void main (String args[]) { char resp = 'n'; //atribui o valor 'n' para a //varivel resp boolean flag; //indica que a varivel flag tem //valor boolean System.out.println(resp); System.out.println(flag = false); } }
possvel atribuirmos uma varivel primitiva outra varivel primitiva. Vejamos como isso ocorre no exemplo a seguir:
int x = 3; int y = x;
Em que:
x recebe o valor 3; y recebe a varivel x, logo y contm o valor 3.
Neste momento, as duas variveis (x, y) tm o mesmo valor, porm, se alterarmos o valor de uma delas, a outra no ser alterada.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 30 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Exemplo:
class Cap3_Ex2 { public static void main (String args[]) { int x = 3; // o valor 3 atribudo varivel x System.out.println("x = " + x); int y = x; //a varivel y recebe a varivel x System.out.println("y = " + y); y = 5; System.out.println("y =" + y); } }
3. Operadores aritmticos
Os operadores aritmticos so utilizados nos clculos matemticos e so os seguintes:
class Cap3_Ex3 { public static void main(String args[]) { int a = 10, b = 25, c = 40, d = 55; System.out.println(a + b); System.out.println(b - a); System.out.println(c * d); System.out.println(c / a); System.out.println(d % a); } }
Aps a compilao e a execuo do cdigo anterior, o resultado ser o seguinte: 35 15 2200 4 5
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 31 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
3.1. Operadores aritmticos de atribuio reduzida
Os operadores aritmticos de atribuio reduzida so utilizados para compor uma operao aritmtica e uma atribuio.
Operador aritmtico Descrio += mais igual -= menos igual *= vezes igual /= dividido igual %= mdulo igual
No exemplo a seguir, acrescentado o valor 3 varivel x:
Exemplo:
class Cap3_Ex4 { public static void main (String args[]) { int x = 4; x += 3; // o mesmo que x = x + 3 System.out.println("Valor de x = " + x); } }
Ao utilizarmos os operadores de atribuio, contamos com dois benefcios. Alm de serem implementados de forma mais eficiente pelo sistema runtime de Java, o trabalho gasto com a digitao do cdigo reduzido. Isso ocorre porque os operadores de atribuio funcionam como se fossem uma verso mais reduzida das operaes equivalentes.
4. Operadores incrementais e decrementais
Os operadores incrementais e decrementais tm a funo de aumentar ou diminuir exatamente o valor 1 em uma varivel. Eles podem ser pr ou ps incremental e pr ou ps decremental. Vejamos:
Incremental (++)
Pr-incremental ou prefixo Significa que se o sinal for colocado antes da varivel, primeiramente ser somado o valor 1 para essa varivel, continuando em seguida a resoluo da expresso.
Ps-incremental ou sufixo Significa que se o sinal for colocado aps a varivel, primeiro ser resolvida toda a expresso (adio, subtrao, multiplicao, etc) para em seguida ser adicionado o valor 1 varivel.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 32 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Decremental (--)
Pr-decremental ou prefixo Significa que se o sinal for colocado antes da varivel, primeiramente ser subtrado o valor 1 dessa varivel, continuando em seguida a resoluo da expresso.
Ps-decremental ou sufixo Significa que se o sinal for colocado aps a varivel, primeiro ser resolvida toda a expresso (adio, subtrao, multiplicao, etc) para em seguida ser subtrado o valor 1 da varivel.
Exemplo:
class Cap3_Ex5 { public static void main(String args[]) { int a = 5; System.out.println("a = " + a); System.out.print("++a + 2 = "); System.out.println(++a +2); //exemplo de //pr-incremento System.out.println("a = " + a); System.out.println(); // pula uma linha
a = 5; // volta ao valor inicial System.out.println("a = " + a); System.out.print("a++ + 2 = "); System.out.println(a++ + 2); //exemplo de // ps-incremento System.out.println(a = " + a); System.out.println();
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 33 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
5. Operadores relacionais
Os operadores relacionais comparam dois valores e retornam um valor booleano (true ou false). Vejamos quais so esses operadores na tabela a seguir:
Operador relacional Descrio = = Igual a != Diferente de > Maior do que < Menor do que >= Maior do que ou igual a <= Menor do que ou igual a
Exemplo:
class Cap3_Ex6 { public static void main(String args[]) { int a = 20, b = 30, c = 1, d = 20; System.out.println(b < a); System.out.println(a == d); System.out.println(c > b); System.out.println(a != d); System.out.println(a < d); System.out.println(a <= d); System.out.println(c >= b); } }
6. Operadores lgicos bit a bit
Os operadores lgicos bit a bit atuam sobre os bits individuais de seus operandos, comparando-os bit a bit e resultando em 1 ou 0. Sempre sero avaliados os dois lados da expresso. Vejamos a tabela a seguir:
Operador lgico bit a bit Descrio ~ NOT unrio bit-a-bit & AND bit-a-bit | OR bit-a-bit ^ OR exclusivo bit-a-bit &= AND bit-a-bit com atribuio |= OR com atribuio ^= OR exclusivo bit-a-bit com atribuio
Nota: Operadores unrios atuam apenas sobre uma varivel, modificando-a ou no, e retornam o seu valor final. Os operadores binrios utilizam duas variveis e retornam um terceiro valor, sem alterar as variveis originais.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 34 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
6.1. Operador and (&)
O operador & (and) retorna o valor 1 somente quando todos os bits comparados forem iguais a 1. A tabela a seguir demonstra que a comparao bit a bit utilizando o operador & (and) entre os nmeros binrios, que correspondem aos decimais 12 e 10, retorna o nmero binrio correspondente ao decimal 8:
class Cap3_Ex7 { public static void main(String args[]) { int a = 12 & 10; //1100 e 1010 System.out.println("a = " + a); //o resultado 8 } }
6.2. Operador or ( | )
Para que o operador | (or) retorne o valor 1, basta que apenas um dos bits comparados tenha o valor 1. A tabela a seguir demonstra que a comparao bit a bit utilizando o operador | (or) entre os nmeros binrios, que correspondem aos decimais 12 e 10, retorna o nmero binrio correspondente ao decimal 14:
class Cap3_Ex8 { public static void main(String args[]) { int a = 12 | 10; // 1100 ou 1010 System.out.println("a = " + a); //o resultado 14 } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 35 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
6.3. Operador xor ( ^ )
O objetivo do operador ou exclusivo (^) (xor) fazer a comparao bit a bit entre dois nmeros, retornando o valor 1 caso eles sejam diferentes. Vejamos a tabela a seguir;
class Cap3_Ex9 { public static void main(String args[]) { int a= 12 ^ 10; //1100 xor 1010 System.out.println("a = " + a); // o resultado 6 } }
6.4. Operador not bit a bit ( ~ )
Utilizado para inverso de bits, o operador unrio not (~), troca o dgito 1 por 0 e vice-versa.
Exemplo:
class Cap3_Ex10 { public static void main(String args[]) { int a = 12 ; a = ~a; System.out.println("a = " + a); //o resultado -13 } }
7. Operadores lgicos
Os operadores lgicos trabalham com operandos booleanos, e seu resultado tambm ser booleano (true ou false). Eles so utilizados somente em expresses lgicas e so os seguintes: Operador lgico Descrio && AND || OR ! NOT
Em um teste lgico utilizando o operador && (and), o resultado somente ser verdadeiro (true) se todas as expresses lgicas forem avaliadas como verdadeiras. Porm, se o operador PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 36 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio utilizado for || (or), basta que uma das expresses lgicas seja verdadeira para que o resultado tambm seja verdadeiro.
O operador lgico not (!) utilizado para gerar uma negao, invertendo a lgica de uma expresso.
Exemplo:
class Cap3_Ex11 { public static void main(String args[]) { int a = 20, b = 30, c = 1, d = 20; System.out.println(b < a || c == 1); System.out.println(a == d && d != a); System.out.println(!(c > b)); } }
As diferenas entre os operadores bit a bit e os operadores lgicos so as seguintes:
Se o operando esquerda do sinal de igualdade for falso, && (and) no avaliar o operando direita, pois s resultar verdadeiro (true) se todos os argumentos forem verdadeiro (true);
Se o operando esquerda do sinal de igualdade for verdadeiro, || (or) retornar o valor verdadeiro (true) sem que o operando direita seja avaliado;
Os operadores bit a bit sempre faro a avaliao entre os operandos; Os operadores lgicos s avaliam expresses lgicas e seu resultado ser sempre do tipo booleano (true ou false);
Os operadores bit a bit so utilizados para avaliar nmeros inteiros e podem resultar tanto em valor numrico como em valor booleano (true ou false).
8. Operador instanceof
O operador instanceof utilizado para verificar, dinamicamente, se um objeto pertence a uma classe, e seu resultado ser do tipo booleano (true ou false). Sua sintaxe a seguinte:
objeto instanceof class
Apenas podemos utilizar o instanceof com variveis de referncia de objeto. Pode ser, contudo, que o objeto testado no corresponda a uma instanciao do tipo de classe. Neste caso, o resultado apresentado pelo operador instanceof ser verdadeiro caso o objeto possa ser atribudo ao tipo. Para testarmos a referncia a um objeto, podemos confront-la com o tipo de classe ou, ento, com uma das superdasses. A partir disso, utilizando o instanceof com o tipo Object, temos que qualquer referncia a um objeto avaliada como verdadeira. Caso uma das superclasses implemente a interface, o objeto considerado um tipo de interface especfico. Quando uma superclasse de objeto implementa uma interface, porm a classe da instncia PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 37 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio no o implementa, temos uma implementao indireta. Se isso ocorrer, recomendamos que sejam realizadas perguntas com o operador instanceof para testar se o objeto realmente a instncia de uma interface. Adicionalmente, recomendamos testar se um objeto nulo refere-se instncia de uma classe. O resultado, neste caso, ser sempre falso.
Exemplo:
class Cap3_Ex12 { public static void main(String args[]) { String a = "teste"; if (a instanceof String) System.out.println("A varivel a " + "uma String"); else System.out.println("A varivel a no " + "uma String"); } }
9. Operador ternrio
O operador ternrio ou operador condicional composto por trs operandos separados plos sinais (?) e (:), e tem o objetivo de atribuir um valor a uma varivel de acordo com o resultado de um teste lgico. Sua sintaxe a seguinte:
teste lgico ? valor se verdadeiro : valor se falso
Em que: teste lgico qualquer valor ou expresso que pode ser avaliado como verdadeiro ou falso; valor se verdadeiro o valor atribudo se o teste lgico for avaliado como verdadeiro; valor se falso o valor atribudo se o teste lgico for avaliado como falso.
Exemplo:
class Cap3_Ex13 { public static void main(String args[]) { int a = 2, b = 4; String verdade = "sim", falso = "no"; System.out.println(a + b > b - a ? verdade : falso); } }
10. Precedncia dos operadores
Em uma expresso com vrios operadores e operandos, a precedncia dos operadores que determina a ordem em que essa expresso ser resolvida. Sendo assim, a operao de maior PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 38 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio precedncia deve ser efetuada primeiro.
Observemos a ordem de prioridade dos operadores na tabela a seguir;
1. Calcule os resultados das expresses a seguir considerando os seguintes valores das variveis:
A = 2; B = 4; C = 8; D = 9;
a) !(A > B)
b) (A * B == C) || (A > D)
c) (B < C) && (B > D)
d) (A > D) || (A * B == C)
e) !(A + B < D) && D > C
f) (D % B < 2)
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 39 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
2. Encontre os erros e corrija o cdigo a seguir:
class ExercicioCap3_2 { public static void main(String args[]) { int A = 3, B = 7, C = 2, D = 5 System.out.println(A >= B) ; System.out.println( (A * B = C) || (A > D); System.out.println (B < C) && (B > D)) ; System.out.println( (A > D) || (A * B = C) ); System.out.println( (A + B < D) && (D > c) ); System.out.println(D % B < 2) } } 3. O cdigo a seguir est usando o operador ternrio. Rode-o e analise cada linha retornada.
class ExercicioCap3_3 { public static void main(String args [ ]) { int a = 3, b - 90, c = 12; System.out.println (a > b ? a : b) ; System.out.println (a < b ? a - 2 : b + 1); System.out.println (c < b && c > a ? c : a); System.out.println (a > b ? b : b < a ? b : a) ; // aninhamento
b = 12; System.out.println (b = b - (c < 10 ? 10 : c) ); } }
4. Depois de compilado e executado, o cdigo a seguir resultar em:
a) false b) true c) 5 d) 7 e) Erro de compilao
class ExercicioCap3_4 { public static void main(String args[]) { int a = 5, b == 7; boolean n = (a == b); System.out.println(n); } PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 40 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio } 5. Desenvolva um cdigo que retorne o valor a pagar de uma compra, utilizando o operador ternrio, de acordo com o seguinte cenrio:
Valor da compra = 2000;
Faixa % Desconto 0 1000 0% 1001 3000 5% Acima de 3000 10%
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 41 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Captulo 4
1. Introduo
Para controlarmos o fluxo de um programa, escrevemos uma sequncia de comandos entre chaves ({}). A essa sequncia chamamos de comandos em blocos, os quais podem ser aninhados dentro de outro bloco de comandos. Nos tpicos e subtpicos a seguir, estudaremos a respeito dos comandos de deciso e de laos de repetio, que constituem um bloco de comandos.
2. Comandos de deciso
Para decidirmos qual ao dever ser tomada em determinada parte de um programa, solicitamos a este que avalie uma expresso. Caso esta expresso seja avaliada como verdadeira, uma sequncia de comandos ser executada.
As seguintes instrues de deciso devem ser consideradas:
if / else
switch / case
2.1. if/ else
Quando utilizamos uma instruo if, apenas expresses com resultados booleanos podem ser avaliadas. Para definirmos uma instruo if, utilizamos a seguinte sintaxe:
if (Teste Condicional) { Comandos; }
Onde, a instruo avaliar a expresso booleana. Em caso verdadeiro, o bloco de instrues que se encontra entre as chaves ({}) ser executado. Se o resultado for falso, o bloco de comandos no ser executado, ou pode haver um outro bloco de comandos para ser executado. Repare que a condio a ser avaliada est entre parnteses. Exemplo:
class Cap4_Ex1 { public static void main(String args[]) { int x= 10; if (x < 15) { System.out.println ("X menor que 15"); System.out.println ("O valor de x : " + x ); } } PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 42 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio }
importante sabermos que as chaves ({}) no so obrigatrias quando existir apenas uma instruo dentro do bloco de comandos. Porm, por motivos de melhor legibilidade, interessante que as chaves sejam utilizadas. Adicionalmente, recomendamos que as instrues if / else sejam aninhadas em quantidade moderada, tambm por ser mais legvel.
Para executar comandos caso a condio seja falsa, necessrio digitar a clusula else aps as instrues da condio verdadeira e, na linha abaixo, inserir o bloco de instrues a serem executados. A estrutura ser:
if (Teste Condicional) Comandos; else Comandos;
O comando if, quando utilizado em conjunto com o comando else, bastante similar forma de como utilizado em outras linguagens de programao.
Vejamos, agora, um exemplo prtico com a instruo if / else:
class Cap4_Ex2 { public static void main(String args[]) { int x= 10; if(x < 15) { System.out.println("X menor que 15"); System.out.println("O valor de x : " +x); } else { System.out.println("x maior que 15"); System.out.println("Como x maior que 15, " + " seu valor : " + x); } } }
2.2. switch / case
A instruo switch pode ser um outro modo para simular a utilizao de vrias instrues if, e ela somente pode verificar uma relao de igualdade. Os tipos de dados que podem ser utilizados na instruo switch so os seguintes:
byte; char; int; short.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 43 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Com relao instruo case, ela avalia apenas o argumento que apresenta o mesmo tipo definido na instruo switch. Mas devemos ter ateno ao fato de que o argumento da instruo case final, ou seja, ele precisa ser resolvido no tempo de compilao. Devido a isso, utilizamos uma varivel final constante com um valor literal na instruo case. Caso mais de uma instruo case apresente o mesmo valor, ela no ser vlida.
Nota: A instruo switch apenas verifica igualdades, o que no o caso de operadores relacionais, tais como menor ou igual que (<=).
Enquanto uma instruo switch estiver sendo executada, o programa pode encontrar um comando break, ou seja, uma indicao de que o programa dever executar a instruo seguinte ao bloco switch. Mas se esse comando no existir no cdigo-fonte do programa, todas as instrues case sero executadas at que toda a instruo switch finalize, ou mesmo at que um comando break seja encontrado. Quando a execuo do programa passa de uma instruo case para a seguinte, temos o processamento conhecido por passagem completa. Ele nada mais do que a execuo de todas as instrues case at o final da instruo switch.
O comando switch / case no pode utilizar operadores lgicos (&&, || ou !). Sendo assim, ele somente pode ser utilizado para comparar valores simples, cujos tipos de dados podem ser apenas int, short, byte e char.
Vejamos, a seguir, um exemplo com a instruo switch / case:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 44 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
class Cap4_Ex3 { public static void main(String args[]) { int hora = 7; switch(hora) { case 1 : System.out.println("Uma hora"); break; case 2 : System.out.println("Duas horas"); break; case 3 : System.out.println("Trs horas"); break; case 4 : System.out.println("Quatro horas"); break; case 5 : System.out.println(" Cinco horas"); break; case 6 : System.out.println("Seis horas"); break; case 7 : System.out.println("Sete horas"); break; case 8 : System.out.println("Oito horas"); break; case 9 : System.out.println("Nove horas"); break; case 10 : System.out.println("Dez horas"); break; case 11 : System.out.println("0nze horas"); break; case 12 : System.out.println("Doze horas"); break; } } }
Nesse exemplo, utilizamos o comando break, que serve para separar o que restrito para ser executado em cada case. O break finaliza o case anterior. Podemos completar o uso da instruo switch / case com o comando default. Este ser executado sempre que o valor assumido pela varivel no encontrar um valor case correspondente. Observemos o exemplo a seguir;
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 45 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
class Cap4_Ex4 { public static void main(String args[]) { int hora=33; switch(hora) { case 1 : System.out.println("Uma hora"); break; case 2 : System.out.println("Duas horas"); break; case 3 : System.out.println("Trs horas"); break; case 4 : System.out.println("Quatro horas"); break; case 5 : System.out.println("Cinco horas"); break; case 6 : System.out.println("SeJs horas"); break; case 7 : System.out.println("Sete horas"); break; case 8 : System.out.println("0ito horas"); break; case 9 : System.out.println("Nove horas"); break; case 10 : System.out.println("Dez horas"); break; case 11 : System.out.println("0nze horas"); break; case 12 : System.out.println("Doze horas"); break; default: System.out.println("Hora incorreta"); } } }
3. Comandos de laos de repetio
Muitas vezes, precisamos repetir a execuo de um bloco de cdigos do programa at que uma determinada condio seja verdadeira, ou mesmo at que uma quantidade de vezes seja satisfeita. Para que essa repetio seja possvel, utilizamos os laos de repetio de linguagem que, em Java, so os seguintes:
while; do/while; for;
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 46 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Nos subtpicos seguintes, veremos cada um deles mais detalhadamente, e tambm estudaremos outros comandos utilizados em conjunto com as instrues for, while e do/while.
3.1. while
Quando no sabemos quantas vezes um determinado bloco de instrues precisa ser repetido, utilizamos o lao de repetio while. Com ele, a execuo das instrues vai continuar at que uma condio seja verdadeira. A condio a ser analisada para execuo do lao de repetio dever retornar um valor booleano.
Vejamos a sintaxe do lao de repetio while:
while (teste condicional) comando; // ser executado enquanto teste condicionai = true
while (teste condicional) { comando1; comando2; }
Nesse exemplo, somente se a condio for verdadeira que o corpo do lao de repetio ser executado. Assim sendo, o contedo vai se repetir at essa condio no ser mais verdadeira. Vejamos mais um exemplo:
class Cap4_Ex5 { public static void main(String args[]) { int num = 10; while(num < 1500) num*=10; System.out.println("Valor de num = " +num); } }
Devemos saber que o lao de repetio white pode no ser executado. Isso ocorrera quando, na primeira verificao da condio, esta for falsa. Ento, o programa passar para a execuo da prxima instruo aps o lao.
3.2. do / while
O comando do/while tem basicamente o mesmo funcionamento do while, com uma diferena de que utilizando-se o do/while teremos os comandos executados ao menos uma nica vez. Isso acontecer mesmo se a condio no for verdadeira. Vejamos a sua sintaxe:
do { comando; PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 47 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio } while (condio); do { System.out.println("Estamos dentro do loop"); } while(false);
Observemos o exemplo a seguir:
class Cap4_Ex6 { public static void main(String args []) { Int num = 10; do { System.out.println ("num maior que 500! "); } while (num >= 100); } }
3.3. For
Quando sabemos exatamente quantas vezes queremos repetir um bloco de instrues, utilizamos o lao de repetio for. Ele possui o corpo do lao e mais as seguintes partes principais:
Declarao e inidalizao de variveis
Nesta primeira parte da instruo for, podemos declarar e inicializar uma ou mais variveis, quando houver. Elas so colocadas entre parnteses, aps a palavra-chave for e, se houver mais de uma varivel do mesmo tipo, elas so separadas por vrgulas, conforme o seguinte:
For (inta = 1, b = 1; ...){}
importante lembrarmos que a declarao e a inicializao das variveis na instruo for acontecem sempre antes de outros comandos. Ainda, elas acontecem apenas uma vez no lao de repetio, sendo que o teste booleano e a expresso de iterao so executados a cada lao do programa.
Expresso condicional
Na segunda parte da instruo do lao de repetio for, temos a expresso condicional. Ela refere-se a um teste que ser executado e dever retornar um valor booleano. Por esse motivo, somente vlido especificarmos nesta parte da instruo for uma expresso lgica Devemos observar que a expresso lgica pode ser complexa. muito importante termos cuidado com os cdigos que utilizam diversas expresses lgicas. Observemos:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 48 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
class Cap4_Ex7 { public static void main(String args []) { for (int a = 1, b = 10; ((a < 10) && (b > 5)); a++, b--) { System.out.println("a = " + a); System.out.println("b = " + b); } } }
No exemplo anterior, a expresso condicional vlida, porm, mostraremos um exemplo em que ela no vlida:
for (int a = 1, b = 10; (a < 10), (b > 5)); a++)
Nesse exemplo, h dois testes booleanos separados por vrgulas, o que faz com que a instruo no seja executada e gere um erro. Isso ocorre porque podemos ter apenas uma expresso de teste na sintaxe desse comando.
Expresso de iterao
Na expresso de iterao, indicamos o que dever ocorrer aps cada execuo do corpo do lao de repetio. Ela sempre ser processada aps o corpo do lao ser executado, mas ser a ltima execuo da instruo do lao for.
Na linha seguinte, temos a sintaxe completa da instruo for:
for (declarao e inicializao de varivel; condio; iterao) { instruo do corpo do lao for; }
Vejamos o exemplo a seguir:
for (int a = 1, b = 1; a < 4; a--) {}
Em que: int refere-se ao tipo de varivel que ser declarada; a = 1 e b = 1 referem-se s variveis que esto sendo inicializadas; a < 4 refere-se ao teste booleano que ser feito na varivel a; a-- indica a iterao da varivel a.
Aps verificarmos todas essas informaes, destacamos que apesar de no ser uma boa PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 49 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio prtica, podemos deixar de declarar uma das trs partes descritas do lao de repetio for. Nesse caso, o lao ser infinito, e no havendo sees de declarao e inicializao no lao de repetio for ele agir como um lao de repetio while. Observemos:
class Cap4_Ex8 { public static void main(String args []) { for (;;) { System.out.println("Este e um lao for sem " + " declarao " + "ou inicializao de " + "variveis"); } } }
Com relao ao escopo das variveis que foram declaradas no lao de repetio for, ele finalizado juntamente com o lao. Sendo assim, devemos observar o seguinte:
A varivel declarada no lao for pode ser utilizada apenas no prprio lao de repetio for; A varivel declarada fora do lao de repetio for, mas inicializada na instruo for, pode ser utilizada fora do lao de repetio. No exemplo a seguir, mostramos a declarao de uma varivel fora da instruo for, mas a sua inicializacao ocorre dentro da instruo for:
class Cap4_Ex9 { public static void main(String args[]) { int a = 3; for (a = 9; a < 15; a++) System.out.println("a = " + a); } }
Isso nos mostra que as sees da instruo for no so dependentes e, por isso, no precisam operar sobre as mesmas variveis. Quanto expresso de iterao, ela no precisa, necessariamente, configurar ou incrementar algo, como mostramos no exemplo a seguir:
class Cap4_Ex10 { public static void main(String args[]) { int x = 10; for(int y = 1; x != 1; System.out.println("Aqui no tem incremento")) { x = x - y; } PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 50 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio } }
Ainda na instruo do lao de repetio for, utilizamos dois comandos: break e continue. Eles podem ser rotulados ou no-rotulados, sendo que sero rotulados quando existir um lao de repetio aninhado e precisarmos indicar qual dos laos queremos finalizar, ou mesmo para indicar a partir de qual lao queremos que a prxima iterao continue.
Geralmente, quando um desses comandos utilizado, um teste if executado dentro do lao de repetio for. Caso uma das condies verificadas seja verdadeira ou falsa, conforme o desejado na instruo, o lao de repetio ou a iterao ser finalizado e a prxima instruo do programa ser executada.
3.4. break
O comando break utilizado em laos de repetio while, do/while, for e com os comandos switch/case. Quando utilizado em lao de repetio, causa uma interrupo imediata do mesmo, continuando a execuo do programa na prxima linha aps o lao. Isso acontece caso a condio imposta seja atendida.
Vejamos o exemplo a seguir:
class Cap4_Ex11 { public static void main(String args[]) { for (int i = 1; i < 11; ++i) { if(i == 5) break; //interrompe o loop System.out.println("Valor de i = " + i); } System.out.println("Proxima linha aps o loop..."); } }
3.5. continue
O comando continue utilizado somente em laos de repetio. Quando ele executado, o lao volta imediatamente para o teste de condio do lao de repetio. Normalmente, utilizamos o comando continue em um teste if. Observemos, a seguir:
while (!EOF) { if (erro) { continue; } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 51 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Quando esse cdigo for executado, ser verificado se h um erro. Se a condio for verdadeira, o prximo campo do arquivo ser lido at que no seja o final de arquivo (!EOF). A instruo continue ser utilizada para voltar ao lao de repetio e fazer com que os outros campos continuem a serem lidos at o final de arquivo. Nota: EOF simula uma varivel de leitura de um recordset
O exemplo a seguir nos mostra outra utilizao do comando continue com o lao de repetio while:
class Cap4_Ex12 { public static void main(String args[]) { int num = 0; while (num<10) { ++num; if (num == 5) { continue; } System.out.println(valor de num => + num); } } }
Nota: Quando o comando continue utilizado, precisamos levar em considerao os efeitos que ele pode causar sobre a iterao do lao de repetio.
3.6. Instrues rotuladas
Apenas quando temos laos de repetio aninhados e precisamos indicar qual desses laos deve ser finalizado, ou quando queremos indicar a partir de qual lao a prxima iterao continuar, utilizamos as instrues rotuladas. No caso da instruo break rotulada, ela indica para que o programa saia do lao de repetio rotulado, mas no do lao de repetio atual. Quanto ao rtulo atribudo instruo, ele deve seguir as regras de nomes de varivel vlidos para a linguagem Java. Alm disso, devemos verificar se ele segue as convenes de nomeao para Java.
3.7. Instrues no-rotuladas
Quando a instruo break no for rotulada, a estrutura do lao de repetio atual ser finalizada e o programa continuar a ser executado a partir da prxima linha de cdigo aps o bloco do lao.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 52 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Exerccios de Fixao:
1. Depois de compilado e executado, o cdigo a seguir resultar em:
a) Cdigo errado A! b) Cdigo errado B! c) Cdigo errado C! d) Cdigo errado D! e) Erro de compilao.
class ExercicioCap4_1 { public static void main(String args[]) { int cod = 9; if (cod == 1) System.out.println ("Cdigo errado A!"'); else if (cod !=3) System.out.println("Cdigo errado B!"); else if (cod != 5) System.out.println("Cdigo errado C!"); else if (cod != 7) System.out.println("Cdigo errado D!"); } }
A - Baseando-se na tabela a seguir, desenvolver um cdigo que retorne o valor do Imposto de Renda de um salrio de R$ 4.000,00 Base de clculo mensal em R$ Alquota % Parcela a deduzir do imposto em R$ At 1.058,00 - - De 1.058,01 at 2.115,00 15,0 158,70 Acima de 2.115,00 27,5 423,08
B - Usando a instruo for, desenvolver um cdigo que mostre na tela as tabuadas de 1 a 10.
C - Usando as instrues for, if e continue, desenvolver um cdigo que mostre na tela apenas os nmeros pares de 0 a 100. Quando o nmero for 56, dever aparecer uma sada informando o seu valor. A figura a seguir mostra parcialmente como ficar o cdigo depois de compilado e executado.
Exemplo de parte da sada do programa:
Valor de x par = 48 Valor de x par = 50 Valor de x par = 52 Valor de x par = 54 Agora x vale .............56 Valor de x par = 58 Valor de x par = 60 Valor de x par = 62 PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 53 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 5
1. Introduo
Os programas desenvolvidos com base na orientao a objetos so compostos por um grupo de objetos que, por meio da troca de mensagens, realizam um processo de interao entre si. De fato, essa troca de mensagens refere-se invocao de mtodos que realizada entre objetos. Os programas que se baseiam nessa orientao so facilmente alterados em um momento posterior para uma melhor adaptao s necessidades apresentadas por usurios ou organizaes. A essncia da programao orientada a objetos a possibilidade de alterar ou substituir partes de um sistema sem que a haja riscos de ocorrncia de erros. Isso possvel devido ao fato de os objetos serem definidos de forma clara e com interfaces confiveis. Ainda, importante destacar que a base da linguagem de programao Java envolve os conceitos de orientao a objetos, dentre os quais temos:
Abstrao; Encapsulamento; Herana; Polimorfismo.
2. Abstrao
A abstrao um processo atravs do qual separamos os fatos relevantes dos detalhes que no tm grande importncia. Sendo assim, o conceito de abstrao bastante adequado em situaes de grande complexidade, pois combinado ao polimorfismo e a herana, pode nos ajudar a resolver essas situaes.
Em se tratando de desenvolvimento de sistemas, abstrao significa focalizar em dois fatores essenciais: o que um objeto , e o que ele faz. preciso concentrar-nos nesses dois fatores antes de decidirmos a forma como esse objeto ser implementado.
Assim, ao utilizarmos os conceitos de abstrao, as decises relacionadas ao desenvolvimento e implementao de objetos podem ser tomadas quando entendemos melhor o problema a ser resolvido. Portanto, a abstrao um dos elementos mais importantes da programao orientada a objetos.
A abstrao de dados um conceito suportado por diversas linguagens de programao atuais e permite a utilizao de um nico modelo conceitual em todas as fases que compem o processo de desenvolvimento de um sistema.
O conceito de abstrao, quando utilizado juntamente aos conceitos de herana e polimorfismo, forma um poderoso mecanismo suportado pela orientao a objetos.
3. Objetos
Em termos gerais, entendemos por objetos quaisquer elementos da natureza aos quais possvel atribuir comportamentos e caractersticas. No entanto, em termos de computao, entendemos por objetos os elementos capazes de representar uma entidade que esteja no domnio de interesse do problema analisado. As entidades representadas por objetos podem PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 54 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio ser concretas ou abstraas.
As linguagens de programao que so orientadas a objetos possuem mecanismos que, a partir do conceito de classes, permitem determinar os tipos de objetos que sero destinados a cada aplicao. Os objetos que apresentam semelhanas entre si so agrupados em classes.
Os objetos, quando so criados, ocupam um espao na memria que utilizado para o armazenamento de seu estado e de um grupo de operaes, as quais podemos aplicar ao objeto. Mais especificamente, o estado de um objeto refere-se aos valores de seu conjunto de atributos, e seu grupo de operaes refere-se ao conjunto de mtodos. A classe responsvel por definir ambos, atributos e mtodos.
Tendo em vista que os objetos so instncias de classe, para que eles realizem suas tarefas preciso que as instncias sejam criadas, uma vez que por meio de sua manipulao, as tarefas dos objetos podem ser efetuadas. Uma vez realizadas essas tarefas, podemos excluir os objetos.
4. Classes
Definimos classe como sendo uma abstrao de um conjunto de objetos, os quais so agrupados por possurem similaridades em termos de comportamento e caractersticas. Sendo assim, as propriedades ou os atributos de um objeto so descritos a partir da definio de uma classe.
Por meio da definio de uma classe tambm possvel descrever o comportamento desse objeto. Entendemos por comportamento de um objeto a funcionalidade que pode ser aplicada a ele. Um mtodo, o qual corresponde a um procedimento ou funo, o responsvel por descrever tal funcionalidade. Embora os mtodos sejam correspondentes a procedimentos e funes, eles so capazes de manipular somente os atributos definidos para um objeto e suas variveis locais.
Nota: Os atributos referem-se s caractersticas dos objetos/ j os mtodos referem-se s aes dos mesmos.
A criao de classes em Java um procedimento que deve ter incio apenas depois de estabelecidas as classes que formaro a aplicao, bem como a estrutura e o comportamento das mesmas.
Contamos, tambm, com as classes modelo, as quais servem como base para o momento em que o cdigo implementado. Nessas classes modelo, contudo, no temos a implementao de cdigos especficos, temos somente a estrutura e o comportamento referente classe ou ao objeto.
Para compreendermos de maneira adequada essas classes, consideremos a necessidade de criar um objeto Pessoa, por exemplo. Para isso, listaremos as caractersticas que as pessoas tm em comum, tais como:
Nome do objeto: Pessoa (classe modelo) Caractersticas: sexo, cabelo, idade (atributos)
A definio de uma classe modelo em Java contendo esses dados a seguinte: PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 55 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
class Pessoa { char sexo; String cabelo; int idade; }
A partir desta classe modelo, a qual recebe este nome por se tratar de uma definio geral, possvel implementar e dar vida a diversos programas. Em um captulo posterior, o assunto a respeito de classes ser abordado com mais detalhes.
5. Princpios da orientao objetos
A implementao de um modelo orientado a objetos auxiliada por meio de mecanismos. A linguagem de programao Java, a fim de adequar tais mecanismos, utiliza trs tipos de estruturas distintos, que so:
Encapsulamento; Herana; Polimorfismo.
O encapsulamento, a herana e o polimorfismo so mecanismos que, em conjunto, formam um ambiente de programao capaz de suportar o desenvolvimento de programas com maior escalabilidade e robustez. Na tabela a seguir, teremos mais detalhes a respeito desses mecanismos:
Mecanismos Descrio Encapsulamento O encapsulamento uma tcnica que faz com que os atributos da classe permaneam ocultos, pois, assim, estes podem ser lidos ou alterados somente peos mtodos da prpria classe. Com isso, desnecessrio conhecer a implementao interna da classe. importante destacar, ainda, que o encapsulamento permite otimizar as implementaes j realizadas, bem como permite que as classes sejam utilizadas sem que haja rupturas. Para isso, no entanto, preciso que a interface pblica dessas classes tenha sido respeitada Herana O conceito relacionado ao mecanismo de herana um dos maiores diferenciais entre a programao orientada a objetos e os outros tipos de programao. Por meio da herana possvel estender as definies existentes. Quando temos uma hierarquia de classes planejada de forma adequada, temos a base para que um cdigo possa ser utilizado novamente, o que permite poupar esforo e tempo na medida em que o desenvolvimento de um cdigo exige ambos de forma considervel. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 56 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Polimorfismo O polimorfismo um mecanismo por meio do qual selecionamos as funcionalidades utilizadas de forma dinmica por um programa no decorrer de sua execuo. Os cdigos que o polimorfismo permite criar apresentam diversas caractersticas, dentre as quais destacamos a lgica, a robustez, a legibilidade e a limpeza.
O exemplo da comunicao atravs do telefone ilustra a ideia da orientao a objetos. O telefone um aparelho utilizado para transmitir sons distncia. Ele constitudo basicamente de dispositivos para converter ondas sonoras em ondas eletro-magnticas. Neste ponto, vale considerar o microfone, para reverter esse processo, o receptor, o gancho que serve como interruptor, a campainha que d o sinal de que o aparelho est recebendo uma ligao e o disco, ou teclas, que selecionam o telefone com o qual se pretende estabelecer comunicao. Todos os usurios de telefones utilizam a herana para se comunicar atravs de diferentes tipos (subclasses) de aparelhos telefnicos. Quer o telefone seja um celular, um fixo por ondas de rdio ou um fixo por fibra tica, quem o est utilizando ter um teclado para discar o nmero desejado, uma campainha indicando que o aparelho est recebendo uma ligao, entre outros itens. O polimorfismo reflete-se na possibilidade que os fabricantes de aparelhos telefnicos tm de oferecer uma ampla variedade de opes no mesmo telefone bsico. No importa a tecnologia utilizada ou o modelo, sempre utilizaremos um teclado para discar o nmero desejado. Assim, temos que o controle de diversas implementaes pode ser realizado por uma mesma interface. Por meio dos concejtos relacionados ao encapsulamento, herana e ao polimorfismo, observamos como diversas partes distintas acabam por transformar-se em um aparelho de telefone de qualquer tipo. A mesma situao descrita para o telefone tambm se aplica aos conceitos da programao orientada a objetos na medida em que as partes de um programa, quando unidas, transformam-se em um produto final com robustez, coerncia e com pouca complexidade de manuteno. importante compreendermos os conceitos de encapsulamento, herana e polimorfismo, uma vez que todos os programas desenvolvidos em linguagem Java so orientados a objetos. Mais detalhes a respeito de encapsulamento, herana e polimorfismo sero abordados posteriormente.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 57 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 6
1. Introduo
No captulo anterior, que tratou da orientao a objetos, definimos brevemente o conceito de classes. No decorrer deste captulo, entretanto, essa descrio ser abordada de forma mais detalhada. Tendo em vista que a linguagem de programao Java orientada a objetos, o conceito de classes torna-se uma de suas principais bases. Uma classe tem a funo de determinar no somente a natureza, mas tambm a forma de um objeto. Por meio de classes, possvel realizar o processo de construo de objetos, o qual recebe o nome de instanciao. Em termos gerais, as classes so capazes de auxiliar na organizao de um conjunto de dados, bem como de auxiliar na definio dos mtodos mais adequados para a alterao e a utilizao desses dados.
Nota: Quanto aos objetos, podemos dizer que eles tm um papel fundamental na programao orientada a objetos, ou OOP (Object-Oriented Programming).
A fim de que possamos declarar as classes de maneira adequada, preciso analisar algumas regras, as quais sero descritas a seguir:
Regras Descrio Classe pblica Cada arquivo de cdigo-fonte pode conter somente uma classe pblica e, ainda, o nome atribudo a esse arquivo deve ser igual ao nome da classe em questo. Instrues O arquivo de cdigo-fonte deve apresentar em sua primeira linha a instruo do pacote. Isso deve ocorrer caso a classe seja parte integrante de um pacote. Tanto as instrues de pacote quanto as instrues de importao so aplicadas a todas as classes pertencentes ao arquivo de cdigo-fonte. Modificadores Antes que uma classe seja declarada, podemos adicionar modificadores mesma. Esses modificadores podem ser de acesso e podem ser aqueles que no se referem ao acesso. Dentre os modificadores de acesso, temos o private, o protected e o public. J dentre os modificadores que no so de acesso, temos o abstract, o final, entre outros.
Com relao s instrues, sejam elas de pacote ou de importao, tambm preciso destacar o seguinte:
A insero das instrues de importao deve ser realizada entre a declarao da classe e a instruo do pacote; As instrues de importao devem ser colocadas na primeira linha referente ao arquivo de cdigo-fonte caso no haja uma instruo de pacote; A primeira linha do arquivo de cdigo-fonte deve ser destinada insero da declarao de classe caso no haja instrues de pacote ou instrues de operao.
importante destacar que as linhas de comentrio no precisam necessariamente ser as primeiras linhas de um arquivo de cdigo-fonte; elas podem estar presentes em qualquer local desse arquivo.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 58 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 2. Encapsulamento
Na linguagem de programao Java, a classe o alicerce para o encapsulamento, o qual definido como uma tcnica que faz com que os atributos da classe permaneam ocultos, pois, dessa forma, eles podem ser lidos ou alterados somente pelos mtodos da prpria classe. Por conta dessa tcnica, o conhecimento a respeito da implementao interna da classe desnecessrio, uma vez que isso passa a ser responsabilidade dos mtodos internos da classe. Sabemos que a classe responsvel por definir a estrutura e o comportamento de seus objetos. Devido a esse papel, comum que os objetos sejam chamados de instncias dessa classe. Assim que uma classe criada, seu cdigo e seus dados, os quais so chamados de membros da classe, so determinados. Esses dados recebem o nome de variveis membro ou variveis de instncia. J o cdigo tem a funo de formar os mtodos, os quais tambm podem ser denominados como mtodos membro. Os mtodos presentes em um programa desenvolvido em Java so responsveis por determinar a maneira como sero utilizadas as variveis membro, o que indica que os mtodos cuja funo operar sobre os dados de instncia de uma classe determinam qual ser a interface e o comportamento apresentados pela mesma. Tendo em vista que os mtodos e as variveis de uma classe podem ser definidos como pblicos ou privados, temos a seguinte situao:
Tudo o que o usurio externo precisa conhecer a respeito de uma classe encontra-se em sua interface pblica; Somente os cdigos membros da classe so capazes de acessar seus mtodos e variveis privados. Isso garante que no ocorrero aes inadequadas, mas exige que a interface pblica seja planejada com cautela para que o funcionamento interno da classe no seja muito exposto.
Nota: Ao passo que uma classe definida como sendo uma construo lgica, um objeto definido como a realidade fsica. Quanto ao mtodo em Java, este corresponde a uma funo nas linguagens C e C++.
3. Tipos construdos
Podemos criar variveis a partir de tipos construdos. Isso significa que possvel criar variveis a partir das classes que j existem. As variveis de tipos construdos esto diretamente relacionadas a algum tipo de classe que criada ou, ainda, que j exista, como as classes que acompanham a linguagem de programao Java. O processo de criao de variveis atravs de tipos construdos recebe o nome de instanciao. Este um processo diferente da criao de variveis do tipo bsico, tais como int, char, boolean, long, double, entre outras.
4. Instanciao
A instanciao um processo por meio do qual se realiza a cpia de um objeto (classe) existente. Uma classe, a qual tem a funo de determinar um tipo de dado, deve ser instanciada para que possamos utiliz-la. Sendo assim, devemos criar sua instncia, a qual definimos como sendo um objeto referente ao tipo de dado que foi definido pela classe. Ressaltamos que, exceto a classe abstract, qualquer outra classe pode ser instanciada como um tipo de dado de Java.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 59 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Para que possamos compreender adequadamente o processo de instanciao, destacamos um exemplo a seguir, o qual utiliza a classe Pessoa j mencionada. Observemos:
class Pessoa { char sexo; String cabelo; int idade; }
class Cadastro { public static void main(String args[]) { Pessoa joao; // passo 1 joao = new Pessoa(); // passo 2 //(instanciao completa) joao.sexo = 'm'; // l atributo sexo do objeto joo joao.cabelo = "castanhos"; joao.idade = 15; System.out.println(joao.cabelo);
Pessoa maria = new Pessoa(); // passo 1 e 2 // em uma nica linha maria.idade = 31; System.out.println(maria.idade); } }
Como pudemos verificar, o exemplo que acaba de ser descrito parte do pressuposto de que temos um programa de cadastro e desejamos trabalhar com os dados de determinadas pessoas no programa.
Nota: importante destacar que somente pelo fato de termos declarado uma varivel construda, isso no significa que ela foi criada automaticamente. A fim de que o processo de instanciao seja realizado por completo, devemos utilizar new nomeClasseO. Uma vez realizada a instanciao, utilizamos o nomeObjetoCriado.membro para que possamos nos referenciar aos membros do objeto criado.
5. Atribuio entre objetos de tipos construdos
Quando atribumos variveis de tipos construdos, aquele que recebe essa atribuio tem todo seu valor ou valores anulados, ou seja, literalmente excludos da memria, passando a apontar para o objeto ao qual foi atribudo.
Os dois objetos, ento, passam a apontar para um nico endereo de memria como se ambos pudessem ter o mesmo endereo de memria, isto , os mesmos dados, ou como se dois nomes diferentes pudessem referenciar um mesmo objeto.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 60 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Os exemplos descritos a seguir mostram o processo de atribuio entre tipos construdos:
class Cap6_Ex1 { public static void main ( String args[ ]) { Pessoa joao = new Pessoa(); Pessoa maria = new Pessoa(); joao.sexo ='m'; joao.idade = 45; maria.sexo = 'f'; maria.idade = 17; joao = maria; //atribuio realizada
Aps verificar o resultado do exemplo acima, modifique-o para o cdigo abaixo:
class Cap6_Ex1A { public static void main ( String args[ ]) { Pessoa joao = new Pessoa(); Pessoa maria = new Pessoa(); joao.sexo = 'm'; joao.idade = 45; maria.sexo = 'f'; maria.idade = 17; joao = maria; // atribuio realizada System.out.println("Joao sexo = " + joao.sexo); System.out.println("Joao idade = " + joao.idade ); joao.idade = 50; System.out.println("Maria idade = " + maria.idade); joao.sexo = 'm'; System.out.println("Maria sexo = " + maria.sexo); } }
6. Inicializao dos atributos de uma classe
Podemos determinar os valores de inicializao a quaisquer atributos de uma classe. No entanto, caso os atributos de uma classe no possuam valores de inicializao, tais valores sero determinados conforme o tipo de classe no momento de sua instanciao. Observemos a seguir quais so os tipos de classes e os valores de inicializao determinados aos seus respectivos atributos:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 61 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Se for do tipo int, seu valor ser 0 (zero); Se for do tipo boolean, seu valor ser false; Se for do tipo construdo, seu valor ser null.
Caso os valores de inicializao desejados sejam estabelecidos aos atributos de uma classe, estes sero os valores utilizados no processo de instanciao do objeto dessa mesma classe.
7. Acesso
Quando falamos de acesso a classes, estamos nos referindo a um conceito de visibilidade, ou seja, uma determinada classe deve ser capaz de visualizar a outra para que, dessa maneira, possa acessar seus mtodos e variveis. Para compreendermos de maneira adequada esse conceito, destacamos duas classes distintas, a classe X e a classe Y. A classe X capaz de criar uma instncia da classe Y, bem como pode tornar-se uma subclasse de Y e acessar seus mtodos ou variveis de acordo com o tipo de controle de acesso de ambos.
7.1. Padro
O acesso a classes pode ser padro ou pblico. Quando possui acesso padro, a classe no precedida por um modificador em sua declarao. O acesso padro considerado como o acesso ao nvel do pacote, uma vez que classes com esse tipo de acesso so encontradas somente pelas classes que fazem parte do mesmo pacote. Caso duas classes estejam em pacotes distintos e uma delas possua acesso padro, a outra dever desconsiderar sua existncia para que no haja problema durante a compilao.
Observemos os exemplos a seguir, nos quais temos dois arquivos de cdigo-fonte:
package grupo; class Animais { }
import grupo.Animais; class Gato extends Animais { }
Em ambos os arquivos de cdigo-fonte descritos, temos Animais, que a superclasse, e temos Gato, que a subclasse. Tendo em vista que h uma instruo de importao no comeo do arquivo Gato, e que esta realiza uma tentativa de importar Animais, a compilao do arquivo Gato apresentar problemas, ao contrrio da compilao do arquivo Animais.
Vejamos a mensagem resultante do processo de compilao de Gato:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 62 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio C:\Java\Exemplos\Gato.Java:3: grupo.Animais is not public in grupo; cannot be accessed from outside package import grupo.Animais; ^ C:\Java\Exemplos\Gato.java:5: cannot access Animais bad class file: .\Animais. class dass file contains wrong class: grupo.Animais Please remove or make sure it appears in the correct subdirectory of the classpath. class Gato extends Animais ^
O processo de compilao do arquivo Gato apresenta problemas devido ao fato de sua superclasse, Animais, encontrar-se em um pacote distinto do seu e, tambm, possuir acesso padro. Para solucionar esse problema, podemos colocar as duas classes em um nico pacote ou, ainda, declarar a superclasse Animais com a palavra-chave public.
7.2. Pblico
Conforme mencionado no subtpico anterior, a classe Animais pode ser declarada com a palavra-chave public para que, assim, todas as classes pertencentes a todos os pacotes possam acess-la. Observemos o exemplo a seguir:
package grupo; public class Animais { }
Neste exemplo, a classe Animais pode ser visualizada por todas as classes de Java e, portanto, instanciada a partir destas, assim como pode ser estendida. Somente a utilizao do modificador final para marcar essa classe impediria tal visualizao. Em suma, todas as classes de Java tem acesso a uma classe pblica, porm, a fim de utilizar uma classe pblica pertencente a um pacote distinto da classe criada, preciso que ela, a classe pblica, seja importada.
8. Superclasse
As classes que se encontram em nveis mais elevados de uma hierarquia so denominadas superclasses, as quais possuem uma subclasse. Sendo assim, subclasses so aquelas que se encontram um nvel abaixo de suas superclasses. Tendo em vista que uma classe sempre declarada como subclasse de uma classe existente, essa classe declarada herda, de forma automtica, todas as caractersticas de sua superclasse.
9. Classe Object
Definimos a classe Object como sendo a raiz para a definio de todas as classes, uma vez que, de forma implcita, toda classe criada sem que haja uma referncia sua superclasse derivada diretamente da classe Object. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 63 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Devido ao fato de as classes serem derivadas de forma direta da classe Object, os objetos de todas as classes tem as definies da classe em questo disponveis.
10. Classes abstratas
Entendemos por classes abstratas as classes a partir das quais no possvel realizar qualquer tipo de instncia. Membros que no so abstratos podem estar contidos nessas classes, tais como mtodos e variveis normais, entretanto, em sua declarao, essas classes abstratas preferencialmente devero ter um ou mais mtodos abstratos. A implementao desses mtodos responsabilidade da classe que tem a funo de estender a classe abstrata, uma vez que os mtodos abstratos no contm corpo e, tampouco, implementao. Como medidas de segurana, as classes abstratas somente podem ser estendidas, sendo que a criao de um objeto a partir da mesma um procedimento evitado. Alm disso, caso um ou mais mtodos abstratos estejam presentes nessa classe abstrata, a classe filha ser, ento, forada a definir tais mtodos, pois, caso contrrio, a classe filha tambm se tornar abstrata.
A funcionalidade dos mtodos abstratos que so herdados pelas classes filha normalmente atribuda de acordo com o objetivo ou o propsito dessas classes. possvel, porm, no atribuirmos uma funcionalidade a esses mtodos abstratos. Neste caso, faz-se necessrio, pelo menos, declarar tais mtodos.
10.1. Mtodos abstratos
Conforme visto anteriormente, os mtodos abstratos esto presentes somente em classes abstratas, e so aqueles que no possuem implementao. A sintaxe desse tipo de mtodo a seguine:
abstract <tipo_retorno> <identificador> ;
No exemplo a seguir, faremos com que a classe Funcionrios seja abstrata e, como ela ser a classe base, outras duas classes, Motorista e Secretaria, sero derivadas dela. Observemos:
abstract class Funcionario { String nome; int salario; void setSalario(int val) { salario = val; }
int getSalario() { return salario; }
abstract void reajuste(); }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 64 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Nota: A palavra abstract como prefixo da declarao da classe Funcionario indica que esta classe abstrata, contudo, quando ela utilizada como prefixo da declarao do mtodo reajuste(), essa palavra reservada indica que este um mtodo abstrato e, portanto, no possui uma definio.
O exemplo a seguir mostra como o mtodo reajuste() implementado nas classes Motorista e Secretaria e, ainda, como ele utilizado com a finalidade de calcular o reajuste salarial para esses funcionrios. Vejamos, ento, como definir as classes motorista e secretaria:
Definindo a classe motorista
class Motorista extends Funcionario { int hab; void reajuste() { System.out.println(" Executando Clculo Salrio"); salario += 150; } }
O mtodo reajuste(), que na superclasse est como abstrato, implementado na classe Motorista.
Definindo a classe secretaria
class Secretaria extends Funcionario { int toques; void reajuste() { System.out.println(" Executando Clculo Salrio"); saIario += 300 ; } }
Assim como na classe Motorista, na classe Secretaria tambm implementado o mtodo reajuste().
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 65 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap6_Ex3 { public static void main(String arg[]) { Motorista m = new Motorista(); Secretaria s = new Secretaria(); m.setSalario(1200); m.reajuste(); System.out.println("Motorista salrio: " + m.getSalario()); System.out.println(); s.setSalario( 1700); s.reajuste(); System.out.println("Secretaria salrio: " + s.getSalario()); } }
Alm de utilizarmos classes abstratas como descrito no exemplo anterior, tambm possvel utilizar classes abstratas em conjunto ao polimorfismo. Vejamos a seguir:
abstract class Colaborador { int nfunc; String nome_func;
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 66 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio // definindo a classe Condutor como derivada de Colaborador class Condutor extends Colaborador { int habilitacao; Condutor(int func, String nome, int hab) { super(func, nome); habilitacao = hab; } void le() { System.out.println(" Habilitao: " + habilitacao); mostra(); } }
// definindo a classe SecretariaJr como // derivada de Colaborador class SecretariaJr extends Colaborador { int velocidade_dig; SecretariaJr(int func, String nome, int dig) { super(func, nome); velocidade_dig = dig; } void le() { System.out.println("velocidade de digitao.: " + velocidade_dig); mostra(); } }
class Cap6_Ex4 { public static void main(String arg[]) { Colaborador BASE[] = new Colaborador[4]; BASE[0] = new Condutor(200, "Henrique", 89); BASE[1] = new SecretariaJr(40, "Simone", 67); BASE[2] = new SecretariaJr(210, "Mari", 77); BASE[3] = new Condutor(300, "Alexandre", 800); for (int x = 0; x<4; x++) BASE[x].le(); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 67 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 11. Classes finais
As classes que so declaradas com a palavra-chave final, as chamadas classes finais, no podem ser estendidas por outras classes. Sendo assim, as classes finais devem ser criadas somente nas situaes em que desejamos assegurar que nenhum de seus mtodos seja sobreposto. Alm disso, utilizar a palavra-chave final assegura que a implementao de determinados mtodos no ser alterada.
Nota: O compilador apresentar erros caso haja uma tentativa de estender uma classe final.
importante ressaltar que somente devemos criar uma classe final quando houver certeza de que ela realmente possui todas as definies que devem ser estabelecidas em seus mtodos, pois outro programador no ser capaz de otimizar essa classe e, tampouco, torn-la mais especfica. De fato, dificilmente cria-se uma classe final, uma vez que ela no permite a extenso das classes e, portanto, elimina uma das principais caractersticas da programao orientada a objetos. Sendo assim, para que outros programadores no tenham problemas nas situaes em que precisam estender a classe, devemos utilizar a palavra-chave final somente quando isso realmente for necessrio. Os exemplos descritos a seguir mostram como declarar a classe final Animais e, em seguida, o que acontece se tentarmos compilar a subclasse Gato. Vejamos:
package grupo; public final class Animais { public void essencialMethod () { } }
import grupo.Animais; class Gato extends Animais { }
O erro resultante da compilao de Gato o seguinte:
>javac Gato.java Gato.java:3 Can't subclass final classes: class Cert.Animais class Gato extends Animais { 1 error
Devido ao fato de no podermos estender classes finais, caso encontrssemos qualquer problema em um de seus mtodos e no tivssemos o cdigo-fonte, este no poderia ser alterado a fim de otimizar esse mtodo. Entretanto, em situaes como esta, classes que no so finais podem ser estendidas, fazendo com que o mtodo seja sobreposto em uma subclasse. Isso solucionaria os problemas apresentados.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 68 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Exerccios de Fixao:
1 - Desenvolver a classe Cliente com os atributos nome, telefone e endereo, e o mtodo tela que deve mostrar em tela os dados de cada cliente. Desenvolver a classe Cadastrar, que dever instanciar a classe Cliente criando os seguintes objetos:
Depois de compilada e executada a classe Cadastrar, o resultado deve ser semelhante ao abaixo:
Nome Cliente: Vanessa Telefone: (011) 5555-5555 Endereo: Av. Tiradentes, 2000 ------------------------------- Nome Cliente: Mrcia Telefone: (011) 6666-7070 Endereo: Rua Maranho, 328 ------------------------------- Nome Cliente: Ernesto Telefone: (011) 5555-6677 Endereo: Rua Alemanha, 727 -------------------------------
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 69 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 7
1. Introduo
Para determinarmos o comportamento dos objetos existentes em uma classe, utilizamos os mtodos, que so a implementao de uma operao para uma classe. Eles podem ser aplicados a vrias classes diferentes, mas todos os objetos que esto em uma mesma classe compartilham os mtodos aplicados a eles. Quando o mtodo aplicado a diversas classes, temos o polimorfismo, ou seja, o mtodo assume formas diferentes em classes tambm diferentes. Vejamos um exemplo: temos a classe Carro. Aos objetos dessa classe, atribumos os seguintes mtodos: andar, abastecer, parar. O mtodo abastecer pode ser implementado de vrias formas nos objetos da classe Carro, e isso varia conforme o tipo de abastecimento que o carro pode ter: lcool, gasolina ou diesel. A partir disso, vimos que esse mtodo ter sempre a mesma funo, que abastecer, mas cada tipo de abastecimento ser implementado de uma forma diferente. Em Java, assim como nas demais linguagens, os mtodos so comparados com as antigas funes presentes em linguagens procedurais. Eles so declarados e chamados dentro de programas em Java, que so classes ou interfaces. Cada mtodo tem uma funo especfica. Para utiliz-lo, devemos primeiramente nos preocupar com a sua definio. Vejamos os itens que devem ser definidos em um mtodo:
Nome; Parmetros recebidos, quando houver; Comandos (corpo do mtodo); Valor de retorno, quando houver.
2. Estrutura dos mtodos
A partir de agora, estudaremos alguns fundamentos dos mtodos. Comearemos pela sintaxe, que a seguinte:
tipo nomeDoMetodo(lista-de-parmetros) { // Corpo do mtodo }
Em que:
tipo refere-se ao tipo de dados vlido, retornado pelo mtodo. Esse tipo pode ser qualquer um, incluindo aqueles de classes desenvolvidas pelo programador;
nomeDoMetodo refere-se ao nome do mtodo, que pode ser um identificador legal que no seja utilizado por outros itens do escopo atual;
lista-de-parmetros refere-se sequncia de pares compostos de um tipo e um identificador. Ambos esto separados por vrgulas.
Com relao aos parmetros, eles so variveis, ou seja, eles recebem o valor dos argumentos que so passados para o mtodo assim que este chamado. Quando no houver PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 70 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio parmetros para o mtodo, no deve ser inserido contedo entre os parnteses (lista-de- parmetros).
Quando o mtodo no retornar um valor, ele deve ser declarado como void. J se esse mtodo retornar um valor, mas que no seja void, o valor ser retornado para a rotina que fez a chamada do mtodo. Para isso, o comando return utilizado. Observemos no exemplo a seguir:
tipo nomeDoMetodo(lista-de-parmetros) { // Corpo do mtodo return valor; }
3. Criando mtodos
Para criarmos um mtodo, primeiramente, devemos considerar a utilizao da seguinte sintaxe:
static um operador que indica que os mtodos podem ser referenciados dentro da mesma classe em que foram criados;
<tipo> o tipo de retorno do mtodo, ou seja, o tipo de dado (int, boolean, short, var, long, etc);
<nome> refere-se ao nome do mtodo;
<tipo> par1 e <tipo> par2 referem-se ao tipo e ao nome (par1 e par2) dos parmetros que podem ou no ser recebidos;
comandos; o local onde informamos a ao que o mtodo executar.
Agora, utilizaremos o seguinte exemplo: precisamos criar um mtodo que efetue a soma de dois nmeros recebidos como parmetros.
static int soma (int val1, int val2) { int result; result = val1 + val2; return result; }
Em que: PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 71 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
int o tipo de retorno do mtodo, ou seja, define o tipo de dado int (valores numricos e inteiros); soma o nome que definimos para o mtodo; int val1 e int val2 indicam que o mtodo (soma) receber um parmetro do tipo inteiro que possui o nome vali e val2; { um caractere obrigatrio para definirmos um mtodo em Java, e indica o incio do corpo do mtodo; int result; significa uma varivel do tipo inteiro que est sendo criada. Nesta varivel, ser armazenada a soma dos valores recebidos como parmetros (val1 e val2); result = val1 + val2 refere-se varivel result que receber o valor da soma dos parmetros vali e val2; return result; indica que qualquer chamada ao mtodo soma receber como valor de retorno o resultado da varivel result; } um caractere obrigatrio para definirmos um mtodo em Java , e indica o fechamento do corpo do mtodo.
4. Chamada de mtodos
Depois de definirmos um mtodo, necessrio referenci-lo, ou seja, fazer uma chamada ao mtodo. Vejamos como isso feito:
class Cap7_Ex1 { static int soma (int val1, int val2) { int result; result = val1 + val2; return result; }
static public void main(String args[]) { int s; //definio simples de varivel s = soma(15, 20); //atribuindo a "s" a chamada // do mtodo soma com dois valores System.out.println("s = " + s); //mostra o valor // de s na tela (s=35) } }
5. Passagem de parmetros; Por valor e por referncia
H dois modos de passarmos os argumentos para uma funo, ou seja, valores para mtodos. Esses modos dependem do que est sendo passado. Vejamos a seguir:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 72 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Passagem de argumentos por valor Ao passar o argumento para um mtodo por valor, este copia o valor do argumento para o parmetro correspondente. Ento, o parmetro do mtodo passa a ser uma cpia do argumento. Esse parmetro poder sofrer alteraes e elas no sero refletidas no argumento original que foi utilizado para chamar o parmetro. Este modo utilizado quando passamos tipos bsicos para o mtodo, tais como int, boolean e char.
Passagem de argumentos por referncia Se o argumento passado por referncia, ser atribuda ao parmetro uma referncia para o argumento original, e no uma cpia do valor como no outro modo. A referncia, ento, utilizada para acessar o argumento que est definido na chamada. Quanto s alteraes efetuadas no parmetro, elas tm efeito sobre o argumento original que utilizado para chamar o mtodo. Este procedimento utilizado quando passamos tipos construdos para o mtodo, tais como strings e novos objetos.
Parmetro refere-se a uma varivel definida por um mtodo. Quando esse mtodo chamado, a varivel recebe um valor.
Argumento refere-se a um valor atribudo a um mtodo quando este invocado.
No exemplo a seguir, mostraremos como utilizar a passagem de argumentos por valor e por referncia:
class Cap7_Ex2 { public static void main(String args[]) { Pessoa maria = new Pessoa(); int valor = 1500; maria.sexo = 'f'; maria.cabelo = "encaracolados"; maria.idade = 50; System.out.println("Valores antes da chamada " + " do mtodo"); System.out.println(); System.out.println("Valor = " + valor); System.out.println(); System.out.println("Maria sexo = " + maria.sexo); System.out.println(" Maria cabelo = " + maria.cabelo); System.out.println(" Maria idade = " + maria.idade); altera(maria, valor); System.out.println(); System.out.println("Valores DEPOIS da chamada " + "do mtodo"); System.out.println(); System.out.println("Valor = " + valor); System.out.println(); PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 73 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio System.out.println(" Maria sexo = " + maria.sexo); System.out.println("Maria cabelo = " + maria.cabelo); System.out.println(" Maria idade = " + maria.idade); }
static void altera(Pessoa p, int valor) { p.sexo = 'm'; p.cabelo= "loiros"; p.idade = 33; valor = 137; } }
Em que:
Na linha altera(Pessoa p, int v), temos o seguinte:
altera() o mtodo; (Pessoa) o primeiro parmetro passado para o mtodo altera(), sendo que o objeto inteiro passado como parmetro; (int) o segundo parmetro passado para o mtodo altera().
Pelo resultado final apresentado na tela, poderemos observar o tratamento que dado quando os dados passados so de tipos bsicos e tipos construdos.
6. Comando return
Para retornarmos de um mtodo explicitamente, utilizamos o comando return. Com ele, a execuo do programa volta para o chamador do mtodo, terminando, ento, o mtodo no qual executado.
Observemos o exemplo a seguir:
class Cap7_Ex3 { public static void main(String args[]) { int num= 5; System.out.println("Linha anterior ao comando " + " return."); if(num <=5) return; System.out.println("Esta linha no ser executada"); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 74 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 7. Acesso a mtodos
Quando precisamos restringir o acesso a um mtodo, utilizamos os moderadores de acesso. Porm, devemos saber que um mtodo sempre acessvel, independentemente do moderador que for escolhido para a restrio. Isso significa que podemos utilizar um outro mtodo qualquer que est na mesma classe para chamar o mtodo cujo acesso est restrito. A seguir, esto descritos os moderadores de acesso disponveis na linguagem Java:
Public Quando utilizamos o moderador public, significa que o mtodo pode ser chamado a partir de outros mtodos de qualquer classe. Isso ocorre porque o mtodo pblico.
Nota: A menor restrio atendida com o moderador public.
Protected Ao utilizarmos o moderador protected, significa que o mtodo pode ser chamado apenas pelas classes que fazem parte do conjunto package. Isso ocorre porque o mtodo fica protegido.
Nota: O package corresponde a um modo utilizado para que vrias classes, as quais tm um relacionamento estreito, sejam organizadas. Ainda com relao protected, se houver uma tentativa de uma classe que no pertence ao package de chamar um mtodo protegido, ocorrer o que chamamos de violao. Essa violao no sinalizada com preciso pelo compilador e, por esse motivo, podemos encontrar problemas em identific-la. Se isso ocorrer, poderemos receber na tela uma mensagem do seguinte tipo: No method matching funo() found in class nomeClasse
Private Utilizando este moderador, indica que o mtodo particular da classe em que ele se encontra. Sendo assim, ele somente pode ser utilizado nessa classe.
Private Protected Este moderador de acesso permite que o mtodo seja acessado pela classe no qual ele se encontra e, tambm, pelas classes derivadas dela. importante sabermos, no entanto, que isso somente possvel em um mesmo arquivo-fonte.
Friendly Este moderador de acesso o padro e ser utilizado sempre que no for definido um outro moderador explicitamente. Com ele, o mtodo pode ser utilizado tanto na classe em que est quanto em qualquer outra classe derivada dela, mesmo que essa classe derivada no pertena ao package.
8. Modificadores de mtodos
O mtodo possui propriedades que precisam ser especificadas. Para especific-las, utilizamos o modificador de mtodo, a partir do qual determinamos se as classes derivadas podem ou no alterar ou redefinir o mtodo. Adicionalmente, o modificador nos permite definir o modo como o mtodo ser apresentado. Vejamos, a seguir, quais so os modificadores de mtodo disponveis na linguagem Java:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 75 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Abstract O mtodo que possui o modificador abstract abstrato, ou seja, no tem o seu corpo especificado. Podemos dizer que este modificador pede para que o corpo seja completado por uma declarao feita por uma classe derivada. A seguir, mostraremos as duas formas de escrever um mtodo abstraio, visto que o uso da palavra abstract opcional:
abstract void print(); ou void print();
Devemos saber que no podemos instanciar uma classe que possui um mtodo abstrato ou uma classe derivada de outra na qual existe um mtodo abstrato.
Final Com este modificador, o mtodo no pode ser alterado nem redefinido por nenhuma classe derivada. importante sabermos que obrigatrio que o mtodo declarado como final possua um corpo. Native Ao utilizar este modificador, apenas o cabealho declarado, ou seja, no h corpo. Adicionalmente, o native designa um mtodo implementado em outra linguagem.
Static Este modificador permite que o mtodo seja compartilhado pelos objetos instanciados pela mesma classe. O mtodo static no faz distino entre os objetos que o compartilham, sendo assim, ele no pode acessar as variveis declaradas dentro de uma classe. Mas se a varivel tambm for declarada como static, ela poder ser acessada pelo mtodo static.
Synchronized O modificador de mtodo synchronized impede que os dados de uma classe sejam acessados ao mesmo tempo por dois mtodos que esto em execuo concorrentemente. Sendo assim, os outros mtodos precisam esperar para acessar os dados que estiverem sendo acessados por outro mtodo. O synchronized utilizado para o desenvolvimento de um programa de processamento concorrente.
9. Membros estticos
Para especificarmos que um membro esttico, basta prefixarmos sua declarao a palavra reservada static. Uma caracterstica importante de membros estticos que os mesmos podem ser referenciados pelo prprio nome da classe em que foram definidos, sem a necessidade de criarmos objetos dessa classe para que possamos acossar os membros estticos fora da mesma. Por esse motivo, podemos nos referenciar a eles como membros de classe.
9.1. Atributos estticos
Ao colocarmos a palavra reservada static juntamente com a definio de um atributo, este torna-se esttico. Isso significa que o valor do atributo ser o mesmo em todas as instndas da classe a que pertence. Caso um atributo esttico possua 100 instncias provenientes da mesma classe, quando alterarmos esse atributo em uma dessas instncias, automaticamente a alterao refletir nas demais instncias da classe. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 76 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
9.2. Mtodos estticos
Ao colocarmos a palavra reservada static juntamente com a definio de um mtodo, este torna-se esttico. Isso no significa que o seu valor no possa mudar, mas sim que somente haver uma referncia para esse mtodo disponvel em memria. A static uma das palavras-chave da linguagem Java. Quando ela colocada junto ao mtodo, indica que dentro dele somente podemos acessar outros mtodos ou variveis que tambm sejam declarados como static. Essa a principal caracterstica de um mtodo static, e devemos sempre nos lembrar dela. Tanto uma varivel esttica quanto uma varivel que no seja esttica podem ser definidas dentro do mtodo static. Para acessarmos um membro ou mtodo que no seja esttico, devemos criar uma instncia da classe correspondente para chamar o item desejado. Porm, quando os membros no so estticos, podemos acessar ambas as propriedades: as estticas e as no-estticas. Isso tudo ocorre porque no h dentro do mtodo esttico uma referncia para o ponteiro this, o qual utilizado quando precisamos referenciar as propriedades da classe com a qual se est trabalhando.
Observemos, a seguir, um exemplo em que utilizamos static:
class Cap7_Ex4 { public static void main(String args[]) { Manutencao corredor = new Manutencao(); System.out.println(); System.out.println("08:00 - Hora de checar " + "Elevadores"); corredor. controle(8); corredor.situacao(); System.out.println(); System.out.println("22:00 - Hora de checar " + "Elevadores"); corredor.controle(22); corredor.situacao(); PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 78 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio System.out.println(); System.out.println("24:00 - Hora de checar " + "Elevadores"); Corredor.controle(24); corredor.situacao(); } }
10. Mtodo main()
O main() o mtodo static mais utilizado na linguagem Java, por meio do qual a aplicao passa a ser executada. Portanto, quando desejamos utilizar algum mtodo ou realizar alguma operao no programa, fazemos isso dentro do mtodo main(). importante observarmos que toda aplicao ou programa escrito em linguagem Java deve ter obrigatoriamente um nico mtodo main() para que possa ser executada. Sendo assim, vejamos as regras para utilizarmos esse mtodo:
O acesso deve ser public; Deve ser static; No deve retornar um valor (void); Deve receber como argumento um array de string (String args[ ]).
A seguir, temos um exemplo que nos mostra o fluxo de execuo de um programa em Java quando existem chamadas de mtodos:
class Cap7_Ex5 { /*** definio do mtodo func ***/ static void func() { System.out.println("Executando a funo de nome " + "func"); } /*** trmino da definio ***/
static public void main(String args[]) { System.out.println("Executando o primeiro comando"); System.out.println("Executando o segundo comando"); System.out.println(" . "); System.out.println(" . "); System.out.println(" . "); func(); System.out.println("Sou o prximo comando que " + "segue a chamado da funo"); System.out.println(" . \n"); System.out.println(" . \n"); System.out.println(" . \n"); System.out.println(" Executando o ultimo " + " comando\n"); }} PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 79 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio No exemplo a seguir, outros mtodos podem ser chamados a partir de outros mtodos. Vejamos:
static public void main(String args[]) { System.out.println("\"main\", o ponto de partir"); BB(); } }
11. Sobrecarga de mtodos
Na linguagem Java, podemos definir dois ou mais mtodos dentro de uma mesma classe. Este procedimento conhecido como sobrecarga de mtodos, pois os mtodos so sobrecarregados. Neste procedimento, as declaraes de parmetros devem ser diferentes, porm, o nome utilizado o mesmo. Quando chamamos um mtodo sobrecarregado, utilizamos um guia para definir qual verso desse mtodo deve ser executada. Esse guia corresponde ao tipo e ao nmero dos argumentos e, por esse motivo, ambos devem ser diferentes para cada um dos mtodos sobrecarregados. Mas devemos atentar para o seguinte: o tipo retornado dos mtodos sobrecarregados no suficiente para que as suas verses sejam distintas. Isso ocorre porque a verso do mtodo que possui parmetros correspondentes com os argumentos da chamada executada quando for encontrada uma chamada a um mtodo sobrecarregado. Observemos dois exemplos de sobrecarga de mtodos:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 80 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Sobrecarga { void mostra(int val) { System.out.println("0 valor informado foi: " + val); } void mostra(String nome) { System.out.println("Foi informado o nome: " + nome); }
void mostra() { System.out.println("Nada foi informado!"); } }
class Cap7_Ex8 { public static void main(String args[]) { Sobrecarga sob = new Sobrecarga(); System.out.println(); sob.mostra( "Ernesto"); sob.mostra(); sob.mostra(38); } }
12. Uso do this
Quando precisamos fazer referncia a um objeto criado dentro da prpria classe, utilizamos a palavra this. Vejamos as duas situaes que, a princpio, exigem a utilizao da palavra this:
Quando uma referncia de uma classe deve ser passada pela prpria classe a um mtodo; Quando uma classe possui duas variveis com o mesmo nome, sendo que uma varivel pertence classe e a outra pertence aos mtodos dessa classe.
Nesta ltima situao, utilizamos a palavra this apenas se o mtodo ao qual a varivel pertence precisar referenciar um campo da classe. A partir dessas informaes, vejamos o exemplo seguinte;
class Empregado { private String endereco; private int idade;
void setEndereco(String endereco) { this.endereco=endereco; } PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 81 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
void setldade(int idade) { this.idade=idade; }
String mostra() { return endereco + idade; } }
class Cap7_Ex10 { public static void main(String args[]) { Empregado emp = new Empregado(); System.out.println(); emp.setEndereco("Centro"); emp.setldade(40); System.out.println(emp.mostra()); } }
Nesse exemplo, a palavra this refere-se aos atributos definidos na classe, e no aos parmetros dos mtodos. Observando o mtodo mostra(), verificamos que no foi necessrio utilizarmos this. Isso porque quando o atributo est claro e os parmetros no possuem nomes iguais, implicitamente qualquer referncia a nome ou endereco assume o atributo da classe.
Nota: Mesmo que os nomes de atributos e parmetros em uma classe possam ser iguais, aconselhamos que essa tcnica no seja utilizada.
13. Mtodo recursivos
Quando um mtodo realiza uma chamada a si mesmo, tanto as variveis locais quanto os parmetros criados por cada chamada ficam armazenados nas pilhas. Ao realizarmos a chamada a um mtodo recursivo, apenas os argumentos so novos, ou seja, no so criadas novas cpias do mtodo. Sendo assim, as variveis locais e os parmetros antigos so removidos da pilha quando cada uma das chamadas recursivas retorna, e o cdigo do mtodo executado com as novas variveis desde o comeo (ponto de chamada dentro do mtodo). H duas verses de rotinas: as recursivas e as iterativas. A primeira verso, recursiva, pode ser executada de forma mais lenta com relao verso iterativa. Isso possvel devido sobrecarga adicional das chamadas realizadas s funes. Conforme vimos, as variveis locais e os parmetros so armazenados na pilha. A cada chamada realizada ao mtodo, so criadas cpias dessas variveis e desses parmetros, e isso pode fazer com que a pilha se esgote. Quando isso acontece, temos o que conhecemos por estouro de pilha, que nada mais do que uma grande quantidade de chamadas recursivas a um mtodo. Nesse caso, o sistema runtime de Java causar uma exceo. Devemos atentar que para forarmos o retorno de um mtodo sem que a chamada recursiva PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 82 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio seja executada, devemos utilizar uma condio if no cdigo. Caso contrrio, o mtodo no ser retornado quando for chamado. E para que possamos acompanhar o algoritmo recursivo enquanto ele est sendo implementado, podemos utilizar o mtodo printIn(). Com ele, possvel visualizarmos passo-a-passo cada uma das partes de nosso cdigo que est sendo executada.
Exerccios de Fixao:
A - Desenvolver uma calculadora em Java que possua as quatro operaes aritmticas bsicas. Devero ser criadas duas classes: class Calculadora e class UsaCalculadora.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 83 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 8
1. Introduo
No momento em que um objeto criado, ele imediatamente tem seu estado interno inicializado por meio do mtodo construtor. Este mtodo, sintaticamente similar a qualquer outro tipo de mtodo, identificado pelo mesmo nome da classe na qual ele est localizado. Quando definido, o construtor automaticamente solicitado logo que o objeto criado. Isto feito antes mesmo que o operador new complete seu procedimento de instanciao. O construtor tem a capacidade de armazenar valores, que sero repassados ao objeto quando este for criado. Ainda, o mtodo citado tem a finalidade de desempenhar alguma operao ou clculo antes mesmo de partir para qualquer tipo de operao junto ao objeto. Uma das principais caractersticas do construtor a de no possuir tipo retornado, isto porque o construtor de uma classe retorna o mesmo tipo da prpria classe. Nem mesmo o tipo void retornado pelo construtor. O construtor, tambm, pode usar a sobrecarga de mtodos, de modo que um mesmo objeto possa ser desenvolvido de diversas maneiras. Em uma sobrecarga de mtodos, podemos ter dois ou mais mtodos com o mesmo nome dentro de uma classe, contanto que suas assinaturas de parmetros, como tipo, ordem e nmero, sejam diferentes.
2. Construtor padro
Um procedimento que o programador deve tomar o de definir explicitamente um mtodo construtor para uma classe mais sofisticada. Quando tal tarefa no feita, o prprio compilador do Java se encarrega de criar um construtor padro. O construtor padro definido pelo compilador do Java muitas vezes eficaz se estamos trabalhando com classes simples. O que ele faz inicializar todas as variveis de instncia para zero. J para classes mais complexas, o ideal definir mtodos construtores de maneira explcita. Com base em uma classe qualquer, identificamos um mtodo construtor padro como aquele cuja lista de parmetros formais est vazia.
class Calcado { // este o mtodo construtor padro da classe Calcado() { // as instrues aqui sero opcionais } }
class CriaCalcado { pubtic static void main (String args[]) { Calcado sandalia = new Calcado() ; //instanciao ok .... } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 84 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio A partir do momento em que o programador define um construtor, o construtor padro deixa de ser utilizado. Quando uma nova instncia da classe for feita, devemos sempre informar os parmetros exigidos pelo mtodo que acabara de ser definido.
class Calcado { //agora este o mtodo construtor da classe //exigindo parmetros no ato da instanciao Calcado (String cor, int tamanho ) { //este o local onde entraria o tratamento dos //parmetros recebidos } }
class CriaCalcado { public static void main (String args[]) { Calcado sandalia = new Calcado(); //instanciao // erro!.... } }
Para que o processo que acabamos de ver fosse bem sucedido, deveramos fazer o seguinte:
Calcado sandalia = new Calcado(" Preta", 36); //instanciao ok
A seguir, temos um exemplo de uso do mtodo construtor.
class Carro { private String modelo; private int ano; Carro(String modelo, int ano) { this. modelo = modelo; this.ano = ano; } String mostra() { return modelo + ano ; } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 85 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap08_Ex1 { public static void main(String args[]) { Carro car = new Carro("Fiat Uno ", 2000); System.out.println(car.mostra ()); } }
3. Princpios dos contrutores
Para compreender adequadamente a respeito dos construtores, importante ter conhecimento de algumas regras, as quais esto descritas a seguir:
Os construtores esto livres para utilizar qualquer modificador de acesso, incluindo o private.
O modificador private (construtor privado) determina que apenas o cdigo dentro da prpria classe est capacitado a instanciar um objeto desse tipo. Caso a classe do construtor privado permita o uso de uma parte de sua instncia, fundamental que ela disponha de uma varivel ou mtodo esttico para que uma instncia gerada dentro da classe possa ser acessada;
O nome do construtor e da classe devem coincidir;
Os construtores no devem possuir um tipo de retorno;
Um mtodo com o mesmo nome da classe vlido, mas isso no far deste mtodo um construtor. A presena de um tipo de retorno continuar fazendo dele um mtodo;
Um mtodo construtor padro ser criado automaticamente pelo compilador do Java caso um construtor no seja inserido no cdigo da classe;
O construtor padro nunca ter argumentos;
Se j tivermos inserido algum argumento no cdigo da classe e quisermos ter um construtor sem argumentos, ele no poder ser fornecido pelo compilador;
A chamada a um construtor sobreposto (this()) ou ao construtor da superdasse (super()) deve ser a primeira instruo de todo construtor;
Se no digitarmos a chamada a super() quando inserimos um construtor, uma chamada a super() sem argumentos ser includa automaticamente pelo compilador do Java;
Uma chamada a super() pode tanto ter os argumentos que foram passados para o construtor da superclasse como pode no conter nenhum argumento;
Um construtor sem argumentos no necessariamente o construtor padro, j que podemos criar um construtor sem argumentos prprio;
Uma chamada ao mtodo de uma instncia ou acesso a uma varivel de instncia no pode PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 86 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio ser feita at que o construtor da superclasse tenha sido executado;
Variveis e mtodos estticos podem ser acessados, mas s podem ser utilizados como parte da chamada a super() ou a this ();
As classes abstratas possuem construtores. Toda vez que uma subclasse concreta instanciada, estes construtores so chamados;
Por no fazerem parte da rvore de herana de um objeto, as interfaces no possuem construtores;
A condio para que um construtor possa ser chamado que ele esteja dentro de um outro construtor;
Um construtor no pode ser chamado efetivamente por meio de um cdigo;
A seguir, temos as principais caractersticas de um mtodo construtor:
Possui o mesmo modificador de acesso da classe;
No possui argumentos;
Inclui uma chamada sem argumentos ao construtor da superclasse (super()).
Se tivermos o construtor de uma superclasse com argumentos, devemos fazer uma chamada a super, junto dos argumentos apropriados. Diante de uma superclasse que no tenha um construtor sem argumentos, devemos inserir um construtor na classe (subclasse). Isto necessrio a fim de que tenhamos um local para que a chamada ao construtor da superclasse (com os argumentos apropriados) seja inserida, e para que o construtor padro criado pelo compilador do Java possa ser usado na subclasse.
Um cdigo simples, como o que segue, no pode ser compilado sem a presena de um construtor super () sem argumentos:
class Calcado { Calcado (String c) { } }
class Sandalia extends Calcado { }
Pelo fato de no serem mtodos, os construtores no podem ser herdados e nem substitudos. O construtor padro que teremos ser, de alguma maneira, decidido pelo tipo ou tipos de construtores contidos na superclasse.
Voltamos a lembrar que um construtor padro nunca possui argumentos.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 87 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 9
1. Introduo
A herana possibilita que as classes compartilhem seus atributos e mtodos entre si. Para esta ligao entre as classes, a herana adota um relacionamento esquematizado hierarquicamente.
Na herana, temos dois tipos principais de classe:
Superclasse: A classe que concede as caractersticas a uma outra classe;
Subclasse: A classe que herda as caractersticas da superdasse.
A herana atua de maneira interativa com o encapsulamento, supondo que uma certa classe tenha alguns atributos encapsulados. Assim, uma subclasse desta classe herdar estes atributos encapsulados, alm de outros atributos adicionais que fazem parte da especializao da subclasse. O conceito de subclasses herdarem atributos de classes ancestrais assegura que programas orientados a objetos cresam de forma linear e no geometricamente em complexidade. Cada nova subclasse no possui interaes imprevisveis em relao ao restante do cdigo do sistema. Com o uso da herana, um objeto pode tornar-se uma instncia especfica de um caso mais geral. Explicando melhor, um objeto pode herdar os atributos gerais da respectiva classe me. Ele precisa apenas definir as caractersticas que o tornam nico na classe a qual pertence. De maneira natural, as pessoas visualizam o mundo como sendo formado de objetos relacionados entre si hierarquicamente. Vejamos a relao de animais, mamferos e cachorros. Os animais, sob uma descrio abstrata, apresentam atributos, tais como tamanho, inteligncia e estrutura ssea, e aspectos comportamentais, como mover-se, dormir, respirar, alimentar-se, entre outros. Os atributos e aspectos comportamentais descritos definem a classe dos animais. Se analisarmos os mamferos, que est dentro da classe de animais, notaremos atributos mais particulares, como tipo de dente, plos e glndulas mamrias. Os mamferos so classificados como uma subclasse dos animais, que por sua vez uma superclasse de mamferos. Pela chamada hierrquica de classes, a subclasse mamferos recebe todos os atributos de animais, partindo do princpio que uma subclasse recebe por herana todos os atributos de seus ancestrais.
No exemplo seguinte, temos a hierarquia de classes do cachorro:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 88 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Adotemos como exemplo um co da raa dlmata, pertencente espcie "Canis familiares", como visto no exemplo anterior. Por herana, o dlmata herda as caractersticas do gnero Canis, que por sua vez herda as caractersticas da famlia Candea, que por sua vez herda as caractersticas da ordem Carnvora e assim sucessivamente...
2. Criando uma herana
Adotemos como exemplo a classe Funcionrio:
class Funcionario { String nome, mail; int idade ; char sexo;
Ento, consideremos a criao de um cadastro de programadores de uma empresa. Entendemos que cada programador um Funcionrio, mas nem todo Funcionrio um programador. Esta relao nos obriga a criar uma extenso da classe Funcionario a fim de que a mesma contenha os dados especficos referentes aos programadores. Deste modo a extenso criada acaba herdando os membros existentes na definio da classe Funcionario. A seguir, temos a definio da classe Programador, que, pela herana, recebe as "caractersticas" da classe Funcionario, somadas definio de seus prprios membros:
class Programador extends Funcionario { String linguagem, sistOp;
A classe Programador que acabamos de criar uma extenso (tambm chamada de classe filha, derivada e subclasse) da classe Funcionario (tambm chamada de classe pai ou super classe). De acordo com o exemplo anterior, o extends, que define herana, faz com que a classe Programador herde as caractersticas da classe Funcionario.
Ressaltamos que o Java no trabalha com herana mltipla, ao contrrio de algumas linguagens.
Com a herana, podemos criar classes que herdem caractersticas de inmeras classes dotadas de funcionalidades prprias do Java, como applets, criao de componentes grficos, PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 89 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio multiprocessadores e outras. A seguir, temos um exemplo do uso de herana
Os membros privados da classe pai no podem ser referenciados na classe filha, mas podemos contornar esta condio, como mostrado no exemplo seguinte,
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 90 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Funcionario { private String nome, mail; int idade; char sexo;
class Cap9_Ex2 { public static void main(String args[]) { Programador senior = new Programador(); senior.setLinguagem("Java!", "Carol Cury" , "carolcury@ig.com"); System.out.println("Programador nome : " + senior.getNome()); System.out.println(" Programador linguagem : " + senior.linguagem); System.out.println(" Programador mail ; " + senior.getMail()); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 91 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 2.2. Acesso aos Membros da classe pai com super
Qualquer referncia feita com uso do operador super, dentro de uma classe filha, ser apontada diretamente para a classe pai. Apesar de no ser um procedimento recomendado, podemos manter atributos de nomes iguais nas classes pai e filha. No exemplo que segue, temos o uso do super na classe pai.
class Pai { double valor = 5.714; String conteudo = "Curso de Java"; }
class Filha extends Pai { double valor =8.921; String conteudo = "Carros antigos"; void mostra() { System.out.println ("Filha valor : " + valor); System.out.println ("Pai valor : " + super.valor); System.out.println(); System.out.println ("Filha conteudo : " + conteudo); System.out.println ("Pai conteudo ; " + super.conteudo); } }
class Cap9_Ex3 { public static void main(String args[]) { Filha filha = new Filha(); filha.mostra(); } }
Nota: Em Java, padro literrio que o nome da classe inicie com letra maiscula e o objeto tenha o mesmo nome em minsculo.
2.3. A Classe pai com sobrecarga do mtodo construtor
Imaginemos uma classe cujo mtodo construtor exija que os parmetros sejam passados no momento da instanciao da classe. Para tal classe, suponhamos a criao de uma classe derivada. Quando formos criar alguma instncia desta classe derivada, ou filha, teremos um problema. Pelo fato de o mtodo construtor da classe pai exigir parmetros, estes devem ser passados para a classe filha, que, por sua vez, os empurra de volta para a classe pai. O mtodo construtor padro da classe pai ser automaticamente chamado no momento da instanciao da classe filha. O fato que o construtor padro j no existe mais na classe pai, PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 92 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio o que nos obriga a chamar explicitamente o mtodo construtor da mesma, de forma a repassar ou empurrar seus parmetros exigidos por meio da classe filha. No exemplo a seguir, descrevemos como usar a instncia com redefinio do mtodo construtor pai:
class Funcionario { String nome, mail; int idade; char sexo;
O Exemplo a seguir mostra a forma correta de criar a instncia:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 93 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Na programao orientada a objetos, utilizamos o -UM: um tipo de relacionamento baseado na herana. Este relacionamento tem esse nome pois uma forma de classificarmos um item, por exemplo "Banana -UM fruto" ou "Cachorro -UM animal". Usamos a palavra-chave extends para expressar o relacionamento -UM:
public class Cachorro { } public class Dalmata extends Cachorro { // coisas importantes e especficas referentes // a Dlmata vo aqui // No esquecer que Dlmata herda os membros // de Cachorro acessveis }
No exemplo a seguir, descrevemos a ordem de como deve ser a rvore das classes:
public class Animais {...}
public dass Cachorro extends Animais {...}
public class Dalmata extends Cachorro {...}
De acordo com a terminologia utilizada pela programao orientada a objetos, correto dizer que:
Animais a superclasse de Cachorro; Cachorro a subclasse de Animais; Cachorro a superclasse de Dalmata; Dalmata a subclasse de Animais; Cachorro herda de Animais; Dalmata herda de Cachorro; Dalmata herda de Animais; PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 94 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Dalmata derivado de Cachorro; Cachorro derivado de Animais; Dalmata derivado de Animais; Dalmata um subtipo de Cachorro; Dalmata um subtipo de Animais.
De acordo com o conceito do -UM, "Cachorro estende Animais" quer dizer "Cachorro - UM Animal". J "Dalmata estende Cachorro" significa "Dalmata -UM Cachorro".
Ainda, podemos dizer que "Dalmata -UM Animal", j que a classe, na rvore de herana, poder ser considerada "um tipo do" item que estiver acima dela, mesmo que Dalmata no estenda Animais diretamente.
4. Relacionamento baseado na utilizao
Diferentemente do -UM, baseado na herana, o relacionamento TEM-UM baseia-se na utilizao, ou seja, ele acontece quando uma determinada classe apresenta uma referncia a uma instncia de uma outra classe, por exemplo "Um carro TEM-UM Conjunto de Pneus". Assim, o cdigo do exemplo em questo ficaria da seguinte maneira:
public class Veiculo { public class Carro extends Veiculo { private ConjuntoDePneus meuConjuntoDePneus; } }
De acordo com o cdigo que acabamos de ver, podemos constatar que a classe Carro possui uma varivel de instncia do tipo ConjuntoDePneus. Conseqentemente, podemos afirmar que "Carro TEM-UM ConjuntoDePneus", ou que Carro possui uma referncia a ConjuntoDePneus.
Na prtica, por meio da referncia a ConjuntoDePneus, o cdigo de Carro pode solicitar mtodos e usar o comportamento da classe ConjuntoDePneus sem a necessidade da existncia de um cdigo que esteja relacionado mesma dentro da prpria classe Carro.
Uma vantagem no uso de relacionamentos TEM-UM que podemos projetar classes utilizando as tcnicas de programao orientada a objetos sem o uso de classes monolticas que realizam diversos tipos de tarefas.
No uso de TEM-UM, recomendvel especializar ao mximo as classes, j que, quanto mais especializadas estas forem, maiores sero as chances das mesmas serem reaproveitadas por outros aplicativos. Na especializao, o cdigo de ConjuntoDePneus mantido em uma classe reservada e especializada. Se inserirmos todos os cdigos ligados classe ConjuntoDePneus dentro da classe Carro, o cdigo ConjuntoDePneus ser duplicado por todas as outras classes que podem fazer uso do seu comportamento.. A classe Carro contm uma referncia classe ConjuntoDePneus pelo fato da primeira declarar uma varivel de instncia do tipo ConjuntoDePneus. Toda vez que o cdigo chamar rodar() em uma instncia de Carro, esta ir chamar o mtodo na varivel de PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 95 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio instncia ConjuntoDePneus do objeto Carro. Como Carro contm uma referncia a ConjuntoDePneus, os cdigos que chamarem mtodos de Carro entendero como se esta classe tivesse o comportamento de ConjuntoDePneus, mas o que acontece, na verdade, que o objeto Carro delegar a tarefa de chamada do mtodo rodar() para a classe ConjuntoDePneus, por meio de meuConjuntoDePneus.rodar(). A seguir, temos a descrio de como ficaria esta delegao:
public class Carro extends Veiculo { private ConjuntoDePneus meuConjuntoDePneus;
public void rodar () { meuConjuntoDePneus.rodar() ; // Delega o // comportamento de rodar para o // objeto ConjuntoDePneus } }
public class ConjuntoDePneus { public void rodar() { // Realiza a tarefa atual de rodar aqui } }
Pela programao orientada a objetos, a classe Carro ir ocultar os detalhes da implementao, j que no inteno informar aos cdigos chamadores qual classe ou objeto ir realizar a tarefa solicitada por eles. Para estes cdigos, a impresso de que qualquer tarefa feita pelo objeto Carro.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 96 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
Captulo 10
1. Introduo
Definimos polimorfismo como sendo um princpio a partir do qual as classes que derivam de uma nica superdasse so capazes de invocar os mtodos que, embora apresentem a mesma assinatura, comportam-se de forma especfica para cada uma das classes derivadas. A fim de se comportar de acordo com cada classe derivada, os mtodos utilizam uma referncia a um objeto que representa o tipo da superclasse. O mecanismo de redefinio de mtodos utilizado para que todos os mtodos tenham a mesma assinatura, o que se faz necessrio no polimorfismo. Contudo, vale destacar que, ao utilizarmos o polimorfismo, o comportamento dos mtodos somente ser estabelecido em tempo de execuo.
Nota: Por meio do mecanismo de ligao tardia (late binding), seleciona-se o mtodo que ser utilizado, de acordo com o tipo da classe derivada. Essa seleo realizada em tempo de execuo.
O mecanismo em questo capaz de simplificar no somente a compreenso, mas tambm o desenvolvimento do cdigo orientado a objetos. Apesar disso, h algumas circunstncias nas quais possvel que o resultado da execuo seja no-intuitivo.
2. Run-time binding
O mecanismo de ligao tardia, tambm conhecido como dynamic binding ou run-time binding, deve ser suportado por uma linguagem de programao orientada a objetos a fim de que o polimorfismo possa ser utilizado. O conceito de ligao tardia indica que, somente no decorrer da execuo do programa, o mtodo que ser invocado definido. Quando trabalhamos com a linguagem de programao Java, a definio dos mtodos que sero executados sempre ocorre por meio da ligao tardia, exceto em duas situaes. Observemos, a seguir, quais so essas situaes:
Mtodos declarados como final A redefinio deste tipo de mtodo no possvel. Sendo assim, seus descendentes so incapazes de invoc-io de maneira polimrfica.
Mtodos declarados como private Este tipo de mtodo tambm no pode ser redefinido devido ao fato de, implicitamente, ele ser final.
Destacamos, tambm, o mecanismo de ligao prematura (early binding), que utilizado nas situaes em que se define o mtodo que ser invocado no decorrer do processo de compilao do programa.
3. O uso do polimorfismo
Polimorfismo um termo que caracteriza vrias formas. Estudaremos, neste momento, o uso do polimorfismo por meio de mtodos declarados na classe pai, tambm chamada de superclasse, e redefinidos na classe filha. Os mtodos redefinidos devem ter a mesma assinatura do mtodo presente na classe pai, pois, caso contrrio, haver uma sobrecarga. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 97 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Embora seja um pouco estranho redefinir um mtodo existente em outra classe e, ainda, com a mesma assinatura, isso pode ser essencial em classes que herdam o comportamento de outras. Caso o mtodo seja redefinido na classe filha, uma chamada a esse mtodo o executar. Se no houver essa chamada, o mtodo da classe pai ser executado. Um dos exemplos mais claros do uso de polimorfismo a criao de uma classe derivada de frame, cuja finalidade a construo de uma janela. A classe pai contm todos os mtodos para a construo dessa janela, mas as informaes adicionais necessrias para que o objeto tenha vida para complementar a Janela so de responsabilidade da classe filha, a qual utiliza para isso a implementao de um mtodo especfico. A seguir, teremos dois exemplos que demonstram o uso do polimorfismo:
class X { void messag() { System.out.println("mtodo messag da classe X"); } }
class Y extends X { void messag() { System.out.println("mtodo messag da classe Y"); } }
class Cap10_Ex1 { static public void main(String args[]) { X g = new X(); // g est referenciando objeto da // classe base g.messag(); // aqui ser executado o mtodo //messag da classe base
Y f = new Y(); g = f; // g passa a refenciar objeto da // classe derivada g.messag(); // aqui ser executado o mtodo // messag da classe derivada
X x1 = new Y(); // criao objeto X, mas apontando // para mtodo Y x1.messag(); // observe qual mtodo ser chamado } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 98 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio
class Desenho { void imprime() { System.out.println(figura no especificada); } }
class Cap10_Ex2 { static public void main(String args[]) { Desenho AR[] = new Desenho[6]; AR[0] = new Desenho(); AR[1] = new Triangulo(); AR[2] = new Quadrado(); AR[3] = new Quadrado(); AR[4] = new Triangulo(); AR[5] = new Triangulo(); for(int i = 0; i < 6; i++ ) AR[i].imprime(); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 99 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 11
1. Introduo
Em Java, os arrays so definidos como objetos que contm diversos valores de um mesmo tipo. Esses valores, os quais so os elementos desse array, so identificados ou referenciados por um ndice. Tal ndice um valor inteiro que determina a posio desses elementos dentro de um array.
2. Construo de arrays
Para que um array seja construdo, preciso primeiramente criar uma instncia utilizando o operador new. como na sintaxe descrita a seguir:
< tipo > < identificador > [ ] = new < tipo > [ n ocorrncias ]
A seguir, veremos um exemplo de como declarar um array cujo tipo String, cujo identificador nome, e com uma quantidade de 15 ocorrncias, ou seja, de 15 nomes distintos. Vejamos:
String nome [ ] = new String [15]
Ainda, podemos declarar um array cujo tipo int, cujo identificador nota, e com uma quantidade de 400 ocorrncias, ou seja, 400 notas distintas. Isso realizado da seguinte forma;
int notas [ ] = new int [400]
2.1. Acesso aos elementos do vetor
Para que possamos fazer uma referncia a um vetor criado, faz-se necessrio determinar o ndice em que desejamos realizar uma certa operao. A referncia a um vetor pode ser feita tanto para incluirmos valores quanto para realizarmos uma outra operao. Observemos os exemplos descritos a seguir para que possamos compreender essa referncia:
class Cap11_Ex1 { public static void main(String[] args) { String vogais[ ]; vogais = new String[4]; vogais[0] = "a"; //primeira posio (ndice) // vlida para vetor vogais[1] = "e"; vogais[2] = "i"; vogais[3] = "o"; // ltima posio (ndice) //vlida para vetor (n-1) vogais[4] = "u"; // erro - posio invlida System.out.println(vogais[0] + vogais[1] + vogais[2] + vogais[3]); PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 100 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio } }
No exemplo que ser descrito a seguir, teremos uma demonstrao do como utilizar arrays. Vejamos:
No exemplo que ser descrito a seguir, demonstraremos a utilizao de arrays com lao para que todos os seus valores sejam inicializados/lidos. Vejamos:
class Cap11_Ex3 { public static void main(String[] args) { int arrayNumeros[ ]; //declara arrayNumeros tipo int arrayNumeros = new int[10]; //faz uma instncia // preenche array com um valor e //depois o imprime na tela for (int i = 0; i < arrayNumeros.length; i++) { arrayNumeros[i] = i; System.out.print(arrayNumeros[i] + " "); } System.out.println(); } }
2.1.1. Acesso aos elementos do vetor atravs do for aprimorado
A estrutura for aprimorada, disponibilizada a partir da verso 5.0 do Java, no requer a utilizao de contadores para acessar os elementos de um vetor, ao contrrio da estrutura for tradicional utilizada em verses anteriores do Java, a qual requer o contador para acessar tais elementos.
Devemos ter em mente que a estrutura for aprimorada no deve ser utilizada para realizar alteraes sobre os elementos do vetor. Sua funo apenas permitir o acesso aos elementos do vetor sem a utilizao de contadores, sendo que tal alterao deve ser feita com o for PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 101 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio tradicional. Em uma estrutura for aprimorada, o parmetro composto por um tipo e um identificador do vetor cujos elementos sero percorridos. Os tipos de parmetros so baseados nos tipos de elementos contidos no vetor. Para compreendermos como funciona uma estrutura for aprimorada, vejamos a sintaxe e o exemplo a seguir:
for (parmetro: nomeVetor) comandos;
Exemplo:
class ForAprimorado { public static void main(String args[]) { int valor[], resultadoSoma; resultadoSoma = 0 ; valor = new int [5] ; valor[0] = 5; valor[1] = 10; valor[2] = 15; valor[3] = 20; valor[4] = 25; //Utilizando o a estrutura for aprimorada
for (int contador: valor) { resultadoSoma += contador; }
System.out.println("O resultado da soma dos " + "nmeros : + resultadoSoma); } }
2.2. Array com vrias dimenses
O exemplo descrito a seguir demonstra os processos de declarao e de instanciao de um array, de acordo com a seguinte situao: cadastraremos uma sequncia de 400 notas dos alunos de uma determinada escola. Para cada aluno, temos 3 notas distintas, sendo que a primeira refere-se matria Portugus, a segunda Matemtica e a terceira Histria. Observemos a seguir:
double nota [ ] [ ] = new double [400][3]; // 400 igual quantidade de alunos // 3 igual quantidade de notas nota[0][0] = 7.5; // primeira dimenso(0) / ndice(0) vlidos nota[0][1] = 2.3; nota[0][2] = 6.0; PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 102 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio nota[1][0] = 5.4; nota[1][1] = 9.0; nota[1][2] = 2.1; . . . nota[399][2] = ... // ltima dimenso(399)/ ndice(2) vlidos
Os vetores tambm podem ter vrias dimenses. O exemplo descrito a seguir demonstrar isso:
class Cap11_Ex4 { static public void main(String args[ ]) { int A[ ][ ] = new int[3][2]; int i,j; A[0][0] = 10; A[0][1] = 33; A[1][0] = 550; A[1][1] = 110; A[2][0] = 16; A[2][1] = 99;
Um array pode ser passado e recebido como parmetro. importante destacar que quaisquer alteraes realizadas nos valores do mtodo que receber um array como parmetro sero refletidas no array original. Isso significa que, assim como os tipos construdos, os arrays so passados como referncia. Observemos o exemplo a seguir, em que o vetor das funes passado e retornado:
class Cap11_Ex5 { static public void main(String args[ ]) { int A[ ]= new int[3]; int B[ ]= new int[3]; int i; A[0] = 10; A[1] = 20; // possvel substituir essas trs linhas A[2] = 30; // por int A[ ]={10,20,30}
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 103 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio B = fv(A); for( i = 0; i < 3; i++) System.out.println("B["+ i+ "]= "+ B[i]); }
Os arrays no apenas so criados com tipos bsicos, mas tambm com tipos construdos, assim como demonstra o exemplo descrito a seguir:
class Pessoa { double altura, peso ; }
class Cadastro { public static void main(String args[]) { Pessoa nomes[] = new Pessoa[2]; // declara nomes = //tipo Pessoa nomes[0] = new Pessoa(); // cria instncia para // ocorrncia 0 nomes[0].altura = 1.68; nomes[0].peso = 55; nomes[1] = new Pessoa(); // cria instncia para //ocorrncia 1 nomes[1].altura = 1.77; nomes[1].peso = 60; } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 104 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Exerccios de Fixao:
1 Usando o conceito de array com vrias dimenses, desenvolver a classe Notas para cadastrar as notas de 3 matrias para 5 alunos de determinado curso. O resultado esperado de ser igual ao da figura a seguir:
aluno 0 nota 0 7.5 aluno 0 nota 1 10.0 aluno 0 nota 2 8.0 aluno 1 nota 0 5.0 aluno 1 nota 1 7.8 aluno 1 nota 2 9.0 aluno 2 nota 0 10.0 aluno 2 nota 1 9.5 aluno 2 nota 2 8.0 aluno 3 nota 0 3.0 aluno 3 nota 1 4.5 aluno 3 nota 2 6.0 aluno 4 nota 0 10.0 aluno 4 nota 1 8.8 aluno 4 nota 2 6.6
2 O cdigo a seguir contm erros que precisam ser identificados e corrigidos. Identificar os mesmos e corrig-los.
Class Bola { double raio; String tipo; }
class Ex2_Cap11 { public static void main(String args[]) { Bola bolas[] = new Bola[1]; bolas[0].tipo = futebol; bolas[0].raio = 7.5; bolas[1].tipo = ping-pong; bolas[1].raio = 1.5;
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 105 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 12
1. Introduo
As classes ajudam a definir um objeto e seu comportamento e as interfaces que auxiliam na definio dessas classes. As interfaces so formadas pela declarao de um ou mais mtodos, os quais obrigatoriamente no possuem corpo. As operaes especficas para cada um desses mtodos so realizadas pela classe que implementa a interface. De um modo geral, dizemos que as interfaces definem certas funcionalidades, as quais dependem das classes que implementam as interfaces para que os mtodos existam. Em uma mesma classe, podem ser implementadas uma ou mais interfaces, sendo que elas devem estar separadas por vrgulas. Se uma classe implementa uma determinada interface, todos os mtodos declarados nessa interface implementada devem ser definidos na respectiva classe. Caso isso no ocorra, ser gerado um erro de compilao.
Nota: Um objeto de um tipo definido por uma interface no pode ser instanciado.
Os membros declarados em uma interface so implicitamente pblicos. Sendo assim, as classes nas quais esses mtodos so definidos tambm devem ser pblicas. Com relao s variveis, elas podem ser declaradas em interfaces, porm, so obrigatoriamente assumidas como pblicas, estticas ou finais. Como exemplo da utilizao de interfaces, podemos citar quando trabalhamos com componentes grficos na tela do computador, em que utilizamos botes, janelas e outros tens. Neste caso, temos vrias interfaces com diversos mtodos para o tratamento dos eventos que podem ocorrer nesses componentes. Dentre esses eventos, podemos ter os seguintes: fechar a janela, abrir a janela, clicar sobre um boto, etc. Os mtodos que capturam esses eventos esto definidos em interfaces especficas, mas a ao a ser executada quando um desses eventos ocorrer de responsabilidade da classe que implementou a interface. por isso que os mtodos declarados na interface no possuem corpo. Um tem importante que devemos ressaltar que no precisamos nos preocupar com o modo como esses eventos so capturados pela interface. Vejamos, ento, um exemplo que nos mostra a utilizao da interface:
interface Produto { static final String FABRICANTE = "Saturno Inter-Planetrio"; static final String FONE = "11 5555-5563"; public int getPreco(int id); }
class Brinquedo implements Produto { public int getPreco(int id) { if (id == 1) return(5); else return(10); PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 106 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio } }
class Aparelho implements Produto { public int getPreco(int id) { if ( id == 1 ) return(25); else return(30); } }
class ExemploInterface { static Brinquedo carrinho; static Aparelho radio; public static void main(String args[]) { inicio(); compraInfo(carrinho, 1); compraInfo(radio,2); }
public static void inicio() { carrinho = new Brinquedo(); radio = new Aparelho(); }
public static void compraInfo(Produto item, int tipo) { System.out.println(); System.out.println(" Pedidos de Compra atravs de: " +item. FABRICANTE + "\nFone: + item.FONE);
As variveis de referncia a objetos podem ser criadas utilizando-se como tipo uma interface. Quando criamos uma varivel dessa maneira, podemos armazenar nela uma instncia de qualquer classe que implemente a interface. Quando utilizamos uma referncia do tipo de uma interface para chamarmos um mtodo, ser tomada como base a instncia da interface que est sendo referenciada para que a verso PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 107 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio correia do mtodo seja chamada. A partir disso, podemos perceber que o mtodo a ser executado resolvido no tempo de execuo, de forma dinmica. Ento, aps criarmos o cdigo que chama os mtodos de uma classe, podemos criar a classe. Essa tarefa pode ser realizada pela interface, a partir de um mtodo chamado pelo cdigo, que praticamente o mesmo que chamar um mtodo de uma subclasse por meio de uma referncia superclasse.
Devemos ressaltar que essa prtica pode fazer com que a performance dos programas sofra um impacto considervel, isso porque a resoluo dinmica dos mtodos pode ser lenta. Devido ao impacto gerado, recomendamos que essa prtica seja adotada apenas em casos nos quais ela fundamental. Destacamos, inclusive, que apenas os mtodos que so declarados na interface so de conhecimento da varivel de referncia interface.
3. Variveis inicializadas
Em uma interface, podem existir variveis inicializadas que funcionam como constantes, mas no podem existir variveis de instncia. A partir disso, as classes que implementam a interface em questo compartilham as variveis que funcionam como constantes. Na linguagem Java, podemos definir uma interface apenas com as constantes, sem utilizarmos os mtodos. Nesse caso, a classe somente importa as constantes, ou seja, ela no implementa coisa alguma. So essas constantes importadas pela classe que fazem o papel de variveis finais.
Exerccios de Fixao:
1 Desenvolver a interface Treinamento com as seguintes caractersticas:
varivel ESCOLA recebendo o valor "Escola Privada que Cobra"; varivel FONE recebendo o valor "11 5555-6565"; um mtodo que retorne o preo do treinamento de acordo com seu mdulo.
2 Desenvolver duas classes, Office e DesenvolvimentoWeb, ambas implementando a interface Treinamento.
O mtodo a ser definido nestas classes dever retornar o preo do treinamento de acordo com a seguinte condio:
na classe Office, se o mdulo for igual a 1, retornar o valor 500, caso contrrio, retornar o valor 800; na classe DesenvolvimentoWeb, se o mdulo for igual a 1, retornar o valor 700, caso contrrio, retornar o valor 1000.
3 Desenvolver a classe Cap12_Fixacao, que dever:
instanciar dois objetos: Excel (objeto da classe Office) e Flash (objeto da classe Desen- volvimentoWeb); conter o mtodo treinaInfo, que dever receber o nome do treinamento e o mdulo para que possa retornar os itens ESCOLA, FONE e get.PREO.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 108 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 13
1. Introduo
Os pacotes so utilizados em Java nas situaes em que h necessidade de reutilizar as classes que foram escritas ou definidas em pacotes distintos. Dessa forma, caso tenhamos a necessidade de utilizar recursos de outras classes, estas no precisam ser novamente construdas, mas apenas importadas para dentro dos programas. comum, durante a construo ou o desenvolvimento de sistemas, precisarmos criar diretrios especficos para cada uma das aplicaes a serem desenvolvidas e, dentro desses diretrios, construirmos as classes ou os programas desejados. Quando criamos e compilamos classes, preciso especificar um pacote para as mesmas, pois, caso contrrio, elas assumiro por padro um pacote default sem nome, embora isso no seja explcito. Para fazermos qualquer referncia s classes presentes em um mesmo diretrio, desnecessrio que elas sejam importadas para dentro do programa, uma vez que se encontram no mesmo diretrio ou no pacote default. Ao criarmos uma classe e especificarmos que ela pertence a um determinado pacote, poderemos reutiliz-la em outros programas que no estejam rodando no mesmo diretrio em que a classe foi definida. Sendo assim, os pacotes esto diretamente relacionados aos diretrios em que as classes foram criadas e sua possvel reutilizao em classes de outros pacotes. Vale destacar que podemos disponibilizar classes para que estas tambm sejam referenciadas na Internet.
Nota: Os nomes que so atribudos tanto aos pacotes quanto aos sub-pacotes de classes em Java, normalmente, so escritos em caixa baixa, tais como java.lang.
2. Package
A criao de um pacote em Java um procedimento simples, j que basta apenas determinar o pacote ao qual a classe definida pertencer. Neste caso, a especificao do pacote deve ocorrer no incio da definio da classe. Para isso, utilizamos o comando package. Observemos no exemplo a seguir como utilizar esse comando:
package grafico;
public class Circulo { public void mostra() { System.out.println(" Mtodo executado da classe " + "Circulo do pacote grfico"); } }
No exemplo que acaba de ser descrito, utilizamos public para o membro de uma classe. Ao fazer isso, determinamos que esse membro poder ser referenciado por outras classes que no estejam no mesmo pacote.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 109 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio A fim de que o programa criado seja compilado, basta utilizar a seguinte linha de comando:
javac -d . Circulo.java OBS: Executar via console
3. Import
Aps gerar o pacote, podemos fazer uma referncia classe Circulo. Para que possamos referenci-la fora de seu pacote (grafico), preciso importar essa classe para dentro do programa. Observemos no exemplo a seguir como realizar essa importao:
import grafico.Circulo;
class Cap13_Ex1 { public static void main(String arg[]) { Circulo c = new Circulo(); c.mostra(); } }
Depois de realizada a compilao desse programa, ser possvel observar que no foi necessrio o arquivo Circulo.class estar no mesmo diretrio para que a compilao fosse efetuada normalmente.
Grande parte dos programas importar pacotes que j vm prontos da linguagem Java. Ao importarmos apenas parte do pacote ou o pacote como um todo para dentro de uma classe, possibilitamos a utilizao das caractersticas daquele pacote especfico, como a construo de grficos, a conexo entre micros, entre outros.
Ainda, destacamos que possvel utilizar os pacotes de forma mais complexa, dependendo da situao real na qual estivermos desenvolvendo um projeto ou um sistema.
Exerccios de Fixao:
1 Utilizando os comandos package e import
a. Desenvolver a classe Caneta, que deve criar o pacote estoque (usar o comando package);
b. Desenvolver a classe Cap13_Fixacao, que deve instanciar um objeto da classe Caneta (usar o comando import);
Nota: Lembre-se de que a compilao deve ocorrer atravs da linha de comando.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 110 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 14
1. Introduo
Neste captulo, abordaremos os conceitos relacionados a trs classes distintas, as quais se encontram no pacote java.lang. Vejamos, a seguir, quais so essas classes:
String;
Math;
Wrapper.
2. Classe String
Antes de definirmos uma classe String, necessrio termos em mente algumas informaes importantes a respeito da mesma. Grande parte das linguagens de programao com as quais contamos tem a manipulao dos strings de caracteres como um de seus aspectos essenciais. Mais especificamente, na linguagem Java, cada um dos caracteres de uma string um caractere Unicode de 16 bits. Para compreendermos melhor este aspecto, destacamos que o Unicode um padro capaz de representar os caracteres de vrias linguagens de forma unificada. Esse padro internacional diferente do padro ASCII na medida em que seus caracteres so codificados em 2 bytes, e no em 1 byte. Sendo assim, o Unicode capaz de representar uma quantidade consideravelmente maior de caracteres. Tendo em vista que na linguagem de programao Java as strings so objetos, com a palavra-chave new podemos criar a instncia de uma String, assim como ocorre com quaisquer outros objetos, da seguinte maneira:
String j = new String ();
Por meio da linha de cdigo descrita a seguir, um novo objeto da classe String ser criado, bem como ser atribuda a ele uma varivel de referncia, que, neste caso, j. Observemos: j = "joao";
Contudo, como a classe String possui diversos construtores, podemos utilizar outro tipo de atalho, tais como: String j = new String ("joao); String j = "joao";
As opes que acabam de ser descritas realizam as seguintes tarefas:
Criam um novo objeto String; Atribuem a esse objeto o valor "joao"; Atribuem esse valor varivel de referncia j.
Alm dessas tarefas, tambm podemos criar uma segunda referncia ao mesmo objeto e fazermos com que a varivel de referncia j aponte para essa referncia. Vejamos, a seguir, como podemos fazer isso:
String j2 = j; //j2 referencia a mesma String que j PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 111 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 2.1. Inalterabilidade
O objeto String apresenta como uma de suas caractersticas a inalterabilidade, pois, uma vez atribudo um valor a ele, este no mais poder sofrer alteraes. Porm, embora no seja possvel alterar o objeto String, sua varivel de referncia pode ser alterada sem problemas.
Observemos o exemplo descrito a seguir:
j = j.concat("cliente especial"); // o mtodo concat() inclui um valor literal ao final
Neste exemplo, o valor da String j, que "joao", teve "cliente especial" adicionado ao seu final. Dessa forma, o valor resultou em "joao cliente especial". Porm, como no possvel alterar uma String, conseqentemente a Virtual Machine no capaz de inserir uma nova String quela referenciada por j. Sendo assim, um novo objeto String, cujo valor "joao cliente especial", foi criado e, ento, referenciado por j.
Temos, portanto, trs objetos String: o primeiro com valor "joao"; o segundo com valor "joao cliente especial" e o terceiro, que na verdade um argumento literal que foi concatenado, tambm um objeto String ("cliente especial"), embora apenas "joao" e "joao cliente especial" sejam referenciados por j2 e por j, respectivamente.
Vale ressaltar que, caso anteriormente ao chamado de j = j.concat("cliente especial") no fosse criada uma segunda varivel de referncia para "joao", esta seria considerada como perdida, uma vez que no haveria um cdigo do programa que fosse capaz de referenci-la. Devemos lembrar que por ser inaltervel, a String original "joao" no foi modificada, o que sofreu alteraes foi somente a varivel de referncia j a fim de que pudesse referenciar outra String. O exemplo descrito a seguir demonstra claramente os detalhes expostos :
String j = "joao"; // cria um novo objeto String com o valor "joao", // j referencia o objeto String j2 = j; // cria uma segunda varivel de referncia que referencia a // mesma String j = j.concat (" cliente especial"); // cria um novo objeto String com valor // "joao cliente especial", o j referencia esse objeto // altera a referncia de j da String antiga para a nova String // lembre-se que j2 ainda faz referncia String original "joao".
class Cap14_Ex1 { public static void main(String args[]) { String a = "Aluno"; a.concat (" Mdulo Avanado"); System.out.println("a = " + a); // o resultado a = Aluno } }
Vejamos uma explicao a respeito de cada linha desse ltimo exemplo: PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 112 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Na primeira linha, temos a criao de um objeto String, cujo valor Aluno e que est sendo referenciado por a;
Na segunda linha, um outro objeto String criado pela Vitual Machine. O valor desse objeto "Aluno Mdulo Avanado", porm, nada o referencia. Sendo assim, esse Segundo objeto perdido de forma imediata;
Ento, a continua a referenciar o primeiro objeto String criado, cujo valor Aluno. Continuemos a explicao aps observar o exemplo a seguir:
class Cap14_Ex2 { public static void main(String args[]) { String a = "Aluno"; a.concat (" Modulo Avanado"); // o resultado a = Aluno System.out.println("a = " + a); // o resultado ainda a = Aluno a.toUpperCase(); System.out.println("a = " + a); // o resultado ainda a = Aluno a.replace(A,e'); System.out.println("a = " + a); // o resultado ainda a = Aluno } }
No exemplo que acaba de ser descrito, inicialmente criamos um novo objeto String cujo valor ALUNO, porm, em seguida ele foi perdido. Apesar disso, a String "Aluno" original continua sem alteraes, bem como a ainda a referencia. Na sequncia, um novo objeto String, cujo valor "eLUNO", foi criado pela VM. Esse objeto, contudo, tambm perdido. Dessa forma, o objeto String original, cujo valor "Aluno", permanece sem alteraes, e a continua referenciando-o.
Embora tenhamos chamado diversos mtodos com a finalidade de criar uma nova String para alterar a j existente, esta permaneceu sem alteraes devido ao fato de no atribuirmos uma varivel de referncia nova String. O exemplo a seguir demonstra como solucionar esse problema:
class Cap14_Ex3 { public static void main(String args[]) { String a= "Aluno"; a = a.concat (" Modulo Avanado"); // a est sendo atribudo nova String System.out.println("a = " + a); // o resultado a = Aluno Modulo Avanado } } PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 113 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Este exemplo demonstra que, no momento da execuo de sua segunda linha, ser criado o objeto String "Aluno Modulo Avanado", o qual ser referenciado por a. Vale destacar que o objeto original "Aluno" perdido quando no est sendo referenciado. Isso ocorre nas situaes em que temos dois objetos String e uma nica varivel de referncia.
class Cap14_Ex4 { public static void main(String args[]) { String a = "Aluno"; System.out.println("a = " + a); a = a.concat (" Modulo Avanado"); System.out.println("a = " + a); a = a.toUpperCase(); System.out.println("a = " + a); a = a.replace('A','e'); System.out.println("a = " + a); } }
Antes de finalizarmos, consideremos o exemplo a seguir:
Este exemplo tem como resultado "passa para fim passa para comeo", e as variveis de referncia presentes nele so m1 e m2. Quanto aos objetos String criados, estes foram os seguintes:
"passa para "; "comeo", sendo que este foi perdido; "passa para comeo"; "volta", sendo que este foi perdido; "passa para volta", sendo que este foi perdido; "passa para comeo passa para volta", sendo que este foi perdido; "fim", sendo que este tambm foi perdido;
No total, foram criados oito objetos String, mas seis foram perdidos, restando apenas dois ("passa para fim" e "passa para comeo").
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 114 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Ainda, para que possamos compreender a inalterabilidade de forma adequada, destacamos a manipulao dos objetos de string na memria. Dessa forma, tendo em vista que as linguagens de programao buscam utilizar a memria de maneira eficiente, a Java Virtual Machine mantm uma rea reservada chamada de pool constante de strings, uma vez que determinadas strings literais tomam um grande espao na memria e, inclusive, podem ser redundantes dentro de um programa. O pool constante de strings um local verificado pelo compilador assim que este encontra uma string literal. Essa verificao ocorre com a finalidade de identificar se h uma string literal igual encontrada, pois, caso haja essa coincidncia, no ser criado qualquer novo objeto String, e ser direcionada uma referncia ao novo valor literal para a String j existente.
A inalterabilidade dos objetos String uma caracterstica importante na medida em que, caso uma grande quantidade de variveis de referncia apontem para uma nica String sem ter conscincia a respeito disso, a possvel alterao do valor dessa String no seria uma boa prtica. preciso destacar, tambm, que uma classe String marcada como final para que os mtodos do objeto String no sejam modificados de forma alguma, assegurando, assim, sua inalterabilidade.
2.2. Alguns mtodos da classe String
Os mtodos que sero descritos a seguir esto relacionados classe String. Vejamos detalhes a respeito de cada um deles:
.charAt(Numero_do_lndice) Este mtodo tem a funo de retornar o caractere que se encontra no ndice determinado da ciasse String, o qual se inicia em zero. Observemos os exemplos para uma melhor compreenso:
class Cap14_Ex6 { public static void main(String args[]) { String x = "estudo"; System.out.println(x.charAt (2)); } }
O exemplo acima retornar: a letra t
.concat(Texto_A_Ser_Concatenado) Este mtodo tem a funo de retornar um objeto String. Esse objeto retornado com o valor da string que foi passada para ele acrescido ao final da string que foi utilizada a fim de chamar esse objeto. Vejamos, a seguir, exemplos de utilizao desse mtodo:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 115 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap14_Ex7 { public static void main(String args[]) { String x = "estudando"; System.out.println(x.concat(" Java")); } }
Com as mesmas funes do mtodo concat(), tambm contamos com os operadores de sobreposio, que so: + e +=. A seguir, teremos um exemplo da utilizao desses operadores:
class Cap14_Ex8 { public static void main(String args[]) { String A = "Cliente"; System.out.println(A + " especial"); String B = "Pessoa"; B += " Jurdica"; System.out.println (B); } }
Podemos observar no exemplo que acaba de ser descrito que o valor atribudo a B foi alterado de fato. Devido ao += ser um operador de atribuio, na linha de cdigo B += "J urdica"; temos a criao de um novo objeto String e a sua atribuio varivel B. Dessa forma, aps a execuo desta linha, a string que a varivel B estava referenciando originalmente abandonada, neste caso "Pessoa", resultando agora em "Pessoa Jurdica".
.equalslgnoreCase(Argumento) A funo deste mtodo retornar um valor booleano baseado em uma comparao entre o valor referente String do argumento e o valor utilizado com a finalidade de chamar o mtodo.
Tendo em vista que os valores booleanos so true ou false, o mtodo retornar true se houver coincidncia entre os valores comparados. Vale destacar que o valor retornado pelo mtodo ser true at mesmo nas situaes em que os caracteres dos objetos String que estiverem sob comparao apresentarem-se de forma distinta com relao s letras maisculas ou minsculas. Vejamos o exemplo a seguir:
class Cap14_Ex9 { public static void main(String args[]) { String x = "Ligado"; System.out.println(x.equalsIgnoreCase ("ligado")); } } PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 116 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio O exemplo acima retomar: true
.length() A funo deste mtodo retornar o tamanho apresentado pela String utilizada com a finalidade de chamar o mtodo, como no exemplo descrito a seguir:
class Cap14_Ex10 { public static void main(String args[]) { String x= "Ligado"; System.out.println(x.length()); } }
O exemplo acima retornar: 6
importante destacar que h um atributo dos arrays que possui o mesmo nome deste mtodo, ou seja, chamado de length. Erros de compilao sero gerados caso tentemos utilizar o mtodo length() em um array ou, ainda, o atributo length em um objeto String.
.replace(Caractere_Antigo, Caractere_Novo) A funo deste mtodo retornar um objeto String que apresenta como valor a String utilizada com a finalidade de chamar o mtodo. Esse valor, contudo, atualizado de forma que as ocorrncias do tipo char referentes ao primeiro argumento sejam substitudas por ocorrncias do tipo char referentes ao segundo argumento. Observemos o exemplo a seguir:
class Cap14_Ex11 { public static void main(String args[]) { String x = "Pressuposto"; System.out.println (x.replace ('s','S')); } }
O exemplo acima retomar: PreSSupoSto
,substring(Posio_lnicial, Posio_Final) Este mtodo tem a funo de retornar uma parte do objeto String, o qual foi utilizado na chamada do mtodo. Essa parte do objeto String tambm denominada substring. O primeiro argumento (PosioInicial) diz respeito ao local em que a substring inicia, sendo que esse incio a partir de zero.
A chamada pode conter um ou dois argumentos. Se possuir somente um argumento, ento, a substring retornada ter todos os caracteres at o final da String original. No entanto, caso contenha dois argumentos, a substring retornada terminar com o caractere determinado pelo segundo argumento (Posio_Final). Devemos destacar que somente o segundo argumento no ter incio em zero. Sendo assim, caso este argumento seja 5, ser da posio 5 da String original o ltimo caractere da String retornada, e isso corresponde a 4. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 117 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Observemos o exemplo a seguir:
class Cap14_Ex12 { public static void main(String args[]) { String x = "Pressuposto"; System.out.println(x.substring(6)); System.out.println(x.substring(6,9)); } }
.toLowerCase() Este mtodo tem a funo de retornar um objeto String, sendo que o valor desse objeto refere-se String que foi utilizada para chamar o mtodo. Ao utilizarmos toLowerCase(), o resultado obtido ter todos seus caracteres convertidos para caixa baixa. Vejamos:
class Cap14_Ex13 { public static void main(String args[]) { String x = "CLASS"; System.out.println(x.toLowerCase()); } }
O exemplo acima retornar: class
.toUpperCase() Este mtodo tambm tem a funo de retornar o objeto String que contm o valor da String utilizada para chamar o mtodo, porm, ao contrrio do mtodo anterior, toUpperCase() retorna todos os caracteres convertidos em caixa alta. Observemos:
class Cap14_Ex14 { public static void main(String args[]) { String x = "class"; System.out.println(x.toUpperCase()); } }
O exemplo acima retornar: CLASS
.trim() Assim como os mtodos descritos anteriormente, este tambm tem a funo de retornar o objeto String que apresenta como valor a String utilizada a fim de chamar o mtodo. Contudo, o resultado obtido por meio de trim() no contm quaisquer espaos em branco, sejam estes espaos precedentes ou finais. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 118 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Vejamos o exemplo:
class Cap14_Ex15 { public static void main(String args[]) { String x = "Curso "; System.out.println(x + "s"); System.out.println(x.trim() + "s"); } }
.toString() A funo deste mtodo retornar o valor referente String utilizada com a finalidade de chamar o mtodo. Para compreendermos de forma mais adequada, destacamos que todos os objetos da linguagem de programao Java devem conter o mtodo em questo, o qual retorne uma String capaz de descrever os objetos. Observemos a seguir:
class Cap14_Ex16 { public static void main(String args[]) { String x = "contedo da String"; System.out.println( x.toString() ); } }
O exemplo acima retornar: contedo da String
2.3. Classe StringBuffer
Tendo em vista que os objetos String so inalterveis, manipul-los de forma excessiva pode fazer com que eles fiquem abandonados no pool. Dessa maneira, nas situaes em que desejamos realizar alteraes em strings de caracteres, devemos utilizar a classe StringBuffer, uma vez que os objetos do tipo StringBuffer podem ser alterados diversas vezes sem que objetos String sejam abandonados. Considerando o fato de os objetos StringBuffer serem adequados para a manipulao de blocos de dados, a utilizao mais comum destes na entrada e sada de arquivos, nas situaes em que o programa manipula diversas alteraes e h um grande fluxo de entrada de dados. Os objetos StringBuffer, alm de serem a melhor opo para a manipulao de dados, tambm so capazes de pass-los adiante aps manipul-los para que, assim, o espao na memria destinado a essa manipulao possa ser reutilizado. 2.3.1. Alguns mtodos da ciasse StringBuffer
Assim como foram descritos os mtodos relacionados classe String, neste momento, descreveremos os mtodos relacionados classe StringBuffer. Observemos, a seguir, detalhes a respeito de cada um deles, bem como exemplos que auxiliam na compreenso de suas funes:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 119 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio .append(Texto_a_acrescentar") importante destacar que no somente este mtodo, mas todos os mtodos referentes classe StringBuffer trabalham com o valor do objeto que chama o mtodo. O valor do objeto que chamou o mtodo append() tambm atualizado pelo mtodo em questo. Isso ocorre independentemente do fato de o valor de retorno ter sido atribudo a uma varivel. Embora este mtodo utilize argumentos distintos, tais como boolean, char, int, long, entre outros, o que se encontra com mais frequncia o objeto String.
Ainda, importante ressaltar que possvel encadear as chamadas de mtodos append(), tal como descrito no seguinte exemplo
class Cap14_Ex17 { public static void main(String args[]) { StringBuffer x = new StringBuffer("casa"); x.append ("mento"); System.out.println("x = " + x); } }
O exemplo acima retornar: casamento
.insert (Posio, Texto_a_ser_inserido) Alm de ter a funo de retornar o objeto StringBuffer, este mtodo tambm responsvel por atualizar o valor do mesmo objeto StringBuffer que o chamou.Em ambos os casos, no objeto StringBuffer original ser inserido o objeto string passado para o segundo argumento, sendo que o incio ser no primeiro argumento, o qual comea em zero. Observemos:
class Cap14_Ex18 { public static void main(String args[]) { StringBuffer x = new StringBuffer("guardachuva"); x.insert(6,"-"); System.out.println("x = " + x); } }
O exemplo acima retornar: guarda-chuva
Nota: Este mtodo tambm permite que diversos tipos de dados sejam passados pelo segundo argumento, tais como boolean, char, int, long, entre outros, porm, o argumento String aquele visto com mais frequncia.
.reverse() Alm de ter a funo de retornar o objeto StringBuffer, este mtodo tambm responsvel por atualizar o valor desse mesmo objeto StringBuffer que o chamou. Em ambos os casos, h uma inverso dos caracteres do objeto StringBuffer, assim como descrito no exemplo a seguir; PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 120 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap14_Ex19 { public static void main(String args[]) { StringBuffer x = new StringBuffer("Roma"); x.reverse (); System.out.println("x = " + x); } }
O exemplo acima retornar: amoR
.toString() A funo deste mtodo retornar o valor do objeto StringBuffer que chamou o mtodo. Esse valor retornado como um objeto String. Vejamos no exemplo a seguir:
class Cap14_Ex20 { public static void main(String args[]) { StringBuffer x = new StringBuffer("Teste"); System.out.println(x.toString()); } }
O exemplo acima retornar: Teste
2.4. Mtodos encadeados
O conceito de mtodos encadeados de suma importncia a quem vai prestar o exame de certificao, pois esse conceito est presente em grande parte das questes. Sendo assim, observemos, a seguir, a sintaxe de uma instruo que apresenta mtodos encadeados:
resultado=mtodo1().mtodo2().mtodo3();
Normalmente, encontramos no mximo trs mtodos encadeados, embora seja possvel utilizar vrios mtodos dessa maneira. A fim de que possamos compreender esses mtodos encadeados, preciso, em primeiro lugar, verificar o que ser retornado da chamada do mtodo que se encontra na extrema esquerda. Esse valor retornado ser chamado de A. O valor A, ento, deve ser utilizado como um objeto que ser responsvel por chamar o segundo mtodo, considerando a contagem a partir da esquerda. Caso haja somente dois mtodos encadeados, o resultado da expresso ser correspondente ao resultado da segunda chamada. Contudo, caso haja mais um mtodo, isto , um terceiro, o resultado obtido a partir da segunda chamada ser utilizado para chamar esse terceiro mtodo. Neste caso, o resultado da expresso ser correspondente ao resultado dessa terceira chamada. Observemos o exemplo descrito a seguir para compreendermos melhor a explicao:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 121 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap14_Ex21 { public static void main(String args[]) { String x = "teste"; String y = x.concat(" final").toUpperCase().replace('E', 'x'); // mtodos encadeados System.out.println("y = "+ y); } }
O exemplo acima retornar: TxSTx FINAL
Vejamos o que ocorreu em cada etapa: Considerando o valor literal "teste", em primeiro lugar este foi concatenado (concat) a " final". A partir de ento, foi criado um objeto String cujo valor "teste final". Este objeto intermedirio e temporrio, ou seja, ser perdido em breve; Em seguida, um novo objeto String de carter temporrio foi criado pelo mtodo toUpperCase(). O valor desse novo objeto "TESTE FINAL"; Ento, um objeto String final, cujo valor "TxSTx FINAL", foi criado pelo mtodo replace(), o qual tambm referenciou "y" a esse valor.
class Cap14_Ex22 { public static void main(String args[]) { String a = "pessoa fsica"; String b = a.concat(" jurdica").toUpperCase().substring(7); System.out.println(b); } }
O exemplo acima retornar: FSICA JURDICA porque a String a recebeu o texto "pessoa fsica". A String b recebeu o encadeamento dos mtodos concat, toUpperCase e substring, onde o mtodo a.concat acrescentou o texto " jurdica", o mtodo toUpperCase transformou o texto em maisculo e o mtodo substring retornou uma parte do contedo da String b a partir da 7 a posio.
3. Classe Math
O pacote java.lang de suma importncia para a linguagem de programao Java na medida em que ele responsvel por definir as classes mais importantes para essa linguagem, as quais so importadas de forma automtica. Dentre as classes que esto contidas no pacote java.lang, destacamos as seguintes:
Boolean; Byte; Character; Double; PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 122 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Float; Integer; Long; Math; Object; Short; Void
A classe Math utilizada com a finalidade de efetuar operaes matemticas comuns. Tendo em vista que todos os mtodos da classe Math so definidos como static, estes no precisam ser instanciados para que possam ser utilizados. De fato, h duas limitaes da classe Math que precisam ser destacadas: devido ao fato de seu construtor ser privado, no possvel criar uma instncia da classe Math; alm disso, essa classe tambm no pode ser estendida por ser definida como final. Destacamos, ainda, que a classe Math responsvel por determinar aproximaes para as constantes pi e e, cujas assinaturas so public final static double Math.PI e public final static double Math.E, respectivamente.
3.1. Alguns mtodos da classe Math
Sabemos que os mtodos da classe Math so estticos. Dessa forma, possvel acess-los como mtodos estticos a partir do nome da classe. Normalmente, chama-se esses mtodos da seguinte maneira: resultado Math.umMtodoMathEsttico(); a descrio desses mtodos Math em conjunto aos exemplos de sua utilizao:
Mtodo Descrio Exemplo abs() Retorna o valor absoluto de um nmero. Este mtodo possui quatro assinaturas que so: public static double abs(double a) public static float abs(float a) public static int abs (int a) public static long abs (long a) x = Math.abs(-1) retorna 1 ceil() Retorna um nmero inteiro que correspondente ao seu inteiro superior mais prximo ao argumento. Este nmero est em formato double. A assinatura deste mtodo : public static double ceil(double a) double x; x = Math.ceil(3.9); retorna 4 floor() Retorna um nmero inteiro que correspondente ao seu inteiro inferior mais prximo ao argumento. Este nmero est em formato double. A assinatura deste mtodo : public static double floor(double a) double x; x = Math.floor(3.9); retorna 3 max() Retorna o maior entre dois nmeros distintos. As assinaturas deste mtodo so quatro: public static double max(double a, double b) public static float max(float a, float b) public static int max(int a, int b) public static long max(long a, long b) int x; x = Math.max(920,810); retorna 920 PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 123 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio min() Oposto ao max(), retorna o menor entre dois nmeros distintos. Este mtodo tambm possui quatro assinaturas, que so: public static double min(double a, double b) public static float min(float a, float b) public static int min(int a, int b) public static long min(long a, long b) int x; x = Math.min(920,810); retorna 810 random() Sem utilizar quaisquer parmetros, retorna um valor entre 0.0 e 1.0, o qual do tipo double. a assinatura deste mtodo : public static double random() double x; x = Math.random(); retorna um valor aleatrio entre 0.0 e 1.0 round() Retorna um nmero inteiro que esteja mais prximo ao nmero uitlizado no argumento. So duas as assinaturas deste mtodo: public static int round (float a) public static long round(double a) double x; x = Math.round(-6.5); retorna -6.0 sin() Retorna o seno de um ngulo, sendo que o argumento refere-se ao ngulo em radianos. Alm disso, esse argumento um double. Vale destacar que por meio de Math.toRadians() podemos converter graus em radianos. A assinatura deste mtodo : public static double sin(double a) double x; x = Math.sin(90.0); retorna 0.8939966676&
Math.sin(toRadians(90.0) ); Retorna 1 cos() Retorna o co-seno de um ngulo. Assim como no mtodo anterior, o argumento um double que se refere ao ngulo em radianos. a assinatura deste mtodo : public static double cos(double a) double x; x = Math.cos(0.0); retorna 1
tan() Retorna a tangente de um ngulo, sendo que o argumento tambm um double que se refere ao ngulo em radianos. a assinatura deste mtodo a seguinte: public static double tan(double a) double x; x = Math.tan(45.0); retorna 0.99999999&
sqrt() Retorna a raiz quadrada de um valor double. A assinatura deste mtodo : public static double sqrt (double a) double x; x = Math.sqrt(9.0); retorna 3.0 toDegrees() Retorna um ngulo em graus a partir do argumento, o qual representa o ngulo em radianos. A assinatura deste mtodo : public static double toDegrees(double a) double x; x = Math.toDegrees(Math.PI * 2.0); retorna 360 toRadians() Oposto do mtodo anterior, retorna um ngulo em radianos a partir do argumento, o qual representa o ngulo em graus. A assinatura deste mtodo : public static double toRadians(double a) double x; x = Math.toRadians(360.0/2); retorna 3.14 ( o valor de PI)
Ainda, importante destacar algumas questes a respeito dos mtodos ceil() e floor(). Ambos utilizam tipos double e tm, como ponto principal, a converso de doubles em inteiros, o que realizado de acordo com as regras apresentadas pelos mtodos, muito PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 124 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio embora seja estranho o fato de um valor inteiro ser retornado em contineres de tamanho double. Vale destacar, tambm, que o mtodo round() utiliza argumentos double e retorna valores inteiros correspondentes.
Os mtodos Math.round() e Math.ceil() sero iguais caso o valor da primeira casa decimal aps a vrgula for maior ou igual a 0,5. Devemos lembrar que, caso o valor seja negativo, nmeros que apresentam casa decimal 0,5 sero arrendados para um inteiro superior. Sabemos que o mtodo sqrt() retorna a raiz quadrada de um valor, mas, se esse valor for negativo, o mtodo em questo retorna NaN (Not a Number), um padro de bits indicando que o resultado no um nmero. Vimos, na tabela descrita anteriormente, a assinatura de alguns mtodos. A seguir, destacaremos as assinaturas dos mtodos estticos da classe Math que so mais importantes:
double abs(double a); double ceil(double a); double cos(double a); double floor(double a); double max(doublea,double b); double min(double a,double b); double random(); double sin(double a); double sqrt(double a); double tan(double a); double toDegrees(double angleInRadians - ngulo em radianos); double toRadians(double angleInDegrees - ngulo em graus); float abs(float a); float max(float a,float b); float min(float a, float b); double sqrt(double a); int abs(int a); int max(int a,int b); int min(int a,int b); int round(float a); long abs(long a); long max(long a, long b); long min(long a, long b); long round(double a).
4. Classe Wrapper
As classes Wrapper da linguagem Java so responsveis por fornecer essencialmente o seguinte:
Um conjunto de funes que so utilitrias aos tipos primitivos; Um mecanismo capaz de agrupar os valores primitivos em um objeto.
Ao agrupar tais valores, estes podem ser adicionados em tarefas que so reservadas a objetos. Alm disso, grande parte das funes que so utilitrias aos tipos primitivos tem relao com diversos tipos de converses, tais como a converso de objetos String em tipos primitivos e de tipos primitivos em objetos String, entre outras. Cada um dos tipos primitivas contm uma classe Wrapper, sendo que o nome dessa classe PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 125 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio correspondente ao nome do tipo, porm, escrito em caixa alta. Dessa forma, o nome da classe Wrapper para o tipo float Float, por exemplo.
importante destacar, no entanto, que nem todos os nomes de classes seguem as mesmas regras: o nome da classe Wrapper para o tipo char Character, e o nome dessa classe para o tipo int Integer.
Quanto aos objetos Wrapper, temos que algumas abordagens para a sua criao utilizam como argumento a String de um tipo primitivo. Caso no seja possvel converter a String utilizada no tipo primitivo adequado, essas abordagens lanam excees NumberFormatException. Esses objetos Wrapper tambm possuem como caracterstica a inalterabilidade, tendo em vista que os valores recebidos por eles no podem ser alterados. A seguir, teremos uma relao dos tipos primitivos e dos argumentos do construtor de cada classe Wrapper:
Boolean A classe Wrapper Boolean possui o tipo primitivo Boolean, e seu construtor tem os argumentos booleano ou String.
Byte A classe Wrapper Byte possui o tipo primitivo Byte, e seu construtor tem os argumentos byte ouString
Character A classe Wrapper Character possui o tipo primitivo Char, e seu construtor tem o argumento char.
Double A classe Wrapper Double possui o tipo primitivo Double, e seu construtor tem os argumentos double ou String.
Float A classe Wrapper Float possui o tipo primitivo Float, e seu construtor tem os argumentos float ou String.
Integer A classe Wrapper Integer possui o tipo primitivo Int, e seu construtor tem os argumentos int ou String.
Long A classe Wrapper Long possui o tipo primitivo Long, e seu construtor tem os argumentos long ou String.
Short A classe Wrapper Short possui o tipo primitivo Short, e seu construtor tem os argumentos short ou String.
4.1. Construtores Wrapper
Dois construtores Wrapper esto presentes em cada uma das classes Wrapper, exceto na PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 126 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio classe Character, a qual fornece somente um construtor. Esses construtores oferecidos pelas classes Wrapper so os seguintes:
Aquele que utiliza o tipo primitivo em criao como argumento; Aquele que utiliza a representao em String desse tipo como argumento.
O nico construtor fornecido pela classe Wrapper Character utiliza como argumento um tipo char, como mostra a linha Character c1 = new Character ('A'); do exemplo a seguir:
class Cap14_Ex23 { public static void main(String args[]) { Integer i1 = new Integer(77); Integer i2 = new Integer("77"); Float f1 = new Float(5.54f); Float f2 = new Float("5.54f"); Character c1 = new Character('A'); System.out.println(i1); System.out.println(i2); System.out.println(f1); System.out.println(f2); System.out.println(c1); } }
4.2. Mtodos de converso
As classes Wrapper possuem mtodos de converso. Os mtodos que sero descritos a seguir tm grande probabilidade de estarem presentes no exame, pois so os mais utilizados. 4.2.1. Mtodos valueOf()
Estes mtodos estticos que so fornecidos por grande parte das classes Wrapper apresentam uma abordagem capaz de permitir a criao de objetos Wrapper. Ambos os mtodos representam o tipo adequado de seu primeiro argumento por meio de uma String. Quando temos um segundo mtodo, este utiliza um argumento de carter opcional, o qual tem a funo de determinar em que base foi representado o primeiro argumento. Essa base pode ser binria, octal ou hexadecimal.
Observemos o exemplo a seguir para compreender os mtodos valueOf() de maneira adequada:
class Cap14_Ex25 { public static void main(String args[]) { Integer i2 = Integer.valueOf("010111", 2); Float f2 = Float.valueOf(6.75f") ; System.out.println(i2); System.out.println(f2); PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 127 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio } }
4.2.2. parse()
O mtodo valueOf() descrito anteriormente est relacionado aos seis mtodos parse(), os quais correspondem a cada tipo Wrapper numrico. Isso ocorre porque eles apresentam algumas semelhanas entre si, tais como:
Eles utilizam como argumento uma String; Caso o argumento String esteja em formato inadequado, ambos lanam uma exceo NumberFormatException; Eles so capazes de realizar a converso de objetos String que apresentam bases distintas nas situaes em que temos um tipo primitivo oculto como sendo um dos quatro tipos inteiros (byte, integer, long e short). No entanto, preciso destacar que alm das semelhanas, os mtodos parse() e valueOf() possuem algumas diferenas entre si, tais como o fato de um mtodo parse() retornar o tipo primitivo ao qual j foi atribudo um nome e o fato de o mtodo valueOf() retomar um objeto Wrapper a partir do tipo que realizou a sua chamada, sendo que esse objeto acaba de ser criado.
Vejamos o exemplo a seguir:
class Cap14_Ex26 { public static void main(String args[]) { double pi = Double.parseDouble("3.14"); System.out.println("PI = " + pi); Double pi2 = Double.valueOf("3.14"); System.out.println(pi2 instanceof Double ); long l1 = Long.parseLong("010111", 2); System.out.println("L1 = " + l1); Long l2 = Long.valueOf("010111", 2); System.out.println("L2 value = " + l2); } }
4.2.3. Value()
Os mtodos Value() no contm argumentos. Eles so utilizados nas situaes em que o valor de um objeto Wrapper numrico deve ser convertido em um tipo primitivo. Um objeto primitivo Wrapper numrico pode ser convertido em um tipo primitivo porque cada uma das seis classes Wrapper numricas contm seis mtodos. Observemos o exemplo descrito a seguir:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 128 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap14_Ex27 { public static void main(String args[]) { Integer i = new Integer(64); // cria um novo objeto Wrapper System.out.println(i); byte b = i.byteValue(); // converte o valor de i para um primitivo byte System.out.println(b); short s = i.shortValue(); // outro mtodo Integer Value System.out.println(s); double d = i.doubleValue(); // outro mtodo Integer Value System.out.println(d); Float f = new Float(6.75f); // cria um novo objeto Wrapper short s1 = f.shortValue(); // converte o valor F para um primitivo short System.out.println(s1); // o resultado 3 (truncado) } }
toString()
Este um mtodo da classe Object, que a principal classe em Java, a partir da qual todas as outras classes so herdadas. Como consequncia, temos que todas as classes Java possuem o mtodo toString(), o qual capaz de permitir que uma representao significativa de um objeto seja obtida. O mtodo toString() retorna uma String, sendo que o valor do tipo primitivo est encapsulado no objeto. Alm disso, vale ressaltar que a verso de uma instncia desse mtodo, a qual no esttica e no possui argumentos, est contida nas classes Wrappers, as quais so marcadas como classes finais. Vejamos, a seguir, um exemplo para melhor compreenso do assunto:
class Cap14_Ex28 { public static void main(String args[]) { Double d= new Double("6.75"); System.out.println("d = " + d.toString() ); } }
Um mtodo toString() sobreposto fornecido pelas classes Wrappers numricas. Esse mtodo, alm de utilizar um tipo nmero primitivo mais apropriado situao, retorna uma String contendo o valor do tipo nmero primitivo em questo. Vejamos como o exemplo a seguir ilustra essa situao:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 129 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio class Cap14_Ex29 { public static void main(String args[]) { System.out.println("d = " + Double.toString(6.75)); } }
O exemplo que ser descrito a seguir demonstra um terceiro mtodo toString() fornecido pelas classes Integer e Long:
O terceiro mtodo toString() fornecido pelas classes Long e Integer apresenta as seguintes caractersticas:
Possui como primeiro argumento o tipo primitivo mais adequado; Possui como segundo argumento uma base (binria, octal, hexadecimal); um mtodo esttico.
O segundo argumento tem a funo de informar ao mtodo que ele deve converter o primeiro argumento de acordo com a base definida. Em seguida, o resultado dever ser retomado como uma String. Normalmente, esse primeiro argumento encontra-se na base 10. Os mtodos de converso toString() utilizam os tipos int e long e, assim, retornam o valor que foi convertido como uma representao em String. Observemos o exemplo a seguir:
class Cap14_Ex31 { public static void main(String args[]) { String s = Integer.toHexString(1000); // converte 1000 para hexadecimal System.out.println("1000 em hex = " + s); String s1 = Long.toOctalString (1000); // converte 1000 para octal System.out.println("1000 em octal = "+ s1); } }
Aps termos verificado a descrioo dos mtodos de converso, teremos, a seguir, uma lista PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 130 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio dos mtodos Wrapper mais comuns para converso:
ByteValue: Byte, Double, Integer, Long e Short; doubleValue: Byte, Double, Integer, Long e Short; FloatValue: Byte, Double, Integer, Long e Short; IntValue: Character, Float, Integer, Long e Short; LongValue: Character, Float, Integer, Long e Short; ShortValue: Character, Float, Integer, Long e Short; Parse (esttico e exceo): Character, Float, Integer, Long e Short; Parse (esttico, exceo e com a base): Character, Integer, Long e Short; valueOf (esttico e exceo): Boolean, Character, Float, Integer, Long e Short; valueOf (esttico, exceo e com a base): Character, Integer, Long e Short; toString: Character, Double, Float, Integer, Long, Short; toString (esttico e primitivo): Byte, Double, Float, Integer, Long e Short; toString (esttico, primitivo e base): Integer e Long; toBinaryString (esttico): Integer e Long; toHexString (esttico): Integer e Long; toOctaIString (esttico): Integer e Long.
Nota: As assinaturas mais importantes dos mtodos de converso so as seguintes: primitive parseXxx(String); primitive xxxValue(); e Wrapper valueOf(String).
5. Autoboxing e auto-unboxing
No J2SE 5.0, a converso entre valores de tipos primitivos e objetos empacotadores de tipo mais simples: elimina-se a necessidade do programador utilizar um cdigo adicional para realizar a converso. J em verses anteriores ao J2SE 5.0, necessrio gerar um novo objeto da classe empacotadora (wrapper) de tipo correspondente e, em seguida, inseri-lo na coleo, para que um valor primitivo seja introduzido em uma estrutura de dados capaz de armazenar unicamente Objects. Ainda nas mesmas verses, o trabalho para recuperar, a partir de uma coleo, um objeto de uma classe empacotadora de tipo e manipular seu valor primitivo depende da invocao de um mtodo no objeto, de maneira a obter seu valor de tipo primitivo correspondente.
O J2SE 5.0 apresenta dois novos tipos de converso:
Converso boxing Por meio desta converso, um valor de um tipo primitivo transformado em um objeto da classe empacotadora de tipo correspondente. Quando realizada de maneira automtica, essa converso denominada autoboxing;
Converso unboxing: Utilizamos este tipo de converso para transformar um objeto de uma classe empacotadora de tipo em um valor de tipo primitivo correspondente. Quando realizada de maneira automtica, essa converso denominada auto-unboxing.
O processo de autoboxing e auto-unboxing pode afetar implicitamente a performance e o throughput das aplicaes, devido mistura de wrappers e objetos primitivos nas expresses aritmticas, em um loop estreito. Por causa disso, no devemos utilizar autoboxing de maneira deliberada.
A seguir, temos um exemplo da utilizao de autoboxing e auto-unboxing: PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 131 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio public class TesteAutoboxing { public static void main(String args[]) { int varint = 22; // chamando o autoboxing Integer varAut = varint; //chamando o auto-unboxing int var2int = varAut; System.out.printf("%s\n%s\n%s", varint, varAut, var2int); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 132 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 15
1. Introduo
A criao das sadas de forma grfica e das interfaces grficas para usurios na linguagem Java torna-se mais fcil medida que podemos utilizar um conjunto de classes e interfaces disponibilizado por Java. Com esse conjunto, o desenvolvimento das aplicaes grficas pode ser feito em forma de appiets, bem como em forma de aplicaes autnomas. Para criarmos as aplicaes grficas, utilizamos alguns componentes grficos e tambm recursos associados. Eles encontram-se em dois pacotes:
java.awt
O pacote AWT (Abstract Windowing Toolkit) definido por meio das classes de java.awt e de seus subpacotes, dentre os quais podemos citar os seguintes:
java.awt.event; java.awt.color.
As funcionalidades grficas existentes desde a primeira verso da linguagem Java encontram-se nesses pacotes descritos. Mas para a construo de seus componentes visuais na tela, o AWT dependia do sistema operacional, pois era ele quem fornecia as demais informaes necessrias para que esses componentes fossem criados. Sendo assim, a principal desvantagem em relao ao pacote Swing, descrito a seguir, que as classes utilizadas no AWT no so totalmente escritas em Java.
javax.swing
O pacote Swing utilizado para construirmos as interfaces grficas de usurio (GUIs) na linguagem Java. A maioria das classes utilizadas neste pacote escrita na prpria linguagem Java. Grande parte dos componentes que utilizam o Swing inicia com a letra J, como o Jlabel. Para utilizarmos o pacote Swing, precisamos importar o seguinte pacote: import javax.swing
Nota: Os comandos bsicos de Java no necessitam serem importados.
Vejamos, a seguir, algumas caractersticas do Swing:
Permite que os componentes grficos sejam exibidos mais rapidamente; Os botes e os rtulos podem ter imagens adicionadas a eles; Possui novos componentes grficos com relao ao AWT.
Alm dos dois pacotes descritos anteriormente, muitos dos programas que utilizam o Swing tambm necessitam importar um outro pacote: o java.awt.event
Container Os containeres referem-se ao local em que sero adicionados os componentes visualizados na tela. Os tipos mais comuns de containeres da linguagem Java so os seguintes:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 133 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Frames Os frames correspondem s janelas nas quais construmos as aplicaes, cuja aparncia similar das janelas do sistema operacional. Porm, o componente necessita de ajuda do sistema para construir a aparncia das telas, no que se refere a botes de fechar, minimizar, maximizar, entre outros.
Vejamos a sintaxe utilizada para criarmos um trame:
JFrame frame = new JFrame("Exemplo de Frame");
Quando criamos os frames, precisamos definir o seu tamanho e torn-lo visvel. Observemos as sintaxes para cada uma dessas tarefas:
Definir o tamanho do frame frame.setSize(colunas, linhas)
Tornar o frame visvel frame.setVisible(true)
A seguir, mostraremos um exemplo em que criamos um container Jframe:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex1 { public static void main(String args[]) { JFrame frame = new JFrame(" Exemplo de Frame"); frame.setSize(300,300); frame.setVisible(true); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 134 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Caixas de dilogo
As caixas de dilogo (JOptionPane) so caixas do seguinte tipo e finalidade:
showMessageDialog Esta caixa utilizada para exibir um texto na tela.
Sua sintaxe a seguinte:
JOptionPane.showMessageDialog Vejamos um exemplo de como cri-la:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex2 { public static void main ( String args[]) { JOptionPane.showMessageDialog(null, "Utilizando dilogo PLAINMESSAGE no Swing + sem cone", "Mensagem normal ",JOptionPane.PLAIN_MESSAGE); } }
Em que:
null refere-se posio na qual a caixa mostrada na tela; com este valor, no definido um alinhamento em relao pgina principal;
"Utilizando Dilogo PLAIN_MESSAGE no Swing sem cone" a mensagem apresentada na caixa;
"Mensagem normal" refere-se ao ttulo da caixa de mensagem;
JOptionPane.PLAIN_MESSAGE especifica que no haver cone a ser apresentado nesta caixa.
showConfirmDialog Esta uma caixa de confirmao.
Deseja finalizar a execuo? PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 135 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Sua sintaxe a seguinte: JOptionPane.showConfirmDialog As caixas de dilogo podem ser acompanhadas/com os seguintes botes: DEFAULT_OPTION; YES_NO_OPTION; YES_NO_CANCEL_OPTION; OK_CANCEL_OPTION.
Vejamos um exemplo de utilizao da caixa de dilogo:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex3 { public static void main(String args[]) { int var = JOptionPane.showConfirmDialog(null, "Deseja finalizar a execuo?", "Sada", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); } }
Em que:
var a varivel que contm a resposta para o boto pressionado;
null refere-se posio em que a caixa mostrada na tela; quando este valor indicado, no definido um alinhamento em relao pgina principal;
"Deseja finalizar a execuo?" a mensagem apresentada na tela;
JOptionPane.YES_NO_OPTION especifica os botes YES e NO da caixa;
JOptionPane.QUESTION_MESSAGE indica que ser mostrado o ponto de interrogao (?) juntamente com o texto.
showInputDialog Esta uma caixa de dilogo que aguardar por uma entrada de dados.
Digite o primeiro nmero: Sua sintaxe a seguinte: JOptionPane.showInputDialog
Vejamos um exemplo: PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 136 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex4 { public static void main(String args[]) { String var = JOptionPane.showInputDialog( null, "Digite o primeiro nmero: ", "Entrada de dados 1", JOptionPane.QUESTION_MESSAGE); } }
Em que:
var a varivel que contm a expresso em string digitada dentro da caixa;
null refere-se posio em que a caixa mostrada na tela; quando este valor indicado, no definido um alinhamento em relao pgina principal;
"Digite o primeiro nmero: " a mensagem apresentada na tela para a entrada de dados;
"Entrada de dados 1" o ttulo da caixa; JOptionPane.QUESTION_MESSAGE indica que ser mostrado o ponto de interrogao (?) juntamente com o texto.
A seguir, mostraremos um exemplo com a criao de containeres JOptionPane:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 137 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex5 { public static void main(String args[]) { int resp; do { DialogExs(); // executa vrios exemplos de // caixa de dilogo // confirmar sada sim ou no resp = JOptionPane.showConfirmDialog(null, "Deseja finalizar a execuo?", "Sada", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); } while (resp == 1); // boto YES = O, boto NO = 1 System.exit(0); } static void DialogExs() { // mensagem normal, sem cone JOptionPane.showMessageDialog(null, "Utilizando dilogo PLAIN_MESSAGE no Swing sem cone", "Leia", JOptionPane.PLAIN_MESSAGE); // mensagem normal, cone informao. JOptionPane.showMessageDialog(null, "Utilizando dilogo INFORMATION_MESSAGE + no Swing com cone", "Aviso", JOptionPane.INFORMATION_MESSAGE); // mensagem normal, cone pergunta. JOptionPane.showMessageDialog(null, "Utilizando dilogo QUESTION_MESSAGE no Swing", "Pergunta", JOptionPane.QUESTION_MESSAGE); //mensagem normal, cone aviso JOptionPane.showMessageDialog(null, "Utilizando dilogo WARNING.MESSAGE no Swing", "Aviso", JOptionPane.WARNING_MESSAGE); // mensagem normal, cone erro. JOptionPane.showMessageDialog(null, "Utilizando dilogo ERROR_MESSAGE no Swing", "Erro", JOptionPane.ERROR_MESSAGE); // mensagem normal, cone personalizado. Icon icone = new ImageIcon("undercon.gif"); JOptionPane.showMessageDialog(null, "Utilizando dilogo INFORMATION_MESSAGE no + Swing com cone personalizado", "Mensagem", JOptionPane.INFORMATION_MESSAGE); PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 138 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio // mensagem normal para entrada de dados String num1 = JOptionPane.showInputDialog(null, "Digite o primeiro nmero: ", "Entrada de dados 1", JOptionPane.QUESTION_MESSAGE); String num2 = JOptionPane.showInputDialog(null, "Digite o segundo nmero: ", "Entrada de dados 2", JOptionPane.QUESTION_MESSAGE); int result = Integer.parseInt(num1) + Integer.parseInt(num2); JOptionPane.showMessageDialog(null, "Resultado da soma + result, "Resultado", JOptionPane.WARNING_MESSAGE); } }
Applets
Este container ser visto em um prximo captulo.
2. Eventos
Um dos pontos mais importantes que encontramos na linguagem Java a resposta a eventos, os quais so acionados pelos programas que se baseiam em interface grfica. Grande parte desses eventos gerada pelos usurios dos programas.
H diversas maneiras de os eventos serem passados para o programa, o que varia conforme o evento que est sendo executado. Os eventos mais comuns so gerados pelo teclado ou pelo mouse, mas temos tambm aqueles gerados a partir dos botes e dos menus, ou seja, dos controles disponveis na interface grfica do usurio.
2.1. Event Listener
Quando um evento criado pelo usurio, um objeto recebe a informao de que esse evento est sendo gerado. Esse objeto refere-se ao listener, cujas principais caractersticas so as seguintes:
Para receber informaes a respeito de tipos especficos de eventos, necessrio registrar o listener com uma ou mais fontes;
Para que possa receber e, tambm, processar as informaes, ele deve implementar mtodos.
Para capturarmos os eventos em nossa aplicao, devemos ter uma classe que implemente o listener. Sabendo-se que a sua funo verificar quando um determinado evento acontece em um objeto, precisamos adicionar um listener em cada componente ou objeto cujos PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 139 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio eventos desejamos capturar. Ele o responsvel por tratar do evento quando este ocorrer, tomando como base o objeto que o gerou.
O evento de clicar em um boto sempre o mesmo, independentemente do boto que estiver sendo pressionado. O tratamento desse evento realizado por uma interface que, ao ser implementada na classe, trata os respectivos mtodos de ao ou o evento que a interface implementada exige. Com essa tarefa, possvel identificarmos a partir de qual objeto ou componente a ao ou evento foi gerado.
Vejamos, a seguir, as aes que podem gerar um evento e as respectivas interfaces listener de cada uma:
Mover o mouse sobre um componente Interface MouseMotionListener.
Fechar um Frame Interface WindowListener.
Clicar sobre um boto ou pressionar Return ao digitar Interface ActionListener.
Pressionar o boto do mouse enquanto o cursor estiver sobre um componente Interface MouseListener;
2.2. Eventos do teclado
Ao entrarmos com informaes via teclado, fazemos com que seja gerado o objeto KeyEvent, que pode ser dos seguintes tipos:
KEY_PRESSED;
KEY_RELEASED;
KEY_TYPED.
Para identificarmos qual o tipo de evento KeyEvent que est sendo gerado, podemos utilizar as constantes int que so definidas pela classe KeyEvent. Esta, que uma subclasse da classe InputEvent, define diversas outras constantes int, tais como VK_ENTER, VK.CANCEL e VK_ESCAPE Vejamos algumas outras constantes;
VK_0 a VK_9 Estas constantes definem os caracteres em ASCII correspondentes aos algarismos.
VK_A a VK_Z Estas constantes definem os caracteres em ASCII correspondentes s letras.
Dentre os vrios mtodos que so definidos pela classe KeyEvent, temos o getKeyChar(). Com ele, retornado o caractere digitado. A sintaxe geral desse mtodo a seguinte:
char getKeyChar() PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 140 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Temos, ainda, os construtores da classe KeyEvent, os quais so os seguintes:
KeyEvent(Component src, int type, long when, int modifiers, int code);
KeyEvent(Component src, int type, long when, int modifiers, int cod, char ch).
Em que: src refere-se ao componente que gerou o evento;
type refere-se ao tipo de evento gerado;
modifiers o item que identifica os modificadores que estavam pressionados quando o evento foi gerado;
code define os caracteres especiais, tais como as teclas de funo (F1 a F12) e as teclas HOME ou SHIFT;
ch o item que determina os caracteres comuns.
2.3. Eventos do mouse
Para tratarmos os eventos do mouse gerados nos programas em Java, precisamos implementar duas interfaces nas classes. Essas interfaces so descritas a seguir, juntamente com os mtodos e eventos associados a cada uma:
MouseListener
mouseClicked() Este o evento de clicar e soltar o cursor do mouse em um componente.
mousePressed() Este evento gerado quando o mouse pressionado em um componente.
mouseReleased() Este evento gerado quando o mouse pressionado e liberado em seguida.
mouseEntered() Este evento gerado quando o mouse entra nos limites de um componente.
mouseExited() Este o evento gerado quando o mouse sai das coordenadas de um componente.
MouseMotionListener
mouseDragged() Este o evento de pressionar e mover o boto do mouse. mouseMoved() Este o evento realizado por qualquer movimento do mouse em um componente.
Todos os mtodos citados recebem como parmetro um objeto do tipo MouseEvent, o qual contm informaes a respeito do evento e quais as coordenadas em que esse evento ocorreu PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 141 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio dentro do componente. Como valor de retorno, esses mtodos tm o void. Vejamos, a seguir, um exemplo com os mtodos descritos:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExemploMouse extends JFrame implements MouseMotionListener, MouseListener { JLabel mensagem; ExemploMouse() { super("Eventos do mouse"); mensagem = new JLabel(); getContentPane().add(mensagem); addMouseListener(this); addMouseMotionListener(this); setSize(300,150); show(); }
public void mouseClicked(MouseEvent e) { mensagem.setText("Clicado em " + coords(e)); }
public void mousePressed(MouseEvent e) { mensagem.setText("Pressionado em " + coords(e)); }
public void mouseReleased(MouseEvent e) { mensagem.setText("Liberado em " + coords(e)); }
public void mouseExited(MouseEvent e) { mensagem.setText("O mouse saiu da janela"); }
public void mouseEntered(MouseEvent e) { mensagem.setText("O mouse entrou na janela"); }
public void mouseDragged(MouseEvent e) { mensagem.setText("Arrastado em " + coords(e)); }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 142 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio public void mouseMoved(MouseEvent e) { mensagem.setText("Movido em " + coords(e)); }
public static void main(String args[]) { ExemploMouse aplic = new ExemploMouse(); aplic.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); } }
2.3.1. Tratamento de eventos
A interface listener que trata eventos para fechar a janela chama-se WindowListener. Os mtodos que ela possui so os seguintes:
public void windowClosing(WindowEvent e);
public void windowlconified(WindowEvent e);
public void windowOpened(WindowEvent e);
public void windowDeiconified(WindowEvent e);
public void windowActivated(WindowEvent e);
public void windowDeativated(WindowEvent e);
public void windowClosed(WindowEvent e).
Aps a compilao do exemplo Cap15_Ex1, podemos verificar que, se clicarmos na janela para ela ser fechada, esta ao ser realizada. Contudo, a janela de console no liberada, pois no fizemos o tratamento correio do evento de fechar a janela para este objeto.
No exemplo a seguir, mostramos como adicionar o tratamento do evento para fechar a janela quando esse evento ocorrer para o objeto JFrame:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 143 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex7 { public static void main(String args[]) { JFrame frame = new JFrame("Exemplo de frame"); frame.setSize(300,300); frame.setVisible(true); WindTratar wt = new WindTratar(); frame.addWindowListener(wt); } }
class WindTratar implements WindowListener { public void windowClosing(WindowEvent e) { System.exit(0); }
public void windowIconified(WindowEvent e) {} public void windowOpened(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} }
Observando o exemplo apresentado, percebemos a criao de uma classe apenas para tratarmos o evento de fechar a janela. Essa classe obrigada a colocar todos os sete mtodos que a interface WindowListener exige quando implementamos uma classe.
O mtodo addXXXListener() ser sempre utilizado quando quisermos capturar eventos que podem ser gerados plos objetos. Neste caso, adicionamos uma instncia da classe WindTratar ao objeto criado a partir da classe JFrame, a qual uma janela.
Nota: A classe WindTratar tem como finalidade implementar a interface que contm os eventos para o objeto (janela) com as respectivas aes quando esses eventos ocorrerem.
No exemplo a seguir, mostraremos como criar um container JFrame com a interface WindowListener implementada na prpria classe:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 144 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex8 extends JFrame implements WindowListener { public static void main(String args[]) { Cap15_Ex8 frame2 = new Cap15_Ex8(); }
public Cap15_Ex8() { super("Exemplodeframe"); setSize(300,300); setVisible(true); addWindowListener(this); } public void windowClosing(WindowEvent e) { System.exit(0); } public void windowIconified(WindowEvent e) {} public void windowOpened(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} }
2.3.2 Classes adaptadoras
Quando implementamos uma interface em uma classe, os mtodos declarados so redefinidos na classe implementada. Se uma classe implementa a interface WindowListener, temos que declarar os sete mtodos correspondentes a ela. Contudo, se desejarmos apenas tratar um evento quando ele ocorrer, podemos somente redefinir um mtodo da interface.
Para realizarmos essa tarefa, utilizamos as classes adaptadoras, as quais implementam interfaces listener redefinindo todos os seus mtodos. Mas os mtodos definidos na classe listener no possuem corpo ou funcionalidade. Isso ocorre para que possamos criar uma classe filha ou uma subclasse da classe adaptadora, na qual, ento, redefinimos ou implementamos o mtodo desejado
Observemos o exemplo a seguir:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 145 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio import java.awt.*; import java.awt. event.*; import javax.swing.*; public class Cap15_Ex9 { public static void main(String args[]) { JFrame frame = new JFrame(Exemplo de frame"); frame.setSize(300,300); frame.setVisible(true); windTratarAdapt wtAdapt = new windTratarAdapt(); frame.addWindowListener(wtAdapt); } }
class windTratarAdapt extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } }
As principais classes adaptadoras da linguagem Java, bem como as suas respectivas interfaces implementadas, esto listadas a seguir:
MouseAdaper Interface MouseListener
MouseMotionAdapter Interface MouseWindowListener.
WindowAdapter Interface WindowListener.
KeyAdapter Interface KeyListener.
2.3.3. Classes internas
Um recurso bastante interessante que encontramos em Java refere-se s classes internas. Elas so utilizadas para auxiliar as classes na construo ou na manipulao dos objetos criados ou gerados por elas mesmas. A filosofia da utilizao de classes internas no se restringe somente ao tratamento de eventos. No exemplo a seguir, mostraremos as classes internas com a finalidade de auxiliar as classes que criam objetos grficos a tratarem os eventos. Neste caso, utilizaremos a classe inner class, que faz o tratamento do evento:
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 146 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex10 { public static void main(String s[]) { JFrame frame = new JFrame("Exemplo de frame"); frame.setSize(300,300); frame.setVisible(true); frame.addWindowListener(new WindTratarAdapt()); } static class WindTratarAdapt extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } }
Nesse exemplo, a classe WindTratarAdapt interna classe Cap15_Ex10. Vejamos, em seguida, um exemplo com uma classe interna annima, que a anonymous class:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex11 extends JFrame { public static void main(String s[]) { JFrame frame = new JFrame("Exemplo de frame"); frame.setSize(300,300); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 147 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 3. Criando componentes utilizando o swing
Antes de construirmos qualquer componente a ser visualizado na tela, necessitamos adicion-lo a um container. Os passos para a adio de componentes dentro de containeres resumem-se em dois processos: o primeiro a criao do componente; o segundo a sua adio no container.
Para adicionarmos esses componentes nos containeres, chamamos o mtodo getContentPane(). por meio dele, tambm, que os componentes tornam-se visveis na tela. Vejamos a sintaxe para realizarmos essa tarefa:
<container>.getContentPane().add(boto1);
Em que o mtodo getContentPane() retorna o content pane para o container em questo.
4. Gerenciadores de layout
Quando construmos aplicaes, quem se encarrega da disposio e do tamanho dos elementos na tela ou dentro dos containeres so os gerenciadores de layout. Essa preocupao em relao montagem de tais componentes de tela ocorre porque uma janela montada manualmente para um determinado sistema operacional pode ter outra visualizao quando for executada em um sistema operacional diferente. Os gerenciadores de layout ou de classes disponveis para trabalharmos so os seguintes:
FlowLayout Este gerenciador de layout o padro para Applets, Panel e JPanel. Ele adiciona os componentes da seguinte forma: da esquerda para a direita at que nenhum componente caiba mais na linha. Ento, ele passa para a prxima tinha, repetindo o processo. Ao adicionarmos os componentes no container a partir do mtodo add(), podemos especificar qual a ordem em que eles devem ser dispostos.
BorderLayout Este gerenciador de layout divide o container em 5 regies distintas, que so: NORTH (Norte). SOUTH (Sul), CENTER (Centro), EAST (Leste) e WEST (Oeste). Destacamos que essa diviso lgica, ou seja, no podemos visualiz-la na tela.
O BorderLayout o gerenciador padro para JFrames e JApplets. Ao utiliz-lo, somente podemos ter um componente para cada regio do container.
GridLayout Este gerenciador de layout divide o container como se fosse uma grade com tamanhos e espaos iguais entre os componentes. Estes, por sua vez, dividem-se nas linhas e colunas do layout
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 148 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 5. Componentes
Agora que j temos conhecimento de de todas as informaes anteriores, podemos adicionar alguns componentes ao container JFrame. Vejamos quais so eles:
JLabel Os rtulos JLabel possuem texto simples, de uma nica linha, sendo que juntamente com o texto a ser apresentado podemos ter uma imagem. Vejamos o exemplo para a criao de um rtulo simples:
JLabel label1 = new JLabel("Exemplo de JLabel");
Se aplicarmos o mtodo setToolTipText() ao componente, uma mensagem aparecer automaticamente quando o mouse for posicionado sobre o componente. A sintaxe desse mtodo a seguinte:
labell.setToolTipText("Informe aqui para que serve + este label");
Agora, alm do texto, podemos colocar uma imagem (Icon) no componente. Ela ser o alinhamento do texto, e a sintaxe a seguinte:
Icon img = new lmagelcon("undercom.gif"); label2 = new JLabel("Rtulo com texto e imagem", img, SwingConstants.Left);
Em que: Imagelcon uma classe que implementa a interface Icon, a qual possibilita a exibio de imagens do tipo gif e jpg;
SwingConstants.XXXX uma interface que contm valores padro para alinhamento de textos, como SwingConstants.RIGHT, SwingConstants.TIP. Esses valores podem ser utilizados em componentes Swing.
Para especificarmos a posio do texto em relao imagem, utilizamos os seguintes mtodos: setHorizontalTextPosition(), para posicionarmos o texto esquerda, direita ou ao centro; setVerticalTextPosition(), para posicionarmos o texto acima, abaixo ou ao centro da figura. Observemos a sintaxe:
Em seguida, podemos adicionar o componente ao container. Para tanto, utilizamos a seguinte sintaxe:
frame.getContentPane().add(label2);
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 149 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio No exemplo a seguir, temos a utilizao do componente JLabel:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex12 { public static void main(String s[]) { JFrame frame = new JFrame("Exemplo de trame"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); JLabel label1 = new JLabel("Texto de label normal", SwingConstants.CENTER); Icon img = new ImageIcon("udercon.gif"); JLabel label2 = new JLabel("Rtulo com texto + e imagem", img, SwingConstants.CENTER); label2.setToolTipText("Informe aqui para que + serve este label"); label2.setHorizontalTextPosition( SwingConstants.CENTER); label2.setVerticalTextPosition( SwingConstants.TOP); frame.getContentPane().add(label1, BorderLayout.SOUTH); frame.getContentPane().add(label2); frame.setSize(300,300); frame.setVisible(true); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 150 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio JButton
Para inserirmos um componente do tipo boto em uma GUI, utilizamos o JButton. Este componente permite a insero de textos e, tambm, de imagens. Mas a caracterstica principal que quando o boto pressionado, ele pode ter um comportamento (evento) especfico.
Para criarmos um boto, temos a seguinte sintaxe:
JButton botaol = new JButton("texto");
Para criarmos um boto com imagem, a sintaxe diferente. Observemos:
JButton imgBotao = new JButton(" Boto com imagem", img1);
Vejamos um exemplo com a utilizao de um JButton:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex13 extends JFrame { private JButton txtBotao, //boto simples com texto imgBotao ;//boto com imagem public Cap15_Ex13() { super("Testando JButtons"); //chamando a super classe Container c = getContentPane(); //criao de um objeto //do tipo content pane c.setLayout(new FlowLayout()); txtBotao = new JButton("Boto simples"); c.add(txtBotao); Icon img1 = new ImageIcon("smallimg.gif"); Icon img2 = new ImageIcon("UNDERCON.gif"); imgBotao = new JButton(" Boto com imagem", img1); imgBotao.setRolloverIcon(img2); imgBotao.setHorizontalTextPosition( SwingConstants.CENTER); imgBotao.setVerticalTextPosition( SwingConstants.BOTTOM); c.add(imgBotao); c.add(txtBotao); ButtonTratar tratarB = new ButtonTratar(); imgBotao.addActionListener(tratarB); txtBotao.addActionListener(tratarB); setSize(300,150); show(); }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 151 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio public static void main(String args[]) { Cap15_Ex13 aplic = new Cap15_Ex13(); //classe annima para tratamento de janela aplic.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } //classe interna para handle event private class ButtonTratar implements ActionListener { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "Voc pressionou: " + e.getActionCommand()); //retorna o rtulo do boto } } }
JTextField
Este componente permite a criao de um componente de entrada de texto, geralmente contendo uma linha. Quando o usurio finaliza a entrada do respectivo texto ou dado e pressiona a tecla Return, gerado um evento.
A sintaxe para criarmos um campo texto a seguinte:
JTextField TField1 = new JTextField(20);
Nesse caso, o item (20) indica que podem existir at 20 posies visveis na tela. Agora, temos a sintaxe para criarmos um campo texto em que um texto inicial indicado:
JTextField TField2 = new JTextField( "Campo Texto preenchido e editvel", 20);
Alm do campo texto editvel, podemos criar um campo texto que no permite a edio do texto inicial. A sintaxe para isso a seguinte:
JTextField TField3 = new JTextField( "Campo Texto no editvel", 20); TField3.setEditable(false);
As sintaxes a seguir correspondem a um campo texto que gera evento:
if(e.getSource() == TFieldl) if(e.getSource() == TField2) PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 152 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio if(e.getSource() == TField3)
Apresentaremos, em seguida, um exemplo contendo a utilizao do componente JTextField:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex14 extends JFrame { String texto; private JTextField tField1, tField2, tField3; private JLabel lbl1, lbl2, lbl3; public Cap15_Ex14() { super("Utilizando JTextField"); Container c = getContentPane(); c.setLayout(new GridLayout(3,2)); //3 colunas, 2 linhas //JLabel (ttulos) para campos de textos lbl1 = new JLabel("Digite um texto aqui: ", SwingConstants.RIGHT); lbl2 = new JLabel("Este j vem com texto ", SwingConstants.RIGHT); lbl3 = new JLabel("Este no pode ser editado ", SwingConstants.RIGHT); tField1 = new JTextField(20); tField2 = new JTextField( "Campo texto preenchido e editvel", 20); tField3 = new JTextField("Campo texto no editvel", 20); tField3.setEditable(false); c.add(lbl1); c.add(tField1); c.add(lbl2); c.add(tField2); c.add(lbl3); c.add(tField3); TextFieldTratar tratarTF = new TextFieldTratar(); tField1.addActionListener(tratarTF); tField2.addActionListener(tratarTF); tField3.addActionListener(tratarTF); setSize(420,120); show(); } public static void main(String args[]) { Cap15_Ex14 app = new Cap15_Ex14(); app.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 153 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio System.exit(0); } }); } //classe interna (inner class) para o event handling private class TextFieldTratar implements ActionListener { public void actionPerformed(ActionEvent e) { texto = ""; if(e.getSource() == tField1) texto = "Contedo de tField1 = " + tField1.getText(); // retorna o texto else if(e.getSource() == tField2) texto = "Contedo de tField2 = " + tField2.getText(); else if(e.getSource() == tField3) texto = "Contedo de tField3 = " + tField3.getText(); JOptionPane.showMessageDialog(null, texto, "Texto digitado", JOptionPane.WARNING_MESSAGE); } } }
JcheckBox
O JCheckBox, que uma caixa de seleo, nos permite criar um componente que possui um rtulo para a sua identificao. Ele pode assumir dois estados: selecionado ou no- selecionado.
Vejamos a sintaxe para criarmos uma caixa de seleo:
JCheckBox caixa = new JCheckBox("ltem 1 ");
Para verificarmos em qual componente o evento ocorreu, utilizamos a seguinte sintaxe:
if(e.getSource() == caixa[ct])
Agora, temos a sintaxe do mtodo utilizado para verificarmos o estado do componente:
if(e.getStateChange() == ItemEvent.SELECTED)
Observemos, em seguida, um exemplo prtico da utilizao do componente JCheckBox:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex15 extends JFrame { PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 154 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio private JCheckBox caixa[]; private Icon img[], img2; private JLabel label[]; public Cap15_Ex15() { super("Escolha uma ou mais figuras + / JCheckBox exemplo"); Container c = getContentPane(); c.setLayout(new GridLayout(2,4)); img = new ImageIcon[4]; img2 = new ImageIcon("purple.gif"); //imagem padro quando no selecionada label = new JLabel[4]; caixa = new JCheckBox[4]; CheckBoxTratar tratarCB = new CheckBoxTratar(); for(int ct = 0; ct < 4; ++ct) //preenchimento e imagens e labels { img[ct] = new ImageIcon(ct + ".gif"); //nome das figuras 0,1,2,3.gif label[ct] = new JLabel(); label[ct].setIcon(img2); // somente imagem c.add(label[ct]); } for(int ct=0; ct<4; ++ct) // criao das caixas de seleo { caixa[ct] = new JCheckBox(" Figura" + (ct+1)); c.add(caixa[ct]); caixa[ct].addItemListener(tratarCB); } setSize(450,170); show(); } public static void main(String args[]) { Cap15_Ex15 aplic = new Cap15_Ex15(); aplic.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } private class CheckBoxTratar implements ItemListener { public void itemStateChanged(ItemEvent e) { for(int ct=0; ct<4; ++ct) PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 155 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio //verificando evento if(e.getSource() == caixa[ct]) if(e.getStateChange() == ItemEvent.SELECTED) label[ct].setIcon(img[ct]); else label[ct].setIcon(img2); } } }
JRadioButton
Com este componente, podemos criar um grupo de botes de seleo. A principal diferena entre este componente e o JCheckBox que no JRadioButton apenas uma das opes pode ser selecionada por vez. Alm disso, o formato do boto arredondado, e no quadrado como no JCheckBox.
Para que um conjunto de botes possa assumir somente um estado, selecionado ou no, precisamos adicion-los a um grupo, o qual tambm precisa ser criado. Vejamos, ento, a sintaxe para criamos um boto de opo:
JRadioButton radioBot = new JRadioButton("Nome", estado);
Agora, temos a sintaxe para criarmos o grupo no qual o conjunto de botes JRadioButton ser adicionado:
ButtonGroup radioGrupo = new ButtonGroup();
Para verificarmos em qual componente o evento ocorreu, utilizamos a sintaxe a seguir:
if(e.getSource() == radioBot)
Podemos definir nos botes de opo a fonte a ser utilizada no texto. Vejamos a sintaxe para essa tarefa:
Font normalF = new Font("TimesRoman", Font.PLAIN, 14);
No exemplo a seguir, mostramos como utilizar o componente JRatioButton:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExJRadioButton extends JFrame { private JRadioButton normal, negrito, italico, itaNeg; private ButtonGroup radioGrupo; private JTextField texto; private Font normalF, negritoF, italicoF, itaNegF; private Container c; private RadioButtonTratar tratarRB; PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 156 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio public ExJRadioButton() { super("RadioButton exemplo"); c = getContentPane(); c.setLayout(new FlowLayout()); texto = new JTextField("Clique nos botes para ver + o resultado" , 30); c.add(texto); tratarRB = new RadioButtonTratar(); radioGrupo = new ButtonGroup(); //criao dos JRadioBox normal = adicRadio("Normal" , true); negrito = adicRadio("Negrito" , false); italico = adicRadio("Itlico" , false); itaNeg = adicRadio("Negrito + Itlico" , false); //criao das fontes normalF = new Font("TimesRoman" , Font.PLAIN, 14); negritoF = new Font("TimesRoman" , Font.BOLD, 14); italicoF = new Font("TimesRoman" , Font.ITALIC, 14); itaNegF = new Font("TimesRoman" , Font.BOLD + Font.ITALIC, 14); texto.setFont(normalF); setSize(400,100); show(); } public static void main(String args[]) { ExJRadioButton aplic = new ExJRadioButton(); aplic.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } //definio do mtodo para adicionar componentes private JRadioButton adicRadio(String nome, boolean b) { JRadioButton radioBot = new JRadioButton(nome, b); radioBot.addItemListener(tratarRB); c.add(radioBot); radioGrupo.add(radioBot); return radioBot; } private class RadioButtonTratar implements ItemListener { public void itemStateChanged(ItemEvent e) { if(e.getSource() == normal) texto.setFont(normalF); PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 157 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio else if (e.getSource() == negrito) texto.setFont(negritoF); else if (e.getSource() == italico) texto.setFont(italicoF); else if (e.getSource() == itaNeg) texto.setFont(itaNegF); texto.repaint(); } } }
JPanel
Os painis tm a finalidade de facilitar a construo das interfaces de usurio. O JPanel funciona como um container, em que outros componentes so adicionados a ele. Podem, inclusive, serem adicionados outros painis no interior do JPanel.
Em vez de adicionarmos os componentes diretamente ao container, podemos adicion-los aos painis. A vantagem disso que a velocidade de construo da tela maior, alm de que h uma maior flexibilidade, pois cada painel pode ter seu prprio gerenciador de layout para a disposio dos componentes na tela.
Aps a definio do painel, bem como de seus componentes, necessrio adicion-lo a um JFrame. Vejamos, ento, como criar um painel:
JPanel panSub1 = new Jpanel();
Para acrescentarmos componentes ao painel, utilizamos a seguinte sintaxe:
panSub1.add(new JButton(" Boto #1"));
Agora, temos a sintaxe utilizada para definirmos um gerenciador de layout para o painel:
panSub1.setLayout(new GridLayout(2,2)); //panSub1 2 linhas x 2colunas
Quando adicionamos outros painis no interior de um JPanel, estamos aninhando-os. Para tanto, temos a seguinte sintaxe:
panPrin.add(panSub1); //adiciona o painel panSubI ao painel panPrin
Observemos, a seguir, um exemplo prtico da utilizao do componente JPanel:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cap15_Ex17 extends JPanel { PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 158 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio private JPanel panPrin, panSub1, panSub2; public Cap15_Ex17() { panPrin = new JPanel(); panSub1 = new JPanel(); panSub2 = new JPanel(); //definio do painel 1 panSub1.add(new JButton(" Boto #1")); panSub1.add(new JButton(" Boto #2")); panSub1.add(new JButton(" Boto #3")); panSub1.add(new JButton(" Boto #4")); //definio do gerenciador de layout panSub1.setLayout(new GridLayout(2,2));
//definio do painel 2 panSub2.add(new JButton(" Boto #5")); panSub2.add(new JButton(" Boto #6" ) ) ; panSub2.add(new JButton(" Boto #7")); //definio do gerenciador de layout panSub2.setLayout(new GridLayout(3,1));
//adiconando subpainis ao painel principal panPrin.add(panSub1); panPrin.add(panSub2); super.add(panPrin); } public static void main(String args[]) { Cap15_Ex17 aplic = new Cap15_Ex17(); JFrame frame = new JFrame("Utilizando o painel); frame.getContentPane().add(aplic); frame.setSize(350,150); frame.setVisible(true); frame.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
Nota: No gerenciador de layout BorderLayout permitida a incluso de apenas um componente (boto) em seu interior. Isso, contudo, se no utilizarmos os painis.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 159 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 16
1. Introduo
Os Applets so definidos como sendo pequenos programas ou aplicaes executados em browsers. A maioria dos browsers disponveis no mercado foi desenvolvida para suportar Applets criados em Java. No caso do Internet Explorer, aquela que garante o reconhecimento dos Applets em Java a MVM (Microsoft Virtual Machine) ou o JRE da Sun. Depois de compilarmos um Applet em Java, precisamos criar um arquivo sob a extenso HTML ou HTM (Caso seja alguma aplicao ASP, poder ser extenso asp), a fim de que a visualizao deste Applet seja possvel. Em seguida, dentro do arquivo gerado, devemos criar uma tag para que o Applet seja chamado. Ento, por meio do browser, abrimos o arquivo para que o Applet seja automaticamente carregado.
A seguir, um exemplo de criao de um applet:
Primeiro, o arquivo em htm salvo como Cap16_Ex1.htm:
import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class Cap16_Ex1 extends Applet { Label lb; public void init() { lb = new Label(" Hello Applet!"); add(lb); } }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 160 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio 2. Principais mtodos
Um Applet contm quatro mtodos principais, descritos na tabela a seguir: Mtodo Descrio Init() Este mtodo executado uma nica vez, no momento em que a pgina carregada pela primeira vez. indicado us-lo para carregar e inicializar todas as variveis a serem empregadas no Applet. start() Este mtodo, executado logo depois do init(), indicado para iniciar arquivos de som e animaes grficas.
stop() Este mtodo chamado toda vez que a janela do Applet deixar de ser a principal, como quando minimizamos ou mudamos da pgina do Applet para uma outra. Quando voltamos para a pgina do Applet, o start() novamente executado. destroy() Quando executado, este mtodo "libera" recursos que foram alocados pelo Applet. recomendvel chamar o destroy() assim que estivermos certos de que a pgina no ser mais utilizada.
Vale ressaltar que o uso desses quatro mtodos dentro de um Applet no obrigatrio.
3. Restries de applets
Uma das caractersticas de um Applet refere-se ao fato dele ser executado na mquina cliente. Por esta razo, os Applets esto sujeitos a algumas restries, no que diz respeito impossibilidade destes em realizar certas operaes por meio do browser. As restries citadas envolvem o fato de os Applets no poderem realizar qualquer tentativa de acesso a dados locais na mquina cliente, alm de s se comunicarem com a mquina em que esto hospedados. Estes recursos somente podero ser utilizados em um Applet por meio de uma assinatura digital em conjunto com o browser.
4. Applet x Awt x Swing
Para que possamos utilizar componentes Swing em Applets, a instalao do Java Plug-in na mquina cliente torna-se essencial. Para atender tal exigncia, adotaremos o pacote AWT com a finalidade de construir, nos browsers, os componentes grficos em tela.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 161 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio /* A seguir, temos o exemplo Applet - capturando eventos */ import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class Cap16_Ex2 extends Applet { public void init() { setBackground(Color.yellow); add(new Label("Hello Applet")); addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent e) { setBackground(Color.red); } public void mouseExited(MouseEvent e) { setBackground(Color.blue); } }); } }
/* A seguir, temos o exemplo Applets - capturando eventos botes */ import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class Cap16_Ex3 extends Applet { Button b1, b2; TextField txt = new TextField(25); public void init() { setBackground(Color.green); setLayout( new FlowLayout() ); add( b1 = new Button(" Boto 1")); add( b2 = new Button(" Boto 2")); b1.addActionListener(alist); b2.addActionListener(alist); add(b1); add(b2); add(txt); }
ActionListener alist = new ActionListener() { public void actionPerformed( ActionEvent e) PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 162 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio { if (e.getActionCommand() == "Boto 1") txt.setText(" Voc pressionou o boto 1"); else if (e.getActionCommand() == "Boto 2") txt.setText("Voc pressionou o boto 2"); } }; }
5. Passando parmetros para um applet
Para passar parmetros de uma pgina de HTM para um Applet, precisamos definir a tag PARAM na pgina, como descrito no seguinte exemplo:
O atributo NAME trata o nome do parmetro como uma string;
O atributo VALUE trata o nome do parmetro como uma string que pode ser convertida convenientemente dentro do programa, caso seja necessrio.
Assim, criaremos uma varivel do tipo String para que a mesma receba como valor o mtodo getParameter(String nome), cujo argumento o prprio nome do parmetro que foi definido na pgina HTM. Esta varivel String importante para obtermos o valor do parmetro no programa.
Considerando o exemplo anterior, a chamada do mtodo citado seria getParameter("msg"), retornando um valor String "teste passando parmetro".
6. Imagens e sons
Uma das caractersticas dos Applets o suporte para som e imagem. Os Applets aceitam a implementao de imagens do tipo JPEG ou GIF (que tambm pode ser animado) e arquivos de som do tipo MIDI, WAV, AU e AIFF. O exemplo seguinte descreve o uso de parmetros especificados pela pgina HTM para que os arquivos de som e imagem sejam recebidos:
Nome do arquivo: Cap16_Ex4.htm <html> <title>Usando Parmetros</title> <body> <applet code = Cap16_Ex4 WIDTH=300 HEIGHT=200> <PARAM NAME = "par1" VALUE = "bld.jpg"> <PARAM NAME = "par2" VALUE = "spacemusic.au"> </applet> PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 163 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio </body> </html>
/* A seguir, temos o exemplo Applet - parmetros, imagem, som */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class Cap16_Ex4 extends Applet { String imagem, som; Image img; AudioClip s; Button b1,b2,b3; public void init() { imagem = getParameter("par1"); som = getParameter("par2"); img = getImage (getDocumentBase(), imagem); s = getAudioClip(getDocumentBase(), som); setLayout(new FlowLayout()); add(b1 = new Button("Play")); add(b2 = new Button("Stop")); add(b3 = new Button("Loop")); b1.addActionListener(alist); b2.addActionListener(alist); b3.addActionListener(alist); add(b1); add(b2); add(b3); } ActionListener alist = new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand() == "Play") s.play(); else if (e.getActionCommand() == "Stop") s.stop(); else if (e.getActionCommand() == Loop") s.loop(); } };
public void paint(Graphics g) { g.drawImage(img,0,0,this); }
public void stop() PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 164 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio { s.stop(); } }
/* A seguir, temos o exemplo Applet - URL */ import java.awt.*; import java.awt.event.*; import java.applet.*; import java.net.*; public class Cap16_Ex5 extends Applet { Button b1; URL u; public void init() { setLayout(new FlowLayout()); add(b1 = new Button("Mudar")); b1.addActionListener(alist); add(b1); try { u = new URL(getDocumentBase(),"Cap16_Ex2.htm); } catch(Exception e) { showStatus("Erro na URL !..."); } } ActionListener alist = new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand() == "Mudar") getAppletContext().showDocument(u); } }; }
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 165 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 17
1. Introduo
Uma exceo um objeto gerado com o propsito de indicar que algum tipo de condio excepcional ocorreu durante a execuo de uma chamada de mtodo ou construtor. Assim, as excees esto associadas a condies de erro que no tinham como ser verificadas durante a compilao do programa e que acontecero somente durante a sua execuo. As duas atividades associadas manipulao de uma exceo so: gerao e captura. A manipulao (tratamento) de uma situao excepcional significa definir aes necessrias para a recuperao da situao de falha e dar continuidade a execuo do programa. Para cada exceo que pode ocorrer durante a execuo de um cdigo java, um bloco de aes de tratamento (um exception handler) dever ser especificado. um mecanismo adequado manipulao de erros sncronos, para situaes onde a recuperao da falha possvel.
A hierarquia de excees
Uma exceo em Java um objeto. A classe raiz de todas as excees a java.lang.Throwable. Apenas objetos dessa classe ou de suas subclasses podem ser gerados, propagados e capturados atravs do mecanismo de tratamento de excees.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 166 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio A classe java.lang.Throwable tem duas subclasses: java.lang.Exception: a superclasse das classes derivadas de java.lang.Throwable que indica situaes que a aplicao pode gerar e realizar um tratamento apropriado permitindo prosseguir com o processamento. Exemplo: Quando acessamos um arquivo, deveremos nos preocupar com as condioes de erro de IO (entrada e sada), para isso existe a classe java.io.IOException; java.lang.Error: a superclasse das classes derivadas de java.lang.Throwable que indica situaes que a aplicao no poder tratar. Usualmente indica situaes anormais, que no deveriam ocorrer dentro da JRE. Exemplo: Se por alguma condio anormal, ocorrer uma falha no sistema operacional que impea da JRE alocar memria, aconter uma java.lang.OutOfMemoryError.
Excees mais conhecidas java.lang.ArithmeticException: indica situaes de erros em processamento aritmtico, tal como uma diviso inteira por 0.
java.lang.NumberFormatException: indica que tentou-se a converso de uma String para um formato numrico, mas seu contedo no representava adequadamente um nmero para aquele formato. uma subclasse de java.lang.IllegalArgumentException.
java.lang.ArrayIndexOutOfBoundsException: indica a tentativa de acesso a um elemento de um array fora de seus limites -- ou o ndice era negativo ou era maior ou igual ao tamanho do array. uma subclasse de java.lang.IndexOutOfBounds, assim como a classe java.lang.StringIndexOutOfBounds.
java.lang.NullPointerException: indica que a aplicao usou uma referncia com valor null para invoca um mtodo ou acessando um atributo de um objeto, por exemplo.
java.lang.ClassNotFoundException: indica que a aplicao tentou carregar uma classe mas no foi possvel encontr-la.
java.io.IOException: indica a ocorrncia de algum tipo de erro em operaes de entrada e sada. Entre os erros mais conhecidos , subclasses de java.lang.Error, esto java.lang.StackOverflowError e java.lang.OutOfMemoryError. So situaes onde no possvel uma correo a partir de um tratamento realizado pelo prprio programa que est executando.
Como as excees em java so objetos, podem incluir atributos, mtodos e construtores. A classe java.lang.Throwable inclui o registro do estado atual da pilha de chamadas de mtodos e uma String associada a uma mensagem de erro, que pode ser obtida para qualquer exceo atravs do mtodo Throwable.getMessage(). Todas as excees derivadas de java.lang.RuntimeException, no so obrigadas a serem tratadas, pois so condies excepcionais que acontecem por falha nos algoritmos que o programador desenvolveu durante a chamada PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 167 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio daquele mtodo. Estas so chamadas tecnicamente de Unchecked Except i ons.
Todas as excees derivadas de java.lang.Exception, exceto as derivadas de java.lang.RuntimeException, so obrigadas a serem tratadas, pois so condies excepcionais esperadas e que podem acontecer durante a chamada daquele mtodo. Estas so chamadas tecnicamente de Checked Except i ons Todas as excees derivadas de java.lang.Error, devem ser tratadas, entretanto, quando aconterem interrompem a execuo do aplicativo. Estas so chamadas tecnicamente de Er r or s
Capturando e tratando excees.
A sinalizao da exceo propagada a partir do bloco de cdigo onde ela ocorreu atravs de toda a pilha de invocaes de mtodos at que a exceo seja capturada por um bloco manipulador de exceo.
Eventualmente, se tal bloco no existir em nenhum ponto da pilha de invocaes de mtodos, a sinalizao da exceo atinge o mtodo main(), fazendo com que o interpretador Java apresente uma mensagem de erro e aborte sua execuo.
Estrutura try-catch-finally.
A captura e o tratamento de excees em Java se d atravs da especificao de blocos try, catch e finally, definidos atravs destas mesmas palavras reservadas da linguagem. Um comando try/catch/finally obedece seguinte sintaxe:
try { // cdigo que inclui comandos/invocaes de mtodos // que podem gerar uma situao de exceo. } catch (Throwable t) { // bloco de tratamento associado condio de // exceo derivada de Throwable ou a qualquer uma de //suas // subclasses, identificada aqui pelo objeto // com referncia t } finally { // bloco de cdigo que sempre ser executado aps // o bloco try, independentemente de sua concluso // ter ocorrido normalmente ou ter sido interrompida // este bloco opcional }
Os blocos no podem ser separados por outros comandos -- um erro de sintaxe seria detectado pelo compilador Java neste caso. Cada bloco try pode ser seguido por zero ou mais blocos catch, onde cada bloco catch refere-se a uma nica exceo. PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 168 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio O bloco finally, quando houver, sempre executado independente se houve ou no uma exceo.
Em geral, ele inclui comandos que liberam recursos que eventualmente possam ter sido alocados durante o processamento do bloco try e que necessitam ser liberados, independentemente de a execuo ter encerrado com sucesso ou ter sido interrompida por uma condio de exceo. A presena desse bloco opcional.
Usando o bloco try-catch.
No programa abaixo faremos a leitura de um nmero via teclado, esta operao exige o uso de mecanismo de IO, que por sua vez podem gerar excees que devem ser tratadas.
import java.io.*; public class ConverteInteiro { public String leLinha() { byte[] lidos = new byte[20]; System.in.read(lidos); // l o buffer do teclado String texto = new String(lidos); return texto; } public int leInt() { String linha = leLinha(); return Integer.parseInt(linha); } public static void main(String[] args) { ConverteInteiro ci = new ConverteInteiro (); System.out.print("Entre inteiro: "); int valor = ci.leInt(); System.out.println("Valor lido foi: " + valor); } }
Compilando o programa, vemos que o compilador informa que uma exceo esperada java.io.IOException que uma Checked Exception, no foi devidamente tratada.
Lendo a documentao da classe java.lang.System da Java API, vemos que o mtodo read() do atributo esttico in que do tipo java.io.InputStream foi definido assim:
public int read(byte[] b) throws java.io.IOException
Veja mais detalhes no link abaixo (via internet) a definio: http://java.sun.com/j2se/1.4.1/docs/api/java/io/InputStream.html - read(byte[])
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 169 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio A keyword throws, indica que este mtodo gera e arremessa a quem cham-lo uma exceo do tipo java.io.IOException em uma determinada situao, e que se esta situao acontecer, o chamador deve estar apto a interpret-la.
Corrigindo o programa, inserimos o bloco de tratamento de excees para a exceo esperada que gerada pelo mtodo System.in.read(byte[] b)throws IOException.
import java.io.*; public class ConverteInteiro2 { public String leLinha() { byte[] lidos = new byte[20]; String texto = ""; try { System.in.read(lidos); // le o buffer do teclado texto = new String(lidos); texto = texto.trim(); // retira os espacos em branco } catch (IOException ioException) { // se acontecer um erro na leitura // imprime na tela o erro ioException.printStackTrace(); } return texto; } public int leInt() { String linha = leLinha(); return Integer.parseInt(linha); } public static void main(String[] args) { ConverteInteiro2 ci = new ConverteInteiro2(); System.out.print("Entre inteiro: "); int valor = ci.leInt(); System.out.println("Valor lido foi: " + valor); } }
Vemos que a compilao acontece com sucesso!.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 170 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Criando excees customizadas.
Em muitos casos, para facilitar o mapeamento das falhas em nossas aplicaes para mensagens amigveis para o usurio criaremos excees customizadas para essas funcionalidades. Imaginando o problema de um banco. Quando manipulamos operaes de dbito e crdito, devemos seguir algumas regras. A seguir veremos dois cdigos fontes, um que se utiliza do mecanismo de tratamento de excees e outro que no. Sem o mecanismo try-catch.
public class Conta { private double saldo; public boolean debito(double valor) { if ( valor < 0 ) { return false; } else { if ( saldo - valor < 0 ) { return false; } else { saldo -= valor; return true; } } } public boolean credito(double valor) { if ( valor < 0 ) { return false; } else { saldo += valor; return true; } } public double getSaldo() { return saldo; } }
public class TesteConta { public static void main(String args[]) { PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 171 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Conta c1 = new Conta(); System.out.println("Realizado: "+ c1.debito(100) ); System.out.println("Saldo: "+ c1.getSaldo() ); System.out.println("Realizado: "+ c1.credito(100) ); System.out.println("Saldo: "+ c1.getSaldo() ); System.out.println("Realizado: "+ c1.credito(-100) ); System.out.println("Saldo: "+ c1.getSaldo() ); System.out.println("Realizado: "+ c1.debito(-100) ); System.out.println("Saldo: "+ c1.getSaldo() ); } }
Com o mecanismo try-catch.
Neste caso, criaremos uma nova classe exceo que represente saldo insuficiente: SaldoInsuficienteException, como vimos, todas as excees que devem ser tratadas devem ser subclasses de java.lang.Exception.
public class SaldoInsuficienteException extends Exception { public SaldoInsuficienteException () { super("Falta de saldo para esta operao!"); } public SaldoInsuficienteException (String mensagem) { super(mensagem); } }
Alteraremos a classe Conta, para quando o saldo for insuficiente, seja gerada e arremessada uma exceo com uma mensagem amigvel.
public class Conta2 { private double saldo; public void debito(double valor) t hr ows Sal doI nsuf i ci ent eExcept i on { if ( valor < 0 ) { // unchecked exception no precisa ser declarada na clausula thorws throw new IllegalArgumentException ("Valor de debito deve ser maior que zero!"); } else { if ( saldo - valor < 0 ) { // checked exceptio, deve ser declara na clausula throws t hr ow new Sal doI nsuf i ci ent eExcept i on ( " Sal do i nsuf i ci ent e! At ual : " +sal do) ; PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 172 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio } else { saldo -= valor; } } } public void credito(double valor) { if ( valor < 0 ) { // unchecked exception no precisa ser declarada na clausula thorws t hr ow new I l l egal Ar gument Except i on ( " Val or de cr edi t o deve ser mai or que zer o! " ) ; } else { saldo += valor; } } public double getSaldo() { return saldo; } }
Alteraremos a classe TesteConta, para usar o mecanismo try-catch-finally e tratar a exceo criada quando ela acontecer.
public class TesteConta2 { public static void main(String args[]) { Conta2 c2 = new Conta2(); try { c2.credito(100); System.out.println("Saldo: "+ c2.getSaldo() ); c2.debito(50); System.out.println("Saldo: "+ c2.getSaldo() ); c2.debito(500); System.out.println("Saldo: "+ c2.getSaldo() ); } catch (SaldoInsuficienteException e) { // se acontecer uma SaldoInsuficienteException // caira neste bloco e.printStackTrace(); } catch (Exception e) { // se acontecer qualquer outra Exception // caira neste bloco e.printStackTrace(); } PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 173 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio finally { System.out.println("Saldo: "+ c2.getSaldo() ); } } }
O uso do mecanismo de excees para estes casos evita a codificao de estruturas de controle complexo na execuo de chamadas de mtodos consecutivos e dependentes, facilitando a construo e o entendimento do fluxo do programa.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 174 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Captulo 18
1. Introduo
Objetos do Banco de Dados
A criao de um banco de dados compreende uma srie de instrues para definio de como sero as caractersticas do banco; onde os dados sero fisicamente armazenados; quantos usurios iro utilizar o banco simultaneamente; como ser a configurao da instncia do banco, entre outras informaes. Mas no basta apenas criar o banco. necessrio que este banco tenha estruturas que possibilitem o armazenamento de dados, o acesso aos dados e mecanismos que auxiliem na recuperao dos dados, entre outros. Os objetos do banco representam estas estruturas e so criados e manipulados com as instrues DDL Data Definition Language, e suas definies ficam armazenadas no dicionrio de dados (Data Dictionary) do banco. Como exemplos de objetos pode-se citar:
Tabela (Table) Viso (View) Seqncia (Sequence) ndice (Index) Usurio (User) Personagem (role) Procedimentos (Procedure) Funes (Function) Gatilhos (Trigger) Pacotes (Package)
Usurios do Banco de Dados
Os usurios do banco de dados so as pessoas que utilizam o banco de dados e seus objetos, direta ou indiretamente, e esto agrupados nas seguintes categorias: desenvolvedor de aplicaes: o profissional responsvel pela construo de aplicaes que iro acessar a base de dados para realizar consultas, alteraes ou excluses de dados; usurio final: a pessoa que faz uso dos dados consolidados, para tomada de deciso ou simples consulta ou atualizao. Normalmente, interage com o banco por intermdio de aplicaes. analista de Banco de dados (Case): o usurio responsvel pela modelagem dos dados e implementao do banco de dados nos nveis lgico e fsico junto com o DBA. administrador de banco de dados: o profissional que tem as seguintes responsabilidades: Instalar e atualizar o banco de dados e as ferramentas de aplicao; Alojar sistemas de armazenamento e planejar os futuros armazenamentos de requerimentos para o sistema de banco de dados; Criao e armazenamento das estruturas primrias para que os desenvolvedores possam gerar aplicaes; Criao de objetos primrios, uma vez que os usurios tenham construdo uma PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 175 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio nova aplicao; Modificar a estrutura do banco de dados para adequ-lo s novas aplicaes; Garantir a disponibilidade do banco de dados, bem como a performance do mesmo; Controlar e monitorar os acessos dos usurios ao banco de dados (Segurana); Fazer o backup das informaes e a restaurao; Manter um controle sobre os backup's.
JDBC API
Dentro das classes java, o pacote java.sql fornece o modelo necessrios para o acesso a bancos de dados atravs do modelo JDBC (Java DataBase Connectivity). Como existem vrios fornecedores de bancos de dados, a JavaSoft definiu essencialmente interfaces que definem os mtodos que um Driver JDBC deve fornecer para a manipulao de comandos SQL.
Responsabilidades funcionais.
As interfaces disponveis no pacote java.sql definem como o fabricante deve implementar as classes para a manipulaco de comandos SQL. Para facilitar o desenvolvimento, cada interface tem uma responsabilidade dentro do conceito de acesso, execuo, manipulao e processamento de comandos dentro de um banco de dados relacional.
Categoria Componente Funcionalidade Carregar um Driver.
java.sql.DriverManager Gerencia um conjunto de drivers. Representar um Driver e criar uma conexo. java.sql.Driver Fornece uma conexo e informaes do driver. UM Driver representado por uma URL. Representar a Conexo. java.sql.Connection Representa uma conexo e uma sesso ao banco. Executar comandos SQL java.sql.Statement
java.sql.PreparedStatement
java.sql.CallableStatement
Executar um comando SQL esttico.
Executar comandos Pr- Compilados e facilitar o mapeamento Objeto-Relacional.
Executar Strored Procedures (Funes criadas e armanazenadas dentro do banco de dados.) PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 176 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Recuperar dados resultantes de um comando SELECT
java.sql.ResultSet Fornece uma lista dentro da aplicao que uma espelho das informaes contidas no banco de dados resultante da execuo de um SELECT. Excees java.sql.SQLException Representa erros durante a execuo dos comandos SQL.
Entendendo o funcionamento dos componentes da API JDBC.
Agora que j sabemos um pouco sobre tipos e o mapeamento para os tipos do Java, veremos como usar a API JDBC para manipular comandos SQL.
O que um Driver?
Driver um tipo de software que tem por finalidade permitir a comunicao entre dois sistemas.
Ex: Software <-> Driver <-> Arquivo de Dados (java) (ODBC) Access
Os drivers geralmente so fornecidos pelos fabricantes, mas comum encontrar drivers genricos distribudos com o sistema operacional e tambm drivers de terceiros. O que um ODBC?
OBDC Open Database Connectivity/Padro aberto de conectividade a banco de dados uma interface com grande disponibilidade de drivers para acesso a banco de dados. O uso da ponte ODBC-JDBC uma das formas possveis para aplicaes Java acessar arquivos de dados.
O que um JDBC?
JDBC Java Database Connectivity/Padro Java de conectividade a banco de dados a interface que possibilita s aplicaes Java acessarem bancos de dados relacionais e demais arquivos de dados.
JDBC-ODBC
Embora um programa em Java possa utilizar diretamente a interface ODBC para acessar arquivos de dados, este procedimento trabalhoso e elimina a portabilidade da aplicao. No devemos esquecer que os drivers ODBC geralmente so escritos em C. Para superar este obstculo, os programadores utilizam a ponte JDBC-ODBC.
PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 177 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio Criando uma fonte de dados ODBC.
Abra o aplicativo Fonte de Dados ODBC(32 bits) (Windows 2000) ouAdministrador de Fonte de dados ODBC (Windows XP). Na guia NFD de Sistema (Windows 2000) ou Fonte de dados de Sistema (Windows XP) clique em adicionar. Selecione Driver para o Microsoft Access(*.mdb) (Windows 2000) ou Driver do Microsoft Access (Windows XP) e clique em concluir. D um nome para o seu banco de dados, no nosso caso, d o nome de Empresa. Clique em selecionar e localize o banco de dados EMPRESA.MDB disponibilizado pelo professor. Clique em Ok e clique novamente em Ok. Est criado nossa fonte de dados ODBC.
Lembre-se:
Voc precisa criar uma fonte de dados para cada banco de dados que pretenda estabelecer conexo. Esta fonte de dados poder servir qualquer linguagem de programao.
Connection con; con = DriverManager.getConnection(url,usuario,senha);
System.out.println("Conexo realizada com sucesso.");
con.close(); }
catch(Exception e) PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 178 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio { System.out.println("Mensagem a ser exibida"); } } }
Explicando o cdigo:
import java.sql.*; Importa as classes que implementam o acesso a banco de dados com o Java.
try { ... Toda classe de acesso banco de dados TEM que ter captura de excees, por ser do tipo Checked Exception.
String url = "jdbc:odbc:nome_da_fonte_de_dados"; String usuario = ""; String senha = ""; Onde so criadas as Strings de conexo, o nome do usurio e a senha. Lembre- se que a fonte de dados criada em operao parte.
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Este comando carrega o driver que ser usado pela aplicao java para realizar a comunicao com o banco de dados.
Connection con; Cria uma conexo de nome com.
con = DriverManager.getConnection(url,usuario,senha); Estabelece a conexo usando os valores das variveis declaradas e inicializadas.
con.close(); Fecha a conexo aberta. Lembre-se de sempre fechar uma conexo aberta, para evitar problemas.
Connection con; PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 179 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio con = DriverManager.getConnection(url,usuario,senha);
System.out.println("Conexo realizada com sucesso.");
con.close(); }
catch(Exception e) { System.out.println("Problemas na conexo. + Verifique a digitao dos nomes e a existncia + da fonte de dados. \nRecompile e + execute novamente."); } } }
Consultando dados (SELECT)
A classe seguinte insere dados em nossa tabela Cliente.
// SELECT
import java.sql.*; class Cap18_Ex2 { public static void main (String args[]) { try { String url = "jdbc:odbc:Empresa"; String usuario = ""; String senha = ""; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con; con = DriverManager.getConnection(url,usuario,senha); Statement st = con.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM Cliente"); while (rs.next()) { System.out.print( rs.getString("CodCli") + " "); System.out.print( rs.getString("Nome") + " "); System.out.print( rs.getString("Telefone") + " "); System.out.print( rs.getString("DtNascimento") + " "); } System.out.println("Operao realizada com + sucesso."); PDF created with pdfFactory trial version www.pdffactory.com Programao de Computadores I Linguagem Java Pgina 180 ETECSP/ETECPJ Prof. Osvaldo Rodrigues Srgio st.close(); con.close(); }
catch(Exception e) { System.out.println("Problemas na conexo. + Verifique a digitao dos nomes e a + existncia da fonte de dados. + \nRecompile e execute novamente."); } } }
Explicando o Cdigo:
Statement st = con.createStatement(); Criando uma varivel da Classe Statement, para execuo de comando.
ResultSet rs = st.executeQuery("SELECT * FROM Cliente"); Criando uma varivel da classe ResultSet, que recebe uma executeQuery (Execuo de consulta), atravs de uma clusula SQL.
while (rs.next()) Faz um loop, enquanto for verdadeiro a existncia de novo registro. Lembrando que quando realizamos a executeQuery, o ponteiro do resultado posicionado no primeiro registro.
rs.getString("CodCli") + " "); o getString executa o processo de buscar na consulta o valor do campo indicado. Note que o + para garantir que, caso o campo tenha um valor nulo, no resulte em erro a operao de exibio/atribuio de valor.
Concluso:
Como podemos observar, o acesso banco de dados pelo Java bem simples e muito parecido com a conexo ADO da Microsoft. Os comandos SQL funcionam independente do banco de dados a ser acessado deve-se mudar somente alguns detalhes, quando o banco de dados que for acessado no seguir o padro SQL-ANSII 92, como o caso do MS-ACCESS.
PDF created with pdfFactory trial version www.pdffactory.com