Introdução Java é uma linguagem multiplataforma (sistema operacional), desenvolvida atualmente pela Oracle, que permite desenvolver aplicações web e desktop. Java 2 Standard Edition (J2SE) é um conjunto de ferramentas necessárias para o desenvolvimento de aplicações Java. Se olharmos para o mercado de trabalho nos últimos anos, veremos que o JAVA é a uma das linguagens que mais tem se destacado, além de ter em seu histórico o excelente nível de remuneração obtido por seus utilizadores, bem como a constante oferta de vagas na área. Após a conclusão do curso de Java SE, o aluno estará apto a desenvolver programas nessa linguagem, utilizando a plataforma J2SE e o banco de dados MySql. Apresentação do Curso de Java JSE O Curso de Java JSE é dividido em 4 partes. 1ª Parte Conteúdo: Preparação do Ambiente. Sintaxe – Variáveis. Sintaxe – Operadores. 2ª Parte Conteúdo: Sintaxe – Controle de Fluxo. Sintaxe – Vetores e Coleções. Orientação a Objetos - Básico. 3ª Parte Conteúdo: Orientação a Objetos - Avançado. Principais Classes do Java. Manipulação de Arquivos. 4ª Parte Conteúdo: Banco de Dados. Telas Gráficas. Avaliação Final. Plataforma Java Java não é apenas uma linguagem, é uma plataforma dividida em vários componentes. Cada componente tem sua funcionalidade, por exemplo, a JVM (Java Virtual Machine) permite que os programas em Java rodem em diferentes ambientes (Sistemas operacionais). Ela é um tipo de tradutor de código Java para instruções específicas para cada sistema operacional A tecnologia Java foi lançada em 1995 e, desde então, tem crescido em popularidade e se tornado uma plataforma muito estável e madura. Principais Divisões da Plataforma Java A plataforma Java é dividida em: J2SE (Java 2 Standard Edition). J2EE (Java 2 Enterprise Edition). J2ME (Java 2 Micro Edition). Java Web Services. JavaFx Plataforma J2SE J2SE é uma plataforma que oferece um completo ambiente para o desenvolvimento de aplicações para clientes e servidores. A plataforma J2SE é também a base das tecnologias J2EE e Java Web Services. A Oracle distribui aJ2SE na forma de um SDK (Software Development Kit) chamado de JDK (Java Developer Kit), em conjunto com uma JRE (Java Runtime Environment). O pacote do JDK da J2SE vem com ferramentas para compilação, debugging, geração de documentação (javadoc), empacotador de componentes (jar), etc. Já a JRE contém a JVM e outros componentes necessários para rodar aplicações Java. Plataforma J2EE A tecnologia J2EE não é um produto, mas sim uma especificação definida pela Oracle, que simplifica e padroniza as aplicações empresariais em multicamadas. Baseada nos componentes padronizados, modulares e reusáveis, oferece um conjunto completo de serviços para esses componentes; manipula muitos detalhes do comportamento da aplicação automaticamente; não precisa reaprender a programar, pois são utilizados os mesmos recursos da Java(J2SE). Além disso, roda em servidores de aplicações J2EE diferentes e padronizados pela Oracle Plataforma J2ME A tecnologia J2ME é voltada para aplicações que rodam em pequenos dispositivos como celulares, PDAs, controles remotos etc. Ela possui uma API completa para aplicações para dispositivos móveis. o desenvolvimento de Java Web Services Os Web Services são aplicativos baseados em XML utilizados na internet para permitir a troca de informações entre clientes. Em Java, os Web Services são desenvolvidos utilizando as API da Java, mais as ferramentas de um sistema chamado Metro, que consiste em uma junção de algumas especificações da Java. Agora, o Java Web Services não é muito utilizado porque está sendo substituído pelo servidor web GlassFish. JavaFx JavaFX é uma plataforma para criação de aplicativos ricos para a internet, a RIA (Rich Internet Applications). Para diferenciar das demais plataformas RIA, a JavaFX permite criar aplicativos não somente para a web, mas também para desktop, celular, web e televisão digital. A compatibilidade de código entre as plataformas é de 80%, o que significa que seu código Desktop pode ser o mesmo que irá rodar no celular ( ou com pequenas alterações, em função do mesmo paradigma). Embora esteja na Plataforma Java, a JavaFx é considerada outra linguagem, já que utiliza a sintaxe declarativa como o Python, PHP, Ruby. JavaFx, por não ser conteúdo deste curso, não será detalhada. Execução de um programa em Java Um programa em Java é executado em um ambiente interpretado, que necessita da Java Virtual Machine (JVM). A JVM é uma máquina virtual, que emula uma máquina real. As classes são carregadas dinamicamente na JVM somente no momento em que forem necessárias. O código da JVM é armazenado em arquivos .class, cada um contendo código de, no máximo, uma classe pública. Existem JVMs para cada plataforma de software (Linux, Solaris, Windows). O códigoJava é sempre compilado para uma JVM que, por sua vez, executa na plataforma. A JVM implementa um mecanismo (o Garbage Colector) que faz automaticamente a Coleta de Lixo, ou seja, a exclusão da memória de referências a classes que não estiverem mais sendo usadas. O coletor de lixo é implementado através de uma thread em nível de sistema, que verifica a alocação da memória e: Verifica se existe memória que não é mais referenciada e a libera. Pode variar entre implementações de JVM. É executada automaticamente pela JVM sem controle do programador. Ambientes Integrados de Desenvolvimento Embora você possa programar em Java até em bloco de notas, é recomendável utilizar alguma ferramenta específica para desenvolvimento. Os ambientes integrados de desenvolvimento (IDE) possuem ferramentas para edição e execução das classes em Java. Alguns IDs permitem até a construção de interfaces gráficas. Entretanto, em geral, o código gerado é muito "poluído" e o programador deve saber como criar uma interface gráfica sem utilizar tais programas. Os principais IDEs utilizados atualmente são: Eclipse (http://www.eclipse.org) NetBeans (http://www.netbeans.com) IntelliJ Idea (http://www.componentsource.com/) JBuilder (http://www.embarcadero.com) JCreator (http://www.jcreator.com) Tanto o JBuilder, como o IntelliJ Idea são pagos. Já o Eclipse, o NetBeans e o JCreator são gratuitos. Dentre as gratuitos, o JCreator é o mais simples e com menos recursos para o desenvolvimento. O Eclipse e o Netbeans, mesmo gratuitos, são excelentes ferramentas. Já o Eclipse é a ferramenta mais utilizada no mercado de trabalho, e será utilizada neste curso. Preparação do Ambiente de Desenvolvimento A preparação do ambiente de desenvolvimento consiste em duas partes: Instalação do JDK. Instalação do IDE. Instalação do JDK O primeiro passo para desenvolver programas em Java consiste em obter o Kit de Desenvolvimento Java. Esse kit é gratuito e o download pode ser feito no link: http://www.oracle.com/technetwork/java/javase/downloads/index.ht ml Na página que for carregada, clique no link Java Platform (JDK) 7: Depois, na página carregada, clique em Accept Agreement para liberar os links para download: License Para iniciar o download, clique no link correspondente ao seu Sistema Operacional. Após efetuar o download da J2SE 7 JDK, clique duas vezes no arquivo baixado para iniciar a instalação. O processo é simples e não requer uma série complicada de passos, basta ir avançando até finalizar. Chame seu professor caso necessite instalar o programa. Após instalar o JDK, você poderá instalar o Eclipse. Instalação do Eclipse O Eclipse é um ambiente integrado de desenvolvimento, gratuito, que permite personalizar totalmente o ambiente de acordo com o projeto que está sendo desenvolvido, seja para plataforma WEB ou Desktop. Além disso, permite a instalação de plugins que trabalham integrados a ele. Em sua versão básica, o Eclipse já traz alguns plugins (que podem ser chamados de plugins básicos), dentre eles destaca-se a integração com o Ant e com o CVS. Para obter uma cópia do Eclipse, acesse http://www.eclipse.org/downloads/ e baixe o Eclipse IDE for Java Developers: Inicie o download: Não é necessário instalar o Eclipse, basta desempacotar, no local da sua preferência, a estrutura de diretórios e arquivos: Por uma questão de organização, o diretório da instalação do Eclipse deve ficar em uma pasta Java na raiz do computador: Para executá-lo, basta clicar duas vezes em eclipse.exe, contido na pasta do Eclipse recém-desempacotado. É recomendável criar um atalho na área de trabalho. Configurações Iniciais do Eclipse Crie, para este curso, os diretórios de trabalho de acordo com a seguinte estrutura: Assim os arquivos gerados ao longo do curso ficarão mais organizados. Iniciando o Eclipse Dê um duplo clique no arquivo eclipse.exe: Área de trabalho ou Workspace é o local onde os arquivos do projeto ficarão guardados, por padrão. Selecione o caminho criado acima. Após clicar no botão OK, a seguinte tela de apresentação deverá aparecer: Feche a janela Welcome, clicando no botão fechar, bem na aba perto do menu. Criando um Projeto Java Selecione no menu File -> New -> Java Project: Nomeie este projeto como projeto1: Preencha os demais dados, conforme a imagem acima e clique no botão Next: Nessa tela você pode configurar o projeto. No momento, não modifique nada. Clique apenas em Finish. A tela inicial do projeto será apresentada: Trabalhando com Pacotes Dentro da janela do Package Explorer, clique com o botão direito do mouse sobre o nome do projeto. Escolha a opção New>Package: O que é um Pacote? Um pacote (package) nada mais é do que diretórios onde serão guardados os arquivos do projeto (as classes, por exemplo). A caixa de diálogo abaixo será exibida: Em Name, preencha br.com.aprendamais.part1, imagem acima e clique emFinish para criá-lo. conforme a Obs: Repare que foi atribuído ao pacote o nome: Por convenção, para nomes de pacotes, é utilizado o domínio ao contrário e sempre em letra minúscula. Trabalhando com Classes Na Janela do Package Explorer, em cima do nome do pacote, clique com o botão direito do mouse. Selecione New -> Class, conforme a imagem abaixo: A seguinte caixa de diálogo será exibida: Obs: Por convenção, para nomes de classes, a primeira letra deve ser maiúscula. Clique em Finish para criar a classe: Classe criada: Configurando o Eclipse Para exibir o número de menu Window -> Preferences: linhas no Eclipse, clique no Em General -> Editors -> Text Editors, marque a caixa Show line numbers: Clique no botão OK, para exibir a tela do Eclipse com linhas numeradas: Agora entenda o código. Introdução à Programação Observe que o próprio Eclipse já criou a estrutura de uma classe, a partir de um de seus templates (modelos). Ele contém: Pacote (Package) Na linha 1 está a informação do pacote. Classe Na linha 3 está a declaração da classe. Observe que a classe tem um corpo (ou bloco). O bloco da classe iniciou na linha 3 e terminou na linha 13. Um bloco inicia com o caractere { (chave aberta) e termina com o caractere } (chave fechada). Todo método (procedimento ou função) deve ser criado dentro do bloco da classe, ou seja, entre as linhas 3 e 13. Comentários utilizados na documentação Nas linhas 5 a 7 foram inseridos comentários, utilizados para a criação da documentação doJava (Javadoc). Mais adiante os comentários serão explicados. Método main Na linha 8 inicia o método main, que termina na linha 11. As palavras public, static e void são palavras-chave e serão explicadas adiante. O método main tem um Array de Strings. Arrays também posteriormente. como serão parâmetro abordados O método main é o mais importante do projeto porque inicia a execução. Uma classe sem o métodomain não é executável. Inserindo instruções Agora insira algumas instruções no método main: Na linha 9 foi declarada a variável chamada curso, do tipo String, e atribuída à ela um texto ("Treinamento JSE"). Na linha 11 foi criada uma instrução para imprimir o valor da variável curso. Declarações de variáveis serão abordadas mais à frente. Obs: Toda instrução em Java deve estar dentro de algum método. O termo método significa algum procedimento ou função criada dentro de uma classe. Em Java, qualquer procedimento ou função só pode ser criado dentro de uma classe. Por isso, sempre será utilizada a palavra método. Executando a classe pela primeira vez Para executar a classe, selecione o menu Run -> Run: Aparecerá a seguinte caixa de diálogo, solicitando que a classe seja salva: Clique em OK. A classe será executada e o resultado será: Executando novamente a mesma classe: Para executar novamente, basta clicar no menu Run-> Run; ou simplesmente utilizar o atalho Ctrl+ F11. Fundamentos da linguagem Java Variáveis e operadores são os blocos básicos de um programa. Na prática, literais, variáveis e operadores são combinados para formar expressões, que são segmentos de código que realizam tarefas e retornam valores. Certas expressões podem estar dentro de instruções, que são unidades completas de execução. Para criar um bloco de código, basta colocar as instruções entre { } chaves. As expressões executam as tarefas de um programa. Entre outras coisas, expressões são utilizadas para computar e atribuir valores a variáveis e ajudar a controlar o fluxo de execução do programa. Em resumo, uma expressão tem duas finalidades básicas: Efetuar as operações indicadas pelos elementos expressão. Retornar um valor que é o resultado da operação. da Obs: Embora Java aceite, nunca se deve utilizar acentuação em identificadores. Identificadores são os nomes de classes, métodos, variáveis etc.. Comentários Comentários são textos inseridos no código e desprezados pelo compilador. Normalmente os comentários são utilizados para "documentar" classes e métodos. Os comentários em Java podem ser por linha ou em bloco. Por linha: Por bloco: Obs: Evite inserir comentários em excesso no código. Normalmente, os comentários são colocados em um método com as seguintes informações: O que faz o método. Quais parâmetros ele recebe. O que o método devolve. Evite comentários deste tipo: Além de desnecessário, pois é obrigação de qualquer programador Java saber o significado do código, esse tipo de comentário prejudica a legibilidade e a manutenção do programa. Variáveis Uma variável é um espaço de memória, identificado por um nome para armazenar temporariamente alguma informação. Toda variável dever ter um nome válido (identificador) e um tipo de dado. O nome da variável deve ser um identificador válido, ou seja, uma sequência de caracteres iniciada por uma letra. O nome da variável é utilizado para se ter acesso aos dados que ela contém. O tipo da variável define os valores que podem ser adicionados a ela. Crie uma classe chamada Variaveis e digite na classe criada o seguinte código: Observe que foi declarada uma variável mes do tipo int e inicializada com o valor igual a 1: Em seguida seu valor foi impresso: Observações sobre variáveis Em Java, uma variável deve: Ser declarada antes de ser usada. Ter um tipo definido. Iniciar o valor da variável antes de usá-la. Ser usada dentro do escopo (bloco em que foi criada). Execute o código criado anteriormente, clicando no menu Run e escolhendo a opção Run. Código sendo executado: Tipos de Dados Toda variável deve ter um tipo de dado. O tipo determina os valores que a variável poderá conter e quais operações poderão ser realizadas com ela. A linguagem de programação Java contém dois tipos de variáveis: as variáveis primitivas e as variáveis por referência. As variáveis primitivas contêm valores simples, apropriadas ao tipo da variável. Tipos primitivos: Obs: É possível ter variáveis a partir de tipos construídos (uma classe, por exemplo). Exemplo: Onde String é uma classe e não um tipo primitivo. Crie uma classe chamada Variaveis2 e digite o exemplo de Tipos Primitivos: Os valores atribuídos às variáveis são chamados de valores literais. Obs.: Na instrução a seguir foi mandado imprimir o resultado da expressão ‘i: ’ + i Essa expressão está concatenando (juntando) o valor da string "i: " com o valor da variáveli, a qual foi atribuído o valor 9. Concatenar string com int não traz nenhum problema. Em Java, quando um dos lados for string, ele converte o outro lado (que é um tipo primitivo) de forma implícita para string. Valores literais Conheça alguns exemplos de valores literais, adequados a cada tipo de variável: Observações sobre tipos literais: Uma série de dígitos sem ponto, é tipada como um int. Para especificar um long, basta colocar o caractere ‘L’ ou ‘l’ após o número. Uma série de dígitos com ponto decimal é tipada como um Double. Para especificar um float, basta colocar o caractere ‘F’ ou ‘f’ após o número. Nomes de variáveis O nome de uma variável é composto por um simples identificador. As seguintes regras devem ser observadas: Deve começar com uma letra; os demais caracteres podem ser letras, números ou underline ( _ ). Não pode ser uma palavra-chave, um valor booleano (true ou false) ou a palavra reservada null. O nome da variável deve ser único em seu escopo (escopo da variável será abordado à frente). Convenções sobre nomes de variáveis O nome da variável deve começar com letra minúscula e os nomes de classes devem começar com letras maiúsculas. Se o nome da variável contiver mais de uma palavra, a primeira letra de cada palavra subsequente deve ser maiúscula. O underline ( _ ) deve ser utilizado apenas para separar as palavras em constantes, visto que, por convenção, todas as letras de uma constante estarão em letras maiúsculas. As palavras-chave não podem ser utilizadas como nome de variáveis Agora execute o código digitado: Palavras-Chave Modificadores de acesso private: visível apenas dentro da própria classe. protected: visível por classes e classes derivadas do mesmo pacote. public: visível à partir de qualquer classe, de qualquer pacote. Modificadores de classes, variáveis e métodos abstract: classe que não pode ser instanciada ou método que precisa ser implementado por uma subclasse não abstrata. class: especifica uma classe. extends: indica a superclasse que a subclasse está estendendo. final: impossibilita que uma classe seja estendida, que um método seja sobrescrito ou que uma variável seja reinicializada. implements: indica as interfaces que uma classe irá implementar. interface: especifica uma interface. native: indica que um método está escrito em uma linguagem dependente de plataforma, como o C. new: instancia um novo objeto, chamando seu construtor. static: faz um método ou variável pertencer à classe, ao invés de pertencer às instâncias. strictfp: usado na frente de um método ou classe para indicar que os números de ponto flutuante seguirão as regras de ponto flutuante em todas as expressões. synchronized: indica que um método só pode ser acessado por uma thread de cada vez. transient: impede a serialização de campos. volatile: indica que uma variável pode ser alterada durante o uso de threads. Controle de fluxo dentro de um bloco de código break: sai do bloco de código em que ele está. case: executa um bloco de código, dependendo do teste do switch. continue: pula a execução do código que viria após essa linha e vai para a próxima passagem do loop. default: executa esse bloco de código, caso nenhum dos testes de switch-case seja verdadeiro. do: executa um bloco de código uma vez e, então, realiza um teste em conjunto com o while para determinar se o bloco deverá ser executado novamente. else: executa um bloco de código alternativo, caso o teste if seja falso. for: usado para realizar um loop condicional de um bloco de código. if: usado para realizar um teste lógico de verdadeiro e falso. instanceof: determina se um objeto é uma instância de determinada classe, superclasse ou interface. return: retorna de um método, sem executar, qualquer código que venha depois dessa linha, podendo retornar um valor. switch: indica a variável a ser comparada nas expressões case. while: executa um bloco de código repetidamente até que certa condição seja verdadeira. Tratamento de erros assert: testa uma expressão condicional para verificar uma suposição do programador. catch: declara o bloco de código usado para tratar uma exceção. finally: bloco de código, após um try-catch, executado independentemente do fluxo de programa seguido ao lidar com uma exceção. throw: usado para passar uma exceção ao método que o chamou. throws: indica que um método pode passar uma exceção para o método que o chamou. try: bloco de código que tentará ser executado, mas que pode causar uma exceção. Pacotes import: importa pacotes ou classes para dentro do código. package: especifica os pacotes a que todas as classes de um arquivo pertencem. Tipos Primitivos boolean: um valor indicando verdadeiro ou falso. byte: um inteiro de 8 bits (signed). char: um caracter unicode (16-bit unsigned). double: um número de ponto flutuante de 64 bits (signed). float: um número de ponto flutuante de 32 bits (signed). int: um inteiro de 32 bits (signed). long: um inteiro de 64 bits (signed). short: um inteiro de 32 bits (signed). Referência super: refere-se à superclasse imediata. this: refere-se à instância atual do objeto. Retorno de um método void: indica que o método não tem retorno. Palavras reservadas não utilizadas const: Não utilize para declarar constantes, use public static final. goto: não implementada na linguagem Java por ser considerada prejudicial. Obs.: Vários termos e conceitos utilizados no resumo acima ficarão mais claros ao longo do curso. Escopo da variável O escopo da variável é a região, dentro do programa, onde a variável pode ser referenciada simplesmente pelo nome. O escopo define também quando a variável será criada e destruída na memória. Obs: Escopo é diferente de visibilidade, que se aplica apenas às variáveis da classe e tem a ver com a utilização da variável fora da classe. Categorias de Escopo Existem quatro categorias de escopo: Membro da Classe. Variável em nível de método. Variável local, visível apenas dentro de um bloco. Variável local passada como parâmetro. Crie a classe Escopo. Obs: No exemplo acima foi utilizado o try..catch, que será explicado nas próximas aulas. O exemplo acima teve como objetivo mostrar que a variável é visível somente dentro do bloco em que foi criada e nos blocos aninhados, se houver. Execute o código: Variável Final Você pode declarar a variável do tipo final em qualquer escopo. Depois de inicializada, o valor dessa variável não poderá mais ser alterado (de modo semelhante às constantes em outras linguagens). Para definir a variável como final basta utilizar a palavra-chave Final na declaração. Crie a classe VariavelFinal e digite o exemplo abaixo: Obs: Por convenção, uma variável final (constante) é nomeada sempre em letras maiúsculas. Se concatenar palavras, use o _ (underline). Execute o código criado: Fundamentos da linguagem Java Operadores Java é uma linguagem rica em operadores, sendo obrigação de todo programador Javaconhecer e utilizar os operadores corretamente. Leia, estude e refaça cada exemplo proposto para fixar os conceitos. Operadores de Atribuição O operador de atribuição (=) é utilizado basicamente para atribuir um valor para outro. Veja alguns exemplos abaixo: Obs: Observe que o tipo char é para apenas 1 caractere e o delimitador é o apóstrofo/aspas simples ( ’ ). Operadores Reduzidos A linguagem Java também tem uma série de operadores de atribuição reduzidos para executar tarefas. Exemplo: A instrução pode ser reduzida, utilizando += As duas instruções acima são equivalentes. Obs: Em Java, utilize sempre que possível os operadores reduzidos. Veja a seguinte tabela contendo os operadores reduzidos: Obs: Os operadores acima serão vistos em detalhes mais à frente. Tipos de Operadores Um operador executa uma função com um, dois ou três operandos. Operador Unário O operador que executa uma função com apenas um operando é chamado de operador unário. Por exemplo, ++ é operador unário, que incrementa o valor do operando em 1. Operador Binário O operador que executa uma função com dois operandos é chamado de operador binário. Por exemplo,= é operador binário que atribui, ao operador da esquerda, o valor do operador da direita. Categorias de Operadores Os operadores podem ser agrupados nas seguintes categorias: Operadores Aritméticos. Operadores Relacionais. Operadores Binários. Operadores de Atribuição. Outros Operadores. Operadores Aritméticos A linguagem Java suporta valores numéricos: vários operadores aritméticos para Crie a classe Aritmeticos e digite o exemplo de Operadores Aritméticos: Tipos Resultantes das Operações Aritméticas Observe que, quando um inteiro e um número real são usados como operandos , o resultado é um número real. Ou seja, o inteiro é convertido para um número real de forma implícita, antes de a operação ser executada. A seguir, resumo dos retornos, baseado nos tipos de dados dos operandos. Pós e Pré-Incremento e Decremento Os operadores reduzidos ++ (incrementa o operando de 1) e -(decrementa o operando de 1), podem aparecerem antes (préincremento) ou depois (pós-incremento). Quando o operador é colocado antes do operando, ++op/--op, o valor é alterado antes da utilização do mesmo. Quando o operador é colocado após o operando, op++/op--, o valor é alterado após a utilização do mesmo. Crie a classe OperadoresMatematicos e digite o exemplo abaixo: Resumo de Pós e Pré-Incremento e Decremento Operadores Relacionais O operador relacional compara dois valores e retorna um valor booleano dessa comparação Obs: Observe que o operador ! é equivalente ao not em outras linguagens (como, por exemplo, no PHP). Por exemplo, o operador para diferente != também pode ser chamado de não igual. Crie a classe Operadores Relacionais. Resultado: Operadores Condicionais Operadores relacionais podem ser utilizados em expressões mais complexas, através dos operadores Condicionais: Crie a classe OperadoresRelacionaisComplexos Resultado: Operadores bit a bit Operadores bit a bit quer dizer que as operações serão feitas no nível de bits. Fisicamente, não existem bytes; Byte é apenas uma definição para o conjunto de 8 bits. Tudo é armazenado no nível de bits. Por exemplo, a representação binária do número 13 é 1101. Mais adiante alguns exemplos demonstrarão como trabalhar no nível de bits. São duas as categorias de Operadores bit a bit: Operadores Shift. Operadores Lógicos. Operador Shift O operador shift realiza a operação bit a bit deslocando os bits do primeiro operando para a direita ou para a esquerda, conforme a direção da seta. Observação: Esse operador é pouquíssimo utilizado em aplicações comerciais, mas é bom ter noção de seu funcionamento. Exemplo de Operadores Shift: No exemplo abaixo foi criada uma variável do tipo inteiro. Ela será armazenada, em nível de bits, como uma sequência de zero e um. Para obter essa sequência, basta utilizar o método toBinaryString: A representação binária do número 13 é 1101. Essa instrução desloca os bits do inteiro 13 para uma posição à direita. Cada operador desloca os bits do operando da esquerda, baseado no número de posições definidas no operador da direita. O deslocamento ocorre na direção apontada pelo próprio operador: O resultado da operação é 110, ou 6 em decimal. Os bits à esquerda são preenchidos com 0, se necessário: Atenção: Para entender os resultados dos operadores bit a bit, primeiro você deve converter cada número para binário (sequência de zero e um), depois executar os operadores e, por último, voltar para a base decimal. Veja: Crie a classe OperadorBinario. Resultado: Operadores Lógicos Operador bit a bit And (&) Quando os operadores são números, a operação & realiza uma operação bit a bit utilizando o AND em cada par de bits nos operandos. O AND configura o resultado do bit para 1, se nos dois bits o valor for 1. Crie a classe OperadorBinarioAnd e digite o exemplo de operação bit a bit AND: Resultado: Operador bit a bit Or (|) Quando os operadores são números, a operação ( | ) realiza uma operação bit a bit utilizando o OR em cada par de bits nos operandos. O OR configura o resultado do bit para 1, se em um dos dois bits o valor for 1. Crie a classe OperadorBinarioOr e digite o exemplo de Operação bit a bit OR: Resultado: Operador bit a bit ~ Já o operador ( ~ ) inverte o valor de cada bit do operando. Crie a classe OperadorBinarioTil. Resultado: Crie a classe OperadorBinario2 e digite o exemplo completo de operação bit a bit. Resultado: O OR exclusivo bit a bit (^) retorna 1 se os bits forem diferentes; caso contrário, retorna 0. Exemplo prático de uma operação bit a bit Entre outras coisas, a manipulação bit a bit é útil para gerenciar uma série de flags booleanas, por exemplo. Em sua aplicação é preciso controlar várias permissões de acesso às tabelas, como: leitura dos dados, alteração dos dados, inclusão ou exclusão dos dados. Ao invés de criar 4 variáveis booleanas, você poderia criar uma única variável do tipo inteira para controlar as várias operações, onde cada bit representa o estado da permissão para cada operação. Primeiro, para melhor entendimento do código, crie algumas constantes para indicar cada aspecto das permissões. Cada valor deve ser um expoente na base 2 para garantir cada permissão em um bit. Defina 1 para true e 0 para false: Defina uma variável inteira, inicializada em 0, para garantir que não haja nenhuma permissão inicial. Para setar alguma permissão, você poderia utilizar o seguinte código: Para testar a permissão bastaria executar o seguinte código: Crie uma classe UtilizacaoBinario. Resultado: Outros Operadores A linguagem Java suporta mais alguns operadores, conforme mostra a tabela abaixo: Esses operadores serão explicados ao longo do curso. 2ª Parte Objetivos: Utilizar as estruturas de decisão e repetição no Java. Conhecer e aplicar cada comando de decisão. Conhecer e aplicar cada comando de repetição. Aprender a utilizar vetores e coleções. Conhecer as diferenças entre vetores e coleções. Aprender os conceitos básicos de orientação a objetos. Aprender a criar atributos e métodos das Classes. Trabalhar com Construtores. Tópicos Abordados: Utilização do if-else. Utilização do switch. Utilização do for. Utilização do while. Utilização do do..while. Declaração e Inicialização de Vetores. Vetores de múltiplas dimensões. Utilização da classe Arrays. Coleções. Interagindo com coleções. Introdução à Orientação a Objeto. Classes de Objetos. Atributos da Classe. Atributos tipo Campo. Propriedades da Classe. Diagrama de Classes utilizando Propriedades. Atributos Estáticos. Construtores da Classe. Métodos das Classes. Métodos Estáticos. Controle de Fluxo Quando o programa é executado, as várias instruções são executadas da esquerda para a direita e de cima para baixo. Instruções para controle de fluxo podem, mediante certas condições, executar ou não um bloco, ou executar o bloco repetidas vezes. Ou seja, alterar o fluxo normal da execução. Crie um novo pacote com o nome de br.com.aprendamais.parte2 e dentro deste novo pacote crie a classe Fluxo. Resultado: A linha 11 somente será executada se a expressão booleana na linha 9 for verdadeira. Caso contrário, será executada a linha 14. Atenção: Expressão booleana é toda expressão em que o resultado seja booleano (true ou false). Pode ser: Comparação. Método que retorne um booleano. Variável booleana. Instruções para Controle de Fluxo As instruções abaixo alteram o fluxo normal das instruções (que seria de cima para baixo, uma na sequência da outra): Instrução if..else A instrução if permite executar, de forma seletiva, algumas instruções do programa, baseada em alguns critérios. No exemplo a seguir, se a nota for maior que 7 será impresso "Aprovado"; caso contrário, será impresso "Reprovado". No exemplo acima, os blocos {...} poderiam ser removidos, haja vista que só há uma instrução: Na frente do if, entre os parênteses, há uma expressão booleana. Se valor da expressão for true, o que estiver a seguir será executado. Caso contrário, será executado o que estiver após o else. Após o if – ou após o else – pode-se ter uma simples instrução, ou um bloco de instruções: Crie a classe If no pacote br.com.aprendamais.parte2, e digite o código abaixo: Resultado: Obs: Assim como na maioria das linguagens de programação, o else é opcional. Note que foi utilizado o operador ternário ? :. Ele pode substituir o if.. else em casos simples, como o do exemplo acima. else if encadeados Você também pode encadear condições usando else if. A sintaxe é básica, veja: Crie uma classe IfElse. Resultado: Operador ternário (if inline) A linguagem Java tem o operador ternário ?: que praticamente é uma abreviação da instrução if-else. Crie a classe Operadores. Resultado: Notas O operador retorna determinado valor, que depende dos operandos e do tipo de operador. Por exemplo, um operador aritmético de adição retorna a soma dos operandos. Se os operandos forem inteiros o retorno será um inteiro. Instrução switch A instrução switch permite executar instruções condicionalmente, baseada em uma expressão inteira, ou do tipo enumerado. Crie uma classe Switch. Resultado: Obs: Se você tiver mais do que 2 opções, dê preferência ao switch no lugar de vários else if. O código ficará mais legível. Instruções para Repetição As instruções para repetição permitem executar uma instrução, ou um bloco de instruções, repetidas vezes, até que determinada condição seja atendida. Instrução while A instrução while é utilizada para executar uma instrução, ou um bloco de instruções, repetidamente enquanto a expressão booleana for true. Sintaxe: Ou: Primeiro a instrução while avalia a expressão, a qual deve retornar um valor booleano. Se a expressão retornar true, a instrução while executa a instrução, ou o bloco de instruções, que vier na sequência. Caso a expressão retornar um valor false, a instrução while ignora a instrução, ou o bloco de instruções, que vier na sequência. A instrução while continua a testar a expressão e executa a instrução, ou o bloco de instruções, que vier na sequência até que a expressão retorne false. Crie uma classe While e digite o exemplo abaixo: Resultado: Observações: Note que foi utilizado um operador de pós-incremento na instrução: Nesse caso, primeiro foi concatenado o valor da string "i = " com o valor da variável i. Depois foi incrementado o valor de i. Sendo que ocorreu uma conversão implícita de i para string. Por último, o valor foi impresso. do valor Como só há uma instrução dentro do bloco do while, o código poderia ser simplificado, ficando o exemplo da seguinte forma: A forma sem o bloco, embora fique mais simples, não é recomendada, pois prejudica a legibilidade do programa. Instrução do..while A linguagem Java tem uma instrução similar ao while: a instrução do..while. Veja: Ao invés de avaliar a expressão no início do loop, a do..while avalia a expressão no fim do bloco. Desta forma, se garante que as instruções dentro do bloco serão executadas pelo menos uma vez. Crie a classe DoWhile. Resultado: Se o valor da variável i for inicializado com zero (0), será igual ao exemplo da instrução while, visto anteriormente: Agora, se o valor da variável i for inicializado com dez (10), o código será executado uma única vez com o seguinte resultado: Instrução for A instrução for tem a seguinte sintaxe: A expressão de inicialização é executada uma vez, no início do loop. A expressão de avaliação determina quando o loop será finalizado. Quando a expressão for false, o loop termina. O incremento é uma expressão executada a cada interação do loop. Crie a classe For. Resultado: Componentes de for Os 3 componentes de for são opcionais. Por exemplo, o código abaixo irá gerar um loop infinito: Crie a classe ForInfinito. Obs: No exemplo acima, foi utilizada a palavra-chave break, que interrompe a execução do laço. Interagindo com Coleções e Arrays Na linguagem Java, a partir da versão 5, foi adicionado um novo tipo de instrução for, criado especificamente para trabalhar com coleções e arrays. Crie a classe ForEach. A instrução: Pode ser lida da seguinte forma: Para cada elemento do tipo int, dentro do array x, imprima o seu valor. Coleções e arrays serão abordados em detalhes mais à frente. Resultado: Obs: Observe que foi utilizado o método println. Você sabe a diferença entre println e print? Os dois métodos imprimem, mas com a diferença que o println adiciona uma quebra de linha. Vetores e Coleções A linguagem Java tem diversas classes para a manipulação dos conjuntos de dados. Esses dados podem ser organizados de duas maneiras diferentes: Vetores Vetores ou arrays constituem um mecanismo nativo da linguagem para manter referências a valores de tipos primitivos e objetos, sendo a forma mais eficiente de manter referências. Os Vetores têm tamanho fixo e não podem ser redimensionados. Coleções Coleções são utilizadas na representação de listas, conjuntos e mapas. As coleções constituem uma solução flexível para o armazenamento de objetos, pois a quantidade armazenada não é fixa. Vetores Quando é necessário agrupar elementos de um mesmo tipo, em uma única estrutura, normalmente se utiliza o vetor (array). Para declarar o vetor são utilizados colchetes [ ]. Por exemplo: As duas formas acima estão corretas. Definindo o número de elementos do vetor Além de declarar o vetor, é necessário alocar espaço na memória para determinado número de elementos. Por exemplo: É possível declarar o vetor e alocar espaço na mesma linha: Foi declarado um array, chamado de nota e que contém 5 elementos para armazenar tipo de dadoschar. Obs: Lembre-se que o tipo char é para 1 caracter, apenas. Para armazenar mais de 1 caracter utilizeString. Atribuindo valores ao vetor Observe que os índices do vetor têm como base o valor 0. Para ler o valor de um elemento do vetor, basta informar o índice do elemento desejado: A tabela acima é uma representação gráfica de como ficaria na memória. Para ler o valor do terceiro elemento, por exemplo, devese utilizar o índice 2 (Arrays sempre começam com índice zero). Veja: Crie a classe Array. Resultado: Forma reduzida de declaração do Vetor Saiba como declarar e inicializar os elementos do vetor utilizando várias linhas de código: O código pode ser simplificado, utilizando-se a forma reduzida: Essas instruções são equivalentes. Exemplo com String: Utilizando o atributo length Pelo atributo length pode ser obtido o número de elementos do vetor. Esse método pode ser útil para listar todos os elementos do vetor: Crie a classe Array2. Classe Arrays Java possui uma classe própria para manipulação de arrays, que se chama Arrays. Para utilizar a classe Arrays é necessário adicionar o import, conforme mostra o exemplo a seguir: Os principais métodos da classe Arrays são: sort equals fill binarySearch Cada um deles será explicado à frente. Observação: Até agora não foi preciso usar o import ao utilizar algumas classes, como System e String. Elas pertencem ao pacote java.lang, que contém algumas classes fundamentais para a linguagem Java e são "carregadas" automaticamente na memória. Sort Ordena os elementos do array em ordem ascendente Crie a classe Array3, não se esqueça de importar os Arrays com a linha de comando import java.util.Arrays; Equals Retorna true se os arrays tiverem o mesmo conteúdo e na mesma ordem: Crie a classe Array4. fill Preenche o array com o valor recebido como parâmetro. O tipo do valor passado deve ser compatível ao tipo do array: Crie a classe Array5. binarySearch Retorna um inteiro, que indica a posição do array na qual o valor se encontra; ou retorna um valor negativo, caso o valor não seja encontrado. Este método só funciona se o vetor tiver sido ordenado anteriormente. Crie a classe Array6. Copiando elementos de um array para outro Basta utilizar o método arraycopy da classe System Sintaxe: Onde: origem é o nome do array de origem (de onde serão copiados alguns elementos). índice origem é o índice dentro do array de origem. destino é o nome do array de destino (para onde serão copiados alguns elementos). índice destino é o índice dentro do array de destino. quantidade é a quantidade de elementos a serem copiados. Exemplo: Onde: Vetor A: Vetor B: Que irá copiar: A instrução acima significa: Copie do vetor A, a partir da posição 0, para o vetor B na posição 1, o total de 3 elementos. Resultado: Crie a classe Array7 e digite o código: Vetores Multidimensionais Os arrays podem ter mais do que uma dimensão. Um array de duas dimensões seria como uma tabela. De três dimensões, seria um cubo. Veja este exemplo, que gera um vetor de 2 linhas e 3 colunas: Que ficaria assim: Observe no exemplo acima esta instrução: Ela insere o valor na segunda linha [1] e na terceira coluna [2]. Lembre-se: todo array é sempre base0. Também nesse caso pode ser utilizada a forma reduzida: A primeira chave { 3 , 6 , 9 } preencherá a primeira linha, e a segunda chave { 12 , 15 , 16 }preencherá a segunda linha. Crie a classe Array8. Obs: Observe que, no exemplo acima, d.length irá retornar o número de linhas. O primeiro for está varrendo as linhas. Já d[i].length, que é aplicado à cada linha, retorna o número de colunas. O segundo for está varrendo as colunas de cada linha. Ou seja, foi feito um loop para percorrer as linhas e, em cada linha, foi feito um loop para percorrer as colunas existentes nela. Coleções Em Java existem as classes para manipular coleções de elementos. Uma coleção é uma estrutura de dados que permite armazenar, desde simples tipos primitivos até objetos mais complexos. A própria coleção é um objeto também. Algumas operações podem ser executadas sobre as coleções, como: Incluir Remover Consultar As classes de coleções em Java compõem o chamado framework de coleções. Dentre as diversas classes, as duas mais importantes são: Map TreeMap Além de objetos como o Iterator, para interagir com elas. Map A interface Map especifica as funcionalidades necessárias para manipular um grupo de objetos mapeando chaves a valores. Um mapa armazena pares (chave, valor) chamados itens, que podem ser de qualquer tipo. A chave é utilizada para achar um elemento rapidamente. Observações: Estruturas especiais de dados (hash) são usadas para que a pesquisa seja rápida. Diz-se, portanto, que um mapa "mapeia chaves para valores". O Mapa pode ser mantido ordenado ou não (com respeito às chaves). Normalmente implementado como "Tabela Hash" ou "Árvore". Tabela hash (de hashing, no inglês) é uma estrutura de dados especial que associa chaves de pesquisa (hash) a valores. Seu objetivo é, a partir de uma chave simples, fazer uma busca rápida e obter o valor desejado. No Java a classe HashMap implementa o mecanismo básico de mapeamento entre chaves e valores, sem que seja necessário conhecer ou estudar a fundo a teoria de tabelas Hash. Principais métodos put(Object key, Object value) Relaciona um novo valor associado à chave especificada: get(Object key) Retorna o valor associado à chave especificada: size() Retorna a quantidade de elementos na coleção: remove(Object key) Remove uma chave da coleção: Iterator Iterator é um objeto que permite interagir com coleções, associando à coleção um mecanismo para percorrer seu conteúdo, independente de sua estrutura interna. O métodohasNext retorna true se houver mais elementos na coleção. O método next retorna o próximo elemento. Onde o keySet() retorna um conjunto de valores a partir do mapa e iterator() permitirá percorrer (interagir) os valores retornados. Crie a classe Map. TreeMap A classe TreeMap oferece a funcionalidade adicional de associar uma ordem aos elementos da coleção. Crie a classe Map2. Trabalhando com outros tipos de dados Para trabalhar com outros tipos de dados, basta utilizar o conceito de , que foi implementado na versão 1.5 da Java e que permite converter os tipos, em tempo de execução. Exemplo: Observe, na linha acima, que foi informado que o primeiro valor (no caso, na posição da chave) seráString; e que o segundo valor será Double (na posição do valor da chave). Crie a classe Map3. Tratamento de Exceções Uma exceção é um erro previsto, geralmente causado por fatores externos, que fogem ao controle do programador e que ocorrem durante a execução do programa. As exceções podem ocorrer por diversos motivos. Alguns exemplos são: Ao conectar com o banco de dados. Ao salvar um arquivo. Ao imprimir. Ao ser utilizado um índice inexistente em um vetor. Em uma divisão por zero. Caso ocorra uma exceção não tratada, o programa será abortado. Com o tratamento de exceções, você pode escrever programas tolerantes a falhas. O tratamento de exceções permite a um programa capturar todos os tipos de exceções tornando-o mais robusto. Utilizando try..catch Para tratar as exceções deve-se utilizar o bloco try..catch. Veja o exemplo abaixo, sem tratamento de exceção: Ao executar essa classe, o seguinte erro será retornado: Repare que a linha 11 (a linha da divisão) não foi executada. Ou seja, quando ocorre uma exceção não tratada o programa é abortado. Agora adicione o bloco do try..catch: Obtendo detalhes sobre a exceção Através do método getMessage(), da classe Exception, mais detalhes podem ser obtidos sobre o erro ocorrido. Repare, na linha 13 do exemplo acima, que foi utilizado o método getMessage() da classeException para obter uma mensagem referente à exceção ocorrida. Utilizando finally Se você adicionar um bloco finally, e houver alguma instrução nesse bloco, ela será sempre executada, independente se houver erros ou não. Tratando várias exceções em um bloco Em um programa pode ocorrer um tipo de exceção diferente para cada instrução. Crie a classe Excecao2. É possível ter vários blocos, um para cada tipo de exceção ocorrida. Veja o exemplo a seguir: Nesse caso, ocorrendo erro na linha 10, o fluxo do programa será desviado para a linha 12 e a linha 11 não será executada. Para testar o erro na linha 11, basta comentar a linha 10 para ela não ser executada. Transferindo o controle da exceção Em algumas situações, surge a necessidade de tratar as exceções que ocorrem dentro do método, ou fora dele. Ou seja, tratar as exceções a partir de onde o método é chamado. Para tanto, foi criado o método obterDivisao, que contém em seu interior uma instrução que pode causar erro. Crie a classe Excecao3. Orientação a Objetos (OO) Orientação a Objeto é uma série de conceitos aplicados à linguagem de programação, que ajudam a definir a estrutura de programas, baseados nos conceitos do mundo real, sejam eles concretos ou abstratos. A Orientação a Objeto permite criar programas que separam as partes do sistema por responsabilidades, mas que se comunicam entre si por meio de mensagens. Por exemplo, parte da equipe poderia criar as classes contendo as regras de negócios, e outra parte criar as telas gráficas, seja para desktop ou para a web. Dentre as vantagens que a OO proporciona, podem ser destacadas o aumento de produtividade, a reutilização de código, a redução das linhas de código programadas, separação de responsabilidades, encapsulamento, polimorfismo, componentização e maior flexibilidade do sistema, dentre outras vantagens. Classes Uma classe, nada mais é do que a definição do que será um objeto. As classes definem a estrutura e o comportamento dos objetos de determinado tipo. Pode-se dizer que as classes são, na verdade, modelos de objetos de um mesmo tipo.·. Representação Gráfica de uma Classe: A partir dessa classe Carro, podem ser criados vários objetos. Mais à frente, atributos e métodos das classes serão detalhados. Obs: Para facilitar a compreensão, você pode fazer uma analogia com a construção de uma casa: Para construí-la, você deve ter o projeto, que deve conter todas as especificações para a construção; a partir desse projeto, você poderá construir várias casas, se quiser. Neste exemplo, o projeto corresponde à classe, e as casas seriam os objetos criados a partir dessa classe. Exemplo Classe Carro Digite o código Java da classe Carro: Obs: Para classes públicas, o nome do arquivo deve ser idêntico ao nome da classe com a extensão .java. Observe que essa classe não tem o método main, ou seja, não poderá ser executada diretamente. Objetos Um objeto nada mais é do que uma instância de classe. O objeto criado fica armazenado na memória, permitindo assim a utilização de seus atributos e métodos. Os Objetos possuem: Estado (atributos). Comportamento (métodos). Identidade (cada objeto é único). Mensagens Os objetos se comunicam entre si por meio de mensagens (chamadas aos métodos). Notas: O método nada mais é do que um procedimento, ou uma função, criado dentro de uma classe. Em Java, todo procedimento ou função deve ser criado dentro de uma classe. Portanto, aqui será sempre utilizado o termo método, independente se o procedimento retorna ou não um valor. Um procedimento é um bloco de instruções, ao qual foi atribuído um nome. Uma função é um procedimento que retorna um valor. Instâncias da Classe Uma instância nada mais é do que uma cópia da classe na memória. Foram criadas duas instâncias (objetos) da classe Carro: A partir de uma classe, vários objetos podem ser criados. No exemplo acima, c1 e c2 são objetos. A instrução pode ser desmembrada em duas partes: Ou seja, c1 é uma variável de objeto que representa uma instância da classe. O acesso aos atributos e métodos da classe Carro é feito a partir de c1 e c2. Observação: As variáveis não guardam os objetos e sim uma referência para a área de memória onde os objetos estão alocados. Utilizando a classe Carro Após instanciar a classe, você terá acesso aos métodos e atributos da classe. Obs: Utilize sempre a complementação de código. Além de mais produtivo, diminui a possibilidade de erros. Você pode utilizar qualquer atributo ou método listado. Se ele não aparecer, alguma coisa estará errada. Exemplo utilizando uma classe: Na linha 6 foi criada a variável c, que representa uma instância da classe Carro. Nas linhas 7a 9 foram configurados alguns atributos da classe. Nas linhas 10 a 14 foi mandado executar alguns métodos da classe. Resultado: Atributos da Classe Através dos atributos da classe é que valores podem ser passados e recebidos para a classe. Os atributos de uma classe podem ser de dois tipos: Campos. Propriedades. Campos são simplesmente variáveis, visíveis a partir das instâncias da classe. As Propriedades, em Java, são implementadas como uma variável privada; e os métodos de acesso a essas variáveis são baseados no padrão (get/set). Saiba como trabalhar com as duas formas de atributos: Atributos tipo Campo São variáveis públicas (visíveis fora da classe). Os atributos são inicializados durante a criação do objeto. Valores da inicialização: Numéricos como 0. Caracteres como null. Booleanos como false. Objetos como null. Exemplo com Atributos Tipo Campo. Crie a classe Cliente. Crie uma classe TesteCliente. Resultado: Definindo um valor padrão para os atributos Os atributos podem receber um valor padrão, definido no momento da declaração. Ao executar novamente a classe TesteCliente, o resultado será: Atributo tipo Propriedade Ao contrário de um campo, uma propriedade (por exemplo, código) é implementada através de uma variável local (codigo) e de métodos de acesso (getCodigo e setCodigo). Altere a classe Cliente: Observe que a estrutura de uma propriedade é mais sofisticada e segue o seguinte padrão: A variável local está escrita no padrão camelCase. Já os métodos de acesso são precedidos por get ou set e também são escritos no padrão camelCase. Por exemplo, para criar uma propriedade chamada nomeCliente você pode definir uma variável privada chamada nomeCliente e definir os seguintes métodos: getNomeCliente e setNomeCliente O padrão camelCase significa que o nome do identificador deve começar com letra minúscula e a primeira letra, de cada palavra concatenada, ser maiúscula. Obs: Na literatura especializada, o padrão camelCase também é descrito como CamelCase; ou seja, o nome do identificador deve começar com letra maiúscula e a primeira letra de cada palavra concatenada também deve ser maiúscula. Porém, em Java, o padrão utilizado é o descrito anteriormente. Vantagens de utilizar propriedades As principais vantagens ao utilizar propriedades são: Padrão amplamente utilizado em Java. Permite validar os valores que estão entrando e saindo da classe. Isola o ambiente externo do ambiente interno da classe. Pode ser definido se haverá apenas get, apenas set, ou ambos métodos de acesso. Um diagrama de classes, com a utilização de propriedades, ficaria da seguinte forma: Criando propriedades com a ajuda do Eclipse O Eclipse também auxilia na hora de criar propriedades. Para conhecer essa funcionalidade, primeiro crie a classe e digite apenas as variáveis locais. A partir do menu Source, selecione Generate Getters and Setters: Clique em Select All: Clique no botão OK. As propriedades serão criadas automaticamente. Trabalhando com as Propriedades Utilizando a classe Cliente. Nota: Observe que a forma de atribuir valores às propriedades é diferente em relação aos atributos. Vá se acostumando, pois esse é o padrão utilizado em Java. Atributos Estáticos Atributos estáticos não precisam de uma instância da classe para serem usados. Eles são compartilhados por todas as instâncias da classe. Crie a classe Carro2. Nota: Enquanto para um atributo comum é alocado um espaço na memória para cada instância da classe, para o atributo estático o espaço de memória é um só, independente do número de instâncias. Utilizando Atributos Estáticos Veja o exemplo seguinte e analise particularmente o resultado da linha 22: Crie a classe TesteCarro2. Nota: Observe que o atributo cor é o mesmo para todas as instâncias da classe. Por isso que, quando a cor na linha 16 foi alterada, através do objeto c2, o valor da cor do objeto c1também foi alterado. Observação sobre Atributos Estáticos Observe que, no Eclipse, na coluna à esquerda, surgiu uma figura na cor amarela indicando um alerta. O alerta não é um erro de compilação, significa apenas que a instrução não é a forma mais indicada de uso. Veja: Confira a forma correta de utilizar atributos estáticos: Observação: Assim como há atributos estáticos também se pode ter métodos estáticos. No exemplo acima o método parseInt da classe Integer é estático e pode ser utilizado sem a necessidade de instanciar a classe. Construtores da Classe Um construtor é um método particular que possui as seguintes características: Tem o mesmo nome da classe. Não tem tipo de dados. Primeiro, analise a classe Conexao sem o construtor. Classe Conexao sem construtor. Testando a classe Conexao: Observe que nada aparece no resultado porque status, dentro da classe Conexao, foi inicializado como uma string vazia. Agora inclua um construtor na classe Conexao: Classe Conexao com construtor: Testando a classe Conexao: Conforme explicado, um construtor é o método com o mesmo nome da classe. Todas as informações que estiverem dentro do método serão executadas quando a classe for instanciada. Métodos das Classes Método é o termo utilizado para referenciar um procedimento, ou uma função, que foi criado dentro de uma classe. Em Java, todos os procedimentos e funções só podem ser criados dentro de classes. Por isso são chamados de métodos, independente se retornam ou não um valor. Um método nada mais é do que um bloco de instruções agrupadas, ao qual foi atribuído um nome. O método pode ou não retornar um valor. Os métodos permitem organizar o código em partes pequenas, específicas para certa funcionalidade. Veja este exemplo: Note que apenas o método alterarCliente() é do tipo void. O tipo void significa que não será retornado um valor. Ele equivale a procedimento. Já os demais métodos retornam valores, desde um simples int até um ResultSet (ResultSet será abordado em banco de dados). Os métodos equivalentes a funções devem ter, necessariamente, um retorno de tipo compatível com a declaração do método. Regras básicas para se criar um método Os nomes dos métodos devem ser significativos. Isso quer dizer que, ao ler o nome do método, deve ficar clara a sua finalidade. Utilize sempre o padrão camelCase. Ou seja, o nome do método começa com letra minúscula e cada palavra concatenada começa com letra maiúscula. O método deve ter finalidade específica, e pode ou não retornar um tipo de dado. Quando não for retornar nada, utilize a palavra void antes do nome do método. Sobrecarga de Métodos Em Java pode haver, dentro de mesma classe, métodos com nomes iguais mas com parâmetros diferentes. É o que se chama sobrecarga de métodos. Veja este exemplo: Observe que, ao chamar o método, se não for passado nenhum parâmetro, o primeiro método será executado. Se uma String for passada como parâmetro, o segundo método é que será executado. Métodos Na classe Cliente2, foram criados os métodos: O retorno do método pode ser do tipo primitivo ou do tipo construído (por exemplo, uma classe). O retorno do método deve ser do mesmo tipo do método. O exemplo abaixo retorna um int: Já o exemplo seguir retorna um ResultSet: Caso haja parâmetros devem ser informados com tipo e nome, como no código abaixo. Se houver mais de um, devem ser separados por vírgula. Obs: Você pode criar o método em qualquer lugar dentro da classe, desde que não seja dentro de outro método. Métodos Estáticos Métodos estáticos não precisam de uma instância da classe para serem utilizados. Para criar um método estático, basta adicionar a palavra-chave static. Confira no exemplo a seguir: Utilizando os métodos Como a classe Clientes2 não possui o método main, foi criada uma classe para teste. Veja abaixo: 3ª Parte Objetivos desta parte: Aprender os conceitos mais avançados de orientação a objetos. Trabalhar com herança e classes abstratas. Criar e utilizar corretamente interfaces. Conhecer as classes empacotadoras em Java. Trabalhar com Strings e funções matemáticas. Criar e utilizar Threads. Conhecer as principais classes para manipulação de arquivos em Java. Entender e utilizar streams. Conhecer entrada e saída padrão. Tópicos Abordados Herança. Classe Object. Polimorfismo. Classes Abstratas. Métodos Abstratos. Interfaces. O pacote java.lang. Classes empacotadoras: Boolean, Byte, Character, Double, Float, Integer e Short. Outras classes importantes: String, Math e Threads. Trabalhando com Arquivos e Diretórios. Lendo e Gravando Dados em Arquivos. Leitura e Gravação na Entrada Padrão. Orientação a Objetos – Herança Herança é a capacidade de uma classe para herdar os atributos e métodos de outra classe. Por exemplo, no caso da classe Clientes é possível ter clientes pessoas físicas e clientes pessoas jurídicas. Todo o cliente deve ter um nome e um código. Deve ter um método para excluir a partir do código fornecido, e que preveja que pessoas físicas têm CPF e pessoas jurídicas têm CNPJ. Ao ser criado um método para incluir um cliente, será preciso incluir no banco de dados o CPF ou o CNPJ, dependendo do tipo de cliente. Através da herança, classes mais especializadas podem ser criadas como, por exemplo, a classe Fisica, a partir da classe cliente. Diagrama de classes com Herança A classe Fisica herdou os atributos e métodos da classe Cliente, bastando agora adicionar à classe Fisica os atributos e métodos específicos de um cliente do tipo pessoa física. Nesse exemplo, a classe Cliente pode ser chamada de superclasse ou classe-pai. Já a classe Fisica pode ser chamada de classe derivada ou classe-filha. Também é correto dizer que a classe Fisica estende a classe Clientes. Note que dentro da classe Fisica foi adicionado o método incluir. Obs: Em Java não existe herança múltipla, ou seja, cada classe só pode ter um pai. Entretanto, uma classe pode ter muitas classesfilhas. Exemplo com Herança: Testando a classe Cliente: Extends A palavra-chave extends é utilizada para informar que a classe está sendo criada a partir de outra. Observe a linha 3 do código acima. É ela que está dizendo que a classe Fisica está estendendo a classe Cliente: Testando a classe Física: Observe que, nas instâncias da classe Fisica, foram utilizados os métodos setCodigo, setNome e getStatus normalmente, como se eles tivessem sido criados na própria classe. Classe Object Em Java, toda classe descende direta ou indiretamente da classe Object. Veja: Observe, no exemplo a seguir, que apesar de a classe Alunos não ter nada, aparece uma série de métodos: Obs: Os métodos sobrescritos da subclasse não podem ter um modificador mais restritivo do que o modificador do método de sua superclasse. Overloading O overloading (sobrecarregamento) ocorre quando mais de um método com o mesmo nome é implementado na mesma classe. Overloading ou sobrecarga pode se dar apenas pela diferenciação dos argumentos do método. Veja: Referenciando atributos da classe atual A palavra-chave this referencia a própria classe, quando utilizada dentro da própria classe. Veja: Neste exemplo, observe a linha 11: A variável status, que será impressa, é o valor do parâmetro passado. Já na linha 12 será impresso o valor da variável status declarada como um atributo da classe (Linha 4). Obs: A palavra-chave this não pode ser usada em métodos estáticos. Referenciando atributos da classe superior A palavra-chave super faz referência a atributos e métodos da classe superior (ou classe-pai). Veja: Na linha 8 será impresso o valor da variável status declarada como um atributo da classe superior, ou seja, da classe-pai. Polimorfismo Polimorfismo é a capacidade de um objeto se comportar como outro, em tempo de execução. Veja: Classe Gato: Classe Cachorro: Observe, na linha 9 do exemplo abaixo, que o objeto a recebeu o endereço de memória do objeto g. A partir daí o objeto a assumiu a forma do objeto g. Veja: Na linha 11 o objeto a, que originalmente era uma instância da classe Gato, passou a se comportar como uma instância da classe Cachorro. O método som, utilizado pelo objeto a, agora foi o método som da classe Cachorro. Classes Abstratas Uma classe abstrata é aquela que não pode ser instanciada. Ela serve como base para outras classes. Por exemplo, a classe Cliente poderia ser abstrata. Se alguém quisesse utilizar qualquer método da classe Cliente poderia fazê-lo a partir das classes derivadas como, por exemplo, a classe Fisica. Para transformar a classe Cliente em abstrata, basta utilizar a palavra-chave abstract, antes do nome da classe. Veja: Classes Derivadas As classes derivadas de uma classe que contenha métodos abstratos são obrigadas a implementar esses métodos. Veja: Isso é particularmente útil para forçar certa padronização nos nomes dos métodos nas classes derivadas. A classe abstrata, nesse caso, se comporta como se fosse um contrato ao qual das classes derivadas devem obedecer. Obs: Uma classe abstrata tem duas finalidades básicas: Servir de base para outras classes. Obrigar as classes derivadas a implementarem certos métodos. Interfaces As interfaces atuam como um contrato para as classes que as implementam. Nas interfaces são definidos os métodos que deverão ser implementados pelas classes derivadas. As classes que implementam as interfaces devem oferecer uma implementação para cada método definido na interface. As classes podem implementar mais de uma interface. Veja: Crie uma Interface com o nome de Enderecos. Implementando a interface Para que uma classe implemente as interfaces, basta utilizar a palavra-chave implements. Principais classes em Java O pacote java.lang Esse pacote contém as principais classes da linguagem Java: Classes empacotadoras Boolean Byte Character Double Float Integer Long Short Classes Empacotadoras são classes do pacote Java que contêm métodos específicos para certos tipos de dados. Boolean A classe Boolean empacota o tipo primitivo boolean. Exemplo: Byte A classe Byte empacota o tipo primitivo byte. Exemplo: Character A classe Character empacota o tipo primitivo char. Exemplo: Double A classe Double empacota o tipo primitivo double. Exemplo: Float A classe Float empacota o tipo primitivo float. Exemplo: Integer A classe Integer empacota o tipo primitivo int. Exemplo: Short A classe Short empacota o tipo primitivo short. Exemplo: String A classe String representa um conjunto de caracteres. Por exemplo, "abcde" é implementado como uma instância dessa classe. Ela contém diversos métodos para manipulação de strings. A seguir alguns dos métodos mais importantes: Esta string se comporta como um array de caracteres: Lembre-se que em Java qualquer vetor é sempre base 0. Exemplo: Math A classe Math contém uma série de métodos para operações matemáticas. Exemplo: Thread Uma thread nada mais é do que uma tarefa sendo executada. Java permite a execução de vários processos simultaneamente. Observe o exemplo a seguir: Ao executar, o método start chama o método run() da classe acima. Veja: Trabalhando com Arquivos Classe File Para trabalhar com arquivos, utilize a classe File do pacote Java. Ela implementa métodos para manipular arquivos mantidos pelo sistema operacional. Utilize a mesma classe File para tratamento dos diretórios e arquivos. Exemplo: Principais métodos da classe File Métodos para tratamento de arquivos: getName: Retorna o nome do arquivo. renameTo: Renomeia o arquivo. exists: Verifica se o arquivo existe. canWrite: Retorna true se um arquivo pode ser escrito. canRead: Retorna true se um arquivo pode ser lido. isFile: Retorna true se o caminho definido for um arquivo. lastModified: Retorna a data da última alteração do arquivo. length: Retorna o tamanho do arquivo. delete: Deleta o arquivo. Métodos da classe File para tratamento de diretórios: getPath: Retorna o nome do diretório. getAbsolutePath: Retorna o nome do diretório a partir da raiz. getParent: Retorna os diretórios acima do arquivo. isDirectory: Retorna true se o caminho definido for um diretório. isAbsolute: Retorna true se um caminho for absoluto. mkdir: Cria um diretório. list: Retorna a lista de arquivos presentes em um diretório. Lendo e Gravando Dados em Arquivos Em uma aplicação os dados trafegam de um arquivo para o aplicativo e, deste, para o arquivo. Esse fluxo de dados é chamado de stream. Java trabalha com dois tipos de stream: Caractere. Byte. Classes para tratar com Stream: Diferentes classes são utilizadas para tratar com os diferentes tipos de streams: Classe Reader: Para streams de Entrada de caracteres. Classe Writer: Para streams de Saída de caracteres. Classe InputStream: Para streams de Entrada de Byte. Classe OutputStream: Streams de Saída de Byte são manipulados por subclasses da classe OutputStream. Exemplo com Stream: Resultado: Classes para tratar Stream com Arquivos: Existem classes de streams específicas para o tratamento com arquivos. Cada uma delas lê ou escreve dados em um arquivo (levando em consideração de maneira transparente o sistema operacional): FileReader: Utilizada na leitura de caracteres de um arquivo. FileWriter: Utilizada na escrita de caracteres de um arquivo. FileInputStream: Utilizada para serializar um objeto. FileOutputStream: Utilizada para desserializar um objeto. Essas classes são utilizadas após o arquivo ter sido criado. Na entrada de dados de um arquivo pode ser usada a classe BufferedReader para ler as linhas de um arquivo através do método readLine dessa classe. Na escrita de dados de um arquivo pode ser usada a classe PrinterWriter para escrever dados no arquivo com os métodos print e println dessa classe. Exemplo com Arquivos: Resultado: Leitura de Dados da Entrada Padrão Os objetos de fluxo são criados automaticamente quando um programa em Java se inicia: System.in System.out System.in é um objeto do tipo InputStream, que permite a um programa receber dados a partir da entrada-padrão (o teclado). Escrita de Dados na Saída Padrão System.out é um objeto do tipo PrintStream que permite a um programa enviar dados para a saída-padrão (a janela de onde o programa foi iniciado). Os principais métodos de System.out são println() e print() que imprimem os dados na saída-padrão, respectivamente, com e sem return ao final da linha. Exemplo com Entrada pelo Teclado: Resultado: 4ª Parte Objetivos: Instalar o MySQL e as ferramentas para acessá-lo. Criar Banco de Dados e Tabelas no MySQL. Acessar as tabelas a partir de uma aplicação Java. Criar Formulários. Adicionar componentes ao formulário. Adicionar eventos aos componentes. Tópicos Abordados: Obtendo e instalando o MySQL. Obtendo e instalando as ferramentas para o MySQL. Obtendo e configurando o conector Java. Criando Banco de Dados e Tabelas. Configurando o Eclipse para utilizar o MySQL. Conectando com o MySQL a partir da Java. Instruções SQL básicas. Consultando, incluindo e alterando dados nas tabelas. Criando formulário e configurando algumas propriedades básicas. Adicionando caixas de texto, botões de comando e rótulos. Adicionando eventos do tipo clique do mouse e teclas pressionadas. Utilizando Menus. Servidor MySQL Para obter o MySQL visite: http://www.mysql.com/ Clique em Downloads (GA). Na tela que abrir, clique em Download from MySQL Developer Zone. Na próxima tela, clique em Download da opção MySQL on Windows (Installer & Tools): Na próxima tela, clique novamente em MySQL Installer. Na próxima tela, selecione o sistema operacional e clique em Download: Na próxima tela, para iniciar imediatamente o Download sem ter que fazer login no site, clique no link: Ao término do download, efetue a instalação do MySQL. Caso demore muito para baixar, solicite junto ao professor um local com o arquivo já baixado: Instalando o MySql Para instalar o MySQL e seus componentes, clique duas vezes no arquivo baixado: Clique na opção Install MySQL Products. Aceite os termos e avance. Ná próxima tela, pergunta se você quer atualizar o produto, no momento escolha a opçãoSkip the Check for updates e clique em Next. Na tela em que é pedido para escolher o tipo da instalação, deixe marcada a opção Developer Default, que já instala o conector MySQL para Java, bem como o Workbench que será usado adiante. Depois clique em Next: Caso apareça a seguinte janela clique em Execute: Na janela de Instalação, clique em Execute: Aguarde a Instalação dos produtos e clique em Next. Na primeira etapa de configuração, mantenha o que já vem marcado e clique em Next: Como o MySQL será utilizado apenas para fins didáticos, escolha uma senha simples, por exemplo, 1234. Clique em Next: Na próxima etapa, mantenha as configurações para que o MySQL seja iniciado como um serviço do Windows. Clique em Next: Na última etapa, avance até que as configurações sejam aplicadas. Ao término da instalação você irá acessar o MySQL Workbench (software instalado junto com o MySQL). MySQL Workbench MySQL Workbench é uma ferramenta gráfica para modelagem de dados, integrando criação e designer. A ferramenta possibilita trabalhar diretamente com objetos schema, além de fazer a separação do modelo lógico do catálogo de banco de dados. Toda a criação dos relacionamentos entre as tabelas pode ser baseada em chaves estrangeiras. Outro recurso que a ferramenta possibilita é realizar a engenharia reversa de esquemas do banco de dados, bem como gerar todos os scripts em SQL. Como ela já foi instalada com o MySQL, basta abri-la e dar dois cliques na instância daconexão local: Na caixa de diálogo que aparece, digite a senha 1234 e clique em OK. Aparece a Instância Local do MySQL. Se a instância não for apresentada, faça a configuração conforme exemplicado adiante. Configurando o MySQL Workbench Para administrar o sevidor de MySQL é preciso criar uma nova instância. Para configurá-la, selecione a opção New Connection, como mostra a figura abaixo: Na caixa de diálogo que abrir será definido o local da instância MySQL. No caso deste curso ela se encontra no localhost; então, prencha os dados conforme mostra a imagem abaixo: Para testar se tudo está correto, clique no botão Teste Connection. Informe a senha do banco: Clique em OK. Se esta caixa de diálogo for exibida, é porque a conexão está correta. Clique em OK e Ok novamente para criar a conexão: Pronto, agora você já tem uma conexão. Acessando o Banco de Dados Depois de criar a conexão chega-se à tela principal do MySQL Workbench. Nela começa a interação com o servidor de bancos de dados MySQL. Nessa Janela você pode digitar qualquer instrução SQL válida e clicar no botão que executa a Query: Criando o Banco de Dados Na janela à esquerda, clique com o botão direito do mouse sobre o banco de dados teste e selecione a opção Create Schema: Se nenhum banco de dados estiver disponível, clique no ícone: Digite o nome do Banco de dados na caixa Name: loja, e clique em Apply: Clique em Apply: Depois em Finish. Criando Tabelas Dentro do banco loja, clique com o botão direito do mouse sobre Tables e escolha a opção Create Table: Definindo as Colunas Defina o nome da tabela como categoria e clique na aba Columns. Digite o nome das colunas, conforme mostra a imagem a seguir: Clique em Apply para criá-la: Conferindo a criação da nova Tabela: Configurando o Conector Java no Eclipse Como o conector Java já foi instalado com o MySQL, só é preciso configurá-lo no Eclipse para utilizar o MySQL. Dentro do Package Explorer, selecione o projeto e selecione a opção Project > Properties do menu: Adicionando as referências Selecione, do lado esquerdo da Janela, a opção Java Build Path e a aba Libraries: Localizando o arquivo do MySQL Clique na opção Add External JARs, localize o arquivo (que padrão é instalado em C:\Program Files\MySQL\Connector J 5.1.23) e clique em Abrir: Conferindo a referência Verifique se o arquivo aparece em Libraries, conforme mostra a imagem abaixo: Clique em OK. Utilizando o Banco de Dados no Java Para estabelecer a conexão são necessárias duas etapas: 1. Carregar o driver. 2. Conectar ao banco. Carregar o Driver Carregar o driver é muito simples e envolve apenas uma linha de código. Por exemplo, se você quiser utilizar o driver para o MySQL basta apenas o seguinte código: Caso utilize outro banco, a documentação que acompanha seu driver deverá fornecer o nome da classe a ser utilizada. Utilizar Class.forName equivale a registrar o driver e carregar uma instância dele automaticamente. Estabelecendo a Conexão ao Banco de Dados O segundo passo é estabelecer a conexão com o banco de dados. De forma geral, é utilizada a seguinte instrução: Para a conexão com o banco é utilizado um objeto da classe Connection. Basta configurar a url, de acordo com a documentação do driver. Exemplo Conexão com o Banco de Dados Crie um pacote chamado br.com.aprendamais.parte4, na classe Start: Executando o código: Conexão com outros bancos de dados Apenas para efeito didático, veja abaixo alguns exemplos de conexão com o banco de dados. MySQL: SQL Server 2008: PostgreSQL: Criando a Classe Conexao Crie a classe Conexao e digite o código: Verificando a classe Conexao Crie a classe TesteConexao: Trabalhando com Instruções SQL Abra o MySQL Workbench: Digite a senha "1234": Dê um duplo clique sobre o Schema loja para utilizá-lo. Digite a instrução conforme é mostrado seguir e clique no botão Executar: Resultado da instrução SQL O resultado aparece na parte de baixo da instrução. Observe que a tabela ainda está vazia Para incluir um registro na tabela, digite e clique no botão Executar: Verificando o resultado da instrução SQL Para conferir, execute a instrução SELECT novamente: Registro incluído: Para alterar um registro na tabela: Para conferir, execute a instrução SELECT novamente. Resultado: Para excluir um registro na tabela: Para conferir, execute a instrução SELECT novamente. Para criar uma tabela: Após executar o comando acima, clique no botão de refresh. A nova tabela irá aparecer, conforme a imagem abaixo: Para excluir uma tabela: Não teste o exemplo para não excluir a tabela, pois ainda será utilizada. Executando instruções SQL Para executar comandos SQL é utilizado um objeto da classe Statement. O objeto Statement é utilizado para enviar as instruções SQL para o Banco de Dados. Basta criar um objeto Statement e chamar o método adequado. Se a instrução SQL for baseada em um SELECT, utilize o método executeQuery(). Caso contrário, utilize o método executeUpdate(). A partir de uma conexão aberta, crie uma instância da classe Statement: Obs: Para executar esse e o próximo exemplo insira-os na classe Start. Altere a declaração da função main, adicionando throws SQLException. Veja abaixo: Execute a classe para inserir os dados no banco: Para confirmar a inserção dos dados utilize a instrução select na tabela de usuarios, utilizando o MySQL Workbench. O método next move o cursor para a próxima linha, fazendo com que seja a linha corrente. Caso, ao mover, o cursor não encontre uma linha, o retorno será false. Consultando no Banco de Dados JDBC retorna os resultados de uma consulta em um objeto ResultSet. Portanto, basta criar uma instância da classe ResultSet para armazenar os resultados. Execute para ver o resultado: ResultSet Método next A variável rs contém as linhas resultantes da instrução SQL. Quando o ResultSet é aberto, o cursor fica posicionado antes da primeira linha. O método next move o cursor para a próxima linha, fazendo com que seja a linha corrente. Caso, ao mover, o cursor não encontre uma linha, o retorno será false. Introdução ao Swing O pacote Java disponibiliza duas bibliotecas gráficas: AWT. Swing. A biblioteca AWT foi a primeira a surgir em Java, sendo relativamente pobre em componentes visuais. Quando a versão 1.2 da linguagem Java foi liberada, uma nova biblioteca chamada Swing foi incluída. Essas bibliotecas estão incluídas em qualquer JRE ou JDK, desde que igual ou superior à versão 1.2Java. Criando o primeiro formulário Para trabalhar com telas gráficas, utilize a biblioteca do Swing que está no pacote javax.swing. Todo formulário, ou janela, é criado a partir da classe JFrame. A classe JFrame tem uma série de métodos para tratar as janelas: setSize: Define o tamanho da Janela. setLocation: Define a posição da Janela. setTitle: Define o título da Janela. setDefaultCloseOperation: Define como a aplicação irá se comportar quando a janela for fechada. setVisible: Configura se a janela estará visível ou não. Criando uma Janela Simples: Chamando a Janela: Resultado: Swing - Utilizando componentes A biblioteca Swing tem uma série de classes para incrementar os componentes visuais de uma janela, como, por exemplo, caixa de texto, botões, labels e etc. Adicione agora uma caixa de texto (JTextField), uma etiqueta (JLabel) e um botão (JButton). Os componentes devem ser adicionados a um contêiner (Container) que administrará o agrupamento e exibição dos mesmos. Use o JPanel (painel) como contêiner. Crie a classe Form2. Para ver o resultado, volte no código do TesteForm.java e mude de Form para Form2, ou para o nome da classe que você quer ver o resultado. Adicionando mais componentes ao Formulário: Crie a classe Form3. Trabalhando com Eventos Na janela acima, por mais que você clique nos botões, nada acontecerá. Isso porque, emJava, é preciso adicionar os manipuladores de eventos, que ficam "ouvindo" se algum evento é disparado. Isso é feito através da implementação de algumas interfaces. Para eventos como o click do mouse, deve ser implementada a interface ActionListener. Essa interface exige a implementação do método e dá um método actionPerformed: Passo a passo para implementar um evento 1 - Importar o pacote adequado: 2 - A classe deve implementar a interface adequada: 3 - Criar os métodos para atender a interface: 4 - Adicionar um ouvinte ao componente: Resultado: Trabalhando com o Teclado Basta implementar a interface KeyListener: Métodos a serem implementados: Adicionando ouvintes aos componentes: Digite o exemplo completo na classe Form5. Lembrando que o no txtIdCategoria: evento do teclado está escutando Por isso, os eventos só serão chamados quando esse controler estiver selecionado. Se ele não estiver selecionado os eventos não irão funcionar. Criando um projeto completo Para concluir o curso, crie um exemplo simples, mas completo, que utilize a interface Swing e o banco de dados MySQL. Primeiro, crie no MySQL, um novo Schema (banco de dados) chamado mercado, e adicione uma tabela chamada produto. Pronto, não mexa mais no banco de dados. Volte ao Eclipse e feche o projeto atual, clicando com o botão direito do mouse sobre oprojeto1 e selecionando Close Project: Agora crie um novo projeto (File > New > Java Project), de acordo com a imagem abaixo: Preencha as informações, conforme mostra a imagem abaixo, e clique em Finish para criar o projeto. No projeto, adicione o conector Java do MySQL para acessar o banco de dados. Caso contrário, dará erro. Agora crie o pacote br.com.aprendamais.appmercado.model: A primeira classe a ser criada se chamará Produto e terá a mesma estrutura da tabela produtos. Note que, por se tratar de um modelo, a classe foi criada no package model: As propriedades são iguais aos campos da tabela Para acessar o banco de dados, crie a classe ConnectionMySQL dentro de outro pacote com o nome de br.com.aprendamais.appmercado.da Note que, assim como a classe Produto, a classe de conexão está em um package separado. Obs: Lembre-se de adicionar o conector do MySQL no projeto. Para finalizar essa parte do banco de dados, crie a classe que será utilizada para persistir os dados; ou seja, ela é que irá acessar o banco de dados. Então, crie a classe ProdutoDA no mesmo package da classe conexão. Nessa classe, primeiro as constantes devem ser criadas com as query SQL que serão utilizadas na classe: Agora crie o método save. Nele, primeiro é verificado se o produto é nulo: Se não for, pega-se uma conexão aberta: É verificado se o produto possui um id: Se sim, é criado o comando de atualização: Em seguida, é informado o valor do quinto parâmetro (a quinta interrogação): Como apenas esse parâmetro é diferente na atualização, informe-o já dentro do if. Se o produto não possuir um id, crie o comando de inserção: Para ambos os casos, os primeiros parâmetros dos comandos são iguais. Então, eles são informados após o if e else: Lembrando que a ordem dos parâmetros deve ser a mesma ordem dos “?” nos comandos. Caso contrário, dará erro quando o comando for executado. Com o comando criado, ele é executado: E a ação “comitada”: No finally os objetos são fechados: Criando um Projeto Completo Agora crie o método remove. Note que esse método é parecido com o método save, com a diferença que está executando o comando DELETE do SQL. Antes de criar os métodos método convertToProdutos. de pesquisa, adicione o Ele recebe um ResultSet como parâmetro: E o converte para List: Agora, para listar todos os produtos do banco de dados, adicione o método getProdutos. Nele é criado o comando que lista todos os produtos do banco: E é executado em seguida: O ResultSet retornado é passado para método convertToProdutos para ser criada uma lista: o Que é retornada pelo método: Para permitir a busta por nome, adicione o método findByName. Note que o método é parecido com o método getProdutos, com a diferença que inicialmente é verificado se a string name possui algum valor: Se não, é retornada uma lista vazia. Dentro do try..catch é criado o SQL para pesquisa de nome: E passado o seu parâmetro: O % no final do comando é utilizado para pesquisar qualquer produto que inicie com o nome indicado. Para finalizar a classe, adicione o método findById. Note que o método é parecido com o método findByName, com a diferença que retorna apenas um produto, e não uma lista. Na próxima página você irá criar as interaces gráficas. Criando a interface gráfica Em Java, a interface gráfica é criada adicionando cada componente a ela, sendo que tais componentes podem possuir várias linhas de código de configuração. A interface do exemplo terá alguns componentes que deverão ser criados em quatro partes separadas, para não ficar uma classe complexa, confusa e cheia de códigos. As partes são: formulação de edição, formulário de listagem, tabela (que precisa de duas classes e será adicionada no formulário de listagem) e formulário principal, que irá exibir os outros dois formulários. Formulário de edição Crie uma classe chamada FormEdit, no pacote br.com.aprendamais.appmercado.ui, para que a aplicação fique organizada. Nela, primeiramente adicione a definição da interface abaixo: Essa interface será utilizada como “callback” para que outra classe saiba quando um produto for alterado. Adicione as propriedades abaixo: Essas propriedades são os componentes do formulário. A primeira é uma constante, com o tamanho dos componentes, enquanto a última é o callback. Para os componentes seguintes getters e setters: do formulário, adicione os Note que, para os componentes, foi pega e retornada uma String e não o componente: Como outra classe não poderá alterar esse componte, é retornado apenas o seu conteúdo; outra classe pode apenas informar um conteúdo para o compontente. Repare que, para a propriedade produto, além de alterar o valor da propriedade é alterado também o valor dos componentes: Ou pego o valor dos componentes: Desta forma, essa propriedade sempre terá o conteúdo atualizado dos componentes. Para adicionar os elementos no Panel, adicione os dois métodos abaixo: Note que é utilizado o BorderLayout para o panel: Esse layout permite alinhar o componente ao adicioná-lo. Como é feito no final do método: Para os elementos ficarem organizados no formulário, cada um é adicionado a um panel com layout do tipo FlowLayout: Esse layout organiza os componentes horizontalmente, impedindo que fiquem “quebrados”. Observe também que, para os botões: Foi criado um método: Onde o último parâmetro é um ActionListener. Para organizar a classe, crie os dois ActionListener dos botões como classe interna. A primeira, SaveProdutoListener, Onde os dados do formulário são passados para o método save da classe ProdutoDA: Então é criada uma claixa de diálogo para informar ao usuário que os dados foram salvos: O primeiro parâmetro do método ShowMessageDialog é o Frame da tela onde a caixa de diálogo será exibida. Como o panel será adicionado nesse frame, é pego o “parent” do panel, que no caso será o frame que ele estará adicionado. O segundo parâmetro do método é a mensagem que será exibida. O terceiro, o título da caixa de diálogo. E o último, o ícone que a caixa de diálogo irá exibir. Criando a Interface Gráfica O segundo Listener será a classe interna DeleteProdutoListener. ela, são criadas as opções que serão exibidas na caixa de confirmação de exclusão: Se isso não for informado, serão pegos os valores-padrão do sistema operacional. Os parâmetros inicais são iguais aos do método ShowMessageDialog, explicado acima. Com a diferença que, após o parâmetro de título, são informadas quantas opções a caixa de diálogo irá exibir, sendo JOptionPane.YES_NO_OPTION, apenas as opções Sim e Não. Em seguida é informado o tipo de mensagem. No parâmetro seguinte (o parâmetro com null), é possível definir um ícone personalizado (ao definir null, é utilizado o padrão). Nos dois últimos parâmetros são informados os textos dos botões e o botão que será selecionado quando a caixa de diálogo for exibida. O método showOptionDialog retorna o código do botão selecionado pelo usuário. Desta forma, se o botão for a opção Sim (YES_OPTION): O produto será excluído: Chamando o método remove da classe ProdutoDA. E o usuário será notificado da exclusão: Se o usuário selecionar Não na caixa de confirmação, nada acontecerá. Para limpar o formulário adicione o seguinte método: A chamada do método initComponent, bem como a atribuição do callback serão definidas no construtor da classe. Note que o construtor recebe a interface como parâmetro. Assim, para instanciar essa classe é necessário que o Listener seja definido. Tabela A JTable padrão não vem com uma série de recursos. Então, para driblar essa ausência, aprenda a criar uma JTable customizada. Primeiro é preciso criar um modelo para a tabela – no caso, uma classe que herde a classe AbstractTableModel – e, nessa classe, é preciso definir alguns métodos. Nessa classe é importante definir os métodos que possuem a anotação @Override. No primeiro: É retornado o tipo de dado dos campos, que é definido na propriedade: Dessa forma a tabela saberá como lidar com os dados de cada coluna. O segundo método: Retorna o número de linhas. Isso é importante porque, sem essa informação, a tabela não exibe nenhuma linha. Em seguida é retornado o número de colunas: Tal como o método getRowCount, sem essa informação a tabela não exibe nenhuma coluna. O método getValueAt: É utilizado para pegar um valor da tabela. Com ele é possível pegar um valor na posição informada por parâmetro. Como os registros estarão em um objeto Produto, será preciso desmembrar esse objeto para retornar o valor correto. Para pegar os nomes das colunas, adicionando o método abaixo: A JTable utilizará esse método para saber o nome de cada coluna. Essas informações são passadas automaticamente para a JTable, não sendo necessário adicionar mais código para ter tais recursos na tabela. O método reload: É utilizado para atualizar o JTable. Para que o código fique mais organizado, crie uma classe que estenda a classe JTable. No construtor da classe é definido o seu modelo: E um método para pegar o item selecionado: Bem como para atualizar o JTable: Na próxima página vamos criar o formulário de listagem. Formulário de listagem Crie a classe FormLista, igual ao formulário de edição. Primeiro, crie nela a interface interna. Que será utilizada para notificar outras classes de que a tabela foi selecionada. Em seguida, adicione as seguintes propriedades: Para a propriedade panel, adicione a getter abaixo: Para atualizar a tabela, adicione este método: Para iniciar os componentes, adicione o método initComponent Nesse método, repare que ao definir a tabela, é informado um tamanho: E um Listener: Que é definido abaixo: Onde, se um item da tabela for selecionadado (com double clique), o listener é informado e recebe os dados do item selecionado: Voltando ao método initComponent, um Listener para o botão: Que terá este código: também é definido Onde é feita a pesquisa pelo nome que o usuário digitou: Formulário Principal Para exibir o formulário de edição e o de listagem na mesma interface, crie a classeFormPrincipal. Ela irá implementar as interfaces: FormEdit.AlterProdutoListener eFormLista.SelectedT ableListener, para que sejam notificadas das alterações nos outros formulários. Nela, também defina as propriedades abaixo: Que são inicializadas no método initComponent. Os formulários são método addComponent: adicionados ao Frame, no Note que o formulário de edição é adicionado no topo do frame (north = norte = topo): E o formulário de listagem é adicionado na parte de baixo (south = sul): Esses métodos serão chamados no construtor da classe: No método notifyAlterProduto, que será chamado quando um produto for alterado, a tabela será atualizada: E no método selectedTable, que será chamado quando a tabela for selecionada, são carregados os dados no formulário de edição: Execução Para executar a aplicação é preciso adicionar uma classe, que possui o método main, conforme o código abaixo: Note que, nessa classe, só há a necessidade de instanciar a classe FormPrincipal: Ao executar essa classe, o formulário será apresentado: Informe os dados de um produto: Clique em Salvar, para salvá-lo: Clique em OK. O produto salvo será exibido na tabela: Insira alguns produtos: No campo Nome, ao digitar um nome (ou o começo dele) os produtos serão listados: Ao clicar duas vezes sobre um produto, ele será carregado no formulário de edição: Os dados poderão ser alterados: Ou excluídos, ao aparecer a caixa de diálogo abaixo: Se clicar em Não, nada acontecerá; se clicar em Sim, o produto será excluído: Ao excluir um aviso informando a exclusão aparece, clique em OK: A tabela será carregada novamente, agora sem o item excluído: Fim do curso