RNP Java Básico
RNP Java Básico
Rio de Janeiro
Escola Superior de Redes
2013
Java básico 1
Java básico 1
Sumário
Lógica de Programação ................................................................................................ 1
Conceito de Algoritmo ................................................................................. 2
Método para a Construção de Algoritmos .................................................... 2
Instruções...................................................................................................... 4
Histórico da linguagem de programação Java ............................................................. 6
Características da Linguagem ...................................................................... 8
Similaridade com C, C++ ......................................................................... 8
Compilação ............................................................................................... 8
Portabilidade............................................................................................. 8
Orientação a Objetos ................................................................................ 9
Segurança ................................................................................................. 9
Concorrência ............................................................................................ 9
Eficiência .................................................................................................. 9
Suporte para Programação de Sistemas Distribuídos ............................. 10
Fundamentos de Programação em Java ..................................................................... 11
O que é Java ............................................................................................... 11
Recursos da Linguagem Java ..................................................................... 12
Máquina Virtual Java ............................................................................. 12
Coleta de Lixo ........................................................................................ 13
Segurança de Código .............................................................................. 13
Primeiro Programa ..................................................................................... 14
Alguns cuidados ao escrever e executar programas Java ........................... 16
Comentários................................................................................................ 16
Variáveis ..................................................................................................... 19
Tipos de Dados ........................................................................................... 19
Inteiros .................................................................................................... 20
Ponto Flutuante....................................................................................... 20
Tipo Caractere, char ............................................................................... 20
Tipo boolean ........................................................................................... 21
Atribuições e Inicializações.................................................................... 21
Conversões entre Tipos Numéricos ........................................................ 22
Constantes .................................................................................................. 22
Operadores.................................................................................................. 23
Tipo String .................................................................................................. 25
Concatenação.......................................................................................... 25
Substrings ................................................................................................... 25
Tamanho ................................................................................................. 26
Teste de Igualdade .................................................................................. 26
Manipulando dados em Java ...................................................................... 26
Exercícios de Fixação 4 – Variáveis .......................................................... 27
Atividade 2 – Variáveis e manipulação de dados (Complementar) ........... 28
Controle de Fluxo ....................................................................................................... 29
Escopo de um Bloco de comandos ............................................................. 29
Estruturas de Decisão ................................................................................. 30
Comando if ............................................................................................. 30
Java básico 1 i
Comando switch ..................................................................................... 31
Estruturas de Repetição .............................................................................. 33
Definição ................................................................................................ 33
Comando while....................................................................................... 33
Comando do ... while.............................................................................. 34
Comando for ........................................................................................... 34
Quebra de fluxo .......................................................................................... 35
Comando Break ...................................................................................... 35
Comando continue .................................................................................. 36
Comando return ...................................................................................... 36
Arrays ......................................................................................................................... 39
Exercício de nivelamento 6 – Arrays ......................................................... 39
Definição .................................................................................................... 39
Tamanho de uma array ............................................................................... 41
Cópia de Arrays .......................................................................................... 42
Arrays como Argumentos .......................................................................... 42
Arrays como Valores de Retorno ............................................................... 42
Arrays Multidimensionais .......................................................................... 42
Classes Especializadas ............................................................................................... 45
Wrappers de Objetos .................................................................................. 45
Date, DateFormat e Calendar ..................................................................... 46
Date 46
DateFormat ............................................................................................. 47
Calendar.................................................................................................. 48
NumberFormat ........................................................................................... 48
DecimalFormat ........................................................................................... 49
Padrão de Caracteres Especiais .............................................................. 49
Math............................................................................................................ 50
Classes e Objetos........................................................................................................ 53
Programação Orientada a Objetos .............................................................. 53
Classes ........................................................................................................ 54
Relações entre Classes............................................................................ 54
Objetos........................................................................................................ 55
Objetos como Argumentos ..................................................................... 55
Auto referência a um objeto ................................................................... 56
Atributos ................................................................................................. 56
Métodos .................................................................................................. 57
Getters e Setters...................................................................................... 57
Sobrecarga .............................................................................................. 58
Construtores............................................................................................ 58
Blocos de Inicialização ........................................................................... 59
Métodos e Atributos static .......................................................................... 59
Pacotes ........................................................................................................ 63
Usando pacotes ....................................................................................... 63
Adicionando uma classe em um pacote ................................................. 65
Herança ....................................................................................................... 66
Hierarquia de Heranças .......................................................................... 67
ii Java básico 1
Evitar Herança ........................................................................................ 68
Atividade 3 - Herança................................................................................. 68
Polimorfismo .............................................................................................. 69
Classes Abstratas ........................................................................................ 70
Ligação ....................................................................................................... 71
Classe Class ................................................................................................ 72
Reflexão.................................................................................................. 73
Análise de Recursos das Classes ............................................................ 73
Análise de Objetos em Tempo de Execução .............................................. 73
Superclasse abstrata ................................................................................ 73
Interfaces ................................................................................................ 74
Propriedades ........................................................................................... 76
Classes Internas .......................................................................................... 77
Collections.................................................................................................................. 83
Exercício de nivelamento 9 – Collections .................................................. 83
Definição .................................................................................................... 83
O que é o Java Collections Framework? .................................................... 83
Benefícios do Java Collections Framework ............................................... 84
Listas .......................................................................................................... 85
Conjunto ..................................................................................................... 86
Mapas ......................................................................................................... 87
Exercício de Fixação 11 – Collections ....................................................... 89
Bibliografia ................................................................................................................ 91
Você poderia descrever a sequência de passos necessários para realizar a troca de um pneu
furado de um carro?
A lógica de programação é uma técnica desenvolvida para auxiliar as pessoas que desejam
trabalhar com desenvolvimento de programas e sistemas. Ela permite definir e encadear
pensamentos numa sequência lógica de passos necessários para o desenvolvimento de uma
solução computacional para atingir um determinado objetivo ou solução de um problema
(FARRER, 1999).
Java básico 1 1
linguagem entendida pelo computador e pelo desenvolvedor de software, é o que chamamos de
linguagem de programação.
Conceito de Algoritmo
A seguir serão apresentados alguns conceitos de algoritmos.
“Algoritmo é uma sequência de passos que visam atingir um objetivo bem definido”
(Forbellone, 1999).
“Algoritmo é a descrição de uma sequência de passos que deve ser seguida para a realização
de uma tarefa” (Ascêncio, 1999).
Teste de qualidade: execute o algoritmo desenvolvido com dados para os quais o resultado
seja conhecido. O ideal é que o universo dos dados tenha todas as combinações possíveis.
Produto final: algoritmo concluído e testado, pronto para ser traduzido em programa de
computador.
2 Java básico 1
Figura 1.1 – Passos lógicos para desenvolvimento de programas.
Para a construção de qualquer tipo de algoritmo são necessários os passos descritos a seguir:
3. definir o processamento, ou seja, quais cálculos serão efetuados e quais as restrições para esses
cálculos. O processamento é responsável por transformar os dados de entrada em dados de saída;
4. definir os dados de saída, ou seja, quais dados serão gerados depois do processamento;
5. construir o algoritmo;
De posse deste método, nós podemos observar várias situações do dia-a-dia e imaginarmos uma
sequência de passos lógicos para solucionarmos, conforme os exemplos descritos a seguir:
Java básico 1 3
Soma de dois números inteiros
Instruções
Na linguagem comum, entende-se por instruções “um conjunto de regras ou normas definidas
para a realização ou emprego de algo”. Em informática, instrução é a informação que indica a um
computador uma ação elementar a executar (GUIMARÃES, 1994) (FARRER, 1999) (ASCENCIO,
2005).
Convém ressaltar que uma ação isolada não permite realizar o processo por completo, sendo
necessário um conjunto de instruções colocadas em ordem sequencial lógica para implementar
uma solução computacional adequada para um determinado problema.
Por exemplo, se quisermos trocar o pneu de um carro, precisaremos colocar em prática uma
série de instruções: parar o carro, desligar o motor, pegar o pneu reserva, macaco e chave de
rodas, etc...
É evidente que essas instruções têm que ser executadas em uma ordem adequada, ou seja, não
se pode tirar o pneu furado sem antes erguer o carro com o macaco, por exemplo. Dessa
maneira, uma instrução tomada em separado não tem muito sentido, ficando claro que, para
obtermos um determinado resultado, precisamos colocar em prática um conjunto de instruções
numa ordem lógica correta.
4 Java básico 1
Exercícios de Fixação 1 – Lógica de Programação
Desenvolva algoritmos para dar solução a cada um dos problemas apresentados a seguir:
Dadas 4 notas de um aluno, informar se ele está aprovado ou reprovado, considerando a média
de aprovação igual ou superior a 7.
Java básico 1 5
2
Histórico da linguagem de programação Java
A linguagem Java começou em 1991, quando um grupo de engenheiros da Sun, liderados por
Patrick Naughton, Sun Fellow e James Gosling, quiseram projetar uma pequena linguagem de
programação que pudesse ser usada em equipamentos de consumo como caixas de comutação
de TV a cabo. Com esses dispositivos não tinham uma grande capacidade de processamento ou
memória, a linguagem tinha de ser pequena para gerar um código bem limitado em tamanho.
Além disso, como fabricantes diferentes podiam escolher CPUs diferentes, era importante não
ficar preso a uma única arquitetura. O projeto recebeu o nome de Green (HORSTMANN, 2003).
Já o pessoal da Sun, que tinha experiência com UNIX, baseou sua linguagem no C++ em vez do
Pascal. Em particular, eles fizeram a linguagem orientada a objetos em vez de orientada a
procedimentos. Porém, como Gosling diz na entrevista, “Desde o início, a linguagem era uma
ferramenta, não o fim”. Gosling decidiu chamar essa linguagem de Oak (presumivelmente
porque ele gostava da aparência de um carvalho, oak em inglês, que ficava bem à frente de sua
janela na Sun). O pessoal da Sun, mais tarde descobriu que Oak era o nome de uma linguagem de
computador já existente, de modo que trocaram o nome para Java.
Em 1992, o projeto Green apresentava seu primeiro produto, chamado *7. Ele era um controle
remoto extremamente inteligente. (Tinha o poder de uma SPARC station numa caixa de 15 x 10
x 10 cm). Infelizmente, ninguém estava interessado em produzi-lo na Sun e o pessoal do projeto
Green teve que procurar outras formas de comercializar a tecnologia. Mesmo assim, nenhuma
das empresas de equipamentos eletrônicos de consumo estava interessada. O grupo então
ofereceu um projeto de construção de uma caixa de TV a cabo que pudesse lidar com novos
serviços de cabo como vídeo sob demanda. Eles não conseguiram o contrato. (Ironicamente, a
empresa que o fez era liderada por Jim Clark, que começou a Netscape – uma empresa que fez
muito pelo sucesso da linguagem Java).
O projeto Green (com o novo nome de First Person Inc.) gastou todo o ano de 1993 e a metade
de 1994 procurando quem comprasse sua tecnologia. Ninguém quis. (Patrick Naughton, um dos
fundadores do grupo e a pessoa que acabou fazendo a maior parte da comercialização, afirma
6 Java básico 1
que acumulou mais de 300000 milhas em viagens aéreas tentando vender a tecnologia). A First
Person foi dissolvida em 1994.
Enquanto tudo isso ocorria na Sun, a parte World Wide Web da internet estava crescendo cada
vez mais. A chave para a Web é o navegador (browser) que converte a página de hipertexto para
a tela. Em 1994, a maioria usava Mosaic, um navegador Web não comercial que surgiu no centro
de supercomputação da Universidade de Illinois, em 1993. (O Mosaic foi parcialmente escrito
por Marc Andreessen por U$ 6.85 a hora como estudante de pós-graduação em um projeto
acadêmico. Ele passou para a fama e a fortuna como um dos co-fundadores e cabeça do grupo
Netscape.)
Em uma entrevista para a SunWorld, Gosling disse que na metade de 1994 os desenvolvedores
de linguagem perceberam que “Nós podíamos elaborar um navegador bom de verdade. Isso era
uma das poucas coisas do processo cliente/servidor que precisava de algumas das coisas
esquisitas que havíamos feito: neutralidade de arquitetura, tempo real, confiabilidade,
segurança – questões que não eram terrivelmente importantes no mundo das estações de
trabalho. Assim, construímos um navegador”.
O navegador em si foi elaborado por Patrick Naughton e Jonathan Payne e evoluiu até o
navegador HotJava existente hoje em dia. Este foi escrito em Java para mostrar seu poder. Mas
os responsáveis pela sua elaboração também tiveram em mente o poder do que agora
chamamos de applets, de modo que eles fizeram o navegador capaz de interpretar os bytecodes
intermediários. Essa demonstração de tecnologia foi exibida na SunWorld 95 em 23 de maio de
1995 e inspirou a moda Java que continua até hoje.
A grande jogada que espalhou a utilização da linguagem Java ocorreu na primavera de 1995
(hemisfério sul), quando a Netscape decidiu fazer a versão 2.0 do navegador Netscape com
capacidade Java. O Netscape 2.0 foi lançado em janeiro de 1996 e tinha capacidade Java (assim
como todas as versões posteriores). Outros licenciados incluíram empresas IBM, Symantec,
Inprise e outras. Até mesmo a Microsoft foi licenciada e deu suporte à linguagem Java. O Internet
Explorer tem capacidade Java e o Windows contém uma máquina virtual Java. (Note-se, porém
que a Microsoft não suporta a versão mais recente da linguagem Java, e que sua implementação
difere do Java padrão).
A Sun lançou a primeira versão da linguagem Java no início de 1996. Ela foi seguida pelo Java
1.02 alguns meses depois. As pessoas rapidamente perceberam que o Java 1.02 não seria usado
no desenvolvimento de aplicativos sérios. Certamente alguém poderia usar o Java 1.02 para
fazer um applet de texto nervoso (que move o texto ao acaso na tela). Mas não era possível
sequer imprimir em Java 1.02! Para ser franco, o Java 1.02 não estava pronto para o horário
nobre.
Os grandes anúncios sobre os futuros recursos da linguagem Java apareceram nos primeiros
meses de 1996. Somente a conferência JavaOne, ocorrida em San Francisco em maio de 1996,
apresentou um quadro completo mais claro de para onde o Java estava indo. No JavaOne, o
pessoal da Sun Microsystems esboçou sua visão do futuro da linguagem Java com uma série
aparentemente sem fim de aprimoramentos e novas bibliotecas. Havia a desconfiança de que
isso levaria anos para acontecer. Não foi o que aconteceu porque num prazo relativamente curto
a maioria das coisas prometidas tinham sido implementadas.
Java básico 1 7
A grande novidade da conferência JavaOne de 1998 foi o anúncio do futuro lançamento do Java
1.2, que substitui a interface gráfica com o usuário e as ferramentas gráficas não profissionais
por versões sofisticadas e expansíveis que se aproximaram muito mais da promessa de escreva
uma vez, rode em qualquer lugar de seus [Link]ês dias após seu lançamento, em
dezembro de 1998, o nome foi alterado para Java 2. Novamente, não se acreditava que tudo
seria implementado rapidamente. Surpreendentemente, grande parte foi implementada num
tempo curto.
Características da Linguagem
Compilação
Um programa em Java é compilado para o chamado bytecode, que é próximo às instruções de
máquina, mas não de uma máquina real. O bytecode é um código de uma máquina virtual
idealizada pelos criadores da linguagem. Por isso Java pode ser mais rápida do que se fosse
simplesmente interpretada.
Além disso, existem compiladores de código nativo para Java (Asymetrix, Symantec, IBM etc). Há
também outra forma de compilação, just-in-time (JIT). Esses compiladores trabalham
compilando os bytecodes em código nativo uma vez, guardando o resultado e utilizando nas
outras chamadas.
Portabilidade
Java foi criada para ser portável. O bytecode gerado pelo compilador para a sua aplicação
específica pode ser transportado entre plataformas distintas que suportam Java (Solaris 2.3,
Windows, Mac/Os etc). Não é necessário recompilar um programa para que ele rode numa
máquina e sistema diferentes, ao contrário do que acontece, por exemplo, com programas
escritos em C e outras linguagens.
8 Java básico 1
Orientação a Objetos
A portabilidade é uma das características que se inclui nos objetivos almejados por uma
linguagem orientada a objetos. Em Java ela foi obtida de maneira inovadora com relação ao
grupo atual de linguagens orientadas 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.
Segurança
A presença de coleta automática de lixo (garbage collection), evita erros comuns que os
programadores cometem quando são obrigados a gerenciar diretamente a memória (C , C++,
Pascal). A eliminação do uso de ponteiros, em favor do uso de vetores, objetos e outras
estruturas substitutivas, traz benefícios em termos de segurança. O programador é proibido de
obter acesso à memória que não pertence ao seu programa, além de não ter chances de cometer
erros comuns tais como reference aliasing e uso indevido de aritmética de ponteiros. Estas
medidas são particularmente úteis quando pensarmos em aplicações comerciais desenvolvidas
para a internet.
Ser strongly typed também é uma vantagem em termos de segurança, que está aliada a
eliminação de conversões implícitas de tipos de C++.
Concorrência
A linguagem permite a criação de maneira fácil, de vários threads de execução. Este tópico será
útil quando você estudar animações, e é particularmente poderoso nos ambientes em que
aplicações Java são suportadas, ambientes estes que geralmente podem mapear os threads da
linguagem em processamento paralelo real.
Eficiência
Como Java foi criada para ser usada em computadores pequenos, ela exige pouco espaço, pouca
memória. É muito mais eficiente que grande parte das linguagens de scripting existentes,
embora seja muitas vezes mais lenta que C, o que não é um marco definitivo. Com a evolução da
linguagem, existem geradores de bytecodes cada vez mais otimizados que levam as marcas de
performance da linguagem mais próximas das de C++ e C. Além disso, um dia Java permite a
possibilidade de gerar código executável de uma particular arquitetura on the fly, tudo a partir
Java básico 1 9
do bytecode. São os compiladores JIT vistos acima que chegam a acelerar 10 a 20 vezes a
execução de um programa.
10 Java básico 1
3
Fundamentos de Programação em Java
Exercício de nivelamento 2 – Fundamentos de Programação em
Java
O que você entende por linguagem de programação?
O que é Java
Java resulta da busca por uma linguagem de programação que englobe todas as características
da linguagem C++, com a segurança de uma linguagem como SmallTalk.
Java básico 1 11
Figura 3.1 – Estrutura da linguagem Java.
12 Java básico 1
Figura 3.2 – Especificação da JVM Java.
Coleta de Lixo
A coleta de lixo é realizada automaticamente através de uma thread de segundo plano sendo
executada no sistema operacional através da JVM específica desta plataforma de hardware. Nela
os endereços de memória com referência 0 (zero) são removidos. Esta remoção ocorre durante
o tempo de vida do programa em execução e tem como objetivo eliminar o vazamento de
endereços de memória.
Segurança de Código
A segurança de código em Java e obtida através do processo de compilação e de verificação e
execução de bytecodes.
Java básico 1 13
Figura 3.3 – Segurança de código em Java.
Primeiro Programa
Segue um programa simples em Java:
A primeira coisa a ser observada é que Java é case sensitive, isto é, diferencia entre caracteres
maiúsculos e minúsculos.
Analisando o programa acima, a palavra chave public é chamada modificador de acesso. Esses
modificadores controlam o que outras partes do programa podem usar desse código. A outra
palavra chave class diz que tudo está dentro de uma classe, como tudo em Java, e essa classe
têm o nome de PrimeiroPrograma. Existe uma convenção para que os nomes das classes
comecem sempre com letra maiúscula.
É necessário que o nome do arquivo tenha o mesmo nome da classe pública, nesse caso
[Link]. Novamente não se pode trocar letras maiúsculas por minúsculas.
14 Java básico 1
Figura 3.4 – Código-fonte em Java.
Ao ser compilado (javac NomeDaClasse) esse código gera um arquivo de bytecodes que é
renomeado para .class. Para executar, basta dar o seguinte comando: java NomeDaClasse.
Note que para executar o programa Java não é necessário informar a extensão .class. A
execução começa com o código contigo na função main, portanto sendo necessária sua
presença. Os blocos de comandos são delimitados por chaves ({ e }), assim como C/C++ e PHP.
O mais importante aqui é que todo programa em Java deve ter um método main com o
cabeçalho apresentado na classe PrimeiroExemplo.
Dentro do método, existe uma linha de comando, terminada com ponto e vírgula (;). Todos os
comandos terminam com esse sinalizador. Nessa linha, está sendo usado o objeto [Link]
e sendo executado o método println, que simplesmente imprime umo conjunto de caracteres
desejado na tela do computador. A forma geral de chamada de métodos de objetos em Java é:
[Link].(parametros);. Se o método não possui parâmetros, usam-se parênteses vazios.
Java básico 1 15
Alguns cuidados ao escrever e executar programas Java
Muitos erros podem ocorrer no momento que você rodar seu primeiro programa escrito em
Java. Vamos ver alguns deles:
Código:
Erro:
1 error
Esse é o erro de compilação mais comum. Lembre de que uma linha de comando em Java deverá
terminar com o ponto e vírgula “;”. Repare que o compilador é explícito em dizer que a linha 3
esta com problemas. Outros erros de compilação podem ocorrer se você escrever de forma
equivocada alguma palavra chave (que indicam comandos da linguagem), se esquecer de abrir e
fechar chaves {}, dentre outros.
- Se você declarar a classe Exemplo (primeira letra maiúscula), compilá-la e depois tentar usá-la
como e minúsculo (java exemplo), o Java te avisa:
- Se tentar acessar uma classe no diretório ou classpath errado, ou se o nome estiver errado,
ocorrerá o seguinte erro:
Comentários
Os comentários podem ser ou de uma linha (//) ou de várias linhas (/* e */). Por Exemplo:
16 Java básico 1
/* Aqui sera impresso uma linha de texto na
tela: Hello World!!!
*/
[Link](“Hello World!!!”);
/**
* @(#)[Link]
*
*
* @author Paulo Henrique Cayres
* @version 1.00 2010/3/2
*/
Java básico 1 17
Como resultado o javadoc irá gerar arquivos html com a estrutura de classes presente nos
pacotes de classes do projeto em desenvolvimento. A figura seguinte apresenta o resultado da
documentação de uma classe após a execução do javadoc.
2. Crie uma classe executável Java para imprimir duas linhas de texto usando duas linhas de código
[Link].
18 Java básico 1
Variáveis
Em Java é necessária a declaração de variáveis para que possa usá-las. Eis alguns exemplos:
byte b;
int umaVariavelInteira;
long umaVariavelLong;
char ch;
Deve-se prestar atenção ao ponto e vírgula no final das declarações, porque são comandos
completos em Java.
Letras: ‘A’ – ‘Z’, ‘a’ – ‘z’, ‘_’ e qualquer caractere Unicode que denote uma letra
em um idioma, por exemplo, em Alemão pode-se usar ‘ä’ nos nomes de variáveis, ou em
grego. Apesar de em português se poder usar as vogais acentuadas ou cedilha, não é
aconselhável, caso se abra o programa em outro sistema operacional, que pode gerar algum
tipo de confusão;
Dígitos: ‘0’ – ‘9’ e qualquer caractere Unicode que denote um dígito em uma linguagem;
Não se pode utilizar uma palavra reservada (como if, switch, etc).
Tipos de Dados
Java é fortemente tipada, o que significa que cada variável precisa ter seu tipo declarado para
que possa ser usada. Há oito tipos primitivos. Seis numéricos (4 inteiros e 2 de ponto flutuante),
um é o tipo char usado para caracteres no formato Unicode, e o outro é boolean para valores
verdadeiro ou falso. Não existe nenhum tipo de dados equivalente ao Variant, que armazena
qualquer tipo de dados básicos. Outros tipos mais elaborados, como String, não são tipos
básicos e são objetos em Java.
Java básico 1 19
Inteiros
São números sem parte fracionária. Veja a tabela a seguir:
A parte mais interessante dos tipos em Java é que eles não dependem de plataforma, isto é, um
valor int sempre terá 4 bytes, seja em Windows, seja em SPARC.
Ponto Flutuante
Os números de ponto flutuante denotam números com partes fracionárias. Há dois tipos:
Esses números seguem o formato IEEE 754. O tipo float é chamado de precisão simples. E o
double de precisão dupla.
‘H’ : caractere H
Em Java, o tipo caractere é representado em Unicode. Normalmente não se precisa saber como
funciona o Unicode, exceto se for necessário escrever aplicativos internacionais. Isto é, o
Unicode foi desenvolvido para poder representar todos os caracteres de todos os idiomas
possíveis do planeta. Para isso possui 2 bytes, sendo assim, permitindo representar até 65536
caracteres, mas atualmente cerca de 35000 somente estão sendo usados.
20 Java básico 1
Os caracteres Unicode seguem uma codificação em hexadecimal que vai de ‘\u0000’ a
‘\uffff’, sendo os caracteres de ‘\u0000’ até ‘\u00ff’ os caracteres ASCII já conhecidos.
O prefixo \u significa a codificação Unicode. Além dessa codificação, existe um conjunto de
caracteres de controle válidos, conforme apresentado na tabela a seguir:
\b Backspace \u0008
\t Tabulação \u0009
\n Linefeed \u000A
\b Backspace \u0008
Em Java, valores do tipo char não são números, então sua conversão necessita uma conversão
explícita de tipos.
Tipo boolean
O tipo lógico boolean tem dois valores: falso (false) e verdadeiro (true). É utilizado em
testes lógicos.
Atribuições e Inicializações
Depois da declaração deve-se inicializar as variáveis. Não se deve ter variáveis não inicializadas,
e o compilador geralmente avisa quando uma variável não foi inicializada.
Uma inicialização pode ser feita ou na hora da declaração ou depois, usando-se o nome da
variável seguido do sinal de igual (=) e depois seguido do valor da inicialização. Por exemplo:
int teste;
char ch;
long i = 0;
teste = 10;
ch = ‘S’;
Outro ponto importante é que se pode declarar variáveis em qualquer lugar no código, mas cada
variável (identificada por seu nome) somente uma vez em cada trecho.
Java básico 1 21
Conversões entre Tipos Numéricos
Quaisquer operações em valores numéricos de tipos diferentes são aceitáveis e tratadas da
seguinte maneira:
Se qualquer um dos operandos for do tipo double então o outro será convertido para
double;
Caso contrário, se qualquer um dos operandos for float, o outro será convertido para
float;
Caso contrário, se qualquer um dos operando for long, o outro será convertido para long.
double x = 9.997;
int nx = (int) x;
Com isso a variável terá o valor 9, pois a conversão de um valor de ponto flutuante para um
inteiro descarta a parte fracionária (e não é arredondado, como em VB). Quando se quer
arredondar (round) um número fracionário para o inteiro mais próximo, usa-se [Link]:
double x = 9.997;
int nx = (int) [Link](x);
Outro ponto importante é que não se pode converter tipos boolean para outros tipos
numéricos.
Constantes
Para se definir uma constante em Java, usa-se a palavra chave final:
A palavra chave final significa que a variável só pode receber valor uma vez, e fica definido
para sempre. É costume dar nomes totalmente em maiúsculas para constantes.
22 Java básico 1
O mais comum em Java é declarar uma constante e fazer com que ela fique disponível para
vários métodos dentro de uma classe. São geralmente chamadas de constantes de classe. Pode-
se defini-las através das palavras-chave static final.
public UsaConstante2 {
public static final double G = 9.81;
public static void main(String[] args) {
[Link](G + “ metros por Segundo ao quadrado.”);
}
}
Operadores
Segue uma tabela com os operadores aritméticos:
+ Soma x = 5 + 10;
- Subtração x = 5 – 10;
* Multiplicação x = 5 * 10;
Java básico 1 23
Operador Significado Exemplo
x = (y==10) ? 0 : 1; // se
?: Condicional ternário y==10, x recebe 0, senão
recebe 1
24 Java básico 1
Operador Significado Exemplo
Tipo String
Strings são sequências de caracteres, como “ola”. O Java não possui um tipo nativo para o
tratamento de strings, ao invés, possui uma classe pré-definida, chamada String. Cada string
entre aspas é uma instância da classe String.
Concatenação
A linguagem Java permite que o sinal de + seja o operador para concatenação de strings.
Ao concatenar uma string com um valor que não é uma string, este é convertido para string
automaticamente:
Substrings
Para se extrair uma substring de uma string, usa-se o método substring da classe String:
Esse código cria uma string (s) que possui os caracteres “Bem”. No comando substring acima, o
primeiro parâmetro é o primeiro caractere a ser copiado (o primeiro caractere de uma string
está na posição 0) e o segundo parâmetro é o índice do primeiro caractere que não se quer
copiar. No exemplo, o caractere na posição 3 é o ‘-‘.
Java básico 1 25
Tamanho
O método length retorna o tamanho de uma string.
Teste de Igualdade
Para testar a igualdade de duas strings, usa-se o método equals. Por exemplo:
[Link](t)
Retorna true se as strings s e t forem iguais e false caso contrário. Outra construção válida
é:
“Ola”.equals(comando)
Para testar se as strings são idênticas, sem levar em conta a diferenciação entre maiúsculas e
minúsculas usa-se:
“Ola”.equalsIgnoreCase(“ola”)
Não use o operador == para teste de igualdade, pois ele só compara se duas strings estão no
mesmo local. E claro, se elas estiverem no mesmo local são idênticas.
if ([Link](“Ola”) == 0) ...
O Java possibilita o uso do console (uma janela DOS, por exemplo) ou o uso de interface gráfica
(caixas de diálogos na plataforma Windows, por exemplo) para manipulação de dados.
Por exemplo, podemos lançar mão da classe Scanner para disponibilizar um canal de entrada de
dados via console ou utilizarmos a classe JOptionPane para possibilitar a entrada de dados com
o uso de ambiente visual gráfico. Outra classe muito útil neste processo é a System que nos
possibilita um canal direto para os consoles padrão de entrada (teclado) e saída (tela do
computador). Por exemplo, podemos utilizar [Link] para obter os dados que estão sendo
digitados no teclado e [Link] para enviarmos uma mensagem para a tela do
computador. Estas classes foram desenvolvidas para possibilitar interação entre o usuário e o
programa que o mesmo necessita utilizar. O código Java a seguir ilustra o uso da classe Scanner
e JOptionPane para possibilitar a entra e saída de dados em modo texto ou visual gráfico.
26 Java básico 1
String frase = [Link]();
[Link](frase);
int i = [Link]();
[Link](i);
Quais são as três principais funcionalidades que um programa deve apresentar para possibilitar
a manipulação e geração de informações tendo como base um conjunto de dados fornecidos?
Java básico 1 27
2. Faça uma classe executável que dados a distância percorrida (em Km) e o tempo gasto em uma
viagem (em horas) e calcule e informe a velocidade média do carro, sabendo que Velocidade = S /
T (variação de distância / variação do tempo).
3. Faça uma classe executável que dado o salário de um funcionário, informe o valor de imposto de
renda a ser pago, sabendo que o imposto equivale a 5% do salário.
2. Faça uma classe executável que dado o valor de um produto, informe o novo valor de venda
sabendo-se que este sofreu um aumento de 25%.
3. Faça uma classe executável que dados o peso atual de uma pessoa e o peso desejado após processo
de emagrecimento, informe o percentual do peso que deverá ser eliminado.
4. Faça uma classe executável que dados a quantidade de fitas que uma vídeo locadora possui e o
valor que ela cobra por cada aluguel, informe:
Sabendo que um terço das fitas são alugadas por mês, o seu faturamento anual.
Sabendo que quando o cliente atrasa a entrega, é cobrada uma multa de 10% sobre o
valor do aluguel e que um décimo das fitas alugadas no mês são devolvidas com atraso, o
valor ganho com multas por mês.
28 Java básico 1
4
Controle de Fluxo
Exercício de nivelamento 4 – Controle de Fluxo
Você poderia fazer uma breve descrição de como toma decisões para solucionar problemas do
seu dia a dia?
Como você imagina que os computadores tomam decisões para solucionar nossos problemas do
dia a dia?
Cite alguns problemas de que você necessita do auxílio do computador para solucionar.
Java básico 1 29
Pode-se inclusive aninhar blocos, isto é, blocos dentro de blocos. A restrição é que não se pode
declarar variáveis com mesmo nome dentro de blocos aninhados. Exemplo:
Estruturas de Decisão
Também chamadas de estruturas condicionais, os comandos de seleção permitem executar
instruções ou blocos de comandos com base em testes lógicos feitos durante a execução de um
programa.
Comando if
O mais trivial das estruturas condicionais é o if. Ele testa uma determinada condição e executa
o bloco de comandos indicado se o resultado da análise de uma condicação for true. O
comando if possui a seguinte sintaxe:
if (expressão)
comando;
if (expressão) {
comando_1;
...
comando_n;
}
if (expressão)
comando_1;
else
comando_2;
ou:
if (expressão)
30 Java básico 1
comando;
else {
comando;
...
comando;
}
int a, b, maior;
...
if (a > b)
maior = a;
else
maior = b;
O exemplo acima armazena na variável maior o maior valor entre a e b. Devido a um processo
interno do Java o seguinte código:
Comando switch
O comando switch atua de maneira semelhante a uma série de comandos if na mesma
expressão. Frequentemente o programador pode querer comparar uma variável com diversos
valores, e executar um código diferente a depender de qual valor é igual ao da variável. Quando
isso for necessário, deve-se usar o comando switch. O exemplo seguinte mostra dois trechos
de código que fazem a mesma coisa, sendo que o primeiro utiliza uma série de if’s e o segundo
utiliza switch:
if (i == 0)
[Link]("i é igual a zero");
else if (i == 1)
[Link]("i é igual a um");
else if (i == 2)
[Link]("i é igual a dois");
switch (i) {
case 0:
[Link]("i é igual a zero");
break;
case 1:
[Link]("i é igual a um");
break;
case 2:
[Link]("i é igual a dois");
break;
Java básico 1 31
default:
[Link]("i diferente de tudo");
break;
}
A cláusula default serve para tratar valores que não estão em nenhum case. É opcional.
switch (i) {
case 0:
[Link]("i é igual a zero");
case 1:
[Link]("i é igual a um");
case 2:
[Link]("i é igual a dois");
}
2. Crie uma classe executável Java que receba dois números e execute as operações listadas abaixo
de acordo com a escolha do usuário.
Se a opção digitada for inválida, mostrar uma mensagem de erro e terminar a execução do
programa. Lembre-se que na operação 4 o segundo número deve ser diferente de zero.
3. Uma empresa decide dar um aumento de 30% aos funcionários com salários inferiores a R$
500,00. Crie uma classe executável Java que receba o salário do funcionário e mostre o valor do
salário reajustado ou uma mensagem caso o funcionário não tenha direito ao aumento.
32 Java básico 1
Estruturas de Repetição
Definição
Estruturas de repetição são estruturas que repetem um bloco de instruções até que uma
condição de parada especificada seja satisfeita. No Java, trabalharemos com as seguintes
estruturas:
while
do … while
for
Comando while
O while é o comando de repetição (laço) mais simples. Ele testa uma condição lógica e executa
um comando, ou um bloco de comandos, até que a condição testada seja falsa. Sintaxe:
while (<expressao>)
<comando>;
while (<expressao>) {
comando_1;
...
comando_n;
}
A expressão só é testada a cada vez que o bloco de instruções termina, além do teste inicial. Se o
valor da expressão passar a ser false no meio do bloco de instruções, a execução segue até o
final do bloco. Se no teste inicial a condição for avaliada como false, o bloco de comandos não
será executado.
Java básico 1 33
i = 1;
while (i <=10)
[Link](i++);
do {
comando_1
...
comando_n
} while (<expressao>);
O exemplo utilizado para ilustrar o uso do while pode ser feito da seguinte maneira utilizando
o do...while:
i = 0;
do {
[Link](++i);
} while (i < 10);
Comando for
O tipo de laço mais complexo é o for. Para os que programam em C, C++, a assimilação do
funcionamento do for é natural. Mas para aqueles que estão acostumados a linguagens como
Pascal, há uma grande mudança para o uso do for. As duas sintaxes permitidas são:
Condição: Expressão booleana que define se os comandos que estão dentro do laço serão
executados ou não. Enquanto a expressão for verdadeira (valor diferente de zero) os
comandos serão executados;
34 Java básico 1
<inicializacao>
while (<condicao>) {
comandos
...
<incremento>
}
Exemplo:
Quebra de fluxo
Os comandos de quebra de fluxo servem para sair dos laços incondicionalmente, ou para
executar o próximo passo.
Comando Break
O comando break pode ser utilizado em laços do, for e while, além do uso já visto no
comando switch. Ao encontrar um break dentro de um desses laços, o interpretador Java
para imediatamente a execução do laço, seguindo normalmente o fluxo do código:
while (x > 0) {
...
if (x == 20) {
[Link]("erro! x = 20");
break;
}
...
}
No trecho de código acima, o laço while tem uma condição para seu término normal (x <=
0), mas foi utilizado o break para o caso de um término não previsto no início do laço. Assim o
interpretador seguirá para o comando seguinte ao laço.
Existe outra modalidade de break que é o break rotulado. Eles são usados quando se necessita
sair de blocos aninhados e não se quer inserir um monte de condições de saída, em cada um dos
níveis dos laços. Por exemplo:
int n;
ler_dados:
while (...) {
for (...) {
n = [Link](...);
if (n < 0) // nunca deveria ocorrer
break ler_dados;
...
}
Java básico 1 35
}
// verifica se a entrada de dados foi bem sucedida
if (n<0) {
// situação inválida
}
else {
// entrada de dados normal
}
Comando continue
O comando continue também deve ser utilizado no interior de laços, e funciona de maneira
semelhante ao break, com a diferença que o fluxo ao invés de sair do laço volta para o início
dele, executando a próxima iteração. Vejamos o exemplo:
O exemplo acima é uma maneira ineficiente de imprimir os números pares entre 0 e 99. O que o
laço faz é testar se o resto da divisão entre o número e 2 é 0. Se for diferente de zero (valor
lógico true) o interpretador encontrará um continue, que faz com que os comandos
seguintes do interior do laço sejam ignorados, seguindo para a próxima iteração. Pode-se usar o
comando continue dentro de laços for, while e do...while.
Comando return
O comando return é usado para sair do método corrente, e também para retornar valores de
métodos que têm retorno. Exemplo:
return ++cont;
return;
36 Java básico 1
Exercícios de Fixação 6 – Controle de fluxo
Liste os recursos de programação utilizados para implementar estruturas para tomada de
decisão e de repetição de bloco de comandos disponíveis na linguagem de programação Java.
2. Faça uma classe executável que calcule e imprima a média do somatório dos números inteiros
existentes entre 500 e 700.
3. Faça uma classe executável que dado um número inteiro, calcule e imprima o seu fatorial. O
fatorial de um número n é n * n-1 * n-2 ... até n = 1. Por exemplo, o fatorial de 4 é 24 ( 4 * 3 * 2 * 1).
2. Faça uma classe executável que calcule e imprima o somatório dos números impares existentes em
300 e 700.
3. Faça uma classe executável que dado um número, informe se ele é divisível por 5.
4. Uma prefeitura abriu uma linha de crédito para seus funcionários. O valor máximo da prestação
não poderá ultrapassar 25% do salário bruto. Faça uma classe executável que dados o valor do salário
bruto e o valor da prestação, informe se o empréstimo pode ou não ser concedido.
Java básico 1 37
5. Faça uma classe executável que dados os limites de um intervalo [a; b], informe a soma de todos
os números naturais neste intervalo. Exemplo: [4, 7] => 4+5+6+7=22.
38 Java básico 1
5
Arrays
Exercício de nivelamento 6 – Arrays
No início do capítulo anterior você pensou numa solução para resolver o problema de
implementar um programa para ler e imprimir notas de 5000 alunos. Agora necessitamos da
mesma solução sendo que todas as notas lidas devem ser armazenadas na memória do
computador. Que solução você apresentaria para solucionar este problema com os recursos que
você aprendeu até agora?
Definição
Um array é uma variável composta homogênea unidimensional formada por uma sequência de
valores, todas do mesmo tipo, com o mesmo identificador (mesmo nome) e alocadas
sequencialmente na memória. Uma vez que os valores são alocados sequencialmente e tem o
mesmo nome, a forma utilizada para acessá-los e através de um índice, que referencia a
localização de um valor dentro da estrutura onde ele está armazenado.
Arrays são objetos em Java que possibilitam o armazenamento de dados primitivos. Arrays
servem para manipular uma grande quantidade de dados sem que se precise declarar várias
variáveis do mesmo tipo.
Um array é uma estrutura de dados que armazena um conjunto de valores de mesmo tipo. Você
acessa cada valor individual através de um índice inteiro. Por exemplo, se x é um array de
inteiros, então x[i] é o i-ésimo inteiro no array.
Java básico 1 39
Figura 5.1 – Representação de array na memória do computador.
Você declara uma variável de array especificando o tipo primitivo de dados que ele armazenará
seguido de [] (abre e fecha colchetes) e o nome da variável do tipo array. Por exemplo, a
representa a declaração de um array de inteiros:
int[] a;
Entretanto, essa instrução apenas declara a variável a como sendo um array. Ela ainda não foi
inicializa como um array, não sendo possível, ainda, armazenar valores em a. O operador new é
utilizado para criar o array na memória do computador. Utilize a instrução abaixo para informar
o total de endereços de memória que serão referenciados pelo identificador a.
Essa instrução configura um array que pode conter no máximo 100 números inteiros. As
entradas do array são numeradas de 0 a 99 (e não de 1 a 100). Uma vez que o array foi criado,
você pode preencher suas entradas (endereços de memória) usando, por exemplo, uma
estrutura de repetição:
Atenção: Se você construir um array com 100 elementos e depois tentar acessar o elemento
a[100] (ou qualquer outro índice fora do intervalo 0 . . . 99), o seu programa terminará com uma
exceção “array index out of bounds” que indica que você esta tentando acessar um endereço de
memória que não pode ser referenciado pela variável a.
Você pode utilizar o Para encontrar o número de elementos de um array, use [Link].
Por exemplo,
[Link](a[i]);
40 Java básico 1
Uma vez que você crie um array, você não poderá mudar seu tamanho, embora você possa, é
claro, mudar um elemento específico do array.
int[] a;
ou como:
int a[];
A maioria dos programadores Java prefere o primeiro estilo, pois ele separa corretamente o tipo
int[] (array de inteiros) do nome da variável.
Vale lembrar que já tivemos um exemplo de array em Java, na clássica função main(String[]
args). Esse array referencia um conjunto de strings, que são os parâmetros passados para um
programa na linha de comando quanto iniciamos sua chamada para ser executada.
Arrays são o primeiro exemplo de objetos cuja criação o programador precisa lidar
explicitamente, usando o operador new.
A linha de comando acima define um array de inteiros de 100 elementos, indexados de 0 a 99.
Uma vez criado, pode-se preencher esse array da seguinte forma:
Nesse caso não se usa o comando new que cria um array de inteiros e preenche com os dados
dentro das chaves. Isso é usado quando se quer passar um array como parâmetro e não se quer
criar uma variável para isso, por exemplo:
Java básico 1 41
Cópia de Arrays
Pode-se copiar uma variável de array em outra, fazendo com que as duas variáveis façam
referência ao mesmo array.
Nesse exemplo os dois arrays irão acessar os mesmos elementos. Caso se queira realmente
copiar os elementos de um para o outro, fazendo com que os elementos sejam duplicados, usa-
se o método arraycopy da classe System. A sintaxe é:
Arrays Multidimensionais
Arrays multidimensionais, ou matrizes, para simplificar, são fáceis de declarar:
int[][] Tabuleiro;
Tabuleiro[3][2] = 10;
Nota-se que a sintaxe e manipulação dos elementos é muito similar à usada em outras
linguagens de programação. Mas um aspecto deve ser visto com calma. Os arrays
multidimensionais são implementados com arrays de arrays.
42 Java básico 1
Exercícios de Fixação 7 – Arrays
Você poderia descrever os ganhos e limitações que temos quanto implementamos programas
utilizando array?
Você acredita que arrays facilitam o desenvolvimento de programas que manipulam grandes
volumes de dados? Justifique sua resposta.
Atividade 1 – Arrays
1. Faça uma classe executável que dado um conjunto de 20 elementos numéricos, informe a soma de
todos os números pares.
2. Faça uma classe executável que dado um conjunto com a idade de 50 pessoas, informe a
percentual em cada faixa etária: de 0 a 15 anos, de 16 a 30 anos, de 31 a 45 anos, de 46 a 60 anos e
mais que 60 anos.
3. Faça uma classe executável que receba por meio da linha de comando do programa (prompt) um
número natural (de 1 a 10) e informe a sua tabuada.
Java básico 1 43
2. Faça uma classe executável que leia uma matriz quadrada de ordem 4x4 e forneça as seguintes
informações:
44 Java básico 1
6
Classes Especializadas
Exercício de nivelamento 7 – Classes Especializadas
Listar padrões de formatação de informações que você consegue identificar no seu dia a dia?
Você conhece padrões de formatação que são diferentes entre continentes ou países?
Wrappers de Objetos
Ocasionalmente é necessário converter um tipo básico como int, para um objeto. Todos os
tipos básicos têm correspondentes de classe. Por exemplo, existe um correspondente da classe
Integer para o tipo básico int. Esses tipos de classes são normalmente chamadas de
wrappers de objeto. As classes wrapper têm nomes óbvios: Integer, Long, Float,
Double, Short, Byte, Character, Void e Boolean. As seis primeiras herdam do
wrapper comum Number. As classes wrapper são final. Portanto, você não pode sobrepor o
método toString em Integer, para exibir números usando algarismos romanos, por
exemplo. Você também não pode alterar os valores que armazena no wrapper de objeto
(HORSTMANN, 2003).
Para converter uma string em um inteiro, você precisa usar a instrução a seguir:
int x = [Link](s);
Analogamente, você pode usar o método [Link] para analisar números de ponto
flutuante. A tabela abaixo apresenta as classes wrappers e seus tipos de dado primitivo
correspondente.
Java básico 1 45
Tipo primitivo Classe wrapper Parâmetro para o construtor
Outro uso importante dos wrappers é ser um lugar interessante para agrupar funcionalidades
referentes ao tipo básico que ele empacota, como alguns tipos de conversões suportados pela
linguagem Java.
Date
A classe Date representa um instante específico no tempo, com precisão de milissegundos.
Embora a classe Date pretenda reproduzir o tempo universal coordenado (UTC), ela não o faz
exatamente. O processo de reprodução é dependente do ambiente onde a máquina virtual Java
esta hospedado. Quase todos os sistemas operacionais modernos assumem que 1 (um) dia é
igual a 86400 segundos (24 horas × 60 minutos × 60 segundos). No UTC, no entanto, cerca de
uma vez a cada ano ou dois, há um segundo extra, chamada de "segundo bissexto". O saldo de
um segundo sempre é adicionado como o último segundo do dia, e sempre em 31 de dezembro
ou 30 de junho de um determinado ano. Por exemplo, o último minuto do ano de 1995 foi de 61
segundos de duração, graças ao salto de um segundo. A maioria dos relógios de computadores
não é precisa o suficiente para ser capaz de acrescentar o salto de segundo previsto no UTC.
Em todos os métodos da classe Date que aceitar ou voltar ano, mês, dia, hora, minuto, segundo e
os valores, as representações seguintes são utilizados:
46 Java básico 1
Um mês é representado por um número inteiro de 0 a 11; 0 é de Janeiro, 1 é de Fevereiro, e
assim por diante, assim é 11 de Dezembro.
Uma hora é representada por um número inteiro de 0 a 23. Assim, a hora a partir de meia-
noite às 01:00 horas é 0, e na hora do meio-dia às 01:00 é de 12 horas.
DateFormat
DateFormat é uma classe abstrata para formatação de data/hora. Subclasses de formatação de
data/hora, como SimpleDateFormat, permite a formatação (de data para texto), análise (de
texto para data), dentre outras funcionalidades. A data é representada como um objeto Date ou
como os milissegundos desde 1º de Janeiro de 1970, 00:00:00 GMT.
DateFormat ajuda a formatar e analisar as datas para qualquer localidade. Seu código pode ser
completamente independente das convenções de localização de meses, dias da semana, ou até
mesmo o formato do calendário: lunar versus solar.
Para formatar uma data para a localidade atual, use um dos métodos de fábrica estáticos:
myString = [Link]().format(myDate).;
Se você estiver formatando várias datas, o mais eficiente para obter o formato e usá-lo várias
vezes para que o sistema não tenha que buscar as informações sobre o idioma local e
convenções do país várias vezes.
DateFormat df = [Link]();
Utilize a chamada para o método getDataInstance para formatar uma data para uma localidade
diferente.
Você pode usar um DateFormat para converter uma string em data também.
Java básico 1 47
myDate = [Link] (myString);
Use getDateInstance para obter o formato da data para uma determinada localidade. Existem
outros métodos disponíveis que podem ser utilizados. Por exemplo, use getTimeInstance para
obter o formato de tempo de um determinado país. Use getDateTimeInstance para obter um
formato de data e hora. Você pode passar em opções diferentes para estes métodos de fábrica
para controlar o comprimento do resultado; de curto a médio e longo para FULL. O resultado
exato depende da localidade, mas em geral:
Calendar
Calendar é uma classe abstrata de base para a conversão entre um objeto Date e um conjunto de
campos inteiros, tais como ano, mês, dia, hora, e assim por diante. Um objeto Date representa
um momento específico no tempo com precisão de milissegundos.
A classe Calendar utiliza o método getInstance(), para obter um objeto. O método getInstance()
de Calendar retorna um objeto Calendar com campos inicializados com a data e hora atual:
Um objeto Calendar pode produzir todos os valores de um instante na linha do tempo em sesu
campos, necessários para implementar a formatação de data e hora para um determinado
idioma e estilo de calendário, como, por exemplo, japonês-gregoriano, japonês tradicional.
Calendar define o intervalo de valores devolvidos por certos campos, bem como o seu
significado. Por exemplo, o primeiro mês do ano tem o valor para o campo MONTH igual a
janeiro para todos os calendários.
NumberFormat
NumberFormat é a classe base abstrata para todos os formatos de número. Essa classe fornece a
interface para formatação e análise de números. NumberFormat também fornece métodos para
determinar quais locais têm formatos de números.
NumberFormat ajuda a formatar e analisar os números para qualquer localidade (Locale). Seu
código pode ser completamente independente das convenções Locale para pontos decimais,
milhares-separadores, ou até mesmo para a particularidade do uso de dígitos decimais, ou se o
formato do número esta na base decimal.
48 Java básico 1
Para formatar um número para o Locale atual, use um dos métodos de classe:
myString = [Link]().format(myNumber);
Para formatar um número para uma localidade diferente, especificá-lo na chamada para
getInstance.
NumberFormat nf = [Link]([Link]);
myNumber = [Link](myString);
DecimalFormat
DecimalFormat é uma subclasse concreta de NumberFormat utilizada para formatar números
com casas decimais. Ela tem uma variedade de características projetadas para tornar possível a
analise e formatação de números em qualquer localidade (Locale), incluindo suporte para o
idioma árabe e dígitos sânscritos (língua antiga utilizada na Índia). Ele também suporta
diferentes tipos de números, incluindo inteiros (123), de ponto fixo números (123,4), notação
científica (1.23E4), porcentagens (12%), e quantidade monetária (R$ 123).
Para obter um NumberFormat para uma localidade específica, incluindo a localidade padrão
definida no sistema operaiconal, chame um dos métodos da classe NumberFormat, tal como
getInstance(). Em geral, não chame os construtores DecimalFormat diretamente, já que os
métodos de NumberFormat pode retornar outras subclasses de DecimalFormat.
0 Dígito
- Sinal de menos
, Separador de agrupamento
Java básico 1 49
Symbol Significado
Math
A classe Math contém uma variedade de funções matemáticas que você pode precisar
ocasionalmente, dependendo do tipo de programação que realize.
double x = 4;
double y = [Link](x);
A linguagem de programação Java não tem nenhum operador para elevar uma quantidade a uma
potência: você deve usar o método pow da classe Math. A instrução
Configura y como sendo x elevado à potência a (xa). O método pow tem parâmetros que são de
tipo double e também retorna um valor double.
50 Java básico 1
Exercícios de Fixação 8 – Classes Especializadas
Para que servem as classes especializadas?
b. A quantidade de vogais que aparecem e qual o percentual em relação aos caracteres digitados.
2. Faça uma classe executável que dada uma string, construa outra string substituindo a letra S por $,
E por 3, A por 4, G por 6, B por 8, O por * U por #.
3. Faça uma classe executável que verifique se uma cadeia de caracteres é um palíndromo. Uma
cadeia de caracteres é um palíndromo se a inversão da ordem de seus caracteres resulta na mesma
cadeia. Suponha que todas as letras da cadeia estejam em letras minúsculas. Exemplos: ovo, 1991,
amor me ama em roma.
2. Faça uma classe executável que informe uma das mensagens a seguir, de acordo com a hora do
sistema. – 0h até 5:59h, “Boa madrugada” – 6h até 11:59h, “Bom dia” – 12h até 17:59h, “Boa tarde” e
das 18h até 23:59h, “Boa noite”.
3. Faça uma classe executável que dado a data de nascimento de uma pessoa (dia, mês e ano),
informe quantos anos ela tem.
Java básico 1 51
4. Faça uma classe executável que dado a data de vencimento de uma fatura (dia, mês, ano) que já
venceu (fatura em atraso) e seu valor, informe o número de dias em atraso, considerando a data atual
para pagamento, e também o novo valor a pagar, considerando 0,5% de juros por dia de atraso.
e. Se o valor encontrado for 10 ou 11, o dígito verificador será 0; nos outros casos, o dígito
verificador é o próprio valor encontrado.
Faça uma classe executável que leia uma string representando o número seguido de seu
respectivo dígito verificador e informe se o número está correto.
52 Java básico 1
7
Classes e Objetos
Exercício de nivelamento 8 – Classes e Objetos
Você poderia fazer uma breve descrição sobre o que você entende por objetos do mundo real?
Cite alguns objetos que você consegue identificar dentro da sala de treinamento.
Um programa é feito de objetos com certas propriedades e operações que os objetos podem
executar. O estado atual, ou seu interior pode variar, mas deve-se tomar cuidado para que os
objetos não interajam de forma não documentada. Na POO você só se preocupa com o que o
objeto expõe.
A POO inverte a maneira de pensar dos antigos programadores, que sempre pensavam primeiro
nos algoritmos e depois nas estruturas de dados. Agora, as estruturas são mais importantes e
depois sua manipulação.
Em particular, um objeto nunca deveria manipular diretamente dados internos de outro objeto.
Isso é chamado de Encapsulamento (também diz respeito ao ocultamento da implementação de
alguma tarefa, sendo essa somente visível através da sua interface, o método que a dispara).
Toda comunicação deve ser através de mensagens, ou seja, chamada de métodos. Com isso,
obtêm-se um alto grau de reusabilidade e pouca dependência entre os objetos.
Java básico 1 53
Classes
Uma classe é um conjunto de variáveis e funções relacionadas a essas variáveis. Uma vantagem
da utilização de programação orientada a objetos é poder usufruir o recurso de encapsulamento
de informação. Com o encapsulamento o usuário de uma classe não precisa saber como ela é
implementada, bastando para a utilização conhecer a interface, ou seja, os métodos disponíveis.
Uma classe é um tipo, e, portanto não pode ser atribuída a uma variável. Para definir uma classe,
deve-se utilizar a seguinte sintaxe:
Quando se cria um objeto a partir de uma classe, diz-se que foi criada uma instância da classe.
Exemplo:
Como visto, tudo em Java está dentro de classes. Então, existem disponíveis várias classes em
Java para realizar diversas tarefas, como por exemplo, formatação de números para o usuário.
Mas mesmo assim, quando se está desenvolvendo um sistema, o programador deve desenvolver
suas próprias classes, particulares, para realizar as tarefas próprias da aplicação que está
desenvolvendo.
Outro recurso da POO é poder criar classes através de outras. Isso é chamado Herança, e em Java
diz-se que uma classe estende a outra, quando ela herda seus dados e métodos. Todas as classes
em Java estendem a classe básica Object. Inicialmente a classe nova contém todos os métodos
e atributos da classe básica, e pode-se escolher por manter ou modificar esses objetos, e
adicionar outros novos.
Uso: mais genérica e mais óbvia, por exemplo, uma classe Pedido usa (precisa consultar)
uma classe Conta, para consulta de crédito;
Inclusão (tem-um): por exemplo, usando os pedidos, um objeto Pedido contém Itens;
Herança (é-um): denota especialização, por exemplo, uma classe Ranger será herdeira da
classe Automovel. A classe Ranger tem os mesmos métodos que a classe Automovel
(porque é um automóvel), e outros especializados para o caso da Ranger, que ele
representa.
54 Java básico 1
Objetos
Como foi dito anteriormente, classes são tipos, e não podem ser atribuídas a variáveis. Variáveis
do tipo de uma classe são chamadas de objetos, e devem ser criadas utilizando o operador new,
seguindo o exemplo abaixo:
Por exemplo:
Para se trabalhar em POO, deve-se saber identificar três características-chave dos objetos:
Todos os objetos, que são instâncias da mesma classe, têm uma semelhança no seu
comportamento que é revelado pelas mensagens que ele aceita.
Em seguida, cada objeto guarda informações sobre o que ele é no momento e como chegou a
isso. Isso é o que geralmente se chama de estado do objeto. O estado de um objeto pode mudar
com o tempo, mas não espontaneamente. Uma mudança de estado num objeto só pode ser
resultado de envio de mensagens, caso contrário, o encapsulamento estaria sendo violado.
Contudo somente o estado do objeto não descreve completamente o objeto, pois cada objeto
tem uma identidade distinta. Por exemplo, num sistema de processamento de encomendas, duas
encomendas são distintas, mesmo se pedirem a mesma coisa.
Na classe Estacionamento:
Java básico 1 55
Nesse caso, o objeto carro da classe carro está sendo passado como parâmetro para o
método estacionar do objeto estacionamento.
[Link](this);
Atributos
Atributos, ou propriedades, são os dados que fazem parte da classe. Para se manter o
encapsulamento, os atributos não devem ser visíveis (mas podem), e quando se quer permitir a
visualização ou alteração de um deles por outra parte do código, é recomendável que se use
métodos de acesso e modificação. Mesmo assim, deve-se tomar cuidado para não escrever um
método que retorna um objeto, que é atributo de outro. Pois assim se permitiria a manipulação
direta dos dados dentro de um objeto, por outro.
Essa visibilidade dos atributos é dada por modificadores de acesso, como em classes:
protected: só é visível na própria classe, nas classes que estendem dela e nas classes no
mesmo pacote.
Por exemplo:
// implementação errada
public ItemEvento getItem() {
return Item;
}
}
Acima, o método getItem foi implementado para prover a funcionalidade de alteração da data
do item dentro do evento. Não é recomendado porque dá acesso a um dado diretamente, que
está dentro da classe. Ao invés disso, prefere-se a seguinte implementação:
56 Java básico 1
}
public void alterarDataItem(Date d) {
...
}
}
Como visto, atributos podem ser de qualquer tipo no Java, inclusive outras classes.
Métodos
Métodos são as ações que um objeto provê como interface para o sistema. E não só isso, mas
também ações internas, não visíveis para outros objetos. Basicamente são funções, com
argumentos, retorno e visibilidade. A visibilidade pode ser public, private ou protected.
Um detalhe importante é que sempre, os atributos de uma classe, podem ser manipulados
através de um método dela, obviamente, sejam privados ou públicos.
Os métodos públicos definem a interface da classe, as ações que ela pode executar. Os métodos
privados fazem operações internas, que não devem estar disponíveis para os outros objetos. Por
exemplo:
O método privado dataValidaItem serve como validação interna e quando a classe foi
projetada não se tinha a intenção de torná-lo visível para os outros objetos, portanto, foi
implementado como private.
Getters e Setters
Como já vimos, o ideal é que sejam implementados métodos para disponibilizar acesso aos
valores de atributos dos objetos instanciados na aplicação em desenvolvimento. Uma pratica
bastante comum adotada é a criação de métodos de acesso, que possuem o prefixo get, e os
métodos modificadores, que possuem o prefixo set. Estes métodos nos possibilitam a
manutenção de acesso aos atributos privados, encapsulando-os e dando ao programador a
Java básico 1 57
flexibilidade de acessar ou alterar valores de acordo com a necessidade da aplicação em
desenvolvimento.
Sobrecarga
Em Java pode-se ter vários métodos com o mesmo nome. Isso é chamado sobrecarga.
Mas cada um dos métodos tem uma assinatura, que é o que os difere uns dos outros, junto com
seu nome. Sua assinatura é os parâmetros que ele espera receber. Por exemplo:
Construtores
Construtores são métodos especiais que servem para fazer a inicialização de um objeto recém
instanciado. Esses métodos são chamados toda vez que um objeto novo é construído, isto é,
através do operador new. Seu nome é o mesmo que o nome da classe. Por exemplo:
class Cliente {
public Cliente (String n) {
nome = n;
}
...
}
58 Java básico 1
Essa linha criará um objeto da classe Cliente e inicialmente chamará o construtor que recebe
um a String como parâmetro.
Existe sempre um construtor padrão que não recebe parâmetro nenhum. Deve-se lembrar que
os construtores também permitem sobrecarga.
Blocos de Inicialização
São trechos arbitrários de códigos para fazer a inicialização de um objeto recém instanciado.
Esses métodos são chamados toda vez que um objeto novo é construído. Por exemplo:
class Cliente {
public Cliente (String n) {
nome = n;
}
{ // bloco de inicialização
numConta = [Link]();
}
...
}
Esse mecanismo não é comum e não é necessário. Geralmente não é mais claro do que colocar a
inicialização dentro de um construtor. Entretanto, para a inicialização de variáveis estáticas, um
bloco estático pode ser útil, como será visto mais adiante.
Os atributos estáticos não mudam de uma instância para outra, de modo que podem ser vistos
como se pertencessem à classe. Da mesma forma, os métodos estáticos pertencem à classe e não
operam nenhum dado de instância, objeto. Isso significa que se pode usá-los sem criar nenhuma
instância.
Por exemplo, todos os métodos da classe Console são métodos estáticos, assim como todos os
métodos da classe Math, embutida na linguagem Java. Exemplo:
double x = [Link]();
double x = [Link](3, 0.1);
[Link]
[Link]
Pode-se ter campos e métodos tanto estático quanto não estáticos na mesma classe. As
chamadas gerais para métodos e atributos estáticos são:
[Link](parametros);
[Link];
Java básico 1 59
Um campo estático é inicializado ou fornecendo-se um valor inicial a ele ou usando um bloco de
inicialização estático:
ou
Um outro exemplo:
Como main é estática, não é necessário criar uma instância da classe a fim de chamá-la. Por
exemplo, se essa função main estivesse dentro da classe Hipotecar, para iniciar o
interpretador Java usa-se:
java Hipotecar
Então o interpretador simplesmente inicia o método main sem criar a classe Hipotecar. Por
isso, a função mais só pode acessar dados estáticos da classe. Na verdade, não é raro que a
função main crie um objeto de sua própria classe:
60 Java básico 1
Atividade 1 – Classes e Objetos
1. Defina a classe Empregado, contendo os atributos nome e salário. Crie os métodos construtor,
seletor e modificador (para cada atributo). Desenvolva as operações para:
a. Calcular e retornar o valor de imposto de renda a ser pago, sabendo que o imposto equivale a
5% do salário;
b. Faça um programa que crie um objeto da classe Empregado (leia o nome e o salário) e informe
o nome do funcionário juntamente com o imposto de renda a ser pago.
2. Defina uma classe Cliente, contendo os atributos: nome e total de despesas que a mesma teve num
restaurante. Crie os métodos construtor, seletor e modificador (para cada atributo). Desenvolva as
operações para:
a. Calcular e retornar o valor total a ser pago com gorjeta, considerando a taxa de 10%;
b. Faça um programa que crie um objeto da classe Cliente (leia o nome e o total de despesas) e
informe o nome do cliente e o valor a ser pago com gorjeta.
// Propriedade: cada lado de um triângulo é menor do que a soma dos outros dois lados
boolean ehEscaleno() // tem o comprimento de seus três lados diferentes.
Java básico 1 61
2. Defina uma classe Funcionário, contendo os atributos: nome, salário-base e nível do cargo (I, II ou
III). Crie os métodos construtor, seletor e modificador (para cada atributo). Desenvolva as operações
para:
a. Calcular o adicional por nível de cargo: não há para nível I, 10% para nível II e 15% para nível
III;
b. Calcular o desconto de Imposto de Renda sobre o salário-bruto: não há para salário-bruto até
1.499,99, 7,5% para salário-bruto até 1.999,99, 15% para salário-bruto até 2.999,99 e de 20% para
salário-bruto acima de 3.000,00;
c. Calcular o desconto de Previdência Social: 5% para salário-bruto até 999,99, 9% para salário-
bruto até 1.799,99 e de 11% para salário-bruto até 3.500,00. A partir de 3.500,00 é descontado o
teto, ou seja, 11% sobre 3.500,00 (que é 385,00).
d. Mostrar o contracheque: exibe o nome do funcionário, seu salário-base, adicional, IRRF, INSS
e o salário-líquido.
e. Faça um programa que crie um objeto da classe Funcionário (leia o nome, o salário-base e o
nível do cargo) e mostre seu contracheque.
3. Defina uma classe Produto, contendo os atributos: código, descrição, quantidade disponível e
quantidade mínima (os atributos de quantidade não podem ser negativos) e também o preço de venda.
Crie os métodos construtor, seletor e modificador (conforme necessário). Desenvolva as operações
para:
Faça um programa que crie um objeto da classe Produto (leia o código, a descrição e a
quantidade mínima desejada) e mostre o menu:
5 – Fim
62 Java básico 1
Exercícios de Fixação – Classes e Objetos
A proteção de atributos e métodos das classes, fazendo com que estas se comuniquem com o
meio externo através da visibilidade permitida, define o conceito de:
a. especialização
b. polimorfismo
c. encapsulamento
d. herança
e. agregação
Pacotes
A linguagem Java permite agrupar classes em uma coleção chamada pacote. Os pacotes são
convenientes para organizar seu trabalho e para separá-lo das bibliotecas de código fornecidas
por outros programadores.
A biblioteca Java padrão é distribuída em vários pacotes, incluindo [Link], [Link], [Link]
etc. Os pacotes Java padrão são exemplos de pacotes hierárquicos. Assim como você tem
subdiretórios aninhados em seu disco rígido, também pode organizar pacotes usando níveis de
aninhamento. Todos os pacotes Java padrão estão dentro das hierarquias de pacote java e javax.
O principal motivo para se usar pacotes é a garantia da exclusividade dos nomes de classe.
Suponha que dois programadores tenham a brilhante ideia de fornecer uma classe Empregado.
Desde que ambos coloquem suas classes em pacotes diferentes, não haverá conflito. Na verdade,
para garantir absolutamente um nome de pacote exclusivo, a Sun recomenda que você use o
nome de domínio na Internet de sua empresa (que se sabe que é exclusivo), escrito ao inverso.
Então, você usa subpacotes para diferentes projetos. Por exemplo, [Link] é um exemplo
de domínio na internet. Escrito na ordem inversa, ele se transforma no pacote [Link].
Esse pacote pode então ser ainda subdividido em subpacotes, como
[Link].
Usando pacotes
Uma classe pode usar todas as classes de seu próprio pacote e todas as classes públicas de
outros pacotes.
Você pode acessar as classes públicas de outro pacote, de duas maneiras. A primeira é
simplesmente adicionar o nome do pacote completo na frente de todo nome de classe. Por
exemplo:
Java básico 1 63
[Link] today = new [Link]();
Obviamente, isso é maçante. A estratégia mais simples e comum é usar a palavra-chave import.
O objetivo da instrução import é simplesmente fornecer um atalho para você fazer referência às
classes do pacote. Quando você usa import, não precisa mais fornecer às classes seus nomes
completos.
Você pode importar uma classe específica ou o pacote inteiro. Você coloca instruções import no
início de seus arquivos-fonte (mas abaixo de todas as instruções package). Por exemplo, você
pode importar todas as classes do pacote [Link] com a instrução:
import [Link].*;
Sem um prefixo de pacote. Você também pode importar uma classe específica dentro de um
pacote.
import [Link];
Importar todas as classes de um pacote é mais simples. Isso não tem nenhum efeito negativo
sobre o tamanho do código; portanto, geralmente não há razão para não usar.
Entretanto, note que você pode usar apenas a notação * para importar um pacote. Você não
pode usar import java.* ou import java.*.* para importar todos os pacotes com o prefixo java.
Atenção: Você só pode importar classes e não objetos. Por exemplo, você nunca importaria
[Link].
Na maioria das vezes, você importa apenas os pacotes que precisa, sem se preocupar muito com
eles. A única vez em que você precisa prestar atenção nos pacotes é quando tem um conflito de
nome. Por exemplo, os pacotes [Link] e [Link] têm uma classe Date. Suponha que você
escreva um programa que importa os dois pacotes.
import [Link].*;
import [Link].*;
Se agora você usar a classe Date, então receberá um erro de tempo de compilação:
O compilador não consegue descobrir qual classe Date você deseja. Você pode resolver esse
problema adicionando uma instrução import específica:
import [Link].*;
import [Link].*;
import [Link];
E se você realmente precisar das duas classes Date? Então, precisará usar o nome completo do
pacote, com cada nome de classe.
64 Java básico 1
[Link] today = new [Link]();
Localizar classes em pacotes é uma atividade do compilador. Os códigos de byte nos arquivos de
classe sempre usam nomes de pacote completos para fazer referência a outras classes.
Em Java, você pode evitar completamente o mecanismo import, nomeando todos os pacotes
explicitamente, como em [Link].
A única vantagem da instrução import é a conveniência. Você pode se referir a uma classe por
um nome mais curto do que o nome de pacote completo. Por exemplo, após uma instrução
import [Link].* (ou import [Link]), você pode se referir à classe [Link]
simplesmente como Date.
package [Link];
public class Empregado
{
. . .
}
Se você não colocar uma instrução package no arquivo-fonte, então as classes desse arquivo-
fonte pertencerão ao pacote padrão. O pacote padrão não tem nome de pacote. Até agora, todas
as nossas classes de exemplo estavam localizadas no pacote padrão.
. (diretório corrente)
[Link]
com/
cursojava/
empresa/
[Link]
Para compilar esse programa, basta mudar para o diretório que contém [Link] e
executar o comando:
javac [Link]
Java básico 1 65
O compilador encontra automaticamente o arquivo com/cursojava/empresa/[Link] e
o compila.
Alerta: O compilador não verifica diretórios ao compilar arquivos-fonte. Por exemplo, suponha
que você tenha um arquivo-fonte que começa com uma diretiva:
package [Link];
Você pode compilar o arquivo, mesmo que ele não esteja contido em um subdiretório
com/mycompany. O arquivo-fonte será compilado sem errors, mas a máquina virtual não
encontrará as classes resultantes, quando você tentar executar o programa. Portanto, você deve
usar a mesma hierarquia para arquivos-fonte e para arquivos de classe.
Herança
Herança basicamente é a técnica para derivar novas classes a partir das já existentes. Os
conceitos por trás da herança são de alterar e reutilizar métodos de classes existentes, a fim de
adaptá-los para uma nova situação.
Essa é a classe mãe, que diz respeito às regras de tratamento de todos os empregados. Agora
imagine que os gerentes, que também são empregados, tenham um tratamento especial.
Poderíamos implementar assim:
66 Java básico 1
public Gerente(String n, double s) {
super(n, s);
departamento = “”;
}
public void bonusSalario() {
[Link]([Link]());
}
public String getDepartamento() {
return departamento;
}
public void setDepartamento(String d) {
departamento = d;
}
}
Na implementação, a palavra chave extends faz com que a classe que está sendo criada derive
da classe já existente cujo nome vai após essa palavra. Essa classe existente é chamada
superclasse ou classe base. A nova classe é chamada de subclasse, classe derivada ou classe filha.
No construtor da classe Gerente, é usado o comando super, que se refere a uma superclasse,
no caso Empregado. De modo que:
super(n, s);
Se for analisada a classe Gerente, percebe-se que o método aumentaSalario não está
presente. Isso acontece porque, a menos que especificado, uma subclasse sempre usa os
métodos da superclasse.
Note também que por ser privada, o atributo salario não é visível na classe derivada, então,
para que se possa fazer as alterações, deve-se chamar os métodos da classe pai.
Hierarquia de Heranças
A herança não está limitada a um nível somente. Pode-se, por exemplo, fazer com que uma
classe chamada Executivo derive da classe Gerente. Pode-se também fazer uma classe
Java básico 1 67
Secretario e outra Programador derivarem de Empregado. Ficaríamos com a seguinte
configuração:
Evitar Herança
Para evitar herança em alguma classe, deve-se usar o modificador final na sua declaração:
Faz com que não se possa definir nenhuma subclasse de Executivo. Se o modificador final
for usado em um método da classe, este também não poderá ser sobreposto nas subclasses.
Todos os métodos de uma classe final são também final.
Atividade 3 - Herança
1. Defina a classe Funcionário, contendo os atributos nome, RG e total vendas em R$. Crie o método
construtor padrão e os métodos seletores e modificadores para cada um de seus atributos.
2. Defina a classe Vendedor, contendo o atributo valor comissão. Esta classe é subclasse da classe
Funcionário e deverá implementar o método construtor padrão e os métodos seletores e modificadores
para cada um de seus atributos. Implemente um método que calcule e retorno o valor da comissão do
vendedor, sendo que o valor da comissão é de 5% sobre o valor total das vendas.
3. Defina a classe Gerente, contendo o atributo valor comissão. Esta classe é subclasse da classe
Funcionário e deverá implementar o método construtor padrão e os métodos seletores e modificadores
para cada um de seus atributos. Implemente um método que calcule e retorno o valor da comissão do
gerente, sendo que o valor da comissão é de 7,5% sobre o valor total das vendas.
4. Desenvolva uma classe executável que instancie um objeto da classe Vendedor e depois calcule e
escreva o valor da comissão a qual ele terá direito a receber.
5. Desenvolva uma classe executável que instancie um objeto da classe Gerente e depois calcule e
escreva o valor da comissão a qual ele terá direito a receber.
68 Java básico 1
Polimorfismo
É a capacidade do Java de descobrir, na hierarquia de herança, qual método usar para uma
determinada chamada. Diferentemente da sobrecarga, todos esses métodos possuem a mesma
assinatura, mas se encontram em lugares diferentes na hierarquia. Por exemplo, ao se chamar a
função getSalario, na classe Gerente, o Java percebe que essa classe não possui esse
método, então procura nas superclasse para ver se o encontra. Se encontrado, executa-o, senão
um erro é gerado.
No exemplo acima, a chamada do método desenhar, faz com que seja chamado o método da
classe Retangulo, apesar de ser um Poligono a estar armazenado ali.
Se funcionario = Gerente
[Link]();
Se funcionario = Programador
Programador = aumentarSalarioProgramador();
Java básico 1 69
Figura 7.2 – Herança sem o emprego de polimorfismo.
[Link]();
Atividade 4 - Polimorfismo
1. Defina a classe Empregado, contendo os atributos nome e salário. Crie o método construtor padrão
e os métodos seletores e modificadores para cada um de seus atributos. Implemente o método
aumentarSalario() que aplique e retorne 5% de aumento no salário.
2. Defina a classe Programador. Esta classe é subclasse da classe Empregado. Implemente o método
aumentarSalario() que aplique e retorne 10% de aumento no salário.
3. Defina a classe Gerente. Esta classe é subclasse da classe Empregado. Implemente o método
aumentarSalario() que aplique e retorne 15% de aumento no salário.
4. Desenvolva uma classe executável que instancie um objeto de cada uma das classes implementada
nos exercícios de 1 a 3 e depois o escreva o nome e o salário que terão direito a receber.
Classes Abstratas
Ao subir na hierarquia de classes, estas vão se tornando mais genéricas. Chega um ponto que
elas são tão genéricas que acabam se tornando somente um modelo de como devem ser
implementadas.
Suponha um sistema de gerenciamento de mensagens por voz, fax ou texto. Criamos então as
classes VoxMessage, FaxMessage e TextMessage. Como o sistema terá que manter e
manipular uma mistura desses três tipos de mensagens, então cria-se um classes mãe comum a
todas as demais, chamada Message.
Mas quando se manda reproduzir uma mensagem, através da classe mãe Message, não se sabe
o que reproduzir, ou voz, ou fax ou texto. Então se usa a palavra reservada abstract para dizer
70 Java básico 1
que esse método não pode ser definido nessa classe, mas sim em uma subclasse. Um detalhe é
que se uma classe possui um ou mais métodos abstratos, então ela mesma tem que ser abstrata:
Além dos métodos abstratos, as classes abstratas podem ter métodos e atributos concretos. Por
exemplo, a classe Message pode armazenar o remetente da mensagem postal e ter um método
concreto que retorne o nome do remetente:
Não é possível criar objetos a partir de classes abstratas. Ou seja, se uma classe é declarada
abstrata, então nenhum objeto dessa classe pode ser criado. Será necessário ampliar essa classe
a fim de criar uma instância da classe. Observe que ainda assim podem-se criar variáveis objeto
de uma classe abstrata, embora essas variáveis tenham de fazer referência a um objeto de uma
subclasse não abstrata. Por exemplo:
Aqui msg é uma variável do tipo abstrato Message que faz referência a uma instância da
subclasse não abstrata VoiceMessage.
Ligação
Dependendo das características da linguagem e do tipo de polimorfismo suportado por ela, a
implementação do polimorfismo pode exigir facilidades proporcionadas pela ligação dinâmica.
De um modo geral, uma ligação (binding) é uma associação, possivelmente entre um atributo e
uma entidade ou entre uma operação e um símbolo. Uma ligação é dita estática se ocorre em
tempo de compilação ou de interligação (linking) e não é mais modificada durante toda a
execução do programa. A ligação dinâmica é feita em tempo de execução ou pode ser alterada no
decorrer da execução do programa.
Com a ligação dinâmica, a ligação do operador a uma particular operação pode ser feita em
tempo de execução, isto é, o código compilado para um tipo abstrato de dados pode ser usado
para diferentes tipos de dados, aumentando consideravelmente sua reusabilidade. Entretanto, o
uso de ligação dinâmica compromete a eficiência de implementação.
Java básico 1 71
Por default, Java faz ligação dinâmica (late binding) dos métodos das classes. Para que um
método seja implementado com ligação estática (early binding) deve-se torná-la final. Deve-se
ter em mente que isso não mais permitirá que um método seja sobrescrito.
Classe Class
A classe Class serve para fazer identificação de tipos em tempo de execução. Essa informação
acompanha a classe à qual o objeto pertence e é usada pela linguagem para selecionar os
métodos corretos a executar em tempo de execução.
Essas informações estão acessíveis para o programador através do método getClass da classe
Object, que retorna uma instância de Class.
Empregado e;
...
Class c1 = [Link]();
Provavelmente o método mais usado da classe Class é o getName, que retorna o nome da
classe.
[Link]([Link]().getName());
Pode-se obter um objeto Class também através de uma string contendo o nome da
classe:
String className = “Gerente”;
Class c1 = [Link](className);
Class c1 = [Link];
Class c2 = [Link];
Class c3 = Double[].class;
Pode-se também criar uma nova instância de uma classe a qualquer momento:
[Link]().newInstance();
Cria uma nova instância da mesma classe que e, e chama o construtor padrão, aquele sem
parâmetros.
No exemplo abaixo, consegue-se criar uma instância de uma classe tendo o seu nome numa
string:
String s = “Gerente”;
Object m = [Link](s).newInstance();
Caso se queira chamar outro construtor que não o padrão, deve-se usar o método
newInstance da classe Constructor, que será visto na sessão sobre reflexão.
72 Java básico 1
Reflexão
A classe Class fornece um conjunto de ferramentas muito rico e elaborado para escrever
programas que manipulam código dinamicamente em Java. Isso é importante quando se deseja
manipular recursos de classes, em tempo de execução.
Aproveitar os objetos Method que funcionam exatamente como ponteiros para funções em
C++.
Com essas classes pode-se, por exemplo, descobrir os modificadores dos métodos, retornar
nomes dos construtores etc.
Mas como o campo nome não é acessível, um erro ocorrerá. Para contornar isso, basta fazer uma
chamada a:
[Link](true);
antes de chamar o [Link](paulo).
Superclasse abstrata
Suponha o exemplo típico de modelar classes de ordenamento genérico. Vamos inicialmente
implementar um algoritmo de ordenação, e uma classe abstrata Sortable, contento o método
único compareTo, que determina se um objeto ordenável é menor, igual ou maior que o outro.
Java básico 1 73
public abstract int compareTo(Sortable b);
}
class ArrayAlg {
public static void shellSort(Sortable[] a) {
int n = [Link];
int incr = n/2;
while (incr >= 1) {
for (int i=incr; i<n; i++) {
Sortable temp = a[i];
int j=i;
while (j>=incr && [Link](a[j-incr]) <0) {
a[j] = a[j – incr];
J -= incr;
}
a[j] = temp;
}
incr /= 2;
}
}
}
Essa rotina pode ser usada em qualquer classe que estende Sortable, sobrepondo o método
compareTo. Isso porque cada classe terá sua maneira de comparar elementos, que será
definida nela, e como a classe de ordenação usa Sortable, no final o método compareTo que
será usado é o sobreposto.
Por exemplo:
Interfaces
Na linguagem de programação Java, uma interface não é uma classe, mas um conjunto de
requisitos para classes que queiram se adequar à interface.
Normalmente, o fornecedor de algum serviço diz: “se sua classe obedecer a uma interface em
particular, então executarei o serviço.” Vamos ver um exemplo concreto. O método sort da classe
74 Java básico 1
Arrays promete ordenar um array de objetos, mas sob uma condição: os objetos devem
pertencer às classes que implementam a interface Comparable.
Isso significa que qualquer classe que implemente a interface Comparable é obrigada a ter um
método compareTo e o método deve receber um parâmetro Object e retornar um inteiro.
Todos os métodos de uma interface são automaticamente public. Por isso, não é necessário
fornecer a palavra-chave public ao se declarar um método em uma interface.
É claro que existe um requisito adicional que a interface não pode explicar detalhadamente: ao
chamar [Link](y), o método compareTo deve realmente poder comparar dois objetos e
retornar uma indicação dizendo se x ou y émaior. O método deve retornar um número negativo,
se x for menor do que y; zero, se eles forem iguais; e, caso contrário, um número positivo.
Essa interface em particular tem um único método. Algumas interfaces têm mais de um método.
Conforme você verá posteriormente, as interfaces também podem definir constantes. O que é
mais importante, entretanto, é o que as interfaces não podem fornecer. As interfaces nunca têm
campos de instância e os métodos nunca são implementados na interface. Fornecer campos de
instância e implementações de método é a tarefa das classes que implementam a interface. Você
pode considerar uma interface como sendo semelhante a uma classe abstrata sem campos de
instância. Entretanto, existem algumas diferenças entre esses dois conceitos.
Agora, suponha que queiramos usar o método sort da classe Arrays para ordenar um array de
objetos Empregados. Então, a classe Empregado deve implementar a interface Comparable.
Para fazer uma classe implementar uma interface, você precisa executar dois passos:
Para declarar que uma classe implementa uma interface, use a palavra-chave implements:
É claro que, agora, a classe Employee precisa fornecer o método compareTo. Vamos supor que
queiramos comparar os funcionários pelos seus salários. Aqui está um método compareTo que
retorna -1, caso o salário do primeiro funcionário for menor do que 0, 0 se for igual e 1, caso
contrário.
Java básico 1 75
return 0;
}
Alerta: na declaração da interface, o método compareTo não foi declarado como public, porque
todos os métodos em uma interface são automaticamente públicos. Entretanto, ao implementar
a interface, você deve declarar o método como public. Caso contrário, o compilador vai supor
que o método tem visibilidade de pacote, o padrão para uma classe. Então, o compilador reclama
que você está tentando fornecer um privilégio de acesso mais fraco.
Dica: o método compareTo da interface Comparable retorna um inteiro. Se os objetos não forem
iguais, não importa qual valor negativo ou positivo você retorne. Essa flexibilidade pode ser útil
ao se comparar campos inteiros. Suponha, por exemplo, que cada funcionário tenham uma id
inteira exclusiva e que você queira ordenar pelo número da ID do funcionário. Então, você pode
simplesmente retornar id - [Link]. Esse valor será negativo, se o primeiro número de ID for
menor do que o outro, 0 se eles forem iguais e um valor positivo, caso contrário. Entretanto,
existe um problema: o intervalo dos inteiros deve ser suficientemente pequeno para que a
subtração não cause estouro. Se você souber que as IDs estão entre 0 e (Integer.MAX_VALUE - 1)
/ 2, pode ficar tranquilo.
É claro que o truque da subtração não funciona para números de ponto flutuante. A diferença
salário / [Link]ário pode ser arredondada para 0, se os salários forem próximos, mas não
idênticos.
Existe um problema sério ao usar classes abstratas para expressar uma propriedade genérica, é
que em Java, uma classe pode ter somente uma superclasse. Em vez de herança múltipla, o Java
introduz o conceito de interfaces.
Interface nada mais é que uma promessa que uma classe vai implementar certos métodos com
certas características. Usa-se inclusive a palavra-chave implements para indicar que a classe vai
manter essas promessas. A maneira como esses métodos serão implementados depende da
classe, evidentemente.
Deve-se perceber que somente métodos (ocos, sem implementação) e constantes (atributos
final) podem ser definidos dentro de uma interface.
Propriedades
Embora as interfaces não sejam instanciadas com new, pode-se ter uma variável da interface:
76 Java básico 1
if ([Link](y) < 0) …
Pode-se também usar instanceof para saber se uma classe implementa uma interface:
Também é possível estender uma interface para criar outra, permitindo cadeias múltiplas de
interfaces:
Não se pode colocar campos de instância numa interface, mas pode-se colocar constantes:
Nota: Cloneable é uma interface para implementar o método clone(), que faz uma cópia bit
a bit dos objetos da classe.
Classes Internas
Classes internas são classes definidas dentro de classes. Há quatro motivos para seu uso:
Um objeto de uma classe interna pode acessar a implementação do objeto que a criou,
incluindo dados que seriam, de outra forma, privados;
As classes internas podem ser invisíveis para outras classes do mesmo pacote;
As classes internas anônimas são práticas quando se quer definir callbacks em tempo de
execução;
As classes internas são muito convenientes quando se quer escrever programas orientados
por eventos.
Aqui está um exemplo típico: uma classe de lista encadeada define uma classe para conter os
links e uma classe para definir a posição de um iterador.
class LinkedList
{
public class Iterator // uma classe aninhada
{
public:
Java básico 1 77
void insert(int x);
int erase();
. . .
};
. . .
private class Link // uma classe aninhada
{
public:
Link* next;
int data;
};
. . .
};
O aninhamento é um relacionamento entre classes e não objetos. Um objeto LinkedList não tem
sub-objetos de tipo Iterator ou Link.
Existem duas vantagens: controle de nome e controle de acesso. Como o nome Iterator está
aninhado dentro da classe LinkedList, ele é conhecido externamente como LinkedList::Iterator e
não pode entrar em conflito com outra classe chamada Iterator. Em Java, essa vantagem não é
tão importante, pois os pacotes fornecem o mesmo tipo de controle de nome. Note que a classe
Link está na parte privada da classe LinkedList. Ela fica completamente oculta de todo outro
código. Por isso, é seguro tornar seus campos de dados públicos. Eles podem ser acessados pelos
métodos da classe LinkedList (que tem a necessidade legítima de acessá-los) e não são visíveis
em outro lugar. Em Java, esse tipo de controle não era possível até que as classes internas
fossem introduzidas.
Entretanto, as classes internas Java têm um recurso adicional que as torna mais ricas e úteis do
que as classes aninhadas em C++. Um objeto proveniente de uma classe interna tem uma
referência implítica para o objeto da classe externa que o instanciou. Através desse ponteiro, ele
tem acesso ao estado total do objeto externo.
Apenas as classes internas static não têm esse ponteiro adicional. Elas são as análogas Java
exatas das classes aninhadas em C++.
Por exemplo:
class UmaClasse {
...
private class InnerClass {
...
}
...
}
Pode-se criar classes internas dentro de métodos, e também criar classes anônimas. Classes
internas não são um conceito comum e Java as implementa como classes diferentes, inserindo
métodos acessadores à classe que contém a classe interna.
Qualquer classe declarada dentro do corpo de outra classe ou interface é conhecido como uma
classe aninhada. Se a classe aninhada não tem um nome, então ela é considerada uma classe
78 Java básico 1
anônima. Se a classe aninhada tem um nome, então não é anônima. Se a classe aninhada tem um
nome e não é declarada dentro de um método, construtor ou qualquer bloco, então ela é uma
classe membro. Se uma classe membro não for decladrada como estática, então ela é uma classe
interna. Se uma classe não estiver aninhada, então é uma classe de nível superior.
Para você, os recursos de POO facilitam a organização, proteção e acesso aos recursos de uma
aplicação Java em desenvolvimento?
Java básico 1 79
b. Desenvolva uma interface para instanciar um objeto da classe Pessoa, calcular e escrever na
tela a faixa de risco do mesmo do mesmo.
2. Defina uma classe abstrata Veículo, cujos objetos representam veículos, contendo as seguintes
informações: número de cilindradas, preço e combustível. Implemente construtor(es), e um método
abstrato que possibilite a impressão de todos os atributos do objeto instanciado.
a. Defina uma classe Moto, subclasse da classe Veículo, que contenha as seguintes informações
adicionais: tipo de motor (2 ou 4 tempos, carburado, etc.) e tipo de freio (ventilado, a disco etc.).
Redefina o construtor de objetos da classe e de impressão de suas informações de maneira
apropriada.
b. Defina uma classe Carro, subclasse da classe Veículo, que contenha as seguintes informações
adicionais: número de passageiros e capacidade do porta-malas. Redefina o construtor de objetos
da classe e de impressão de suas informações de maneira apropriada.
c. Defina uma classe Caminhão, subclasse da classe Veículo, que contenha as seguintes
informações adicionais: peso do veículo e peso da carga. Redefina o construtor de objetos da
classe e de impressão de suas informações de maneira apropriada.
d. Desenvolva uma interface para instanciar um objeto de cada uma das classes implementadas e
que imprima uma frase composta por todos os valores de seus atributos próprios e herdados. A
classe de interface deverá estar no pacote visão (visão).
a. Defina uma classe ChequeEspecial, subclasse da classe Conta, que contenha o valor do limite
para o saldo da conta. Redefina o construtor da classe e o método de saque, de forma que possa
utilizar o valor do limite, caso seja necessário.
b. Desenvolva uma interface para instanciar um objeto da classe ChequeEspecial, faça e imprima
uma frase composta por todos os valores de seus atributos próprios e herdados. A classe de
interface deverá estar no pacote visão (visao).
2. Defina uma classe Veículo com os atributos: número da placa, cor, ano de fabricação, tanque
(quantidade de combustível em litros), quantidade de litros da reserva e consumo médio (Km/l).
Implemente os métodos:
80 Java básico 1
a. Defina duas subclasses, Caminhão – com o atributo capacidade de carga (em toneladas) e
Ônibus – com o atributo capacidade de passageiros (número de lugares). Objetos dessas classes
mudam o comportamento de consumo médio (reduzem em 10%) quando sua capacidade de carga
supera 50%. Implemente os métodos de alterarOcupação (de carga ou pessoas) para cada uma
delas e faça o veículo andar novamente.
Java básico 1 81
82 Java básico 1
8
Collections
Exercício de nivelamento 9 – Collections
Pesquise na internet o conceito de framework e diga como você acha que este pode auxiliar no
desenvolvimento de programas Java.
Definição
Collections, às vezes chamado de containner, é simplesmente um objeto que agrupa vários
elementos em uma única estrutura. Collections são usados para armazenar, recuperar,
manipular e comunicar dados agregados. Normalmente, eles representam itens de dados que
formam um grupo natural, como uma mão de poker (uma coleção de cartas), uma pasta de
correio (uma coleção de cartas), ou uma lista telefônica (um mapeamento de nomes para
números de telefone).
Interfaces: Estes são os tipos de dados abstratos que representam coleções. Interfaces
permitem coleções para ser manipulado independentemente dos detalhes de sua
representação. Em linguagens orientadas a objeto, interfaces geralmente formam uma
hierarquia.
Algoritmos: Estes são os métodos que executam cálculos úteis, como pesquisa e
classificação, em objetos que implementam interfaces de coleta. Os algoritmos seriam
polimórficos: isto é, o mesmo método pode ser usado em muitas aplicações diferentes da
interface. Em essência, os algoritmos são funcionalidades reutilizáveis.
Java básico 1 83
Historicamente, estruturas das coleções têm sido bastante complexo, o que lhes deu uma
reputação de ter uma curva de aprendizagem difícil. O Java Collections Framework veio para
quebra esta tradição.
Reduz o esforço de aprender e usar novas APIs: APIs naturalmente tomam coleções na
entrada e as fornece como saída. No passado, cada API, tinha uma pequena sub-API
dedicada a manipular suas coleções. Houve pouca consistência entre essas coleções ad hoc
sub-APIs, assim, você teve que aprender cada um a partir do zero, e era fácil cometer erros
quando utilizá-las. Este problema não existe mais com o advento de interfaces padrão de
Collections.
Reduz o esforço de projetar novas APIs: Este é o outro lado da vantagem anterior descrita.
Designers e implementadores não tem que reinventar a roda cada vez que criar uma API
que se baseia em coleções. Em vez disso, eles podem usar interfaces padrão de Collections.
Com esses e outros objetivos em mente, a Sun criou um conjunto de classes e interfaces
conhecido como Collections Framework, que reside no pacote [Link]. A API do
Collections é robusta e possui diversas classes que representam estruturas de dados avançadas.
Por exemplo, não é necessário reinventar a roda e criar uma lista ligada, mas sim utilizar aquela
que a Sun disponibilizou.
84 Java básico 1
Figura 8.1 – API do Collections.
Listas
Um primeiro recurso que a API de Collections traz são as listas. Uma lista é uma coleção que
permite elementos duplicados e mantém uma ordenação específica entre os elementos.
Em outras palavras, você tem a garantia de que, quando percorrer a lista, os elementos serão
encontrados em uma ordem pré-determinada, definida na hora da inserção dos mesmos. Ela
resolve todos os problemas que levantamos em relação ao array (busca, remoção, tamanho
"infinito",...). Esse código já está pronto!
A API de Collections traz a interface [Link], que especifica o que uma classe
deve ser capaz de fazer para ser uma lista. Há diversas implementações disponíveis, cada uma
com uma forma diferente de representar uma lista.
A implementação mais utilizada da interface List é a ArrayList, que trabalha com um array
interno para gerar uma lista. Portanto, ela é mais rápida na pesquisa do que sua concorrente, a
LinkedList, que é mais rápida na inserção e remoção de itens nas pontas.
A interface List possui dois métodos add, um que recebe o objeto a ser inserido e o coloca no
final da lista, e um segundo que permite adicionar o elemento em qualquer posição da mesma.
Note que, em momento algum, dizemos qual é o tamanho da lista; podemos acrescentar quantos
elementos quisermos que a lista cresce conforme for necessário.
Toda lista (na verdade, toda Collection) trabalha do modo mais genérico possível. Isto é, não
há uma ArrayList específica para Strings, outra para Números, outra para Datas etc. Todos
os métodos trabalham com Object.
A interface List e algumas classes que a implementam podem ser vistas no diagrama a seguir:
Java básico 1 85
Figura 8.2 – Interface List e classes que a implementam.
Conjunto
Um conjunto (Set) funciona de forma análoga aos conjuntos da matemática, ele é uma coleção
que não permite elementos duplicados.
Outra característica fundamental dele é o fato de que a ordem em que os elementos são
armazenados pode não ser a ordem na qual eles foram inseridos no conjunto. A interface não
define como deve ser este comportamento. Tal ordem varia de implementação para
implementação.
86 Java básico 1
Um conjunto é representado pela interface Set e tem como suas principais implementações as
classes HashSet, LinkedHashSet e TreeSet.
if([Link]("Maria")){
[Link]("Contém Maria!!!");
}
Iterator<String> i = [Link]();
while([Link]())
[Link]([Link]());
}
O uso de um Set pode parecer desvantajoso, já que ele não armazena a ordem, e não aceita
elementos repetidos. Não há métodos que trabalham com índices, como o get(int) que as
listas possuem. A grande vantagem do Set é que existem implementações, como a HashSet,
que possui uma performance incomparável com as Lists quando usado para pesquisa (método
contains por exemplo).
Mapas
Muitas vezes queremos buscar rapidamente um objeto dado alguma informação sobre ele. Um
exemplo seria, dada a placa do carro, obter todos os dados do carro. Poderíamos utilizar uma
lista para isso e percorrer todos os seus elementos, mas isso pode ser péssimo para a
performance, mesmo para listas não muito grandes. Aqui entra o mapa.
Um mapa é composto por um conjunto de associações entre um objeto chave a um objeto valor.
[Link] é um mapa, pois é possível usá-lo para mapear uma chave a um valor, por
exemplo: mapeie à chave "empresa" o valor "Nome da Empresa", ou então mapeie à chave "rua"
ao valor "Endereço da Empresa". Semelhante a associações de palavras que podemos fazer em
um dicionário.
O método put(Object, Object) da interface Map recebe a chave e o valor de uma nova
associação. Para saber o que está associado a um determinado objeto-chave, passa-se esse
Java básico 1 87
objeto no método get(Object). Sem dúvida essas são as duas operações principais e mais
frequentes realizadas sobre um mapa.
Um mapa é muito usado para "indexar" objetos de acordo com determinado critério, para
podermos buscar esses objetos rapidamente. Um mapa costuma aparecer juntamente com
outras coleções, para poder realizar essas buscas!
Ele, assim como as coleções, trabalha diretamente com Objects (tanto na chave quanto no
valor), o que tornaria necessário o casting no momento que recuperar elementos. Usando os
generics, como fizemos aqui, não precisamos mais do casting. Suas principais implementações
são o HashMap, o TreeMap e o Hashtable.
Apesar do mapa fazer parte do framework, ele não estende a interface Collection, por ter um
comportamento bem diferente. Porém, as coleções internas de um mapa são acessíveis por
métodos definidos na interface Map.
88 Java básico 1
Figura 8.4 – Interface Map e classes que a implementam.
O método keySet() retorna um Set com as chaves daquele mapa e o método values()
retorna a Collection com todos os valores que foram associados a alguma das chaves.
Atividade 1 – Collections
1. Desenvolva uma aplicação Java que gere e armazene todos os números inteiros entre 1 e 1000
randomicamente e depois ordene os números gerados em ordem crescente e em ordem decrescente,
utilizando um ArrayList e implementando interfaces Compareble.
2. Crie uma classe Conta Bancária contendo os atributos número da conta, nome cliente e saldo atual.
Implemente construtores, getters e setters. Desenvolva aplicações Java que apresente as seguintes
funcionalidades:
Java básico 1 89
Atividade 2 – Collections (Complementar)
1. Uma empresa decidiu fazer um levantamento de informações em relação aos candidatos que se
apresentaram para o preenchimento de vagas no seu quadro de funcionários. Para resolver este
problema, é necessário ter os seguintes dados sobre cada candidato: número de inscrição, nome,
‘código da vaga’, a idade (em anos), o sexo (M–masculino ou F–feminino) e a experiência no serviço
(S–sim ou N–não). Escreva uma classe principal que leia os dados dos candidatos e armazene em um
ArrayList de Objetos da classe Candidato e informe:
90 Java básico 1
Bibliografia
ASCÊNCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Vaneruchi de. Fundamentos
de Programação de Computadores: algorítmos, pascal, e c/c++. São Paulo: Prentice-Hall,
2002.
DEITEL. Java Como Programar. 6a. ed. São Paulo: Pearson Prentice Hall, 2005.
GUIMARÃES, Ângelo de Moura. Algoritmos e Estruturas de Dados. Rio de Janeiro: LTC, 1994.
HORSTMANN, Cay. CORNELL, Gary. Core Java 2 – Fundamentals. The Sun Microsystems Press
Java Series. Vol. I. 2003.
JUNIOR, Peter Jandl. Java Guia do Programador. São Paulo: Novatec, 2007.
SIERRA, Kathy; BATES, Bert. Certificação Sun Para Programador Java 6 Guia de Estudo. São
Paulo: Rio de Janeiro, 2008.
Java básico 1 91
Java básico 2
Rio de Janeiro
Escola Superior de Redes
2013
Java básico 2
Java básico 2
2
Sumário
Programação para interfaces gráficas, componentes e controle de
eventos – sessões 1, 2 e 3.......................................................................................... 3
Introdução ................................................................................................ 4
Janelas ..................................................................................................... 5
Exibição de Informações ......................................................................... 7
Objetos Gráficos e o Método paintComponent ................................ 7
Texto, Fontes e Cores .............................................................................. 9
Formas Geométricas .............................................................................. 10
Imagens ................................................................................................. 10
Eventos .................................................................................................. 10
Hierarquia de Eventos do AWT .........................................................12
Eventos de Foco .................................................................................12
Eventos de Teclado ............................................................................13
Eventos de Mouse ..............................................................................13
Componentes visuais-gráficos do pacote Swing ................................... 14
Padrão MVC .......................................................................................14
Gerenciamento de Layout de Visualização ........................................... 15
Bordas .................................................................................................17
Painéis ................................................................................................18
Grade ..................................................................................................19
Caixa ...................................................................................................20
Bolsa de Grade ...................................................................................21
Não usar Gerenciador de Layout ........................................................23
Campos de Entrada de Texto................................................................. 25
Campos de Texto ................................................................................25
Campos de Senha ...............................................................................26
Áreas de Texto....................................................................................26
Seleção de Texto ................................................................................27
Rótulos................................................................................................... 27
Caixas de Seleção .................................................................................. 28
Botões de Rádio..................................................................................... 29
Borda ..................................................................................................... 30
Listas ..................................................................................................... 30
Combos .................................................................................................. 32
Menus .................................................................................................... 34
Caixas de Diálogo ................................................................................. 37
Ordem de Travessia: Tab Order ............................................................ 38
Applets – sessão 4 ......................................................................................................40
Ciclo de Vida de um Applet .................................................................. 41
Um primeiro exemplo de Applet ........................................................... 42
A classe Applet ...................................................................................... 42
Invocando um Applet no browser ......................................................... 43
Obtendo parâmetros no Applet.............................................................. 45
Passando parâmetros para o Applet....................................................... 46
Java básico 2
1
Applets Java versus Aplicativos ............................................................ 47
Conversão de aplicação em Applet: ...................................................... 47
Manipulação de eventos no Applet ....................................................... 48
Exibindo imagens no Applet ................................................................. 50
Reprodução de áudio no Applet ............................................................ 51
Tratamento de Erros – sessão 5 ............................................................................56
Descrever Exceções em Métodos .......................................................... 57
Levantar uma Exceção .......................................................................... 58
Criar Novas Exceções ........................................................................... 59
Capturando Exceções ............................................................................ 59
Controle de entrada e saída, streams e tratamento de arquivos
– sessão 6 ......................................................................................................................62
Stream em Java ...................................................................................... 64
Entrada e Saída baseada em Bytes ........................................................ 65
Serialização de Objetos ......................................................................... 67
JDBC – sessão 7, 8 e 9 ................................................................................................72
Exemplo de Acesso ............................................................................... 74
Obtendo Conexões ................................................................................ 75
Executando Consultas ........................................................................... 75
Executando Alterações .......................................................................... 78
Recuperando Resultados ....................................................................... 78
Instruções Preparadas ............................................................................ 79
Stored Procedures .................................................................................. 81
Fechando Recursos ................................................................................ 81
Transações ............................................................................................. 81
Execução em Batch ............................................................................... 82
Threads – sessão 10 ..................................................................................................86
Múltiplas Linhas de Execução (Thread) ............................................... 87
O que são? ............................................................................................. 87
Início do Thread e Programação de Thread .......................................... 87
Teste de um Thread ............................................................................... 90
Suspendendo Threads ............................................................................ 90
Implementar Runnable Versus Estender Thread ................................... 92
As Três Partes de um Thread ................................................................ 92
Implementando uma Thread – Método Mais Comum .......................... 93
Tratamento de Regiões Críticas com Threads ....................................... 95
Um Resumo do Funcionamento do Mecanismo de Sincronismo ......97
Bibliografia ............................................................................................................... 100
Java básico 2
2
1
Programação para interfaces gráficas,
componentes e controle de eventos
– sessões 1, 2 e 3
Exercício de nivelamento 1 – Interfaces gráficas
Você já desenvolveu aplicações desktop que utilizaram Interfaces Gráficas com Usuários?
Com qual linguagem de programação?
Você poderia descrever alguns componentes visuais gráficos que utilizou para
desenvolvimento destas interfaces?
Breve histórico:
Java básico 2
3
Introdução
Quando a linguagem Java 1.0 foi lançada, ela continha somente a biblioteca de classes AWT
(Abstract Window Toolkit) para programação GUI (Graphical User Interface) básica. A
maneira que o AWT funciona é a delegação de criação de seus componentes GUI nativos. Na
verdade, quando a criação de uma caixa de texto era feita, a linguagem criava por trás uma
caixa semelhante (peer) que fazia todos os tratamentos. Dessa maneira conseguia-se rodar
os programas em várias plataformas, tendo o programa com o mesmo aspecto
(HORSTMANN, 2003).
Em aplicações mais complexas, essa metodologia não era muito produtiva, pois era
realmente difícil escrever determinados códigos. Outro problema era que o comportamento
de determinados componentes mudava de plataforma para plataforma, ou determinados
ambientes não tinham uma vasta biblioteca de componentes gráficos, o que levava a um
esforço muito grande para a padronização das aplicações.
Em 1996 a Netscape criou a biblioteca GUI chamada IFC – Internet Foundation Classes – que
usava uma metodologia completamente diferente. Aqui, todos os componentes eram
desenhados numa tela em branco. Assim, os componentes gráficos se tornavam parecidos
com os nativos das plataformas. A Sun trabalhou junto com a Netscape para aprimorar essa
biblioteca, e criaram a biblioteca Swing.
Assim, o conjunto swing foi tornado o kit de ferramentas GUI oficial da JFC (Java Foundation
Classes).
Evidentemente, os componentes do swing são um tanto quanto mais lentos que os criados
usando AWT, mas o uso em máquinas mais modernas mostrou que a diferença não é mais
tão problemática.
Na versão atual a linguagem Java suporta duas bibliotecas gráficas: a AWT e a Swing. A
biblioteca AWT foi a primeira API voltada para interfaces gráficas a surgir no Java.
Posteriormente surgiu a biblioteca Swing (a partir do Java 1.2), que possui algumas
melhorias com relação à antecessora. De uma forma geral, apesar do reza o senso comum, as
bibliotecas gráficas são bastante simples no que diz respeito a conceitos necessários para
usá-las.
Outra questão que vale a pensa ser ressaltada é o fato que a linguagem Java, antes de tudo
prima pelo lema da portabilidade e as API de interface gráfica do Java não poderiam ser
Java básico 2
4
diferentes. A aparência das janelas construídas com a API Swing é única em todas as
plataformas onde roda (Windows, KDE, Gnome). Com isso pode-se afirmar que a aplicação
terá exatamente a mesma interface e aparência com pequenas variações geradas por
peculiaridades dos sistemas operacionais, como por exemplo, as fontes utilizadas nas janelas.
Grande parte da complexidade das classes e métodos do Swing está no fato da API ter sido
desenvolvida tendo em mente o máximo de portabilidade possível. Favorece-se, por
exemplo, o posicionamento relativo de componentes em detrimento do uso de
posicionamento relativo que poderia prejudicar usuários comresoluções de tela diferentes
da prevista.
Janelas
Uma janela de mais alto nível, que não está contida em nenhum outro componente, é
chamada quadro (frame). Em AWT a classe é Frame. Em Swing é JFrame. Essa classe não é
desenhada dentro de uma tela de desenho (canvas), portanto a moldura toda é desenha
pelo gerenciador de janelas nativo.
import [Link].*;
class FirstFrame extends JFrame {
public FirstFrame() {
setTitle("FirstFrame");
setSize(300, 200);
}
}
public class FirstTest {
public static void main(String[] args) {
JFrame frame = new FirstFrame();
[Link]();
}
}
Java básico 2
5
Figura 01 – Exemplo JFrame.
Para se encerrar um programa, não adianta somente fechar a janela, deve-se sair do
programa e desligar a virtual machine. Para isso, deve-se tratar o evento de saída do
programa. Eventos serão vistos com mais cuidado mais adiante, mas por agora temos que
saber como tratar com esse evento básico, o de fechamento de aplicativo.
No modelo de eventos do AWT, deve-se informar ao frame qual é o objeto que quer saber
quando ele for fechar. Esse objeto (o ouvinte, o que tratará o evento) deve ser uma
instância de uma classe que implementa a interface WindowsListener. No nosso exemplo,
essa classe será chamada Terminator. Em seguida, precisa-se adicionar um objeto da
classe Terminator ao frame, para que ele seja ouvinte da janela.
Mas se for analisada a interface WindowListener, percebe-se que existem sete métodos
que devem ser sobrepostos:
Java básico 2
6
public void windowDeactivated(WindowEvent e)
public void windowDeiconified(WindowEvent e)
public void windowIconified(WindowEvent e)
public void windowOpened(WindowEvent e)
No nosso caso, só precisamos tratar o método windowClosing. Fica incômodo ter que
implementar seis métodos vazios. Para isso existe a classe WindowAdapter, que
implementa todos esses sete métodos como sendo vazios. Com isso, pode-se só sobrepor os
métodos que se quer tratar:
Exibição de Informações
Desenhar uma string diretamente num quadro não é considerada uma boa técnica de
programação, apesar de possível. Mas esse componente é projetado para ser um contêiner de
outros componentes, estes sim podendo possuir dados.
A estrutura de um JFrame é complexa, mas o que nos interessa é a área de conteúdo. Essa
é a área onde os componentes serão adicionados.
Suponha que se queira inserir no frame um painel (JPanel) para se imprimir uma string
dentro. O código seria:
Java básico 2
7
Para desenhar um painel, deve-se:
Por exemplo:
A classe Graphics é a responsável por fazer desenhos de texto e imagens, com fontes e
cores.
import [Link].*;
import [Link].*;
import [Link].*;
Java básico 2
8
public void windowClosing(WindowEvent e) {
[Link](0);
});
Conteiner contentPane = getContentPane();
[Link](new HelloWorldPanel());
}
}
public class HelloWorld {
public static void main(String[] args) {
JFrame frame = new HelloWorldFrame();
[Link]();
}
}
Onde 14 é o tamanho da fonte. Para setar uma fonte dentro do paintComponent, antes de
imprimir faz-se:
Cores também são facilmente alteradas através da classe Color. Por exemplo:
[Link]([Link]);
[Link](“Hello”, 75, 100);
[Link](new Color(0, 128, 128));
[Link](“World”, 75, 125);
Java básico 2
9
Formas Geométricas
Para desenhar formas geométricas, usam-se os métodos drawLine, drawArc e
drawPolygon, do pacote [Link]. Por exemplo, um polígono:
Imagens
Para mostrar um gráfico num aplicativo, usa-se a classe Toolkit. Por exemplo:
Eventos
A manipulação de eventos é ponto imprescindível no desenvolvimento de aplicativos com
interface gráfica para o usuário. Frequentemente é dito que a aplicação é Orientada a
Eventos.
Exemplos de eventos são teclas pressionadas, recebimento de mensagens pela rede, cliques
no mouse, etc.
Em Java pode-se controlar totalmente como os eventos são transmitidos desde as origens
dos eventos (como barras de rolagem ou botões) até os ouvintes de eventos. Pode-se
designar qualquer objeto para ser um ouvinte de um evento, desde que ele o trate
convenientemente.
Um objeto ouvinte é uma instância de uma classe que implementa uma interface especial,
chamada naturalmente de interface ouvinte;
Uma origem do evento é um objeto que pode registrar objetos ouvintes e envia a estes os
objetos eventos;
A origem do evento envia objetos eventos para todos os ouvintes registrados quando esse
evento ocorre;
Os objetos ouvintes vão então usar a informação do objeto evento recebido para
determinar sua reação ao evento.
Java básico 2
10
O objeto ouvinte é registrado no objeto de origem com um código que segue o modelo a
seguir:
[Link](objetoOuvinteEvento);
Por exemplo:
Aqui, o objeto painel será notificado sempre que um evento ocorrer em botão. A classe
MeuPainel deve possuir uma construção parecida com:
Sempre que o usuário clicar no botão, o objeto JButton cria um objeto ActionEvent e
chama [Link].
Quando se tem muitos botões, que possuem o mesmo ouvinte, se torna necessário saber qual
objeto fonte gerou o evento. Existem duas maneiras fáceis de se tratar isso, dentro do
método actionPerformed:
Java básico 2
11
Hierarquia de Eventos do AWT
Vendo a hierarquia percebe-se que o AWT faz distinção entre eventos semânticos, que
expressam o que o usuário está fazendo, e de baixo nível, que tornam os eventos semânticos
possíveis. Por exemplo, um clique de um botão, na verdade é uma sequência de outros
pequenos eventos, como pressionamento do botão, movimentação do mouse enquanto
pressionado e liberação do botão.
Eventos de Foco
Na linguagem Java, um componente tem o foco se pode receber pressionamento de teclas.
Esse componente pode receber o foco ou perder o foco. Também pode-se pressionar TAB
para mover o foco sequencialmente componente a componente, de cima para baixo, da
esquerda para direita.
Exemplo:
Java básico 2
12
[Link]();
}
}
Eventos de Teclado
Eventos de teclado são ouvidos por classes que implementam a interface KeyListener. O
evento keyPressed informa a tecla pressionada:
Outros métodos podem ser sobrepostos como keyReleased, que diz quando uma tecla foi
liberada.
Eventos de Mouse
Não é necessário processar explicitamente os eventos de mouse caso se queira tratar cliques
em botões ou menus. Essas são tratadas internamente.
public MousePanel(){
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
int x = [Link]();
int y = [Link]();
current = find(x, y);
if (current < 0) // not inside a square
add(x, y);
}
public void mouseClicked(MouseEvent evt) {
int x = [Link]();
int y = [Link]();
if ([Link]() >= 2) {
remove(current);
}
}
});
addMouseMotionListener(this);
}
Java básico 2
13
Componentes visuais-gráficos do pacote Swing
Padrão MVC
O MVC é um padrão de projeto (Modelo-Visualização-Controlador ou Model-View-Controler),
que se baseia nos princípios de projetos orientados a objetos: não construir um objeto
responsável por tarefas em demasia. Isto é, num exemplo de componente de botão, não se
deve criar um botão como uma única classe que cuida da aparência visual e das
particularidades de como um botão funciona.
O padrão de projeto MVC ensina como realizar isso. Deve-se implementar três classes
separadas:
Java básico 2
14
conjunto de flags indicando se está pressionado ou não, ativo ou não. O modelo precisa
implementar métodos para alterar e ler o conteúdo. Deve-se ter em mente que ele é
totalmente abstrato, não possui representação visual.
Uma das grandes vantagens do padrão MVC é que um modelo pode ter várias visualizações,
cada uma mostrando partes ou aspectos diferentes do conteúdo. Por exemplo, um editor
HTML pode mostrar o conteúdo de duas formas, uma como a página aparece no browser,
com opção de edição (WYSIWYG) e outra mostrando as tags todas do arquivo html para
edição.
Usaremos o botão (JButton) por ser um componente visual gráfico comumente utilizado para
interação com usuários de programas e também por ser simples de controlar, será usado nos
exemplos.
Java básico 2
15
Por exemplo, podemos desenvolver um programa que imprime três botões que alteram as
cores de fundo de um frame, quanto clicados pelo usuário. Veja o código java abaixo que
pode ser utilizado para implementar esta funcionalidade:
// pega o panel
Container contentPane = getContentPane();
// adiciona controles
aux = new JButton("Amarelo");
[Link](aux);
[Link](this);
[Link](new FlowLayout([Link]));
Neste exemplo, a última linha seta o layout que será usado na impressão dos controles na
tela. Nesse caso, os controles serão centralizados:
[Link](new FlowLayout([Link]));
A função setLayout é um método do contêiner, que pode receber qualquer uns dos layouts
definidos. Em particular, o FlowLayout é usado para alinhar os controles, centralizado,
esquerda ou direita.
Java básico 2
16
Bordas
O gerenciador de layout de visualização de bordas (BorderLayout) é o gerenciador padrão do
JFrame. Este gerenciador permite escolher em que posição se deseja colocar o controle.
Java básico 2
17
Por exemplo:
[Link]("Sul");
getContentPane().add(jButton2,
[Link].PAGE_END);
[Link]("Oeste");
getContentPane().add(jButton3,
[Link].LINE_START);
[Link]("Leste");
getContentPane().add(jButton4,
[Link].LINE_END);
[Link]("Centro");
getContentPane().add(jButton5, [Link]);
...
}
Os componentes das bordas são colocados primeiro. O que sobra é ocupado pelo centro.
Pode-se posicionar como “North”, “South”, “East”, “West” e “Center”. O Layout de borda
aumenta todos os componentes para que ocupem todo o espaço disponível. O Layout de
Fluxo deixa todos os componentes com seu tamanho preferencial.
Painéis
O problema do Layout de Borda, quanto ao redimensionamento dos componentes para que
ocupem o espaço disponível em cada uma das regiões disponíveis, pode ser contornado
através do uso de painéis adicionais. Esses painéis agem como contêiners para controles.
Dentro desses painéis pode-se utilizar outro layout, podendo assim fazer uma mescla de
vários tipos.
Por exemplo:
Java básico 2
18
Grade
O gerenciador de layout de visualização de grade (GridLayout) organiza todos os
componentes em linhas e colunas como uma planilha. Neste layout as células são todas do
mesmo tamanho.
Java básico 2
19
Caixa
O gerenciador de layout de visualização de Caixa (BoxLayout) permite colocar uma única
linha ou coluna de componentes com mais flexibilidade de que o layout de grade. Existe um
contêiner (Box) cujo gerenciador padrão de layout é o BoxLayout, diferentemente da
classe Panel, cujo gerenciador é o FlowLayout.
Box b = [Link]();
ou
Box b = [Link]();
[Link](okButton);
[Link](cancelButton);
Para não se ter problemas com um controle que dentro de um layout de caixa fique com uma
altura não desejada, faz-se com que seu tamanho máximo seja o tamanho preferencial. Por
exemplo:
[Link]([Link]());
Para se adicionar algum espaço entre, por exemplo, botões OK e Cancel numa tela, pode-se
fazer:
[Link](okButton);
[Link]([Link](5));
[Link](cancelButton);
Que adiciona uma escora vertical, numa caixa vertical, ou uma escora horizontal numa caixa
vertical, separando os componentes em exatamente 5 pixels (no exemplo).
Pode-se usar também uma área rígida invisível, sendo similar a um par de escoras,
separando os componentes adjacentes, mas também adicionando uma altura ou largura
mínima na outra direção. Por exemplo:
adiciona uma área invisível com largura mínima, preferencial e máxima de 5 pixels e altura
de 20 pixels, mas alinhamento centralizado.
Adicionar cola faz o contrário que uma espora, separa os componentes tanto quanto
possível.
[Link](okButton);
[Link]([Link]());
[Link](cancelButton);
Java básico 2
20
Figura 08 – Exemplo BoxLayout.
Bolsa de Grade
O gerenciador de layout de visualização de Caixa (GridBagLayout) é a mãe de todos os
gerenciadores de layouts. É um layout de grade sem limitações. Pode-se unir células
adjacentes para abrir espaço para componentes maiores, etc. Os componentes não precisam
preencher toda a área da célula e pode-se especificar seu alinhamento dentro delas.
Mas a sua utilização pode ser bem complexa. É o preço que se paga pela flexibilidade máxima
e possibilidade de se trabalhar com vários tipos de situações diferentes.
Por exemplo:
Java básico 2
21
[Link](layout);
GridBagConstraints restricoes = new GridBagConstraints();
[Link] = 100;
[Link] = 100;
[Link] = 100;
[Link] = 100;
[Link] = 100;
[Link] = 100;
JList estilo = new JList();
[Link](estilo, restricoes);
Os parâmetros fill e anchor são usados para que um componente não se estenda toda a
área. Para fill, tem-se quatro possibilidades: [Link],
[Link], [Link],
[Link].
O campo anchor é usado quando o componente não ocupa o espaço todo da área. Pode-se
ancorá-lo em algum espaço dentro do campo. Pode ser: [Link],
[Link], [Link],
[Link], etc.
Para tornar a confecção desse layout mais tranquilo, pode-se usar a seguinte receita:
1. Esboçar o layout do componente numa folha de papel;
2. Encontrar uma grade tal que os pequenos componentes fiquem contidos, cada um, em
uma célula, e os componentes grandes ocupem diversas células;
3. Rotular as linhas e as colunas da grade com 0, 1, 2, 3, .... Com isso, consegue-se os calores
de gridx, gridy, gridwidth e gridheight;
4. Para cada componente, deve-se saber se ele precisa preencher sua célula
horizontalmente ou verticalmente. Caso não, como fica alinhado? Isso determina fill e
anchor;
5. Fazer todos os pesos iguais a 100. Contudo, se for preciso que uma linha ou coluna fique
no tamanho padrão, deve-se fazer weightx ou weighty iguais a 0 em todos os
componentes que pertençam a essa linha ou coluna;
6. Escrever código. Conferir cuidadosamente os valores de GridBagConstraints, pois
um único valor errado poderá arruinar todo o layout.
Java básico 2
22
Não usar Gerenciador de Layout
Para não usar o gerenciador de layout, ou para usar posicionamento absoluto deve-se setar o
gerenciador de layout para null e posicionar os controles manualmente:
[Link](null);
[Link](ok);
[Link](10, 10, 30, 15);
Java básico 2
23
Sessão 01 – GUI em Java
Java básico 2
24
Campos de Entrada de Texto
Em Java existem dois tipos de controle para tratamento de texto: campo de texto e área de
texto. A diferença é que campos de texto admitem uma só linha, enquanto áreas de texto
admitem várias linhas. As classes são JTextField e JTextArea.
Campos de Texto
A maneira usual de inserir um campo de texto é adicioná-lo a um contêiner ou a um painel.
Java básico 2
25
O tratamento de eventos de alteração de texto pode ser feito através da instalação de um
ouvinte na interface Document.
[Link]().addDocumentListener(ouvinte);
Os dois primeiros métodos são chamados quando caracteres tiverem sido inseridos ou
removidos. O terceiro método é chamado quando mudanças como formatação, ocorrem, e
também quando alterações no texto são feitas.
Campos de Senha
Para que ninguém veja o que está sendo digitado, usa-se um campo de senha, que no Java é
implementado através de JPasswordField. Usam-se as seguintes funções:
Áreas de Texto
Áreas de texto podem ser criadas através do seguinte exemplo:
Pode-se setar as linhas e colunas através de setColumns e setRows. Se houver mais texto
a ser mostrado, ele será truncado.
Java básico 2
26
Quando se quer que as linhas maiores sejam quebradas, usa-se
[Link](true). Essa quebra de linha é completamente visual, o texto
continua inalterado.
No Swing área de texto não possui barra de rolagem, se a quiser, deve-se usar um
ScrollPane, como a seguir:
Seleção de Texto
Usam-se os métodos da superclasse JTextComponent.
void select(int inicio, int fim);: seleciona o texto com início e fim
especificados;
Rótulos
São componentes que possuem uma linha de texto simples, que não reagem às opções do
usuário. São usados como informativos, ou como nome de campos na tela, etc.
Java básico 2
27
Figura 12 – Exemplo jLabel.
Caixas de Seleção
É usado quando se quer uma seleção do tipo Sim ou Não. As caixas de seleção precisam de
um Label para descrever sua finalidade. Por exemplo:
Java básico 2
28
Botões de Rádio
Nas caixas de seleção pode-se selecionar nenhuma, uma ou várias opções. Em várias
situações é necessário que o usuário escolha uma dentre várias opções. E quando uma opção
é selecionada, as outras são desmarcadas automaticamente. Para isso são usados botões de
rádio. Para que isso funcione, usam-se grupos. Isso é conseguido criando-se um controle de
grupo e adicionando-se todos os botões de radio.
Para saber se um botão de rádio está ou não selecionado pode-se usar isSelected.
Java básico 2
29
Borda
São usados para delimitar partes da interface, como diferentes grupos de rádio. Para isso,
pode-se seguir os seguintes passos:
1. Chame um método estático de BorderFactory para criar uma borda. Pode-se escolher
entre os seguintes estilos:
a. Relevo abaixado (lowered bevel)
b. Relevo destacado (raised bevel)
c. Entalhe (etched)
d. Linha (line)
e. Fosco (matte)
f. Vazio (empty)
2. Se quiser, adicione um título à borda, passando-o ao método
[Link](String).
3. Se você quiser experimentar de tudo, pode-se combinar bordas com
[Link]().
4. Adicione a borda resultante ao componente usando o método setBorder da classe
JComponent.
Por exemplo:
Listas
Listas são usadas para escolhas com várias opções. O Swing oferece um objeto muito
completo para se gerenciar esse tipo de lista, permitindo tanto strings quanto objetos
quaisquer.
O componente JList é usado para manter um conjunto de valores dentro de uma só caixa
para seleção, permitindo tanto seleções únicas quanto múltiplas. Exemplo:
Java básico 2
30
String[] words = {“quick”, “brown”, “hungry”, “wild”};
JList wordList = new JList(words);
As listas não possuem barra de rolagem automaticamente, para isso deve-se adicioná-la
dentro de um painel de rolagem:
Depois, deve-se adicionar o painel de rolagem, e não a lista, no painel que a conterá.
Para fazer com que um número definido de elementos seja mostrado a cada momento, usa-
se:
Por default a lista permite múltipla seleção, para usar seleção única, usa-se:
[Link](ListSelectionModel.SINGLE_SELECTION);
Por exemplo:
Java básico 2
31
Figura 16 – Exemplo jList.
Combos
É uma lista que fica escondida, e quando o usuário clica no campo, a lista se abre. Se a caixa
estiver configurada para ser editável, pode-se editar a seleção como se fosse uma caixa de
texto.
Esse método (addItem) adiciona a string no final da lista., pode-se também inserir em
qualquer lugar:
[Link](“Monospaced”, 0);
[Link](“Monospaced”);
[Link](0); // remove o primeiro item
[Link]();
Para tratar dos eventos, captura-se um evento de ação, logo, tratando-se o método
actionPerformed:
Java básico 2
32
Figura 17 – Exemplo jList.
Java básico 2
33
acionamento a alteração da resposta. Como opção ajustável, a janela deve exibir uma
mensagem de diálogo (com JOptionPane) com a indicação de acerto ou erro.
4. Escreva uma aplicação Swing Java que implemente uma sequência de questões a serem
apresentadas pela janela implementada no exercício 3. Esta aplicação deverá calcular e
escrever uma mensagem (JOptionPane) com o total de acertos e erros obtidos.
Menus
Não é necessário um gerenciador de layout para se colocar um menu numa janela. Sua
elaboração é direta:
Uma barra de menu pode ser colocada onde se queira, mas normalmente aparece na parte
superior do frame. Usa-se:
[Link](menuBar);
[Link](editMenu);
[Link](this);
Java básico 2
34
[Link](this);
[Link](item);
item = new JMenuItem(“Copy”);
[Link](this);
[Link](item);
item = new JMenuItem(“Paste”);
[Link](this);
[Link](item);
[Link](menu);
Quando se quer teclas de atalho, do tipo CTRL+S para salvar, isto é, para que itens de menu
sejam chamados, sem sequer abrir o menu onde estão, então usa-se setAccelerator.
[Link]([Link](KeyEvent.VK_O,
InputEvent.CTRL_MASK));
Para criar itens de menu usando botões de rádio e check boxes, usa-se outros objetos:
Java básico 2
35
[Link](true);
JRadioButtonMenuItem overtypeItem = new
JRadioButtonMenuItem(“Overtype”);
[Link](insertItem);
[Link](overtypeItem);
[Link](insertItem);
[Link](overtypeItem);
[Link](painel, x, y);
[Link](false);
Mas isso pode levar o código a ficar cheio de instruções lidando com os menus. Então pode-
se usar um tratador de eventos de menu. Existe o MenuListener, com três métodos:
Java básico 2
36
Figura 18 – Exemplo jList.
Caixas de Diálogo
São janelas pré-definidas que são usadas para informação para o usuário. Existem dois tipos:
modais que quando aparecem, o usuário não pode fazer mais nada antes de fechá-la e as não
modais que o usuário pode continuar o que está fazendo.
Para se criar uma janela de diálogo própria, como a janela sobre, deve-se derivar uma classe
de JDialog.
Java básico 2
37
Ordem de Travessia: Tab Order
Quando uma janela possui muitos componentes, deve-se pensar na ordem de travessia
desses componentes, isto é, a ordem na qual os componentes perdem e ganham o foco
enquanto o usuário pressiona TAB.
O Swing tenta percorrer esses elementos de uma forma coerente, de cima para baixo, da
esquerda para direita, pulando os rótulos. No Swing, a ordem de inserção dos elementos não
influencia no tab order, mas sim o layout usado.
O problema ocorre quando um contêiner contiver outros contêineres e assim por diante.
Quando o foco vai para outro contêiner, automaticamente ele é colocado no componente
mais acima e mais à esquerda desse contêiner, para depois percorrer os outros
componentes.
Para alterar essa ordem pode-se usar duas formas. A primeira é chamando:
[Link]();
Mas só funciona como resposta a um dado evento, isto é, não tem efeito permanente na
ordem de travessia.
[Link](size);
Que faz com que o próximo componente a receber o foco, depois do style seja o size.
Java básico 2
38
2. Escreva uma aplicação Swing Java que permita a construção de uma árvore com o
componente JTree. Uma caixa de texto JTextField deve fornecer os valores para os nós da
árvore. O primeiro nó adicionado constituirá sua raiz. A partir daí, os novos nós deverão
ser adicionados como filhos do nó que esteja selecionado na árvore no momento da nova
inserção. A inserção de um novo nó será feita por meio do clique num botão JButton.
Implemente também um botão para remover um nó que esteja selecionado. A exclusão
deverá excluir todos os nós filhos pertencentes ao nó selecionado quando do clique no
botão de exclusão.
Java básico 2
39
2
Applets – sessão 4
Exercício de nivelamento – Applets
Você já desenvolveu aplicações para internet? Que recurso e/ou linguagem de programação
você já utilizou para desenvolvimento?
Applets Java
subclasse
[Link] ou [Link]
Os Applets são aplicações java que utilizam recursos da máquina virtual java dentro de
navegadores web com algumas limitações de segurança.
Um applet é um programa em Java que é executado em um browser. Um applet pode ser uma
aplicação Java totalmente funcional, pois tem toda a API Java à sua disposição.
Existem algumas diferenças importantes entre um applet e uma aplicação Java standalone,
incluindo o seguinte:
Um método main () não é chamado em um applet, e uma classe do applet não vai definir
main ().
Java básico 2
40
Applets são projetados para ser incorporado em uma página HTML.
Quando um usuário visualiza uma página HTML que contém um applet, o código do
applet é baixado para a máquina do usuário.
A JVM é necessário para visualizar um applet. A JVM pode ser um plug-in do navegador da
Web ou um ambiente de tempo de execução separado.
A JVM na máquina do usuário cria uma instância da classe do applet e invoca vários
métodos durante a vida do applet.
Applets têm regras rígidas de segurança que são aplicadas pelo browser. A segurança de
um applet é muitas vezes referida como área de segurança, comparando o applet para
uma criança brincando em uma sandbox com várias regras que devem ser seguidas.
Outras classes que as necessidades de applets podem ser baixados em um único arquivo
Java Archive (JAR).
init(): Este método destina-se a qualquer inicialização é necessário para o seu applet. Ele
é chamado após as tags PARAM dentro da tag do APPLET foram processadas.
star(): Este método é chamado automaticamente após o navegador chama o método init.
Ele também é chamado sempre que o usuário retorna para a página que contém o applet
depois de ter ido para outras páginas.
stop(): Este método é chamado automaticamente quando o usuário navega para uma
página em que o applet não foi referenciado.
Antes de Java, você usava HTML (a linguagem de marcação de hipertexto) para descrever o
layout de uma página da Web. A HTML é simplesmente um veículo para indicar elementos de
uma página de hipertexto. Por exemplo, <TITLE> indica o título da página e todo texto após
essa tag se torna o título da página. Você indica o final do título com a tag </TITLE>.
Java básico 2
41
Um primeiro exemplo de Applet
A seguir apresentamos um código java simples que implementa um Applet que irá escrever a
mensagem “Primeiro exemplo de Applet Java” no browser quando a página html que ele
estiver inserido for acessada.
import [Link].*;
import [Link].*;
[Link];
[Link].
Sem essas declarações de importação, o compilador Java não reconheceria a classe Applet,
bem como os objetos visuais gráficos, que a classe do applet se refere.
A classe Applet
Cada applet é uma extensão da classe [Link] ou da classe
[Link]. A classe Applet base fornece métodos que uma classe Applet
derivada pode chamar para obter informações e serviços a partir do contexto browser. Estes
incluem métodos que fazem o seguinte:
Redimensionar o applet
Java básico 2
42
Além disso, a classe Applet fornece uma interface pela qual o usuário ou o navegador obtém
informações sobre o applet e controla sua execução. O usuário poderá:
inicializar o applet
destruir o applet
O applet apresentado no item 2.2 está completo, tal como está. O único método substituído é
o método de pintura paint().
A tag <applet> é a base para a incorporação de um applet em um arquivo HTML. Abaixo está
um exemplo que chama do applet implementado no item 2.2 no arquivo fonte
[Link]:
<html>
<title>The Hello, World Applet</title>
<hr>
<applet code="[Link]" width="320" height="120">
</applet>
<hr>
</html>
É necessário o atributo código do tag <applet>. Ele especifica a classe Applet para ser
executado. Também são necessários largura e altura para especificar o tamanho inicial do
painel em que um applet é executado. A directiva applet deve ser fechado com a tag
</applet>.
Java básico 2
43
Navegadores não-habilitados para Java não processam <applet> e </applet>. Portanto,
qualquer coisa que aparece entre as tags, não relacionada com o applet, é visível em
navegadores não-habilitados para Java.
<applet codebase="[Link]
code="[Link]" width="320" height="120">
<applet code="[Link]"
width="320" height="120">
A ideia básica de como usar applets em uma página Web é simples: a página HTML deve
dizer ao navegador quais applets deve carregar e, então, onde colocar cada applet na página
da Web. Como se poderia esperar, a tag necessária para usar um applet deve dizer ao
navegador o seguinte:
A exibição de um applet em uma página HTML pode ser feita com o uso da tag e “APPLET” e
pela tag “OBJECT”.
A maneira original de incorporar um applet Java era através de uma tag APPLET com
parâmetros que forneciam as informações listadas anteriormente. O W3 Consortium sugeriu
trocar para a tag OBJECT, mais versátil, e a antiga tag APPLET foi desaprovada na
especificação HTML 4.0. Os navegadores mais recentes reconhecerão as duas tags, mas você
deve lembrar que os navegadores mais antigos não reconhecerão.
Utilizaremos estas tags sempre que quisermos que o navegador recupere os arquivos de
classe da Internet (ou de um diretório na máquina do usuário) e executa o applet
automaticamente, usando sua máquina virtual Java.
Além do applet em si, a página da Web pode conter todos os outros elementos HTML que
você viu em uso nas páginas da Web: múltiplas fontes, listas com bullets, elementos gráficos,
links etc. Os applets são apenas uma parte da página de hipertexto. É sempre interessante
lembrar que a linguagem de programação Java não é uma ferramenta para projetar páginas
Java básico 2
44
HTML; ela é uma ferramenta para dar vida a elas. Isso não quer dizer que os elementos de
projeto de GUI em um applet Java não são importante, mas que eles devem trabalhar com (e,
na verdade, são subservientes a) o projeto HTML subjacente da página da Web.
VerificarParImparApplet obtém seus parâmetros no método init(). Ele também pode ter seus
parâmetros no método paint(). No entanto, obter os valores e salvar as configurações de uma
vez no início do applet, em vez de a cada atualização, é conveniente e eficiente.
O Applet Viewer ou o navegador chama o método init() de cada applet que é executado. O
usuário chama init() uma vez ao carregar a página html.
package visao;
import [Link];
import [Link];
import [Link];
/**
*
* @author Paulo Henrique Cayres
*/
public class VerificarParImparApplet extends JApplet {
setSize(250, 100);
JLabel lbl = new JLabel("Exemplo com passagem de
parâmetros",[Link]);
setLayout(new BorderLayout());
add(lbl,[Link]);
Java básico 2
45
if(num%2 == 0)
[Link](rootPane, num+"
é um número
par!","Mensagem",[Link].INFORMATION_MESSAGE);
else
[Link](rootPane, num+"
é um número
par!","Mensagem",[Link].INFORMATION_MESSAGE);
}
<HTML>
<HEAD>
<TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>
</BODY>
</HTML>
Os parâmetros especificados numa página html serão repassados ao applet que poderão
trata-los para executar alguma funcionalidade desejada. Durante a escrita do código java no
applet, o programador deverá se preocupar com a conversão dos parâmetros, que são
Strings, para o tipo necessário para utilização desta informação.
Java básico 2
46
Applets Java versus Aplicativos
Java possibilita a criação de dois grandes tipos de programas: um applet ou um aplicativo,
sendo que uma applet java é um programa que roda a partir de um browser web e um
aplicativo java, por sua vez, é um programa independente do browser que roda como um
programa isolado.
Uma vez que um applet é executado a partir de um browser Web, ela tem a vantagem de já
ter uma janela e a capacidade de responder aos eventos da interface com o usuário, por meio
do browser. Também pelo fato de as applets serem projetadas para uso em redes, Java é
muito mais restritivo nos tipos de acesso que as applets poderão ter no seu sistema de
arquivos do que com os aplicativos que não estão necessariamente rodando em rede.
Faça uma página HTML com a tag <APPLET></APPLET> apropriada para carregar o
código do applet.
Fornecer uma subclasse da classe JApplet. Esta subclasse deve ser declarada como
pública. Caso contrário, o applet não pode ser carregado.
Eliminar o método principal na aplicação. Não construa um Frame para a aplicação. A sua
aplicação será exibida dentro do navegador.
Mova qualquer código de inicialização do construtor para o método init() do applet. Você
não precisa construir explicitamente uma instância do objeto para o navegador. O applet
irá instancia-lo para você por meio de uma chamada ao método init(), quando você
solicitar o carregamento de uma página HTML que tenha referência a tag <APPLET>.
Retire a chamada para setDefaultCloseOperation(). Um applet não pode ser fechado. Sua
execução termina quando o usuário navega para uma próxima página ou fecha o
navegador.
Eliminar a chamada para o método setTitle(). Applets não pode ter barras de título. Você
pode, é claro, utilizar o título da própria página web, usando o título de tag HTML.
Java básico 2
47
Manipulação de eventos no Applet
Applets herdam um grupo de métodos da classe Container de manipulação de eventos. A
classe Container define vários métodos, tais como processKeyEvent processMouseEvent e,
para o tratamento de tipos particulares de acontecimentos, e, em seguida, um método
chamado processEvent todos catch.
package visao;
import [Link];
import [Link];
import [Link];
import [Link];
/**
*
* @author Paulo Henrique Cayres
*/
StringBuffer strBuffer;
Java básico 2
48
addItem("unloading the applet");
}
@Override
public void mouseClicked(MouseEvent e) {
addItem("mouse clicked! ");
}
@Override
public void mousePressed(MouseEvent e) {
@Override
public void mouseReleased(MouseEvent e) {
@Override
public void mouseEntered(MouseEvent e) {
addItem("mouse entered! ");
}
@Override
public void mouseExited(MouseEvent e) {
addItem("mouse exited! ");
}
Java básico 2
49
Exibindo imagens no Applet
Um applet pode exibir imagens no formato GIF, JPEG, BMP, e outros. Para exibir uma imagem
dentro do applet, você usa o método drawImage () encontrado na classe [Link]. O
exemplo abaixo implementa um applet com todos os passos necessários para visualizar
imagens:
package visao;
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
/**
*
* @author Paulo Henrique Cayres
*/
public class ExemploImgApplet extends JApplet {
context = [Link]();
String imageURL = [Link]("image");
if(imageURL == null)
{
imageURL = "[Link]";
}
try
{
URL url = new URL([Link](), imageURL);
[Link](url);
image = [Link](url);
}catch(MalformedURLException e)
{
[Link]();
// Display in browser status bar
[Link]("Could not load image!");
}
}
Java básico 2
50
public void paint(Graphics g)
{
[Link]("Displaying image");
[Link](image, [Link]()/2, [Link]()/2, 33,
34, null);
repaint();
}
public void play(): Reproduz o clipe de áudio uma vez, desde o início.
public void loop(): Faz com que o clipe de áudio seja reproduzido continuamente.
Para obter um objeto AudioClip, você deve chamar o método da classe Applet getAudioClip
(). O método getAudioClip () retorna imediatamente, ou não resolve o URL para um arquivo
de áudio real. O arquivo de áudio não é baixado até que seja feita uma tentativa de
reproduzir o clipe de áudio.
O mecanismo de som que reproduz os clipes de áudio suporta vários formatos de arquivo de
áudio, incluindo:
package visao;
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
/**
*
Java básico 2
51
* @author Paulo Henrique Cayres
*/
public class ExemploAudioApplet extends JApplet {
Java básico 2
52
Atividade 1 – Applets
1. Faça uma aplicação Java Applet que recebe como parâmetro de inicialização da página
HTML um número inteiro, calcule e escreva num JTextArea o resulta da tabuada do
número informado.
2. Faça uma aplicação Java Applet que possibilite a digitação de 3 números (JTextField) e
que mostre em uma mensagem (JOptionPane) com o maior números. A mensagem será
exibida quando o usuário clicar no botão (JButton) Mensagem. Após a visualização da
mensagem os campos de entrada de dados deverão ser limpos e o primeiro campo de
entrada de dados deverá receber o foco.
3. Utilizando o exemplo de definição de classes em Java, crie a classe de aplicação Pessoa
descrita abaixo. Os métodos seletores e modificadores deverão ser criados para cada um
de seus atributos.
Pessoa
String nome
int idade
Pessoa()
Pessoa(String, idade)
4. Construa uma Applet que apresente uma tela com campos de entrada de dados
(JTextField) para cada um dos atributos da classe Pessoa.
5. Implemente na interface do exercício 3 botões de ação (JButton) para possibilitar
inclusão, consulta e exclusão de objetos instanciados da classe Pessoa em um ArrayList.
A exclusão será realizada por meio do nome da Pessoa.
6. Implemente na interface do exercício 3 um JTextArea onde serão listados os objetos em
ordem alfabética. A ordenação será executada após clique num botão.
Java básico 2
53
Atividade 2 – GUI em Java (complementar)
1. Construa um Applet Java que apresente uma tela com uma campo de entrada de dados
(JTextField) para que o usuário possa informar um número inteiro. O Applet deverá
implementa um botão (JButton) que, quando clicado, informe se o número digitado é par
ou impar.
2. Construa um Applet Java que recebe um número inteiro positivo como parâmetro da
página html e calcule e escreva a tabuada deste número dentro de um JTextArea.
Java básico 2
54
Java básico 2
55
3
Tratamento de Erros – sessão 5
Exercício de nivelamento – Tratamento de erros
Você já desenvolveu alguma aplicação que utilizou tratamento de erros? Em que linguagem?
Tratamento de Erros
Erro de lógica
Os erros em Java são tratados como em C++, através de exceções. Em Java, todas as exceções
descendem de Throwable, mas a hierarquia se divide em Error e Exception.
Java básico 2
56
Conversão explícita de tipo (cast);
Tentar encontrar um objeto Class através de uma string que não denota uma classe
existente.
Essa informação das exceções é feita no cabeçalho dos métodos, por exemplo:
Java básico 2
57
Num erro de programação;
Se ocorrer um dos dois primeiros casos, então o programador deverá informar a quem usar o
método que ele levanta uma exceção. Caso contrário, se não tiver nenhum mecanismo para
tratar essas exceções, o programa termina a execução.
class Animation {
...
public Image loadImage(String s) throws IOException {
...
}
}
class Animation {
...
public Image loadImage(String s) throws EOFException,
MalFormedURLException {
...
}
}
Não se deve anunciar (throws) erros internos do Java (derivadas de Error) nem erros em
tempo de execução (RuntimeException), porque estão fora do alcance do programador.
Essas exceções são chamadas não verificadas (unchecked).
As exceções não verificadas não podem ser tratadas, e devem ser evitadas no programa,
através de verificações. Um método precisa declarar todas as exceções verificadas que ele
pode levantar.
Ou, se preferir:
Java básico 2
58
if (ch == -1) // encontrou EOF
throw new EOFException();
}
}
A EOFException também tem um outro construtor, que recebe uma string, que serve para
descrever a condição do erro mais detalhadamente. Exemplo:
Capturando Exceções
Para capturar exceções usa-se um bloco try...cath, com a seguinte construção:
try {
<Código que pode gerar erro>
}
catch(TipoExceção_1 e) {
<Manipulador da exceção tipo 1>
}
...
catch(TipoExceção_n e) {
<Manipulador da exceção tipo n>
}
finally {
<Código finalizador>
Java básico 2
59
}
Dentro do trecho try coloca-se o código que será executado e verificado por um
determinado erro. Se uma exceção ocorrer, ela será de um determinado tipo, e conforme o
tipo, a execução será desviada para um trecho catch que trata esse tipo de exceção. Pode-se
ter um ou mais trechos catch, conforme a necessidade.
O trecho finally é usado quando se deseja, por exemplo, liberar um recurso reservado por
um código que gerou exceção. O trecho de código que estiver aí dentro sempre será
executado, seja uma exceção tratada (catch) ou não. A cláusula finally pode ser usada
mesmo sem o catch, assim, se uma exceção foi levantada, o trecho finally é executado e
a exceção é relevantada.
Graphics g = [Link]();
try {
// código que pode gerar erros
}
catch(IOException e) {
// tratamento de erros
}
finally {
// libera recursos, mesmo se nenhuma exceção for levantada
[Link]();
}
Java básico 2
60
3. Crie uma classe de exceção que implemente o método toString() e retorne a mensagem
“Impossível converter. Favor informar apenas dígitos na entrada de dados”
4. Crie uma classe que implemente o método retornaDouble(String) que lança a exceção
implementada no enunciado 3 caso o String de entrada seja vazia.
5. Faça uma aplicação Java com uma interface que possibilite a digitação de um número e
que mostre em uma mensagem (JOptionPane) com resultado da multiplicação deste
número por 5. Utilize try-catch para tratar a exceção por meio do método de conversão
de String para double implementado no enunciado 4 para tratar a entrada de dados.
2. Faça uma aplicação Java com uma interface que possibilite a digitação de informações
para instanciar objetos da classe ContaCorrente (criada no enunciado anterior) e
armazenar num ArrayList.
3. Faça uma aplicação Java com uma interface que possibilite informar o número de uma
conta corrente e o valor com dois botões (JButton), sendo um para depósito e outro para
saque. O botão de saque deverá lançar uma exceção para tratar possível saldo negativo
em caso de saque de valores superiores ao saldo atual da conta.
4. Defina uma classe MyInput, contendo métodos estáticos abaixo (todos os métodos
devem retornar o tipo especificado), de forma que exceções sejam lançadas caso um
valor incorreto tenha sido fornecido pelo usuário.
Java básico 2
61
4
Controle de entrada e saída, streams e tratamento
de arquivos – sessão 6
Exercício de nivelamento – I/O
Você já desenvolveu alguma aplicação que utilizou manipulou arquivos em disco? Em que
linguagem? Trabalhou com gravação de objetos? Que recurso utilizou?
Pacote [Link]
Leitura/Escrita de Dados
Serialização de Objetos
Outros
Uma stream de I/O gera o caminho por meio do qual seus programas podem enviar uma
sequência de bytes de uma fonte até um destino. Uma stream de entrada é uma fonte (ou
produtor) de bytes e uma stream de saída é o destino (ou consumidor).
Todas as funções de I/O stream tratam os arquivos de dados ou os itens de dados como uma
corrente ou um fluxo (stream) de caracteres individuais. Se for escolhida uma função de
stream apropriada, a aplicação poderá processar dados em qualquer tamanho ou formato,
desde simples caracteres até estruturas de dados grandes e complicadas. Tecnicamente
Java básico 2
62
falando, quando um programa usa uma função stream para abrir um arquivo para I/O, o
arquivo que foi aberto é associado com uma estrutura do tipo FILE que contém informações
básicas sobre o arquivo.
Uma vez aberta a stream, é retornado um ponteiro para a estrutura FILE. Este ponteiro FILE
– algumas vezes chamado de ponteiro stream ou stream – é usado para fazer referência ao
arquivo para todas as entradas/saídas subseqüentes.
Todas as funções de I/O stream fornecem entrada e saída bufferizada, formatada ou não
formatada. Uma stream bufferizada proporciona uma localização de armazenamento
intermediária para todas as informações que são provenientes de stream e toda saída que
está sendo enviada a stream. I/O em disco é uma operação que toma tempo, mas a
bufferização da stream agilizará sua aplicação. Ao invés de introduzir os dados stream, um
caractere ou uma estrutura a cada vez, as funções I/O stream acessam os dados em um bloco
de cada vez.
À medida que a aplicação necessita processar a entrada, ela simplesmente acessa o buffer, o
que é um processo muito mais rápido. Quando o buffer estiver vazio, será acessado um novo
bloco de disco. O inverso também é verdadeiro para saída stream. Ao invés de colocar
fisicamente na saída todos os dados, à medida que é executada a instrução de saída, as
funções de I/O stream colocam todos os dados de saída no buffer. Quando o buffer estiver
cheio, os dados serão escritos no disco.
Dependendo da linguagem de alto nível que estiver sendo utilizada, pode ocorrer um
problema de I/O bufferizado. Por exemplo, se o programa executar várias instruções de saída
que não preencham o buffer de saída, condição necessária para que ele fosse descarregado
no disco, aquelas informações serão perdidas quando terminar o processamento de
programa.
A solução geralmente envolve a chamada de uma função apropriada para “limpar” o buffer. É
claro que uma aplicação bem escrita não deverá ficar dependendo destes recursos
automáticos, mas deverá sempre detalhar explicitamente cada ação que o programa deve
tomar. Mais uma observação: se a aplicação terminar de maneira anormal quando se estiver
usando stream I/O, os buffers de saída podem não ser esgotados (limpos), resultando em
perda de dados.
O último tipo de entrada e saída é chamado “low-level I/O” – I/O de baixo nível. Nenhuma
das funções de I/O de baixo nível executa bufferização e formatação. Ao invés disso, elas
chamam diretamente os recursos de I/O do sistema operacional. Estas rotinas permitem
acessar arquivos e dispositivos periféricos em um nível mais básico do que as funções
stream.
Java básico 2
63
Como as funções stream são bufferizadas e as funções de baixo nível não, a tentativa de
acessar o mesmo arquivo ou dispositivo por dois métodos diferentes leva à confusão e à
eventual perda de dados nos buffers.
Stream em Java
As bibliotecas Java para I/O ([Link] e [Link]) oferecem numerosas classes de stream. Mas
todas as classes de stream de entrada são subclasses da classe abstrata InputStream, e todas
as classes stream de saída são subclasses da classe abstrata OutputStream. A figura abaixo
ilustra a hierarquia de classes do pacote [Link].
Somente objetos que implementem essas interface podem ser “desintegrados” em bytes, ou
“integrados” a partir dos bytes. A interface Externalizable, por exemplo, deve implementar os
Java básico 2
64
métodos writeExternal e readExternal. As variáveis serão salvas ou lidas por esses métodos.
Essas duas chamadas recebem uma classe do tipo ObjectOutput e ObjectInput,
respectivamente. O principal método da classe ObjectOutput é writeObject e o da classe
ObjectInput é o readObject.
O código abaixo ilustra a utilização dos métodos writeInt() e writeDouble() utilizados para
gravação de bytes de um arquivo informado pelo usuário.
import [Link].*;
Java básico 2
65
quant = [Link](a[1]);
} catch (Exception e) {
[Link]("Usando quantidade default 10");
}
// gera quantidade indicada de valores aleatórios
try {
[Link]("Gerando conteudo...");
for(int i=0; i<quant; i++) {
[Link](i);
double aux = [Link]();
[Link](aux);
[Link]("#" + i + " : " + aux);
}
[Link]();
[Link]("Arquivo '" + a[0] + "' fechado.");
} catch(Exception e) {
[Link](e);
}
}
}
Da mesma forma a classe abstrata InputStream contém definições de métodos read para
leitura de bytes de um arquivo. O método de leitura de byte é abstrato, devendo ser
redefinido em subclasses, como FileInputStream.
O código abaixo ilustra a utilização dos métodos readInt() e readDouble() utilizados para
leitura de bytes de um arquivo informado pelo usuário.
import [Link].*;
Java básico 2
66
try {
[Link]("--- Conteudo ---");
while([Link]()>0) {
int i = [Link]();
double aux = [Link]();
[Link]("#" + i + " : " + aux);
}
[Link]("--- Conteudo ---");
[Link]();
[Link]("Arquivo '" + a[0] + "' fechado.");
} catch(IOException e) {
[Link](e);
}
}
}
Serialização de Objetos
A serialização é um mecanismo que permite transformar um objeto em uma sequência de
bytes, a qual pode ser restaurada, em um momento posterior, em um objeto idêntico ao
original.
Note que, para um objeto ser serializado, sua classe deve implementar a interface
Serializable, que não exige a implementação de qualquer método, servindo apenas como uma
tag interface (marcação) que autoriza a serialização.
import [Link].*;
Java básico 2
67
}
Depois de instanciar objetos da classe produto nós podemos ter uma aplicação Java que
possibilite a serialização destes objetos e gravá-los em um arquivo em disco.
import [Link].*;
import [Link].*;
Por fim, podemos realizar o processo inverso através da leitura de uma sequência de bytes
de um arquivo em disco, que representa um objeto, e desserializá-la para que possamos
novamente ter um objeto instanciado da classe produto em uma aplicação Java.
Java básico 2
68
Exercícios de Fixação 6 – Java I/O
Qual a diferença entre lançar uma exceção e capturar uma exceção?
Java básico 2
69
2. Atividade 2 – Java I/O (complementar)
1. Uma indústria deseja manter um banco de dados sobre a folha de pagamento mensal de
seus funcionários. Para isso, é lido de cada funcionário: o nome, o salário-base e uma
categoria funcional (numérica: 1-operário, 2-administrativo ou 3-gerência). Os dados
devem ficar armazenados em um arquivo ([Link]) e a cada vez que for solicitado, o
contra-cheque de um funcionário deve ser exibido, com as seguintes informações: nome
do funcionário, salário bruto (se da categoria 1, o próprio salário-base; se da categoria
2, o salário-base + 5%; se da categoria 3, o salário-base + 15%), descontos (se salário
bruto maior ou igual a 1000, 3% sobre o salário bruto; caso contrário, 1% sobre o salário
bruto) e salário líquido (salário bruto – descontos). Desenvolva um aplicação GUI em
Java que apresente as seguintes opções:
a) Incluir (solicitação dos dados de um funcionário e gravação de um registro
com os dados da folha de pagamento no arquivo)
Java básico 2
70
Java básico 2
71
5
JDBC – sessão 7, 8 e 9
Exercício de nivelamento – JDBC
Você já desenvolveu alguma aplicação que utilizou acesso a banco de dados? Em que
linguagem? Que banco de dados utilizou?
JDBC
O que é JDBC
Arquitetura e API
Drivers
Classes especializadas
JDBC (Java Database Conenctivity) é a API padrão para conectividade de bancos de dados, tais
como banco de dados SQL e outras fontes de dados tabulares, como planilhas e arquivos
simples, com a linguagem de programação Java.
JDBC fornece em sua API um conjunto de classes genéricas para acesso a qualquer tipo de
banco de dados baseado em SQL.
Java básico 2
72
Figura 21 – JDBC Driver.
O JDBC está no pacote [Link].*. Pode ser encontrado no site da Oracle. A instalação do
J2SE já trás consigo o JDBC.
Além disso, precisa-se de um driver para acesso ao banco de dados que se quer. Atualmente
os drivers de acesso a banco de dados para aplicações desenvolvidas em java estão
disponíveis no site do fornecedor do SGBD que você necessita acessar. Por exemplo, para
acesso ao PostgreSQL, usa-se o driver JDBC para PostgreSQL. O driver deve ser colocado no
CLASSPATH do projeto para que possa ser referenciado.
Além de acessos usando-se drivers, pode-se usar uma ponte que vai desde o JDBC ao ODBC,
para acesso de bases Win32.
Java básico 2
73
A arquitetura JDBC pode ser melhor visualizada na seguinte figura:
Exemplo de Acesso
Segue um exemplo de acesso a um banco de dados PostgreSQL. Perceba que a variável
strDriver deve conter o nome da classe do driver, para que possa ser registrada, e url deve
conter a localização do banco de dados. Essa separação e maneira com a que foi
implementada permite que se possa colocá-las num arquivo de configuração, tornando assim
fácil a alteração, se a plataforma mudar.
Java básico 2
74
rs = [Link]("select * from tb_cliente");
while ([Link]()) {
[Link]([Link]("nome_cliente"));
}
[Link]();
[Link]();
}
catch(Exception e) {
[Link]([Link]());
}
}
Para acessar a mesma base de dados usando uma ponte ODBC pode-se alterar somente o
seguinte na função acima:
url = "jdbc:odbc:banco_cliente";
strDriver = "[Link]";
Obtendo Conexões
Para obter uma conexão como banco de dados usa-se o método:
Onde url é o endereço do servidor de banco de dados, user é o usuário de conexão e pwd
sua senha. Esse método retorna um objeto da classe Connection. Caso algum erro ocorra,
uma exceção será levantada.
Executando Consultas
Para executar uma consulta simples (select) deve-se ter um objeto da classe Statement, e
deste objeto chamar o método executeQuery. Para se conseguir um Statement, usa-se
createStatement da conexão:
st = [Link]();
rs = [Link]("select * from tb_cliente");
Java básico 2
75
Sessão 07 – JDBC
Java básico 2
76
3. Mostre o primeiro nome e endereço de todos os empregados que trabalham para o
departamento ‘Pesquisa’.
5. Faça uma lista dos números e nomes de projetos que envolvam um empregado cujo
último nome seja ‘Will’, mesmo que esse trabalhador seja o gerente do departamento
que controla o projeto.
7. Encontre o nome dos empregados que trabalham em todos os projetos controlados pelo
departamento número 5.
8. Para cada projeto, liste o nome do projeto e o total de horas por semana (de todos os
empregados) gastas no projeto.
10. Recupere os nomes de todos os empregados que não trabalham em nenhum projeto.
Java básico 2
77
11. Recupere a média salarial de todos os empregados do sexo feminino.
12. Para cada departamento, recupere o nome do departamento e a média salarial de todos
os empregados que trabalham nesse departamento.
Executando Alterações
Para executar alterações no banco, como inserts, updates, criação de tabelas, usa-se:
st = [Link]();
[Link]("create table teste (cod int, nome char(50))");
Esse método não retorna resultado, somente gera exceção caso haja erro.
Recuperando Resultados
Os resultados de uma consulta ficam armazenados num objeto da classe ResultSet. Para
buscar a primeira linha de resultados executa-se:
[Link]()
Se essa chamada retornar false é porque não existem mais registros, caso contrário, um
registro foi recuperado.
Para recuperar os dados (campos) de um registro, usa-se a variedade das funções get* do
ResultSet. Por exemplo:
As strings passadas como parâmetro para as funções são os nomes dos campos. Pode-se
passar também o índice do campo (0, 1, 2, ...), mas claro, o nome é muito mais legível.
Com essas funções também se pode ler toda uma grande variedade de dados, como longs,
datas, etc.
Java básico 2
78
Instruções Preparadas
Instruções preparadas permitem pré-compilar uma instrução para depois poder executá-la
mais de uma vez, com uma performance melhor.
Repare que há dois pontos de interrogação (?) na instrução. Isso são parâmetros da
instrução, que devem ser preenchidos antes da sua execução:
[Link](1, 1);
[Link](2, “Camila”);
[Link]();
[Link]();
Sessão 08 – JDBC
Java básico 2
79
Atividade 1 – Java JDBC
1. Uma indústria deseja manter um banco de dados sobre a folha de pagamento mensal de
seus funcionários. Para isso, é lido de cada funcionário: o nome, o salário-base e uma
categoria funcional (numérica: 1-operário, 2-administrativo ou 3-gerência). Os dados
devem ficar armazenados em uma tabela no PostgreSQL e a cada vez que for solicitado, o
contra-cheque de um funcionário deve ser exibido, com as seguintes informações: nome
do funcionário, salário bruto (se da categoria 1, o próprio salário-base; se da categoria
2, o salário-base + 5%; se da categoria 3, o salário-base + 15%), descontos (se salário
bruto maior ou igual a 1000, 3% sobre o salário bruto; caso contrário, 1% sobre o salário
bruto) e salário líquido (salário bruto – descontos). Desenvolva uma aplicação GUI em
Java que apresente as seguintes opções:
1. Defina um novo banco de dados no PostgreSQL que deverá possuir três tabelas. A
primeira, denominada DEPARTAMENTO, deverá conter o código (valor inteiro) e seu
nome (literal). A segunda, denominada OCUPAÇÃO, deverá conter o código (valor
inteiro) e sua descrição (literal). A terceira, denominada FUNCIONÁRIO, deverá conter o
número de registro do funcionário (valor inteiro), o nome (literal), o código de ocupação,
o código do departamento em que esta lotado.
Java básico 2
80
Os dados das tabelas relacionadas deverão estar acessíveis em
objetos JComboBox;
d) Implementar uma classe executável que disponibilize um Menu
com opções de acesso para as telas implementadas nos itens a, b e
c.
Stored Procedures
São procedimentos armazenados no banco de dados, prontas para execução, que podem ou
não ter parâmetros, e também podem ou não ter algum resultado.
Para isso, usa-se a classe CallabeStatement. Supondo que exista uma stored procedure
no nosso banco, chamada: sp_teste, que recebe dois parâmetros, um código de entrada e um
nome de saída. Para chamá-la, faz-se:
Quando se quer que a Stored Procedure retorne um valor, sem ser um parâmetro de retorno,
a sintaxe da string dentro do prepareCall é:
{?= call [,, ...]}
Fechando Recursos
Depois de usados, as conexões, Statemets e ResultSets devem ser fechadas:
[Link]();
[Link]();
[Link]();
[Link]();
[Link]();
Transações
Uma transação é um conjunto de um ou mais comandos que são executados, completados e
então validados (commit) ou cancelados (rollback). Quando uma transação é validada ou
cancelada, uma outra transação se inicia.
Java básico 2
81
A conexão em java é, por default, auto-commit. Isso significa que sempre que um comando é
executado, um commit é executado no banco de dados. Se o comando auto-commit for
desabilitado, então deve-se fazer explicitamente o commit ou rollback das transações. A
maioria dos drivers JDBC suportam transações.
Um exemplo de código:
[Link](false);
Statement st = [Link]();
....
[Link]();
[Link](true);
Execução em Batch
É usado quando se tem muitas atualizações para serem feitas no banco de dados. Muitas
vezes, atualizações em batch são mais rápidas do que atualizações feitas uma a uma.
Exemplo:
[Link](false);
Statement stmt = [Link]();
A linha:
[Link](false);
é usada para desabilitar o auto-commit da conexão. Isso é usado para que não aconteçam
erros imprevistos na execução do batch.
Java básico 2
82
A linha:
executa todos os comandos que foram inseridos com addBatch, na ordem em que foram
inseridos. Quando terminados, esse método retorna, para cada um dos comandos, a
quantidade de linhas afetas por eles (por isso que retorna um array de inteiros). Como o
auto-commit foi desligado, deve-se explicitamente efetuar o commit.
Sessão 09 – JDBC
Liste as principais recursos que você consegue identificar que sejam necessários para o
desenvolvimento de aplicações java que possibilitem acesso a banco de dados?
Java básico 2
83
2.2.2. Classes DAO que irão possibilitar o acesso ao banco de dados para manutenção
de registros das tabelas implementadas no banco de dados da aplicação;
2.2.3. Menu principal que possibilite acesso as telas para manutenção de registros da
tabela produto, fornecedor e também para relação entre produto-fornecedor;
2.2.4. Tela que possibilite a manutenção de dados de produtos (inclusão, alteração,
consulta, exclusão).
2.2.5. Tela que possibilite a manutenção de dados de fornecedores (inclusão,
alteração, consulta, exclusão).
2.2.6. Tela que possibilite, através de cliques em botões, a visualização dos
resultados das seguintes consultas SQL:
[Link]. A média geral da quantidade em estoque dos produtos da empresa;
[Link]. O nome e o contato do fornecedor do produto que tem o menor preço de
venda;
[Link]. O nome do produto que tem o maior preço de compra, juntamente com
seu fornecedor e contato;
[Link]. Para cada fornecedor, o total de produto que ele fornece;
[Link]. A média dos preços de compra de cada um dos fornecedores
[Link]. O total em R$ dos produtos armazenados na empresa, tendo como base
o preço de compra.
1. Uma indústria deseja manter um banco de dados sobre a folha de pagamento mensal de
seus funcionários. Para isso, é lido de cada funcionário: o nome, o salário-base e uma
categoria funcional (numérica: 1-operário, 2-administrativo ou 3-gerência). Os dados
devem ficar armazenados em uma tabela no PostgreSQL e a cada vez que for solicitado, o
contracheque de um funcionário deve ser exibido, com as seguintes informações: nome
do funcionário, salário bruto (se da categoria 1, o próprio salário-base; se da categoria
2, o salário-base + 5%; se da categoria 3, o salário-base + 15%), descontos (se salário
bruto maior ou igual a 1000, 3% sobre o salário bruto; caso contrário, 1% sobre o salário
bruto) e salário líquido (salário bruto – descontos). Desenvolva um aplicação GUI em
Java que apresente as seguintes opções:
Java básico 2
84
menos tempo está em 1º lugar) e é feita da seguinte maneira: 1º colocado: 5 pontos, 2º
colocado: 3 pontos e 3º colocado: 1 ponto. Essa pontuação é atualizada na pontuação
geral do campeonato. Desenvolva uma aplicação GUI em Java que apresente as seguintes
opções:
a) Inclusão dos dados (solicitação dos dados de um atleta e gravação
de um registro no arquivo)
b) Classificação (leitura dos dados dos atletas e processamento dos tempos e
pontos)
Java básico 2
85
6
Threads – sessão 10
Exercício de nivelamento – JDBC
Você já desenvolveu alguma aplicação que utilizou acesso a banco de dados? Em que
linguagem? Que banco de dados utilizou?
O que é Thread?
Threads em Java
Prioridades de Threads
Sincronização
Programação concorrente
Toda thread tem uma prioridade. As que possuem alta prioridade são executadas
preferencialmente àquelas com baixa prioridade. Quando um código rodando em alguma
thread cria um novo objeto Thread, este terá sua prioridade inicialmente configurada igual à
thread que o criou.
Existem dois tipos de threads: daemon e user. As threads daemon são do sistema e user são
as criadas pelo usuário.
Java básico 2
86
Quando JVM inicia, existe usualmente uma thread do usuário, que tipicamente chama o
método main de alguma classe. O JVM continua a execução até:
Todas as threads que não são daemon tenham terminado, ou retornando da chamada run,
ou levantando uma exceção que se propaga até o método run.
O que são?
Uma perspectiva simples, mais útil, de um computador é a de que ele possui uma CPU, que
realiza a computação, uma ROM, que contém o programa que a CPU executa, e uma RAM, que
armazena os dados em que o programa opera. Nessa perspectiva simples, somente um
trabalho é realizado por vez. Uma perspectiva mais completa da maioria dos sistemas de
computação modernos permite a possibilidade de um ou mais trabalhos realizados ao
mesmo tempo, ao menos, aparentemente.
Java básico 2
87
Na tecnologia Java, os threads normalmente são preemptivos, mas não necessariamente
fracionados no tempo, (é um erro comum acreditar que preemptivo seja uma palavra
sofisticada para "fracionada no tempo"). O modelo de um programador preemptivo
estabelece que vários threads podem estar prontos para execução, mas somente um está
efetivamente sendo executado.
Esse processo continua a ser executado até que ele não seja mais executável ou que outro
processo de prioridade maior se torne executável. Nesse caso, dizemos que o thread de
menor prioridade é precedido pelo thread de maior prioridade.
Um thread pode deixar de estar pronto por uma série de motivos. Ele pode executar uma
chamada a [Link](), que solicita deliberadamente uma pausa por um período, ou pode
precisar aguardar um dispositivo externo mais lento, como uma unidade de disco ou de uma
interação com o usuário.
Todos os threads executáveis, mas não executados, são mantidos em filas segundo as
respectivas prioridades. O primeiro thread da fila de maior prioridade que não estiver vazia
será executado. Quando um thread para de ser executado por causa de uma precedência, ele
é tirado do estado de execução e é colocado no fim da fila de espera.
Pelo fato dos threads em Java não dividirem necessariamente o tempo, na ausência de uma
compreensão mais avançada e para tornar a estrutura do programa mais adequada, você
deve garantir que o código dos seus threads dê chance a outros threads de serem executados
de tempos em tempos. Como mostrado no exemplo a seguir, isso pode ser obtido emitindo a
chamada sleep() em intervalos, como um laço principal.
Java básico 2
88
1 public class xyz implements Runnable {
2 public void run() {
3 while (true) {
4 // faz várias coisas interessantes
5 ...
6 // Dá oportunidade a outros threads
7 try {
8 [Link](10);
9 } catch (InterruptedException e) {
10 // Esse thread foi interrompido por outro
11 }
12 }
13 }
14 }
Observe a utilização de try e catch. Observe também que a chamada sleep() é um método
static na classe Thread, e por isso é referida como [Link](x). O argumento especifica o
número de milissegundos que o thread deve permanecer inativo. A execução do thread não
será retomada até o fim desse período e mais algum tempo para que outros threads sejam
bloqueados, permitindo que esse thread realmente inicie.
Outro método na classe Thread, o yield(), pode ser emitido para dar oportunidade a outros
threads de serem executados sem interromper efetivamente o thread atual, a menos que seja
necessário. Se outros threads de mesma prioridade forem executáveis, yield() coloca o
thread chamador no fim da respectiva fila executável e permite que outro thread inicie. Se
nenhum outro thread for executável com a mesma prioridade, yield() não atuará.
É importante observar que uma chamada sleep() pode conceder a threads de menor
prioridade uma oportunidade de serem executados. O método yield() só dá a mesma
oportunidade a threads de mesma prioridade.
Quando um thread retorna do fim do respectivo método run(), ele morre. Em seguida, ele
não pode ser executado novamente.
O método stop() pode ser emitido para forçar a parada de um thread. Deve ser utilizado em
uma instância específica da classe Thread. Na linha 11 do exemplo abaixo, o thread t é
forçado a parar.
Java básico 2
89
Em um determinado trecho de código, é possível obter uma referência ao thread atual
utilizando o método currentThread() do Thread estático, como mostrado no próximo
exemplo na linha 6.
1 public class xyz implements Runnable {
2 public void run() {
3 while (true) {
4 // várias coisas interessantes
5 if (time_to_die)
6 [Link]().stop();
7 }
8 }
9 }
Observe que, nesse caso, a execução de stop() destruirá o contexto de execução atual e,
portanto, o laço run() não será mais executado nesse contexto.
Teste de um Thread
Às vezes, é possível para um thread estar em um estado desconhecido (isso pode ocorrer se o
código não estiver controlando diretamente um determinado thread). É possível descobrir se
um thread ainda é viável através do método isAlive().
Estar vivo não implica que o thread esteja sendo executado. Apenas indica que ele foi
iniciado e não foi interrompido por meio de stop(), nem atingiu o fim do método run().
Suspendendo Threads
Existem vários mecanismos capazes de interromper a execução de um thread
temporariamente. Após esse tipo de suspensão, a execução pode ser retomada como se nada
tivesse acontecido. O thread aparenta simplesmente ter executado uma instrução muito
devagar.
O método sleep() foi introduzido anteriormente e é utilizado para pausar um thread por um
período de tempo. Lembre-se de que, normalmente, o thread não é retomado no instante em
que o período de inatividade termina, pois é provável que outro thread esteja sendo
executado nesse instante e não possa ser desprogramado, a menos que: a) o thread reativado
seja de prioridade superior; b) o thread que está sendo executado seja bloqueado por algum
motivo; ou c) a divisão do tempo esteja habilitada. Na maioria dos casos, nenhuma das duas
últimas condições prevalece imediatamente.
Observe que, em geral, um thread pode ser suspenso por qualquer trecho de código que
possua um handle do thread – ou seja, uma variável que o referencie.
Obviamente, contudo, o thread só pode ser reiniciado por outro thread que não seja o
próprio, pois o thread suspenso não está executando nenhum código.
Java básico 2
90
1 public class xyz implements Runnable {
2 public void run() {
3 // faz várias coisas interessantes...
4
5 // aguarda até receber ordem para continuar
6 [Link]().suspend ();
7 // faz mais coisas...
8 }
9 }
--------------------------------------------------------------------------------
10 ...
11 Runnable r = new xyz();
12 Thread t = new Thread(r);
13 [Link]();
14 // pausa para xyz ser executado por um momento
15 // pressupor que atinge seu suspend()...
16 [Link](1000);
17
18 // torna xyz executável novamente
19 [Link]();
20
21 // executa efetivamente
22 [Link]();
Além dos métodos speep(), suspend() e resume(), um outro método pode ser utilizado para
interromper a execução de um thread temporariamente, o método join().
O método join() faz com que o thread atual aguarde o término do thread em que o método
join foi chamado. Como mostrado no exemplo a seguir, a chamada a join() na linha 6 provoca
a espera do thread atual até que TimerThread tt termine.
Como mostrado na linha 6 do exemplo a seguir, join() também pode ser chamado com um
valor de tempo de espera em milissegundos. O método join() suspenderá o thread atual pelo
número de milissegundos do tempo de espera ou até que o thread tt termine, o que ocorrer
primeiro.
Java básico 2
91
Implementar Runnable Versus Estender Thread
Dadas às possibilidades de criação de threads, como decidir entre elas? Há alguns pontos a
favor de cada técnica:
Como a tecnologia Java só permite uma única herança, não é possível estender
nenhuma outra classe, como Applet, se Thread já foi estendida. Em algumas
situações, essa limitação forçará a utilização do método da implementação de
Runnable.
Como às vezes é obrigatório implementar Runnable, você pode preferir fazer sempre
dessa forma, por uma questão de consistência.
Quando um método de execução está incorporado a uma classe que estende a classe
Thread, a referência this refere-se efetivamente à instância de Thread que está
realmente controlando a execução. Por isso, o código não precisa mais utilizar
controles longos como [Link]().suspend();. Pode,
simplesmente, utilizar suspend();
Como o código resultante é ligeiramente mais simples, muitos programadores Java utilizam o
mecanismo de estender o thread. Tenha em mente, entretanto, que o modelo de herança
única pode resultar em dificuldades posteriores no ciclo de vida do código, caso você adote
essa técnica.
Na tecnologia Java, a CPU é representada pela classe Thread. Quando um thread é construído,
são passados, através dos argumentos do construtor, o código que deve executar e os dados
que devem ser trabalhados.
É importante observar que esses três aspectos são efetivamente independentes. Um thread
pode executar um código diferente do código de outro thread. Um thread pode ter acesso aos
mesmos dados de outro thread ou não.
Java básico 2
92
Figura 09 – As três partes de um thread.
Uma dos exemplos mais contundentes de uma aplicação multithread é um browser web.
Como você sabe, a maior parte dos browsers permite que você abra mais de uma janela e
descarregue vários arquivos ao mesmo tempo. Para permitir que você execute várias tarefas
dessa maneira, o browser utiliza as nultithreds.
1 Embora o termo thread venha sendo traduzido por “fluxo de execução”, preferimos mantê-
Java básico 2
93
Esta primeira forma não é possível de implementação caso a sua classe já herde de qualquer
outra classe que não a classe Thread. Isso poderá ocorrer uma vez que Java não permite
herança múltipla. A solução é implementar a interface Runnable, que é o segundo método de
criação de um thread. Lembre-se que de interfaces são o modo de Java proporcionar as
vantagens da herança múltipla.
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ [Link](0);
}
} );
Container c = getContentPane();
[Link](new GridLayout(2, 3));
[Link](new ClockCanvas("Brasil", "GMT-2"));
[Link](new ClockCanvas("Taipei", "GMT+8"));
[Link](new ClockCanvas("Berlin", "GMT+1"));
[Link](new ClockCanvas("New York", "GMT-5"));
[Link](new ClockCanvas("Cairo", "GMT+2"));
[Link](new ClockCanvas("Bombay", "GMT+5"));
}
}
interface TimerListener
{ void timeElapsed(Timer t);
}
Java básico 2
94
}
Java básico 2
95
3. Mova o resultado do atualizado saldo da conta corrente para a variável em memória
O problema é que, durante a execução de uma das threads, por exemplo, a primeira, esta
conseguisse executar apenas as etapas 1 e 2, sendo interrompida logo a seguir. Neste ponto
uma segunda thread iniciaria a sua execução e modificaria os valores de entrada para a
primeira thread. Quando a primeira thread voltar a ser executada, o total monetário para o
saldo da conta corrente não estaria mais correto, gerando problemas de consistências de
dados manipulados pela aplicação desenvolvida.
Para que esse tipo de problema não ocorra, devemos ter alguma garantia de que, quando
uma thread começar a inserir um elemento no buffer, ela poderá completar a operação sem
ser interrompida. A maioria dos ambientes de programação forçam os programadores a
mexer com os chamados semáforos e regiões críticas para obter acesso sem interrupção a
um recurso. Já a linguagem de programação Java disponibiliza um recurso inspirado nos
monitores inventados por Tony Hoare. Para tanto, basta que qualquer operação
compartilhada por várias threads seja marcada como synchronized, da seguinte forma:
Public synchronized void transferir_saldo(int de, int para, int quantia){
//implementar funcionalidades do método
}
Com isso, a aplicação desenvolvida em Java consegue garantir que, qualquer thread que
inicie a execução de um método sincronizado conclua a sua execução ante que outra thread
passe executar o mesmo método sobre o mesmo objeto. O método sincronizado desativa
automaticamente a chamada da segunda thread e fica em espera até que o método seja
liberado para execução. Essa espera ocorre numa fila de espera onde são colocadas as
threads que estão esperando para manipular o objeto que está sendo utilizado através de
métodos sincronizados. Esta fila obedece a uma ordem de prioridade existente dentre as
threads que se encontram nela.
Em java, os responsáveis por bloquear e notificar quando um objeto está disponível são os
objetos monitores. Esses objetos são instâncias de classes que implementam um ou mais
métodos sincronizados.
O problema é que existem aplicações que possam querer que threads que estejam com
acesso exclusivo a um determinado objeto de uma aplicação seja interrompida para que os
valores de terminados atributos satisfaçam as necessidades da aplicação (por exemplo, só
transferir saldo entre contas se a conta de origem tiver saldo suficiente). Para tanto, torna-se
necessário o uso do método wait().
Quando uma thread chama o método wait() dentro de um método sincronizado, ela é
desativada sendo colocada na fila de espera para o objeto em questão. Com isso, outras
threads passaram a ter acesso ao objeto. Com isso, esperasse que dentro de um determinado
tempo de execução da aplicação o objeto passe a ter saldo suficiente para executar a
transferência e, através do método notify() o java desperta a thread original que esperava
pela chance de executar sua funcionalidade.
O ponto a se considerar é que o método notify() deverá ser chamado por alguma outra
thread que esteja trabalhando sobre o objeto em questão, pois as threads em espera não são
Java básico 2
96
ativadas automaticamente quando nenhuma outra thread está trabalhando no objeto. Como
resultado de implementação teríamos o teste de condição e ação de transferência dentro do
mesmo método synchronized, como mostrado abaixo:
Public synchronized void transferir_saldo(int de, int para, int quantia){
While(saldo < quantia){
Wait();
}
//transferir fundos
}
Java básico 2
97
Exercícios de Fixação 10 – Thread
Os comandos a seguir estão corretos ou não? Justifique.
Atividade 1 – Thread
1. Escreva um programa que instancie e inicie duas threads: uma que conta até 10 e outra
que conta até 20, através do método construtor.
2. Implemente uma classe Fila cujos métodos acrescentar e remover são sincronizados. O
tamanho da fila é 10. Forneça uma thread, chamada produtor, que insira um dado de
valor aleatório (de 1 a 50) continuamente. Quando a fila ficar cheia, a thread espera.
Forneça uma segunda thread, chamada consumidor, que remova um dado da fila e
imprima seu valor continuamente, contanto que a fila não esteja vazia. Quando a fila
estiver vazia, a thread espera. Tanto a thread consumidor quanto a produtor devem
executar 50 iterações.
3. Fazer um programa em Java que implemente uma classe Java que possibilite a instância
de objetos da classe Pessoa (nome, idade e sexo) e posterior gravação dos mesmos num
arquivo em disco. Os objetos instanciados deverão ser ativados com tempos aleatórios
de pausa e possibilitar a gravação dos mesmos em arquivo.
4. Fazer um programa em Java que implemente métodos de leitura e cálculos serializados
para objetos de consulta distintos que serão ativados através de uma interface JFrame
que irão consultar o arquivo gerado no exercício 2 para calcular e responder o total de
pessoas do sexo feminino e a média geral de idades das pessoas cadastradas.
Java básico 2
98
Atividade 2 – Thread
1. Construa, na forma de Thread, uma classe capaz de realizar a ordenação de um array de
valores do tipo double (passado como argumento ao construtor). A ordenação pode ser
feita com o método sort da classe Array ou então implementada com qualquer método
direto de ordenação (bubble sort, por exemplo). Escreva um programa que seja capaz de
criar várias dessas threads, passando arrays de tamanho determinado pelo usuário e
preenchidos com valores aleatórios entre 0 e o tamanho do próprio array.
2. Fazer um programa em Java que implemente uma classe Java que possibilite a instância
de 4 objetos onde cada um possibilitará a realização de um dos quatro cálculos
numéricos básicos entre dois números. Os objetos deverão ser instancias de uma classe
extends Thread que deverá receber os números e o sinal da operação básica como
parâmetro e escrever o resultado do cálculo. Durante a chamada deverão ser informados
tempos aleatórios de pausa na execução dos objetos.
Java básico 2
99
Bibliografia
DEITEL. Java Como Programar. 6a. ed. São Paulo: Pearson Prentice Hall, 2005.
HORSTMANN, Cay. CORNELL, Gary. Core Java 2 – Fundamentals. The Sun Microsystems
Press Java Series. Vol. I. 2003.
JANDL Junior, Peter. Java Guia do Programador. São Paulo: Novatec, 2007.
SIERRA, Kathy; BATES, Bert. Certificação Sun Para Programador Java 6 Guia de Estudo.
São Paulo: Rio de Janeiro, 2008.
Java básico 2
100