JAVA

Propaganda
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
Download