Apostila de Java da NeoGrid

Propaganda
APOSTILA DE JAVA
2
Java ................................................................................................................................ 7
Características da Linguagem .................................................................................... 7
Máquina Virtual Java ................................................................................................. 8
O Ambiente de Execução Java .................................................................................. 9
Carregador de Classes ................................................................................................ 9
Verificador de ByteCode ........................................................................................... 9
Processos do Verificador ........................................................................................... 9
Aplicação Básica Java.............................................................................................. 10
Descrevendo AloMundo .......................................................................................... 10
Introdução a Classes e Pacotes ................................................................................ 11
Usando a Documentação API do Java ..................................................................... 12
Exercício JAVA1 ..................................................................................................... 12
Identificadores, Palavras Chaves e Tipos .................................................................... 12
Ponto-e-vírgulas, Blocos .......................................................................................... 12
Identificadores.......................................................................................................... 13
Palavras-Chave do Java ........................................................................................... 13
Tipos Básicos do Java .............................................................................................. 13
Lógico – boolean...................................................................................................... 13
Texto – char e String ................................................................................................ 13
Inteiros – byte, short, int, and log ............................................................................ 13
Ponto Flutuante – float e double .............................................................................. 14
Variáveis, Declarações, e Instruções ....................................................................... 14
Convenções do Código Java .................................................................................... 14
Expressões e Controle de Fluxo................................................................................... 15
Variáveis .................................................................................................................. 15
Inicializando Variáveis ............................................................................................ 16
Operadores ............................................................................................................... 16
Expressões Lógicas .................................................................................................. 17
Concatenando Strings com + ................................................................................... 17
Casting ..................................................................................................................... 17
Casting de Expressões.............................................................................................. 18
Instruções ................................................................................................................. 18
Instrução if, else ....................................................................................................... 18
Instrução switch ....................................................................................................... 19
Instruções de Loop ................................................................................................... 20
Instrução for ............................................................................................................. 20
Instrução while ......................................................................................................... 20
Instrução do .............................................................................................................. 21
Controles Especiais de Fluxo ................................................................................... 21
Instrução break ......................................................................................................... 21
Instrução continue .................................................................................................... 21
Exercício JAVA2 ..................................................................................................... 22
Exercício JAVA3 ..................................................................................................... 22
Exercício JAVA4 ..................................................................................................... 22
Exercício JAVA5 ..................................................................................................... 22
Exercício JAVA6 ..................................................................................................... 22
Classe e objeto ............................................................................................................. 23
Criando uma classe .................................................................................................. 23
Criando um objeto.................................................................................................... 23
Criando um objeto – Alocação de Memória ............................................................ 24
Tipos de Referência ................................................................................................. 24
3
Exercício JAVA7 ..................................................................................................... 25
Arrays ........................................................................................................................... 25
Declarando Arrays ................................................................................................... 26
Criando Arrays ......................................................................................................... 26
Inicializando Arrays ................................................................................................. 26
Tamanho de um Array ............................................................................................. 27
Redimensionando um Array .................................................................................... 27
Copiando Arrays ...................................................................................................... 28
Ordenando Arrays .................................................................................................... 28
Exercício JAVA8 ..................................................................................................... 28
Exercício JAVA9 ..................................................................................................... 28
Classes e Objetos ......................................................................................................... 29
Princípios dos Objetos ............................................................................................. 29
Classes e Objetos ..................................................................................................... 29
Definindo Métodos .................................................................................................. 31
Passagem por valor .................................................................................................. 32
A Referência this...................................................................................................... 32
Ocultando Dados ...................................................................................................... 33
Encapsulamento ....................................................................................................... 33
Sobrecarregando Métodos ....................................................................................... 34
Exercício JAVA10 .................................................................................................. 34
Exercício JAVA11 .................................................................................................. 34
Exercício JAVA12 .................................................................................................. 35
Construindo e Inicializando Objetos ............................................................................ 35
Construtores ............................................................................................................. 35
Pacotes ..................................................................................................................... 36
A Instrução import ................................................................................................... 36
Diretório de Pacotes ................................................................................................. 37
Exercício JAVA13 ................................................................................................... 37
Exercício JAVA14 ................................................................................................... 37
Exercício JAVA15 ................................................................................................... 37
Herança ........................................................................................................................ 37
O que é Herança? ..................................................................................................... 37
A palavra chave Extends .......................................................................................... 38
Herança Simples ...................................................................................................... 38
Construtores não são Herdados ................................................................................ 39
Polimorfismo............................................................................................................ 39
Coleções Heterogêneas ............................................................................................ 39
Polimorfismo de Argumentos .................................................................................. 40
O Operador instanceof ............................................................................................. 40
Convertendo Objetos ............................................................................................... 40
Sobrescrevendo Métodos ......................................................................................... 41
Regras sobre Métodos Sobrescritos ......................................................................... 42
A Palavra Chave super ............................................................................................. 42
Invocando Construtores da classe Pai ...................................................................... 43
Exercício JAVA16 ................................................................................................... 43
Exercício JAVA17 ................................................................................................... 44
Características da Linguagem ...................................................................................... 44
Variáveis do tipo Static ............................................................................................ 44
Métodos do tipo Static ............................................................................................. 45
Inicializadores do tipo Static.................................................................................... 45
Exercício JAVA18 ................................................................................................... 46
4
Exercício JAVA19 ................................................................................................... 46
Dados e Métodos Orientados a Objetos ....................................................................... 46
Palavra chave final ................................................................................................... 47
Classes final ............................................................................................................. 47
Métodos final ........................................................................................................... 47
Variáveis final .......................................................................................................... 47
Classes Abstratas ..................................................................................................... 47
Exercício JAVA20 ................................................................................................... 48
Interfaces ...................................................................................................................... 48
Exercício JAVA21 ................................................................................................... 49
Exercício JAVA22 ................................................................................................... 49
Controle de Acesso ...................................................................................................... 49
Operador = = versus Método equals( ) .................................................................... 50
Método toString( ).................................................................................................... 51
Classes Internas ........................................................................................................ 51
Classes Wrapper....................................................................................................... 52
Exercício JAVA23 ................................................................................................... 53
Exceções ...................................................................................................................... 53
Instruções try e catch ............................................................................................... 54
Instrução finally ....................................................................................................... 54
Instrução throw ........................................................................................................ 55
Cláusula throws........................................................................................................ 55
Categorias de Exceção ............................................................................................. 55
Tratando ou Declarando Exceções........................................................................... 56
Criando Suas Próprias Exceções .............................................................................. 56
Exercício JAVA24 ................................................................................................... 57
Exercício JAVA25 ................................................................................................... 57
Datas e Calendário ....................................................................................................... 57
Criando Datas e Calendários .................................................................................... 57
Formatando Datas .................................................................................................... 57
Calculando Datas ..................................................................................................... 58
Exercício JAVA26 ................................................................................................... 58
Coleções ....................................................................................................................... 59
Principais classes e interfaces .................................................................................. 59
Ordered e Sorted ...................................................................................................... 60
List ........................................................................................................................... 61
ArrayList .................................................................................................................. 61
Vector ....................................................................................................................... 61
LinkedList ................................................................................................................ 61
Set ............................................................................................................................ 61
HashSet .................................................................................................................... 61
LinkedHashSet ......................................................................................................... 61
TreeSet ..................................................................................................................... 62
Map .......................................................................................................................... 62
HashMap .................................................................................................................. 62
Hashtable.................................................................................................................. 62
LinkedHashMap ....................................................................................................... 62
TreeMap ................................................................................................................... 62
Exercício JAVA27 ................................................................................................... 62
Exercício JAVA28 ................................................................................................... 62
Componentes Gráficos ................................................................................................. 63
AWT ........................................................................................................................ 63
5
Swing ....................................................................................................................... 63
Containers ................................................................................................................ 63
Frames ...................................................................................................................... 63
Panels ....................................................................................................................... 63
Gerenciadores de Layout ......................................................................................... 64
FlowLayout .............................................................................................................. 64
BorderLayout ........................................................................................................... 65
GridLayout ............................................................................................................... 66
CardLayout .............................................................................................................. 67
Classe JComponent .................................................................................................. 68
JLabel ....................................................................................................................... 68
JTextField ................................................................................................................ 69
JButton ..................................................................................................................... 69
JCheckBox ............................................................................................................... 70
JRadioButton............................................................................................................ 70
JMenuBar ................................................................................................................. 71
JMenu....................................................................................................................... 71
JMenuItem ............................................................................................................... 71
JComboBox.............................................................................................................. 72
JList .......................................................................................................................... 72
JTable ....................................................................................................................... 72
JTree......................................................................................................................... 73
Exercício JAVA29 ................................................................................................... 73
Exercício JAVA30 ................................................................................................... 73
Exercício JAVA31 ................................................................................................... 74
Eventos ......................................................................................................................... 74
O que é um Evento? ................................................................................................. 74
Fontes de evento ...................................................................................................... 74
Manipuladores de evento ......................................................................................... 74
Modelo de Delegação .............................................................................................. 74
Comportamento de GUI ........................................................................................... 75
Categorias de Eventos .............................................................................................. 75
Múltiplos listeners .................................................................................................... 77
Adaptadores de Eventos ........................................................................................... 78
Classes anônimas ..................................................................................................... 78
Exercício JAVA32 ................................................................................................... 79
Exercício JAVA33 ................................................................................................... 79
Exercício JAVA34 ................................................................................................... 79
Applets ......................................................................................................................... 79
O que é um Applet? ................................................................................................. 79
Carregando um Applet ............................................................................................. 79
Restrições de Segurança em Applet ......................................................................... 80
Os Métodos de um Applet ....................................................................................... 80
Mostrando um Applet .............................................................................................. 80
O Método init( ) ....................................................................................................... 81
O Método start( ) ...................................................................................................... 81
O Método stop( ) ...................................................................................................... 81
O Método paint( )..................................................................................................... 81
O Método repaint( ) ................................................................................................. 82
O Método update(Graphics g) ................................................................................. 82
Applet Tag ............................................................................................................... 82
Características Adicionais de Applet ....................................................................... 83
6
Lendo Parâmetros .................................................................................................... 83
Applet/Application ................................................................................................... 84
Exercício JAVA35 ................................................................................................... 84
Threads ......................................................................................................................... 85
Criando uma Thread ................................................................................................ 85
Iniciando uma Thread .............................................................................................. 86
Escalonamento de Threads ...................................................................................... 86
Finalizando uma Thread .......................................................................................... 87
Exercício JAVA36 ................................................................................................... 87
Stream I/O e Arquivos ................................................................................................. 87
Stream I/O ................................................................................................................ 87
Entrada de Dados ..................................................................................................... 88
Métodos Básicos de uma SubClasse de InputStream .............................................. 88
Saída de Dados ......................................................................................................... 88
Métodos Básicos de uma SubClasse de OutputStream ........................................... 88
Classes Streams Úteis .............................................................................................. 89
FileInputStream e FileOutputStream ....................................................................... 89
BufferedInputStream e BufferedOutputStream ....................................................... 89
DataInputStream e DataOutputStream .................................................................... 89
Métodos DataInputStream ....................................................................................... 89
Métodos DataOutputStream..................................................................................... 89
PipedInputStream e PipedOutputStream ................................................................. 90
URL Input Streams .................................................................................................. 90
Abrindo um Input Stream ........................................................................................ 90
Readers ..................................................................................................................... 90
Writers...................................................................................................................... 91
Código de Página ..................................................................................................... 91
Files .......................................................................................................................... 92
Criando um novo arquivo/pasta ............................................................................... 92
Funções de Arquivos................................................................................................ 92
Acessando Arquivos Randomicos ........................................................................... 93
Gravando um objeto ................................................................................................. 93
Lendo um objeto ...................................................................................................... 94
Exercício JAVA37 ................................................................................................... 94
Exercício JAVA38 ................................................................................................... 94
Exercício JAVA39 ................................................................................................... 94
Networking .................................................................................................................. 94
Sockets ..................................................................................................................... 94
Estabelecendo a Conexão ........................................................................................ 95
Enviando a Conexão ................................................................................................ 95
Portas TCP/IP........................................................................................................... 95
Servidor de TCP/IP .................................................................................................. 95
Cliente de TCP/IP .................................................................................................... 96
Exercício JAVA40 ................................................................................................... 96
JDBC "Driver" ............................................................................................................. 96
Pacote java.sql.......................................................................................................... 97
Interfaces do JDBC .................................................................................................. 97
Registrando um driver JDBC ................................................................................... 97
Criando uma conexão .............................................................................................. 98
Criando uma instrução SQL..................................................................................... 98
Recebendo dados do banco ...................................................................................... 98
Enviando dados ao banco......................................................................................... 99
7
Datas para SQL ........................................................................................................ 99
Tabela de métodos setXXX ................................................................................... 100
Tabela de métodos getXXX ................................................................................... 100
Exercício JAVA41 ................................................................................................. 100
Java
A plataforma Java é composta de : uma linguagem de programação, um
ambiente de desenvolvimento e um ambiente de aplicação.
A linguagem Java permite criar applets para a World Wide Web e aplicações.
Applet é o termo usado para uma miniaplicação que é executada dentro de uma
página html. Aplicações são programas que não exigem um navegador para executar.
São programas que rodam em qualquer máquina onde o ambiente runtime do Java
está instalado.
Características da Linguagem
Parecida com C, C++
Java tem aparência de C ou de C++, embora a filosofia da linguagem seja diferente.
Java também possui características herdadas de muitas outras linguagens de
programação.
Compilada
Um programa em Java é compilado para o chamado "byte-code", que é próximo as
instruções de máquina, mas não de uma máquina real. O "byte-code" é um código de
uma máquina virtual idealizada pelos criadores da linguagem.
Portável
O "byte-code" gerado pelo compilador para a sua aplicação específica pode ser
transportado entre plataformas distintas que suportam Java. Não é necessário
recompilar um programa para que ele rode numa máquina e sistema diferente, ao
8
contrário do que acontece por exemplo, com programas escritos em C e outras
linguagens.
Orientada a Objetos
Java suporta herança, mas não herança múltipla. A ausência de herança múltipla pode
ser compensada pelo uso de herança e interfaces, onde uma classe herda o
comportamento de sua superclasse além de oferecer uma implementação para uma ou
mais interfaces. Java permite a criação de classes abstratas.
Segurança
A presença de coleta automática de lixo evita erros comuns que os programadores
cometem quando são obrigados a gerenciar diretamente a memória. A eliminação de
ponteiros, em favor do uso de vetores, objetos e outras estruturas traz benefícios em
termos de segurança. A presença de mecanismos de tratamento de exceções torna as
aplicações mais robustas, não permitindo que elas abortem, mesmo quando rodando
sob condições anormais.
Suporta Concorrência
A linguagem permite a criação de maneira fácil, de várias "threads" de execução.
Suporte Programação de Sistemas Distribuídos
Java fornece facilidades para programação com sockets, remote method call, TCP-IP,
etc.
Máquina Virtual Java
Java Virtual Machine é o elemento mais importante da arquitetura do Java. Somente
dentro dele os códigos de Java podem ser executados.
Uma máquina imaginária que é implementada emulando isto em software na
máquina. Códigos para a Máquina Virtual Java é armazenada em arquivos .class
cada qual contêm código para no máximo uma classe pública.
A Especificação da Máquina Virtual Java fornece as especificações de plataforma de
hardware para a qual todo o código Java é compilado. Esta especificação permite ao
Java ser uma plataforma independente, porque a compilação é feita para uma máquina
virtual conhecida como Máquina Virtual Java. (JVM).
Bytecodes são instruções de código de máquina para o JVM. Todo interpretador Java,
tanto uma ferramenta de desenvolvimento ou um navegador possuem implementação
da JVM.
A especificação de JVM provê definições concretas para o implementação do
seguinte:
 Conjunto de instruções (equivale ao de uma CPU)
 Conjunto de registradores
 Formato do código dos bytecodes da classe
 Pilha
 Gerenciamento Automático de memória.

9
Área de memória
O Ambiente de Execução Java
Na execução de um código compilado, a JVM executa três tarefas principais:
Carregar o código – executado pelo carregador de classe
Verificar o código – executado pelo verificador de bytecode
Executar o código–executado por interpretador Java
Carregador de Classes
O carregador de classe carrega todas as classes necessárias para a execução de um
programa sejam elas locais ou da rede. As classes locais sempre serão carregadas
primeiro. Uma vez que todas as classes estiveram carregadas, o código é executado.
Não é permitido acessar endereços de memória sem autorização nas áreas fora da
JVM.
Verificador de ByteCode
O código Java passa em vários testes antes de ser executado em sua máquina. O JVM
põe o código em um verificador de bytecode que testa o formato dos bytecodes e
checa para não permitir violamento de ponteiros, privilégios de acesso em objetos, ou
tentar mudar o tipo do objeto.
Processos do Verificador
10
O verificador de bytecode faz quatro processos de verificação no código de um
programa. Assegura que o código adere às especificações de JVM e não viola
integridade do sistema operacional. Se o verificador completar todos os processos sem
erro, então o seguinte é assegurado:





As classes aderem ao formato de classe da especificação de JVM.
Não há nenhuma violação de acesso a recursos restritos.
O código não causa nenhum estouro de pilha.
São conhecidos os tipos de parâmetros.
Não ocorre nenhuma conversão ilegal de dados.
Aplicação Básica Java
Como qualquer outra linguagem de programação, a linguagem Java é usada para criar
aplicações. Esta aplicação simples exibe o texto Alo Mundo! na tela.
1 // Exemplo de comentario
2 public class AloMundo {
3
public static void main (String args[ ]) {
4
System.out.println("Alo Mundo!");
5
}
6 }
Estas linhas são os componentes mínimos necessários para imprimir Alo Mundo! na
sua tela.
Descrevendo AloMundo
A linha 1 é uma linha de comentário .
1 // Exemplo de comentario
A linha 2 declara a classe AloMundo. O nome de classe especificado cria um arquivo
chamado AloMundo.class no mesmo diretório do código fonte AloMundo.java. O
arquivo AloMundo.class contém o código compilado para a classe pública
AloMundo.
public class AloMundo
A linha 3 é onde começa a execução do programa. Outras linguagens de programação,
como C e C++, também usam a declaração main ( ) como o ponto de partida para
execução. Se o programa receber qualquer argumento em sua linha de comando, estes
são passados no parâmetro args do método main ( ). Neste exemplo, nenhum
argumento é usado.
public static void main (String args)
Esta linha específica o seguinte:
public – é um qualificador do método que indica que este é acessível externamente a
esta classe.
static – é outro qualificador que indica que o método deve ser compartilhado por
todos os objetos que são criados a partir desta classe.
void – é o valor de retorno vazio do método. Quando um método não retorna nenhum
valor, tem que ser especificado com void.
11
String args [ ] – é um vetor de strings que é formado quando são passados ou não
argumentos através da linha de comando.
A linha 4 ilustra a chamada do método println para o atributo out da classe ou objeto
System.
System.out.println ("Alo Mundo!");
Linhas 5-6 fecham o método main ( ) e a classe AloMundo, respectivamente.
Compilando e Executando AloMundo
Compilando
Após ter criado o arquivo AloMundo.java, compile o arquivo digitando a seguinte
instrução
javac AloMundo.java
Se o compilador não retornar nenhuma mensagem, o arquivo AloMundo.class é
criado no mesmo diretório do código fonte.
Executando
Para executar a aplicação AloMundo, utilize o interpretador java, localizado no
diretório bin.
java AloMundo
AloMundo!
Introdução a Classes e Pacotes
Uma classe é um termo genérico para um módulo que possui funcionalidade. O Java
vem com diversas classes padrões, que implementam a maioria dos comportamentos,
como por exemplo, classes para prover funções de matemática básica, strings,
gráficos e networking. Um pacote é um grupo de classes relacionadas.
A biblioteca de classe é organizada em muitos pacotes, cada qual contém várias
classes. Os pacotes seguintes são proeminentes:
java.lang contém classes para String, Math, Integer, e Thread.
java.awt contém classes para Abstract Window Toolkit (AWT).
java.applet contém classes para applets.
java.net contém classes para implementação de processos de Networking.
java.io contém classes de tratamento de I/O.
java.util contém classes de tarefas utéis, como geração de número aleatório e funções
de data e calendário.
12
Usando a Documentação API do Java
É uma coleção de arquivos HTML que documentam as classes e métodos da
linguagem Java. A documentação é hierárquica, de forma que a página inicial lista
todos os pacotes como hyperlinks. Se o link de um pacote é selecionado, são listadas
as classes associadas daquele pacote. Selecionando um link da classe, e apresentado
uma página de informação sobre aquela classe. As seções principais de um
documento de classe são as seguintes:








