Preview only show first 10 pages with watermark. For full document please download

Java Programming

Básico de programação java,usado pelo instituto infnet

   EMBED


Share

Transcript

i580 – Java Programming Java Programming Um curso Infnet utilizando a metodologia NETLEARN®. -1- TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – -1- i580 – Java Programming NETLEARN® ONE -2- NETLEARN® ONE : O método NETLEARN® ONE foi desenvolvido pelo Infnet para que os alunos obtivessem um grau de entendimento e retenção das tecnologias ensinadas muito superior aos cursos tradicionais. Sua criação teve por base uma longa experiência no ensino de TI (Tecnologia da Informação) e um profundo estudo das necessidades e dificuldades dos alunos em sala. O método não somente permite uma melhor compreensão das aulas, mas um aproveitamento superior dos conhecimentos adquiridos quando aplicados em ambientes reais de produção. Seguindo a risca as instruções de seus professores, profissionais dos mais competentes, você vai tirar proveito total do mais eficaz método de ensino-aprendizagem de tecnologias intranet/Internet disponível hoje. O método NETLEARN é patenteado pelo Infnet e sua utilização sem autorização escrita e explícita do Infnet constitui crime previsto em lei. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – -2- i580 – Java Programming Observação Importante: • O método NETLEARN visa trazer o melhor para os alunos. E nós sabemos que para se ter o melhor é preciso que se tenha flexibilidade. • Cada assunto tem suas características específicas. Cada curso tem suas necessidades. Por isso, nem sempre todos os módulos do NETLEARN® estarão presentes em todos os cursos. -3- NETLEARN: O objetivo primordial do Infnet é que você efetivamente aprenda. A utilização da metodologia NETLEARN® facilita o processo de aprendizado e aumenta a retenção do conhecimento. Entretanto, nem todas as etapas da metodologia são benéficas para todos os tipos de cursos ou assuntos. A generalização excessiva não traz benefícios para os alunos. Por isso, o Infnet não vai deixar de oferecer o melhor para você por falta de flexibilidade. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – -3- i580 – Java Programming A Apostila • Sua apostila é dividida em 2 partes: – Slides na parte de cima de cada página. – Anotações na parte de baixo. • Slides: – São os slides que o professor vai utilizar durante o curso. • Anotações: – Informações complementares, zoom no código de programas e espaço para você escrever. -4- Slides: Os slides de sua apostila são os mesmos usados pelo professor durante o curso. Você poderá acompanhar todas as aulas através deles e estudar a matéria posteriormente com este material. Anotações: Abaixo dos slides, há um espaço chamado de anotações. Ele tem vários propósitos: Conter informações complementares ao conteúdo do slide, muitas vezes evitando que você precise anotar tudo o que o professor diz em aula. Servir de referência em tópicos mais extensos, permitindo que você se aprofunde na matéria após o término do curso. Repetir o código de programas, imagens e telas capturadas que ficaram muito pequeninas no slide, facilitando sua leitura e o acompanhamento das aulas. Ser um espaço para você escrever suas próprias observações e perguntas. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – -4- i580 – Java Programming Apresentações • Professor: – Nome. – E-mail. – Experiência. • Alunos: – Nome. – Experiência em Desenvolvimento de Sistemas. – Expectativas. -5- Professores e colegas: Os seus professores são profissionais de comprovada experiência prática nas tecnologias que serão ensinadas durante o curso. Você deve ficar totalmente à vontade para tirar suas dúvidas. Durante o horário de aula o professor estará a seu inteiro dispor para esclarecer quaisquer tópicos relacionados ao conteúdo do curso e a compartilhar sua experiência com todos os alunos. Ao final do curso você será responsável por uma avaliação do professor. O Infnet lhe agradeceria se você estivesse atento às principais características de seus professores: Disponibilidade, dedicação, atenção, cordialidade, conhecimento da matéria, didática, etc. Os seus colegas de classe são também uma importante fonte de conhecimento. Muitos alunos que se conhecem nos cursos do Instituto Infnet tornam-se amigos (e até sócios!) e ajudam-se mutuamente nas dúvidas que surgem com o uso das tecnologias aprendidas. Anotando o e-mail de seus colegas, você poderá no futuro manter bons relacionamentos. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – -5- i580 – Java Programming Informações Úteis • Horários. – Programe-se para chegar 10 minutos antes do início da aula. – O intervalo é de 15 minutos. • Computadores, Máquinas Virtuais e Rede. • Backup dos Exercícios. – Faça sempre backup dos exercícios em pendrive ou via webmail. • SAE – Sistema de Apoio ao Ensino. – http://sae.infnet.edu.br -6- TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – -6- i580 – Java Programming Objetivos do Curso • Apresentar e consolidar as estruturas sintáticas da Linguagem Java. • Concretizar os conceitos de Orientação a Objetos através da implementação de códigos em Java. • Permitir ao programador entender e utilizar as principais bibliotecas da Linguagem Java. -7- TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – -7- i580 – Java Programming O Curso UA 1 – Fundamentos 12 UA 2 – Orientação a Objetos 88 UA 3 – Tratamento de Erros 151 UA 4 – Classes Úteis 166 UA 5 – Desenho de Telas 208 UA 6 – Estruturas de Dados 246 Referências 285 -8- TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – -8- i580 – Java Programming Público Alvo • Estudantes e profissionais que visam projetos de desenvolvimento de software orientados a objetos baseados na Linguagem Java. • Profissionais de desenvolvimento de software interessados em se atualizar na Plataforma Java. -9- TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – -9- i580 – Java Programming Pré-requisitos • Conhecimentos Básicos de Programação e Desenvolvimento de Software. • Conhecimentos Básicos sobre Modelagem de Dados e Bancos de Dados. • Conhecimentos de Operação do Windows: – Conhecimento das principais funcionalidades do Windows e seus aplicativos. – Conhecimento de operação do sistema de arquivos. – Conhecimento de instalação de softwares. - 10 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 10 - i580 – Java Programming Atividades • O curso tem dois tipos de atividades: – Exercícios cujo objetivo é fixar os conceitos aprendidos no tópico. – Laboratórios que servem como complementação do aprendizado. • Para um melhor aproveitamento do curso é imprescindível a leitura do material impresso e o estudo dos gabaritos das atividades. - 11 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 11 - i580 – Java Programming 1 - Fundamentos Unidade de Aprendizado - 12 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 12 - i580 – Java Programming 1 – Fundamentos • • • • • Você aprenderá: Introdução à Linguagem Java. Variáveis e Tipos de Dados. Métodos. Operadores e Controle de Fluxo. Arrays. - 13 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 13 - i580 – Java Programming 1.1 – Introdução à Linguagem Java Bloco de Construção do Aprendizado - 14 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 14 - i580 – Java Programming 1.1 – Introdução à Linguagem Java Você aprenderá: • • • • • • • • • Visão Geral. Edições de Java. Máquina Virtual Java. Compilação e Execução. Primeiro Programa. Biblioteca de Classes. Documentação. Pacotes. A Instrução import. - 15 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 15 - i580 – Java Programming Visão Geral • Orientada a objeto: – “Modificar é a regra”. • Interpretada e independente de plataforma – JVM com JIT - Just in Time Compilers. • Multithreaded: – Executa, por natureza, vários trechos de código ao mesmo tempo. • Robusta e segura: – Fortemente tipada, sem acesso direto a endereços de memória evitando erros de acesso e perda de ponteiros, applets sem acesso a disco etc. • Dinâmica e distribuída: – Alterações feitas apenas nas classes pertinentes sem a necessidade de recompilação de todo o sistema. - 16 - A linguagem Java utiliza o paradigma de programação orientada a objetos, que facilita o trabalho do programador, pois ele consegue ver o programa em termos reais do dia-a-dia. Um objeto é uma entidade que possui características (atributos) e ações associadas (métodos). Quase tudo dentro de Java, à exceção dos tipos de dados primitivos, são implementados como objetos. E mesmo estes podem ser convertidos para objetos em determinadas situações. Java é independente de plataforma, ou seja, os programas não estão restritos a um único ambiente operacional ou máquina específica. Assim, alcança-se uma portabilidade que poucas linguagens oferecem. Isso só é possível graças ao conceito da máquina virtual Java (JVM) que interpreta o programa e mapeia o código para as instruções correspondentes na plataforma de execução. Esse mecanismo de interpretação foi muito criticado pelos opositores da linguagem que argumentavam tornar os programas em Java mais lentos do que seus similares em C. Entretanto ele foi muito melhorado com o advento dos compiladores Just in Time (JIT Compilers), que fazem várias otimizações e traduzem algumas instruções para código nativo. Programas em Java são multithreaded por natureza. O suporte é nativo, fazendo com que partes do programa possam ser executados de forma concorrente com outras. Quem controla esse mecanismo é a máquina virtual Java em conjunto com o sistema operacional. Classes podem ser carregadas dinamicamente, ou seja, durante a execução do programa. Classes e objetos podem residir em máquinas diferentes com a utilização de um mecanismo denominado RMI. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 16 - i580 – Java Programming Edições de Java • JRE - Java Runtime Edition: – É o próprio interpretador Java, o mínimo necessário para executar programas em Java. Browsers instalam apenas o JRE. • Java SE - Java Standard Edition: – Também conhecido como JDK - Java Development Kit. É composto pelo JRE, ferramentas de desenvolvimento e compilador. • Java EE - Java Enterprise Edition: – Complemento ao JDK que instala um conjunto de bibliotecas necessárias para suportar Servlets, JSP, Enterprise Beans e outras. • Java ME - Java Micro Edition: – Simplificação da linguagem usada para desenvolvimento de aplicações para celulares, palmtops e hand-helds. • Documentação: – Fornecido separadamente. Existem versões próprias para cada especialização do JDK. - 17 - Existem também, dentro de cada versão, especializações do JDK (Java Development Kit). Todas elas estão disponíveis para download na página oficial do Java na Sun (http://www.java.sun.com). JRE é a versão para o usuário, possui apenas as bibliotecas e ferramentas necessárias para executar um programa Java. O Java SE significa Java Standard Edition. É o conjunto padrão de bibliotecas e ferramentas. O Java EE significa Java Enterprise Edition, uma plataforma completa para desenvolvimento e execução de aplicativos para WEB e distribuídos. Engloba Servlets, JavaServer Pages, JavaServer Faces, Expression Language e Enterprise Beans. A Java ME (Java Micro Edition) é a versão específica para desenvolver e executar programas para dispositivos móveis como celulares e hand-helds. A documentação pode ser baixada do site do Sun ou consultada online. No site oficial existem muitos recursos para o aprendizado como artigos, tutoriais, sistemas completos de exemplo e instruções para certificação. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 17 - i580 – Java Programming Máquina Virtual Java (JVM) • É o ambiente onde os programas em Java são executados. • Responsável pela importante característica de portabilidade de Java. – Código compilado (bytecode) pode ser executado em outras plataformas. • Vem junto com o JDK e em alguns browsers para execução de applets. - 18 - A Máquina Virtual Java (JVM) é uma máquina genérica simulada via software em uma máquina real. Ela possui seu próprio conjunto de instruções, registradores, pilha de execução, área de memória e heap. Dessa forma, há uma diminuição no tempo de desenvolvimento dos programas. A JVM foi especificada pela Sun de forma que os programas fossem portáveis de uma plataforma para outra, sem que houvesse a necessidade de reescrever ou recompilar o código fonte. Logo, sua especificação não está atrelada a nenhuma plataforma de hardware específica. Hoje já existem versões da máquina virtual Java para a maioria das plataformas de hardware. A JVM funciona da seguinte forma: 1 – O código fonte escrito pelo programador é compilado para um formato conhecido por bytecodes, que representa as instruções de máquina para a JVM, e possuem um padrão especificado pela Sun. Esses bytecodes são compactos e eficientes; 2 – No momento da execução, os bytecodes são carregados pela JVM e executados de forma interpretada. Os bytecodes são sempre os mesmos, o que muda é a JVM, específica para cada plataforma. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 18 - i580 – Java Programming Primeiro Programa Comentários: // - uma única linha. /* ...*/ - várias linhas /** .... */ javadoc 1 2 3 4 5 6 Nome da classe, também define o nome do arquivo.java Método main( ). Ponto de entrada no sistema // Isso é um programa exemplo public class PrimeiroPrograma { public static void main (String args[]) { System.out.println(“Oi mundo!”); } } { } - chaves delimitam um bloco de comando. Case sensitive = difere maiúsculas e minúsculas ; - ponto-e-vírgula é obrigatório ao final de cada instrução. Todo código Java tem que estar dentro de uma classe - 19 - O programa acima é um exemplo de uma aplicação simples feita em Java (a famosa Hello World, não há quem não conheça). Na linha 1 aparece um exemplo de comentário de linha. Tudo o que vem a direita da “//” é desconsiderado pelo compilador. Há três tipos de comentário: o de linha, o comentário de bloco, indicado por /* ... */, que pode se estender por várias linhas, e o comentário de documentação, indicado por /** ... */. O comentário de documentação é semelhante ao de bloco, só que ele é reconhecido pela ferramenta javadoc, que vem dento do JDK e é usado para gerar documentação de forma automática. Na linha 2 começa a declaração da classe PrimeiroPrograma. Classe é o elemento fundamental da linguagem Java. Em Java, praticamente tudo (com exceção dos tipos primitivos) é definido dentro de classes. O fim da declaração da classe se encontra na linha 6. Toda classe após o seu nome (no caso PrimeiroPrograma) deve conter um bloco delimitado pelas chaves. Tudo o que estiver dentro das chaves será considerado como parte integrante da classe. Da linha 3 a linha 5 existe a declaração de um método, que é o equivalente em Java a funções e procedimentos das outras linguagens. Nesse caso o nome do método é main e os três elementos antes do seu nome indicam a visibilidade do método (public), o tipo do método (static) e o tipo de resultado que o método retorna (void). O que está a direita entre parênteses são as informações que o método recebe, ou seja, os parâmetros. O método main é o ponto de entrada para a aplicação. Isso significa que o primeiro método a ser procurado pela JVM será o método main. Na linha 4 está o comando que imprime uma mensagem na saída padrão. Repare que toda instrução em Java deve terminar com ponto e vírgula. Uma instrução em Java pode ser dividida em várias linhas se necessário. Também podem ser incluídos espaços e tabulações de modo a melhorar a compreensão do código-fonte. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 19 - i580 – Java Programming Primeiro Programa • Na linha de comando, para compilar e executar o programa temos que fazer: c:\[diretório]>javac PrimeiroPrograma.java – Gera o arquivo .class com os bytecodes. É obrigatória a colocação da extensão. c:\[diretório]>java PrimeiroPrograma – Chama a JVM para executar o arquivo PrimeiroPrograma.class. Não deve ser colocada a extensão. - 20 - Para compilar a classe é utilizado o programa javac, que vem com o JDK. O compilador recebe como argumento o nome da classe (ou classes) a ser compilada. Repare que o nome do arquivo .java é igual ao nome da classe. Isso não ocorre por acaso. É obrigatório que o nome do arquivo .java seja igual ao da classe pública que ele contém. Levam-se em conta letras maiúsculas e minúsculas. Ao final da compilação será gerado um arquivo de nome PrimeiroPrograma.class. Esse arquivo contém os bytecodes que são interpretados pela máquina virtual Java. Para executar a máquina virtual e carregar a aplicação em memória, basta executar o programa java.exe (ou javaw.exe) e passar o nome do arquivo .class como parâmetro. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 20 - i580 – Java Programming Exercício • Crie um projeto e uma classe com o código do primeiro programa. • Exiba uma mensagem na tela (mude a mensagem original). • Execute a classe gerada. - 21 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 21 - i580 – Java Programming Biblioteca de Classes • Programas Java são formados por partes chamadas classes. • As classes são agrupadas em pacotes. • Classes são formadas por métodos que realizam tarefas e retornam informações após seu término. • Programadores devem tirar proveito das ricas coleções de classe existentes nas bibliotecas da plataforma Java. API = Application Programming Interface - 22 - A plataforma Java possui bibliotecas de classes, denominadas Java Application Programming Interface ou simplesmente Java API. Estas classes oferecem diversas funcionalidades úteis, tais como: funções matemáticas, conversões de valores, entrada e saída de dados, leitura e gravação de arquivos, tratamento de XML, comunicação em rede, formatação de datas e números, manipulação de conjuntos de dados. As bibliotecas básicas são parte integrante tanto da edição Java Standard Edition (Java SE) quanto da Java Runtime Edition (JRE) e não precisam ser baixadas em separado. As classes destas bibliotecas são utilizadas tanto no momento da compilação quanto na execução. Em Java não existe o conceito de link-edição, portanto as bibliotecas devem estar disponíveis na máquina do usuário no momento da execução. Para indicar o local das bibliotecas Java (e outras bibliotecas de terceiros) tanto para a compilação quanto para a execução deve ser criada a variável de ambiente CLASSPATH. Assim, se as bibliotecas java estão em c:\java\lib e uma biblioteca externa denominada bancomoney.jar está na pasta c:\banco\lib, a variável classpath teria o seguinte conteúdo: CLASSPATH=c:\java\lib;c:\banco\lib\bancomoney.jar;. O “.” é utilizado para indicar que bibliotecas e classes que estejam na pasta da aplicação também devem ser consideradas. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 22 - i580 – Java Programming Documentação Crie um atalho para a documentação no seu browser - 23 - A documentação do Java está disponível para download e também online. Ela tem o formato apresentado na figura acima mas também pode ser encontrada em outros formatos não oficiais, como pdf, word e arquivo de help do Windows (.chm). A documentação deve ser escolhida de acordo com a versão e edição da plataforma Java. O site da documentação da Sun (http://java.sun.com/reference/api/) possui as seguintes documentações: Standard Edition. Enterprise Edition. Micro Edition. Javacard. Java Web Services. XML. Outras tecnologias. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 23 - i580 – Java Programming Pacotes • Pacote é um diretório no sistema de arquivos que contém classes que são logicamente relacionadas. • Para indicar que uma classe pertence a determinado pacote, ela deve ser colocada na pasta adequada e o comando package deve indicar o nome desta pasta. • Este comando é único e deve ser o primeiro do arquivo: package nome_do_pacote; Nomes de pacotes são escritos em letras minúsculas - 24 - As classes em Java são organizadas em pastas ou pacotes. Estes pacotes servem para indicar tanto a localização física da classe quanto seu nome dentro do sistema. O package tem seu nome usado pelo ambiente de execução Java para gerenciar a unicidade dos identificadores declarados em um programa, através do mecanismo conhecido como namespace. Portanto uma classe baixada pela rede não fica no mesmo espaço de memória que uma classe que tenha sido desenvolvida pelo programador. Namespace é um pedaço da memória que é alocada pelo Java para o gerenciamento de objetos, que serão organizados dependendo da fonte do código. Os nomes dos pacotes são hierárquicos e separados por pontos. É comum que sejam usados letras minúsculas. Os identificadores devem ser únicos em um determinado namespace, ou seja, em um mesmo pacote não podem existir classes com nomes iguais. Se a classe não declara a instrução package, a classe pertence ao package default (ou seja, um package sem nome). TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 24 - i580 – Java Programming Alguns pacotes de classes de Java • java.lang - Java Language (não precisa de import). • javax.swing – Biblioteca Swing. • java.awt- Abstract Windowing Toolkit. • java.text – Text. • java.sql - Database Connectivity. Classes são agrupadas em Pacotes - 25 - Alguns pacotes da edição Java SE: java.applet java.awt java.beans java.io java.lang java.math java.net java.nio java.rmi java.security java.sql java.text java.util javax.accessibility javax.activation javax.activity javax.annotation javax.crypto javax.imageio javax.jws javax.lang.model javax.management javax.naming javax.net javax.print javax.rmi javax.script javax.security.auth javax.security.cert javax.security.sasl javax.sound.midi javax.sql javax.swing javax.tools javax.transaction javax.xml org.ietf.jgss org.omg.CORBA org.omg.CosNaming org.omg.Dynamic org.omg.DynamicAny org.omg.IOP org.omg.Messaging org.omg.PortableInterceptor org.omg.PortableServer org.omg.SendingContext org.omg.stub.java.rmi org.w3c.dom org.xml.sax TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 25 - i580 – Java Programming Exercício • Crie uma classe com o código abaixo e faça os testes de execução. 1 2 3 4 5 6 7 8 9 // Programa exemplo public class Exemplo02 { public static void main (String args[]) { System.out.println("Antes da mensagem"); javax.swing.JOptionPane.showMessageDialog(null, “Viva Java!", "exercício Java",1); System.out.println("Depois da mensagem"); } } Observe que as linhas 5 e 6 são partes da mesma instrução - 26 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 26 - i580 – Java Programming Instrução import • Para usar classes definidas em outros packages usa-se a instrução import. • Ela vem antes da declaração da classe e depois da declaração package. import nome_do_pacote[.subpacote].nome da classe; OU import nome_do_pacote[.subpacote].*; - 27 - A declaração import diz ao compilador onde encontrar as classes que estão definidos em outras packages. Exemplos: import com.infnet.model.ContaCorrente; import infnet.cursos.*; Na primeira linha do exemplo, a instrução import está identificando apenas uma classe (ContaCorrente) que será trazida para o namespace. Na segunda linha todas as classes definidas no package infnet.cursos estão acessíveis. O primeiro formato é o preferido pois melhora o desempenho da compilação, já que o compilador não precisa ficar procurando as classes necessários nos pacotes utilizados. Quando uma classe é utilizada com seu nome completo, este nome é denominado nome qualificado: javax.swing.JOptionPane.showMessageDialog(...); Para evitar que existam pacotes com nomes iguais, existe uma forte sugestão para a nomenclatura de pacotes: todo pacote deve começar com o nome do domínio invertido. Assim, se o sistema possuir uma classe Cliente dentro de um pacote chamado model, o nome de acordo com a convenção seria: com.infnet.model TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 27 - i580 – Java Programming Classes de Outros Pacotes • Sem o import: public class DesenhaPontos2{ public static void main(String args[]) { ... javax.swing.JTextArea areaDeTexto = new javax.swing.JTextArea(200,150); strNum = javax.swing.JOptionPane.showInputDialog("Entre com o número de pontos: "); • Com import da classe: import javax.swing.JOptionPane; //importa apenas a classe indicada public class DesenhaPontos2{ ... javax.swing.JTextArea areaDeTexto = new javax.swing.JTextArea(200,150); strNum = JOptionPane.showInputDialog("Entre com o número de pontos: "); • Com import do pacote: import javax.swing.*; //importa todas as classes do pacote mas NÃO os pacotes dentro do pacote public class DesenhaPontos2{ ... JTextArea areaDeTexto = new JTextArea(200,150); strNum = JOptionPane.showInputDialog("Entre com o número de pontos: "); - 28 - Para utilizar classes e métodos de outros pacotes existem quatro formas. Neste tópico serão apresentadas três maneiras, a quarta será vista adiante. O uso do import não é obrigatório mas se for necessário utilizar uma classe de outro pacote então esta classe deverá ter o nome qualificado em todos os lugares do código: com.infnet.model.ContaCorrente cc = new com.infnet.model.ContaCorrente(); Caso seja usado o import de classe, apenas a classe referenciada no import pode ser usada sem o nome qualificado. As demais classes do pacote devem ser usadas com o nome qualificado: import com.infnet.model.ContaCorrente; ... ContaCorrente cc = new ContaCorrente(); com.infnet.model.Cliente cliente = new com.infnet.model.Cliente(); Se o import for usado para referenciar todas as classes de um pacote (com o “*”), quaisquer classes deste pacote podem ser usadas sem o nome qualificado: import com.infnet.model.*; ... ContaCorrente cc = new ContaCorrente(); Cliente cliente = new Cliente(); As classes que estão no mesmo pacote não precisam utilizar a instrução import. Caso existam duas classes com mesmo nome em pacotes diferentes e estas classes sejam utilizadas no mesmo programa, pelo menos uma delas deverá sempre ser utilizada com o nome qualificado. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 28 - i580 – Java Programming Exercício • Altere o programa Exemplo02 da página 24, de forma que este faça uso do import para as classes externas. • Procure na documentação que método da classe JOptionPane poderia ser usado para obter a mensagem a ser exibida (não é preciso implementá-lo agora, apenas anote aqui a resposta). - 29 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 29 - i580 – Java Programming 1.2 – Variáveis e Tipos de Dados Bloco de Construção do Aprendizado - 30 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 30 - i580 – Java Programming 1.2 – Variáveis e Tipos de Dados Você aprenderá: • • • • • • Literais. Identificadores. Tipos Primitivos. Variáveis. Type Cast. Atributos. - 31 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 31 - i580 – Java Programming Literais • Literais inteiros – – – –  7, 3, 1970  6000000000L, 16000000l  04, 037, 07  0xA9, 0X58, 0x20 Formato implícito (int) Formato explícito (long) Formato octal Formato Hexadecimal • Literais de ponto flutuante – – – – – Formato implícito (double) Formato explícito (double) Formato explícito (float) Formato científico (double) Formato científico (float)  2.0952  2.17d, 2.3D  1.75f, 2.10F  7.2e-11, -18.911E21  1.12E3f, 7.9e-8F Literais são os dados - 32 - Literais são as constantes escritas dentro de um programa Java e também são conhecidas como programação “Hard Coded”. Outro tipos de literais: Literais de caractere Formato implícito Formato em octal Formato de caracteres de escape Formato unicode : ‘F', ‘+', ‘3' : '\25', '\33' : '\n', '\t', '\r', '\f', '\\' : '\u00A9', '\u0090' Literais string Formato padrão : “Só sei que nada sei" Literais lógicos Verdadeiro Falso : true : false TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 32 - i580 – Java Programming Identificadores • Usados para identificar variáveis, constantes, classes e métodos. • Regras de formação de identificadores. • Algumas convenções estabelecidas. - 33 - Variável é um espaço de memória usado para armazenar informações de um determinado formato. Para que se possa usar uma variável, deve ser atribuído à mesma um nome que a identifique de modo único. O nome da variável (ou método, classe, etc.) é chamado de identificador, que possui regras de formação próprias. 1 – O identificador deve iniciar ou por uma letra, ou por caractere sublinhado (_) ou pelo símbolo do cifrão ($). 2 – Os outros caracteres, além dos listados no item 1, também podem ser dígitos. 3 – Caracteres como espaços, tabulações, @, #, !, %, &, *, (, ), -, +, =, \, |, etc., não podem fazer parte do identificador. 4 – Há distinção entre maiúsculas e minúsculas. 5 – Não há limite de comprimento para o identificador. 6 – É possível mas não desejável, a utilização de caracteres especiais, como por exemplo, caracteres com acento. 7 – Não podem ser usadas as palavras reservadas. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 33 - i580 – Java Programming Identificadores • Começa com letras ou _(sublinhado). $ é válido mas deve ser evitado. • Pode conter dígitos no meio ou no final. • Há distinção entre maiúsculas e minúsculas. • Podem ser usados caracteres acentuados. • Não podem ser usadas palavras reservadas. Procure utilizar nomes sugestivos para identificadores - 34 - Nas regras estabelecidas acima, as palavras reservadas são citadas. Essas palavras são parte integrante da linguagem Java e só podem ser usadas apenas dentro de um contexto específico. As palavras reservadas são: abstract assert*** boolean break byte case extends final finally float continue default do double else enum**** int interface long native for goto* if implements import instanceof short static strictfp** super new package private protected public return try void volatile while switch synchronized this throw throws transient char class const* catch * Não usado ** Adicionado na versão 1.2 *** Adicionado na versão 1.4 **** Adicionado na versão 5.0 TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 34 - i580 – Java Programming Identificadores • Métodos e variáveis: – Palavras simples - tudo em minúsculo. – Palavras compostas - Começa com minúscula e a inicial das outras palavras em maiúscula. • Constantes: – Tudo em maiúsculo. Palavras compostas separadas com _ (sublinhado). • Classes: – Palavras simples - Começa com maiúscula. – Palavras compostas Começa com maiúscula e a inicial das outras palavras em maiúscula. • Arquivos: – Mesmas convenções das classes. - 35 - A linguagem Java utiliza duas convenções para os nomes de identificadores: PascalCase e CamelCase. Em ambas as convenções, identificadores compostos por mais de uma palavra não tem separação explícita, mas a primeira letra de cada palavra subseqüente inicia em maiúscula. Na convenção PascalCase todo identificador inicia com a primeira letra em maiúscula. É utilizada para nomes de classes, enumerações e arquivos. Na convenção CamelCase os identificadores começam sempre em minúscula. É usada para nomes de variáveis, métodos e rótulos. Nomes de constantes seguem uma regra diferente: todos os caracteres são escritos em maiúsculo e palavras são separadas pelo caractere sublinhado (_). A linguagem Java não usa o conjunto de caracteres ASCII, mas um conjunto mais abrangente, denominado Unicode. Ele é um padrão internacional para representar qualquer caractere de qualquer língua escrita no mundo utilizando 16 bits (mais informações podem ser obtidas no site www.unicode.org). TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 35 - i580 – Java Programming Tipos Primitivos byte short int long float double char boolean (8 bits) (16 bits) (32 bits) (64 bits) (32 bits) (64 bits) (16 bits) (JVM) Numéricos sem casa decimal Numéricos com casa decimal Caracter da tabela unicode true/false - 36 - Cada variável pode armazenar um tipo de dados único. Existem em Java oito tipos de dados divididos em quatro categorias. Esses são os únicos elementos na linguagem que não são objetos e são chamados de tipos primitivos. O tamanho dos tipos de dados é independente de plataforma, ou seja, não se altera qualquer que seja o computador que esteja sendo usando. A única exceção é o tipo boolean que depende da JVM onde o programa é executado. Normalmente o tamanho é de 1 bit mas a especificação da Sun não garante que este valor será o mesmo para todas as plataformas. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 36 - i580 – Java Programming Tipos Primitivos • Inteiros – byte, short, int e long. • A diferença entre eles está no intervalo de valores que cada um pode suportar: byte menor = 10; // 1 byte short pequeno = 456; // 2 bytes int normal = 10252; // 4 bytes long muitoGrande = 6263732239L; // 8 bytes - 37 - Variáveis desses tipos são usadas para armazenar números inteiros com sinais (positivos ou negativos). A diferença entre elas está no intervalo de valores que cada uma pode suportar. byte short int long 8 bits 16 bits 32 bits 64 bits -128 a 127 -32768 a 32767 -2147483648 a 2147483647 -9223372036854775808 a 9223372036854775807 Qualquer valor literal inteiro é, por default, do tipo int em Java. Portanto, 1, -8765, 10000 são literais do tipo int. Para definir um literal do tipo long, por exemplo, devemos colocar um L (ou um l, apesar de não ser recomendável por confundir-se com o dígito 1) depois do valor. Com isso, 999L, 1L e -67L são literais do tipo long. Se o valor for muito grande (por exemplo, 4000000000) deve ser colocado um L ao final do literal para indicar que ele é do tipo long. Não há como especificar um literal do tipo byte ou short. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 37 - i580 – Java Programming Tipos Primitivos • Ponto flutuante – float e double – float - precisão simples (7 dígitos) que utiliza 32 bits de armazenamento. – Tornam-se imprecisas para valores muito grandes ou muito pequenos. – Úteis quando precisamos de um valor fracional sem grande necessidade de precisão. – double - precisão dupla (15 dígitos) que utiliza 64 bits de armazenamento. float numeroReal = 10.9f;// 4 bytes double numero = 6745.9E13;// 8 bytes - 38 - As variáveis do tipo ponto flutuante podem armazenar números reais. Logo, 9507.98 e -0.00006 são números válidos para esses tipos de dados. Veja a diferença entre as duas possibilidades na tabela a seguir (ambos positivos ou negativos): float double 32 bits 64 bits -3.4x1038 a 3.4x1038 -1.7x10308 a 1.7x10308 Qualquer valor literal real é, por default, do tipo double. Para definir um literal do tipo float deve ser colocado um F (ou f) depois do valor. Porém, diferentemente do que acontece nos inteiros, pode ser indicado o tipo padrão com o uso de uma letra (D ou d). Seguem abaixo exemplos de números de ponto flutuante: · 3.1415 · 3.1415f · 6.02E23D (o D é opcional) · 127.987E+200F Observação: Todas as definições e operações para os valores de ponto flutuante, em Java, seguem a especificação IEEE 754. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 38 - i580 – Java Programming Tipos Primitivos • Textual – char - 16 bits - 2 bytes. char meuCaractere = ‘L’; char meuCharUnicode = ‘\u0058’; • A contra barra indica uma seqüência de escape. Escape significa “desligar” / “desativar” - 39 - O tipo char pode armazenar um caractere simples na representação Unicode de 16 bits sem sinal (2 bytes). O tipo char literal deve ser delimitado por aspas simples (' '): char meuCaractere = 'L'; Como normalmente um editor de texto ASCII é usado para editar os programas fonte, não é possível utilizar todos os caracteres Unicode disponíveis. Para que se possa usar todo o conjunto de caracteres existentes, deve ser utilizada uma seqüência de escape. Uma seqüência de escape permite que um caractere seja especificado pelo seu código. O que indica uma seqüência de escape é uma contra barra. Se for seguida do caractere u e de quatros dígitos hexadecimais, representará o caractere por meio do seu código Unicode. Portanto, o caractere ‘X’ em Unicode pode ser representado assim: char meuCharUnicode = '\u0058'; Para representar o caractere de copyright ©, usa-se: char copyright = ‘\u00A9’; TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 39 - i580 – Java Programming Tipos Primitivos ‘\b’ ‘\t’ ‘\f’ ‘\n’ ‘\r’ ‘\’’ ‘\”’ ‘\\’         backspace tab form feed line feed carriage return aspas simples aspas duplas contrabarra - 40 - Nota: Uma seqüência de caracteres delimitada por aspas duplas (“) é chamada de string. Em uma string, para especificar o caractere contra barra, o caractere apóstrofe e o caractere aspas também é usada uma seqüência de escape para exibí-los. Logo, para mostrar a frase: E como disse o poeta em 1940: “...é preciso viver com os homens, é preciso não assassiná-los.” Deve ser escrito: System.out.println(“E como disse o poeta em 1940: \“...é preciso viver com os homens, é preciso não assassiná-los.\””); Também é possível realizar operações aritméticas com variáveis do tipo char: meuCaractere = meuCaractere + 1; meuCaractere foi inicializado com o valor 'L' no exemplo anterior. Ao final da instrução acima, meuCaractere terá o valor ‘M’. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 40 - i580 – Java Programming Tipos Primitivos • Lógico – boolean. boolean status = true; boolean continuar = false; • Os literais do tipo boolean são escritos em letra minúscula. - 41 - Os valores lógicos são representados pelo tipo de dados boolean, que pode receber dois valores literais apenas: true ou false (verdadeiro ou falso). A declaração de uma variável lógica e sua inicialização é feita da seguinte maneira: boolean status = true; // sempre em letra minúscula Caso a variável não seja inicializada e ela esteja declarada fora de métodos (um atributo) ela será inicializada automaticamente com o literal false. As variáveis lógicas não podem ser convertidas diretamente para qualquer outro tipo de dados. Nisso, Java é diferente de C e C++ que permitem que valores numéricos possam ser usados em variáveis lógicas. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 41 - i580 – Java Programming Variáveis • Java é uma linguagem “fortemente tipada” • Toda variável deve ser declarada explicitamente antes de seu uso. int populacaoMundial; char opcao; float cotacaoDolar, preco; boolean status = true; double produtoInternoBruto; - 42 - Cada variável pode armazenar um único tipo de dado. Toda variável possui: identificador, tipo de dado, valor e tamanho (definido pelo tipo). Toda variável em Java deve ser explicitamente declarada antes de sua utilização. A declaração de uma variável de um tipo primitivo consiste do tipo, seguido do identificador da mesma, terminando com um ponto e vírgula: < identificador > [ ,< identificador2, ... > ][ = valor inicial ] ; Variáveis possuem um escopo que determina em que locais do código-fonte elas podem ser visualizadas. Se a variável for declarada fora de um método ela receberá um valor padrão (default). As variáveis podem ser inicializadas no momento da declaração ou após a declaração. int numeroDias; numeroDias = 15; int numeroDias = 15, cont, f = 5; TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 42 - i580 – Java Programming Valor e Referência • Em Java existem dois tipos de variáveis: – Valor: variáveis de tipos primitivos. – Referência: variáveis de classes – “apontam” para objetos em memória. int qtde = 150; Cliente cli = new Cliente(); qtde cli objeto - 43 - Em Java existem dois tipos de variáveis com relação ao seu armazenamento em memória: Valor: variáveis por valor são as variáveis criadas a partir de um tipo primitivo. A área de memória alocada para elas contém o valor destas variáveis. Os exemplos a seguir mostram variáveis de valor cuja área de memória possui o conteúdo: char conceito = ‘A’; int gols = 28; float preço = ‘1.75’; Referência: variáveis criadas a partir de classes e vetores. Neste caso a área de memória não possui o conteúdo (objeto) mas o endereço de memória onde o conteúdo está alocado. Caso se atribua uma referência para outra do mesmo tipo, o objeto não é copiado, apenas a referência. Os exemplos a seguir são variáveis de referência que possuem o endereço do conteúdo (objeto): String comentário = “O material é muito bem escrito, não possui erros...”; Livro livro = new Livro(); ContaCorrente cc = new ContaCorrente(); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 43 - i580 – Java Programming Type Cast • Java não opera quando um tipo não “cabe” no outro. É necessário fazer um “ajuste” explícito: public class TiposPrimitivos{ public static void main(String args[]) { int a = 5, b = 2; int c; c = a / b; System.out.println("c = " + c); double d; d = a / b; System.out.println("d = " + d); c=2 d = 2.0 e = 2.5 double e; e = (double) a / b; System.out.println("e = " + e); } } - 44 - Em algumas situações, Java irá converter um literal ou o resultado de uma expressão para um tipo mais abrangente. Valores do tipo byte, char e short podem ser convertidos para int, e um valor do tipo int pode ser convertido para um do tipo long. Um valor do tipo int pode ser convertido para um do tipo float, mas pode haver perda de informação já que um inteiro é mais significativo que um float. Um valor do tipo float pode ser convertido para double: double numero = 3.14F; O problema é que Java não faz a conversão de um numero ou de uma expressão para um tipo menos abrangente (conhecido por downcasting). O motivo é que essa conversão poderia resultar em perda de informação. Logo, a instrução abaixo gera um erro em tempo de compilação: byte b = 34000;// ERRO!!! O compilador verifica que o literal não cabe no espaço destinado a uma variável do tipo byte. Outro caso muito comum é mostrado a seguir: int x = 4646L;// ERRO!!! Apesar do valor 4646 caber dentro do intervalo aceito pelo tipo int, o literal foi definido como sendo do tipo long. O exemplo da figura acima mostra um caso bem comum: a divisão de valores inteiros na qual se espera um resultado double (ou float). Para que o valor seja calculado corretamente é necessário fazer uma conversão explícita: pelo menos um dos valores int deve ser convertido para double. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 44 - i580 – Java Programming Type Cast long grande = 890L;// 64 bits int pequeno = (int) grande; //truncou? char letra = (char) 87; //letra ‘W’ • Sempre que possível é feito o “ajuste” implícito. • Alguns “ajustes” implícitos permitidos: byte > short > int > long > float > double Só é possível o cast para tipos compatíveis - 45 - Caso seja necessário efetuar o downcasting é necessário fazer uma coerção explícita entre os tipos das variáveis. Desta forma o compilador aceita a atribuição. A coerção explícita é feita colocando-se o nome do tipo primitivo entre parênteses antes do valor a ser convertido, que também pode vir entre parênteses. long grande = 890L; int pequeno = (int) (grande); char letra = (char) 87; // A variável letra recebe a ‘W’ A coerção explícita é extremamente importante para a plataforma Java. Adiante será estudado herança, polimorfismo e programação para interface. Em todos estes tópicos é necessário utilizar conversão explícita em determinadas situações. Dependendo dos tipos envolvidos, a coerção pode causar resultados imprevisíveis ou indesejáveis. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 45 - i580 – Java Programming Exercício • Crie um programa chamado Exemplo03. • Declare uma variável no método main do tipo String. • Utilize o método de JOptionPane que obtém dados do usuário (que você descobriu no exercício anterior). • Obtenha o nome do usuário e o armazene na variável declarada. • Exiba o nome do usuário em um diálogo – use JOptionPane novamente. • Responda: é possível fazer um cast da variável com o nome do usuário para char ou boolean? Por-quê? - 46 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 46 - i580 – Java Programming 1.3 – Métodos Bloco de Construção do Aprendizado - 47 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 47 - i580 – Java Programming 1.3 – Métodos Você aprenderá: • Estrutura de um Método. • Escopo de Variáveis. • Visibilidade. - 48 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 48 - i580 – Java Programming Estrutura de um Método • Métodos têm a seguinte estrutura genérica: () { //corpo ou escopo do método. Fica entre chaves { }. } - public, private, , protected; - com a palavra static ou sem ela; - void, tipo primitivo ou classe; - valem as convenções; - lista de variáveis a serem preenchidas na chamada do método. - 49 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 49 - i580 – Java Programming Estrutura de um Método • Métodos retornam no máximo um valor. • Se [tipo_retorno] não for void, o corpo do método tem que ter um return. • Um método não pode ser definido dentro de outro método. • Métodos devem ter sua função bem definida para promover a reutilização de código. • Métodos não devem ter muitas linhas de código, nem muitas variáveis. • Teste SEMPRE os parâmetros recebidos antes de executar o código do método. - 50 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 50 - i580 – Java Programming Chamadas a Métodos • Dentro da definição da própria classe: nomeDoMetodo(); • Métodos de classe – são estáticos: int x = Integer.parseInt(“12345”); double d = Math.random(); • Métodos de instância – são dinâmicos: ContaCorrente cc = new ContaCorrente(); cc.consultarSaldo(); Cliente cli = new Cliente(); cli.getNome(); - 51 - Métodos podem ser invocados de diversas maneiras em Java. Os modificadores de e os tipos definirão como eles poderão ser chamados. Por exemplo, no slide acima para chamar nomeDoMetodo(...) o método dentro da classe poderia ter qualquer . Métodos de classe como o caso de Math.random() tem visibilidade pública e são do tipo static. Métodos de instância de classe são métodos que podem ser invocados apenas a partir dos objetos instanciados pela classe. Por exemplo, a partir da classe Aluno podem ser criados os objetos aluno1, aluno2. Cada objeto criado é uma instância da classe e o método de instância pode ser invocado com a sintaxe: “nome_da_instânciaponto-nome_do_metodo”. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 51 - i580 – Java Programming Visibilidade Modificadores private Mesma classe Mesmo package Subclasses Qualquer lugar x * x x protected x x x public x x x x Os modificadores funcionam para qualquer tipo de identificador – variá variáveis, mé métodos, classes etc. - 52 - Os modificadores de acesso permitem que o Java controle como serão usadas as variáveis e os métodos. O quadro acima vale para métodos e variáveis e mostra em que locais podem ser visualizados os elementos de acordo com o especificador utilizado. Existem quatro modificadores de acesso: private, package, protected e public. A visibilidade private é usada para restringir o acesso aos elementos apenas pela classe que os contém. O especificador conhecido como default ou package não tem uma palavra definida e é utilizado quando não for definida uma visibilidade. Ele indica que outras classes do mesmo pacote podem acessar o elemento. O acesso protected permite que a própria classe, subclasses e outras classes do mesmo pacote possam acessar o elemento. E finalmente o indicador public permite que quaisquer classes acessem o elemento. Um arquivo fonte só podemos ter uma classe pública mas nada impede que existam várias outras classes com visibilidade default. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 52 - i580 – Java Programming Exercício • Crie uma classe TestaMetodos que contenha os seguintes cabeçalhos de métodos: – Método público e dinâmico para calcular a soma de dois números reais. – Método privado e estático que inverta a ordem dos caracteres de uma frase. – Método de pacote que verifique se um servidor está ativo ou não. – Método público e estático que verifique se um CNPJ é válido. Não é para implementar – somente o cabeç cabeçalho do mé método é necessá necessário. Coloque return nos mé métodos que retornam resultados. - 53 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 53 - i580 – Java Programming 1.4 – Operadores e Controle de Fluxo Bloco de Construção do Aprendizado - 54 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 54 - i580 – Java Programming 1.4 – Operadores e Controle de Fluxo Você aprenderá: • Operadores. • Estruturas de Controle de Fluxo. - 55 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 55 - i580 – Java Programming Operador de atribuição • Atribuição ( = ). • A expressão da direita é atribuída à variável que está à esquerda: x = 110; Y = x + 12; • Pode ser utilizado de forma encadeada: x = y = z = 55; A atribuição é a última coisa a ser feita em uma expressão - 56 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 56 - i580 – Java Programming Operadores Aritméticos • Requerem dois operandos. • Operações aritméticas básicas. • Funcionam com variáveis e literais. int x, y, z; x y z x y = = = = = 229 + 23; 73 – 9; 72 * 6; y / z; x % z; // // // // // adição subtração multiplicação divisão resto da divisão - 57 - Os operadores aritméticos funcionam com operandos numéricos e o resultado da operação também é numérico. As operações aritméticas entre números seguem as regras de conversão implícita listadas abaixo: 1 – se um dos operandos é do tipo double, o outro é convertido para double. 2 – se um dos operandos é do tipo float, o outro é convertido para float. 3 – se um dos operandos é do tipo long, o outro é convertido para long. 4 – se não acontecer nenhum dos casos acima, ambos são convertidos para int. Repare que, diferentemente de outras linguagens, os operadores de divisão e de resto da divisão podem ser utilizados também com números reais. Por exemplo: a = 3.2 % 1.5; //a recebe 0.2 Outras operações matemática estão disponíveis na classe Math. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 57 - i580 – Java Programming Operadores Aritméticos • O operador ++ incrementa de 1. • O operador -- decrementa de 1. • Duas formas de utilização: pré-fixada e pós-fixada. int x, y; x = 2; y = x++; // pós-fixado => x = 3 e y = 2 x = 2; y = ++x; // pré-fixado => x = 3 e y = 3 Esses operadores “mandam” na expressão – são os primeiros a serem avaliados - 58 - Estes dois operadores são usados para somar ou diminuir um de uma variável. Veja o exemplo a seguir: x = 10; --x; // O valor de x é igual a 9. // Poderia ter sido usado x = x - 1; Estes operadores podem ser utilizados de duas formas: pré-fixada e pós-fixada. Na notação pré-fixada, a variável é incrementada antes de ser realizada a operação de atribuição. No exemplo abaixo: int y, x = 10; y = ++x; A variável y recebe o valor 11, já que antes da operação de atribuição a variável x é incrementada de 1. Já na notação pós-fixada a variável é incrementada depois da operação de atribuição. Assim, teríamos: int y, x = 10; y = x++; Nesse caso, a variável y recebe o valor 10 para que em seguida a variável x seja incrementada de 1 e termine com o valor 11. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 58 - i580 – Java Programming Operadores Relacionais • Os operadores relacionais sempre retornam um valor do tipo boolean: > >= < <= == != Maior que Maior ou igual a Menor que Menor ou igual a Igual a Diferente de Não confunda igualdade com atribuição - 59 - São utilizados para comparar valores entre duas variáveis ou expressões, retornando um valor lógico. Lembre-se que não há conversão automática de int para boolean. int a = 8, b = 5; boolean status; status = (a >= b);// A variável status recebe o valor true status = (a == b);// A variável status recebe o valor false É muito comum a confusão entre o operador de atribuição e o operador de igualdade. Preste atenção na diferença entre eles. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 59 - i580 – Java Programming Operadores Lógicos • Os operadores lógicos mais usados são: && E || Ou ! Não • Estes operadores são chamados de curtos pois avaliam apenas o que for necessário para retornar um resultado. • Existem operadores longos que avaliam toda a expressão: & | ^ E (longo) Ou (longo) Ou exclusivo - 60 - Variáveis lógicas e expressões que retornam um valor lógico podem ser combinadas utilizando os operadores listados no quadro no slide. Como exemplo, considere três variáveis lógicas e as expressões abaixo: status3 = status1 && status2;// status3 terá o valor true se e // somente se status1 e status2 forem verdadeiras status3 = status1 || status2;// status3 terá o valor true se // pelo menos uma das variáveis for verdadeira status3 = status1 ^ status2;// status3 terá o valor true se // uma e apenas uma das variáveis for verdadeira status3 = !status1; // status3 terá o valor true se status1 for false // status3 terá o valor false se status1 for true Os operadores && e || são chamados de operadores lógicos curtos porque a expressão do lado direito do operador só será avaliada se não for possível, na avaliação da expressão do lado esquerdo, determinar o resultado final da operação. No primeiro exemplo, se status1 for falsa, status2 não é avaliada, já que o resultado só poderá ser falso. Se for necessária a avaliação de todas as expressões, independente do resultado, deve-se usar os operadores lógicos longos & e |. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 60 - i580 – Java Programming Operadores Lógicos if(x > y & y < z) if(x > y && y < z) V testa V F testa F if(x > y | y < z) testa não testa if(x > y || y < z) V testa V não testa F testa F testa if(x > y ^ y < z) V F F V - 61 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 61 - i580 – Java Programming Operadores Compostos • O operador de atribuição pode ser combinado com qualquer operador binário. • Estes operadores não tornam o programa mais rápido, apenas facilitam a sua construção. x = 110; x += 12; // igual a x = x + 12 x /= 4; // igual a x = x / 4 - 62 - Java nos permite combinar o operador de atribuição com qualquer um dos operadores binários (que usam dois argumentos). Operador += -= *= /= %= &= |= ^= Operação Adição-Atribuição Subtração-Atribuição Multiplicação-Atribuição Divisão-Atribuição Módulo-Atribuição E-Atribuição Ou-Atribuição Ou Exclusivo-Atribuição int a = 8, b = 5; a += b;// Igual a a = a + b; a *= b;// Igual a a = a * b; b -= 4;// Igual a b = b – 4; TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 62 - i580 – Java Programming Ordem de Precedência dos Operadores Ordem 1 2 3 4 5 6 7 8 9 10 11 Operador ++ -- + - ~ !(tipo) * / % + < > <= >= instanceof == != ^ | && || ?: = += -= *= /= Associatividade D para E E para D E para D E para D E para D E para D E para D E para D E para D D para E D para E Parênteses podem ser usados para alterar a precedência - 63 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 63 - i580 – Java Programming if...else • Executa um grupo de comandos, dependendo do valor de uma condição. • Caso haja uma instrução, as chaves podem ser omitidas (mas não devem). if (condição) comandos [else comandos] if (condição) instrução ou bloco de instruções cercados por chaves [else if (condição-n) instrução ou bloco de instruções cercados por chaves] [else instrução ou bloco de instruções cercados por chaves] - 64 - Possibilita a execução de partes diferentes do programa baseada no resultado de uma expressão booleana. if (expressão booleana) { instrução ou bloco } else { instrução ou bloco } Lembre-se que toda instrução deve terminar com ponto e vírgula e que todo bloco deve estar entre chaves. Se a expressão booleana for verdadeira, o código que segue (corpo do if) é executado. Se a expressão for falsa, existem duas alternativas: a) se não existir a cláusula else, o corpo do if não é executado; b) se existir a cláusula else, o código que a segue (corpo do else) é executado. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 64 - i580 – Java Programming if...else if (salario >= 1000 && salario < 2500) IR = salario * 0.1; else if (salario < 5000) IR = salario * 0.2; else IR = salario * 0.25; - 65 - Pode-se colocar uma instrução if dentro da outra caso haja a necessidade. Essa construção é conhecida como if aninhados. if (salario >= 1000) && (salario < 2500) IR = salario * 0.1; else if (salario < 5000) IR = salario * 0.2; else IR = salario * 0.25; A utilização de declarações if aninhadas não é de recomendável porque pode tornar o programa de difícil manutenção, caso o aninhamento seja muito profundo. Além disso, é um erro comum esquecer que a cláusula else sempre se refere ao if mais próximo (a endentação não influi nisso). TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 65 - i580 – Java Programming if...else if (salario >= 1000 && salario < 2500){ IR = salario * 0.1; } else if (salario < 5000) { IR = salario * 0.2; } else } IR = salario * 0.25; } Não fica melhor se colocarmos as chaves? - 66 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 66 - i580 – Java Programming Operador Ternário • Alternativa para o comando if...else • O resultado deste operador é o retorno de um valor de qualquer tipo. expressão lógica ? retorno se true : retorno se false int total = salario < 1000 ? salario : salario – IR; Evite “aninhar” operadores ternários - 67 - Uma alternativa à instrução if...else é a utilização do operador ternário. A sua sintaxe de utilização é mostrada a seguir: expressão booleana ? expressão 1 : expressão 2 Caso a expressão booleana retorne um valor verdadeiro a expressão 1 é executada. Se ela retornar um valor falso, a expressão 2 é a que vai ser executada. int total = salario < 1000 ? salario : salario – IR; No exemplo acima, se a variável salario for menor que 1000, à variável total é atribuído o valor de salario. Já se a variável salario for maior ou igual a 1000, a variável total recebe o valor de salario menos o valor da variável IR. Este operador substitui a construção if...else em situações onde um valor deve ser retornado. Evite o aninhamento de operadores condicionais já que ele pode tornar o código difícil de ler. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 67 - i580 – Java Programming switch • Executa um determinado grupo de comandos, dependendo do valor de uma expressão. switch (expressão_teste) { [case expressão constante 1: comandos] [default expressão constante n: comandos] } • expressão_teste tipicamente é: – byte, short, int ou char. - 68 - Uma outra alternativa à instrução if...else é a instrução switch. Ela é usada quando deve ser selecionada uma ação dentro de um número de possibilidades. switch (expressão inteira) { case expressão constante 1 : instrução ou bloco [ break; ] case expressão constante 2 : instrução ou bloco [ break; ] ... [ default: instrução ou bloco break; ] } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 68 - i580 – Java Programming switch switch (diaSemana) { case 1: System.out.println(“Hoje é segunda-feira”); break; case 2: System.out.println(“Hoje é terça-feira”); break; ... case 7: System.out.println(“Hoje é domingo”); break; default: System.out.println(“Opção inválida!!!”); break; } - 69 - A ordem em que as cláusulas aparecem é importante, visto que a comparação é feita obedecendo-a. Por causa disso, a cláusula opcional default deve aparecer no final do comando. O comando break finaliza o switch e deve ser utilizado ao final de cada cláusula case. Se isto não for feito, o fluxo de execução continuará dentro do switch até que um break seja encontrado ou o seu final seja alcançado. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 69 - i580 – Java Programming switch switch (diaSemana) { case 1: case 2: case 3: case 4: case 5: System.out.println(“Hoje é dia de trabalho!!”); break; case 6: case 7: System.out.println(“Hoje é fim de semana!!!”); break; default: System.out.println(“Opção inválida!!!”); break; } - 70 - O comando break é o que interrompe a execução das instruções dentro do comando switch, desviando o fluxo de execução para a primeira instrução após a chave de fechamento do bloco. Ele não é um comando obrigatório, mas a sua ausência pode criar alguns efeitos interessantes. Nesse caso, se a variável diaSemana tiver um valor entre 1 e 5, a mensagem “Hoje é dia de trabalho...” é exibida. Se o valor for 6 ou 7, a mensagem a ser exibida é “Hoje é fim de semana...”. Qualquer outro valor mostrará a mensagem de erro da cláusula default. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 70 - i580 – Java Programming while • Executa uma série de comandos enquanto uma condição for verdadeira. while (condição) { comandos } O “teste” ocorre antes do loop - 71 - Em certos momentos há a necessidade de que uma determinada seqüência de instruções seja executada repetidamente. Para isso, Java nos fornece instruções que possibilitam a execução repetida de um numero determinado de instruções. São as chamadas estruturas de repetição, laços ou loops. A mais simples das estrutura de repetição é a instrução while, que possui a sintaxe a seguir: while (expressão booleana) instrução ou bloco Enquanto a expressão lógica for verdadeira, a instrução ou bloco será executado repetidamente até que a expressão seja falsa, quando então o fluxo de execução passa para a primeira instrução após o while. i = 1; while (i <= 10) { System.out.println(i); i++; } Um erro muito freqüente em casos como o do exemplo acima é esquecer de atualizar a variável de controle (no caso a variável i). Como a expressão lógica é calculada antes que o corpo do while seja executado, se ela retornar um valor falso na primeira vez em que for calculada não haverá execução do corpo do laço. Outro caso que pode acontecer é a situação em que a expressão booleana nunca se torna falsa, o que gera o chamado loop infinito. Portanto, face ao exposto, a instrução ou bloco que compõe o while pode ser repetida 1, 2, ..., infinitas vezes, ou até mesmo nenhuma vez. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 71 - i580 – Java Programming do...while • Repete um bloco de comandos enquanto uma condição for verdadeira. do{ instrução ou bloco de instruções; }while (condição); O “teste” ocorre após o primeiro loop - 72 - Essa estrutura de repetição é similar à instrução while, com a diferença de que nesta a expressão lógica é processada após a execução da instrução ou do bloco de instruções, o que garante que o corpo do do...while será executado pelo menos uma vez. O corpo da instrução será executado enquanto a expressão lógica for falsa. i = 1; do { System.out.println(i); i++; } while (i <= 10); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 72 - i580 – Java Programming for • Repete um grupo de comandos um número específico de vezes. for (inicialização; condição de término; passo){ instrução ou bloco de instruções } • inicialização – declara-se uma variável de controle do loop. • condição de término – é uma expressão lógica envolvendo a variável de controle e o valor final desta. • passo – expressão de incremento ou decremento envolvendo a variável de controle. - 73 - Essa estrutura de repetição deve ser utilizada sempre que soubermos quantas vezes um determinado bloco de comandos deve ser executado, além das condições de inicialização e finalização. for ( inicialização ; condição de término ; passo ) instrução ou bloco Repare que as seções são sempre separadas por ponto e vírgula. A seção de inicialização é executada sempre que se entra no laço e apenas uma vez. Nesta seção é onde fazemos, se for necessário, a declaração de variáveis a serem utilizadas dentro do laço. Essas variáveis só serão visíveis enquanto o laço estiver sendo executado, sendo descartadas ao final. Podem ser escritas várias declarações separadas por vírgulas. A condição de término indica quando o loop deve terminar. Enquanto esta condição for verdadeira, o loop continua, quando ela for falsa o loop termina. O passo normalmente é utilizado para a soma ou subtração de valores utilizando os operadores unários ++ e --. É executada sempre que uma iteração do loop termina e antes da avaliação da condição de término. O comando for pode ser usado para outras situações além de uma contagem, como por exemplo: a leitura de linhas de um arquivo texto. Existe outra sintaxe para o comando for que será vista no capítulo sobre coleções. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 73 - i580 – Java Programming for public class Tabuada { public static void main(String args[]) { for (int i = 1; i <=10 ; i++) { System.out.println(“Tabuada do " + i); for (int j = 2; j <= 9; j++) System.out.println(i + “*“ j + “= “ + (i*j)); } } } - 74 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 74 - i580 – Java Programming break • Sai de um loop ou switch incondicionalmente: 1 for (int i = 1; i <= limite; i++) { 2 fatorial = 1; 3 for (int j = 2; j <= i; j++) { 4 fatorial *= j; 5 if (fatorial == 120) 6 break;// vai para linha 8 7 } 8 System.out.println(i + "! é " + fatorial); 9 } 10 System.out.println(“O fatorial é “ 11 + fatorial); - 75 - A instrução break também pode ser utilizada em laços para encerrar as iterações antes da condição de término ter se tornado verdadeira. O fluxo da execução é então desviado para a primeira instrução após o laço. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 75 - i580 – Java Programming Laboratório • Exercícios Ímpares – devem ser digitados e testados como estão. Esses exemplos servirão como base. • Exercícios Pares – são os exercícios propostos que deverão ser elaborados a partir dos exemplos anteriores. • Os exercícios que não forem feitos em sala devem ser feitos em casa. Os enunciados estão no http://sae.infnet.edu.br - 76 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 76 - i580 – Java Programming 1.5 – Arrays Bloco de Construção do Aprendizado - 77 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 77 - i580 – Java Programming 1.5 – Arrays Você aprenderá: • • • • Arrays. Declaração. Criação. Inicialização. - 78 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 78 - i580 – Java Programming Arrays (vetores) • Características principais: – Tamanho fixo. – Todos os elementos possuem o mesmo tipo de dados e são acessados com o mesmo identificador. – Cada elemento possui um índice. – Cada posição (índice) só pode guardar um valor. – Todo objeto armazenado em um array deve ser inicializado antes de ser utilizado. - 79 - Muitas das vezes é necessário manipular várias variáveis de um mesmo tipo. Seja para guardar todas as notas de um aluno ao longo de sua vida escolar ou todos os salários de cada funcionário de uma determinada empresa, é preciso uma quantidade enorme de variáveis para armazenar toda essa informação. Sem os vetores este processo de criação e manipulação de variáveis seria tedioso e sujeito a erros. Os arrays são estruturas de dados homogêneas baseadas em algum dos tipos fundamentais do Java (tipos primitivos e classes). Algumas das características mais importantes do array estão listadas a seguir: Só podem ser incluídos elementos de um mesmo tipo, que é determinado no momento da declaração do array. O tamanho do array é fixado no momento de sua criação e não pode mais ser alterado. Para acessar um dos elementos é necessário informar em que posição ele se encontra, ou seja, qual é o seu índice. Cada uma das posições (índices) do array só pode guardar um único dado. Os elementos de um array são inicializados automaticamente após a sua criação. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 79 - i580 – Java Programming Declaração de arrays • Declaração de arrays: tipo [] nome_do_array; tipo nome_do_array []; String [] args; float notas[]; double [] salario; String nome, documento[]; //só documento é array String [] time, titulo; // time e titulo são arrays O posicionamento do par de colchetes normalmente é logo após o tipo – String [ ] - 80 - Na declaração é criada uma variável que será uma referência para o array. A declaração é feita de duas formas: tipo [] nome_do_array; tipo nome_do_array []; Exemplos: String [] args; float notas[]; double [] salario; String nome, documento[], endereco; //(I) String[] time, titulo; // (II) Atenção nas duas últimas linhas do exemplo. Na linha (I) as variáveis nome e endereço não são arrays. Apenas a variável identificada pelo nome documento é um array. O que define isso é a posição dos colchetes. Na linha (II) time e titulo são arrays de strings, já que os colchetes estão próximos do tipo e valem para todas as variáveis declaradas nessa linha de comando. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 80 - i580 – Java Programming Criação de arrays • Uma vez declarados faz-se a criação do array em memória com o operador new seguido do tipo e do tamanho: //arrays tem o primeiro índice igual a zero. Na instrução //abaixo os elementos do vetor serão: notas[0]...notas[3] notas = new float[4]; salario = new double[1000]; int numeroTimes = 64; time = new String[numeroTimes]; int qualquer = umMetodo();//método umMetodo() retorna um int titulo = new String[qualquer]; float f[] = new float[4]; //declaração e criação feitas na mesma linha new refere-se à alocação de memória - 81 - Após a declaração de uma variável de referência para o array ele deve ser criado com a utilização do comando new. Todo array em Java começa com o índice 0. Pelos exemplos percebe-se que o tamanho deve ser um número inteiro, não necessariamente um número constante. Pode ser uma expressão calculada em tempo de execução. Preste atenção no exemplo a seguir. Ele mostra uma criação de array inválida. int numero; float notas[numero]; Aqui ocorrerá um erro de compilação porque numero não está inicializado, não sendo possível portanto, definir o tamanho do array. int numero = 4; float notas[numero]; O erro da instrução acima é que foram feitas ao mesmo tempo declaração e criação do array. A maneira correta seria: int numero = 4; float notas[]; notas = new float [numero]; ou, abreviadamente: int numero = 4; float notas[] = new float[numero]; TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 81 - i580 – Java Programming Inicialização de arrays • Para arrays de tipos primitivos essa fase não é obrigatória. • Para arrays de objetos é necessária a inicialização antes da utilização dos objetos. • Enquanto não forem inicializados seus valores serão null. • Duas maneiras de se inicializar: – Inicialização dos elementos individualmente. – Usar inicializadores de array. - 82 - O último passo antes do uso de um array é a sua inicialização. Se o array é composto por um dos tipos primitivos, a inicialização é opcional. O Java automaticamente inicializa os elementos com os valores default do tipo primitivo. - char  ‘\u0000’ byte, short, int, long  0 boolean  false float, double  0.0 Caso se queira inicializar os elementos de um array com outros valores que não os valores default, podem ser usadas duas formas. A primeira é através da atribuição individual: notas[0] notas[1] notas[2] notas[3] = = = = 10; 8.5; 4; 7; Outra forma é através de inicializadores de array. float[] notas = {10, 8.5f, 4, 7}; Com os inicializadores de array foram feitos os três passos (declaração, criação e inicialização) em uma linha apenas. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 82 - i580 – Java Programming demonstração Inicialização de arrays public class TestaArray{ public static void main(String args[]){ int numeros[] = new int[4]; System.out.println("numeros[2] = " + numeros[2]); float[] notas = {10, 8.5f, 4, 7}; System.out.println("\nnotas[2] = " + notas[2]); numeros[2] = 0 notas[2] = 4.0 String cores[] = new String[10]; System.out.println("\ncores[3] = " + cores[3]); cores[0] = new String("Amarelo"); cores[1] = "Verde"; for (int i = 2 ; i < cores.length; i++){ cores[i] = new String(); } for (int i = 0 ; i < cores.length; i++){ System.out.println("cores[" + i + "] = " + cores[i]); } } } cores[3] = null cores[0] = Amarelo cores[1] = Verde cores[2] = cores[3] = cores[4] = cores[5] = cores[6] = cores[7] = cores[8] = cores[9] = - 83 - No caso de um array composto por objetos a inicialização se torna obrigatória. Na verdade, o array não armazena os objetos em si, mas referências a esses objetos, de modo que, ao final da fase de criação do array, cada um dos elementos apontam para null. final int numeroTimes = 64; String[] time; time = new String[numeroTimes]; Ao final dessas instruções, temos que o array time possui 64 elementos cujo conteúdo é igual a null. Para começar a utilizá-lo deve-se inicializar cada um dos elementos: time[0] = new String(“Amarelo”); time[1] = new String(“Vermelho”); Ou inicializá-los de uma vez só: for (int i = 0; i < time.length; i++) { time[i] = new String(); } time[0] = “Amarelo”; time[1] = “Vermelho”; Todo array tem uma propriedade chamada length que retorna o número de elementos do array. Utilize sempre essa propriedade para evitar um erro comum em outras linguagens que é tentar acessar um elemento usando um índice inexistente. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 83 - i580 – Java Programming Matrizes • Matriz é um array bidimensional com o mesmo número de colunas para cada linha. public class TestaMatriz{ public static void main(String args[]){ String cores[][] = new String[10][2]; cores[0][0] = Vermelho cores[0][1] = #ff0000 cores[1][0] = Verde cores[0][0] = "Vermelho"; cores[1][1] = #00ff00 cores[0][1] = "#ff0000"; cores[2][0] = null cores[1][0] = "Verde"; cores[1][1] = "#00ff00"; cores[2][1] = null for (int i = 0 ; i < 10; i++){ cores[3][0] = null for (int j = 0 ; j < 2 ; j++){ System.out.println("cores[" + i + "]" cores[3][1] = null cores[4][0] = null + "[" + j + "] = " + cores[i][j]); cores[4][1] = null } } ... } } Dica: O primeiro nú número representa os “registros” registros” e o segundo nú número representa os “campos” ” campos - 84 - Arrays multidimensionais em Java são na realidade arrays de arrays. Valem as mesmas regras que foram explicadas para um array unidimensional. Cada elemento deve ser inicializado se ele for referência a objeto. Caso seja um tipo primitivo essa inicialização é opcional. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 84 - i580 – Java Programming Banco Money • Na inicialização do Banco Money devem ser criadas as contas em um array de contas e as taxas mensais de juros em um array de double. • As contas são inseridas no array de contas: ContaCorrente contas[] = new ContaCorrente[10]; • Os valores mensais de juros: double tabelaDeJuros[] = new double[12]; - 85 - O sistema do Banco Money possui uma classe Agência que contém as contas correntes e uma tabela de juros. No construtor (método de inicialização da classe) estes dois vetores são preenchidos: public class Agencia { private ContaCorrente contas[] = new ContaCorrente[10]; private double juros[] = new double[12]; public Agencia() { // Inicialização do vetor de contas contas[0] = new ContaCorrente(1, "Beethoven" , contas[1] = new ContaCorrente(2, "Arquimedes", contas[2] = new ContaCorrente(3, "Van Gogh" , contas[3] = new ContaCorrente(4, "Newton" , contas[4] = new ContaCorrente(5, "d´Arc" , contas[5] = new ContaCorrente(6, "Platão" , contas[6] = new ContaCorrente(7, "Minsk" , contas[7] = new ContaCorrente(8, "Blake" , contas[8] = new ContaCorrente(9, "Vader" , contas[9] = new ContaCorrente(10, "Poeta" , // Inicialização do vetor de juros juros[0] = 14.25; juros[1] = 12.85; juros[2] = 11.25; juros[3] = 10.35; juros[4] = 10.35; juros[5] = 9.05; } "décima" , 100.0); "eureka" , 200.0); "orelha" , 300.0); "cabeça" , 400.0); "água" , 500.0); "morcego", 600.0); "gentil" , 700.0); "normal" , 800.0); "luz" , 900.0); "raimundo", 10.0); } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 85 - i580 – Java Programming Laboratório • Exercícios Ímpares – devem ser digitados e testados como estão. Esses exemplos servirão como base. • Exercícios Pares – são os exercícios propostos que deverão ser elaborados a partir dos exemplos anteriores. • Os exercícios que não forem feitos em sala devem ser feitos em casa. Os enunciados estão no http://sae.infnet.edu.br - 86 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 86 - i580 – Java Programming O que já aprendemos?  UA 1 – Fundamentos.  UA 2 – Orientação a Objetos.  UA 3 – Tratamento de Erros.  UA 4 – Classes Úteis.  UA 5 – Desenho de Telas.  UA 6 – Estruturas de Dados. - 87 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 87 - i580 – Java Programming 2 – Orientação a Objetos Unidade de Aprendizado - 88 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 88 - i580 – Java Programming 2 – Orientação a Objetos Você aprenderá: • Fundamentos. • Herança. • Conceitos Avançados. - 89 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 89 - i580 – Java Programming 2.1 - Fundamentos Bloco de Construção do Aprendizado - 90 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 90 - i580 – Java Programming 2.1 - Fundamentos Você aprenderá: • • • • • • • • Classes. Objetos. Encapsulamento. Propriedades. Métodos. Sobrecarga de Métodos. Construtores. Referência this. - 91 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 91 - i580 – Java Programming Classes • Classe é a descrição de uma entidade existente no domínio do problema. • Possui dados e métodos que representam o estado e o comportamento da entidade. • Define a forma e a funcionalidade de futuros objetos - 92 - Classe é a descrição de alguma entidade ou tipo complexo existente no domínio do problema. Fazendo uma analogia com a construção civil, uma classe é o projeto de um edifício, ou seja, as instruções necessárias para construir um objeto. Uma classe pode representar o papel de uma pessoa em um sistema, um objeto, um fato, uma coisa, uma tela, um evento etc. Uma classe é projetada pelo analista de sistemas e implementada pelo programador. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 92 - i580 – Java Programming Classes • Conceito de Classe: – As plantas da casa representam a classe. – É a partir da classe que se constrói um objeto na memória. – É a definição da forma e funcionalidade de alguma coisa. • Responsabilidades da Classe: – É o que a classe “sabe” e o que ela “faz”. – O que a classe “sabe” são as propriedades ou seus atributos. – O que a classe “faz” são os seus métodos ou funções. - 93 - As plantas da casa, desenhadas pelo arquiteto, representam a idéia de uma classe. É a partir das plantas que se constrói a casa. É a partir da classe que se constrói um objeto na memória. A classe é o gabarito, a definição da forma e da funcionalidade. A forma é representada pelas propriedades e a funcionalidade pelos métodos. Quando uma classe é modelada, existe a preocupação de documentar as suas responsabilidades: o que a classe “sabe” (propriedades ou atributos) e o que a classe “faz” (métodos ou funções). As casas criadas têm propriedades parecidas (quantidade de cômodos, andares) mas cada uma tem características próprias, o endereço, por exemplo será diferente para cada uma. A fachada de uma é azul e outra colocou pastilhas verdes. As características em comum são da estrutura, fazendo a analogia com sistemas, a classe forma objetos com a mesma estrutura, mas cada um terá peculiaridades próprias. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 93 - i580 – Java Programming Classes • Tipos de Classes – Classes de Fronteira: • • • • Botões, Checkboxes, Acesso a outros sistemas. Webservices. – Classes de Negócio: • • • • Cliente, Pedido, Item de Pedido, Produto etc. – Classes de Controle: • • • • Data, Conexão com Banco de Dados, Gerenciador de Impressão, Leitura e Gravação de Arquivos. - 94 - Em um sistema computacional as classes podem assumir três tipos: Classes de interface: são as classes que formam uma tela gráfica ou um diálogo com o usuário. Botões, listas, checkboxes, scrollbars são exemplos de classes de tela. Classes de negócio: definem entidades do domínio de alguma atividade mercantil. Um sistema de controle de vendas tem como classes de negócio Cliente, Pedidos, Item de Pedido, Produto etc. Classes de controle: todas as classes de controle tem o papel de “gerenciadores” de alguma coisa externa a ela. Uma classe Data é uma classe de controle porque lida com um agente externo: o tempo. Em um sistema é possível encontrar diversas classes de controle, como por exemplo Conexão com Banco de Dados, Gerenciador de Impressão, Leitura e Gravação de Arquivos etc. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 94 - i580 – Java Programming Banco Money • O Banco Money possui um módulo online para que os clientes possam acessar suas contas correntes. • Uma das entidades deste exemplo é a conta corrente: ContaCorrente é uma classe de Entidade - 95 - A classe conta corrente pode ser implementada da seguinte maneira em Java. Repare que esta classe representa apenas a descrição de uma conta corrente. No exemplo abaixo ainda não existe nenhum objeto criado: public class ContaCorrente { private int número; private String titular; private double saldo; private String senha; public void sacar(double valor) { saldo -= valor; } public void depositar(double valor) { saldo += valor; } public double consultarSaldo() { return saldo; } } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 95 - i580 – Java Programming Objetos • Objeto é o conjunto de dados e métodos criado a partir da descrição feita pela classe. • Um objeto ocupa seu próprio lugar na memória e não interfere com outros objetos. • A criação de um objeto também é chamada de instanciação. - 96 - Objetos de software são semelhantes a objetos do mundo real, pois ambos possuem características e comportamento. Objetos de software são elementos concretos criados a partir de uma classe (descrição). Eles possuem uma identidade e um lugar na memória. Cada objeto possui sua própria cópia dos atributos e não interfere com os atributos de outros objetos. Objeto é sinônimo de instância e a operação de criar um objeto também é conhecida como instanciação. Continuando a analogia com a construção civil, a classe é o projeto do edifício, o objeto é o próprio edifício e a JVM é o mestre de obras, que constrói o edifício (objeto) a partir dos planos (classe). TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 96 - i580 – Java Programming Operador new • O operador new aloca espaço, cria um objeto da classe e retorna o seu endereço de memória (sua referência). ContaCorrente cc;//Declaração da variável cc do tipo ContaCorrente cc = new ContaCorrente();//A referência é atribuída a cc ContaCorrente cc = new ContaCorrente();//dois passo em uma linha As duas versões são equivalentes - 97 - Para trabalhar com um objeto, é necessário criá-lo. Esta criação envolve dois passos. O primeiro passo é a criação de uma variável: ContaCorrente cc; Para criar uma variável é necessário especificar o seu tipo seguido do seu nome. No exemplo acima, foi criada uma variável chamada cc do tipo ContaCorrente. Esta variável não é o objeto, é apenas uma referência para um futuro objeto. A criação do objeto propriamente dito é feita com a utilização do operador new: cc = new ContaCorrente(); Os dois passos podem ser feitos de uma só vez: ContaCorrente = new ContaCorrente(); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 97 - i580 – Java Programming Encapsulamento • Encapsulamento: – Manter dentro da classe seus métodos e propriedades. – Facilita a manutenção. • Ocultamento: – Esconder como os objetos funcionam internamente e o que eles sabem atrás de uma interface. – Através dos modificadores de visibilidade temos como obter o encapsulamento e o ocultamento. – Regra básica: variáveis de instância private e métodos de acesso public. - 98 - No código abaixo, todos os atributos foram declarados como private, ou seja, apenas a classe poderá alterá-los diretamente. Mas e se for necessário alterar ou recuperar os atributos desta classe? Devem ser criados métodos de acesso, ou seja, métodos que alterem ou recuperem o valor de determinado atributo (como o método consultarSaldo por exemplo). Esta abordagem torna a manutenção do código mais simples e eficiente. public class ContaCorrente { private int numero; private String titular; private double saldo; private String senha; public void sacar(double valor) { saldo -= valor; } public void depositar(double valor) { saldo += valor; } public double consultarSaldo() { return saldo; } } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 98 - i580 – Java Programming Encapsulamento – A Classe é um “módulo”, contendo dados (propriedades) e operações (métodos). – O objeto é referenciado como um módulo único. public class Data { ... } public class UsaData { public static void main(String [] args) { Data hoje = new Data(); ... Data ontem = new Data(); ... } } - 99 - O Encapsulamento é um dos recursos mais importantes da Orientação a Objetos. Através desse conceito concebemos uma Classe como um “módulo” contendo dados e operações em um único local. Sempre que precisamos lidar com um objeto, o referenciamos como um módulo único. O Encapsulamento é um conceito que significa “proteger” dados internos da classe, tornando-os disponíveis apenas através de métodos. Esse recurso é importante se desejarmos garantir que os dados internos da classe só serão alterados sob determinadas condições. Uma Conta-Corrente, por exemplo, só deve alterar o seu saldo dentro de limites pré-estabelecidos pelo banco. O Ocultamento de dados é implementado através da “Visibilidade” mais restrita - “protegida” ou “privada”. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 99 - i580 – Java Programming Encapsulamento public class Funcionario { protected int matricula; protected String nome; protected String departamento; ... public int getMatricula() { return matricula; } Propriedades Métodos public void setMatricula(int novaMatricula) { matricula = novaMatricula; } ... } - 100 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 100 - i580 – Java Programming Propriedade • As propriedades são os dados que guardam as características e o estado dos objetos criados a partir da classe. • É o que a classe “sabe”. Qual é o problema de declarar as propriedades como “public” public”? - 101 - As propriedades ou atributos são os dados que guardam as características e o estado dos objetos criados a partir da classe. É o que a classe “sabe”. Uma casa, como qualquer outra casa, tem uma aparência externa. A casa pode estar pintada de azul, amarelo, verde, etc. A classe pode ter uma propriedade que se refere a sua aparência externa, já que cada objeto tem uma informação diferente. Um outro exemplo é de um relógio digital. Os circuitos internos do relógio calculam o tempo ciclicamente e o exibe em um mostrador. Podemos dizer que o relógio tem as propriedades “hora” e “minuto” atualizadas ciclicamente. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 101 - i580 – Java Programming Propriedade • As propriedades guardam valores para atributos de uma classe de objetos. • Em geral, as propriedades são de tipos primitivos, porém podem ser de tipos complexos, dependendo do relacionamento entre as classes envolvidas. • Por exemplo, Fornecedor é uma classe que se relaciona com Produto e por esse motivo é possível que tenha uma propriedade que represente os produtos que ele fornece. - 102 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 102 - i580 – Java Programming Propriedades de Instância • Propriedades de Instância são aquelas declaradas dentro da definição da classe e que todo objeto da classe possui um próprio. • São “dinâmicas”. public class Empregado { private int idade; private boolean permiteEscrita; private String nome; ... } Observe que foi colocado “private” private” para proteger as propriedades - 103 - As variáveis de instância são inicializadas pelo Java se não fizermos uma inicialização específica. No caso de variáveis de tipos primitivos temos que os números são inicializados com zero, os lógicos com false e os caracteres com ‘\u0000’. No caso de referências para objetos, temos que elas são inicializados com um valor igual a null, que indica que a referência não aponta para nenhum objeto específico. Lembre-se de que null é uma palavra reservada e pode ser utilizada com o operador de igualdade para verificarmos se um objeto está inicializado ou não. if (emp == null) // inicializo o objeto? emp = new Empregado(); Não é necessário que façamos uma referência igual a null para liberar a memória. O sistema de coleta de lixo do Java controla isso para nós. Podemos atribuir uma referência a outra normalmente. Nesse caso, as duas passam a apontar para o mesmo objeto. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 103 - i580 – Java Programming Propriedades de Classe • Propriedades de classe são aquelas que são compartilhadas por todas as instâncias da classe. • São estáticas. public class Empregado { private int idade; private String nome; private static double ultimaMatricula = 8; } - 104 - Uma variável é de classe ao usarmos o modificador static na declaração da mesma. public class Empregado { private int idade; private String nome; private static double ultimaMatricula = 8; ... } As variáveis de classe são inicializadas no momento em que a classe é carregada pela JVM para uso na primeira vez. Não faça a inicialização dentro de um construtor visto que não é preciso que um objeto exista para que a variável de classe possa ser utilizada. Os valores de inicialização das variáveis de classe são idênticos aos das variáveis de instância, caso não seja fornecido um valor específico, como no caso do exemplo. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 104 - i580 – Java Programming Método • O termo método representa as funcionalidades inerentes à classe. • É o que a classe “faz”. public class Data { private int dia; private int mês; private int ano; public void mudaDia(int novoDia) { if(novoDia >= 1 && novoDia <=31) { dia = novoDia; } } ... } - 105 - O termo método representa as funcionalidades inerentes à classe. Esse termo é usado porque essas funcionalidades estão, na maioria das vezes, ligadas às propriedades da classe. É o que a classe “faz”. No exemplo do relógio, os números do mostrador têm uma lógica. Para alterar o mostrador não podemos simplesmente exibir um número qualquer. Existe um “método” para fazer isso. No caso da cor da casa também. Se nós desejamos representar uma alteração na cor da casa, devemos utilizar um método que “pinte” a casa e altere a sua cor. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 105 - i580 – Java Programming Métodos de Instância • Métodos de Instância são aqueles declarados dentro da definição da classe e que todo objeto possui individualmente. • São “dinâmicos”. public class Empregado {... public void defineIdade(int campo) { idade = campo; } public int retornaIdade() { return idade; } } - 106 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 106 - i580 – Java Programming Métodos de Classe • Método de Classe é o método que é compartilhado por todas as instâncias e dispensa a criação do objeto. • São estáticos. public class Empregado { ... public static void defineUltMatr(double valor) { ultimaMatricula = valor; } } Empregado.defineUltMatr(50); - 107 - Usamos métodos de classe para acessar variáveis de classe e para fazer bibliotecas de métodos que executem funções genéricas. Um exemplo é a classe Math que disponibiliza uma série de métodos de classe que executam funções matemáticas. Outro exemplo de método de classe é o método main(). Para chamarmos um método de classe devemos usar o nome da classe e a notação ponto como no exemplo abaixo: public class Empregado { private int idade; private String nome; private static double ultimaMatricula= 8; ... public static void defineUltMatr(double valor) { ultimaMatricula = valor; } } Empregado.defineUltMatr(50); Podemos ter sobrecarga de métodos de classe, do mesmo jeito que nos métodos de instância. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 107 - i580 – Java Programming Sintaxe dos Métodos • O programador vê os métodos sob dois aspectos: – Declaração: quando o programador deseja criar um método para implementar alguma operação. – Utilização: quando o programador conhece a sintaxe de um método e deseja usá-lo nos seus programas. • Lembre-se das bibliotecas de classes da UA 1. - 108 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 108 - i580 – Java Programming Métodos Set e Get • Utilizados para atribuir ou retornar os valores dos atributos da classe. • Garantem o formato de retorno e validam valores inseridos. • São “padrão” na programação orientada a objetos. public class ContaCorrente { private int numero; private String titular; public void setNumero(int valor){ numero = (valor<0)? 0 : valor; } public int getNumero(){ return numero; } public void setTitular(String valor){ ... } public String getTitular(){ ... } } - 109 - Existe uma convenção para nomear os métodos de acesso: métodos que retornam atributos começam com get (ou is para boolean) e métodos que alteram atributos começam com a palavra set. Esta nomenclatura é importante pois existem ferramentas e tecnologias que utilizam estes nomes para a execução de determinadas tarefas. Por exemplo, servlets se comunicam com páginas JSP usando get e set, atributos de tags são especificados com método set etc. A princípio a utilização destes métodos simples pode parecer perda de espaço e desempenho. Entretanto deve-se lembrar do objetivo principal da sua existência: oferecer acesso a atributos que estão protegidos de acesso externo. Ou seja, mantendo-se a premissa de que os atributos não podem ser acessados diretamente, os métodos de acesso são a única solução possível. Além disso, o uso de métodos de acesso traz conseqüências positivas: organização do código e facilidade de manutenção. Supondo que o banco já esteja funcionando e que uma alteração seja solicitada: o nome do titular deve ser recuperado sempre no formato “Sobrenome, nome”. Usando ocultamento esta alteração fica muito fácil pois existe a certeza de que o nome do titular é recuperado sempre a partir do método getTitular. Assim, basta inverter o nome dentro deste método que todas as outras classes que a utilizam passarão a funcionar de acordo com a nova regra. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 109 - i580 – Java Programming Sobrecarga de Métodos • Ocorre quando existe mais de um método com o mesmo nome em uma classe. • Para que isso seja possível os métodos devem ter assinaturas diferentes . • “Assinatura” - formada pelo nome do método, junto com o número e os tipos dos parâmetros. • O tipo de retorno não é considerado. - 110 - A Assinatura de um Método é formada pelo nome do método, junto com a quantidade e os tipos dos argumentos (parâmetros) do método (não é levado em consideração o tipo de retorno dos métodos). Existem muitas classes em Java que fazem uso da sobrecarga de métodos. O exemplo abaixo possui três métodos com o mesmo nome: public class Empregado { ... public void defineCampo(int valor){ idade = valor; } public void defineCampo(String valor){ nome = valor; } public int defineCampo(int valor1, String valor2){ idade = valor1; nome = valor2; } } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 110 - i580 – Java Programming Sobrecarga de métodos public void defineCampo(int valor){ idade = valor; } public void defineCampo(String valor){ nome = valor; } public int defineCampo(int valor1, String valor2){ idade = valor1; nome = valor2; } //Exemplo de chamada de método sobrecarregado ... emp.defineCampo(32); emp.defineCampo(“Maria”); emp.defineCampo(40, “Roberto”); ... emp.defineCampo(12f); // Erro!!!! - 111 - Na hora da chamada de um dos métodos, o compilador Java escolhe o método correto baseado nos parâmetros fornecidos. Se não encontra um método compatível com os argumentos, depois de tentar as conversões de tipo possíveis, ele acusa o erro. ... emp.defineCampo(32); emp.defineCampo(“Maria”); ... emp.defineCampo(12f); // Erro!!!! TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 111 - i580 – Java Programming Construtores • São métodos especiais que as classes possuem e que servem para executar inicializações. • Devem obrigatoriamente ter o mesmo nome que a classe a qual pertencem e não possuem tipo de retorno. • Usam o conceito de sobrecarga de método. • Toda classe Java tem pelo menos um construtor (construtor default). Basta criar um construtor qualquer para que o construtor default que Java atribui à classe deixe de existir - 112 - Quando um objeto é criado, as variáveis de instâncias são inicializadas pelo Java, caso não seja fornecida uma inicialização explícita como no exemplo abaixo: public class Empregado { private int idade = 10; private String nome = null; ... } Isso resolve o problema no caso de uma inicialização simples. Mas e no caso de uma inicialização mais elaborada, mais complexa, onde é necessário chamar funções, executar cálculos complexos, realizar um conjunto de tarefas? Nesta situação são usados métodos especiais chamados de construtores. Toda classe Java possui um construtor. Se por acaso um construtor não for definido explicitamente, será criado um construtor sem parâmetros, denominado construtor padrão ou default. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 112 - i580 – Java Programming Construtores public class ContaCorrente { public ContaCorrente(int novoNúmero, String novoTitular) { número = novoNúmero; titular = novoTitular; senha = ""; saldo = 0.0; } public ContaCorrente(int novoNúmero, String novoTitular, double novoSaldo) { número = novoNúmero; titular = novoTitular; saldo = novoSaldo; senha = ""; } } Os construtores de ContaCorrente se diferenciam pelos parâmetros - 113 - Geralmente os construtores são declarados com visibilidade pública, pois a criação de objetos normalmente é realizada fora da classe. Entretanto, outros modificadores podem ser utilizados conforme a necessidade. No exemplo acima, existem dois construtores para a classe, um com dois argumentos e um com três argumentos. Foi usada a sobrecarga de métodos para facilitar a programação. Cada construtor define uma maneira diferente de se construir um objeto. Assim, a partir do exemplo acima, existem duas maneiras de construir objetos da classe ContaCorrente: ContaCorrente cc1 = new ContaCorrente(1, “Matheus Bodoque”); ContaCorrente cc2 = new ContaCorrente(2, “Marialva Edilena”, 200.0); Como foram criados construtores para a classe, o construtor padrão não será criado automaticamente. Portanto o comando abaixo causará um erro de compilação: ContaCorrente cc3 = new ContaCorrente(); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 113 - i580 – Java Programming Referência this • Palavra implícita de todos os métodos de instância. • Refere-se ao objeto atual sobre o qual o método foi chamado. • Obrigatório quando: – o nome da variável for igual ao nome de um argumento formal passado pelo método de instância. – for necessário passar uma referência ao objeto atual como parâmetro para outro método. • Também é usado para chamar um construtor da própria classe. - 114 - Todos os métodos de instância possuem uma palavra implícita chamada this, e que pode ser usado dentro de qualquer método. Ele se refere ao objeto atual sobre o qual o método foi chamado. Ele será necessário nos casos abaixo: Quando o nome da variável de instância é igual ao nome de um argumento formal passado pelo método de instância, como no exemplo: public ContaCorrente(int número, String titular, String senha, double saldo) { this.número = número; this.titular = titular; this.saldo = saldo; this.senha = senha; } Nesse caso, a referência this foi usada para a distinção entre a variável de instância e o parâmetro formal. Quando for necessário passar uma referência ao objeto atual como parâmetro para outro método. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 114 - i580 – Java Programming Chamando Outros Construtores • Para chamar outro construtor da mesma classe deve-se usar a palavra this. • Esta operação só é válida dentro de construtores, ou seja, não é possível chamar um construtor de dentro de outro método. • A chamada ao construtor deve ser o primeiro comando. - 115 - Código comum pode ser compartilhado entre os construtores de uma classe através da sintaxe this(), como mostrado a seguir: public ContaCorrente(int número, String titular, String senha, double saldo) { this.número = número; this.titular = titular; this.saldo = saldo; this.senha = senha; } public ContaCorrente(int número, String titular) { this(número, titular, "", 0.0); } Aqui, o segundo construtor executa o código que está no primeiro construtor. Essa construção evita que código seja duplicado desnecessariamente entre os construtores e assegura que, qualquer alteração que seja feita no primeiro construtor, seja automaticamente realizada nos construtores que a chamam. O detalhe que deve ser observado é que a chamada a this() deve ser feita obrigatoriamente na primeira linha do construtor e que os argumentos que porventura sejam passados correspondam aos argumentos de um construtor existente na classe. Além disso, só é possível usar o this desta forma dentro de construtores. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 115 - i580 – Java Programming Laboratório • Empresa CultBook - site de comércio de livros. • Objetivos Básicos: – Construir a estrutura do sistema através dos pacotes controller.console, model e view.console. – Implementar as classes Cliente e Endereco no pacote model de acordo com o diagrama de classes de negócio. • Crie os métodos Get e Set. • Crie os construtores (se precisar, crie sobrecargas). – Implementar um classe de testes que crie objetos das classes de negócio, inicialize-os e mostre seus dados. - 116 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 116 - i580 – Java Programming 2.2 – Herança Bloco de Construção do Aprendizado - 117 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 117 - i580 – Java Programming 2.2 - Herança Você aprenderá: • • • • • Classe Object. Herança. Referência super. Anotações. Sobrescrita de métodos. - 118 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 118 - i580 – Java Programming A classe Object • A classe Object é a superclasse de todas as classes do Java e é definida em java.lang. • Esta herança é implícita, não precisa ser especificada no código. • Toda classe herda os métodos definidos pela classe Object. • O método toString, por exemplo, é chamado sempre que uma conversão para String for necessária. - 119 - A herança em Java é especificada pela palavra reservada extends. Se ela não for usada, a superclasse é implicitamente Object definida em java.lang. Isto é feito porque a classe Object fornece uma série de métodos e atributos que asseguram o bom funcionamento de todo e qualquer objeto criado dentro da linguagem, já que todas as classes são derivadas da mesma. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 119 - i580 – Java Programming Herança • É a possibilidade de se criar classes a partir de outras já existentes. • As classes derivadas contêm todos os atributos e métodos da classe base. • Para criar uma classe a partir de outra usa-se a palavra reservada extends class SuperClasse {} class SubClasse extends SuperClasse {} - 120 - A herança é uma das razões do surgimento e uma das principais vantagens da orientação a objetos. Ela torna possível a reutilização de código de maneira eficiente e possibilita a diminuição do tempo de criação e de manutenção de programas complexos. Por meio da herança é possível criar hierarquias de classes. A linguagem Java possui algumas classes genéricas como ponto de partida para a criação de classes mais específicas e com maior funcionalidade. Esse esquema é chamado de hierarquia de classes ou árvore de derivação. A classe ContaEspecial herda todas as características (métodos e atributos) da classe ContaCorrente. Por sua vez, as classe Professor e Aluno herdam todas as características da classe Pessoa. Assim, uma ContaEspecial é uma ContaCorrente da mesma forma que Professor e Aluno são Pessoas. Construtores não são herdados e não existe herança múltipla em Java. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 120 - i580 – Java Programming Banco Money • O Banco Money precisa controlar dois tipos de contas: Conta Corrente e Conta Especial • A Conta Especial é uma Conta Corrente mas possui um limite adicional. - 121 - A nova classe (ContaEspecial) possui um atributo a mais denominado limite. Este atributo indica o valor que a conta pode ficar negativa e tem impacto sobre a operação de saque. Abaixo os trechos relevantes de ambas as classes: public class ContaCorrente { private int número; private String titular; private double saldo; private String senha; private static double CPMF = 0.38; } public class ContaEspecial extends ContaCorrente { private double limite; } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 121 - i580 – Java Programming Criação de Objetos • Um objeto criado a partir de uma subclasse possuirá todos os atributos tanto da subclasse quanto da superclasse. • Portanto, a criação do objeto ce: ContaEspecial ce = new ContaEspecial(); • Ficaria assim na memória: - 122 - Considerando-se a hierarquia ContaCorrente-ContaEspecial, a criação de um objeto da classe ContaEspecial é feita da seguinte forma: ContaEspecial ce = new ContaEspecial(); Este comando cria um objeto em memória que contém todos os atributos e métodos de ContaEspecial, ContaCorrente e Object. É claro que todos os métodos de ContaCorrente e Object também estarão disponíveis para este objeto. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 122 - i580 – Java Programming Hierarquia de Construtores • O comando: ContaEspecial ce = new ContaEspecial(); • Chama o construtor padrão da classe. • O construtor da classe por sua vez, chama o construtor padrão da superclasse e assim sucessivamente até alcançar o construtor padrão da classe Object. - 123 - Quando um objeto de uma classe derivada é criada, uma série de passos são tomados pelo ambiente de execução Java. A primeira coisa que se deve saber é que nenhum construtor é herdado. Ou seja, a classe possui apenas os construtores que definidos explicitamente ou, caso contrário, o construtor padrão fornecido pela linguagem, que não faz nada e não recebe argumentos. Então, no caso do exemplo, a classe ContaEspecial possui apenas o construtor padrão e pode ser usada para criar um objeto da seguinte forma: ContaEspecial ce = new ContaEspecial(); Ao executar a instrução o Java faz o seguinte: É chamado para execução o construtor sem argumentos que não faz nada (construtor padrão) da classe pai. E isso vai sendo feito até que seja alcançada a classe Object, que também terá seu construtor executado. É chamado o construtor que está definido na instrução e que irá inicializar os atributos específicos da classe e modificar, se essa for intenção, aqueles atributos que foram herdados. Logo, no exemplo acima, antes de ser executado o construtor ContaEspecial(), são executados os construtores, na seguinte ordem: Object(), ContaCorrente() e ContaEspecial(). Caso não exista algum dos construtores, um erro é gerado em tempo de compilação. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 123 - i580 – Java Programming Hierarquia de Construtores - 124 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 124 - i580 – Java Programming Hierarquia de Construtores Esse comportamento é automático na linguagem Java - 125 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 125 - i580 – Java Programming Referência super • Usada para referenciar a superclasse. • super() se refere, dentro de um construtor, ao construtor existente na superclasse. • Deve ser a primeira linha do construtor. • Se não houver uma instrução super() ou this() explícita em um construtor, Java coloca uma chamada super() implícita. - 126 - A palavra reservada super pode ser utilizada quando a classe possuir uma superclasse. O primeiro uso é para realizar a chamada ao construtor da superclasse. Neste caso ela deve ser a primeira linha do construtor e receber os parâmetros de acordo com os parâmetros especificados em algum construtor da superclasse. Se não for chamado nenhum construtor da superclasse então o construtor é chamado a partir da chamada a super(). Se este construtor não existir na superclasse, um erro de compilação será gerado. O exemplo abaixo mostra a chamada correta de um construtor da superclasse ContaCorrente a partir do construtor da classe ContaEspecial: public class ContaEspecial extends ContaCorrente { private double limite; public ContaEspecial(int número, String titular, String senha, double saldo, double limite) super(número, titular, senha, saldo); this.limite = limite; } { } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 126 - i580 – Java Programming Sobrescrita de Métodos • Consiste em definir, em alguma subclasse, um método com a mesma assinatura (mesmo nome e mesmos argumentos) e mesmo tipo de retorno de uma superclasse. • Se for necessário chamar o método sobrescrito da superclasse pode ser usada a palavra super: super.método(); • A partir da versão 5 sugere-se a utilização da anotação @Override antes do método sobrescrito. - 127 - A subclasse herda os métodos e atributos de sua superclasse. Se for necessário usar um método a partir de um objeto criado, basta chamá-lo normalmente. Portanto, depois da criação do objeto ce: ContaEspecial ce = new ContaEspecial(); Os métodos depositar e consultarSaldo podem ser chamados diretamente: ce.depositar(750); System.out.println(ce.consultarSaldo()); Esses métodos têm seu funcionamento igual ao da superclasse. Entretanto, se houver necessidade de um funcionamento diferente ao do oferecido pelo método da superclasse o método deverá ser reescrito na subclasse. Para reescrever um método para criá-lo na subclasse com a mesma assinatura e mesmo tipo de retorno. A partir da versão 5 do Java, deve-se colocar a anotação @Override antes da definição do método. Para chamar o método da superclasse dentro do método reescrito deve-se usar a palavra reservada super sucedida do nome do método original. Um método muito interessante de se reescrever é o toString. Este método pode retornar uma representação em String do referido objeto em formato próprio, XML, HTML, etc. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 127 - i580 – Java Programming Banco Money • O método sacar deve ser reescrito na classe ContaEspecial, pois o limite deve ser considerado na verificação do saldo: - 128 - A classe ContaEspecial herda os membros de ContaCorrente mas existe um método da superclasse que deve ser reescrito: sacar. O saque em uma ContaEspecial é diferente pois o correntista pode sacar mais dinheiro do que tem. Portanto, este método deve ser reescrito na subclasse: public class ContaEspecial extends ContaCorrente { private double limite; @Override public void sacar(double valor) { if (valor <= limite + getSaldo()) super.sacar(valor); } ... } Repare que o método possui a mesma assinatura e retorno do método definido na superclasse ContaCorrente. Em sua implementação é utilizado o atributo limite diretamente mas o atributo saldo é acessado a partir de seu método getSaldo. Isto é necessário pois o atributo saldo é definido na superclasse como private. Caso a condição seja verdadeira, o método sacar da superclasse é chamado. Ou seja, foi reaproveitado o código existente na superclasse ContaCorrente. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 128 - i580 – Java Programming Exercício • Criar classes de entidade para o diagrama abaixo: • Criar uma classe de teste FolhaPagamento que instancie um funcionário e um vendedor e execute o método calcularSalario. - 129 - Instruções: 1. A matrícula, nome, cargo e salário são propriedades inicializadas por um construtor da classe Funcionario. 2. calcularSalario é um método que exibe informações (System.out.println(...)), conforme o exemplo abaixo: • Matrícula – Nome – Cargo. • Salário Bruto (propriedade salário). • Salário Líquido (descontar o IRPF, conforme a regra). 3. A classe Vendedor deve sobrescrever calcularSalario de forma a considerar a comissão. 4. A classe Vendedor deve ter um construtor que inicialize a comissão e o total de vendas do mês. Regra fictícia (simplificada) do IRPF (Imposto de Renda de Pessoa Física): Salário até R$1.000,00 = insento. De R$1.000,00 a R$3.000,00 = 15% de imposto. Acima de R$3.000,00 = 20% de imposto. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 129 - i580 – Java Programming 2.3 – Conceitos Avançados Bloco de Construção do Aprendizado - 130 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 130 - i580 – Java Programming 2.3 - Conceitos Avançados Você aprenderá: • • • • • Polimorfismo. Operador instanceof. Modificador final. Classes Abstratas. Interfaces. - 131 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 131 - i580 – Java Programming Polimorfismo • Polimorfismo é a capacidade de decidir em tempo de execução qual método deve ser chamado. • Para que o polimorfismo seja possível são necessários: – Uma hierarquia de classes onde existam métodos sobrescritos = Herança. – A possibilidade de se criar um objeto de uma subclasse e colocá-lo em uma referência de uma superclasse. • Facilita o desenvolvimento de sistemas pois evita a necessidade de se sabe em tempo de compilação qual objeto deve ser chamado. - 132 - Polimorfismo é uma característica da orientação a objetos na qual a chamada a um método pode executar métodos diferentes em momentos diferentes. A existência de uma hierarquia de classes onde existam métodos sobrescritos é imprescindível para o polimorfismo. Além disso a linguagem deve permitir que um objeto de uma subclasse possa ser atribuído a uma referência de uma superclasse. Assim, dada a hierarquia de pessoa, aluno e professor vista anterioremente, é possível criar objetos da seguinte maneira: Pessoa pessoa1 = new Aluno(); Pessoa pessoa2 = new Professor(); Isto é possível pois aluno é uma pessoa e professor também é uma pessoa. O polimorfismo ocorre quando é feita uma chamada a um método sobrescrito a partir de uma referência a uma superclasse. Assim, supondo que as classes Pessoa, Aluno e Professor possuam o método mostrar, as chamadas abaixo são possíveis: pessoa1.mostrar(); pessoa2.mostrar(); Nestes casos os métodos chamados são os métodos dos respectivos objetos criados anteriormente. Na primeira linha é chamado o método mostrar da classe Aluno e na segunda, da classe Professor. O método mostrar da classe Pessoa não é chamado neste exemplo. Ele serviu apenas para o compilador aceitar o código como válido. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 132 - i580 – Java Programming Polimorfismo • Sobrecarga e sobrescrita são exemplos de usos do polimorfismo. • O Polimorfismo pode ser verificado também em classes diferentes, que não têm nada a ver uma com a outra. • O Polimorfismo “para valer” é o obtido a partir da sobrescrita de métodos. • Vamos ver um exemplo de uso do Polimorfismo através do método “toString”. - 133 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 133 - i580 – Java Programming Sobrescrevemos o método “toString” toString”herdado de Object nas duas classes - 134 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 134 - i580 – Java Programming Polimorfismo O mé método “toString” toString” existe nos três objetos por heranç herança, mas na hora de executar cada objeto roda o seu, independente do tipo da referência - 135 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 135 - i580 – Java Programming Banco Money • A classe Agência contém todas as contas de uma determinada agência. • Ela tem os métodos: – inserirConta que recebe uma conta como parâmetro – calcularTotal que calcula o valor total de dinheiro que deve ser disponibilizado para os clientes - 136 - A classe Agencia é uma “fábrica” de objetos do tipo ContaCorrente mas deve armazenar objetos de qualquer subclasse desta. O método inserirConta insere uma conta na posição adequada: public void inserirConta (ContaCorrente conta) { contas[qtde++] = conta; } O método calcularTotal varre todo o vetor de contas e retorna o valor total de dinheiro que deve ser disponibilizado caso todos os clientes do banco resolvam retirar seus saldos ao mesmo tempo: public double calcularTotal() { double total = 0; for (int i = 0; i < qtde; i++) total += contas[i].consultarSaldo(); return total; } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 136 - i580 – Java Programming Polimorfismo • Passagem de Parâmetros: método inserirConta recebe uma conta (ContaCorrente) como parâmetro. • A passagem de uma ContaEspecial como parâmetro é aceita: - 137 - O método inserirConta insere uma conta dentro do vetor e pode ser usado para inserir objetos tanto de ContaCorrente quanto de ContaEspecial: ContaCorrente cc = new ContaCorrente(1,“Jó", “123", 100); ContaEspecial ce = new ContaEspecial(2,“Bó", “1",10, 500); inserirConta(cc); inserirConta(ce); A extensibilidade do sistema é facilitada pois qualquer classe nova pode ser criada dentro da hierarquia sem que o método inserirConta precise ser alterado. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 137 - i580 – Java Programming Polimorfismo • Vetor de referência: o método calcularTotal deve passar por todas as contas da agência e recuperar o saldo de cada uma. • Exemplo (vetor contendo duas contas: uma ContaCorrente e uma ContaEspecial): - 138 - O vetor de contas correntes é do tipo ContaCorrente mas pode receber objetos de qualquer subclasse. Na chamada a algum método de um item do vetor, o método do objeto correto é invocado: public double calcularTotal() { double total = 0; for (int i = 0; i < qtde; i++) total += contas[i].consultarSaldo(); return total; } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 138 - i580 – Java Programming Operador instanceof • Retorna um valor lógico indicando se o objeto é uma instância de uma determinada classe. if (contas[i] instanceof ContaEspecial) { ContaEspecial ce = (ContaEspecial) contas[i]; total += ce.getLimite(); } - 139 - O operador instanceof serve para verificar se um objeto pertence a uma determinada instância. É usado principalmente em situações nas quais é necessário chamar um método específico de um objeto de uma subclasse. No exemplo do Banco Money, a classe Agência possui um vetor de contas correntes. Se for necessário verificar se alguma destas contas é uma ContaEspecial, o operador é usado. Em seguida é feito um type cast e o método específico (getLimite) é chamado. Desta forma evitam-se erros em tempo de execução por problemas de type cast. if (contas[i] instanceof ContaEspecial) { ContaEspecial ce = (ContaEspecial) contas[i]; total += ce.getLimite(); } A chamada ao método também poderia ter sido feita em apenas uma linha: total += ((ContaEspecial)contas[i]).getLimite(); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 139 - i580 – Java Programming Modificador final • Uma propriedade final é uma constante. • Um método final não pode ser sobrescrito. • Uma classe final não pode ter subclasses. public double final PI = 3.1415f; public final boolean verificarSenha(String senha) { ... } public final class String { ... } - 140 - O modificador final pode ser utilizado tanto com variáveis quanto com métodos e classes. Uma variável marcada com a palavra reservada final não permite que o seu valor seja alterado após a primeira atribuição. Ou seja, a variável passa a ser uma constante. public final double PI = 3.1415f; Variáveis do tipo final devem ser inicializadas na declaração ou em algum construtor. Um método marcado como final significa que ele não pode ser sobrescrito por nenhuma classe filha. Com isso, é garantida a otimização na execução (já que a JVM não precisará resolver o método em tempo de execução) e segurança. public final boolean verificaSenha(String senha) { ... } Uma classe marcada como final não pode ter nenhuma filha, não pode ser estendida (é folha na árvore de derivação). Faça isso com critério, sempre com base no seu projeto. public final class String { ... } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 140 - i580 – Java Programming Classes Abstratas • É uma classe da qual não se pode criar objetos. • Para indicar que uma classe é abstrata, deve ser usada a palavra reservada abstract. - 141 - Em certas situações podem surgir durante a análise e projeto de um sistema, superclasses que contém características de várias subclasses mas que não devem ser instanciadas, seja porque estão incompletas, seja porque esta instanciação não faz sentido naquele contexto. Por exemplo, considerando-se a hierarquia Pessoa, Professor e Aluno de uma universidade vista anteriormente. Não faz sentido para este sistema a instanciação de um objeto da classe Pessoa. Apenas alunos e professores tem significado completo para o sistema da universidade. Assim, a classe Pessoa pode ser declarada como abstrata: public abstract class Pessoa { private String nome; public String getNome() { return nome; } ... } Uma classe abstrata pode ter métodos implementados, como é o caso da classe acima. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 141 - i580 – Java Programming Classes Abstratas • Deseja-se impedir a criação de instâncias da classe Funcionario sem perder as vantagens da programação Orientada a Objetos. • A classe Funcionario é declarada como abstrata. - 142 - A classe Funcionario existe com o único, mas não menos importante, propósito de modelar perfeitamente o nosso problema, para que sejam aproveitadas de forma completa, todas as vantagens oferecidas pelo paradigma de programação orientada a objetos.Assim, a classe Funcionario é uma candidata forte a se tornar uma classe abstrata. Uma classe ou um método é considerado abstrato através da utilização da palavra chave abstract: public abstract class Funcionario { String matricula; String nome; String cargo; Date dataAdmissao; Date dataDemissao; } As subclasses de Funcionario não precisam ter suas definições alteradas. Funcionario f = new Funcionario(); Agora a instrução acima retorna um erro em tempo de compilação já que não se pode instanciar objetos de classes abstratas. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 142 - i580 – Java Programming Métodos Abstratos • É um método existente em uma classe abstrata que não possui implementação. • Deve ser obrigatoriamente implementado pelas classes filhas concretas. • A existência de um método abstrato obriga que a classe seja abstrata. - 143 - O método abstrato não possui corpo, só o cabeçalho (também conhecido por assinatura do método). No lugar das chaves deve ser colocado um ponto e vírgula indicando que a declaração do método abstrato está terminada. Qualquer subclasse não-abstrata criada a partir da classe Funcionário deve implementar o seu método abstrato calcularSalario. Se houver alguma subclasse que não faça esta implementação, ela também deve ser declarada como abstrata. A nova definição da classe Funcionario possui métodos não-abstratos (demitir) e um método abstrato (calcularSalario): public abstract class Funcionario { ... public void demitir() { ... } public abstract double calcularSalario(); } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 143 - i580 – Java Programming Criação de Interfaces • É similar a uma classe abstrata, com a diferença que não possui nenhum método concreto ou variáveis de instâncias. Possui apenas métodos abstratos. • Visa a padronização de grupos de classes que possam ser “reconhecidas” por funcionalidades comuns. public interface Despertador { public void ajustaHora(...); public void ajustaDespertador(...); public void paraDespertador(); } - 144 - A interface descreve um aspecto do comportamento que várias classes podem precisar possuir. A linguagem Java possui várias interfaces e que estarão sendo utilizadas com mais detalhes daqui para a frente. Usamos a palavra reservada interface ao invés de classe. A interface é semelhante mas não é uma classe. Também não precisamos colocar para os métodos public abstract porque, por estarem declarados em uma interface, eles já são considerados como tal. Mesmo caso para as variáveis que são public static final. Podemos colocar esses modificadores em ambos os casos, mas não faria a menor diferença. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 144 - i580 – Java Programming Implementação de Interfaces • Uma classe pode implementar quantas interfaces precisar além de estender uma classe. • Para isso forneça a lista de nomes de interface separados por vírgulas depois da palavra-chave implements public class Celular extends Telefone implements Despertador { ... public void acertarHora(...) { ... } public void acertarDespertador(...) { ... } public void pararDespertador() { ... } } - 145 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 145 - i580 – Java Programming instanceof para Interfaces • Podemos usar o operador instanceof para saber se uma classe implementa uma determinada interface. Nokia6600 nokia = new Nokia6600(); ... if(nokia instanceof Telefone) ... //true ou false? if(nokia instanceof Celular) ... //true ou false? if(nokia instanceof Despertador) ... //true ou false? - 146 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 146 - i580 – Java Programming Polimorfismo com Interfaces Nokia6600 nokia = new Nokia6600(); Casio123 casio = new Casio123(); BrastempAx microondas = new BrastempAx(); ... this.desligarDespertador(nokia); this.desligarDespertador(casio); this.desligarDespertador(microondas); ... public void desligarDespertador(Despertador d) { d.pararDespertador(); } - 147 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 147 - i580 – Java Programming Polimorfismo com Interfaces Despertador [] aparelhos = new Despertador[3]; ... Nokia6600 nokia = new Nokia6600(); Casio123 casio = new Casio123(); BrastempAx microondas = new BrastempAx(); ... aparelhos[0] = nokia; aparelhos[1] = casio; aparelhos[2] = microondas; Que métodos podemos usar nos objetos do array? - 148 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 148 - i580 – Java Programming Exercício • Altere o exercício anterior de forma a implementar o seguinte diagrama: - 149 - Instruções: 1. Crie a classe Mensalista como subclasse de Funcionario. 2. Copie o método calcularSalario de Funcionario para Mensalista. 3. Altere o método calcularSalario de Funcionario de forma a torná-lo abstrato. Você verá que será necessário tornar a classe abstrata também. 4. Altere a classe Vendedor de forma a torná-lo subclasse de Mensalista. 5. Crie um método estático rodaFolha em FolhaPagamento que receba um array de Funcionario. 6. No método main, crie um array de Funcionario com 2 exemplos: um Mensalista e um Vendedor. Chame o rodaFolha com esse array e veja o que ocorre. 7. Crie a classe Horista com a lógica de um funcionário que trabalhou X horas neste mês. 8. Altere FolhaPagamento para testar a classe Horista, incluindo um horista no array de funcionários. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 149 - i580 – Java Programming O que já aprendemos?  UA 1 – Fundamentos.  UA 2 – Orientação a Objetos.  UA 3 – Tratamento de Erros.  UA 4 – Classes Úteis.  UA 5 – Desenho de Telas.  UA 6 – Estruturas de Dados. - 150 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 150 - i580 – Java Programming 3 – Tratamento de Erros Unidade de Aprendizado - 151 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 151 - i580 – Java Programming 3 – Tratamento de Erros Você aprenderá: • Exceções. - 152 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 152 - i580 – Java Programming 3.1 – Exceções Bloco de Construção do Aprendizado - 153 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 153 - i580 – Java Programming 3.1 – Exceções • • • • • Você aprenderá: O que é Exceção? Hierarquia de Exceções. Instruções de Tratamento de Erros. Lançamento de Exceções. Criação de Exceções. - 154 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 154 - i580 – Java Programming O que é Exceção? • É um evento que indica uma condição anormal que ocorreu dentro de um método. • Vantagens do tratamento de exceções em Java – Não é possível ignorar a exceção: o tratamento é obrigatório. – Separa o código de tratamento de erro da lógica do programa. - 155 - A exceção é um evento que ocorre durante a execução do nosso programa que indica que algo de anormal aconteceu. Devemos tratar as exceções para que o nosso programa transmita confiabilidade para o usuário final. Em Java, erro e exceção são coisas distintas (tem relação, mas são distintas, tecnicamente falando). Um erro é na verdade um tipo de exceção. As vantagens do tratamento de exceções implementadas no Java são enormes. Primeiro, uma vez ocorrida uma exceção, o seu tratamento deve ser feito de forma obrigatória, o que não é garantido nas linguagens tradicionais. A exceção é enviada diretamente para o manipulador de erro apropriado, sem que precisemos nos preocupar com pilha de chamadas, etc. Segundo, diferentemente do que ocorre na programação estruturada, o código de tratamento de exceção fica separado da lógica implementada pelo seu programa. Evita-se com isso duas coisas: aquele monte de variáveis representando condições de erro que devem ser tratados e a difícil manutenção, já que o código está todo misturado. Se um erro não foi previsto e acontece, o seu tratamento nas linguagens tradicionais faz com que tenhamos que alterar várias linhas de código. Em Java, o que precisamos fazer é acrescentar o código necessário para o tratamento, sem ter alterar o que já estava escrito e funcionando. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 155 - i580 – Java Programming O que é Exceção? • Quando acontece um evento anormal é criado um objeto representando a exceção. • Métodos que podem lançar exceções são definidos com a palavra-chave throws. • Um método lança(throw) uma exceção conforme uma condição testada. • Qualquer código que possa dar erro é colocado dentro de um bloco try. • Um manipulador captura (catch) a exceção e dá o tratamento necessário. - 156 - Quando ocorre uma exceção dentro de um programa feito em Java, automaticamente é gerado um objeto do tipo da exceção ocorrida (lembre-se de que tudo em Java, exceto os tipos primitivos, são objetos). Esse objeto contém algumas informações básicas como tipo, ponto onde a exceção ocorreu, onde será capturada, descrição do erro e outras informações. Esse objeto é passado para o sistema de runtime da JVM que vai procurar em todos os métodos da pilha de chamadas em questão algum que trate a exceção. Encontrando um método que trate a exceção ocorrida, a JVM passa a exceção ao manipulador, que dá o tratamento adequado. A esse processo é dado o nome de captura da exceção. E se não houver ninguém que trate a exceção? Simplesmente o programa aborta e a máquina virtual mostra uma mensagem informativa padrão para a exceção ocorrida. O interpretador Java não trava. De fato o interpretador captura qualquer exceção não tratada pelo programa. Em outras linguagens, travamento do programa pode significar travamento do sistema operacional. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 156 - i580 – Java Programming O que é Exceção? class Alfa main try { Beta b = new Beta(); b.metodo1(); } catch(MinhaExcecao e) { } try e catch fazem o tratamento da excecao class Beta metodo1 throws MinhaExcecao Gama g = new Gama(); g.metodo2(); class Gama Essa e a instrucao para propagar metodo2 throws MinhaExcecao if(condição) { throw new MinhaExcecao(); } Aqui a excecao e disparada try e catch sao instrucoes normalmente usadas na classe que faz interface com o usuario. Tratar ou Propagar a Exceção? - 157 - Propagar a exceção significa colocar a declaração throws no cabeçalho do método indicando que exceção deve ser propagada. Propagar envolve “deixar passar” a exceção. Às vezes o método precisa propagar a exceção porque ele não é o responsável pelo problema ocorrido. Tratar a exceção significa colocar try...catch no código de forma a “proteger” os métodos que possam vir a disparar exceções. Geralmente o tratamento é feito na classe mais próxima da interface com o usuário. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 157 - i580 – Java Programming Hierarquia de Exceções - 158 - Todas as condições de erro são derivadas da classe Throwable. Não devemos usá-la em nossos programas, mas sim a hierarquia de classes de Exception quando estivermos definindo ou capturando exceções. É nesta classe que estão definidos os métodos getMessage(), que retorna uma mensagem descrevendo detalhes do problema ocorrido, e printStackTrace(), que exibe a pilha de execução indicando onde aconteceu o problema. A classe Error indica todos erros que são irrecuperáveis e que, provavelmente, abortarão a execução do programa. Esses erros podem ser de linkagem do programa (LinkageError), erro na máquina virtual (VirtualMachineError), etc. Não devemos nos preocupar com esses erros em nossos programas, já que não poderemos dar um tratamento adequado. Estes devem ser percebidos durante o processo de testes. A classe Exception é dividida em dois grandes grupos: O primeiro engloba todas as classes que estão na hierarquia de RuntimeException e são conhecidos por Unchecked Exceptions. Essas exceções indicam problemas relacionados a erros de programação. Não devemos fazer o tratamento dessas exceções, pois o ideal é acertar o código do programa. São exemplos de exceções desse tipo a ArithmeticException, a IllegalArgumentException, NullPointerException, IndexOutOfBoundsException e muitas outras. O segundo grupo engloba todas as classes que não são subclasses de RuntimeException - são chamadas de CheckedExceptions. Essas exceções devem ser capturadas e tratadas em algum lugar do nosso programa sob pena de não conseguirmos compilar o mesmo. Indicam problemas que podem ocorrer independentemente de termos feito um programa logicamente correto. São exemplos desse grupo a IOException, a SQLException, etc. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 158 - i580 – Java Programming Instruções de Tratamento de Erros - 159 - A primeira forma de tratamento de exceções é fazendo uso da instrução try...catch...finally. Caso tenhamos instruções que possam lançar algum tipo de exceção, devemos colocá-las dentro do bloco try e fazer o tratamento de erro dos possíveis casos dentro dos vários blocos catch que podemos ter. É um bloco catch para cada exceção. A avaliação dos blocos catch é feita na ordem em que eles aparecem (no nosso exemplo, o programa testa primeiro se a exceção é do tipo AlgumaException. Se não for, ele testa se é do tipo OutraException. Caso a exceção lançada seja do tipo especificado em um dos blocos catch, apenas esse o bloco será executado para que o programa possa seguir o fluxo de execução normal. A ordem dos blocos catch é importante. Não podemos colocar uma superclasse antes de uma subclasse. Isto porque indicaria uma situação absurda onde teríamos um tratamento de erro que nunca seria alcançado, já que a superclasse não deixaria o teste ser feito. Felizmente, essas coisas são indicadas em tempo de compilação. Opcionalmente, podemos ter um bloco finally que é onde devemos colocar todas as instruções que devem ser executadas, independentes da ocorrência ou não de uma exceção. Há dois casos em que um bloco finally não é executado, total ou parcialmente. Primeiro quando há uma chamada a System.exit(), fazendo com que o programa seja encerrado abruptamente. O outro caso é quando ocorre uma exceção dentro do próprio bloco finally. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 159 - i580 – Java Programming Lançamento de Exceções • Para lançar uma exceção usamos o comando throw. • O programador cria um objeto exceção com new e o nome da classe Exception ou uma de duas subclasses. • A exceção pode ser uma classe que já exista em Java ou pode ser criada pelo programador. throw new Exception();//Genérico .... throw new ArrayIndexOutOfBoundsException();//Classe existente ... throw new ExcecaoDesejada();//Classe criada pelo programador - 160 - De acordo com o negócio que estamos implementando podemos ter situações em que condições de erro devem ser geradas sob nosso controle. Vejamos, por exemplo, o caso ilustrado no código abaixo. Se nosso programa tivesse um array cujo índice máximo fosse determinado por uma constante. Nele fazemos o teste para saber se o índice é negativo ou maior que o valor da constante. Se for, temos uma condição de erro a ser sinalizada pelo lançamento de uma exceção. Isso é conseguido usando a instrução throw (não confundir com a throws que deve ser usada no cabeçalho do método). Repare que devemos criar um objeto do tipo da exceção lançada. Isso porque a instrução try...catch...finally espera um objeto para fazer os testes dentro das cláusulas catch. Podemos lançar qualquer exceção, desde que seu nome esteja na lista throws do método. public int validaIndiceArray(int indice) throws ArrayIndexOutOfBoundsException { if (indice < 0) || (indice > Empresa.MAXIMO_CLIENTES) throw new ArrayIndexOutOfBoundsException(); } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 160 - i580 – Java Programming Métodos que podem lançar exceções • Coloque throws na declaração do método. • A exceção passa para o método que chamou. • Podemos listar quantas exceções quisermos na cláusula throws bastando separar os nomes das classes por vírgula. public boolean abreArquivoConfiguracao () throws IOException, ExcecaoDesejada { // código que pode lançar IOException throw new IOException(); ... throw new EcecaoDesejada(); } - 161 - Em certos casos não vamos querer fazer o tratamento das exceções usando a instrução try...catch...finally. Passaremos a exceção para o código que chamou o nosso método. Fazemos isso através da instrução throws que deve listar as exceções que nosso código lança para o método que o chamou em uma lista separada por vírgulas. Para entender o exemplo mostrado no slide, suponha que temos um programa que usa arquivos de configuração que devem ser abertos antes do início de alguma rotina específica. Para isso foi criado o método abreArquivoConfiguracao que trata o nosso arquivo, fazendo tarefas como validação, verificação de autorização do usuário, etc. Na sua implementação, ele faz uso de métodos que lançam IOException. Como temos a intenção de fazer com que nosso método seja aplicado de forma genérica, não queremos fazer o tratamento de erro dentro dele, mas deixar a cargo de quem está usando-o, dando flexibilidade para escolher como vai ser exibida a mensagem, em que dispositivos de saída, se vai gerar um registro em um arquivo de log etc. Logo, no cabeçalho do método indicamos que ele lança IOException. Por ser uma checked exception, todos que usarem nosso método serão obrigados a fornecer um tratamento, ou lançar para outro método que o tenha chamado. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 161 - i580 – Java Programming Criação de Exceções • É possível criar suas próprias classes de exceções. • Geralmente agrega-se ao nome da classe a palavra Exception. • Estenda a classe Exception ou uma de suas subclasses. //MinhaException em última instância é uma “Unchecked Exceptions” public class MinhaExcecao extends ArithmeticException { ... } //SenhaInvalidaException é uma “Checked Exceptions” public class SenhaInvalidaException extends Exception { public SenhaInvalidaException(String mensagem) { super(mensagem); } } - 162 - Podemos criar nossas próprias exceções usando o esquema de herança. Basta estender a classe Exception. Dessa forma, a nossa exceção será do tipo checked exception tendo que ser tratada de forma obrigatória. A vantagem de criarmos nossas próprias exceções é que podemos tratar as condições de erro melhor e de forma personalizada. Por outro lado, é importante não criar um conjunto muito extenso de exceções, pois vamos comprometer a simplicidade dos nossos sistemas. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 162 - i580 – Java Programming Criação de Exceções • Passo 2: Use suas classes em seus métodos para sinalizar que houve uma condição anormal. public void conectaBD(String senha) throws SenhaInvalidaException, IOException{ try { // tenta se conectar com o banco usando a senha // informada pelo usuário if (!senha.equals(“Java”)) throw new SenhaInvalidaException(“Senha inválida”); ... } catch (IOException) { ... } } - 163 - O exemplo mostra o lançamento de várias exceções pelo método usando a instrução throws e o lançamento da nossa exceção que foi criada no slide anterior. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 163 - i580 – Java Programming Exercício • Implemente as classes do diagrama abaixo conforme as instruções. - 164 - Instruções: 1. Criar as classes, conforme o diagrama. 2. Criar o método toString nas duas classes, retornando os conteúdos das propriedades. Ex de uma ContaEspecial: 123 – Machado de Assis – saldo: 1200.0 – limite: 500.0 3. Criar a implementação dos métodos depositar e sacar considerando as seguintes regras: Não é possível sacar mais do que o saldo permita - ContaCorrente. Não é possível sacar mais do que o saldo + limite permita - ContaEspecial. Não é possível depositar e sacar valores negativos. 4. Nos casos das regras serem violadas, disparar exceções do tipo Exception. 5. Criar uma classe TestaConta para testar o funcionamento de uma ContaCorrente e uma ContaEspecial. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 164 - i580 – Java Programming O que já aprendemos?  UA 1 – Fundamentos.  UA 2 – Orientação a Objetos.  UA 3 – Tratamento de Erros.  UA 4 – Classes Úteis.  UA 5 – Desenho de Telas.  UA 6 – Estruturas de Dados. - 165 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 165 - i580 – Java Programming 4 – Classes Úteis Unidade de Aprendizado - 166 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 166 - i580 – Java Programming 4 – Classes Úteis • • • • • Você aprenderá: Manipulação de Strings. Números e Wrappers. Internacionalização. Formatação de Dados. Processamento de Arquivos. - 167 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 167 - i580 – Java Programming 4.1 – Manipulação de Strings Bloco de Construção do Aprendizado - 168 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 168 - i580 – Java Programming 4.1 – Manipulação de Strings Você aprenderá: • String. • StringBuffer. - 169 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 169 - i580 – Java Programming Classe String • Uma string é uma seqüência de caracteres. • A classe String é usada para representar strings em Java. • São objetos somente de leitura, ou seja, não podem ter seu valor modificado após a criação. - 170 - String é um tipo de dados utilizado para armazenar uma seqüência de caracteres. As strings em Java são objetos e não apenas um vetor de caracteres. São implementadas pela classe String, disponível no package java.lang. Cada string definida é um objeto dessa classe e portanto, possui diversos métodos que podem ser chamados para realizar operações sobre strings. Objetos desta classe são tratados de forma especial pelo Java. Por exemplo, não é necessário criar explicitamente um objeto com new e pode ser utilizado o operador “+” para concatenação. Também é possível concatenar uma string com qualquer tipo básico ou objeto da linguagem. O compilador irá gerar o código necessário para converter o tipo básico (ou objeto) em uma string para realizar a concatenação. Um detalhe muito importante sobre esta classe é que seus objetos são somente para leitura ou imutáveis. Ou seja, após a sua criação eles não podem mais ser alterados. Apenas os objetos são imutáveis, as variáveis de referência continuam funcionando da maneira usual. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 170 - i580 – Java Programming Criando objetos String • Algumas formas de criação. String autor = “João Ubaldo Ribeiro”; //forma simplificada //Concatenação de objetos String String autor = “João ” + “Ubaldo “ + “Ribeiro”; //Forma comum de criação de objetos usando o operador new. String autor = new String(“João Ubaldo Ribeiro”); - 171 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 171 - i580 – Java Programming Métodos da Classe String int length (); String String String String String concat (String); replace (char, char); toLowerCase (); toUpperCase (); trim (); char charAt (int); char [] toCharArray (); - 172 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 172 - i580 – Java Programming Métodos da Classe String String int int boolean int boolean boolean substring (int, int) indexOf (String); lastIndexOf (String); equals (String) compareTo (String); startsWith (String); endsWith (String); boolean matches(String); String[] split(String); - 173 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 173 - i580 – Java Programming Método substring() • Pode receber um ou dois parâmetros inteiros e retorna um subconjunto da String original: String url = "http://www.infnet.com.br/curso/javaprogramming1/index.htm"; String dominio, teste; dominio = url.substring(7,24);//objeto - ponto - nome_metodo - (parâmetros) System.out.println("Dominio = " + dominio); teste = url.substring(25); System.out.println("teste = " + teste); Dominio = www.infnet.com.br teste = curso/javaprogramming1/index.htm Press any key to continue . . . • Este é um exemplo prático de um método sobrecarregado. - 174 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 174 - i580 – Java Programming Método toString() • Todos os objetos herdam o método toString() de Object que pode ser sobrescrito. public class Cliente { ... public String toString() { return nome + “ “ + email; } } • Qualquer referência adicionada a um String invoca o método toString() do objeto. System.out.println("url = " + url.toString()); System.out.println("url = " + url);//Exatamente o mesmo que a linha anterior - 175 - Todo e qualquer objeto em Java pode ser exibido como uma string. Para tal, é usado o método toString(), que é definido na classe Object, e pode ser sobrescrito pela classe que você está implementando. O método println() chama toString() automaticamente. Caso não seja fornecida uma versão específica de toString() para um determinado objeto, em virtude do mecanismo de herança, esse objeto terá uma representação como string. Será exibido o nome da classe da qual o determinado objeto é uma instância e um número hexadecimal representando a posição de memória do objeto. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 175 - i580 – Java Programming Método equals() • O método equals() é herdado de Object e é sobrescrito em String. Para fazer comparações sem considerar o “caso”, usa-se equalsIgnoreCase() String url = "http://www.infnet.com.br/curso/javaprogramming1/index.htm"; String dominio; dominio = url.substring(7,24); if (dominio.equals("www.infnet.com.br")) System.out.println("Site de educacao em TI."); else System.out.println("Outro site."); - 176 - Os métodos de comparação equals e equalsIgnoreCase verificam se duas strings são iguais, retornando true em caso positivo e false caso contrário. O método equals considera a diferença entre minúsculas e maiúsculas mas para o método equalsIgnoreCase tal diferença não existe. O que é exibido quando o código abaixo é executado? public class TestaEquals { public static void main(String[] args) { String x = "abc"; String y = new String("abc"); String z = "abc"; if(x == y) if(x.equals(y)) if(x == z) if(x.equals(z)) System.out.println("x == y"); System.out.println("x.equals(y)"); System.out.println("x == z"); System.out.println("x.equals(z)"); } } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 176 - i580 – Java Programming Método valueOf() • Método valueOf() – converte qualquer variável de tipo primitivo em um String. String cargaHoraria = String.valueOf(40); String preço = String.valueOf(5.2); - 177 - Há uma versão de String.valueOf() para cada tipo primitivo. Quando um primitivo é concatenado com uma String, ele é automaticamente convertido para uma String através de uma chamada a String.valueOf(). Há uma versão de System.valueOf() para cada tipo primitivo, além de existir para o tipo Object e para vetores de caracteres. Fazer uma conversão de qualquer valor para uma String usando os referidos métodos é semelhante a uma concatenação com uma string vazia, por exemplo: String cargaHoraria = “” + 40; TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 177 - i580 – Java Programming Classe StringBuffer • Representa uma seqüência mutável de caracteres Unicode. Por ser mutável, é a candidata natural quando uma série de concatenações se faz necessária. • Não tem relação alguma com a classe String. //Método para ler um string do final para o início public String reverter(String s) { StringBuffer sb = new StringBuffer(); for (int i = s.length() – 1; i >= 0; i--) sb.append(s.charAt(i)); return sb.toString(); } - 178 - A classe StringBuffer representa strings que podem ser modificadas em tempo de execução. Adicionar caracteres a uma String ou concatenar repetidas vezes uma série de Strings é uma operação que consome muita memória, visto que a cada nova concatenação é criado um novo objeto em memória pelo Java. Logo, a classe StringBuffer é a candidata natural para casos em que uma série de concatenações deve ser feita de forma repetida. Com isso, ganha-se em performance, como no caso do exemplo mostrado no slide. Repare no exemplo que não fazemos nenhuma atribuição direta de objetos da classe String a referências do tipo StringBuffer e vice-versa. Isso porque eles não possuem nenhuma relação de herança entre eles. São classes completamente distintas. A classe StringBuffer está definida no pacote java.lang. O código completo do slide: public class TestaStringBuffer{ public static void main(String args[]){ String url = "http://www.infnet.com.br/curso/javaprogramming1/index.htm"; System.out.println("url = " + reverter(url)); } public static String reverter(String s) { StringBuffer sb = new StringBuffer(); for (int i = s.length() - 1; i >= 0; i--) sb.append(s.charAt(i)); return sb.toString(); } } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 178 - i580 – Java Programming public class TestaConcatenacoes { public static void main(String[] args) { testaString(); testaStringBuffer(); } private static void testaString() { long ini = System.currentTimeMillis(); String s = new String(); for (int i = 0; i < 20000; i++) { s += i; } long fim = System.currentTimeMillis(); long dif = fim - ini; System.out.println("String: " + dif + " millis"); } private static void testaStringBuffer() { long ini = System.currentTimeMillis(); StringBuffer s = new StringBuffer(); for (int i = 0; i < 20000; i++) { s.append(i); } long fim = System.currentTimeMillis(); long dif = fim - ini; System.out.println("StringBuffer: " + dif + " millis"); } } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 179 - i580 – Java Programming Métodos de StringBuffer StringBuffer append (...); StringBuffer insert (int pos, ...); char void charAt(int pos); setCharAt (int pos, char Ch); StringBuffer delete(int ini,int fim); StringBuffer reverse(); - 180 - Objetos do tipo StringBuffer podem ser alterados. Os métodos abaixo não fazem cópias do objeto para executar suas operações, eles operam sobre o objeto que está chamando o método. StringBuffer append(..) – concatena uma variável ao objeto atual. StringBuffer insert (int pos, …) – insere um valor dentro do objeto na posição especificada. char charAt(int indice) – Retorna o caracter que se encontra na posição indice, semelhante ao método homônimo da classe String. void setCharAt(int pos, char c) – altera o caracter indicado pela posição pos. StringBuffer delete (int inicio, int fim) – deleta os caracters indicados por inicio e fim. StringBuffer reverse() – inverte os caracteres do objeto. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 180 - i580 – Java Programming 4.2 – Números e Wrappers Bloco de Construção do Aprendizado - 181 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 181 - i580 – Java Programming 4.2 – Números e Wrappers Você aprenderá: • Classe Math. • Wrappers. - 182 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 182 - i580 – Java Programming Classe Math • Definida no pacote java.lang. • Nenhum objeto dessa classe pode ser criado pois seu construtor é privado. • Todos os seus métodos são estáticos e por isso acessamos com o nome da classe. • Não pode ser estendida por herança. • Possui duas constantes para cálculos. - 183 - Esta é uma boa classe para a revisão de alguns conceitos. Com a classe Math não se tem intenção de criar instâncias de objetos e sim usar seus métodos para fazer cálculos matemáticos. Sendo assim seu método construtor possui uma palavra reservada chamada private. Os métodos da classe Math como não serão acessados por instâncias de objetos (já que não podem ser criadas) possuem uma palavra reservada chamada static. A classe Math não aceita que se crie classes filhas a partir dela. Para garantir que isso não vai ocorrer, ela possui uma palavra reservada em sua declaração chamada final. Este tipo de classe é denominada de classe utilitária, cujo objetivo é fornecer uma coleção de serviços, ou seja métodos úteis que não precisam armazenar em objetos da classe os resultados de seus processamentos. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 183 - i580 – Java Programming Classe Math ceil(), floor(), round(). abs(), min(), max(). sin(), cos(), tan(), asin(), acos(), atan(), toDegrees(), toRadians(). log(), exp(). sqrt(), pow(), random(). Constantes PI, E - 184 - Existem duas constantes: PI que representa o número PI e E que representa o número neperiano, ou constante de Néper. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 184 - i580 – Java Programming demonstração Classe Math //Sorteando um numero entre 50 e 80 double valSorteado = Math.random(); int resultado = 50 + (int) (valSorteado*30); System.out.println("Sorteio entre 50 e 80: " + resultado ); //Maior entre dois números int maior; maior = Math.max(resultado,65); System.out.println("Entre 65 e " + resultado + " o maior valor eh " + maior); //Área de um círculo de raio 5 double area = Math.PI * Math.pow(5,2); System.out.println("Area de um circulo de raio 5 eh " + area); Sorteio entre 50 e 80: 64 Entre 65 e 64 o maior valor eh 65 Area de um circulo de raio 5 eh 78.53981633974483 Area de um circulo de raio 5 eh 78,54 Press any key to continue . . . - 185 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 185 - i580 – Java Programming Classes Wrapper • Permite a utilização de tipos primitivos como objetos. boolean Boolean byte Byte char Character short Short int Integer long Long float Float double Double - 186 - As classes Wrapper são úteis para tratar tipos primitivos como objetos. Existem estruturas, principalmente as do pacote java.util (que serão tratadas daqui a pouco) que só aceitam objetos. Usando essas classes podemos armazenar tipos primitivos também. Além disso, elas possuem métodos de conversão relacionadas ao tipo como parseInt() (classe Integer), parseFloat() (classe Float) e assim por diante. É nas classes Wrapper que estão definidas constantes relacionadas aos tipos primitivos e que servem para tornar o nosso programa melhor estruturado. Exemplos dessas constantes são MAX_VALUE e MIN_VALUE, que retornam, respectivamente, o valor máximo e mínimo do tipo primitivo específico. As classes Wrapper representam objetos imutáveis, ou seja, uma vez inicializado um objeto de uma clase wrapper, não há mais como alterar o seu valor. Essas classes estão declaradas no pacote java.lang. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 186 - i580 – Java Programming Exercício • Dado um arquivo-texto com conteúdo semelhante ao exemplo, responda: – Que método de String deve ser usado para retirar as aspas (substituir por vazio)? – Que método de String deve ser usado para separar as linhas (separar por \n)? – Que método de String deve ser usado para separar os campos? - 187 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 187 - i580 – Java Programming 4.3 – Internacionalização Bloco de Construção do Aprendizado - 188 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 188 - i580 – Java Programming 4.3 – Internacionalização • • • • • Você aprenderá: Formatação de Números. Date. Calendar. Formatação de Datas. Locale. - 189 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 189 - i580 – Java Programming Formatação de Números • Para formatar números deve-se utilizar as classes NumberFormat ou DecimalFormat. • A classe NumberFormat possui métodos para retornar os formatos pré-definidos de valores numéricos, monetários e percentuais. • A classe DecimalFormat possibilita a customização da formatação. - 190 - A formatação de números é bastante comum e necessária em diversos tipos de aplicação. Para formatar um número qualquer é necessário utilizar uma das classes: NumberFormat e DecimalFormat. A classe NumberFormat pode ser utilizada quando a formatação utilizar formatos-padrão: monetário, numérico e porcentagem. NumberFormat obj = NumberFormat.getCurrencyInstance(); A classe DecimalFormat permite que se construam novos tipos de formatos diferentes a partir de determinados símbolos. DecimalFormat obj = new DecimalFormat(“$0,000.000"); Em ambos os casos, a forma de se formatar é a mesma: após a criação dos objetos o método format deve ser chamado. Este método recebe como parâmetro o valor que será formatado e retorna uma string formatada. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 190 - i580 – Java Programming Uso de NumberFormat • Obter uma instância da classe para o tipo de formatação desejada, utilizando os métodos estáticos. getCurrencyInstance();//Dinheiro getNumberInstance();//Número getPercentInstance();//Percentual • Formatar o valor desejado com o método format. - 191 - A classe NumberFormat é abstrata e fornece a interface para a formatação e conversão de números. NumberFormat getCurrencyInstance ( ); - retorna uma instância para a formatação de valores monetários. NumberFormat getNumberInstance ( ); - retorna uma instância para a formatação de números comuns. NumberFormat getPercentInstance ( ); - retorna uma instância para a formataçao de valores percentuais. String format(...); - formata o valor passado como parâmetro de acordo com a maneira pela qual o objeto foi criado. Number parse(String); - converte a string em um número. Caso encontre alguma coisa que não seja número, pára a conversão e retorna o resultado encontrado. NumberFormat f = NumberFormat.getCurrencyInstance(); double valor = 55008.537; System.out.println("Sem formatação: " + valor); System.out.println("Formatado: " + f.format(valor)); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 191 - i580 – Java Programming Locale • Classe que representa uma região e um idioma. • Muito usada em métodos de formatação. • Para criar um Locale diferente basta passar as siglas referentes à região e ao idioma ou usar uma das constantes disponíveis. • O Locale padrão é o configurado no SO. Para alterar utilize: Locale.setDefault(novo_locale); - 192 - Um objeto desta classe representa uma região e um idioma. É utilizada principalmente em classes de formatação e de manipulação de fusos horários. Para utilizar um locale, deve-se usar a respectiva constante. Caso não exista uma constante deve-se criar um objeto que recebe duas strings como parâmetro: idioma e região. Exemplo de um locale que representa o Brasil: Locale local = new Locale(“pt”, “br”); Para saber todos os locales disponíveis, basta chamar o método estático da classe Locale: getAvailableLocales() que retorna uma lista de locales. Quando um locale não é definido, as configurações do sistema operacional são usadas. Caso se queira forçar um determinado locale, independente da configuração pode ser usado o método estático setDefault: Locale.setDefault(Locale.FRANCE); No momento da formatação de um número pode ser indicado um locale específico para o formatador: NumberFormat f = NumberFormat.getCurrencyInstance(Locale.JAPAN); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 192 - i580 – Java Programming Date • A classe Date obtém a data do sistema ou cria uma data específica no tempo (data/hora). • Vários métodos obsoletos (@Deprecated). • Métodos que ainda podem ser usados: Date() Date(long) after, before, clone, compareTo, equals, hashCode getTime, setTime, toString - 193 - A classe Date (definida em java.util.Date) representa uma data em milisegundos. Embora muitos de seus métodos estejam obsoletos, muitos de seus métodos ainda são bastante utilizados: Date() – construtor para criação de uma data contendo a data atual do sistema operacional. Date(long) – construtor para a criação de uma data, cujo conteúdo deve ser especificado em milisegundos e passado como parâmetro. after, before – verificam se uma data vem antes ou depois de outra. clone, equals, hashCode – métodos sobrecarregados de Object. compareTo – compara dois objetos getTime, setTime – retorna ou alterar uma determinada hora em milisegundos. toString – retorna a string que representa a data em formato canônico. Além disso, muitos métodos de outras classes pedem como parâmetro objetos da classe Date System.out.prinltn(new Date()); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 193 - i580 – Java Programming Calendar • A classe Calendar e sua subclasse GregorianCalendar são utilizadas para a manipulação de datas. • O método principal é o get(elemento). O elemento indica o que deve ser recuperado (YEAR, MONTH, DAY, etc.). • Para criar datas específicas usa-se o método set. - 194 - As classes que devem ser utilizadas para criar e recuperar datas são Calendar e sua subclasse GregorianCalendar(). Elas possuem datas que possibiltam a fácil criação de datas com ou sem sua hora respectiva. A criação de datas é feita com o método set e a recuperação de valores específicos com o método get e a respectiva constante sendo passada como parâmetro. O exemplo abaixo mostra a criação de uma data, a mudança de seu dia, mês e ano para 9 de outubro de 2000 e a recuperação de diversas informações úteis. Calendar data = new GregorianCalendar(); data.set(2000, 10, 9); System.out.println(data.get(Calendar.MONTH)); System.out.println(data.get(Calendar.DAY_OF_WEEK)); System.out.println(data.get(Calendar.DAY_OF_MONTH)); System.out.println(data.get(Calendar.DAY_OF_YEAR)); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 194 - i580 – Java Programming Manipulação de Datas • A classe DateFormat e sua subclasse SimpleDateFormat são usadas para a formatação de datas. • Podem ser criadas instâncias com data e com data e hora: DateFormat df = DateFormat.getDateInstance(); DateFormat df = DateFormat.getDateTimeInstance(); • Podem ser passados como parâmetros o Locale desejado e o tipo de formatação: SHORT, MEDIUM, LONG, FULL. - 195 - A forma padrão de se mostrar uma data é denominada forma canônica: Thu Mar 08 17:57:28 GMT+00:00 2007 Para formatar uma data em um formato diferente devem ser utilizadas as classes DateFormat (para formatos padrão) e SimpleDateFormat (para formatos customizados). A classe DateFormat possui os métodos getDateInstance, getTimeInstance e getDateTimeInstance para formatar, respectivamente datas, horas e datas-horas. Existem quatro tipos possíveis de formatação que são dependentes do idioma e região selecionados: SHORT, MEDIUM, LONG e FULL. Exemplo de formatação de uma data com o formato FULL: DateFormat df = DateFormat.getDateInstance(DateFormat.FULL); Calendar data = new GregorianCalendar(); data.set(2000, 10, 9); System.out.println(df.format(data.getTime())); Resultado da execução do trecho de código acima: Quinta-feira, 9 de Novembro de 2000 TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 195 - i580 – Java Programming Manipulação de Datas • Uma boa idéia seria criar uma classe utilitária que permitisse fazer várias operações com datas e tempo. • Analise o código abaixo e utilize-o como base para construir as suas próprias soluções. - 196 - import java.util.Date; public class Data { public static final long DIA = 1000*60*60*24; public static Date somaDias(Date data, int dias) { Date retorno = null; if(data != null && dias > 0) { long tempo = data.getTime(); tempo += dias * DIA; retorno = new Date(tempo); } return retorno; } public static Date somaMeses(Date data, int meses) { Date retorno = null; if(data != null && meses > 0) { retorno = data; int mes = retorno.getMonth(); mes += meses; retorno.setMonth(mes); } return retorno; } } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 196 - i580 – Java Programming Exercício • Criar um programa que use o método getAvaliableLocales da Classe Locale para exibir uma lista com as seguintes informações das regiões: – – – – – Nome do País. Nome do Idioma. Número Formatado. Moeda Formatada. Data Completa Formatada. Utilize a documentação da classe Locale - 197 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 197 - i580 – Java Programming 4.4 – Processamento de Arquivos Bloco de Construção do Aprendizado - 198 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 198 - i580 – Java Programming 4.4 – Processamento de Arquivos Você aprenderá: • • • • IO API. Classes Abstratas. Classes de Arquivos. Classes Especializadas. - 199 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 199 - i580 – Java Programming Streams • Streams são canais de comunicação entre um programa e uma fonte de dados - fluxos. • As fontes de dados podem ser: arquivos, trechos de memória e conexões de rede. • Em Java não importa qual seja a fonte, todo o tratamento de dados é igual. • Fontes das quais lemos dados são fluxos de entrada e aquelas nas quais gravamos dados são fluxos de saída. - 200 - Streams são seqüências de bytes que viajam através de um canal de comunicação, ou seja, uma stream é um fluxo de bytes. A transferência de dados em Java é feita através de streams. Esta transferência pode ser entre o disco e a memória, entre um computador e outro ou mesmo entre partes diferentes da memória. Com o uso de streams define-se uma maneira padronizada de realizar estas movimentações de dados independente do meio utilizado. Portanto a responsabilidade do computador está em mover os bytes enquanto ao programador caberá a tarefa de dar significado aos bytes. Em Java são definidos dois tipos de tratamento de streams: orientados por bytes ou caracteres. O primeiro tipo é implementado pelas classes derivadas de InputStream e OutputStream. No segundo método as superclasses são Reader e Writer. Existem subclasses para cada uma destas hierarquias que tratam de tarefas de leitura e escrita mais específicas, tais como: comunicação entre threads (Piped), movimentação entre vetores(ByteArray), concatenação de duas ou mais streams (Sequence), transferência de dados em formatos definidos (Data), comunicação com buffers (Buffered), contagem de linhas transferidas (LineNumber) e retorno de comunicação (Pushback). O nome da subclasse é composto da sua especialidade seguido do tipo de transferência. Por exemplo, a classe que faz a leitura de arquivos do disco chama-se FileInputStream. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 200 - i580 – Java Programming Streams • Em Java existem dezenas de classes que representam fluxos de entrada e saída. • Estas classes são divididas em 3 grupos: – Classes BaseAbstratas, subdivididas em classes de acesso binário e texto. – Classes de Acesso Físico. – Classes de Acesso Lógico. • Todas as classes de stream estão definidas no pacote java.io. - 201 - Em Java existem dezenas de classes que representam fluxos de entrada e saída. Estas classes são divididas em 3 grupos: Classes Base Abstratas, subdivididas em classes de acesso binário e texto. Classes de Acesso Físico: que representam algum meio de armazenamento como aquivo em disco, em memória, etc. Classes de Acesso Lógico: também conhecidas como filtros, são responsáveis por executar determinadas conversões nos fluxos. Todas as classes de stream estão definidas no pacote java.io. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 201 - i580 – Java Programming Classes Base Abstratas • As classes base abstratas definem um padrão de acesso(E/S) a dados. • Podem acessar caracteres ou bytes. • Acesso a texto (formato UNICODE): – Reader, leitura de dados. – Writer, gravação de dados. • Acesso a bytes: – InputStream, leitura de dados. – OutputStream, gravação de dados. - 202 - As classes abstratas InputStream, OutputStream, Reader e Writer definem os seguintes métodos genéricos para transferência: leitura, escrita, posicionamento e quantidade de dados disponíveis. Leitura e gravação de bytes. Utilizadas quando o conteúdo tem algum significado específico para o programador. Por exemplo, 8 bytes lidos do arquivo podem significar 2 valores inteiros ou um valor longo. InputStream read available close skip OutputStream write flush close Leitura e gravação de caracteres. Geralmente utilizados para internacionalização, ou seja, possibilita que o conteúdo seja tratado da mesma forma, independente do idioma utilizado, já que em alguns países o alfabeto é composto de centenas de símbolos. Reader read close ready Writer write flush close TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 202 - i580 – Java Programming Classes de Acesso Físico • As classes de acesso físico definem formas de manipulação de dados diretamente da fonte de dados. • A leitura de dados de um arquivo pode ser feita com as classes FileInputStream ou FileReader. • Para gravar dados em um arquivo usamos FileOutpuStream e FileWriter. - 203 - Apesar da grande quantidade de subclasses especializadas existentes, o uso de streams em Java segue sempre o mesmo padrão: 1. Criar uma stream 2. Manipular os dados da stream (ler ou gravar dependendo do tipo) 3. Fechar a stream. Exemplo Genérico: objeto = new (); = objeto.read(); ou = objeto.write(); objeto.close(); Outra característica potente do uso de streams em Java é a possibilidade de criação uma stream a partir de outra. Ou seja, é possível unir as capacidades das diversas subclasses. Por exemplo, é possível fazer a comunicação entre threads com as classes Piped utilizando-se um buffer auxiliar através das classes Buffered. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 203 - i580 – Java Programming Classes de Acesso Físico • Ao criar um objeto de qualquer uma destas classes, será aberto o arquivo passado como parâmetro. • Para ler dados temos o comando read(). • Para gravar dados usamos o write(). • Para fechar um arquivo usamos o close(). • Estes comandos podem gerar exceções derivadas de IOException. - 204 - Exemplo de código para ler um arquivo-texto: private static void leArquivo() { try { FileInputStream fis = new FileInputStream("lorem_ipsum.txt"); byte[] texto = new byte[fis.available()]; fis.read(texto); fis.close(); System.out.println(new String(texto)); } catch (Exception e) { } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 204 - i580 – Java Programming Classe File • Usamos a classe File para: – Representar um arquivo ou diretório. – Criar um arquivo ou diretório. – Verificar os atributos de um arquivo ou diretório. – Renomear um arquivo ou diretório. – Remover um arquivo ou diretório. – Recuperar informações diversas sobre um arquivo ou diretório. - 205 - A classe File fornece uma série de métodos úteis para tratamento de arquivo e recuperação de suas informações. O exemplo abaixo mostra diversas informações sobre um arquivo texto: private static void testaFile() { File file = new File("arquivos.properties"); System.out.println("Path: " + file.getAbsolutePath()); System.out.println("Ler? " + file.canRead()); System.out.println("Gravar? " + file.canWrite()); System.out.println("Num.Bytes :" + file.length()); } TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 205 - i580 – Java Programming Exercício • Criar um programa para ler o arquivo uf.csv e exibir as siglas e os nomes dos estados do Brasil. – – – – Ler o arquivo para a memória. Retirar as aspas. Separar as linhas (terminadas por \n). Separar os campos. O arquivo está no http://sae.infnet.edu.br - 206 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 206 - i580 – Java Programming O que já aprendemos?  UA 1 – Fundamentos.  UA 2 – Orientação a Objetos.  UA 3 – Tratamento de Erros.  UA 4 – Classes Úteis.  UA 5 – Desenho de Telas.  UA 6 – Estruturas de Dados. - 207 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 207 - i580 – Java Programming 5 – Desenho de Telas Unidade de Aprendizado - 208 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 208 - i580 – Java Programming 5 – Desenho de Telas Você aprenderá: • Bibliotecas Gráficas. • Tratamento de Eventos. - 209 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 209 - i580 – Java Programming 5.1 – Bibliotecas Gráficas Bloco de Construção do Aprendizado - 210 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 210 - i580 – Java Programming 5.1 – Bibliotecas Gráficas • • • • • • • Você aprenderá: Java Foundation Classes. Abstract Window Toolkit. Aplicação X Applet. Ciclo de Desenvolvimento. Component. Container. Gerenciadores de Layout. - 211 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 211 - i580 – Java Programming Java Foundation Classes • Sun Microsystems colocou as tecnologias da Netscape, IBM e Lighthouse Design (atualmente parte da Sun) sob o mesmo contexto com o objetivo de criar um conjunto de componentes gráficos que se integrem ao JDK. • O produto dessa iniciativa é uma coleção de APIs denominada de JFC - Java Foundation Classes. - 212 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 212 - i580 – Java Programming Java Foundation Classes • JFC é composta por 5 APIs: – AWT – são os componentes mais básicos que existem no JDK desde a versão 1.0 e têm como principal característica o acesso direto aos componentes no sistema operacional. – Swing – conjunto de componentes basedados na tecnologia Internet Foundation Classes da Netscape. – Java 2D – API gráfica baseada na tecnologia licenciada da IBM/Taligent. – Accessibility – contribui com recursos direcionados para usuários com necessidades especiais. – Drag and Drop – conjunto de ferramentas para implementar essa funcionalidade de forma padrão nas diversas plataforma. - 213 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 213 - i580 – Java Programming java.awt.* • Abstract Window Toolkit – Biblioteca 'Abstrata' para Desenho de Telas. • Contém todas as classes para criação de interfaces gráficas e para o desenho de gráficos e imagens. - 214 - A biblioteca AWT (Abstract Window Toolkit) contém componentes e classes que são utilizados para o desenvolvimento de interfaces gráficas para usuários (GUI – Graphical User Interface). Independente da plataforma em que será executada, a interface que aparecerá em uma será semelhante a que aparecerá em outra. A biblioteca AWT está no package java.awt. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 214 - i580 – Java Programming java.awt.* • Cada componente AWT utiliza código nativo para aparecer na tela. • Quando um programa roda no Windows os botões que aparecem são botões do Windows. • Quando a mesma aplicação roda no Macintosh ou UNIX os botões que aparecem são os do sistema operacional nativo. AWT é simples e eficiente - 215 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 215 - i580 – Java Programming Ciclo de Desenvolvimento • Existem três passos que precisam ser seguidos para criar uma aplicação gráfica ou applet: – Monte a tela com os componentes gráficos sendo agrupados e exibidos dentro de containeres. – Defina os métodos que vão tratar os eventos gerados pela interação do usuário com a tela. – Exiba a tela. - 216 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 216 - i580 – Java Programming Component • Todo componente é subclasse da classe Component. • Um 'component' é um objeto gráfico que pode interagir com o usuário. • A classe Container define componentes que podem conter outros componentes. - 217 - Component é uma classe abstrata que implementa MenuComponent e que serve de base para criação de todo e qualquer componente gráfico dentro da AWT. A classe Container é uma subclasse abstrata de Component e são importantes para que organizemos os componentes gráficos na tela. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 217 - i580 – Java Programming Component - 218 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 218 - i580 – Java Programming Container • Window – janela 'flutuante', pois não se incorpora a outro container. • Frame – é a 'janela' que conhecemos, com borda, título e ícones de minimizar e maximizar. • Dialog – é a mesma coisa que o Frame, porém não permite o redimensionamento. - 219 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 219 - i580 – Java Programming Container • Panel – é um elemento de agrupamento. Serve para distribuir melhor os componentes gráficos, criando áreas na tela a fim de facilitar o desenho. • Applet – é um 'painel' que se integra a uma página HTML. - 220 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 220 - i580 – Java Programming Container • Adicionam-se componentes aos containeres através do método add. • Como os 'paineis' são componentes, podemos adicionar paineis em outros paineis. Panel p = new Panel(); Button b = new Button(“OK”); p.add(b); - 221 - A classe Window é utilizada para criar janelas nativas flutuantes e não depende de outros containeres. Ela possui duas subclasses: Dialog e Frame. A classe Frame cria janelas com uma barra de título e redimensionável, podendo conter menus. A classe Dialog não pode ser redimensionada e não pode conter menus. Um Frame deve ser tornado visível através do método setVisible(true) e seu tamanho definido usando setSize(larg, alt) obrigatoriamente antes de ser exibido na tela. A classe Panel deve ser utilizada dentro de um outro Container. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 221 - i580 – Java Programming Gerenciadores de Layout • Controlam como os componentes são organizados dentro de um container (posição e tamanho). • Todo container tem um gerenciador de layout default. – Window – BorderLayout. – Panel - FlowLayout. • Para alterar o gerenciador de layout use o método setLayout da classe Container. – Usa-se um objeto anônimo, pois os gerenciadores de layout não podem ser utilizados em dois containeres diferentes. - 222 - Os gerenciadores de layout são responsáveis pela exibição de componentes dentro de containeres, fornecendo capacidades básicas de layout que são mais fáceis de utilizar do que determinar a posição e o tamanho exatos de cada componente GUI. Isto permite ao programador concentrar-se na aparência e comportamento básicos da aplicação e deixar os gerenciadores de layout processar a maioria dos detalhes de layout. Todo container tem um gerenciador de layout default e que pode ser substituído usando o método setLayout() do container. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 222 - i580 – Java Programming FlowLayout - 223 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 223 - i580 – Java Programming BorderLayout - 224 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 224 - i580 – Java Programming GridLayout - 225 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 225 - i580 – Java Programming JExplorer • Vamos ver os gerenciadores em ação: – Criaremos uma classe chamada JExplorer que tem por objetivo exibir o conteúdo de diretórios e arquivos. – A tela tem as seguintes características: • TextField no norte. • List e TextArea no centro (dentro de um Panel usando GridLayout 2X1). • As outras áreas estão vazias. - 226 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 226 - i580 – Java Programming JExplorer • Os objetos txtDir, lstDir e txtTexto são declarados como variáveis da classe. – Isso é necessário para que possamos usar esses objetos em outros métodos. • Observe o uso de um painel no centro do BorderLayout para podermos colocar a lista e a área de texto, fazendo com que fiquem do mesmo tamanho. – O Panel usa GridLayout. - 227 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 227 - i580 – Java Programming TelaCadastro • Imagine uma tela com três paineis: – West – painel que exibe os labels. – Center – painel que exibe os campos de texto. – South – painel que exibe os botões de ação. - 228 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 228 - i580 – Java Programming - 229 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 229 - i580 – Java Programming Observações • As telas ainda não dispõem de eventos. • O método setSize pode ser substituído pelo método pack, desde que se saiba o tamanho dos objetos da tela. • A melhor maneira de desenhar telas é através de um editor gráfico. O desenho 'na mão' deve ser usado quando se deseja automatizar tarefas. Utilize um editor gráfico para construir suas telas - 230 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 230 - i580 – Java Programming Exercício • Vamos investigar as telas JExplorer e TelaCadastro. Os arquivos estão no http://sae.infnet.edu.br - 231 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 231 - i580 – Java Programming 5.2 - Tratamento de Eventos Bloco de Construção do Aprendizado - 232 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 232 - i580 – Java Programming 5.2 – Tratamento de Eventos Você aprenderá: • • • • • • Definições. Método getSource(). Modelo de Delegação de Eventos. Criando Objetos listener. Registro do listener. Objetos GUI e seus Eventos - 233 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 233 - i580 – Java Programming Definições • Eventos são objetos gerados que descrevem algo que ocorreu. • Fonte de evento é algum objeto ou componente que gera um objeto evento. • Listener ou ouvinte de evento é um objeto que fica esperando ser avisado da ocorrência de um evento. • Handler ou manipulador de evento é um método que trata de um evento específico. - 234 - Existem vários tipos de eventos diferentes para descrever as diferentes categorias de ação do usuário. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 234 - i580 – Java Programming Definições • As GUIs são baseadas em eventos como mover o mouse, clicar um botão, etc. • Quando ocorre uma iteração, um evento é enviado ao programa. • As informações do evento são armazenadas num objeto de uma classe que estende AWTEvent. - 235 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 235 - i580 – Java Programming Método getSource() • Por herança de EventObject, todo objeto evento possui o método getSource() que retorna o objeto em cima do qual o evento ocorreu. public void actionPerformed(ActionEvent e) { if (e.getSource() == sairButton){ ... else if (e.getSource() == deslocarButton){ ... - 236 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 236 - i580 – Java Programming Modelo de Delegação de Eventos • O processamento do evento é delegado a um objeto particular no programa. - 237 - O modelo de delegação surgiu no JDK 1.1. Vejamos como ele funciona: 1 – Fase de registro: Um listener (ouvinte) é registrado junto a um objeto gerador de um evento (fonte de evento). O listener escuta por um ou mais tipos de eventos. Um listener implementa a interface EventListener. Eventos gerados por componentes que não possuem listeners registrados são ignorados. 2 – Fase de Notificação: Ocorrido o evento, o listener registrado é notificado e o objeto evento gerado é passado para o mesmo. No listener podem haver vários métodos tratadores de evento. Através de um ID de evento o objeto listener E o método tratador, são escolhidos corretamente por Java. 3 – Fase de Execução do Manipulador: Recebido o objeto evento e a notificação de ocorrência, o listener chama o manipulador específico e o executa. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 237 - i580 – Java Programming Criando Objetos listener • Cada tipo de evento possui uma interface listener correspondente. – ActionsEvent é tratados por ActionListener. – MouseEvent é tratados por MouseListener. • O objeto que implementa uma interface listener torna-se um listener para aquela categoria de eventos. • O componente GUI fonte do evento decide o tipo de ouvinte para o qual o evento deve ser despachado e o método a chamar. – Quando ocorre um MouseEvent, o evento é despachado para MouseListener. - 238 - A maioria das classes que representam eventos estão dentro do package java.awt.event. Para cada categoria de eventos existe uma interface que contém os métodos que podem ser chamados quando um evento particular ocorrer. Categoria Ação Item Ajuste Interface ActionListener ItemListener AdjustmentListener Texto Mov. Mouse TextListener MouseMotionListener Focus FocusListener Container ContainerListener Tecla KeyListener Métodos tratadores de evento actionPerformed(ActionEvent) itemStateChanged(ItemEvent) adjustmentValueChanged (AdjustmentEvent) textValueChanged(TextEvent) mouseDragged(MouseEvent) mouseMoved(MouseEvent) focusGained(FocusEvent) focusLost(FocusEvent) componentAdded(ContainerEvent) componentRemoved(ContainerEvent) keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent) TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 238 - i580 – Java Programming Criando Objetos listener //definição da interface ActionListener só possui um método public interface ActionListener { void actionPerformed(ActionEvent e) { } //definição de classe ouvinte de eventos ActionListener private class MinhaClasseListener implements ActionListener{ //método tratador de eventos actionPerformed public void actionPerformed(ActionEvent e){ // código para manipular o evento if (e.getSource() == sairButton){ //definição de classe ouvinte de eventos ItemListener private class CheckBoxHandler implements ItemListener { //método tratador/manipulador de eventos itemStateChanged public void itemStateChanged( ItemEvent e ) {... - 239 - Categoria Componente Mouse Janela Interface ComponentListener Métodos componentMoved(ComponentEvent) componentHidden(ComponentEvent) componentResized(ComponentEvent) componentShown(ComponentEvent) MouseListener mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mouseClicked(MouseEvent) WindowListener windowClosing(WindowEvent) windowOpened(WindowEvent) windowIconified(WindowEvent) windowDeiconified(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 239 - i580 – Java Programming Registro do listener • Cada tipo de evento possui um método add...Listener correspondente que é usado para registrar um objeto ouvinte (listener). MinhaClasseListener meuListener = new MinhaClasseListener(); //registro de evento: especifica o tipo e o objeto ouvinte botao.addActionListener(meuListener); // Após o registro, o objeto que meuListener referencia //estará ouvindo eventos, isto é, será notificado quando //um evento ocorrer. italic = new JCheckBox( "Italico" ); ... c.add( italic ); CheckBoxHandler cbh = new CheckBoxHandler(); italic.addItemListener( cbh ); - 240 - Dependendo do tipo de evento que pode ser gerado pelo componente, ele possuirá o método addXXXListener() correspondente para que listeners possam ser registrados. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 240 - i580 – Java Programming Objetos GUI e seus Eventos Tipo A A C C F It K M M T W c d m n o m e o M x in t j p t c y u t Button x x x x x x Canvas x x x x x Checkbox x x x x x x CheckboxMenuIt. x Choice x x x x x x Component x x x x x Container x x x x x x - 241 - Button – Botão gráfico Canvas – Painel usado para desenho Checkbox – Componente que permite ao usuário selecionar um item CheckboxMenuItem – Checkbox dentro de um menu Choice – Combobox Component – Pai de todos os componentes AWT, exceto menus Container – Pai de todos os componentes que podem conter outros TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 241 - i580 – Java Programming Objetos GUI e seus Eventos Tipo A A C C F It K M M T W c dj m n o m e o M x in t p t c y u t Dialog x x x x x x x Frame x x x x x x x Label x x x x x x x x x x x List x MenuItem x Panel Scrollbar x x x x x x x x x x x x - 242 - Dialog – Cria diálogos modais Frame – Representa uma janela Label – Componente que mostra uma string que não pode ser alterada pelo usuário List – Contém um conjunto dinâmico de itens MenuItem – Item dentro de um menu Panel – Container básico usado para criar layouts complexos Scrollbar – Permite que o usuário selecione um valor a partir de um intervalo de valores TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 242 - i580 – Java Programming Objetos GUI e seus Eventos Tipo A A C C F It K M M T W c dj m n o m e o M x in t p t c y u t ScrollPane x x x x x x TextArea x x x x x x x x x x x x x x x x x x TextField Window x x - 243 - ScrollPane – Classe Container que implementa scroll horizontal e/ou vertical automático para um componente filho. TextArea – Componente que permite ao usuário entrar com um bloco de texto. TextField – Componente que permite ao usuário entrar com um linha de texto. Window – Classe base de todas as janelas TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 243 - i580 – Java Programming Exercício • Implementar os eventos do JExplorer. – O usuário digita um nome de diretório no TextField e dá enter (ActionListener). – O sistema preenche a lista com os arquivos contidos no diretório. – O usuário clica uma vez em um item da lista (ItemListener). – O sistema abre o arquivo e o exibe no TextArea. - 244 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 244 - i580 – Java Programming O que já aprendemos?  UA 1 – Fundamentos.  UA 2 – Orientação a Objetos.  UA 3 – Tratamento de Erros.  UA 4 – Classes Úteis.  UA 5 – Desenho de Telas.  UA 6 – Estruturas de Dados. - 245 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 245 - i580 – Java Programming 6 – Estruturas de Dados Unidade de Aprendizado - 246 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 246 - i580 – Java Programming 6 – Estruturas de Dados Você aprenderá: • Coleções. • Persistência em Bancos de Dados. - 247 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 247 - i580 – Java Programming 6.1 – Coleções Bloco de Construção do Aprendizado - 248 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 248 - i580 – Java Programming 6.1 – Coleções • • • • • Você aprenderá: Framework de Coleções. Interfaces. Classes. Generics. For Each. - 249 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 249 - i580 – Java Programming Framework de Coleções • Coleção é um objeto que contém múltiplos elementos. • Também é chamada de container. • Nas versões anteriores ao Java 2, existiam alguns recursos para agrupar objetos: – array, Vector, Hashtable, Enumeration • Apesar de já existirem estes recursos, eles não estavam integrados. - 250 - Uma coleção é um recipiente de objetos usado para armazenar, recuperar e manipular múltiplos elementos. Em versões anteriores o Java já fornecia recursos básicas para manipulação de conjuntos como: array, Vector, Hashtable, Stack, BitSet e Enumeration. Estes recursos funcionavam em separado, não fazendo parte de um Framework ou arquitetura comum. Por este motivo a tarefa de migrar de um para outro (principalmente Vector e Hashtable) não era uma tarefa muito fácil. Estes elementos foram integrados ao framework de coleções do Java 2, mantendo seus métodos antigos e ganhando os métodos novos. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 250 - i580 – Java Programming Framework de Coleções • Arquitetura unificada para manipulação de coleções: – Interface: representação abstrata de uma coleção, permitindo que coleções seja usadas independente dos detalhes de sua implementação. – Implementação: implementação das interfaces, são as estruturas de dados reutilizáveis. – Algoritmos: métodos que executam tarefas úteis, como classificação e busca. Permitem a reutilização da funcionalidade. - 251 - O framework de coleções é uma arquitetura unificada para manipulação de coleções e pode ser dividida em três partes básicas. Interface: representação abstrata de uma coleção, permitindo que coleções seja usadas independente dos detalhes de sua implementação. Este formato é essencial para certos tipos de aplicação como por exemplo aplicações distribuídas onde o cliente não deve ou não pode conhecer os detalhes de implementação de uma determinada coleção mas mesmo assim precisa utilizá-la para efetuar o seu processamento. Implementação: é o conjunto de classes que implementam as interfaces. Cada classe possui uma característica própria como por exemplo: acesso indexado, proibição de elementos duplicados, ordenação de elementos, etc. Algoritmos: métodos que executam tarefas úteis, como classificação e busca. Permitem a reutilização da funcionalidade entre os vários tipos de coleções pois são polimórficos. Entre as classes que possuem este tipo de métodos destacam-se Collections e Arrays. Utilizar um Framework ao invés de classes isoladas traz as seguintes vantagens: Reduz o esforço de programação Aumenta a qualidade e velocidade do programa Permite compatibilidade entre diferentes APIs Reduz o esforço de se aprender novas APIs. Reduz o esforço de se projetar novas APIs Incentiva a reusabilidade com o uso de polimorfismo A utilização de framework não é novidade, a linguagem C++ possui a STL (Standard Template Library) TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 251 - i580 – Java Programming Interfaces • Interfaces que formam a base do Framework: - 252 - A base do framework são suas interfaces. Elas definem os métodos genéricos necessários para a criação de novas classes e/ou utilização das classes existentes. As interfaces base do framework de coleções são: Collection, Set, List, SortedSet, Map, SortedMap, Iterator, ListIterator, Comparable, Comparator. Collection é a base de todo o framework. Ela define um conjunto de métodos básicos para uso com qualquer tipo de coleção. Set não permite valores duplicados. SortedSet ordena seus valores. List representa uma lista encadeada comum. Map contém chaves associadas a valores, a partir de uma chave pode-se encontrar o valor correspondente. SortedMap mantém seus elementos ordenados. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 252 - i580 – Java Programming Interface Collection • É a interface base da hierarquia, a mais genérica de todas. • Não existe classe que implemente diretamente esta interface. • Todas as classes implementam interfaces que herdam desta. • Ela é utilizada principalmente para passar coleções quando for necessária máxima generalização. - 253 - Operações Básicas: size() isEmpty() contains(...) add() remove(...) iterator() Conversões: toArray() toArray(...) Operações de Volume containsAll(...) addAll(...) retainAll(...) removeAll(...) clear() TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 253 - i580 – Java Programming Interface Set • Esta interface é uma Collection que não pode ter elementos duplicados. • Ela herda todos os métodos de Collection e não possui nenhum método adicional. • Duas classes Java de coleções implementam esta Interface: HashSet e TreeSet. • Usa-se a primeira quando desempenho nas leituras for importante e a segunda para manutenção de dados (inserção e alteração). - 254 - O exemplo abaixo mostra a ordenação de um conjunto de strings: Set lista = new TreeSet(); lista.add("Maria"); lista.add("Ana"); lista.add("Pedro"); lista.add("João"); for (String pessoa: lista) System.out.println(pessoa); Set produtos = new TreeSet(); produtos.add(new Produto("Incidente em Antares", 25, 100 )); produtos.add(new Produto("Os Ratos", 20, 20)); produtos.add(new Produto("Auto da Compadecida", 15, 200 )); for (Produto produto: produtos) System.out.println(produto); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 254 - i580 – Java Programming Interface List • É uma Collection que contém elementos indexados e também conhecida como seqüência. • Pode conter elementos duplicados. • Possui alguns métodos adicionais com relação a Collection: acesso posicional, busca, iteração e operações em sublistas. - 255 - Além dos métodos de Collection, temos: Object get(int índice) Object set(int índice, Object o) void add(int índice, Object o) Object remove(int índice) boolean addAll(int índice, Collection c) int indexOf(Object o) int lastIndexOf(Object o) ListIterator listIterator(int índice) ListIterator listIterator() List subList(int from, int to) Duas classes de coleções implementam a interface List: LinkedList e ArrayList. A primeira representa uma lista duplamente encadeada, a segunda um array dinâmico. Um ArrayList é muito mais rápido pois não precisa alocar novo nó para cada elemento e tem acesso constante a qualquer elemento. Um LinkedList deve ser usado quando for freqüente a iteração, adição ou deleção de elementos do interior da lista TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 255 - i580 – Java Programming Classe ArrayList • Representa um vetor dinâmico. • Esta é a implementação mais eficiente de uma lista e é semelhante a classe Vector com a diferença que ela não funciona adequadamente quando é compartilhada por vários processos. • Caso seja necessária o compartilhamento use Vector. - 256 - List lista = new ArrayList(); lista.add("Eça de Queiroz"); lista.add("Guimarães Rosa"); // Java 1.4 e inferior System.out.println(); for (int i = 0; i < lista.size(); i++) System.out.println(lista.get(i)); // Java 5 e superior System.out.println(); for (String autor: lista) System.out.println(autor); // Existe Machado de Assis? System.out.println(); int pos = lista.indexOf("Machado de Assis"); System.out.println(pos); // Existe Eça de Queiroz? System.out.println(); pos = lista.indexOf("Eça de Queiroz"); System.out.println(pos); TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 256 - i580 – Java Programming Classe Hashtable • Conjunto de elementos que mapeia chaves para valores. • Múltiplos elementos com a mesma chave são permitidos, neste caso a busca é seqüencial. • No Java 2 esta classe foi reimplementada como Map. - 257 - Métodos mais importantes: Inserção de Elementos put(...), putAll(...) Recuperação de Elementos get(...), elements(), values(...), entrySet() Recuperação de chaves keys(), keySet() Remoção de Elementos remove(...) Pesquisa contains(...), containsValue(...), contaisKey(...) TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 257 - i580 – Java Programming Generics • Todas as coleções devem ser declaradas e inicializadas com a indicação do tipo de objeto que será armazenado nelas. • Para isso, colocamos uma tag na declaração da coleção e também junto ao construtor da classe. ArrayList alunos = new ArrayList(); • Essa instrução leva a vários benefícios: – Segurança de tipos bem definidos. – Alocação otimizada de memória. – Uso do For Each, - 258 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 258 - i580 – Java Programming For Each • É possível implementar iterações a fim de obter os elementos de uma coleção através da estrutura de controle for. ArrayList alunos = new ArrayList(); ... for(Aluno aluno : alunos) { System.out.println(aluno.getNome()); } • A cada iteração cada elemento da lista será atribuído à variável de controle. - 259 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 259 - i580 – Java Programming 6.2 – Persistência em Bancos de Dados Bloco de Construção do Aprendizado - 260 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 260 - i580 – Java Programming 6.2 – Persistência em Bancos de Dados Você aprenderá: • • • • • • • O que é JDBC? Conexão com BD. SQL Exception. Interface Statement. Interface PreparedStatement. Interface ResultSet. Fechando as Conexões. - 261 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 261 - i580 – Java Programming O Que é JDBC? • Conjunto de classes e interfaces independentes de fabricante para conexão a bancos de dados. • É composto pelo pacote java.sql. • Utiliza um driver para conectar a aplicação a um ou mais servidores de BD, executa consultas SQL e opera os resultados. - 262 - JDBC significa Java Database Conectivity. É um conjunto de classes e interfaces escritos em Java que tornam possível escrever aplicações que acessem bancos de dados. É semelhante a tecnologia ODBC da Microsoft. Utilizando um driver JDBC você pode se conectar a um ou mais servidores de banco de dados de forma a executar comandos SQL e trabalhar com os resultados retornados, se for o caso. O driver JDBC é implementado como uma API de baixo nível de modo que todo fornecedor de banco de dados possa implementar uma versão específica para o seu produto que seja mais amigável de se trabalhar e até mais poderosa (no que tange ao produto específico). Essa API está incluída no package java.sql, que faz parte do JDK a partir da versão 1.1.7. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 262 - i580 – Java Programming O Que é JDBC? JDBC é uma abstração do banco de dados - 263 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 263 - i580 – Java Programming O Que é JDBC? • Carga do driver na memória. • Criação da conexão usando o DriverManager. • Uso da conexão para acessar o banco de dados: • • • • Create = criar registros no banco de dados. Retrieve = obter registros do banco de dados. Update = atualizar resgistros no banco de dados. Delete = excluir registros do banco de dados. - 264 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 264 - i580 – Java Programming Conexão com BD • O “driver” uma classe que aponta para uma biblioteca de classes “pares” das interfaces definidas no JDBC. • Essas bibliotecas são distribuídas em arquivos JAR, permitindo que sejam utilizadas nas nossas aplicações. • O arquivo JAR precisa ser colocado no CLASSPATH da aplicação. - 265 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 265 - i580 – Java Programming Conexão com BD • Utilizaremos o driver JDBC-ODBC Bridge que já se encontra na instalação do JDK. • Precisamos carregar o driver na memória para que o DriverManager possa reconhecer e criar a conexão. Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); ou DriverManager.registerDriver (new JdbcOdbcDriver()); e então Connection con = DriverManager.getConnection(“url”, "user", "pwd"); A primeira opção é preferível por causa da string que pode ser passada como parâmetro - 266 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 266 - i580 – Java Programming Conexão com BD • “url” = Uniform Resource Locator – string que identifica o protocolo de comunicação com o banco de dados. jdbc:: String url = “jdbc:odbc:NorthwindDSN”; • “user” = nome do usuário do banco de dados. • “pwd” = senha do usuário do banco de dados. Esses parâmetros devem ser obtidos via arquivo de properties - 267 - O JDBC usa uma URL (Uniform Resource Locator) para identificar a conexão ao banco de dados. O JDBC URL é uma estrutura bastante flexível, permitindo que o desenvolvedor do driver especifique o que deve ser incluído na URL. Cada URL irá ser diferente para cada banco de dados. A sintaxe genérica é descrita abaixo: jdbc é o protocolo utilizado e todas as URLs iniciarão com esse protocolo. é o nome do driver ou do mecanismo de conexão ao banco de dados. Os desenvolvedores de driver registram seus subprotocolos com a Sun JavaSoft para assegurar que esse nome seja único. identifca efetivamente o banco de dados. É passada um String que é de implementação dos desenvolvedores de driver. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 267 - i580 – Java Programming Interface Connection • Representa uma conexão com um banco de dados. • A informação sobre a conexão pode ser obtida usando o método getMetaData. • É usada para criar comandos SQL a serem enviadas para o banco de dados. • Oferece suporte a transações. - 268 - A interface Connection representa uma conexão com um banco de dados. Através de um objeto do tipo Connection podemos criar comandos SQL que serão enviadas para o banco de dados (será visto no próximo bloco de construção do aprendizado). Podemos retornar informação acerca de uma conexão usando o método getMetaData(). Esse método retorna um objeto do tipo DatabaseMetaData com os dados necessários. Uma nova conexão está sempre no modo auto-commit, significando que, quando uma instrução SQL for executada, o método commit() será chamado automaticamente. Usando o método setAutoCommit() passando false como parâmetro inabilitamos o modo auto-commit fazendo com que seja obrigatória uma chamada ou ao método commit() ou ao método rollback() para validar ou desfazer as instruções constantes da transação. Há também suporte a níveis de isolamento de transação (método setTransactionIsolation()). O suporte a transações depende do banco de dados utilizado. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 268 - i580 – Java Programming SQLException • Classe do pacote java.sql e do tipo “Checked Exception”. • Métodos importantes: – getMessage = String descrevendo o erro – getErrorCode = Código específico do BD – getSQLState = Instrução SQL que deu erro - 269 - Quando estamos usando JDBC todos os métodos que fazem acesso à base de dados lançam a exceção SQLException. Ela é do tipo checked exception. A exceção contém uma série de métodos que nos auxiliam no tratamento de erros. Os mais importantes são: getMessage() – Retorna um String descrevendo o erro ocorrido; getErrorCode() – Retorna um código específico do banco de dados que está sendo utilizado; getSQLState() – Retorna a instrução SQL que deu erro. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 269 - i580 – Java Programming Interface Statement • Envia comandos SQL para o banco de dados. Necessita de uma conexão ativa. Statement consulta = conexao.createStatement(); • O objeto Statement existe mas ainda não possui nenhum comando SQL associado. • Só aceita comandos SQL simples, sem parâmetros. - 270 - Um objeto Statement envia comandos SQL para o banco de dados. Necessita, para ser criado, de uma conexão ativa para que possamos executar o método createStatement() da conexão desejada. Repare que Statement é uma interface e que a criação do objeto é feita na chamada do método createStatement(). A coisa é feita dessa forma de modo que a implementação fique a cargo do fornecedores de bancos de dados. Após a execução de createStatement temos um objeto Statement que não possui nenhuma consulta associada. Logo, ainda não podemos utilizá-lo. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 270 - i580 – Java Programming Interface Statement • Método executeQuery é usado para consultas que retornam resultados. String sql = “select * from livros”; ResultSet rs = consulta.executeQuery(sql); • O resultado da consulta vem em um objeto do tipo ResultSet. - 271 - Para consultas que podem retornar registros como resultado (caso de uma instrução SELECT) utiliza-se o método executeQuery() do objeto Statement para enviá-la ao banco de dados. O resultado dessa consulta vem dentro de um objeto ResultSet, que será estudado no próximo bloco de construção do aprendizado. Caso já tenha sido feita uma outra consulta no objeto Statement, o objeto ResultSet anterior será fechado. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 271 - i580 – Java Programming Interface Statement • Método executeUpdate é usado para consultas DML, INSERT, UPDATE e DELETE e comandos DDL. String sql = “delete from vendas”; int totalApagados = consulta.executeUpdate(); • O resultado da consulta retorna um int cujo valor é o número de linhas afetadas. DML = Data Modeling Language DDL = Data Definition Language - 272 - Para executar comandos SQL que atualizem (UPDATE), insiram (INSERT), apaguem (DELETE) ou criem objetos no banco de dados (comandos DDL como CREATE TABLE), usamos o método executeUpdate() do objeto Statement. O método retorna um número inteiro que pode ser igual ao número de linhas afetadas (no caso de comandos UPDATE, INSERT ou DELETE) ou igual a 0 para declarações DDL que não alteram nenhum registro. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 272 - i580 – Java Programming Interface Statement • Método execute é usado quando a consulta retorna um ResultSet, ou um indicador de linhas afetadas. String SQL = ...; boolean ehConsulta = consulta.execute(SQL); • Retorna true se o resultado é um ResultSet, false se é um int. - 273 - Geralmente, o método execute() do objeto Statement é mais utilizado quando não sabemos, em tempo de compilação, qual será o comando SQL executado. Os múltiplos resultados, apesar de não serem comuns, podem acontecer. O método execute() retorna um valor booleano que indica o tipo de resultado, e por conseguinte, qual é o tratamento que devemos dar. Se o retorno for igual a true, significa que há um objeto do tipo ResultSet disponível. Para recuperar esse objeto, usamos o método getResultSet() do objeto Statement. Caso o valor de retorno seja false, indica que a consulta retornou o número de linhas afetadas e que temos que utilizar o método getUpdateCount() do objeto Statement para recuperá-lo. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 273 - i580 – Java Programming Interface PreparedStatement • Trabalha com declarações SQL pré-compiladas. • É subclasse de Statement. • Usado para declarações que serão executadas mais de uma vez, alterando apenas valores da consulta. PreparedStatement ps = conexao.prepareStatement(“update livros set preco = ? where cod_livro = ?”); - 274 - PreparedStatement é mais eficiente do que Statement porque ele é compilado uma única vez, no momento da preparação do objeto (exemplo do slide). Os parâmetros são passados cada vez que a consulta vai ser executada, sendo cada um deles indicados por um sinal de interrogação (vide novamente o exemplo do slide). TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 274 - i580 – Java Programming Interface PreparedStatement • Depois de preparada devemos passar os valores para cada um dos parâmetros. ps.setDouble(1, 35.00); ps.setString(2, “08037-9383”); • E em seguida executamos a consulta usando um dos métodos abaixo: ps.executeQuery(); ps.executeUpdate(); - 275 - Existem vários métodos setXXX para fornecer os valores a cada uma das variáveis da nossa PreparedStatement, sendo XXX substituída pelo tipo da variável em questão. Repare também que o índice começa a contar da posição 1 e não da posição zero como nos arrays e outras estruturas existentes em Java. Se fecharmos um PreparedStatement deveremos prepará-lo de novo antes de utilizá-lo. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 275 - i580 – Java Programming Interface ResultSet • Armazena os resultados das consultas realizadas. • Mantém um cursor apontando para o registro de dados atual. • Com o método next podemos andar pelo conjunto resultado linha a linha. • Utilizamos os métodos get... para recuperar os valores. - 276 - Há duas versões dos métodos getXXX() que recuperam os valores: uma em que se especificam as colunas por números, iniciando no número 1, e outra em que se especificam as colunas pelos seus nomes. Nesse caso não é feita distinção entre letras maiúsculas e minúsculas. O método findColumn() retorna o número de uma coluna dado o seu nome. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 276 - i580 – Java Programming Interface ResultSet ... while (rs.next()) { String cod_livro = rs.getString(“CODIGO”); String nome_livro = rs.getString(“NOME”); double preco = rs.getDouble(“PRECO”); ... } - 277 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 277 - i580 – Java Programming Fechando as Conexões • Após o uso, devemos fechar todos os objetos ResultSet e Statement a fim de limpar a memória e liberar cursores do banco de dados. ... rs.close(); consulta.close(); conexao.close() ... É importante fechar as conexões para não saturar o banco de dados - 278 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 278 - i580 – Java Programming Data Transfer Objects DTOs representam estruturas de dados - 279 - Data Transfer Objects são objetos que representam os dados necessários para uma determinada tarefa. Ao invés de executar diversas chamadas para recuperar dados, é feita uma única chamada que retorna todos os dados de uma vez. O principal objetivo deste padrão é melhorar o desempenho (em termos de tráfego de rede) da aplicação. Uma conseqüência interessante de sua utilização é a melhor organização do sistema, já que é mais fácil entender um código que utiliza um objeto do que outro que faz inúmeras chamadas, buscando vários dados separados. DTOs não precisam necessariamente possuir todos os dados de uma classe de negócio correspondente. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 279 - i580 – Java Programming Exemplo: Banco Money - 280 - Na figura acima a classe ClienteDTO é utilizada no momento do depósito para retornar as primeiras quinze letras do nome do titular de uma determinada conta. Como este é o único dado do cliente necessário para a tarefa, os demais não são incluídos no DTO. A classe ContaCorrenteDTO é usada para as operações de depósito, saque e consulta ao saldo e possui os atributos necessários para a execução desta atividade. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 280 - i580 – Java Programming Data Access Object DAOs encapsulam o acesso ao banco de dados - 281 - Através deste padrão de projeto, é possível separar a interface de um recurso de sistema da estratégia de acesso interna usada para acessar o recurso. O objetivo é ter independência na escolha do banco de dados a ser usado e na representação dos dados. Fornece uma API de operações sobre o recurso que simplesmente sabe como se carregar a partir de um armazenamento persistente baseada em alguma informação (chave primária, o nome de um arquivo, etc.), sabe como se armazenar, etc. Esse padrão dá maior flexibilidade no deployment da aplicação pois é possível configurar os dados em tempo de execução, voltado para um banco de dados em particular, já que não há uma amarração em um vendedor ou tipo de banco de dados específico. Outra vantagem desse padrão é a possibilidade de passar para um ambiente diferente (EJB, Hibernate, etc) visto que os objetos DAO encapsulam a lógica de persistência do negócio. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 281 - i580 – Java Programming Banco Money Que tal padronizar os mé métodos dos DAOs usando uma interface? - 282 - Na figura acima a classe ContaCorrenteDAO implementa o acesso aos dados através de vários métodos de busca, inserção, remoção e atualização de dados. Estes métodos utilizam duas classes: Conexao: classe que efetua a conexão com o Banco de Dados. Representa o pacote de persistência da figura da página anterior. Existem muitas maneiras de controlar conexões abertas mas neste exemplo cada método abre uma conexão (com uma solicitação a classe Conexao), executa suas tarefas, fecha a conexão e retorna. ContaCorrente: é a classe que representa o “Data Object” da figura da página anterior. É usada pelo DAO de diversas maneiras: os métodos de busca instanciam objetos desta classe e os utilizam como retorno. Os métodos inserir, atualizar e remover recebem objetos desta classe como parâmetros com o objetivo de extrair os dados e executar os comandos SQL adequados. A classe ContaCorrenteDAO é usada por classes de controle. Por exemplo, a classe Principal (do diagrama MVC) pode chamar o método atualizar de ContaCorrenteDAO em resposta a uma operação de saque confirmada pelo cliente. TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 282 - i580 – Java Programming Exercício • Implementar a TelaCadastro criando as seguintes classes: – FabricaDeConexoes (tem um método estático obter que retorna uma Connection). – Contato (DTO). – ContatoDAO. • Implemente os métodos inserir e listar na classe ContatoDAO. - 283 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 283 - i580 – Java Programming O que já aprendemos?  UA 1 – Fundamentos.  UA 2 – Orientação a Objetos.  UA 3 – Tratamento de Erros.  UA 4 – Classes Úteis.  UA 5 – Desenho de Telas.  UA 6 – Estruturas de Dados. - 284 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 284 - i580 – Java Programming Referências Unidade de Aprendizado - 285 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 285 - i580 – Java Programming Livros • • • • Use a Cabeça: Java Programming Java: Como Programar (Deitel & Deitel) Core Java, volumes 1 e 2 SCJP: Certificação Sun para Programador Java 5 Guia de Estudo - 286 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 286 - i580 – Java Programming Sites • Página do curso: www.infnet.com/moodle • Tutorial Sun sobre Java: http://java.sun.com/docs/books/tutorial/index.html • Java Ranch: http://www.javaranch.com • Grupo de usuários Java: http://www.guj.com.br • Portal Java: http://www.portaljava.com.br - 287 - TODOS OS DIREITOS SÃO RESERVADOS PELO INSTITUTO DE FORMAÇÃO INTERNET – versão 1 – - 287 -