a hierarquia da classe
uma descrição da classe e seu propósito geral
uma lista de variáveis associadas
uma lista de construtores
uma lista de métodos
uma lista detalhada de variáveis, com descrições do propósito e uso de cada
variável
uma lista detalhada de construtores, com descrições
uma lista detalhada de métodos, com descrições
Exercício JAVA1
Compile e execute a classe AloMundo descrita neste capítulo. Use o bloco de notas
para criar o arquivo AloMundo.java. Use os comandos javac e java que se encontram
no diretório <JAVA_HOME>/bin.
Identificadores, Palavras Chaves e Tipos
Ponto-e-vírgulas, Blocos
Na linguagem de programação, uma declaração é uma única linha de código
terminada com um ponto-e-vírgula (;). Por exemplo:
totals = a + b + c;
Um bloco ou uma combinação de declarações é inicializado e finalizado por { }. Essa
sintaxe também é usada para se agrupar declarações que pertencem a uma classe.
Exemplos de declarações de blocos ou agrupamentos:
/ / declarando um bloco
{
x = y + 1;
y = x + 1;
}
// um bloco é usado na definição da classe
public class MinhaData {
int dia;
int mes;
int ano;
}
13
Identificadores
Os identificadores Java, utilizados para nomes de entidades declaradas, devem iniciar
com uma letra, podendo ser incluido um caractere de sublinhado ( _ ) ou um cifrão ( $
), seguidos de letras ou dígitos ou ambos. Quaisquer diferenças nos caracteres, como
acentuação, em um identificador, tornam o identificador único. Letras maiúsculas ou
minúsculas são significativas, pois são considerados identificadores diferentes.
Palavras-Chave do Java
abstract
boolean
break
byte
base
catch
char
class
continue
default
do
double
else
extends
false
final
finally
float
for
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
transient
true
try
void
volatile
while
As palavras-chave na linguagem Java não podem ser utilizadas como identificadores.
Embora pareçam palavras-chave, null, true e false são literais. Contudo, você não
pode utilizar essas palavras como identificadores, embora elas possam ser utilizadas
como parte do identificador.
Tipos Básicos do Java
Lógico – boolean
Os literais booleanos são true e false.
boolean verdade = true;
Nota– Não é permitido em Java interpretar valores numéricos como valores lógicos.
Quando um boolean é requerido, só poderão ser utilizados valores do tipo boolean.
Texto – char e String
Os caracteres aparecem entre aspas simples (‘x’). Um caracter é uma única letra,
número, sinal de pontuação ou outro símbolo.
char letra = 'a';
As strings aparecem entre aspas duplas ("oi"). Uma string é um grupo de caracteres.
String texto = "Este é um texto";
Inteiros – byte, short, int, and log
14
Há quatro tipos inteiros na linguagem de programação de Java. Cada tipo é
declarado usando uma palavra chave como byte, short, int e long. Você pode
representar literais de tipo inteiro que usam a forma decimal, octal, ou hexadecimal
como segue:
2 – dois é um valor decimal
077 – o 0 indica um valor octal
0xBAAC – o 0x indica um valor hexadecimal
As literais acima são do tipo int, a menos que explicitamente seguido pela letra "L." O
L indica um valor longo. Em Java, você pode usar L maiúscula ou minúscula, mas
deve-se evitar l minúsculo, pois pode ser confundida com o número 1.
2L - o L indica que o valor decimal dois é representado como um longo
077L – o zero indica um valor octal
0xBAACL - o 0x indicaum valor hexadecimal
Ponto Flutuante – float e double
Números de ponto flutuante são expressões como números decimais, com um
separador decimal opcional, eventualmente seguido por um expoente. O número deve
ser seguido por f ou F para ser uma constante de precisão simples, ou d ou D para
uma constante de precisão dupla. Todas as constantes de ponto flutuante, a menos que
sejam especificadas com f ou F, são do tipo double.
3.14 - um valor de ponto flutuante (um double)
6.02E23 - um valor float com expoente
2.718F - um valor float
123.4E+306D - um valor double com D redundante
Variáveis, Declarações, e Instruções
O código de exemplo ilustra como declarar e nomear valores do tipo int, float,
boolean, double, char e string:
int x,y;
float z = 3.414f;
double w = 3.1415;
boolean truth = true;
char c;
String str;
String str1 = "olá";
c = 'A';
str = "Oi pessoal!";
x = 6;
y = 1000;
Convenções do Código Java
A seguinte convenção é utilizada na linguagem Java:
15
Classes – o nome da classe deve ter a inicial maiúscula e as demais minúsculas.
Quando você utiliza dois nomes, as iniciais devem ser maiúsculas.
class ContaBancaria
class Curso
Interfaces – o nome da interface deve ter a inicial maiúscula.
interface Conta
Métodos – os nomes do métodos devem iniciar com minúsculas e a próxima palavra
dever ter sua inicial maiúscula.
saque( )
adicioneCurso( )
Variáveis – todas as variáveis deveriam ter o primeiro nome em minúsculo. Palavras
são separadas através de letras maiúsculas. Limite o uso de sublinhado, e evite usar o
dólar sinal ($) porque este caráter tem significado especial a classes internas.
clienteAtual
Constantes – constantes primitivas deveriam ser todas em maiúsculas com as palavras
separadas por sublinhado.
DIA_SEMANA
VELOCIDADE_MAXIMA
Estruturas de Controle – use ({ }) ao redor de todas as declarações, até mesmo de
declarações únicas.
if (x != 0) {
y = 100 / x;
} else {
y = 100;
}
Espaçamento – coloque só uma única declaração em qualquer linha, e use dois ou
quatro espaços de identação para tornar seu código legível.
Comentários – use comentários para explicar segmentos de código que não são
óbvios. Use o // como delimitador de comentário para uma única linha. Você pode
comentar seções grandes de código usando / *... * /.
Expressões e Controle de Fluxo
Variáveis
Há dois tipos de variáveis: variáveis de tipo primitivo ou variáveis de referência. Você
pode declarar variáveis em dois lugares: dentro de um método (método é um termo
sinônimo de função, como main ( )) ou fora de um método, mas dentro da definição
de classe.
As variáveis definidas dentro de um método são chamadas de variáveis locais. As
variáveis definidas no escopo da classe podem ser acessadas por todos os métodos da
classe.
class ClasseExemplo {
16
// variável da classe
int i;
public int metodoUm( ) {
// variável local
int j = 0;
// i e j são acessíveis aqui
return 1;
} // fim do metodoUm
public int metodoDois( ) {
// variável local j é diferente do metodoUm( ).
int j = 0;
// este j é limitado ao corpo de metodoDois().
// a variável i (variável da classe)
// e j (variável local deste método) são
// acessíveis aqui
return j;
} // fim de metodoUm
} //fim de classe
Inicializando Variáveis
Nenhuma variável em um programa Java pode ser usada antes de ser inicializada.
Quando um objeto é criado, as variáveis são inicializadas com os seguintes valores:
Byte
Short
Int
Long
Float
Double
Char
boolean
All reference types
0
0
0
0L
0.0F
0.0D
‘\u0000’ (NULL)
false
null
As variáveis locais devem ser iniciliazadas manualmente. O compilador sinaliza um
erro se encontrar uma condição onde uma variável será utilizada antes de ser
inicializada.
public void calcula ( ) {
int x = (int)(Math.random( ) * 100);
int y;
int z;
if (x > 50) {
y = 9;
}
z = y + x; // uso ilegal antes de inicializar y
}
Operadores
pós-fixados
Unários
Multiplicativos
Aditivos
. [ ] ( ) ; ,
++ -- + - ~ !
* / %
+ -
(data type)
17
deslocamentos
relacionais
igualdade
AND(E) bit a bit
XOR(ou exclusivo)
OR (ou inclusivo)
AND(E) lógico
OR(OU) lógico
condicional
atribuição
<< >> >>>
< > <= >= instanceof
== !=
&
^
|
&&
||
?:
= *= /= %= += -= <<=
&= ^= |=
>>=
>>>=
Expressões Lógicas
Operadores lógicos e relacionais sempre devolvem um valor boolean. A linguagem
Java não converte automaticamente estes valores para um int.
int i = 1;
if (i) i++; // gera um erro de compilação
if (i!=0) i--; // correto
Concatenando Strings com +
O operador + executa uma concatenação de objetos de Strings, gerando uma nova
String.
String saudacao = "Dr. ";
String nome = "Pedro " + "Silva";
String titulo = saudacao + nome;
O resultado é:
Dr. Pedro Silva
Você também pode utilizar o operador + para concatenar uma String com a
representação da String de qualquer tipo primitivo ou de um objeto.
public static String texto(String fala) {
return '<' + fala + '>'; // char mais uma String
}
Casting
Quando um tipo não pode ser atribuído a um outro por conversão implícita, ele poderá
ser, em geral, ter sua conversão forçada explicitamente a um outro tipo.. Se os dois
tipos forem compatíveis, o Java executa a conversão automaticamente. Um valor de
int sempre pode ser nomeado a uma variável long.
Onde seriam perdidas informações, o compilador requer que você confirme a tarefa
com um typecast. Por exemplo, isto pode ser feito "espremendo" um valor long em
uma variável int.
18
long valorGrande = 99L;
int reduzido = (int)valorGrande; //pode haver perda de precisão
O tipo desejado é colocado em parênteses e usado como um prefixo para a expressão
que deve ser modificada. Embora não seja necessário, é aconselhável incluir a
expressão inteira a ser modificada em parênteses.
Casting de Expressões
Variáveis podem receber valores automaticamente se o seu tipo for menor que a nova
variável que irá receber o valor, e assim não perderia informação.
long bigval = 6; // 6 is an int type, OK
int smallval = 99L; // 99L is a long, illegal
double z = 12.414F; // 12.414 is float, OK
float z1 = 12.414; // 12.414 is double, illegal
Para o operador +, quando os dois operandos forem de tipos numéricos primitivos, o
resultado é um int.
Por exemplo:
short a, b, c;
a = 1;
b = 1;
c = a + b;
causa um erro porque cada tipo short passa a ser int na operação +. Altere c para int,
ou faça um typecast short:
c = (short)(a + b)
então o resultado estará certo.
Instruções
Declarações condicionais permitem a execução seletiva de partes do programa de
acordo com o valor de algumas expressões.
Instrução if, else
A sintaxe básica de if, else é:
if
( expressão ) {
instrução 1;
}
E if com else é:
if
( expressão ) {
instrução 1;
} else {
instrução 2;
}
Exemplo:
19
int contador;
String resp = JOptionPane.showInputDialog(
"Quantas pessoas vem?");
contador = Integer.parseInt(resp);
if ( contador < 0 ) {
System.out.println("Erro: o valor do contador eh negativo");
contador=0;
} else {
System.out.println( contador + " pessoas vem almoçar hoje");
}
O código JOptionPane.showInputDialog mostra uma caixa de diálogo para o
usuário digitar um valor String. Onde JOptionPane é uma classe e
showInputDialog é um método.
Instrução switch
A sintaxe da instrução switch é:
switch (expressão) {
case valor1:
instrução 1;
break;
case valor2:
instrução 2;
break;
default:
instrução 3;
break;
}
Nota – A expressão deve conter um valor do tipo int, byte, short, ou char. Não são
permitidos pontos flutuantes, expressões do tipo long e referências a classes.
A condição default é usada para especificar o segmento de código a ser executado
quando o valor da variável ou expressão não foi encontrado em nenhum dos valores
declarados. Se não houver nenhuma declaração de break, o programa irá executar
todas as condições abaixo do primeiro case que satisfizer a expressão sem testar
nenhum de seus valores, até encontrar uma declaração break.
Exemplo 1:
int colorNum=0;
switch (colorNum) {
case 0:
setBackground(Color.red);
break;
case 1:
setBackground(Color.green);
break;
default:
setBackground(Color.black);
break;
}
No exemplo 1, se nenhum dos dois casos satisfazerem a condição, a cor é setada para
preto.
20
Exemplo 2:
int colorNum=0;
switch (colorNum) {
case 0:
setBackground(Color.red);
case 1:
setBackground(Color.green);
default:
setBackground(Color.black);
break;
}
No exemplo 2, mesmo que uma das duas condições sejam satisfeitas, o valor será
setado para preto, pois nenhuma das duas condições possui a instrução break. O Java
irá executar todas as condições, e a última sobrescreverá as demais.
Instruções de Loop
Instruções de loop permitem a execução repetida de blocos de instruções.
Instrução for
A sintaxe de for é:
for (int i=0; i < 10; i++) {
System.out.println("Voce jah estah pronta?");
}
System.out.println("Finalmente");
Nota – O java permite o utilizar a vírgula como separador dentro de estrutura for( ).
Por exemplo,
for (i = 0, j = 0; j < 10; i++, j++) {
System.out.println(i+j);
}
é correto, inicializando i e j para 0, e incrementando i e j depois de executar as
intruções.
Instrução while
A sintaxe do while é:
while (boolean) {
instrução ou bloco;
}
Exemplo:
int i = 0;
while (i < 10) {
System.out.println("Voce jah estah pronta?");
i++;
}
System.out.println("Sim");
21
Instrução do
A sintaxe para do é:
do {
instrução ou bloco;
} while (boolean test);
Exemplo:
int i = 0;
do {
System.out.println("Voce jah estah pronta?");
i++;
} while (i < 10);
System.out.println("Sim");
Controles Especiais de Fluxo
Você pode usar as seguintes declarações para controles adicionais:
break [rótulo];
continue [rótulo];
rótulo: instrução; / / indica um bloco de instrução rotulado
Uma instrução break pode ser utilizada para sair de um bloco qualquer. Um break não
rotulado finaliza o switch, for, while ou do mais interno. Caso você queira finalizar
uma instrução mais externa, utilize um rótulo para a instrução.
Uma instrução continue pula para o fim do laço e avalia a expressão booleana que
controla o laço (instruções while, do while e for).
Instrução break
do {
instrução ou bloco;
if (condition is true)
break;
} while (boolean expression);
Instrução continue
do {
instrução ou bloco;
if (boolean expression)
continue;
} while (boolean expression);
A instrução break com um rótulo chamado loop
loop:
do {
instrução;
do {
instrução;
instrução;
22
if (boolean expression)
break loop;
} while (boolean expression);
instrução;
} while (boolean expression);
A instrução continue com um rótulo chamado test
test:
do {
instrução;
do {
instrução;
instrução;
if (condition is true)
continue test;
} while (condition is true)
instrução;
} while (condition is true);
Exercício JAVA2
Crie um aplicação chamada Fatorial que imprima o fatorial de um número informado
pelo usuário.
Exercício JAVA3
Faça um programa que peça um número entre 0 e 1000 ao usuário. Use o código
Integer.parseInt(JOptionPane.showInputDialog("digite um numero"))
para
solicitar um valor. O programa deve dizer se o número é par ou impar. Se o número
for par (se número % 2 é igual a 0), o programa deve mostrar os números pares
menores que o próprio número.
Exercício JAVA4
Faça um programa que peça um número ao usuário e diga se é um número primo.
Números primos são divisíveis apenas por 1 e pelo próprio número.
Exercício JAVA5
Escreva o metodo main da classe Tabuada que imprime os valores multiplos de m
menores que n. O usuario deve informar os valores de m e n. O valor de n deve ser
maior que m. Por exemplo: Quais são os múltiplos de 2 (m) ate 8 (n)? Resposta: 0, 2,
4, 6
Exercício JAVA6
Escreva uma classe chamada AreaDoTrianguloRetangulo. Peça para o usuário digitar
os valores da base e da altura do triângulo e mostre o valor da área e da hipotenusa. A
área do triângulo é igual a base * altura / 2. A hipotenusa é igual raiz quadrada da
soma dos quadrados da base e altura (catetos). Dica: use a função Math.sqrt() para
calcular a raiz.
23
Classe e objeto
Criando uma classe
Considere a seguinte declaração:
int dia
Você aloca um certo espaço para armazenar e interpretar os conteúdos daquele
espaço. Assim, para definir um novo tipo, tem que especificar quanto de
armazenamento é requerido e como interpretar os conteúdos.
Por exemplo, para definir um tipo que representa uma data, você pode precisar de
espaço para armazenar três inteiros.
class MinhaData {
int dia;
int mes;
int ano;
}
Você pode declarar as variáveis nascimento e casamento como sendo do tipo
MinhaData, e o dia, mes, e o ano são incluídos para estas variáveis. Por exemplo:
MinhaData nascimento, casamento;
Criando um objeto
Objetos são criados utilizando-se uma expressão com a palavra chave new. Criar um
objeto a partir de uma definição de classe é também conhecido como instanciação,
sendo dessa forma, também chamados de instâncias.
MinhaData nascimento;
nascimento = new MinhaData( );
Os objetos criados são alocados em uma área da memória. Os objetos em Java são
acessados via uma referência. A referência meuNascimento é uma variável do tipo
MinhaData que aponta para um objeto criado a partir da classe MinhaData. Qualquer
variável que armazena um objeto contém uma referência ao objeto.
Você pode acessar o dia, mês e ano, utilizando o nome da nova variável mais ponto.
nascimento.dia = 16;
nascimento.mes = 6;
nascimento.ano = 1971;
Exemplo Completo:
public class MinhaData {
int dia;
int mes;
int ano;
public static void main(String[] args) {
MinhaData casamento;
casamento = new MinhaData();
casamento.dia = 8;
24
casamento.mes = 5;
casamento.ano = 1999;
System.out.print("Meu casamento foi dia " + casamento.dia);
System.out.print(" do mes " + casamento.mes);
System.out.println(" do ano de " + casamento.ano);
MinhaData nascimento = new MinhaData();
nascimento.dia = 16;
nascimento.mes = 6;
nascimento.ano = 1971;
System.out.print("Meu nascimento eh dia "+nascimento.dia);
System.out.print(" do mes "+nascimento.mes);
System.out.println(" do ano de "+nascimento.ano);
}
}
A execução da classe acima gera o seguinte resultado:
Meu casamento foi dia 8 do mes 5 do ano de 1999
Meu nascimento eh dia 16 do mes 6 do ano de 1971
Criando um objeto – Alocação de Memória
Em um código, a declaração.
MinhaData hoje;
só aloca espaço na memória para a referência hoje.
hoje
????
A palavra chave new cria o espaço de memória para a classe MinhaData.
hoje = new MinhaData( );
hoje
????
dia
0
0
0
mes
ano
A variável de referência hoje corresponde ao objeto criado.
MinhaData hoje;
hoje = new MinhaData( );
hoje
0x01abcdef
dia
mes
ano
Tipos de Referência
0
0
0
25
Considere este fragmento de código:
int x = 7;
int y = x;
String s = "Hello";
String t = s;
São criadas quatro variáveis: duas do tipo int e duas referências do tipo String. O
valor de x é 7, e este valor é copiado em y.
Com as variáveis s e t, só um objeto String existe e contém o texto "Hello". As
variáveis s e t apontam para um único objeto.
x
0x01abcdef
y
0x02defabc
s
0x03abefcd
t
0x03abefcd
"Hello"
Quando a variável t recebe a String "World", t aponta para um novo objeto.
t = "World";
x
0x01abcdef
y
0x02defabc
s
0x03abefcd
t
0x04cdefab
“Hello”
“World”
Exercício JAVA7
Um ponto pode ser caracterizado pelas coordenadas x e y.
a. Defina uma classe chamada Ponto que representa esta idéia. Defina as
coordenadas x e y como variáveis da classe Ponto.
b. Escreva uma classe Main com um método main ( ); declare duas variáveis
para o tipo Ponto. Chame as variáveis de inicio e fim para representar os
pontos inicial e final. Crie os objetos usando new Ponto( ). Atribua o valor 10
para coordenada x e 15 para coordenada y do objeto inicio. Mostre os valores
das coordendas do objeto inicio. Atribua o valor 20 para a variável x do objeto
fim, e o valor 30 para y do objeto fim. Mostre os valores x e y do objeto fim.
Arrays
26
Declarando Arrays
Um array é uma coleção de variáveis, todas do mesmo tipo. Os componentes de um
array são acessados por índices inteiros simples.
Você pode declarar arrays de qualquer tipo, primitivo ou classe:
char s [];
Ponto p[];
// Ponto é uma classe
char [] s;
Ponto [] p;
A declaração não cria o objeto propriamente dito. Ao invés, a declaração de um array
cria uma referência que você pode usar para percorrer um array.
Criando Arrays
Você cria arrays usando a palavra new:
s = new char[20];
p = new Ponto[100];
A primeira linha cria um array de 20 elementos tipo char. A segunda linha cria um
array de 100 variáveis de do tipo Ponto, mas não cria 100 objetos do tipo Ponto. Estes
devem ser criados separadamente como segue:
p[0] = new Ponto();
p[1] = new Ponto();
O índice inicial de um array sempre sera zero, e se você tentar acessar um índice
superior ao tamanho do array –1, irá gerar um erro.
Inicializando Arrays
Quando você cria um array, todo elemento é inicializado. No caso do array de char,
cada valor é inicializado com zero (‘\u0000’ - nulo). No caso do array tipo Ponto,
cada valor é inicializado com null, pois não fazem referência a nenhum objeto.
Você também pode inicializar arrays da seguinte forma:
String nomes[] = {"Georgianna","Jen","Simon"};
Ponto array[] =
{new Ponto(),
new Ponto(),
new Ponto() };
Color palette[] = {Color.blue,
Color.red,
Color.white };
Outras formas de iniciar um array e seus valores:
String nomes[];
nomes = new String[3];
nomes[0] = "Georgianna";
27
nomes[l] = "Jen"
nomes[2] = "Simon";
int numeros[];
numeros = new int[2];
numeros[0]=34;
numeros[1]=71;
Arrays Multi-Dimensionais
O Java não implementa arrays multi-dimensionais como as outras linguagens. Em
Java, o que existe é um array de array.
Exemplo:
int twoDim [] [] = new int [4] [];
twoDim[0] = new int [5] ;
twoDim[l] = new int[5];
O objeto que é criado por new é um array de quatro elementos. Cada elemento possui
uma referência null para um array de int e cada elemento deve ser inicializado
separadamente.
Nota – Você não pode declarar um array de array da seguinte maneira:
int novo [ ] [4]; //está declaração não é correta.
Como o Java trata o caso de arrays multi-dimensionais diferente das outras
linguagens, você pode inicializar cada elemento do array com um número diferente de
elementos, mas não de tipo diferentes.
twoDim[0]
twoDim[1]
twoDim[2]
twoDim[3]
=
=
=
=
new
new
new
new
int
int
int
int
[2] ;
[4] ;
[6] ;
[8];
Se o seu array possuir um tamanho fixo de elementos, você pode inicializar da
seguinte maneira:
int twoDim [ ] [ ] = new int [4] [5];
Tamanho de um Array
Na linguagem Java, todo array começa no índice 0. Se você quiser listar todos os
elementos deste array, você pode utilizar o atributo length para obter o tamanho
deste array. Caso você queira acessar o ultimo elemento deste array, use length – 1.
Com isso, você evita de tentar acessar um índice fora da faixa.
int list[ ] = new int [10]
for (int i = 0; i < list.length; i++) {
System.out.println(list[i]);
}
Redimensionando um Array
Uma vez criado, um array não pode ser redimensionado, mas você pode usar a mesma
variável de referência criar um novo array:
28
int myArray[] = new int[6];
myArray = new int[10];
Se você não salvar uma referência para o primeiro array, as informações contidas
serão perdidas.
Copiando Arrays
Você pode copiar dados de um array para outro array utlizando o método
arraycopy( ), da classe System.
System.arraycopy(Object arrayfonte,
int fonte_position,
Object arraydestino,
int destino_position,
int length)
Exemplo:
int dados[ ] = { 1, 2, 3, 4, 5, 6 };
int contagem[ ] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
System.arraycopy(dados, 0, contagem, 0, dados.length);
O array contagem passa a conter os seguintes dados: 1, 2, 3, 4, 5, 6, 4, 3, 2,1.
Ordenando Arrays
Você pode ordernar um array usando o método sort da classe Arrays:
Exemplo
public class Megasena extends Object {
public static void main(String args[]) {
int[] mega = new int[6];
for (int i=0;i<mega.length;i++) {
String resp = javax.swing.JOptionPane.
showInputDialog("Digite um numero");
mega[i] = Integer.parseInt(resp);
}
java.util.Arrays.sort(mega);
System.out.println("Mega:");
for (int i=0;i<mega.length;i++) {
System.out.println(mega[i]);
}
}
}
Exercício JAVA8
Crie uma classe chamada Media. No método main, declare uma variável chamada
notas do tipo array de int para 5 notas. Após o usuário informar as notas, o programa
deve calcular e mostrar a média.
Exercício JAVA9
29
Faça uma classe para perguntar 5 questões ao usuário. As perguntas devem ser
definidas como um array de String. As respostas devem ser salvas em um array de
Strings também. Ao final das perguntas o programa deve mostrar as perguntas e as
respostas.
Classes e Objetos
Princípios dos Objetos
A programação orientada a objetos inclui as características da programação
estruturada e um mecanismo para organizar variáveis e algoritmos. Existem três
características principais na orientação a objetos: encapsulamento, polimorfismo e
herança. Todas estas características ajudam a definir uma classe.
Classes e Objetos
O elemento fundamental da programação em Java é a classe. Uma classe contém uma
definição para um tipo comum de objetos. As classes também fornecem a estrutura
para os objetos, e os mecanismos para produzir os objetos a partir da definição da
classe . Uma classe é então um modelo para criação de objetos.
A classe define o que é um objeto e a implementação dos métodos que o objeto
responde. Cada objeto é uma instância de uma classe. Para instanciar um objeto, use o
operador new.
Métodos definem as operações que podem ser executadas pelos objetos. Em resumo,
os métodos definem o que a classe faz. Todos os métodos na linguagem Java
pertencem a uma classe.
Considere o seguinte exemplo de uma classe:
class EmpregadoInfo {
String nome;
String cargo;
String departamento;
}
As variáveis (nome, cargo, e departamento) são chamadas atributos da classe
EmpregadoInfo.
Para instanciar um objeto use a função new e atribua valores aos atributos:
// cria a instância
EmpregadoInfo empregado = new EmpregadoInfo( );
// inicializa os atributos
empregado.nome = "Roberto Javaman";
empregado.cargo = "Gerente";
empregado.departamento = "Doceria";
Você pode usar o objeto empregado da classe EmpregadoInfo.
System.out.println(empregado.nome + " é " +
empregado.cargo + " da " +
empregado.departamento);
30
para imprimir o seguinte:
Roberto Javaman é Gerente da Doceria
Você pode definir um método mostra ( ) dentro da classe para imprimir os dados. Esta
é uma característica fundamental de orientação a objetos, onde são encapsulados
dados e código em uma única entidade. O método mostra ( ) pode ser chamado como
se fosse uma função.
class EmpregadoInfo {
String nome;
String cargo;
String departamento;
public void mostra( ) {
System.out.println(nome + " é " +
cargo + " do " + departamento);
}
}
Este método imprime os dados dos atributos da classe quando o objeto foi criado e
instanciado.
// cria a instância
EmpregadoInfo empregado = new EmpregadoInfo( );
// inicializa os atributos
empregado.nome = "Roberto Javaman";
empregado.cargo = "Gerente";
empregado.departamento = "Doceria";
// imprime o resultado
empregado.mostra( );
Considere a classe Data e uma função chamada mudeParaAmanha ( ) que atualiza a
variável dia.
Você pode criar uma associação entre o tipo Data e o método mudeParaAmanha( ):
public class Data {
int dia, mes, ano;
public void mudeParaAmanha ( ) {
dia++; // código para incrementar 1 ao dia
}
}
Data d = new Data( );
d.dia = 16;
d.mudeParaAmanha( );
System.out.println("Amanhã é "+d.dia);
A idéia que métodos compõe um objeto e podem interagir intimamente com seus
dados é um conceito de orientação a objeto. (Isto difere da idéia que métodos são
entidades separadas.) O termo mensagem é usado freqüentemente para instruir um
objeto a fazer algo com os seus próprios dados; os métodos de um objeto definem o
que aquele objeto pode fazer com os seus próprios dados.
31
Definindo Métodos
Os métodos de uma classe geralmente contêm o código que entende e manipula um
estado de objeto. Cada método recebe um número específico de parâmetros. Os
métodos também possuem um tipo específico de retorno. A sintaxe para um método é
a seguinte:
<modificador_acesso> <tipo_retorno> <nome> ([<lista_parâmetros>])
[throws <exception>] { .... }
Exemplos:
public class SalarioEmpregado {
private double salario;
public void aumentaSalario (double valor) {
salario = salario + valor;
}
public double calculaImposto() {
double imposto = 0;
if (salario > 1200) {
imposto = salario * 0.15;
} else if (salario > 2900) {
imposto = salario * 0.27;
}
return imposto;
}
}
O < nome > pode ser qualquer identificador legal, com algumas restrições baseado
nos nomes que já estão em uso.
O < tipo_retorno > indica o tipo de valor retornado pelo método. Se o método não
retornar valor, deve ser declarado como void.
O < modificador_acesso > pode ser declarado como public, protected e private. O
modificador de acesso public indica que o método pode ser chamado por qualquer
outra classe. private indica que um método só pode ser chamado pelos outros métodos
dentro da própria classe.
O < lista_parâmetros > permite que argumentos possam ser passados ao método.
Elementos da lista são separados por vírgulas, enquanto cada elemento consiste em
um tipo e um identificador.
Por exemplo,
public void mostreValores(int a, int b) {
System.out.print( a );
System.out.print( b );
}
32
instrui o bloco do método mostreValores receber dois parâmetros que serão
mostrados.
Ou um método que retorna um valor:
public int retorneDias() {
return dia; // código do método
}
A cláusula throws < exception > é declarada para testar qualquer erro durante a
execução do método.
Passagem por valor
A linguagem de programação de Java só passa argumentos "por valor;" quer dizer, o
argumento não pode ser mudado pelo método chamado. Quando um objeto é passado
como um argumento a um método, o valor do argumento é uma referência ao objeto.
Podem ser mudados os conteúdos do objeto no método chamado, mas a referência de
objeto nunca é alterada.
A Referência this
this é uma palavra chave usada no método como referência para o objeto corrente. Ela
tem o significado de: "o objeto para o qual este trecho de código está sendo
executado". O uso de this também é válido para fazer chamadas de métodos para o
objeto corrente.
public class Data {
int dia, mes, ano;
public void mudeParaAmanha( ) {
this.dia = this.dia + 1;
}
}
O uso de this muitas vezes é redundante em certas circunstâncias. O código seguinte é
equivalente ao código anterior:
public class Data {
int dia, mes, ano;
public void mudeParaAmanha( ) {
dia = dia + 1;
}
}
Há ocasiões em que this não é redundante. Por exemplo, você poderia querer chamar
um método em alguma classe completamente separada e passar a própria referência
do objeto atual como um argumento. Por exemplo:
public class MinhaData {
int dia, mes, ano;
public void convidaAniversario( ) {
Aniversario.envieConvite(this);
}
}
33
Em outra classe
public class Aniversario
{
public static void envieConvite ( MinhaData d ) {
System.out.print( "Convido para meu aniversario " );
System.out.print( " será dia " + d.dia );
System.out.print( " mes " + d.mes );
System.out.print( " ano " + d.ano );
}
}
Para testar as classes acima:
MinhaData festa = new MinhaData();
festa.dia = 1;
festa.mes = 2;
festa.ano = 2008;
festa.convidaAniversario();
Ocultando Dados
Usando a palavra chave private na declaração de dia, mes, e ano na classe de Data faz
com que somente os métodos desta classe tenham acesso a elas. Qualquer instância a
esta classe em uma outra classe não poderá acessá-las.
public class Data {
private int dia, mes, ano;
}
Em outra classe
public class OutraClasse {
public static void main(String args[ ]) {
Data d = new Data( );
d.dia = 21; // illegal!
}
}
Acesso privado para os atributos traz vantagens para qualidade do programa. Com
isso, o único modo para ler ou atribuir valores só pode ser feito por métodos da
própria classe.
Exemplo:
public class Data {
private int dia, mes, ano;
public int getDia( ) {
return dia;
}
}
Encapsulamento
34
Além de proteger os dados de um objeto de modificação imprópria, forçando o
usuário a ter acesso aos dados por um método, assegura que os dados sempre sejam
tratados da mesma forma.
Se os dados forem completamente acessíveis, cada usuário da classe Data poderia
incrementar o valor do dia, testar o número de dias no mês atual e possivelmente o
fim do ano. Forçando o usuário da classe a usar os métodos, você assegura que o
tratamento seja o mesmo toda vez. Isto faz com que o código seja menos propenso a
manutenção.
Sobrecarregando Métodos
Em Java, cada método possui uma assinatura, que é o seu nome juntamente com o
número e tipo de seus parâmetros. Dois métodos podem ter o mesmo nome se suas
assinaturas possuírem diferentes números ou tipos de parâmetros.
Em algumas circunstâncias, você poderá escrever vários métodos com o mesmo nome
na mesma classe que faz o mesmo trabalho, mas com argumentos diferentes. Digamos
que você precisa de um método de impressão diferente para imprimir dados do tipo
int, float, e String. Esses tipos de dados requerem formatações diferentes, e
manipulações provavelmente variadas. Normalmente você criaria três métodos,
chamado printInt ( ), printFloat ( ), e printString ( ).
A linguagem Java permite usar o mesmo nome de método para mais de um método.
Assim, você pode definir os métodos da seguinte maneira:
public void println(int i)
public void println(float f)
public void println( )
Quando você chamar um destes métodos, o método apropriado é escolhido de acordo
com o tipo de argumento ou número de argumentos passados.
Duas regras se aplicam a métodos sobrecarregados:
O argumento tem que diferir para não permitir equívocos do método a ser chamado.
O tipo de retorno dos métodos diferente, não é suficiente para ser a única diferença. O
número de argumentos dos métodos sobrecarregados tem que ser diferentes.
Exercício JAVA10
Crie uma classe chamada Lampada com um atributo boleano para indicar o seu
estado, se ela está acesa ou apagada. Defina um método para ligar, um para apagar a
lâmpada e outro para mostrar o estado da lampada. No método main crie um objeto
para classe Lampada, ligue a lampada e mostre seu estado.
Exercício JAVA11
Crie uma classe chamada ContaBancaria.java que represente atributos e operações
de uma conta bancária. A conta deve ter os atributos cliente (String), número (int),
35
saldo (double) e especial (boolean). A conta deve ter as operações depósito e saque.
A operação depósito só pode aceitar valores positivos. A operação saque só pode
aceitar valores menores que o saldo, mas se a conta for especial ela pode aceitar
valores menores que o saldo mais 1000 reais.
Exercício JAVA12
Crie uma classe chamada Terminal que no método main faça o seguinte: criar um
objeto para classe ContaBancaria, definir valores para seus atributos, depositar 2000
reais, sacar 1200 reais, mostrar o saldo, sacar 1000 reais, definir como conta especial,
sacar 1000 reais novamente e mostrar o saldo.
Construindo e Inicializando Objetos
Para alocar espaço para um novo objeto, você precisa utilizar o operador new, por
exemplo: new Button("Press me")
O que o operador new faz:
1.Aloca espaço para o novo objeto.
2. As variáveis da classe são inicializadas.
3. Um construtor é executado. Os argumentos são passados entre parênteses para o
construtor.
Construtores
Os construtores são como métodos que possuem o mesmo nome que a classe que eles
inicializam. Como métodos, eles levam nenhum ou alguns parâmetros, mas os
construtores não são métodos, e portanto, não possuem tipo de retorno. Os
parâmetros, caso hajam, são fornecidos entre parênteses após o nome da classe
quando o objeto é criado com new.
Toda classe tem pelo menos um constructor. Se você não escrever um construtor, o
Java gera um construtor. Este construtor não leva nenhum parâmetro e o código é
vazio.
36
No exemplo a seguir, você tem a definição de três construtores, dois recebendo
parâmetros e outro não. Assim como os métodos, você também pode sobrecarregar
construtores, recebendo argumentos ou número de argumentos diferentes.
public class Empregado {
private String nome;
private int salario;
public Empregado(String n, int s) {
nome = n;
salario = s;
}
public Empregado(String n) {
this(n, 0);
}
public Empregado( ) {
this("Não definido");
}
}
Como a classe Empregado tem 3 construtores, podemos criar seus objetos de 3
maneiras diferentes:
Empregado objeto1 = new Empregado("Pedro",1500);
Empregado objeto2 = new Empregado("Paulo");
Empregado objeto3 = new Empregado();
Pacotes
A linguagem Java provê o mecanismo de pacote como um modo para se agrupar
classes relacionadas.
Você pode indicar que um arquivo fonte pertence a um pacote particular usando a
declaração package. Por exemplo:
// classe Empregado do Departamento Financeiro da companhia ABC
package abc.financeiro;
public class Empregado {
....
}
A declaração de pacote, deve estar no começo do arquivo fonte. Só uma declaração de
pacote é permitida e vale para o arquivo fonte inteiro.
Nomes de pacote são hierárquicos, separados por pontos. É comum os elementos do
nome de pacote serem completamente minúsculos.
A Instrução import
Quando você quiser usar pacotes, você usa a declaração de importação para "indicar"
ao compilador onde achar as classes. Por exemplo:
37
import abc.financeiro.*;
public class Gerente extends Empregado {
String departamento;
Empregado surbordinados[ ];
}
Quando você usar uma declaração de pacote, você não precisa importar o mesmo
pacote ou qualquer elemento daquele pacote. Lembre-se que a declaração de
importação é usada para trazer classes de outros pacotes.
A declaração de importação especifica a classe para a qual você quer acesso. Se você
quiser acesso a todas as classes de um pacote, use " *." Por exemplo, ter acesso a
todas as classes do pacote java.awt:
import java.awt.*;
Diretório de Pacotes
Pacotes são "armazenados" em uma árvore de diretório que contém uma ramificação
que é o nome do pacote. Por exemplo:
path/abc/financeiro
path\abc\financeiro
(Unix)
(Windows)
A opção -d para o compilador javac especifica a pasta raiz de uma hierarquia de
pacote na qual são gerados os arquivos de classe (.class).
Exercício JAVA13
Redefina a classe Lampada com um construtor que cria uma lampada no estado aceso
(boleano igual a true).
Exercício JAVA14
Redefina a classe Lampada no pacote auto.eletrico.
Exercício JAVA15
Escreva a classe Carro no pacote auto com 2 atributos do tipo Lampada: um chamado
farolEsquerdo e outro farolDireito. Compile a classe Carro. Onde está a classe Carro e
a classe Lâmpada em relação a pasta raiz (classpath)?
Herança
O que é Herança?
O programador cria um modelo de algo (por exemplo, um empregado), e então
precisa de uma versão mais especializada deste modelo. Por exemplo, você precisa
um modelo para um gerente. Um gerente é um empregado, mas é um empregado com
características adicionais.
Considere as declarações de classes:
38
public class Empregado {
String nome;
Date admissao;
Date nascimento;
}
public class Gerente {
String nome;
Date admissao;
Date nascimento;
String cargo;
int nivel;
String departamento;
Empregado surbordinados[ ];
}
Este exemplo ilustra a duplicação de dados entre a classe Gerente e a classe de
Empregado. Adicionalmente, poderia haver vários métodos que seriam aplicáveis a
Empregado e a Gerente. Herança é uma maneira para criar uma classe nova a partir de
uma classe já existente; chamada subclasse.
A palavra chave Extends
Em orientação a objeto, você pode criar uma nova classe com as mesmas
características de uma classe já definida. Para isto, você utiliza a palavra extends.
public class Empregado {
String nome;
Date admissao;
Date nascimento;
}
public class Gerente extends Empregado {
String cargo;
int nivel;
String departamento;
Empregado surbordinados[ ];
}
Neste exemplo, a classe de Gerente é definida para ter todas as variáveis e métodos
que um Empregado tem. São herdados todas as variáveis e os métodos da definição da
classe pai.
Nota - Esta é uma grande melhoria em termos de manutenção e confiança. Se uma
correção é feita na classe Empregado, então a classe Gerente é corrigida
automaticamente sem que o programador tenha que alterar qualquer coisa, basta
somente atualizar a classe Empregado.
Herança Simples
O Java permite estender somente uma classe. Esta restrição é chamada herança
simples. A linguagem Java impõe a restrição de herança simples para fazer o código
resultante menos confuso. Isto não impede de você criar hierarquias em vários níveis.
Por exemplo: a classe Gerente estende a classe Empregado e a classe Empregado
estende a classe Pessoa.
39
Construtores não são Herdados
Embora a subclasse herde todos os métodos e variáveis de uma classe pai, a subclasse
não herda seus construtores.
Polimorfismo
Descrevendo um Gerente como um Empregado não é só um modo conveniente de
descrever a relação entre estas duas classes. Gerente tem todos os atributos, variáveis
e métodos da classe Empregado. Isto significa que qualquer operação que é legítima
em um Empregado também é legítima em um Gerente. Se o Empregado possui
métodos como aumentarSalario( ), desligar( ), então a classe Gerente também tem.
Um objeto tem só uma forma. Porém, uma variável de classe é polimórfica porque
pode referênciar objetos de formas diferentes. Em Java, há uma classe que é a classe
pai para todas as outras, a classe java.lang.Object. Se definirmos uma variável do
tipo Object podemos referênciar qualquer objeto com ela, por exemplo:
Object geral;
geral = new Pessoa();
geral = new Empregado();
Isso é possível, pois Empregado é uma subclasse de Object.
public class Empregado extends Object
public class Gerente extends Empregado
A classe de objeto define vários métodos úteis, incluindo o método toString( ).
A linguagem Java, permite referênciar um objeto com uma variável que é um dos
tipos da classe pai. Assim você pode dizer:
Empregado objeto1 = new Empregado( );
Empregado objeto2 = new Gerente( );
Usando a variável objeto2, você só tem acesso as partes da classe Empregado; as
partes específicas da classe Gerente são escondidas. Então, o seguinte não é
permitido:
objeto2.departamento = "Finanças"; // departamento é uma variável de
Gerente, e não de Empregado
Coleções Heterogêneas
Uma coleção heterogênea é uma coleção de coisas diferentes. Em orientação a objeto,
você pode criar coleções de diferentes objetos. Por exemplo:
Empregado staff[ ] = new Empregado [1024];
staff[0] = new Gerente( );
staff[l] = new Empregado( );
Você pode escrever um método que classifica os empregados em idade ou ordem de
salário, mesmo que alguns sejam gerentes.
40
Nota - Toda classe é uma subclasse da classe object, assim você pode usar um array
de object como um recipiente para qualquer objeto. Os únicos elementos que não
podem ser acrescentados a um array de objetos são variáveis primitivas. Porém, a
classe Vector seria melhor que um array de Object, porque a classe Vector é projetada
para armazenar coleções heterogêneas de objetos.
Polimorfismo de Argumentos
Você pode escrever métodos que aceitam um objeto "genérico", neste caso a classe
Empregado. Você pode escrever um método em uma classe que recebe um
Empregado e compara o valor do salário para determinar a faixa de imposto a ser
retido. Usando o polimorfismo, você pode fazer isto como segue:
// na classe Empregado
public Imposto calculaImposto(Empregado e) {
//calcula e retorna a faixa de imposto
}
// em outro lugar, na classe aplicação
Gerente m = new Gerente( );
Imposto ir = calculaImposto (m); // isto é permitido, pois Gerente é
um tipo de Empregado
O Operador instanceof
Muitas vezes, você pode querer saber se um determinado objeto é de uma outra
classe. Para tal, você utiliza o operador instanceof.
Suponha a seguinte declaração:
public class Empregado
public class Gerente extends Empregado
public class Contratado extends Empregado
Se você receber um objeto que usa uma referência do tipo Empregado, poderá mostrar
se ele é um Gerente ou um Contratado. Você pode testar isto usando instanceof como
segue:
public void method(Empregado emp) {
if (emp instanceof Gerente) {
// traz o salário
}
else if (emp instanceof Contratado) {
// traz o valor da horas
}
else {
// empregado normal
}
}
Convertendo Objetos
41
Em circunstâncias onde você recebeu uma referência da classe pai, e você
determinou que o objeto é de fato uma subclasse usando o operador de instanceof,
você pode restabelecer a funcionalidade completa do objeto convertendo a referência.
public void method(Empregado emp) {
if (emp instanceof Gerente) {
//converte o objeto para ter acesso a Gerente
Gerente objetoGerente = (Gerente) emp;
System.out.println("Este é o gerente do " +
objetoGerente.departamento);
}
// resto do método
}
Se você não converter o objeto emp, uma falha aconteceria ao acessar
emp.departamento, pois departamento só existe na classe Gerente.
Sobrescrevendo Métodos
Além de poder criar uma nova classe baseada em outra somando características
adicionais, você pode modificar o comportamento existente da classe pai.
Se um método está definido em uma nova classe com o mesmo nome, tipo de retorno
e número de argumentos iguais a da classe pai, este novo método irá sobrescrever o
método da classe pai.
Considere estes métodos da classe Empregado e classe Gerente:
public class Empregado {
String nome;
int salario;
public String getDetalhes( ) {
return "Nome: " + nome + "\n" +
"Salario: " + salario;
}
}
Na classe gerente:
public class Gerente extends Empregado {
String departamento;
public String getDetalhes( ) {
return "Nome: " + nome + "\n" +
"Gerente de " + departamento;
}
}
A classe Gerente tem um método getDetalhes ( ) porque herdou da classe Empregado.
Porém, o método original foi substituído pela outra versão na classe Gerente.
Se criarmos dois objetos para as classes Empregado e Gerente:
Empregado objetoEmp = new Empregado( );
Gerente objetoGerente = new Gerente( );
42
Ao executar objetoEmp.getDetalhes( ) e objetoGerente.getDetalhes ( ), eles
executarão, respectivamente, o método getDetalhes( ) da classe Empregado e
getDetalhes ( ) da classe Gerente.
Ao você declarar
:
Empregado objetoEmp = new Gerente( );
objetoEmp. getDetalhes( )
o método a ser chamado será o da classe Gerente, pois você apenas criou uma variável
do tipo Empregado, mas o objeto é um Gerente.
Regras sobre Métodos Sobrescritos
As seguintes regras se aplicam a métodos sobrescritos:
1. O tipo de retorno do método sobrescrito deve ser idêntico ao método que
sobrescreve.
2. Um método sobrescrito não pode ser menos acessível que o método que
sobrescreve.
3. Um método sobrescrito não pode lançar tipos diferentes de exceções que o método
que sobrescreve.
Estas regras são o resultado da natureza de polimorfismo combinada com a
necessidade da linguagem Java ser "typesafe."
public class Pai {
public void metodo ( ) {
}
}
public class Filho extends Pai {
private void metodo ( ) {
}
}
public class Exemplo {
public void executar( ) {
Pai pl = new Pai( );
Pai p2 = new Filho( );
pl. metodo ( );
p2. metodo ( );
}
}
Devido a semântica da linguagem Java, p2.metodo( ) deveria executar o método da
classe Filho. Quando você sobrescreve um método, você só pode dar mais acesso a
este, e não restringi-lo. Neste caso, a classe Pai declara o método como public, e ao
refazer o método na classe Filho, ele é declarado como private, o que causará um erro
de semântica na compilação.
A Palavra Chave super
43
A palavra chave super está disponível em todos os métodos não-estáticos de uma
classe estendida. Para acesso de campos e execução de métodos, super() atua como
uma referência ao objeto corrente pelo modelo de sua superclasse. A execução de
super.método sempre utiliza a implementação da superclasse do método.
Exemplo com super:
public class Empregado {
private String nome;
private int salario;
public String getDetalhes( ) {
return "Nome: " + nome + "\nSalario: " + salario;
}
}
public class Gerente extends Empregado {
private String departamento;
public String getDetalhes( ) {
// chama metodo da superclasse
return super.getDetalhes( ) + " Departamento:
departamento;
}
}
" +
Invocando Construtores da classe Pai
A inicialização de objetos na linguagem Java é estruturada. O Java sempre inicializa
completamente a classe pai antes de executar qualquer coisa na classe filho, ou seja, o
construtor da classe pai é executado antes do construtor da classe filho.
Você pode definir um construtor que leva argumentos e você quer usar esses
argumentos para a construção de uma parte do objeto pelo modelo da classe pai. Você
pode invocar um construtor da classe pai com super() na primeira linha do construtor
da classe filho. Por exemplo:
public class Empregado {
String nome;
public Empregado(String n) {
nome = n;
}
}
public class Gerente extends Empregado {
String departamento;
public Gerente(String s, String d) {
super(s); // chama o construtor de pai com uma String como
argumento
departamento = d;
}
}
Você também pode utilizar super para ter acesso a membros protected da superclasse.
Exercício JAVA16
44
Redefina a abstração de uma conta corrente em duas classes: ContaSimples e
ContaEspecial. A classe ContaSimples tem os atributos cliente, número e saldo. As
operações são: void deposito(double valor), void saque(double
valor), boolean temSaldo(double valor) e void
mostraSaldo(). A classe ContaEspecial, além de ser uma conta simples, tem um
limite que é uma variável do tipo double. A operação temSaldo da ContaEspecial
deve levar em conta este limite.
Exercício JAVA17
Faça uma classe chamada GerenciaConta, e no método main teste as classes
ContaSimples e ContaEspecial.
Características da Linguagem
Variáveis do tipo Static
Às vezes é desejável ter uma variável que seja compartilhada entre todas as instâncias
de uma classe. Por exemplo, isto pode ser usado como uma base para comunicação
entre instâncias ou manter-se a par do número de instâncias que foram criados. Você
pode conseguir isto declarando a variável como static.
public class Carro {
private int serialNumber;
private static int contadorObjetos = 0;
public Carro( ) {
contadorObjetos ++;
serialNumber = contadorObjetos;
}
}
Neste exemplo, a variável contadorObjetos é compartilhada entre todas as
instâncias. Assim quando o construtor de um objeto incrementar o contador, o
próximo objeto a ser criado recebe o valor incrementado.
Uma variável estática é semelhante a uma variável global em outras linguagens. Java
não possui variáveis globais, mas uma variável estática é uma variável acessível em
qualquer instância da classe.
Se uma variável estática não for declarada como private, você pode ter acesso fora da
classe. Para fazer isto, você não precisa instanciar a classe, e sim acessar pelo nome
de classe. Geralmente as variáveis deste tipo também são declaradas como constantes,
somente para leitura com o uso do final.
public class CEP {
public static final int R_XV = 89200;
public static final int R_AMERICA = 89201;
}
public class Correio {
public void metodo( ) {
int x = CEP.R_XV;
}
}
45
Métodos do tipo Static
Muitas vezes você precisa ter acesso a um método de uma classe que não está
instanciada. Para isso, você pode declarar o método como static e acessá-lo em outra
classe apenas passando o nome da classe e o método, sem precisar ter uma referência.
Por exemplo:
public class Quadrado {
public static int calculaArea( int x, int y ) {
return x * y;
}
}
public class Grafico {
public static void main( String a[] ) {
int a = 9;
int b = 10;
int c = Quadrado.calculaArea(a, b);
System.out.println("Area é igual a " + c);
}
}
Um método declarado como static não possue acesso a váriaveis não estáticas. Um
método estático só acessa variáveis que são do seu próprio escopo ou seus
argumentos. Para ter acesso a essas variáveis não estáticas, você teve criar um objeto
para a classe.
Exemplo de acesso a variável não estática no método estático:
public class Ponto {
int x;
public static void main(String args[ ]) {
x = 9; // Aqui dá erro de compilação
}
}
Pontos importantes sobre métodos estáticos:
Método main ( ) é static porque deve ser executado antes de criar qualquer instância.
Quando o método main ( ) é executado, nenhum objeto é criado, assim se você tiver
variáveis de classe (atributos), você tem que criar um objeto para acessá-los.
Um método estático não pode ser sobrescrito para ser não-estático.
Inicializadores do tipo Static
Uma classe permite criar códigos "em bloco static" que não exista dentro de um corpo
de um método. Os códigos do bloco static executam somente uma vez, quando a
classe é carregada na memória pela JVM. Os blocos estáticos diferentes dentro de
uma classe são executados na ordem que estão na classe.
46
public class ExemploEstatico {
static int i = 5;
static {
System.out.println("Codigo estatico: i = " + i++ );
}
}
public class Test {
public static void main(String args[ ]) {
System.out.printin("Codigo de main: i= " + ExemploEstatico.i);
}
}
O resultado será:
Codigo estatico: i = 5
Codigo de main: i = 6
Exercício JAVA18
Defina uma classe chamada Matemática com dois métodos estáticos: um método
chamado maior(int x, int y) que retorna o valor do maior parâmetro e outro método
chamado menor(int x, int y).
Exercício JAVA19
Crie uma classe ComparaValor onde o usuário informa dois valores e o programa
mostra o valor maior e o menor usando os métodos definidos na classe Matemática do
exercício anterior.
Dados e Métodos Orientados a Objetos
Um sistema orientado a objetos consiste em objetos. Os objetos criados a partir um
modelo chamado classe. Os atributos são definidos por variáveis e os comportamentos
são definidos por métodos. Apesar de todos os objetos da mesma classe herdarem as
mesmas características, cada objeto é diferente.
Por exemplo:
public class Carro {
String cor;
String modelo;
public Carro (String c, String m) {
this.cor = c;
this.modelo = m;
}
public void mostra( ) {
System.out.println ("Este carro é um " + modelo + cor + ".");
}
}
47
Todos os objetos de carro criados nesta classe têm uma cor e um modelo, mas cada
objeto de carro está separado dos outros e pode ter uma cor ou modelo diferente que
os outros. Suponha dois objetos de carro:
Carro vectra = new Carro("Branco","Vectra");
Carro corsa = new Carro("Prata","Corsa");
A orientação a objetos é ilustrada pelo fato que ambos os objetos têm dados
separados, embora ambos sejam carros.
Objetos possuem métodos que, embora consistam no mesmo código, se comportam
diferentemente porque os dados com que eles operam são diferentes para os objetos.
Por exemplo,
vectra.mostra( ) imprimirá "Iste carro é um Vectra Branco."
corsa.mostra( ) imprimirá "Iste carro é um Corsa Prata."
Palavra chave final
Classes final
Uma classe definida como final não pode ser extendida (ou especializada) por
nenhuma outra classe, e todos os métodos de uma classe final são implicitamente
final. Se uma classe é final, você não pode declarar uma subclasse dela, e portanto,
não pode violar seu contrato.
Métodos final
Definir um método como final significa que nenhuma classe estendida poderá
sobrepor o método para mudar seu comportamento.
Existem duas razões para se declarar um método como final. A primeira é a
segurança. Qualquer um que utilize a classe pode estar seguro de que o
comportamento não mudará. A segunda razão é que final simplifica otimizações.
Variáveis final
Se uma variável for declarada como final, você está declarando que ela será uma
constante. Qualquer tentativa para mudar o valor, causará um erro. O exemplo mostra
uma variável final corretamente definida:
public final int MAX_ARRAY_SIZE = 25;
Classes Abstratas
Utilizando classes abstratas, você pode declarar classes que definam apenas parte de
uma implementação, deixando que as subclasses forneçam a implementação
específica de alguns ou de todos os métodos.
Uma classe, como a classe PecaXadrez que declara a existência de métodos mas não
os implementa, também passa a ser uma classe abstrata.
48
Você pode declarar uma classe abstrata declarando-a abstract. Métodos que são
declarados mas não são implementados, também deve ser declarados como abstract.
public abstract class PecaXadrez {
int x;
int y;
public abstract boolean movimentoValido(int x, int y);
public void move(int x, int y) {
if (movimentoValido(x,y)) {
this.x = x;
this.y = y;
} else {
System.out.println("Movimento inválido")
}
}
}
Você não pode instanciar uma classe abstrata. Porém, você pode criar uma variável
cujo tipo é uma classe abstrata. Você não pode ter construtores abstratos nem métodos
estáticos abstratos.
Subclasses de classes abstratas têm que implementar todos os métodos abstratos
declarados na classe pai. Caso contrário elas também serão classes abstratas.
public class Rainha extends PecaXadrez {
public boolean movimentoValido(int x, int
// faz consistência do movimento para a
}
}
public class Rei extends PecaXadrez {
public boolean movimentoValido(int x, int
// faz consistência do movimento para o
}
}
y){
Rainha
y){
Rei
public class Tabuleiro {
Rainha rainhaBranca = new Rainha( );
Rei reiBranco = new Rei();
…
public void movePeca(PecaXadrez pc, int x, int y) {
pc.move(x,y);
}
…
}
Exercício JAVA20
Defina uma classe Conta com os métodos saque e deposito (iguais ao da classe Conta
Simples) e um método abstrato chamado boolean temSaldo(double valor). Redefina a
classe ContaSimples com relacionamento de herança com a classe Conta. Implemente
o código do método temSaldo na classe ContaSimples.
Interfaces
Uma interface é uma variação da idéia de uma classe abstrata. Em uma interface
todos os métodos são abstratos; nenhum deles possuem implementação. Uma
interface só pode definir variáveis do tipo static final.
49
Quando uma classe estende uma interface, esta classe deverá implementar todos os
métodos da interface, ou simplesmente declará-los sem nenhuma implementação.
Interfaces são definidas com a palavra chave interface como segue:
public interface Cor {
public int getCor( );
public void setCor(int cor);
}
Enquanto um classe só pode estender uma única classe, uma classe pode implementar
quantas interfaces forem necessárias. Interfaces implementadas por uma classe
aparecem separadas por virgulas, como mostrado abaixo:
public class MyApplet extends Applet implements Runnable,
MouseListener {
" ……… "
}
O exemplo seguinte mostra uma interface simples e uma classe que implementa isto:
public interface ObjetoSeguro {
public void abre(int segredo );
}
public class Cofre implements ObjetoSeguro {
public void abre(int segredo ) {
if (segredo == 1234) {
System.out.println("Cofre Aberto");
}
}
}
Exercício JAVA21
Defina uma interface chamada Bancaria, tendo três métodos: deposito, saque e
mostraSaldo.
Exercício JAVA22
Redefina a classe, Conta.java, usando a interface Bancaria para definir tipos de contas
diferentes.
Controle de Acesso
As variáveis e os métodos podem estar em um desses quatro níveis de acesso: public,
protected, default, ou private. As classes podem estar no nível public ou default.
Mesmo que uma aplicação não exija que os campos sejam somente para leitura, tornar
os campos privados e adicionar métodos para estabelecer seus valores e extraí-los,
permite-lhe adicionar ações que possam ser necessárias no futuro. Se as pessoas
tiverem acesso aos campos ou métodos da classe diretamente, você não terá controle
50
sobre quais valores eles irão utilizar ou o que acontecerá quando os valores ou
métodos forem alterados.
Abaixo, uma tabela que possui os níveis de acesso por modificadores.
Modificadores
Public
Protected
Default
Private
Mesma Classe
sim
sim
sim
sim
Mesmo Pacote
sim
sim
sim
SubClasses
sim
sim
Universal
sim
Exemplo
Operador = = versus Método equals( )
O operador = = compara dois tipos equivalentes, ou seja, verifica, por exemplo se x é
igual a y. Diferente de outras linguagens, ao se utilizar apenas =, você está
informando que a variável irá receber um determinado valor, e não está fazendo uma
comparação.
O método equals serve para fazer comparações entre objetos. Geralmente é utilizado
na comparação de Strings, mas você pode sobrescrever este método.
Por exemplo, o métodos equa1s ( ) da classe Ponto, compara se o valor das
coordenadas são iguais.
Exemplo:
class Ponto {
int x,y;
public boolean equals(Object obj) {
boolean iguais = false;
51
if (obj instanceof Ponto) {
Ponto outro = (Ponto) obj;
iguais = (this.x == outro.x && this.y == outro.y );
}
return iguais;
}
public static void main (String args[ ]) {
Ponto a = new Ponto();
a.x = 1;
a.y = 2;
Ponto b = new Ponto();
b.x = 1;
b.y = 2;
if (a == b) {
System.out.println("As referencias dos objetos são iguais");
}
if (a.equals(b)) {
System.out.println("As coordenadas dos objetos são iguais");
}
}
}
Resultado:
As coordenadas dos objetos são iguais
Método toString( )
Como toda classe, devido a semântica do Java, herda os métodos da classe Object,
você pode subscrever este método para retornar a representação de texto da sua classe.
O método toString ( ) é usado para converter um objeto em uma representação de
String.
Date hoje = new Date( );
System.out.println(hoje);
poderia ser traduzido como:
System.out.println(hoje.toString( ));
onde o método toString( ) na classe Date, teria sido subscrito para retornar Strings.
Você pode redefinir o método toString em qualquer classe:
class Ponto {
int x, y;
public String toString() {
return "Ponto(" + x + "," + y + ")";
}
}
Classes Internas
Classes internas permitem colocar a definição de uma classe dentro da definição de
outra classe. Classes internas são utéis quando permitem agrupar classes que
logicamente só existem dentro de outra classe.
52
Exemplo de uma classe interna
import java.awt.*;
import java.awt.event.*;
public class Formulario extends Frame {
private Button myButton;
private TextArea myTextArea;
private int count;
public Formulario( ) {
super("Exemplo de classe interna");
myButton = new Button("Pressione");
myTextArea = new TextArea( );
add(myButton, BorderLayout.CENTER);
add(myTextArea, BorderLayout.NORTH);
ButtonListener blist = new ButtonListener( );
myButton.addActionListener(bList);
}
class ButtonListener implements ActionListener {
public void actionPerfomed (ActionEvent e) {
count++;
myTextArea.setText("O botão foi clicado " + count + " vezes.");
}
}
public static void main (String args[ ]) {
Formulario f = new Formulario( );
f.setSize(300,300);
f.setVisible(true);
}
}
Ao compilar, você verá no seu diretório dois arquivos .java. Um com o nome de
Formulario.java e outro Formulario$ButtonListener.java, representado a classe
interna.
Classes Wrapper
As classes Wrapper servem como "envelopes" para os tipos primitivos serem tratados
como objetos. Cada tipo primitivo possui sua classe Wrapper. Um exemplo de sua
utililidade, é que quando você quer adicionar um tipo primitivo em um Vector, você
precisa utilizar um Wrapper para que este tipo primitivo seja tratado como um objeto,
pois um Vector só consegue adicionar objetos.
Observação: a partir do Java 1.5 isso foi alterado e o Java converte os tipos primitivos
para seu wrapper automaticamente.
Tipo Primitivo
Boolean
Byte
Char
Short
Int
Long
Float
Classe Wrapper
Boolean
Byte
Character
Short
Integer
Long
Float
53
Double
Double
Exemplo:
int pInt = 500;
Integer wInt = new Integer(pInt);
int p2 = wInt.IntValue( );
Este exemplo mostra o tratamento de uma String para um tipo int.
int x = Integer.valueOf (str).intvalue( );
ou
int x = Integer.parseInt (str);
Exercício JAVA23
Crie uma classe chamada SistemaSolar. No SistemaSolar crie a classe interna
chamada Planeta com os atributos nome e distanciaDoSol. Defina um array de Planeta
para o SistemaSolar. No construtor de SistemaSolar defina objetos para o array. Crie
o método mostrePlanetas para o SistemaSolar. No método main crie um objeto da
classe SistemaSolar e chame o método mostrePlanetas.
Exceções
As exceções oferecem uma maneira "limpa" de tratar os erros durante a execução do
programa. Uma exceção é causada quando uma condição de erro inesperada é
encontrada. A exceção é capturada na pilha de execução dos métodos. Se a exceção
não for capturada, o manipulador de exceções padrão é executado, imprimindo
informações úteis sobre em que linha de código a exceção foi lançada.
Por exemplo, exceções podem acontecer quando:
1. O arquivo que você tenta abrir não existe
2. A conexão de rede é interrompida
3. Operandos manipulados estão fora das faixas prescritas
4. O arquivo de classe quer você está carregando não é encontrado
Exemplo
public class Semaforo {
public static void main (String args[ ]) {
int i = 0;
String semaforo [ ] = {"Verde", "Amarelo","Vermelho"};
while (i < 4) {
System.out.println (sinais[i]);
i++;
}
}
54
}
Normalmente, um programa termina com uma mensagem de erro quando uma
exceção é lançada, como mostrado depois que o while executa quatro vezes.
java Semaforo
Verde
Amarelo
Vermelho
java.lang.ArrayIndexOutOfBoundsException: 3
at Semaforo.main(Semaforo.java:12)
Você pode tratar este erro testando a exceção lançada e redefinindo o fluxo do
programa para outro ponto ou parando sua execução.
Instruções try e catch
As exceções são capturadas vinculando o código a um bloco try. O bloco try é
executado até uma exceção ser lançada ou finalizar com sucesso. Se uma exceção for
lançada, as cláusulas catch serão verificadas visando localizar uma para a exceção
daquela classe ou uma das superclasses da exceção. Se nenhum catch apropriado for
localizado, a exceção passará fora da instrução try em qualquer try mais externo que
possa manipulá-la. Se não houver nenhuma cláusula catch no método para capturar a
exceção, ela será lançada para o código que chamou este método.
Sintaxe:
Conta c = new Conta();
try {
c.saque(100);
} catch (EstouroSaqueException e) {
System.out.println("Erro: " + e.getMessage() );
}
c.mostraSaldo();
Instrução finally
A instrução finally define um bloco de código que sempre será executado, mesmo que
uma exceção seja lançada ou não:
Conta credito = new Conta( );
Conta debito = new Conta( );
boolean transacaoOk = false;
try {
abreTransacao( );
debito.saque ( valor );
credito.deposito( valor );
transacaoOk = true;
} finally {
if ( transacaoOk )
fechaTransacao( );
else
desfazTransacao( );
}
55
No exemplo acima, o código tenta fazer a transferência dentro do bloco try.
Independente se a transferência foi com sucesso ou com erro, o bloco finally será
executado para fechar ou desfazer a transação. O bloco finally só não será executado
se o método System.exit ( ) que termina o programa for executado dentro de try. Caso
o bloco try possuir algum return que modifique o fluxo do programa, a instrução
finally será executada, para só depois o return ser executado.
Exemplo
public class Semaforo {
public static void main (String args[ ]) {
int i = 0;
String sinais [ ] = {"Verde","Amarelo","Vermelho"};
while (i < 4) {
try {
System.out.println (sinais[i]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Reiniciar valor do indice.");
i = -1;
} finally {
System.out.println("Isto é sempre impresso!");
}
i++;
}
}
}
Instrução throw
As exceções são lançadas utilizando-se a instrução throw, seguido de um objeto como
seu parâmetro.
public void deposito(double valor) throws DepositoInvalidoException {
if (valor > 0) {
saldo = saldo + valor;
} else {
throw new DepositoInvalidoException("Este valor é invalido para
depósito: " + valor);
}
}
O método deposito verifica o valor é válido para depósto. Se não for, ele irá criar e
lançar um objeto DepositoInvalidoException, passando ao construtor deste objeto os
argumentos necessários.
Cláusula throws
As exceções que um método pode lançar são declaradas na cláusula throws, com uma
lista de tipos de exceções separadas por vírgula. O contrato definido pela cláusula
throws é rigorosamente observado. Você pode lançar apenas os tipos de exceção que
tenham sido declarados na cláusula throws.
Categorias de Exceção
56
Há três categorias de exceções na linguagem de programação Java. A classe
java.lang.Throwable atua como a classe pai para todos os objetos que podem ser
lançados e podem ser capturados usando os mecanismos de manipulação de exceções.
Métodos definidos na classe de Throwable retornam a mensagem de erro associada
com a exceção e imprimem onde a exceção aconteceu. Há três subdivisões dessa
classe: Error, RuntimeException, e Exception.
Descrição de propósitos de algumas exceções:
Error - indica um problema sério do qual a recuperação é difícil, se não impossível.
RuntimeException - indica um problema de implementação ou arquitetura.
Outras exceções indicam uma dificuldade de execução que normalmente é causado
pelo ambiente e pode ser controlado. Exemplos incluem um arquivo não encontrado
ou exceções de URL inválidas.
Tratando ou Declarando Exceções
As exceções podem ser tratadas da seguinte maneira:
A primeira maneira é tratar a exceção dentro do próprio método onde ocorreu a
exceção, usando para isso try, catch e finally.
A segunda maneira é lançar a exceção para a classe que executou o método,
utilizando para isso a cláusula throws.
public void leArquivo( ) throws IOException
Criando Suas Próprias Exceções
Exceções definidas pelo usuário são criadas estendendo a classe Exception. Classes de
exceção podem conter qualquer coisa que uma classe normal.
public class DepositoInvalidoException extends Exception {
public DepositoInvalidoException (String motivo) {
super(motivo); // chama construtor da classe pai
}
}
Para lançar uma exceção para a classe que você criou, use a sintaxe:
throw new DepositoInvalidoException ("Valor inválido");
Para capturar sua exceção, use a instrução try:
public static void main( String[] args ) {
Conta c = new Conta();
try {
c.deposito (10);
}
catch (DepositoInvalidoException e) {
System.out.println("Erro: " + e.getMessage());
}
57
}
Você também pode processar parcialmente uma exceção e então relança-la.
Por exemplo:
public static void main( String[] args ) throws Exception {
Conta c = new Conta();
try {
c.deposito (10);
}
catch (DepositoInvalidoException e) {
System.out.println("Erro: " + e.getMessage());
throw e;
}
}
Exercício JAVA24
Crie as seguintes exceções no pacote erros:
a. EstouroSaqueException - Acontece quando é feita uma tentativa de
tirar mais dinheiro do que a conta possui.
b. DepositoInvalidoException–Acontece quando uma quantia inválida de
dinheiro (quantia < zero) é depositada.
Exercício JAVA25
Rescreva a classe Conta com as operações de saque e depósito para lançar estas
exceções.
Datas e Calendário
Criando Datas e Calendários
A classe java.util.Date representa uma data e a classe java.util.Calendar representa um
calendário para trabalhar com as datas.
Date hoje = new Date();
Calendar c = Calendar.getInstance();
Formatando Datas
Para formatar datas em java use a classe java.text.SimpleDateFormat. Esta classe
possui dois métodos básicos: parse(String) para converter um texto em uma data e
format(Date) para formatar a data em um texto. Por exemplo:
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
String texto = sdf.format(new Date());
Date dia = sdf.parse("16/06/1971 23:00");
58
Você também pode usar a classe DateFormat.
Calculando Datas
A classe Calendar permite a definição de data com o método set e o cálculo de datas
com o método add(int, int). Por exemplo:
import java.util.Date;
import java.util.Calendar;
import java.text.DateFormat;
public class Calendario {
public static void main(String[] args) {
Date hoje = new Date();
System.out.println("Hoje é " + hoje);
DateFormat sdf = DateFormat.getDateInstance();
System.out.println(sdf.format(hoje));
try {
Date nascimento = sdf.parse("16/06/1971");
System.out.println("Meu nascimento foi " + nascimento);
} catch (Exception e) {
System.out.println("Data invalida");
}
Calendar cal = Calendar.getInstance();
System.out.println("Data é "+cal.getTime());
cal.set(1990,0,1);
System.out.println("Data é "+cal.getTime());
cal.set(2000,0,1,0,0,0);
System.out.println("Data é "+cal.getTime());
cal.add(Calendar.DATE, 30);
System.out.println("Data é "+cal.getTime());
cal.add(Calendar.MONTH, 2);
System.out.println("Data é "+cal.getTime());
}
}
O resultado da execução do programa acima é
Hoje é Tue Nov 28 23:07:31 BRST 2006
28/11/2006
Meu nascimento foi Wed Jun 16 00:00:00 BRT 1971
Data é Tue Nov 28 23:07:31 BRST 2006
Data é Mon Jan 01 23:07:31 BRST 1990
Data é Sat Jan 01 00:00:00 BRST 2000
Data é Mon Jan 31 00:00:00 BRST 2000
Data é Fri Mar 31 00:00:00 BRT 2000
Exercício JAVA26
Faça uma classe que mostre a data atual menos 7 dias no formato dd-MM-yyyy.
59
Coleções
O java tem um framework de coleções que inclui listas, conjuntos e mapas. As
operações básicas ao usar as coleções são:
- adicionar objetos
- remover objetos
- verificar se existe um objeto
- recuperar um objeto
- percorrer os objetos um a um
Principais classes e interfaces
As principais interfaces da API de coleção são: List, Set e Map
A tabela a seguir apresenta as principais classes que implementam as interfaces
acima:
Implementações de Map Implementações de Set
Implementações de List
HashMap
HashSet
ArrayList
Hashtable
LinkedHashSet
Vector
TreeMap
TreeSet
LinkedList
Vale aqui ressaltar que no java existe uma interface chamada Collection, que é a
interface pai das interfaces Set e List. No java também existe a classe
java.util.Collections que tem diversos métodos estáticos para uso em coleções.
As coleções se dividem em três categorias básicas:
Listas Listas de objetos
Set
Conjuntos de objetos únicos
Maps
Objetos com uma identificação única
Por exemplo:
List: uma lista com o itinerário do vendedor
Indice
0
1
2
Valor
Centro
América
Costa e
Silva
3
Glória
4
América
Set: um conjunto de bairros que o vendedor atende
Centro
América
Costa e Silva
Glória
HashMap: categoria de produtos e os produtos do vendedor
Hashcode
1
2
3
4
5
Centro
60
Valor
Creme
Sabonete
Escova
Revista
Ordered e Sorted
No java uma coleção pode ser um conjunto ordenado (mantém a ordem de inclusão)
de objetos (Ordered collection) ou uma coleção organizada na ordem alfabética ou
numérica (Sorted collection).
Vamos analisar estes exemplos que destacam as diferenças de coleções Ordered e
Sorted:
import java.util.*;
public class Ordered {
public static void main(String[] args) {
LinkedHashSet lhs = new LinkedHashSet();
lhs.add ("Chicago");
lhs.add ("Detroit");
lhs.add ("Atlanta");
lhs.add ("Denver");
Iterator it = lhs.iterator();
while (it.hasNext()) {
System.out.println("cidade "+it.next());
}
}
}
O código acima da classe Ordered gera o resultado:
cidade Chicago
cidade Detroit
cidade Atlanta
cidade Denver
import java.util.*;
public class Sorted {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add ("Chicago");
ts.add ("Detroit");
ts.add ("Atlanta");
ts.add ("Denver");
Iterator it = ts.iterator();
while (it.hasNext()) {
System.out.println("cidade "+it.next());
}
}
}
O código acima da classe Sorted gera o resultado abaixo:
cidade Atlanta
cidade Chicago
cidade Denver
cidade Detroit
Sabendo a diferença entre ordenado e organizado, vamos ver as interfaces List, Set e
Map.
61
List
As listas se preocupam com os índices. As listas tem métodos para lidar com os
índices: get (int index) , indexOf( ) , add(int index, Object obj) e add(Object). Vamos
ver 3 implementações da interface List.
ArrayList
É um array dinâmico com acesso rápido. Para criar um ArrayList basta instanciar um
objeto.
ArrayList numerosDaMega = new ArrayList();
O tamanho do ArrayList é dado pelo método size().
int t = numerosDaMega.size();
Para adicionar um objeto ao ArrayList usamos o método add(Object):
numerosDaMega.add(new Integer(3));
Recuperamos um objeto do ArrayList com o método get(int):
Integer n = numerosDaMega.get(0);
Vector
É basicamente a mesma coisa que um ArrayList, mas os métodos do Vector são
sincronizados para acesso concorrente. Prefira um ArrayList se você não precisa se
preocupar com acesso concorrente, ou seja, várias threads acessando a mesma
coleção.
LinkedList
É uma lista ordenada pelos índices, como um ArrayList, mas com uma ligação dupla
entre os objetos. É mais indicada quando você precisa fazer muitas inserções ou
remoções da lista.
Set
São conjuntos que se preocupam com unicidade. Set não permite objetos duplicados.
Os principais métodos são: add(Object) e contains(Object).
HashSet
É um conjunto não ordenado e não organizado. Usa o método hashcode() para inserir
o objeto. Use quando você quer guardar objetos não duplicados e não ordenados.
LinkedHashSet
É uma versão ordenada do HashSet que mantém uma ligação dupla entre os objetos.
Você pode construir um LinkedHashSet que mantém a ordem de inserção ou a ordem
62
que os objetos foram acessados. Isso pode ser útil para montar uma lista de objetos
usados mais recentemente.
TreeSet
É uma versão organizada de coleção. Os objetos ficam em uma ordem ascendente, de
acordo com a ordem natural dos objetos.
Map
São coleções que se preocupam com identificadores únicos para os objetos. Você
mapeia uma chave única (o ID) com um valor específico, tanto a chave quanto o valor
são objetos. Os principais métodos são: put(Object key, Object value) e get(Object
key)
HashMap
O HashMap cria uma coleção não ordenada. Permite um valor null na chave e vários
valores null na coleção.
Hashtable
É parecida com um HashMap. O Hashtable é sincronizado e não permite valores
nulos. Prefira um HashMap, se você não precisa se preocupar com acesso de várias
threads.
LinkedHashMap
É uma coleção que mantém a ordem de inserção (ou opcionalmente a ordem de
acesso) dos objetos. O acesso aos objetos é mais rápido que na HashMap.
TreeMap
É uma coleção que mantém os objetos em uma ordem natural dos objetos
Exercício JAVA27
Crie uma classe chamada Agenda que guarde o nome e o telefone de pessoas como
objetos String em um HashMap, adicione 5 nomes e telefones e depois mostre o
telefone de uma das pessoas.
Exercício JAVA28
Cria uma classe chamada Equipes para armazenar nomes de equipes em um
ArrayList. O programa deve pedir para o usuário digitar os nomes das equipes até o
usuário digitar "fim". O programa então mostra os nomes das equipes digitados pelo
usuário.
63
Componentes Gráficos
AWT
Os componentes de AWT estão no pacote de java.awt. Este pacote contém todas
as classes para criação de interfaces com o usuário e para desenho de gráficos e
imagens.
Swing
Os componentes de Swing estão no pacote de javax.swing. Este pacote fornece
também classes para criação de interfaces com o usuário. São um conjunto de
componentes que tem como objetivo prover o mesmo comportamento independente
da plataforma do sistema operacional.
Containers
Containers são espaços criados para conter outros objetos. As classes JFrame e JPanel
são containers do pacote javax.swing.
Frames
Uma frame, implementada como uma instãncia da classe JFrame, é uma janela que
tem decorações como uma borda, um título, e botões para fechar e iconificar a janela.
Exemplo:
public static void main(String s[]) {
JFrame frame = new JFrame("FrameDemo");
frame.addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
Panels
Panels são painéis. A classe JPanel é um container para componentes.
64
Exemplo:
JPanel aPanel = new JPanel();
aPanel.setLayout(new BorderLayout());
Também pode ser declarado assim:
JPanel aPanel = new JPanel(new BorderLayout());
aPanel.add(aComponent);
aPanel.add(anotherComponent);
Gerenciadores de Layout
Gerenciadores de layouts são objetos que controlam a disposição e a dimensão dos
componentes em um container.
FlowLayout
Diferente de outros gerenciadores de layout, o FlowLayout não restringe o tamanho
dos componentes que administra, mas lhes permite ter o tamanho desejado.
O construtor de FlowLayout permitem alinhar os componentes à esquerda ou à
direita.
Você pode especificar espaços entre os componentes se você quiser criar um espaço
mínimo maior.
setLayout(new FlowLayout(int align,int hgap,int vgap));
O valor de align pode ser: FlowLayout.LEFT, FlowLayout.RIGHT, or FlowLayout.
CENTER.
Por exemplo:
setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 40));
Ou
setLayout(new FlowLayout(FlowLayout.LEFT));
Ou simplesmente
setLayout(new FlowLayout());
Exemplo de FlowLayout:
65
getContentPane().setLayout(new FlowLayout());
getContentPane().add(new
getContentPane().add(new
getContentPane().add(new
getContentPane().add(new
getContentPane().add(new
JButton("Button 1"));
JButton("2"));
JButton("Button 3"));
JButton("Long-Named Button 4"));
JButton("Button 5"));
BorderLayout
O gerenciador BorderLayout provê um esquema mais complexo para colocar seus
componentes dentro de um container. BorderLayout contém cinco áreas distintas:
NORTH, SOUTH, EAST, WEST, e CENTER, indicados por BorderLayout.NORTH,
e assim por diante.
NORTH ocupa o topo de uma frame, EAST ocupa o lado direito, e assim por diante.
Quando a janela é redimensionada verticalmente, as regiões EAST, WEST e
CENTER são redimensionados, e quando a janela é redimensionada horizontalmente,
as regiões NORTH, SOUTH e CENTER são redimensionadas.
A seguinte linha:
setLayout(new BorderLayout( ));
constrói e estabelece um BorderLayout novo sem espaços entre os componentes.
A seguinte linha:
setLayout(new BorderLayout(int hgap, int vgap);
constrói e estabelece um BorderLayout com os espaços entre os components
especificados por hgap e vgap.
Você tem que acrescentar componentes as regiões nomeadas no gerenciador
BorderLayout; caso contrário, eles não serão visíveis.
Você pode acrescentar só um único componente a cada uma das cinco regiões de
BorderLayout. Se você tentar acrescentar mais que um, só o último será visível.
Exemplo:
contentPane.add(new JButton("Button 1 (NORTH)"),
BorderLayout.NORTH);
contentPane.add(new JButton("2 (CENTER)"),
66
BorderLayout.CENTER);
contentPane.add(new JButton("Button 3 (WEST)"),
BorderLayout.WEST);
contentPane.add(new JButton("Long-Named Button 4 (SOUTH)"),
BorderLayout.SOUTH);
contentPane.add(new JButton("Button 5 (EAST)"),
BorderLayout.EAST);
GridLayout
O gerenciador GridLayout provê flexibilidade para colocar componentes. Você cria o
gerenciador com vários linhas e colunas.
Como acontece com BorderLayout, a posição relativa dos componentes não muda
quando a área é redimensionada. Só os tamanhos dos componentes.
GridLayout sempre ignora o tamanho dos componentes. A largura de todas as células
é idêntica e é determinado dividindo a largura disponível pelo número de colunas.
Semelhantemente, a altura de todas as células é determinada dividindo a altura
disponível pelo número de linhas.
A ordem na qual são acrescentados componentes ao grid determinam a célula que eles
ocupam. Sempre começam na primeira linha e coluna, até completar as células a
direita. Quando completadas, passa para a segunda linha.
A seguinte linha:
setLayout(new GridLayout( ));
cria e estabelece um GridLayout com apenas uma linha e coluna.
A seguinte linha:
setLayout(new GridLayout(int rows, int cols);
cria e estabelece um GridLayout com um número especifico de linhas e colunas.
A seguinte linha:
setLayout(new GridLayout(int rows, int cols, int hgap, int vgap);
crie e estabelece um GridLayout com um número especifico de linhas e colunas, mas
com espaços horizntais e verticais entre as células determinados por hgap e vgap.
Exemplo:
contentPane.setLayout(new GridLayout(0,2));
// o zero determina que não há um número específico de linhas.
67
contentPane.add(new
contentPane.add(new
contentPane.add(new
contentPane.add(new
contentPane.add(new
JButton("Button 1"));
JButton("2"));
JButton("Button 3"));
JButton("Long-Named Button 4"));
JButton("Button 5"));
CardLayout
O gerenciador CardLayout permite tratar a interface como uma série de cartões, os
quais você pode ver um por vez. Você pode usar o método add( ) para acrescentar
cartões a um CardLayout. O método add( ) recebe um panel e uma String como
argumento que identifica o panel. O método show( ) mostra o cartão que foi
solicitado.
Exemplo:
import java.awt.*;
import java.awt.event.*;
public class CardTest implements MouseListener {
private Panel pl, p2, p3, p4, p5;
private Label lbl, lb2, lb3, lb4, lb5;
private CardLayout mycard;
private Frame f;
public void go( ) {
f = new Frame ("Card Test");
myCard = new CardLayout( );
f.setLayout(myCard);
pl
p2
p3
p4
p5
=
=
=
=
=
new
new
new
new
new
Panel();
Panel();
Panel();
Panel();
Panel();
lbl = new Label("This is the first Panel");
pl.setBackground(Color.yellow);
pl.add(lb1);
lb2 = new Label("This is the second Panel");
p2.setBackground(Color.green);
p2.add(lb2);
lb3 = new Label("This is the third Panel,');
p3.setBackground(Color.magenta);
p3.add(lb3);
lb4 = new Label("This is the fourth Panel");
p4.setBackground(Color.white);
p4.add(lb4);
lb5 = new Label("This is the fifth Panel");
p5.setBackground(Color.cyan);
68
p5.add(lb5);
p1.addmouseListener(this);
p2.addMouseListener(this);
p3.addmouseListener(this);
p4.addMouseListener(this);
p5.addMouseListener(this);
f.add(pl,
f.add(p2,
f.add(p3,
f.add(p4,
f.add(p5,
"First");
"Second");
"Third");
"Fourth");
"Fifth");
myCard.show(f, "First");
f.setSize(200,200);
f.setVisible(true);
}
public void mousePressed(MouseEvent e) {
myCard.next(f);
}
public void mouseReleased(MouseEvent e) { }
public void mouseClicked(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public static void main (String args[ ]) {
CardTest ct = new CardTest( );
ct.go( );
}
}
Classe JComponent
Com a exceção de containers top-level, todos os componentes de Swing, cujos nomes
começam com "J" descendem da classe de JComponent. Por exemplo, JPanel,
JScrollPane, JButton, e JTable são herdados de JComponent, porém, JFrame não,
porque implementa um container top-level.
A classe JComponent estende a classe Container que estende Component.
JLabel
Com a classe JLabel, você pode exibir textos e imagens.
Exemplo:
69
ImageIcon icon = new ImageIcon("images/middle.gif");
. . .
label1 = new JLabel("Image and Text",icon,JLabel.CENTER);
//Set the position of the text, relative to the icon:
label1.setVerticalTextPosition(JLabel.BOTTOM);
label1.setHorizontalTextPosition(JLabel.CENTER);
label2 = new JLabel("Text-Only Label");
label3 = new JLabel(icon);
//Add labels to the JPanel.
add(label1);
add(label2);
add(label3);
JTextField
Um campo de texto é um controle de texto básico que permite o usuário entrar com
dados. Quando o usuário indica que aquela entrada de texto está completa (teclando
ENTER), o campo de texto gera um evento de ação. Geralmente você usa o
JTextField para prover campos de texto. Se você precisa um campo de senha, ou seja,
um campo de texto que não mostra os caracteres para o usuário, utiliza-se o
JPasswordField.
Exemplo:
textField = new JTextField(20);
textField.addActionListener(this);
...
contentPane.add(textField);
Para ler/alterar o conteúdo de um JTextField use os métodos getText() e
setText(String). Por exemplo, o comando abaixo limpa a caixa de texto:
textField.setText("");
JButton
Provê um mecanismo básico para executar qualquer ação de interface de usuário.
Exemplo:
f = new JFrame("Sample Button");
b = new JButton("Sample");
b.addActionListener(this);
f.add(b);
70
JCheckBox
O componente JCheckbox provê um simples "on/off", colocando um rótulo de texto
ao lado.
Exemplo:
f = new JFrame("Sample Checkbox");
one = new JCheckbox("One", true);
two = new JCheckbox("Two", false);
three = new JCheckbox("Three", false);
one.addItemListener(this);
two.addItemListener(this);
three.addItemListener(this);
f.setLayout(new FlowLayout( ));
f.getContentPane().add(one);
f.getContentPane().add(two);
f.getContentPane().add(three);
JRadioButton
JRadioButton são grupos de botões que, por convenção, só um pode ser selecionado
de cada vez.
Exemplo:
JRadioButton birdButton = new JRadioButton(birdString);
birdButton.setMnemonic(KeyEvent.VK_B);
birdButton.setActionCommand(birdString);
birdButton.setSelected(true);
JRadioButton catButton = new JRadioButton(catString);
catButton.setMnemonic(KeyEvent.VK_C);
catButton.setActionCommand(catString);
JRadioButton dogButton = new JRadioButton(dogString);
dogButton.setMnemonic(KeyEvent.VK_D);
dogButton.setActionCommand(dogString);
JRadioButton rabbitButton = new JRadioButton(rabbitString);
rabbitButton.setMnemonic(KeyEvent.VK_R);
rabbitButton.setActionCommand(rabbitString);
JRadioButton pigButton = new JRadioButton(pigString);
pigButton.setMnemonic(KeyEvent.VK_P);
pigButton.setActionCommand(pigString);
// Group the radio buttons.
ButtonGroup group = new ButtonGroup();
group.add(birdButton);
group.add(catButton);
group.add(dogButton);
group.add(rabbitButton);
group.add(pigButton);
// Register a listener for the radio buttons.
RadioListener myListener = new RadioListener();
71
birdButton.addActionListener(myListener);
catButton.addActionListener(myListener);
dogButton.addActionListener(myListener);
rabbitButton.addActionListener(myListener);
pigButton.addActionListener(myListener);
...
class RadioListener implements ActionListener ... {
public void actionPerformed(ActionEvent e) {
picture.setIcon(new ImageIcon("images/"
+ e.getActionCommand()
+ ".gif"));
}
}
JMenuBar
Um componente JMenuBar é um menu horizontal. Você só pode acrescentar isto a
um objeto JFrame, que sera a base de todos os menus.
JMenu
O componente JMenu provê um menu que lista as suas opções. Você só pode
acrescentar em um JMenuBar ou em outro JMenu.
JMenuItem
Componentes de JMenuItem são os as opções de um JMenu.
Exemplo envolvendo as três definições:
JMenuBar menuBar;
JMenu menu;
JMenuItem menuItem;
...
//Create the menu bar.
menuBar = new JMenuBar();
setJMenuBar(menuBar);
//Build the first menu.
menu = new JMenu("A Menu");
menu.setMnemonic(KeyEvent.VK_A);
menuBar.add(menu);
72
//a group of JMenuItems
menuItem = new JMenuItem("A text-only menu item"
, KeyEvent.VK_T);
menu.add(menuItem);
JComboBox
JComboBox apresenta uma lista de opções para determinada situação.
Exemplo:
String[] weekStrings = { "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday" };
// Create the combo box, select item at index 0.
JComboBox weekList = new JComboBox(weekStrings);
weekList.setSelectedIndex(0);
...
JList
Um JList apresenta ao usuário um grupo de itens, exibidos em uma coluna.
Exemplo:
String[] data = {"one", "two", "free", "four"};
JList dataList = new JList(data);
JList não suporta diretamente scroll. Para isso, faça da seguinte maneira
JScrollPane scrollPane = new JScrollPane(dataList);
JTable
Com a classe JTable você pode exibir tabelas de dados, podendo permiter ao usuário
editar os dados. JTable não contém os dados armazenados; simplesmente é uma visão
de seus dados.
73
Exemplo:
Object [] linha1 = {"Mary", "Campione", "Snowboarding", new
Integer(5), new Boolean(false)};
Object [] linha2 = {"Alison", "Huml", "Rowing", new Integer(3), new
Boolean(true)};
Object [] linha3 = {"Kathy", "Walrath", "Chasing toddlers", new
Integer(2), new Boolean(false)};
Object [] linha4 = {"Mark", "Andrews", "Speed reading", new
Integer(20), new Boolean(true)};
Object [] linha5 = {"Angela", "Lih","Teaching high school", new
Integer(4), new Boolean(false)};
Object[][] data = {linha1,linha2,linha3,linha4,linha5};
String[] columnNames = {"First Name","Last Name","Sport",
"# of Years","Vegetarian"};
final JTable table = new JTable(data, columnNames);
JTree
Com a classe JTree, você pode exibir dados hierárquicos. Um objeto JTree não
contém seus dados de fato; provê uma visão dos dados simplesmente.
Exemplo:
DefaultMutableTreeNode top = new DefaultMutableTreeNode("The Java
Series");
createNodes(top);
final JTree tree = new JTree(top);
...
JScrollPane treeView = new JScrollPane(tree);
Exercício JAVA29
Crie uma calculadora. Defina uma interface GUI com os componentes de uma
calculadora de operações básicas: soma, subtração, multiplicação e divisão.
Exercício JAVA30
Implemente o código java para criar a tela abaixo:
74
Exercício JAVA31
Crie um programa para ser um editor de texto. Use um JTextArea para ser a área de
edição do texto. Crie uma barra de menu com as opções de menu Arquivo e Ajuda.
No menu Arquivo inclua os itens de menu Salvar e Sair. No menu Ajuda inclua o
item Sobre o Editor.
Eventos
O que é um Evento?
Quando o usuário executa uma ação (clica com o mouse ou pressiona uma tecla), isto
causa um evento. Eventos são objetos que descrevem uma ação que aconteceu. Tipos
diferentes de classes de evento existem para descrever categorias diferentes de ações
de usuário.
Fontes de evento
Uma fonte de evento é o gerador de um evento. Por exemplo, ao clicar com o mouse
em um componente Button, isto gera um ActionEvent.
Manipuladores de evento
Um manipulador de evento é um método que recebe um objeto de evento, decifra isto,
e processa a interação do usuário.
Modelo de Delegação
Com o modelo de delegação, os eventos são enviados ao componente, mas cada
componente registra um manipulador de eventos para tratá-los. Os manipuladores de
eventos são chamados Listeners. Listeners podem receber e processar o evento. Deste
modo, o manipulador de evento pode estar em um objeto separado do componente.
Listeners são classes que implementam a interface de EventListener.
Todo evento tem uma interface de listeners correspondentes que define métodos em
uma classe designada a receber aquele tipo de evento. A classe que implementa a
interface define esses métodos, e pode ser registrada como um listener.
75
Não são propagados eventos de componentes que não possui nenhum listener
registrado.
Por exemplo:
import javax.swing.*;
public class ExemploBotao {
public static void main(String args[ ]) {
JFrame f = new JFrame("Teste");
JButton b = new JButton("Pressione Botão!");
b.addActionListener(new ManipuladorBotao( ));
f.add(b,BorderLayout.CENTER);
f.pack( );
f.setVisible(true);
}
}
A classe ManipuladorBotao é a classe manipuladora para qual o evento é delegado.
import java.awt.event.*;
public class ManipuladorBotao implements ActionListener {
public void actionPerfomed(ActionEvent e) {
System.out.println("Ação ocorreu");
System.out.println("Nome do botão: " + e.getActionCommand( ));
}
}
Características do exemplo:
A classe JButton tem um método addActionListener (ActionListener).
A interface de ActionListener define um único método, actionPerfomed que recebe
um ActionEvent.
Quando um objeto de JButton é criado, um objeto pode ser registrado como um
listener para ActionEvent pelo método addActionListener ( ). O listener é instanciado
de uma classe que implementa a interface ActionListener.
Quando o objeto JButton é clicado com o mouse, um ActionEvent é enviado. O
ActionEvent é recebido pelo método actionPerformed( ) de qualquer ActionListener
que é registrado no button pelo seu método de addActionListener.
O método getActionCommand( ) da classe ActionEvent retorna o nome do comando
associado com a ação.
Comportamento de GUI
Categorias de Eventos
Para cada categoria de eventos, há uma interface que tem que ser implementada pela
classe de objetos que recebe os eventos. Essa interface exige que seus métodos sejam
definidos. Esses métodos são chamados quando eventos particulares surgirem.
Abaixo, uma tabela contendo essas interfaces e seus métodos:
76
Categoria
Action
Item
Mouse motion
Nome da Interface
ActionListener
ItemListener
MouseMotionListener
Mouse button
MouseListener
Key
KeyListener
Focus
FocusListener
Adjustment
Component
AdjustmentListener
ComponentListener
Window
WindowListener
Container
ContainerListener
Text
TextListener
Métodos
actionPerformed(ActionEvent)
itemStateChanged(ItemEvent)
mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mouseClicked(MouseEvent)
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
focusGained(FocusEvent)
focusLost(FocusEvent)
adjustmentValueChanged(AdjustEvent)
componentMoved(ComponentEvent)
componentHidden(ComponentEvent)
componentResized(ComponentEvent)
componentShown(ComponentEvent)
windowClosing(WindowEvent)
windowOpened(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
componentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
textValueChanged(TextEvent)
O exemplo abaixo mostra alguns exemplos de interface. Mostra o movimento do
mouse quando é clicado o botão do mouse (mouse dragging).
Os eventos causados pela movimentação do mouse quando um botão é pressionado ou
não, pode ser apanhado por objetos de uma classe que implementam a interface
MouseMotionListener. Esta interface requer dois métodos, mouseDragged ( ) e
mouseMoved ( ). Mesmo que você não irá utilizar o método mouseMoved( ), você
deve declara-lo sem implementar nenhuma instrução.
Para você capturar outros eventos, como o clique do mouse, você tem que utilizar a
interface MouseListener. Esta interface inclui vários métodos como mouseEntered,
mouseExited, mousePressed, mouseReleased, e mouseClicked.
Exemplo:
import java.awt.*;
import java.awt.event.*;
public class Manipuladores implements MouseMotionListener,
MouseListener {
private Frame f;
private TextField tf;
public void go( ) {
77
f = new Frame("Two listeners example");
f.add(new Label ("Click and drag the mouse"),
BorderLayout.NORTH);
tf = new TextField (30);
f.add (tf, BorderLayout.SOUTH);
f.addMouseMotionListener(this);
f.addMouseListener (this);
f.setSize(300, 200);
f.setVisible(true);
}
//Eventos de MouseMotionListener
public void mouseDragged (MouseEvent e) {
String s = "Mouse dragging: X = " + e.getX( ) +
" Y = " + e.getY( );
tf.setText (s);
}
public void mouseMoved (MouseEvent e) { }
//Eventos de MouseListener
public void mouseEntered (MouseEvent e) {
String s = "The mouse entered";
tf.setText (s);
}
public void mouseExited (MouseEvent e) {
String s = "The mouse has left the building";
tf.setText (s);
}
public void mousePressed (MouseEvent e) { }
public void mouseClicked (MouseEvent e) { }
public void mouseReleased (MouseEvent e) { }
public static void main(String args[ ]) {
Manipuladores man = new Manipuladores( );
man.go( );
}
}
Você pode declarar interfaces múltiplas separando-as com vírgula.
Quando você faz chamadas dos seguintes métodos:
f.addMouseListener(this);
f.addMouseMotionListener(this);
ambos os tipos de eventos podem ser chamados na classe Manipuladores. Um objeto
pode escutar tantas fontes de evento quanto exigido; sua classe só precisa
implementar os eventos necessários.
Múltiplos listeners
O modelo de delegação permite que múltiplos listeners possam ser adicionados ao
mesmo componente.
O mecanismo listener permite chamar um método de addXXXListener quantas vezes
forem necessárias, e você pode especificar tantos listeners diferentes quanto precisar.
Todos os listeners registrados têm seus métodos chamados quando o evento
acontecer.
78
Adaptadores de Eventos
É muito trabalhoso implementar todos os métodos de cada interface, principalmentte
da MouseListener e WindowListener.
Por exemplo, a interface MouseListener declara os seguintes métodos:
mouseClicked (MouseEvent)
mouseEntered (MouseEvent)
mouseExited (MouseEvent)
mousePressed (MouseEvent)
mouseReleased (MouseEvent)
Por conveniência, a linguagem Java possui classes de adaptadores que implementam
cada interface que contenha mais de um método. Os métodos nestes classes de
adaptadores estão vazias. Você pode estender uma classe de adaptadores e declarar
somente o(s) método(s) necessários. Exemplo
import java.awt.*;
import java.awt.event.*;
public class MouseClickHandler extends MouseAdapter {
// Só é declarado o método necessário
public void mouseClicked (MouseEvent e) {
//instruções
}
}
Nota – Como MouseAdapter é uma classe, e não uma interface, você só pode estender
uma classe. Como os listeners são interfaces, você pode extender múltiplas interfaces.
Classes anônimas
Você pode incluir uma definição de classe inteira dentro da extensão de uma
expressão. Esta definição é chamada de classe anônima e cria uma instância. Por
exemplo:
import java.awt.*;
import java.awt.event.*;
public class AnonimaExemplo {
private Frame f;
private TextField tf;
public void go( ) {
f = new Frame("Exemplo de classe anonima");
f.add(new Label("Click e arraste o mouse:"),
BorderLayout.NORTH);
tf = new TextField (30);
f.add (tf, BorderLayout.SOUTH);
f.addMouseMotionListener( new MouseMotionAdapter( ) {
public void mouseDragged (MouseEvent e) {
79
String s = "Mouse dragging: X = " + e.getx( ) +
"Y = " + e.getY( );
tf.setText (s);
}
}
); // fechando o parênteses
f.addMouseListener (new MouseClickHandler( ));
f.setSize(300, 200);
f.setVisible(true);
}
public static void main(String args[ ]) {
AnonimaExemplo obj = new AnonimaExemplo ( );
obj.go( );
}
}
Exercício JAVA32
Usando o código da tela criado no exercício JAVA29, escreva o código para tratar os
eventos que façam a calculadora funcionar de acordo com a interface do usuário.
Adicione também o código para tratar o evento de fechar a janela.
Exercício JAVA33
Defina os eventos para a interface da tela Calcula Temperatura do exercício JAVA30.
A fórmula para converter a temperatura é:
Celcius para Fahrenheit
Fahrenheit para Celcius
tempC = (tempF - 32) * 1.8
tempF = (tempC * 1.8) + 32
Exercício JAVA34
Defina os eventos para fechar o editor de texto criado no exercício JAVA31. O evento
para o menu Sobre o Editor deve mostrar uma caixa de dialogo com o seu nome e
email.
Applets
O que é um Applet?
Um applet é uma classe do Java que você pode incluir em uma página de HTML.
Diferente de uma aplicação, que é iniciada quando seu método main ( ) é chamado, o
ciclo de vida de um applet é mais complexo.
Carregando um Applet
Um applet é executado pela JVM do browser quando a página HTML que tem o
applet é carregada. Um arquivo HTML tem que diz ao browser qual classe carregar.
Você então indica ao browser a URL que especifica o arquivo HTML.
http://algumSite/arquivo.html
Browser carrega URL
<HTML>
Browser carrega documento HTML
80
<APPLET CODE = …>
</APPLET>
Applet Classes
Browser carrega classe applet
Browser executa applet
Restrições de Segurança em Applet
Applets podem representam algo perigoso, porque são carregados de qualquer lugar
na internet.
O nível de segurança é controlado e implementado pelo browser (assinatura de
applets, java policies). Por padrão a maioria dos browsers previne o seguinte:
*Execução de runtime de outro programa
*Arquivo I/O
*Chamadas para métodos nativos
*Tentativas para abrir um socket para qualquer sistema, exceto o sistema que proveu
o applet.
Estas restrições impedem um applet de violar a privacidade ou danificar um sistema
remoto, restringindo o acesso do applet aos arquivos do sistema de origem.
Prevenindo a execução de outro programa e desaprovando chamadas a métodos
nativos restringem o applet executar um código que ainda não foi verificado pela
JVM. A restrição em sockets previne comunicação com outro programa armazenado
em um servidor não confiável. Mas estas restrições podem ser modificadas pelo
usuário (java policies).
Escrevendo um Applet
Para escrever um applet, você tem que criar uma classe da seguinte forma:
import java.applet.*;
public class HelloWorld extends Applet { }
A classe do applet deve ser pública. A classe deve ser uma subclasse de
java.applet.Applet.
Os Métodos de um Applet
Em uma aplicação, um programa é iniciado quando o método main( ) é chamado.
Porém, em um applet, este não é o caso. Depois que o construtor completar sua tarefa,
o browser chama o método init ( ) e executa a inicialização básica do applet. Depois
do método init ( ) completar sua tarefa, o browser chama o método start( ).
Mostrando um Applet
Applets são essencialmente gráficos. Assim, embora possa emitir chamadas do tipo
System.out.println( ), você cria sua exibição em um ambiente gráfico.
Você pode utilizar o painel de um applet criando um método paint( ). O método
paint() do applet recebe um objeto que representa a areá gráfica do applet no browser.
81
O browser chama o método paint( ) sempre que a exibição do applet precisa ser
atualizada.
O Método init( )
Esta função é chamada quando o applet é criado e carregado em um browser capaz de
apoiar tecnologia Java. O applet pode usar este método para inicializar valores de
dados. O método init ( ) é executado antes do método start( ) ser chamado.
public void init( ) {
// set up GUI
}
O Método start( )
Uma vez que o método init( ) é completado, o método start( ) é executado. Também é
executado sempre que o applet fica visível, como quando o browser é restabelecido
depois de ser iconificado ou quando o browser volta à página que contém o applet
depois de se mudar para outro URL.
public void start( ) {
musicClip.play( );
}
O Método stop( )
O método stop( ) é chamado quando o applet fica invisível. Isto acontece quando o
browser for iconificado ou segue uma ligação a outro URL. O applet usa este método
para parar qualquer funcionalidade que não deveria ocupar a CPU quando este não
estiver na página do browser atual.
public void stop( ) {
musicClip.stop( );
}
Os métodos start( ) e stop( ) efetivamente formam um par. Tipicamente start( ) ativa
um comportamento em um applet e stop( ) desativa o comportamento.
O Método paint( )
O métod paint( ) leva um argumento que é uma instância da classe java.awt.Graphics.
O argumento sempre é o contexto de gráficos do painel que compõe o applet. Você
pode usar este contexto para trazer ou escrever o seu applet. Exemplo:
import java.awt.*;
import java.applet.*;
public class HelloWorld extends Applet {
public void paint(Graphics g) {
g.drawString("HelloWorld", 25, 25);
}
}
Nota – Os argumentos numéricos no método drawString são coordenadas para o
começo do texto.
82
O Método repaint( )
Uma chamada para o método repaint( ) notifica o sistema que você quer atualizar a
exibição.
O Método update(Graphics g)
O método repaint( ), na verdade causa a chamada o outro método. O métod update( )
normalmente limpa a exibição atual e chama o método paint( ).
Applet Tag
A sintaxe completa para applet Tag é:
<applet
[archive = archiveList]
code = appletFile.class
width = pixels height = pixels
[codebase = codebaseURL]
[alt = alternateText]
[name = appletInstanceName]
[align = alignment]
[vspace = pixels] [hspace = pixels]
>
[<param name = appletAttribute1 value = value>]
[<param name = appletAttribute2 value = value>]
…….
[alternateHTML]
</applet>
Onde
archive = archiveList – Este atributo opcional descreve um ou mais arquivos que
contêm classes e outros recursos que são pré-lidos. As classes são carregadas usando
uma instância de um AppletClassLoader com o codebase. Os arquivos em archiveList
são separados por uma vírgula (,).
code = appletFile.class – Este atributo requerido dá o nome do arquivo que contém a
subclasse Applet compilada. Também pode estar no formato package.appletFile.class.
width = pixels height = pixels – Este atributo requerido atribui valores de altura e
largura para o tamanho da área do applet a ser exibido.
codebase = codebaseURL – Este atributo opcional especifica a URL básico do applet.
O diretório que contém o código do applet. Se este atributo não é especificado, então
a URL do documento é usado.
alt = alternateText – Este atributo opcional especifica qual texto exibir se o browser
pode ler o applet tag, mas não pode executar applets de Java.
name = appletInstanceName – Este atributo opcional especifica um nome para a
intância do applet, que torna possível para applets na mesma página achar um ao
outro.
83
align = alignment – Este atributo opcional especifica o alinhamento do applet. Os
possíveis valores deste atributo são: left, right, top, texttop, middle, absmiddle,
baseline, bottom, e absbottom.
vspace = pixels hspace = pixels – Estes atributos opcionais especificam o número de
pixels acima e abaixo do applet (vspace) e em cada lateral do applet (hspace).
<param name = appletAttribute1 value = value> - Esta tag proporciona para um applet
um valor especifico, servindo com o mesmo propósito de argumentos passados na
linha de comando.
Características Adicionais de Applet
A classe java.net.URL descreve URLs que podem ser usadas para conexão entre elas.
Dois métodos Applet determinam o valor de URLs:
getDocumentBase( ) – retorna um objeto URL que descreve o diretório da página de
browser atual (onde o arquivo HTML com applet tag está gravado).
getCodeBase( ) – retorna um objeto URL que descreve o diretório fonte do próprio
arquivo de classe applet. Freqüentemente é o mesmo do HTML
Lendo Parâmetros
Em um arquivo HTML, a tag < param > em um contexto < applet > pode passar
informação de configuração ao applet. Por exemplo:
<html>
<applet code = DrawAny.class width = 200 height = 200>
<param name = image values = "graphics/duke.gif">
</applet>
</html>
Dentro do applet, você pode usar o método getParameter( ) para ler os valores.
import java.awt.*;
import java.applet.*;
public class DrawAny extends Applet {
Image im;
public void init( ) {
String imageName = getParameter("image");
if (imageName != null) {
im = getImage(getDocumentBase( ), imageName);
}
else {
System.out.println("Error: Cannot find image");
}
}
public void paint(Graphics g) {
if (im != null) {
g.drawImage(im, 0, 0, this);
}
}
}
84
O método getParameter( ) procura pelo nome, e retorna o valor associado como
uma String.
Se o nome do parâmetro não for encontrado em qualquer tag < param > dentro do
contexto < applet></applet >, então getParameter( ) retorna nulo.
O tipo do parâmetro sempre é uma String. Se você precisa isto em outros tipos, você
terá que converter esta String. Exemplo:
int speed = Integer.parseInt(getParameter("speed"));
Applet/Application
import
import
import
import
java.applet.Applet;
java.awt.*;
java.awt.event.*;
java.util.*;
public class AppletApp extends Applet {
Date date;
public void init( ) {
date = new Date( );
}
public void paint (Graphics g) {
g.drawString("This Java program started at ", 25, 25);
g.drawString(date.toString( ), 25, 60);
}
public static void main (String args[ ]) {
Frame frame = new Frame("Application");
AppletApp app = new AppletApp( );
frame.add(app, BorderLayout.CENTER);
frame.setSize(250, 150);
frame.addWindowListener(new WindowAdapter( ) {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
app.init( );
app.start( );
frame.setVisible(true);
}
}
Exemplos
http://java.sun.com/docs/books/tutorial/listofapplets.html
Exercício JAVA35
Faça um applet para calcular a temperatura da mesma forma que foi feito nos
exercícios JAVA30 e JAVA32.
85
Threads
Threads são linhas de execução que rodam durante um processo (aplicação).
Normalmente as threads compartilham regiões de memória. Threads permitem que
sua aplicação execute mais de um método ao mesmo tempo.
Uma Thread possui três partes principais:
*Uma CPU virtual
*O código que a CPU está executando
*Os dados que os códigos estão manipulando
Criando uma Thread
Crie um objeto Thread passando no construtor um argumento que é uma instância de
uma classe que implementa a interface Runnable.
Exemplo:
public class ExemploThread {
int acoes;
public static void main(String args[]) throws Exception {
ExemploThread t = new ExemploThread();
t.executar();
}
void executar() throws Exception {
Monitor m = new Monitor("Pedro",100);
Thread t = new Thread(m);
t.start();
acoes = 50;
while (acoes!=0) {
String v =
javax.swing.JOptionPane.showInputDialog("Valor");
try {
acoes = Integer.parseInt(v);
}catch(NumberFormatException nfe) {
acoes=0;
}
}
System.out.println("Fim");
}
class Monitor implements Runnable {
String nome;
int valor;
public Monitor(String n, int v) {
nome = n;
valor = v;
}
public void run() {
while (acoes!=0) {
if (acoes > valor) {
System.out.println(nome+" está vendendo acoes
por:"+acoes);
acoes--;
} else {
System.out.println(nome+" está comprando acoes
por:"+acoes);
acoes++;
}
86
try {
Thread.sleep(2000);
}catch(InterruptedException ie) {}
}
}
}
}
Primeiro, o método executar( ) gera uma instância m da classe Monitor. O método
start() da Thread começa a executar o método run() da classe que implementa
Runnable. Paralelamente o método executar() continua a sua linha de execução e
entra em um loop while pedindo o valor das ações. O valor das ações está sendo
monitorado pelo outro processo definido no método run() do objeto Monitor.
Iniciando uma Thread
Quando uma thread está pronta para ser executada, você chama seu método start( ). O
método start( ) inicia a thread e então retorna ao processo principal. O método start( )
chama o método run( ) da thread, tornando-a ativa.
Escalonamento de Threads
Java pode rodar em máquinas com multiprocessador ou com um único processador,
com múltiplas threads ou com uma única thread. As threads com prioridade máxima
serão executadas primeiro, e todas as threads com a mesma prioridade obterão algum
tempo do processador. Threads de baixa prioridade também serão executadas.
Uma thread é bloqueada se ela estiver adormecida ou executando qualquer outro
sistema ou função de uma thread que esteja bloqueada. Quando uma thread é
bloqueada, Java escolhe a thread com prioridade máxima em condições de ser
executada.
A prioridade padrão de uma thread é NORM_PRIORITY. Se você atribuir a uma
thread uma prioridade mais baixa que a atual, o sistema poderá permitir que uma
outra thread seja executada. Uma thread só pode implementar uma nova thread de
mesma prioridade ou menor.
Vários métodos estáticos da classe Thread controlam o escalonamento de uma thread
corrente:
sleep(long millis) – deixa a thread, em execução no momento, inativa, por, no
mínimo, o número especificado de milisegundos. Isto não significa que exista garantia
de a thread fique inativa exatamente aquele tempo específico. Outro escalonamento de
thread pode interferir, da mesma forma que o intervalo mínimo e a precisão do relógio
do sistema.
Exemplo:
class Monitor implements Runnable {
String nome;
int valor;
public Monitor(String n, int v) {
87
nome = n;
valor = v;
}
public void run() {
while (acoes!=0) {
if (acoes > valor) {
System.out.println(nome+" está vendendo acoes
por:"+acoes);
acoes--;
} else {
System.out.println(nome+" está comprando acoes
por:"+acoes);
acoes++;
}
try {
Thread.sleep(2000);
}catch(InterruptedException ie) {}
}
}
}
yield( ) – cede a vez da thread em execução no momento, de forma que qualquer
thread em condições de ser executada possa ser executada. O escalonador escolhe a
thread a ser executada.
Finalizando uma Thread
Você pode parar a execução de uma thread usando um flag que indica ao método
run() que ele deve parar. Na classe Monitor quando valor de acoes é igual a zero o
metodo run() para.
Dentro do código, você pode obter uma referência à thread atual usando o método
currentThread. Por exemplo:
public class Exemplo implements Runnable {
public void run( ) {
while(true) {
System.out.println("Thread " + Thread.currentThread( ).
getName( ) + " completed");
}
}
}
Exercício JAVA36
Crie um thread no editor de texto para contar o numero de carateres do texto e atualize
o valor em um campo no rodapé da tela.
Stream I/O e Arquivos
Stream I/O
O I/O no Java é feito em termos de streams. Streams são sequências ordenadas de
dados que possuem uma fonte ou destino .
88
O pacote java.io define classes abstratas para streams de entrada e saída básicos. Estas
classes abstratas são então estendidas para fornecer vários tipos de streams úteis.
Entrada de Dados
Todas as operações de entrada de dados são realizadas por subclasses derivadas das
classes abstratas InputStream e Reader. A classe InputStream faz leitura orientada a
bytes. A classe Reader faz leitura orientada a caracteres.
Métodos Básicos de uma SubClasse de InputStream
int read()
Lê um único byte de dados e retorna o byte que foi lido.
int read(byte[ ])
Lê para um array de bytes. Este método bloqueia até a entrada estar disponível e então
preenche o array com tantos bytes quantos foram lidos.
int read(byte[ ], int ini, int tam)
Lê um subarray de bytes. Preenche o array, começando da posição ini, com o tamanho
tam de bytes, ou até chegar ao final.
Nota – Todos estes três métodos retornam –1 indicando fim de arquivo.
void close( )
Você utiliza este método para encerrar uma leitura ou um fluxo de bytes.
int available( )
Este método informa o número de bytes que estão disponíveis para leitura.
skip(long)
Este método descarta um número especifico de bytes.
Saída de Dados
As operações de saída de dados são realizadas por subclasses derivadas das classes
OutputStream e Writer. A classe OutputStream faz a escrita orientada a bytes e a
classe Writer é orientada a caracteres.
Métodos Básicos de uma SubClasse de OutputStream
void write(int a)
Grava a como um byte. O byte é passado como um int porque ele é muitas vezes o
resultado de uma operação aritmética.
void write(byte[ ])
89
Grava um array de bytes.
void write(byte[ ], int ini, int tam)
Grava parte de um array de bytes, começando em ini e gravando até tam bytes,
parando no final do array se esse for encontrado primeiro.
void close( )
Você utiliza este método para encerrar uma gravação ou um fluxo de bytes.
void flush( )
Descarrega o stream, de forma que quaisquer bytes armazenados em um buffer sejam
lançados para fora do stream ao seu destino.
Classes Streams Úteis
FileInputStream e FileOutputStream
Muitas entradas e saídas em aplicações lêem e gravam dados de arquivos. Os 2
streams que lidam com E/S de arquivo são: FileInputStream e FileOutputStream.
Exemplo:
FileInputStream infile = new FileInputStream("myfile.dat");
FileOutputStream outfile = new FileOutputStream("results.dat");
BufferedInputStream e BufferedOutputStream
Estas classes são frequentemente utilizadas em conjunção com os streams files, para
ajudar a reduzir acessos ao arquivo. Elas "bufferizam" os dados para gravar ou ler
blocos maiores.
DataInputStream e DataOutputStream
Essas interfaces definem métodos para transmitir tipos primitivos Java por meio de
um stream.
Métodos DataInputStream
byte readByte( )
long readLong( )
double readDouble( )
Métodos DataOutputStream
void writeByte(byte)
void writeLong(long)
void writeDouble(double)
90
PipedInputStream e PipedOutputStream
Os piped streams sãp utilizados como pares de entrada/saída. Os bytes gravados em
streams de entrada de um par são aqueles lidos na saída. Os piped streams provêm
uma forma segura de transferência de dados entre 2 threads. Em pares um stream é
para leitura e outro é para gravação.
PipedInputStream inp = new PipedInputStream( );
PipedOutputStream out = new PipedOutputStream( );
URL Input Streams
Além de acesso de arquivo básico, o Java proporciona meios de acessos a objetos na
rede. Você usa um objeto de URL implicitamente ao ter acesso a arquivos de
texto,sons e imagens. Um objeto URL pode ser acessado pelo método
getDocumentBase( ) de um Applet.
String imagefile = new String ("images/Duke/Tl.gif");
images[0] = getImage(getDocumentBase( ), imagefile);
Ou criar a URL direto como um objeto:
java.net.URL imageSource;
try {
imageSource = new URL("http://mysite.com");
} catch (MalformedURLException e) {return;}
images[0] = getImage(imageSource, "images/Duke/Tl.gif");
Abrindo um Input Stream
Você pode abrir um input stream de um objeto URL para ler arquivos do servidor a
partir do documento base (caminho root do webserver).
InputStream is = null;
String datafile = new String("remote/data.txt");
byte buffer[ ] = new byte[24];
try {
is = (new URL(getDocumentBase( ),datafile)).openStream( );
}
catch (Exception e) {
//ignora
}
// O método openStream() do objeto URL retorna o objeto stream para
// ler informação, da mesma maneira que com um objeto
// FileInputStream.
try {
is.read(buffer, 0, buffer.length);
}
catch (IOException el) {
// ignora
}
Readers
91
Lendo uma string do teclado. O objeto InputStreamReader é usado no exemplo e
mostra como ler uma informação do teclado a partir do stream padrão System.in:
import java.io.*;
public class LendoTeclado {
public static void main(String args[ ]) throws IOException {
String s;
InputStreamReader ir;
ir = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(ir);
while ((s = in.readLine( )) != null) {
System.out.println("Read: " + s);
}
}
}
Lendo linhas de um arquivo texto. Use as classes BufferedReader e FileReader para
ler e abrir um arquivo.
import java.io.*;
public class LendoArquivo {
public static void main(String[] args) throws IOException {
FileReader fr;
fr = new FileReader("c:/agenda.txt");
BufferedReader br = new BufferedReader(fr);
String linha = br.readLine();
while (linha != null) {
System.out.println(linha);
linha = br.readLine();
}
br.close();
fr.close();
}
}
Writers
Escrevendo linhas em um arquivo texto. Use as classes FileWriter e PrintWriter para
abrir e escrever um arquivo texto.
import java.io.*;
public class EscrevendoArquivo {
public static void main(String[] args) throws IOException {
FileWriter fw;
fw = new FileWriter("c:/disciplinas/pp/megasena.txt",false);
PrintWriter pw = new PrintWriter(fw);
pw.println("numeros gerados");
for (int i=0; i<6; i++){
long numero = Math.round(Math.random()*60);
System.out.println(String.valueOf(numero));
pw.println(numero);
}
pw.close();
fw.close();
}
}
Código de Página
92
Se você precisa ler um caráter de uma conexão de rede com um tipo diferente de
máquina, você pode construir o InputStreamReader com um código de página
definido:
ir = new InputStreamReader(System.in, "ISO8859-1")
Files
Criando um novo arquivo/pasta
A classe File provê várias utilidades para lidar com arquivos e obter informações
básicas sobre eles.
File myfile;
myfile = new File("mymotd");
myfile = new File("/","mymotd");
File mydir = new File("/");
myfile = new File(myDir, "mymotd");
Nota - Você pode usar um objeto File como argumento no construtor para
FileInputStream e FileOutputStream no lugar de uma String.
Funções de Arquivos
Uma vez você criou um objeto File, você pode usar quaisquer dos métodos seguintes
para colher informação sobre o arquivo:
Os seguintes métodos devolvem informações sobre nome e localização do arquivo:
String getName( )
String getPath( )
String getAbsolutePath( )
String getParent( )
boolean renameTo(File newname)
Os seguintes métodos devolvem informações sobre os atributos do arquivo:
boolean
boolean
boolean
boolean
boolean
boolean
exists( )
canWrite( )
canRead( )
isFile( )
isDirectory( )
isAbsolute( )
Os seguintes métodos devolvem informações gerais do arquivo:
long lastModified( )
long length( )
boolean delete( )
Os seguintes métodos criam e lêem diretórios:
boolean mkdir( )
String[ ] list( )
93
Acessando Arquivos Randomicos
Você tem duas opções para abrir um arquivo de acesso randomico. Passando o nome
do arquivo:
myRAFile = new RandomAccessFile(String name, String mode);
Ou com um objeto File:
myRAFile = new RandomAccessFile(File file, String mode);
O argumento mode determina se você tem acesso somente de leitura ("r") ou acesso
read/write ("rw") para este arquivo. Exemplo:
RandomAccessFile myRAFile;
myFAFile = new RandomAccessFile("db/stock.dbf","rw");
Acessando Informações
long getFilePointer( );
Retorna a localização corrente do ponteiro do arquivo (em bytes) em relação ao início
do arquivo.
void seek(long pos);
Ajusta o ponteiro do arquivo em um posição específica em número de bytes em
relação ao início do arquivo.
long length( );
Retorna o comprimento do arquivo.
Gravando um objeto
Abaixo, um exemplo de como gravar um objeto com um stream:
import java.io.*;
import java.util.Date;
public class SerializeDate {
public SerializeDate( ) {
Date d = new Date( );
try {
FileOutputStream f = new FileOutputStream ("date.ser");
ObjectOutputStream s = new ObjectOutputStream (f);
s.writeObject (d);
s.close( );
}
catch (IOException e) {
e.printStackTrace( );
}
}
public static void main (String args[ ]) {
new SerializeDate( );
}
94
}
Lendo um objeto
Abaixo, um exemplo de como ler um objeto Stream:
import java.io.*;
import java.util.Date;
public class UnSerializeDate {
public UnSerializeDate( ) {
Date d = null;
try {
FileInputStream f = new FileInputStream ("date.ser");
ObjectInputStream s = new ObjectInputStream (f);
d = (Date) s.readObject( );
s.close ( );
}
catch (Exception e) {
e.printStackTrace;
}
System.out.println("Unserialized Date object from date.ser");
System.out.println("Date: " + d);
}
public static void main (String args[ ]) {
new UnSerializeDate( );
}
}
Exercício JAVA37
1. Crie uma aplicação chamada MostraArquivo.java que abra, leia e mostre o
conteúdo de qualquer arquivo texto. Exiba uma mensagem de erro apropriada
quando não puder exibir um arquivo, incluindo as exceções apropriadas.
Exercício JAVA38
2. Crie uma classe que escreve a tabuada de 1 a 10 no arquivo tabuada.txt
conforme layout abaixo:
1x1=1
2x1=2
...
10x1=10
1x2=2
2x2=4
...
10X2=20
...
...
...
...
1X10=10
2X10=20
...
10X10=100
Exercício JAVA39
Inclua a opção para Salvar o conteúdo no editor de texto criado nos exercícios
anteriores
Networking
Sockets
Socket é o nome dado ao ponto final de uma ligação de comunicação entre processos.
Para comunicação entre processos em uma rede, o Java usa os streams. Um socket
deve tratar dois streams: um input stream (fluxo de entrada) e um output stream (fluxo
95
de saída). Um processo envia dados a outro processo pela rede escrevendo no
output stream associado ao socket. Um processo lê os dados de outro processo lendo
do input stream associado ao socket.
Estabelecendo a Conexão
Para estabelecer uma conexão, um processo espera pela conexão de outro processo.
Enviando a Conexão
Ao fazer uma conexão de rede, você precisa saber o endereço IP ou o nome da
máquina remota e o número da porta TCP para a conexão.
Portas TCP/IP
O número de portas do TCP/IP varia de 0-65535. Na prática, números abaixo de 1024
são reservados para serviços pré-definidos, e você não os deveria usar, a menos que
você queira comunicar com um desses serviços como Telnet, Protocolo de Transporte
de Correio Simples (SMTP), ftp, e assim por diante.
Cliente e servidor têm que concordar com antecedência em que porta irão se
comunicar. Se os números de portas usadas pelas duas partes do sistema não
concordarem, nenhuma comunicação será efetivada.
Servidor de TCP/IP
Abaixo, um exemplo de um servidor para comunicação TCP/IP:
import java.net.*;
import java.io.*;
public class SimpleServer {
public static void main(String args[ ]) {
ServerSocket servidor = null;
Socket conexao;
OutputStream out;
DataOutputStream dos;
//Registra a porta 5432
try {
servidor = new ServerSocket(5432);
}
catch (IOException e) {
//ignora
}
while (true) {
try {
conexao=servidor.accept( );
out = conexao.getOutputStream( )
dos = new DataOutputStream (out);
dos.writeUTF("Hello Net World!");
dos.close( );
out.close( );
conexao.close( );
}
catch (IOException e) {
//ignora
}
}
}
96
}
Cliente de TCP/IP
Abaixo, um exemplo de um aplicação cliente para comunicação TCP/IP:
import java.net.*,
import java.io.*;
public class SimpleClient {
public static void main(String args[ ])
throws IOException {
Socket conexao;
InputStream in;
DataInputStream dis;
conexao = new Socket ("127.0.0.1", 5432)
in = conexao.getInputStream( );
dis = new DataInputStream(in);
String st = new String (dis.readUTF( ));
System.out.println(st);
dis.close( );
in.close( );
conexao.close( );
}
}
Exercício JAVA40
1. Desenvolva uma aplicação que permita o servidor receber o nome de um arquivo
do cliente, tentar abrí-lo e retorná-lo ao cliente através de um socket. O programa
cliente pede o nome do arquivo ao usuário e envia ao servidor, e então espera o
servidor enviar uma mensagem de erro ou o próprio arquivo.
JDBC "Driver"
Um JDBC "Driver" é uma coleção de classes que implementam as interfaces de JDBC
exigidas para conectar um programa Java com um banco de dados. Cada driver de
banco de dados tem que prover uma classe que implementa a interface
java.sql.Driver. Esta classe é então registrada pela classe java.sql.DriverManager para
se conectar a um banco de dados.
Os drivers JDBC possuem quatro categorias:
JDBC-ODBC - provê acesso por um driver ODBC.
Native-API - converte chamadas JDBC em chamadas no programa cliente para
Oracle, Sybase, Informix, DB2, ou outro DBMS. Requer que algum código binário
esteja instalado na máquina do cliente.
Net-Protocol - traduz chamadas JDBC para um protocolo DBMS independente, que é
traduzido então para um protocolo de DBMS específico.
Native-Protocol – As chamadas JDBC acessam o banco de dados direto como um
cliente .
97
Pacote java.sql
Interfaces do JDBC
Driver - interface que toda classe de driver tem que implementar.
Connection – é uma conexão com um banco de dados específico. Dentro do contexto
de uma conexão, são executadas declarações SQL e devolvidos resultados
Statement – é o objeto usado para executar uma declaração SQL e obter os resultados
produzido por isto.
PreparedStatement – é um objeto que representa uma declaração precompilada de
SQL.
CallableStatement – é uma interface que executa procedimentos SQL.
ResultSet - um ResultSet provê acesso a um conjunto de dados. Um objeto ResultSet
normalmente é gerado executando uma Statement.
ResultSetMetaData – é um objeto que pode ser usado para ter acesso aos tipos e
propriedades das colunas de um ResultSet.
DatabaseMetaData – retorna informações sobre o banco de dados como um todo.
Estas interfaces permitem ao programador abrir conexões com o banco de dados,
executar instruções SQL e processar os resultados.
Uma String URL é passada ao método getConnection ( ) do DriverManager, que
devolve um driver para a conexão.
Com o driver, você obtem uma conexão.
Com a conexão, você pode criar um Statement ou PreparedStatement.
Quando uma Statement é executada com um método executeQuery ( ), um ResultSet é
devolvido.
Registrando um driver JDBC
Quando a JVM carrega uma classe de um driver JDBC, o próprio driver se registra na
classe DriverManager. Abaixo temos exemplos de dois drivers, um para acesso
ODBC e outro para acesso ao banco FireBird ou InterBase.
// acesso ODBC
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// acesso Firebird
Class.forName("org.firebirdsql.jdbc.FBDriver");
98
Nota – Ao se tentar registrar um driver, isto pode retornar um exceção
(ClassNotFoundException). Para isso, sempre utilize blocos try e catch para capturar
esta exceção
Criando uma conexão
Após você ter registrado um driver para a classe DriverManager, você precisa criar
uma conexão utilizando este drive. Para isso, utiliza-se o método getConnection( ).
Connection con = DriverManager.getConnection(URL, username,
password);
Exemplo 1: Acessando o link ODBC chamado Empresa
String url = "jdbc:odbc:Empresa";
Connection con = DriverManager.getConnection(url,"sa","sa");
Exemplo 2: Acessando o banco CAMPEONATO.GDB do FireBird na máquina local
String url = "jdbc:firebirdsql:localhost/3050:C:/CAMPEONATO.GDB";
Connection con = DriverManager.getConnection(
url,"sysdba","masterkey");
Criando uma instrução SQL
Para poder executar qualquer instrução SQL no banco, pode-se utilizar duas
interfaces: Statement ou PreparedStatement. Para a interface Statement, você utiliza o
método createStatement, enquanto para a interface PreparedStatement, utiliza-se o
método prepareStatement. A diferença entre as duas é que com a segunda interface
você pode utilizar instruções em SQL dinâmico.
Exemplo:
String sql = "SELECT NOME FROM CLIENTE WHERE CODIGO = 999";
Statement instrucao = con.createStatement();
ResultSet resultado = instrucao.executeQuery(sql);
Ou
String sql = "SELECT NOME FROM CLIENTE WHERE CODIGO = ?";
PreparedStatement instrucao = con.prepareStatement(sql);
instrucao.setInt(1,999); // susbtitui o ? pelo valor 999
ResultSet resultado = instrucao.executeQuery();
Quando uma instrução SQL for retornar dados, você utiliza o método executeQuery().
Para atualizar dados no banco de dados, você utiliza o método executeUpdate().
Recebendo dados do banco
O método executeQuery( ) gera um ResulSet. O ResultSet é o resultado que possui a
linha ou as linhas retornadas pela instrução SQL. Abaixo, um exemplo de como
manipular o ResultSet e mostrar os dados retornados.
Exemplo:
99
String sql = "SELECT NOME, IDADE FROM CLIENTE WHERE CODIGO = ?"
PreparedStatement instrucao = con.prepareStatement(sql);
// O comando setInt substitui o ? pelo valor 998. Como o valor é
// um int, utiliza-se setInt.
instrucao.setInt(1, 998);
//Recebe os dados
ResultSet resultado = instrucao.executeQuery( );
while(resultado.next( )) {
//Para acessar os dados do ResulSet, use os métodos getXXX
System.out.println("Nome: " + resultado.getString("NOME" ));
System.out.println("Idade: " + resultado.getInt("IDADE" ));
}
Enviando dados ao banco
Para enviar dados ou atualizar informações em um banco, utiliza-se o método
executeUpdate( ). Para enviar dados:
//Salvando novos dados
String sql = "INSERT INTO FUNCIONARIO VALUES (?,?,?,?,?,?,?,?,?)";
PreparedStatement instrucao = con.prepareStatement(sql);
// Passando os valores
instrucao.setInt(1,id);
instrucao.setString(2,nome);
instrucao.setString(3,endereco);
instrucao.setString(4,bairro);
instrucao.setString(5,cep);
instrucao.setString(6,cidade);
instrucao.setString(7,estado);
instrucao.executeUpdate();
Para atualizar informações:
//Alterando dados
String sql = "UPDATE FUNCIONARIO SET NOME=?, ENDERECO=?,"BAIRRO=?,
CEP=?, CIDADE=?, ESTADO=? WHERE ID=?";
PreparedStatement instrucao = con.prepareStatement(sql);
//Passando os valores
instrucao.setString(1,nome);
instrucao.setString(2,endereco);
instrucao.setString(3,bairro);
instrucao.setString(4,cep);
instrucao.setString(5,cidade);
instrucao.setString(6,estado);
instrucao.setInt(7,id);
instrucao.executeUpdate();
Datas para SQL
Existem duas classes Date no java uma no pacote java.util e outra no pacote java.sql.
Para converter um objeto Date para gravar no banco use o código exemplo abaixo:
java.util.Date hoje = new java.util.Date();
100
java.sql.Date hojeSQL = new java.sql.Date(hoje.getTime());
Tabela de métodos setXXX
Método
setASCIIStream
setBigDecimal
setBinaryStream
setBoolean
setByte
setBytes
setDate
setDouble
setFloat
setInt
setLong
setNull
setObject
setShort
setString
setTime
setTimestamp
setUnicodeStream
SQL Types
Uses an ASCII stream to produce a
LONGVARCHAR
NUMERIC
LONGVARBINARY
BIT
TINYINT
VARBINARY or LONGVARBINARY
DATE
DOUBLE
FLOAT
INTEGER
BIGINT
NULL
The given Java object is converted to the
target SQLType before being sent
SMALLINT
VARCHAR or LONGVARCHAR
TIME
TIMESTAMP
UNICODE
Tabela de métodos getXXX
Method
getASCIIStream
getBigDecimal
getBinaryStream
getBoolean
getByte
getBytes
getDate
getDouble
getFloat
getInt
getLong
getObject
getShort
getString
getTime
getTimestamp
getUnicodeStream
Exercício JAVA41
Java Type Returned
java.io.InputStream
java.math.BigDecimal
java.io.InputStream
boolean
byte
byte[ ]
java.sql.Date
double
float
int
long
Object
short
java.lang.String
java.sql.Time
java.sql.Timestamp
java.io.InputStream
101
1.Faça um programa para ler a tabela AGENDAFONE . O usuário informa um
nome e a classe mostra os números dos telefones. Use o script abaixo para criar a
tabela no banco do Firebird
CREATE TABLE AGENDAFONE (
CODIGO
INTEGER NOT NULL,
NOME
VARCHAR(100) NOT NULL,
FONE1
VARCHAR(20) NOT NULL,
FONE2
VARCHAR(20),
FONE3
VARCHAR(20),
ULTATUALIZACAO DATE
);
ALTER TABLE AGENDAFONE ADD CONSTRAINT PK_AGENDAFONE PRIMARY KEY (CODIGO);
CREATE UNIQUE INDEX AGENDAFONE_IDX1 ON AGENDAFONE (NOME);
Download