Documente Academic
Documente Profesional
Documente Cultură
Java Fundamentals
Sumário
2. Tipos e Operadores
Operadores ....................................................
.................................................... 2-1
Objetivos .......................................................................................................................2-2
Variáveis ........................................................................................................................2-3
Tipos primitivos e tipos compostos ............................................................................2-4
Tipos Primitivos ..............................................................................................................2-6
Declarando um tipo primitivo..................................................................................2-10
Tipo caracter – char ..................................................................................................2-12
Tipo booleano – boolean .........................................................................................2-14
Tipos inteiros - byte, short, int e long .......................................................................2-15
Tipos de ponto flutuante - float e double..............................................................2-17
Tipo composto – String ..............................................................................................2-19
Conversões de tipos – casting.................................................................................2-20
Tipos de referência ....................................................................................................2-22
Expressões e operadores..........................................................................................2-23
Sumário de operadores............................................................................................2-25
Precedência...............................................................................................................2-27
Associatividade..........................................................................................................2-28
Tipos de operadores: unários e binários ................................................................2-29
I
Java Fundamentals
II
Java Fundamentals
III
Java Fundamentals
IV
Java Fundamentals
1. A tecnologia Java e
configuração do ambiente
1-1
A tecnologia java e configuração do ambiente
Objetivos
• Compreender os fundamentos da tecnologia Java
• Discutir vantagens da tecnologia
• Entender o funcionamento da JVM (Java Virtual Machine)
• Configurar o ambiente de desenvolvimento para o programador
1-2
A tecnologia java e configuração do ambiente
O que é Java?
Breve Histórico
1-4
A tecnologia java e configuração do ambiente
• Abstração
1-5
A tecnologia java e configuração do ambiente
• Encapsulamento
• Herança
• Polimorfismo
Destas idéias iniciais surge então a tecnologia Java. Claro que há muito mais
coisas presentes no java do que as listadas acima. Atualmente o java é uma
tecnologia tão completa que permite você desenvolver aplicações para rodar
na Web, em máquinas cliente, Celulares, Palm Tops e muito mais.
1-6
A tecnologia java e configuração do ambiente
Erro de Ponteiro?
1-7
A tecnologia java e configuração do ambiente
1-8
A tecnologia java e configuração do ambiente
Multiplataforma e interpretada
1-9
A tecnologia java e configuração do ambiente
Java adota uma filosofia diferente. Os fontes Java não são convertidos
diretamente para instruções de máquina. Ao contrário, a partir da compilação
dos fontes são gerados arquivos contendo código intermediário que independe
de plataforma.
1-10
A tecnologia java e configuração do ambiente
1-11
A tecnologia java e configuração do ambiente
Quando você escreve um programa Java e o compila, ele está pronto para
ser executado em qualquer PC que contenha a máquina virtual Java. De certa
forma, você está escrevendo para apenas uma plataforma: a máquina virtual.
1-12
A tecnologia java e configuração do ambiente
Agora, depois dessa explicação, fica claro o que eles quiseram dizer com a
frase "Write once, Compile once and Run anywhere" – ("Escreva uma vez, compile
uma vez e rode em qualquer lugar"), frase esta que se tornou uma das marcas
registradas de Java.
1-13
A tecnologia java e configuração do ambiente
1-14
A tecnologia java e configuração do ambiente
1-15
A tecnologia java e configuração do ambiente
Aspectos de segurança
Java foi projetado com a segurança em mente. Por isso, oferece várias
camadas de controles de segurança que protegem contra código malicioso,
permitindo que os usuários rodem tranqüilamente programas de origem
desconhecida, como os applets.
1-16
A tecnologia java e configuração do ambiente
1-17
A tecnologia java e configuração do ambiente
Mas porque interpretar um bloco de código que não muda e já foi uma vez
interpretado?
1-18
A tecnologia java e configuração do ambiente
1-19
A tecnologia java e configuração do ambiente
1-20
A tecnologia java e configuração do ambiente
1-21
A tecnologia java e configuração do ambiente
Configurando o ambiente
JAVA_HOME=C:\jdk1.5
CLASSPATH=%JAVA_HOME%\lib\tools.jar
PATH=%JAVA_HOME%\BIN;%PATH%
Codigo 1-1: Configuração das variáveis de ambiente para windows
JAVA_HOME=/jdk1.5
CLASSPATH=$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin;$PATH
Codigo 1-2: Configuração das variáveis de ambiente para linux
1-22
A tecnologia java e configuração do ambiente
API’s da linguagem
http://java.sun.com/j2se/1.5.0/docs/api/
1-23
A tecnologia java e configuração do ambiente
1-24
A tecnologia java e configuração do ambiente
1-25
Java Fundamentals
2. Tipos e Operadores
2-1
Tipos e operadores
Objetivos
• Compreender as seguintes estruturas:
o Variáveis
o Tipos Primitivos
o Literais
• Compreender os tipos de dados primitivos:
o char
o boolean
o byte, short, int, long
o float, double
• Compreender os tipos de dados compostos
• Apreender conversões de tipos
• Conceituar expressões e operadores
• Definir precedência e associatividade entre estruturas
2-2
Tipos e operadores
Variáveis
Isto significa que a utilização de qualquer variável deve ser compatível com
a sua prévia definição.
2-3
Tipos e operadores
2-4
Tipos e operadores
2-5
Tipos e operadores
Tipos Primitivos
2-6
Tipos e operadores
Java possui oito tipos primitivos: boolean, char, byte, short, int, long,
float e double. Cada um destes tipos será estudado de maneira mais
detalhada nas seções seguintes. A tabela abaixo apresenta um resumo dos tipos
primitivos encontrados na linguagem Java.
2-7
Tipos e operadores
2-8
Tipos e operadores
2-9
Tipos e operadores
São oito os tipos primitivos de Java: boolean, char, byte, short, int, long,
float e double. Quarenta e quatro são os operadores que podem ser utilizados
na manipulação destes tipos primitivos.
Uma resposta simples seria: constantes para cada um dos tipos primitivos de
uma linguagem. Na verdade, literais são construções sintáticas fornecidas pela
linguagem para exprimir valores constantes para cada um dos tipos primitivos.
Tais construções determinam como devem ser escritos um caractere, um inteiro,
um valor booleano, etc.
A maior parte das linguagens permite que haja mais de uma forma de se
escrever um valor inteiro, ora transcrevendo o valor inteiro em uma base de
numeração Octal, ora transcrevendo-o em uma base Decimal, ora em uma base
Hexadecimal.
2-10
Tipos e operadores
http://www.unicode.org
2-11
Tipos e operadores
Por exemplo:
2-12
Tipos e operadores
\b backspace
\t tabulação horizontal
\n nova linha
\f alimentação de formulário
\r retorno de carro
\” aspas duplas
\’ aspas simples
\\ contrabarra
\uxxxx Caracter Unicode com codificação xxxx, onde xxxx são quatro dígitos
hexadecimais.
Valores do tipo char não podem ser convertidos para e a partir de tipos
inteiros. Ao contrário de byte, short, int e long, o tipo char é um tipo não
sinalizado (unsigned).
2-13
Tipos e operadores
Java reserva as palavras true e false para representar estes dois valores
booleanos.
Programadores C e C++ devem ter notar que Java é bem restritiva quanto à
utilização do tipo booleano: valores booleanos não podem ser diretamente
convertidos para outros tipos de dados, nem estes podem ser convertidos para
booleanos.
Errado Correto
int i = 10; int i = 10;
while(i) { while(i!=0) {
... ...
i--; i--;
} }
2-14
Tipos e operadores
Os tipos inteiros em Java são byte, short, int e long. Os tipos inteiros
diferem exclusivamente no número de bits usados para a representação do
número e, portanto, na extensão da faixa de números que conseguem
representar. Todos os tipos inteiros são sinalizados.
0
1
-123
-4200
Literais inteiros que têm um dígito 0 em seu início são interpretados como
números octais (base 8) e, portanto, entre os dígitos subseqüentes não podem
figurar os algarismos 8 e 9. Java não permite que literais inteiros sejam expressos
em notação binária (base 2). Literais inteiros octais e decimais válidos:
2-15
Tipos e operadores
Por exemplo:
byte b1 = 127, b2 = 1;
byte sum = b1 + b2;
// sum = -128, que é o menor byte
Divisões inteiras por zero e operações módulo zero não são aceitas e lançam
a exceção ArithmeticException.
2-16
Tipos e operadores
Alguns exemplos:
123.45f // float
0.0 // double
.02 // double
Por exemplo:
2-17
Tipos e operadores
2-18
Tipos e operadores
Além dos tipos primitivos caracter, booleano, inteiro e real, Java também
possui um tipo de dado próprio para trabalhar com seqüências de texto (Strings).
Por exemplo:
"Hello, World"
"Isto é uma string \n"
2-19
Tipos e operadores
Java permite conversão entre valores inteiros e valores reais. Além disto, por
corresponder todo caracter a um número na codificação Unicode, o tipo char
pode ser convertido para e a partir de um tipo inteiro ou de ponto flutuante. De
fato, o tipo boolean é o único tipo que não pode ser convertido para ou a partir
de um outro tipo primitivo em Java. Há dois tipos de conversão.
int i = 13;
byte b = i; // Erro em tempo de compilação.
Código 2-12: Atribuição de valor inteiro int não permitida para byte
A única exceção a esta regra é que você pode atribuir um literal inteiro
(portanto, um valor int) para uma variável byte e short, se o literal pertencer à
faixa de representação desta variável. Se você precisa de conversões de
redução e está confiante que o pode fazer sem perda de informação ou
precisão, você pode forçar Java a executar a conversão usando uma
construção da linguagem conhecida como cast (conversão explícita).
Por exemplo:
int i = 13;
byte b = (byte) i;
i = (int) 13.456;
2-20
Tipos e operadores
int i1 = s;
int i2 = c;
O tipo char funciona como um tipo inteiro a maior parte das vezes,
podendo, portanto, ser usado em qualquer lugar em que se espere um int ou
long.
2-21
Tipos e operadores
Tipos de referência
Além dos oito tipos primitivos, Java define duas outras categorias de tipos:
classes e vetores. Programas em Java são construídos através de definições de
classes; cada classe define um novo tipo de dado que pode ser manipulado por
programas Java.
Um programa pode, por exemplo, definir uma classe chamada Ponto e usá-
la para armazenar coordenadas (x,y) de um sistema cartesiano de coordenadas.
Com isto, Ponto passa a ser um novo tipo de dado em um programa.
A razão para este nome ficará clara logo a seguir. Por enquanto, é
importante compreender apenas que classes e vetores são tipos de dados
diferentes dos tipos primitivos. Tipos de dados de classes e vetores são conhecidos
como tipos compostos. Um tipo de dado primitivo guarda somente um único
valor.
Classes e vetores são tipos agregados que contém vários valores. O tipo
Ponto, por exemplo, armazena dois valores double representando as
coordenadas x e y do ponto. Classes e vetores serão retomados logo adiante.
2-22
Tipos e operadores
Expressões e operadores
Até o presente momento, aprendemos sobre os tipos primitivos que os
programas Java são capazes de manipular e vimos como construir literais para
cada um destes tipos. Utilizamos também variáveis, nomes simbólicos que
representam e armazenam um valor.
1.7
'A'
true
sum
sum = 1.7
Mas operadores não são usados apenas com expressões primárias; eles
também podem ser usados com expressões de qualquer nível de complexidade.
As seguintes construções são, portanto, expressões válidas.
sum = 1 + 2 + 3 * 1.2 + (4 + 8) / 3.0;
sum = (sum / Math.sqrt(3.0 * 1.234) );
sum = (int) (sum + 33);
2-23
Tipos e operadores
2-24
Tipos e operadores
Sumário de operadores
Os tipos de expressões que você pode escrever em uma linguagem de
programação dependem completamente do conjunto de operadores que a
linguagem disponibiliza. A tabela abaixo apresenta síntese dos operadores
disponíveis em Java. A colunas P e A desta tabela indicam, respectivamente, a
precedência e a associatividade de cada grupo de operadores correlatos. Neste
curso veremos alguns operadores listados na tabela abaixo, os demais serão
vistos a medida do estudo da linguagem.
2-25
Tipos e operadores
| booleano, OR booleano
booleano
*=, /=, %=, +=, variável, qqr coisa atribuição geminada com operação
-=, <<=, >>=,
>>>=, &=, ^=,
|=
2-26
Tipos e operadores
Precedência
a + b * c
(a + b) * c
2-27
Tipos e operadores
Associatividade
Quando uma expressão contém vários operadores que têm a mesma
precedência, a associatividade dos operadores indicarão a ordem na qual as
operações serão executadas. A maior parte dos operadores tem associatividade
da esquerda para direita, o que significa que as operações são feitas da
esquerda para a direita. Operadores unários e de atribuição possuem,
entretanto, associatividade da direita para esquerda.
int a = 5;
int b = 4;
int c = a++ + b++
a = 6
b = 5
c = 9
2-28
Tipos e operadores
2-29
Tipos e operadores
2-30
Tipos e operadores
2-31
Java Fundamentals
3-1
Criando classes e objetos
Objetivos
3-2
Criando classes e objetos
Classes e Objetos
Uma classe é um gabarito utilizado para criar múltiplos objetos. Uma classe
encapsula todos os dados e comportamentos que definem um objeto. Quando
você pede ao interpretador Java para criar ou instanciar um objeto, Java usa a
definição de classes como gabarito para a criação de novos objetos.
Uma classe pode conter atributos que são atribuídos a todos os novos
objetos desta classe. Atributos são informações ou dados que descrevem,
categorizam ou quantificam um objeto. Cada novo objeto de uma dada classe
terá seu próprio conjunto de atributos de classe. Um objeto da classe Cliente, por
exemplo, terá um nome, um endereço e um número telefônico como atributos.
3-3
Criando classes e objetos
class Produto {
class HelloWorld {
3-4
Criando classes e objetos
C:\>java HelloWorld
Hello World!
3-5
Criando classes e objetos
Padrões
Nomes de arquivos
Exemplo: Produto.java
Nomes de classes
3-6
Criando classes e objetos
Nomes de operações
Conselho similar pode ser dado à escolha dos nomes dos métodos: use
nomes significativos. Use verbos ou estruturas verbais que captem a ação
principal contida no método. O nome deve representar a real utilidade
desempenhada pelo método. A primeira letra do nome de uma operação deve
ser em minúscula e a primeira letra de todas as demais palavras que compõem o
nome da operação, caso existam, em maiúsculo.
Nomes de atributos/variáveis
Use nomes curtos, mas que não sejam críticos. A primeira letra do nome da
variável deve ser em minúscula e a primeira letra de todas as demais palavras
presente no nome deve ser maiúscula. Evite usar nomes de variáveis com uma
única letra. O que você esperaria de uma variável de nome r ou x? O nome
deve ser representativo e a simples leitura do mesmo leva à compreensão do
papel desempenhado pela variável no aplicativo. A única exceção aceitável é
para contadores em laços, ou variáveis temporárias de uso restrito.
Nomes de constantes
Caracteres especiais
3-7
Criando classes e objetos
Nome de pacotes
Pacotes devem possuir nomes significativos e não devem ter seus nomes
separados por caracteres como “_”. Seus nomes devem ser escritos sempre com
todas as letras em minúsculo e os nomes de pacotes seprados pelo caractere
ponto (“.”). Veja o exemplo abaixo:
Exemplo: com.targettrust.database
3-8
Criando classes e objetos
class HelloWorld {
public static void main( String[] args ) {
System.out.println( "Hello World!" );
}
}
Compilando e executando:
Código 3-6: Compilando um classe com pacote e realizando sua execução. A opção –d indica o
deretório de destino para o byte-code
package com.targettrut.java;
import java.sql.*;
import java.io.*;
import java.net.*;
import javax.swing.JFrame;
3-9
Criando classes e objetos
3-10
Criando classes e objetos
Static import
System.out.println( Math.random() );
System.out.println( ( raio * raio) * Math.PI );
Código 3-8: Uso de operações static sem a importação dos membros static
Veja que o código acima fica mais claro e fácil de ser escrito. Esta
facilidade de escrita do código deve ser utilizada mas com cuidado para não ser
abusada, pois pode prejudidar a legibilidade do código das suas aplicações.
Sempre que muitos membros static de uma classe forem ser utilizados é útil este
recurso, mas se somente um ou dois membros forem ser utilizados o uso deste
recurso não é aconselhável.
3-11
Criando classes e objetos
Criando objetos
Neste momento do seu aprendizado iremos mostrar como pode ser criao
um objeto de uma determinada classe para que você possa aproveitar melhor
os passos seguintes do curso. Não iremos ainda aqui nos aprofundar neste
assunto, visto que a criação de objeto é algo que merece um tempo maior de
estudo. Veremos então como pode ser criado um objeto.
...
Produto prod;
prod = new Produto();
...
Esta criação também pode ser feita em uma única linha de código para
simplificar o processo, como mostrado abaixo:
...
...
Agora em uma única linha você esta declarando uma referência para o
objeto, criando o objeto e atribuindo o endereço de memória do mesmo para
esta referência.
3-12
Criando classes e objetos
Sempre que declararmos uma referência e esta não receber valor teremos
um valor null “dentro” da mesma. Desta forma é importante estudarmos um
pouco este valor null, pois muito erros em tempo de execução na linguagem java
ocorrem em função desta palavra.
Ele declara uma variável/referência prod e a inicializa com null. Isto indica
que a variável de referência prod não se refere a nenhum objeto ainda, em
outras palavras, ela somente foi delarada.
null é uma palavra reservada na linguagem Java. Você pode usá-la com o
operador de igualdade para verificar se uma variável de referência já recebeu
uma referência válida a um objeto ou mesmo para saber se duas referências
...
prod == prodRef
...
Quando você tiver terminado de usar um objeto, você pode atribuir o valor
null para a variável que o referencia. Isto indica que a variável não mais se
refere ao objeto. Quando nenhuma referência houver para um objeto, o objeto
será marcado como inacessível e será considerado pelo coletor de lixo (garbage
collector). Iremos estudar com mais detalhes o coletor de lixo nos próximos
capítulos.
3-13
Criando classes e objetos
o valor null, sai de fora de escopo ou então recebe o valor de uma referência
para outro objeto.
3-14
Criando classes e objetos
Atribuindo referências
Como mencionamos antes, quando você declara uma variável de
referência para um objeto, esta variável tem o seu valor inicializado para null.
Antes que você possa usar esta variável (ou seja, acessar o objeto a que ela
referencia), você tem de inicializá-la. Todos os atributos de uma classe que forem
de tipos compostos (Classes) serão inicializados automaticamente pela JVM no
momento da criação de um objeto da classe para o valor null.
Esta sintaxe está perfeitamente correta, mas vale frisar que há apenas um
objeto Produto criado. Quando você atribui uma referência para um objeto
para outra referência, você termina com duas referências para o mesmo objeto,
e não uma cópia do objeto.
3-15
Criando classes e objetos
pacote/default
package com.targettrust.comunicacao;
class Email {
...
...
}
3-16
Criando classes e objetos
public
class Produto {
...
...
}
3-17
Criando classes e objetos
Definindo operações
}
}
Código 3-19: Declaração da operação
}
Código 3-20: Visibilidade da operação
3-18
Criando classes e objetos
• Tipo de retorno: pode ser um tipo primitivo (como int ou char – tipos
primitivos serão estudados mais adiante), ou um tipo composto (um objeto
String ou Produto, por exemplo), ou mesmo não haver retorno algum.
Neste caso deverá constar void como tipo de retorno. Em resumo: toda
operação em java deve indicar o tipo de retorno.
}
Código 3-21: Tipo de retorno das operações
}
Código 3-22: Nome da operação
}
Código 3-23: Parâmetros da operação
3-19
Criando classes e objetos
3-20
Criando classes e objetos
Comando return
O comando return é utilziado na linguagem java para que as operações
possam retornar valores.
inserido.
Código 3-25: Comando return para retorno de método com ou sem valor de retorno.
3-21
Criando classes e objetos
public
package com.targettrust.java;
package com.targettrust.vendas;
import com.targettrust.java.*;
3-22
Criando classes e objetos
private
Esta operação foo() é uma operação que pode ser chamada somente
através de outras operações da própria classe, veja abaixo:
3-23
Criando classes e objetos
O código abaixo não é permitido, pois veja que agora a operação foo() esta
definida com sendo privada.
prod.foo();
protected
O uso desta visibilidade, assim como para os atributos está ligada ao uso de
herança, desta forma iremos deixar este tipo de visibilidade para ser
demonstrado mais adiante quando estudarmos o mecanismo de herança.
package/defalut
Para definir uma operação com esa visibilidade não se deve especificar
nenhum modificador de acesso, isto a tornará default/package.
void foo() {
…
}
3-24
Criando classes e objetos
Definindo atributos
3-25
Criando classes e objetos
public
3-26
Criando classes e objetos
3-27
Criando classes e objetos
private
O acesso agora aos atributos não poderia mais ser feito de forma direta
como na visibilidade pública. Veja o código abaixo e observe que nas linhas
onde tentamos acessar os atributos teríamos um erro sendo reportado pelo
compilador dizendo que o atributo é privado e não pode ser acessado desta
forma.
prod.descricao = “Notebook”;
prod.preco = 3500.0f;
prod.emVenda = false;
3-28
Criando classes e objetos
...
}
prod.setDescricao(“Notebook”);
prod.setPreco(3500.0f);
prod.setEmVenda(false);
3-29
Criando classes e objetos
package/default
package com.targettrust.java;
package com.targettrust.java;
prod.descricao = “Notebook”;
prod.preco = 3500.0f;
prod.emVenda = false;
3-30
Criando classes e objetos
package com.targettrust.exemplo;
import com.targettrust.java.*;
prod.descricao = “Notebook”;
prod.preco = 3500.0f;
prod.emVenda = false;
protected
3-31
Criando classes e objetos
Acessando atributos
O acesso a atributos de uma classe deve ser feito somente por operações
definidas na mesma classe que contém este atributo. Desta forma devemos
tornar os atributos de uma classe por padrão privados e as operações que irão
acessá-los públicas.
3-32
Criando classes e objetos
Java possui um tipo de cometário que pode ser utilizado por um gerador de
documentação a fim do mesmo criar um conjunto de páginas HTML com
informações sobre a classe. O programador interessado em utilizar aquela clase
não precise olhar o fonte da mesma para saber do que ele dispõe, mas sim basta
olhar em qualquer browser esta documentação em formato HTML.
1 – Comentário de linha
3 – Comentário de documentação
Comentário de linha
3-33
Criando classes e objetos
Comentário de documentação
Este tipo de cometário deve ser colocado antes do elemento que se quer
documentar, ou seja antes da definição de uma classe ou operação. As
marcações /** e */ indicam o início e fim de um comentário de documentação.
Todo o conteúdo colocado dentro destas marcações será capturado pelo
utilitário javadoc para montar a documentação da classe em formato HTML.
/**
Classe para representar um produto da loja.
Um produto deve conter sempre um código e uma descrição
Criada dia 05-05-2005
*/
public class Produto {
/**
Método para mostrar os dados de um produto
*/
public void imprimir() {
}
}
3-34
Criando classes e objetos
/**
Calcula o custo de um produto.
@param arg um argumento a ser utilizado para calcular o custo
@param cod código do produto a ser utilizado no calculo
@return float indicando o custo do produto
*/
public float calcularCusto(String arg, int cod) {
…
}
3-35
Criando classes e objetos
3-36
Criando classes e objetos
3-37
Criando classes e objetos
Podemos definir “x” e “res” como sendo variáveis locais, enquanto preço
pode ser definido como sendo uma variável de instância. Par6ametros de
métodos também são considerados como sendo variáveis locais.
3-38
Criando classes e objetos
O exemplo abaixo ilustra a maneira com que tipos primitivos são passados
por valor para os métodos.
int preco = 100;
obj.foo(preco); preco
100
System.out.println("preço = " + preco);
arg = 55
preco = 100
3-39
Criando classes e objetos
O exemplo abaixo ilustra a maneira pela qual referências para objetos são
passadas para métodos.
3-40
Criando classes e objetos
3-41
Criando classes e objetos
Exercícios
1. Neste exercício você irá criar uma classe para representar um Produto com
a estrutura (atributos) descrita abaixo. Esta classe estará associada com
outra classe, a ItemPedido. Item pedido possui o produto e a sua
quantidade. No final você irá criar uma classe com método main para
testar sua aplicação. Siga os passos abaixo para realizar o exercício.
Passo 1: Crie uma classe chamada Produto dentro de seu projeto. Esta
classe deverá pertencer ao pacote com.targettrust.java.
Passo 5: Crie uma outra classe pública com o nome ItemPedido. Esta
classe deve pertencer ao pacote com.targettrust.venda.
3-42
Criando classes e objetos
Passo 10: Crie na classe Aplicacao uma operação que seja capaz de
receber como parâmetro um ItemPedido e faça a impressão das informações do
objeto que esta operação receber.
3-43
Java Fundamentals
4. Comandos da Linguagem
4-1
Comandos da Linguagem
Objetivos
4-2
Comandos da Linguagem
Comandos
4-3
Comandos da Linguagem
Por exemplo:
if(usuario == null) {
usuario = "admin";
}
4-4
Comandos da Linguagem
if(usuario != null) {
System.out.println("Olá! " + usuario);
}else {
usuario = getNomeUsuario();
System.out.println("Olá! " + usuario + "Esta é sua primeira sessão" );
}
if(i == j)
if(j == k)
System.out.println("i é igual a k");
else
System.out.println("i não é igual a j"); // ERRADO
Infelizmente não está claro com qual if a cláusula else faz par. A
identação sugere ser o primeiro if o par da cláusula else. E sugere
erradamente, levando o programador a uma situação de erro.
if(i == j)
if(j == k)
System.out.println("i é igual a k");
else
System.out.println("i não é igual a j"); // ERRADO
4-5
Comandos da Linguagem
Muito cuidado deve ser tomado, pois não há erro de sintaxe nos dois
exemplos acima. São construções é perfeitamente legal. Só não ocorre o que o
programador deseja. Ao trabalhar com comandos ifs aninhados use chaves a
fim de tornar o código mais legível.
if(i == j) {
if(j == k) {
System.out.println("i é igual a k");
}
}else {
System.out.println("i não é igual a j"); // CORRETO
}
4-6
Comandos da Linguagem
if(n == 1) {
// executa bloco de código 1
}else if(n == 2) {
// executa bloco de código 2
}else if(n == 3) {
// executa bloco de código 3
}else {
// se todas as condições acima falham, então
// executa bloco de código 4
}
if(n == 1) {
// executa bloco de código 1
}
else {
if(n == 2) {
// executa bloco de código 2
}
else {
if(n == 3) {
// executa bloco de código 3
}
else {
// se todas as condições acima falham, então
// executa bloco de código 4
}
}
}
abaixo).
4-7
Comandos da Linguagem
4-8
Comandos da Linguagem
Operador ternário
int x, y;
...
String res = (x > y)?“X é maior que Y”:“Y é maior que X”;
...
System.out.println( res );
Código 4-10: Expressão com operador ternário
Observe que o código é bem mais enxuto para este caso de if..else
4-9
Comandos da Linguagem
Comando switch
O comando if provoca um desvio no fluxo de execução de um programa.
Você pode usar múltiplos comandos ifs, como mostrado na seção anterior, para
executar desvios múltiplos de execução. Entretanto, esta nem sempre é a melhor
solução especialmente quando todos os desvios dependem do valor de uma
única variável.
switch(n) {
case 1:
// começa aqui se n == 1
// executa bloco de código 1
break; // para aqui
case 2:
// começa aqui se n == 2
// executa bloco de código 2
break; // para aqui
case 3:
case 4:
// começa aqui se n == 3
// executa bloco de código 3
break; // para aqui
default:
// se todas as condições acima falham, então
// executa bloco de código 4
break; // para aqui
}
Como você pode ver a partir deste exemplo, os vários pontos de entrada
do comando switch são rotulados ou com a palavra reservada case seguida de
um valor inteiro e dois pontos, ou então da palavra reservada default seguida
de dois pontos.
4-10
Comandos da Linguagem
case 'n':
case 'N': return false;
Código 4-12: Comando switch de char sem utilização de break e com comando return.
4-12
Comandos da Linguagem
Comando while
while(expressao) {
comandos
}
int i = 0;
while(i < 10) {
System.out.println(i);
i++;
}
Código 4-14: Comando while com teste lógico para impressão de inteiros entre 0 e 9.
A maior parte dos laços tem uma variável contadora, como i. Os nomes
de variáveis: i, j e k são usados, na maioria das vezes, para tais variáveis
contadoras, embora você possa escolher um nome mais claro.
4-13
Comandos da Linguagem
Comando do
Isto significa que o corpo do laço é executado pelo menos uma vez.
Eis a sintaxe do comando:
do {
comandos
}
while(expressao);
int i = 0;
do {
System.out.println( i );
i++;
} while( cont < 10 );
Código 4-16: Comando do/while com teste lógico no final para impressão de inteiros entre 0 e 9.
4-14
Comandos da Linguagem
Comando for
for.
Código 4-18: Comando for com teste lógico e incremento para impressão de inteiros entre 0 e 9.
4-15
Comandos da Linguagem
Por exemplo:
Código 4-20: Comando for com expressão utilizando o índice e variáveis locais.
4-16
Comandos da Linguagem
4-17
Comandos da Linguagem
Comando “for-each”
Veja que uma simples tarefa de iterar uma coleção demanda um volume
considerável de código. Agora observe a mesma versão deste código utilizando
o laço “for-each” juntamente com o novo “import static”:
O sinal de “:” é lido com “em”. Desta forma o código acima pode ser lido
da seguinte forma: “Para cada aluno a em c”.
For-each também pode ser aplicado a arrays. Neste caso você pode iterar
um array da seguinte forma:
4-18
Comandos da Linguagem
Comando break
O comando break é utilizado para transferir o controle para fora do corpo
do comando de laço ou switch mais próximo, transferindo imediatamente o
controle para o primeiro comando após o corpo do laço ou switch. É usado,
assim, para prematuramente sair de qualquer tipo de laço.
Este comando é muito útil para abortar um laço quando algum evento
ocorre durante a execução do corpo deste laço.
break;
int i = 0;
int total = 0;
while( i < 100 ) {
total += i; // total = total + i;
if( total >= 200 ) {
break;
}
System.out.println( i );
i++;
}
em 0.
Código 4-26: Comando break finalizando um loço while
switch( resposta ) {
case 's':
case 'S': System.out.println("Resposta SIM.");
break;
case 'n':
case 'N': System.out.println("Resposta NÃO.");
break;
O comando break pode ser utilizado também seguido por um label que
especifica um comando presente no método. Com o uso do comando break
4-19
Comandos da Linguagem
Para utilizar o comando break com label, o label deve ser inserido antes do
comando que se deseja interromper. O label pode ser qualquer identificador
válido, seguido por “:”.
label:
comando {
...
break label;
...
}
O trecho de código a seguir exemplifica este uso. Após o múltiplo dos inteiros
i e j atingir um valor maior que 200, o comando for associado ao label
comandoFor é interrompido (comando for mais externo) e a linha indicando que
o múltiplo foi atingido será impressa.
comandoFor:
for( int i = 0; i < 100; i++ ) {
Código 4-29: Comando break para quebra de laço for externo “comandoFor”.
4-20
Comandos da Linguagem
Comando continue
continue;
int total = 0;
for( int i=0; i < 10; i++ ) {
if( i % 2 == 0 ) {
continue;
}
total = total + i;
}
System.out.println( total );
forExterno:
for( int i = 0; i < 100; i++ ) {
4-21
Comandos da Linguagem
Código 4-32: Comando continue para reinício de laço for externo “forExterno” no próximo índice
de i
4-22
Comandos da Linguagem
4-23
Comandos da Linguagem
Exercícios
1. Este exercício fará com que você altere as classes criadas no capítulo
anterior adicionando algumas validações as suas operações.
Passo 4: Altere um dos objetos produto que você criou para que o
mesmo não esteja mais em vendas. Rode novamente a sua aplicação e verifique
que para o pedido com o qual você tentou associar um produto que não estava
em venda não sairá dados do produto. Nesta execução a JVM lancará também
uma exception (NullPointerException).
2. Crie uma classe com o nome GeradorSenhas para que nesta seja
possível gerar senhas através de um laço de repetição.
Passo 2: Utilizando um laço de repetição a sua escolha (for, while, ..) faça
a geração de 10 senhas randômicas com no máximo 8 díditos.
4-25
Comandos da Linguagem
4-26
Java Fundamentals
5-1
Aprofundando o estudo sobre classes
Objetivos
5-2
Aprofundando o estudo sobre classes
Visão Geral
Permitir o acesso direto às variáveis de instância de uma classe, sem que seja
necessário invocar métodos para tal, é uma técnica de programação perigosa,
pois não garante um estado sempre consistente para o objeto (o usuário não fica
restrito às regras de negócios definidas na manipulação do objeto).
5-3
Aprofundando o estudo sobre classes
Dois ou mais métodos em uma classe podem ter o mesmo nome, desde que
tenham assinaturas diferentes. A assinatura de um método é formada por seu
nome, juntamente com o número, tipo e ordem dos parâmetros. O tipo de
retorno do método não é considerado como parte da assinatura.
5-4
Aprofundando o estudo sobre classes
5-5
Aprofundando o estudo sobre classes
Métodos construtores
Produto( ) {
...
}
}
Código 5-3: Definindo construtores
5-6
Aprofundando o estudo sobre classes
Para permitir que o usuário crie objetos desta maneira, será necessário
fornecer os contrutores na classe Produto e que inicialize o estado do objeto
Produto com as opções fornecidas.
5-7
Aprofundando o estudo sobre classes
5-8
Aprofundando o estudo sobre classes
Referência this
5-9
Aprofundando o estudo sobre classes
5-10
Aprofundando o estudo sobre classes
public Produto() {
this( “” ); Um construtor pode
} chamar outro construtor
usando a sintaxe this()
public Produto(String nome) {
this.setNome( nome );
}
}
Código 5-9: Referência this invocando o construtor da própria classe de acordo com os tipos de
parâmetros.
5-11
Aprofundando o estudo sobre classes
5-12
Aprofundando o estudo sobre classes
Variáveis de instância
/* Variáveis/atributos de instância */
private String codigo;
private String nome;
private char plano;
/* Variável de classe */
public static float desconto;
}
Código 5-11 : Declarando vaiáveis de instância
obj01 obj02
5-13
Aprofundando o estudo sobre classes
}
}
Código 5-12 : Criando objetos Cliente
5-14
Aprofundando o estudo sobre classes
Métodos de instância
referenciaObjeto.nomeMetodo(parâmetros ...);
seguinte:
referenciaObjeto.nomeMetodo();
/* Variáveis/atributos de instância */
private String codigo;
private String nome;
private char plano;
/* Métodos de instância */
public void setCodigo(String codigo) {
this.codigo = codigo
}
5-15
Aprofundando o estudo sobre classes
Variáveis de classe
/* Variáveis/atributos de instância */
private String codigo;
private String nome;
private char plano;
/* Variável de classe */
public static float desconto;
}
Código 5-16 : Variável de classe definida
desconto = ...
obj01 obj02
5-16
Aprofundando o estudo sobre classes
}
}
Código 5-17: Acessando variável de classe
Observe que precoMinimo foi declarada private, porque ela precisa ser
acessada apenas pelos métodos da classe Filme. Neste exemplo, a variável
precoMinimo é compartilhada por todos objetos, ou seja, é igual para todas as
instâncias de Filme, muito embora cada instância possua sua própria descrição
e código.
5-17
Aprofundando o estudo sobre classes
5-18
Aprofundando o estudo sobre classes
inicializadores.
Código 5-19: Declaração de variáveis de classe
5-19
Aprofundando o estudo sobre classes
Métodos de classe
Um método de classe, também conhecido como estático (método static)
, é um método que pertence à classe e é compartilhado por todas as instância
desta classe. Ao contrário de um método de instância, uma método de classe
não atua sobre um único objeto. Estes métodos não recebem, portanto, a
referência implícita this.
Métodos de classe são ideais para acessar variáveis de classe. De fato, eles
são a única maneira, caso não exista nenhuma instância da classe (lembre-se:
mesmo não existindo nenhuma instância de uma classe, as variáveis de classe já
existem e têm um valor associado, pois são criadas quando a classe é carregada
pelo ambiente de execução.
Não é necessário ter uma instância da classe criada para poder acessar
variáveis de classe) No exemplo abaixo, o valor do preço mínimo é alterado
para todos os produtos, mesmo que nenhum objeto produto tenha sido criado
public class Produto {
private static double precoMinimo;
public static void setPrecoMinimo( float precoMinimo ) {
Produto.precoMinimo = precoMinimo;
}
}
ainda.
Código 5-21: Declaração de método de classe
NomeClasse.nomeMetodo(parametros);
5-20
Aprofundando o estudo sobre classes
5-21
Aprofundando o estudo sobre classes
variáveis de classe.
5-22
Aprofundando o estudo sobre classes
Herança define uma relação entre classes, onde uma classe (subclasse)
toma de empréstimo as estruturas de dados e os comportamentos de outra
classe (superclasse).
Somente use herança para modelar uma genuína relação “é um tipo de”.
Em outras palavras, não use herança senão quando todos os métodos herdados
se aplicam à subclasse.
Vamos agora ver como estes conceitos mostrados acima são aplicados em
java
5-23
Aprofundando o estudo sobre classes
Uma relação de herança faz com que a classe filha herde toda a estrutura
e comportamento dos pais.
Você poderia definir, por exemplo, as seguintes subclasses: CD, DVD e VHS.
5-24
Aprofundando o estudo sobre classes
Por exemplo:
5-25
Aprofundando o estudo sobre classes
Objetos de subclasses
CD cd = new CD();
public CD(float preco, String nome, int codigo, String produtor, int duracao)
public CD(float preco, String nome, int codigo, String produtor, int duracao) {
super( preco, nome, codigo );
setProdutor( produtor );
seDuracao( duracao );
}
5-27
Aprofundando o estudo sobre classes
5-28
Aprofundando o estudo sobre classes
5-29
Aprofundando o estudo sobre classes
Quando você cria um objeto, você pode chamar qualquer um dos seus
métodos públicos (public), bem como qualquer método declarado público em
uma de suas superclasses.
5-30
Aprofundando o estudo sobre classes
Se você cria um objeto CD, você pode chamar métodos públicos definidos
em CD, Produto e Object.
CD cd = new CD();
int duracao = cd.getDuracao() // método public de CD
float preco = cd.getPreco(); // método public de Produto
Class classe = cd.getClass(); // método public de Object
5-31
Aprofundando o estudo sobre classes
5-32
Aprofundando o estudo sobre classes
Referência super
construtor da superclasse:
Código 5-36: Estrutura de chamada explícita do construtor da superclasse
A regra de sintaxe é que a palavra reservada super deve ser, neste caso, a
primeira linha do construtor da subclasse. A palavra reservada super pode ser
usada também para acessar os métodos da superclasse.
5-33
Aprofundando o estudo sobre classes
5-34
Aprofundando o estudo sobre classes
em CD.
Código 5-39: Executando o método getPreco()
5-35
Aprofundando o estudo sobre classes
Visibilidade protected
package com.targettrust.java;
public class Funcionario {
private String nome;
protected float salario;
...
}
Código 5-40: Visiblidade protected aplicada a atributos
package com.targettrust.rh;
public class Vendedor extends Funcionario {
private float comisssao;
...
public void calcularSalario() {
...
float total = salario + comissao;
}
}
Código 5-41: Acessando um atributo protected
5-36
Aprofundando o estudo sobre classes
Varargs
5-37
Aprofundando o estudo sobre classes
5-38
Aprofundando o estudo sobre classes
Polimorfismo
Usando a técnica de polimorfismo visualize a seguinte hierarquia de classes.
5-39
Aprofundando o estudo sobre classes
5-40
Aprofundando o estudo sobre classes
Modificador final
Você pode também declarar uma classe como final. Uma classe final
não pode ser superclasse de nenhuma outra classe. Em outras palavras, não se
pode herdar de uma classe final.
Ao declarar uma classe como final você está tomando uma importante
decisão de projeto, pois está dizendo que tal classe é completa o suficiente para
atender todas as expectativas presentes e futuras de seus usuários, e que,
portanto, nunca será necessário estendê-la para fornecer alguma funcionalidade
adicional.
Um método final não pode ser sobrescrito por nenhuma subclasse. Em outras
palavras, se o programador herda de uma classe, não será permitido que ele
forneça uma versão alternativa de um método declarado como final na
superclasse.
Resumindo:
• Uma variável final é uma constante
• Uma variável final não pode ser modificada
• Uma variável final deve ser inicializada
• Uma variável final é geralmente pública (public), permitindo o acesso
externo
5-41
Aprofundando o estudo sobre classes
Se você declara uma classe como final, ela não poderá nunca mais ser
estendida por nenhuma outra classe. Esta é uma decisão de projeto importante,
pois afirma que a classe atende a todas as necessidades presentes e futuras de
seus usuários. Esta implicação é clara: você não precisa.
5-42
Aprofundando o estudo sobre classes
Enums
Tipos enum são cosiderados como objetos, acima temos a definição de um tipo
“Estacao”. Uma enumeration herda da classe java.lang.Enum possuindo desta
forma vários métodos para se poder manipular a estrutura. Métodos de Object
também estão presentes em uma Enum. Comparable e Serializable são interfaces
implementadas pelas enumerations, permitindo que as mesmas portanto possam
ser comparadas e serializadas.
5-43
Aprofundando o estudo sobre classes
for(Estacao s : Estacao.values() ) {
out.println( s.name() + " " +s.ordinal() );
}
Código 5-50: Percorrendo uma enumeration
5-44
Aprofundando o estudo sobre classes
5-45
Aprofundando o estudo sobre classes
Exercícios
1. Neste exercício você deve criar uma classe para representar um Curso.
Esta classe terá métodos sobrecarregados (overloading) e redefinidos
(overriding), bem como será uma classe filha da classe Produto e terá
construtores para que seja possível criar objetos da mesma já passando
informações na hora da criação.
Passo 3: Crie outro método na classe Curso que seja capaz de redefinir o
comportamento (overriding) do método public float getPreco() herdado da
classe Produto. Esta operação deve retornar o preço levando em consideração
o valor hora e a carga horária do curso, para isto utilize o valor hora da
constante.
Passo 6: Agora você irá modificar as classes que criou até o momento para
que as operações set’s da classe Produto, ItemPedido e Curso possam receber
parâmetros com o mesmo nome dos atributos. Use a referência this nestas classes
para referenciar o atributo na hora da atribuição e defina o nome do parâmetro
5-46
Aprofundando o estudo sobre classes
Passo 9: Atribua null para a referência criada que representa o curso e logo
em seguida chame o método System.gc() para ativar o coletor de lixo e
constatar a execução do método destrutor.
Passo 10: Na classe Curso crie um bloco estático de código para sinalizar
quando a classe está sendo carregada pela JVM. Neste bloco estático imprima
uma mensagem.
5-47
Java Fundamentals
6-1
Coleções, Arrays, String e Wrapper Classes
Objetivos
6-2
Coleções, Arrays, String e Wrapper Classes
Strings
Assim como na maioria das linguagens de programação, strings são usadas
intensivamente em Java. Desta forma, a API Java fornece uma classe String
para ajudá-lo a manipular seqüências de caracteres.
Isto significa que, uma vez criado um objeto String, você não poderá mais
alterá-lo. Se você quiser modificar o conteúdo de uma string, você deverá usar a
classe StringBuffer. Esta classe será estudada logo adiante.
6-3
Coleções, Arrays, String e Wrapper Classes
Criando Strings
Você pode usar o operador mais (+) para concatenar dois objetos String.
Isto é explicado em maiores detalhes adiante. Veja um exemplo do uso do
operador mais (+) quando aplicado a objetos String:
A classe String fornece vários construtores. Eis aqui alguns dos construtores
mais úteis:
• String() cria uma string vazia, com o valor ""
• String(String str) cria uma cópia do objeto String referenciado por
str
• String(char[] arr) cria uma string a partir dos caracteres presentes no
vetor arr
// uso de construtores
String nomeEmp = new String( "Maria Isabel" );
6-4
Coleções, Arrays, String e Wrapper Classes
Concatenando Strings
// Concatenação
String nome = "Carlos Silva";
nome = "Carlos " + "Silva";
nome = "Carlos ".concat("Silva");
Literais de string não podem se estender por mais de uma linha, mas você
pode concatená-los e produzir o mesmo efeito:
6-5
Coleções, Arrays, String e Wrapper Classes
String s = "Maria";
int tam = s.length(); // tam = 5
// 01234
String s = "Maria";
char c = s.charAt(2); // c = 'r'
// 01234
String s = "Maria";
String sub = s.substring(2,4); // sub = "ri"
String sub = s.substring(2); // sub = "ria"
String s = "Maria";
String M = s.toUpperCase(); // M = "MARIA"
String m = s.toLowerCase(); // m = "maria"
O método trim() retorna uma nova string contendo uma cópia da string
original com espaços em branco removidos tanto no início quanto no final.
6-6
Coleções, Arrays, String e Wrapper Classes
// 0 1 2
// 012345678901234567890
String s = "fábrica de brinquedos";
int iof = s.indexOf("bri"); // iof = 2
int liof = s.lastIndexOf("bri"); // liof = 11
6-7
Coleções, Arrays, String e Wrapper Classes
6-8
Coleções, Arrays, String e Wrapper Classes
Se sua classe tem um método toString(), você pode incluir o seu objeto
em expressões de concatenação de strings. E você pode imprimir seu objeto
como se este fosse uma string. O método toString() é invocado
automaticamente sempre que você usa um objeto em uma expressão de
concatenação de strings ou passa este objeto para System.out.println().
6-9
Coleções, Arrays, String e Wrapper Classes
Código 6-18: Convertendo tipos primitivos em String utilizando printf no J2DSK 1.5.
6-10
Coleções, Arrays, String e Wrapper Classes
Wrapper Classes
Para cada tipo primitivo, Java fornece uma classe invólucro (wrapper class)
correspondente. Estas classes permitem que um tipo primitivo seja manipulado
como se fosse um objeto.
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
double Double
float Float
6-11
Coleções, Arrays, String e Wrapper Classes
qtdCamp
Quantidad 17
Caso isto aconteça, parseInt() irá falhar e levantar uma exceção. Para
tratar esta situação, seria necessário colocar código adicional para capturar e
tratar a exceção levantada, tanto por parseInt(), quanto por parseFloat().
Exceções serão estudadas mais adiante. O código acima poderia ser feito da
seguinte forma:
Código 6-20: Convertendo String para o tipo primitivo correspondente de acordo com a Wrraper
Class.
6-12
Coleções, Arrays, String e Wrapper Classes
StringBuffer e StringBuilder
StringBuffer texto = new StringBuffer( "O texto começa com uma linha\n" );
texto.append( "E ganha outra linha\n" );
texto.append( "E mais uma...\n" );
sb.append("Java J2EE\n");
sb.append("Oracle\n");
sb.append("PostgreSQL\n");
System.out.println(sb);
Código 6-23: Utilizando StringBuilder
6-13
Coleções, Arrays, String e Wrapper Classes
Arrays
Um vetor é uma coleção de variáveis do mesmo tipo. Cada elemento
pode armazenar um único item. Os itens de um vetor podem ser de tipos
primitivos ou referências para objetos.
Vetores são úteis quando você deseja um grupo de objetos que possam ser
manipulados como um todo. Caso você, por exemplo, escreva um programa
para permitir a pesquisa por um filme, você provavelmente armazenará a lista de
categorias em um vetor.
6-14
Coleções, Arrays, String e Wrapper Classes
6-15
Coleções, Arrays, String e Wrapper Classes
Sintaxe Exemplo
A maioria dos programadores Java usa o primeiro estilo porque ele separa o
tipo da variável (no exemplo acima int) do nome da variável, tornando o
código mais legível.
6-16
Coleções, Arrays, String e Wrapper Classes
Criando arrays
Vetores devem ser criados usando o operador new. O tamanho do vetor
deve ser especificado entre colchetes.O tamanho deve ser um inteiro, mas não
precisa ser necessariamente uma constante. Pode ser uma expressão avaliável
somente em tempo de execução. Uma vez que um vetor é criado, o seu
tamanho permanece o mesmo por toda a existência do vetor.
// CONSTRUÇÕES VÁLIDAS
// CONSTRUÇÕES INVÁLIDAS
6-17
Coleções, Arrays, String e Wrapper Classes
Inicializando arrays
Figura 6-9: Declaração, criação e inicialização de vetor a partir de lista de valores int.
Inicializadores de vetor são muito úteis para criar tabelas de pesquisa, como
mostrado no seguinte exemplo:
int [] diasMes = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
Código 6-26: Declaração, criação e inicialização de vetor a partir de lista de valores String.
6-18
Coleções, Arrays, String e Wrapper Classes
6-19
Coleções, Arrays, String e Wrapper Classes
Arrays de objetos
Os passos para criar um vetor de referências são os mesmos que para criar
um vetor de tipos primitivos, com uma única exceção: você deve sempre
inicializar os elementos do vetor porque isto não é feito automaticamente.
String [] nomes;
exemplo:
Código 6-27: Declaração de vetor String.
exemplo:
Código 6-28: Criação do vetor String com tamanho 3
6-20
Coleções, Arrays, String e Wrapper Classes
6-21
Coleções, Arrays, String e Wrapper Classes
// Inicializadores
String[] produtos = {"CD", "DVD", "VHS", "MP3"}
A Propriedade length
Cada vetor tem um atributo length que contém o número de elementos do
vetor. Ao usar length, você evita ter de armazenar o tamanho do vetor em outra
parte de seu código.
6-22
Coleções, Arrays, String e Wrapper Classes
Um elemento de vetor pode ser passado para um método, e neste caso, por
ser um objeto, a referência para o objeto é que será passada.
6-23
Coleções, Arrays, String e Wrapper Classes
Arrays e Exceções
Exceções são levantadas dependendo de como vetores são manipulados.
Caso você tente acessar uma posição inválida de um vetor, o programa será
interrompido pela exceção ArrayIndexOutOfBoundsException.
// Exceção ArrayIndexOutOfBoundsException
String[] lista = new String[4];
System.out.println(lista[5]);
// Exceção NullPointerException
Produto[] listaProdutos = new Produto[3];
String nomeProduto = listaProdutos[0].getNome();
6-24
Coleções, Arrays, String e Wrapper Classes
Arrays multidimensionais
Java suporta vetores multidimensionais, isto é, vetor de vetores.
matriz[indiceLinha][indiceColuna] = valor;
6-25
Coleções, Arrays, String e Wrapper Classes
Strings:
Código 6-36: Recepção de parâmetros utilizando J2SDK 1.5.
6-26
Coleções, Arrays, String e Wrapper Classes
API Colletion
Este frameword está dentro do pacote java.util, desta forma este pacote
deve ser sempre importado quando se desejar trabalhar com coleções.
Principais métodos:
6-27
Coleções, Arrays, String e Wrapper Classes
A interface Iterator
Métodos:
- remove()
- hasNext()
- next()
6-28
Coleções, Arrays, String e Wrapper Classes
A interface Enumeration
Métodos:
- boolean hasMoreElements();
- Object nextElement();
6-29
Coleções, Arrays, String e Wrapper Classes
Interfaces do framework
Neste framework existem várias interfaces que podem ser utilizadas, estas
interfaces são estruturas que permitem armazenar objetos de formas específicas.
Vamos ver algumas delas abaixo.
Interface Set
No conceito matemático, um conjunto é justamente um grupo de itens
únicos, sem elementos duplicados.
Interface List
Como o próprio nome já nos diz, representa uma lista que permite
duplicatas. A interface List estende a interface Collection. Existem duas List
implementations disponíveis na Collections Framework: ArrayList e LinkedList.
A Interface Map
Um map é um tipo especial de grupo sem duplicatas. Dentro da Collections
API, java.util.Map define esta interface. Ele mapeia os valores chaves para os
objetos armazenadao. O valores chaves são usados para procurar, ou indexar os
dados armazenados.
6-30
Coleções, Arrays, String e Wrapper Classes
A classe ArrayList
package com.targettrust.exemplos;
import java.util.*;
/**
* - Elementos não ordenados
* - Permite duplicados
* - null É permitido
* - Semelhante a classe Vector
* - Acesso aleatório
*/
6-31
Coleções, Arrays, String e Wrapper Classes
A classe Vector
Uma vez que o tamanho do array é definido você não pode mudar o
tamanho do array. Mas em java isso é possivel utilizando o mecanismo de
refleção do Java que foi introduzido no Java 1.1, mas ele possui suas próprias
limitações.
Esta classe possui os seus métodos sincronizados desta forma deve ser
utilizada quando o acesso ao objeto for concorrente. Já se o acesso não tiver
esta característica então deve ser utilizada a classe ArrayList que não é
sicronizada e é, portanto, mais rápida.
Para lidar com este tipo de situação em Java utilize Vector, ele cresce e
reduz seu próprio tamanho automáticamente. Isso permite somente objetos que
não são primitivos. Para enviar primitivas, converta as primitivas à um objeto e
envie elas para o vector.
Construtores:
- Vector(int initialCapacity);
- Vector(int initialCapacity, int capacitIncrement);
- Vector()
Métodos:
6-32
Coleções, Arrays, String e Wrapper Classes
package com.targettrust.exemplos;
import java.util.*;
/**
* - Elementos não ordenados
* - Permite duplicados
* - null É permitido
* - Acesso aleatório
*/
public class VectorExemplo {
public static void main(String[] args) {
Vector lista = new Vector();
lista.add("Java J2EE");
lista.add("Microsoft Net");
lista.add("Linux");
lista.add("Oracle");
lista.add("Web Designer");
lista.add("Java J2EE");
lista.add(null);
System.out.println( lista.get(0) );
System.out.println( lista );
// [Java J2EE]
// [Java J2EE, Microsoft Net, Linux, Oracle, Web Designer, Java J2EE,
null]
}
}
6-33
Coleções, Arrays, String e Wrapper Classes
A classe Hashtable
Esta estrutura é uma das mais rápidas quando o assunto é pesquisa, uma
vez que o acesso ao objeto armazenado é direto através de chaves.
package com.targettrust.exemplos;
import java.util.*;
/**
* - Elementos não ordenados
* - NÃO permite duplicados
* - null NÃO é permitido
* - Acesso baseado em chave
*/
public class HashtableExemplo {
public static void main(String[] args) {
Hashtable lista = new Hashtable();
lista.put(new Integer(1), "Java J2EE");
lista.put(new Integer(2), "Microsoft Net");
lista.put(new Integer(3), "Linux");
lista.put(new Integer(4), "Oracle");
lista.put(new Integer(5), "Web Designer");
lista.put(new Integer(6), "Java J2EE");
6-34
Coleções, Arrays, String e Wrapper Classes
A classe LinkedList
package com.targettrust.exemplos;
import java.util.*;
/**
* - Elementos não ordenados
* - Permite duplicados
* - null É permitido
*/
System.out.println( lista );
// [Java J2EE, Microsoft Net, Linux, Oracle, Web Designer, Java J2EE,
// null]
}
}
6-35
Coleções, Arrays, String e Wrapper Classes
Generics
Observe o código acima e perceba que na linha 6 não foi preciso realizar
um “casting” para converter o objeto retirado da coleção. O mesmo havia sido
armazenado internamente como um objeto Aluno e não como sendo do tipo
“Object”.
// Recupera o Aluno
Aluno x = hash.get( a.getNome() );
6-36
Coleções, Arrays, String e Wrapper Classes
// Mostra dados
out.printf( "Dados: %s %s", x.getNome(), x.getTelefone() );
Código 6-44: Usando generics
Acima você tem um código onde criamos uma HashMap para adicionar
objetos do tipo Aluno associados a chaves do tipo String. Na declaração de
HashMap especificamos que a chave será do tipo String bem como os objetos a
serem armazenados serão Alunos, isto evita qualquer necessidade de “casting”
posterior para recuperar os dados da estrutura, bem como fortalece o sistema de
tipos proibindo que sejam utilizados tipos diferentes dos especificados na
declaração. A linha abaixo não compilaria pois o tipo da chave esta sendo
violada.
public Grupo() {
elementos = new ArrayList();
}
6-37
Coleções, Arrays, String e Wrapper Classes
6-38
Coleções, Arrays, String e Wrapper Classes
Autoboxing
Integer i = 10;
System.out.println( i );
Código 6-49: Autoboxing
// Criando os objetos
Integer um = new Integer(1);
Integer dois = new Integer(2);
Integer tres = new Integer(3);
6-39
Coleções, Arrays, String e Wrapper Classes
int i = 2;
int j = 2;
lista.add(i);
lista.add(j);
System.out.println( (i==j) );
System.out.println( lista.get(0)==lista.get(1) );
6-40
Coleções, Arrays, String e Wrapper Classes
true
true
true
true
false
true
6-41
Coleções, Arrays, String e Wrapper Classes
6-42
Coleções, Arrays, String e Wrapper Classes
Exercícios
1. Neste exercício você irá criar uma classe nova para representar um
pacote de cursos. Um pacote de cursos contém vários cursos. Teremos que saber
quantos há neste pacote, bem como o valor total do pacote. Este valor será a
soma do preço de todos os cursos. Veja abaixo os passos para isto:
6-43
Coleções, Arrays, String e Wrapper Classes
Passo 3: Defina nesta classe uma operação que possa receber objetos da
classe curso e os adiciona a coleção cursos. Quando esta coleção atingir um
número de 10 cursos deve ser impresso um aviso.
Passo 4: Crie nesta classe uma operação capaz de calcular o valor total do
pacote. Para fazer este cálculo você deverá percorrer a coleção e obter o
preço de cada curso adicionado a ela. Use for-each para percorrer o ArrayList.
6-44
Java Fundamentals
7. Tratamento de Exceções
7-1
Tratamento de Exceções
Objetivos
• Compreender as Vantagens do tratamento de Exceções em Java;
• Manipular, Tratar, Propagar, Capturar e Criar Exceções.
7-2
Tratamento de Exceções
Introdução
Uma exceção é um evento que ocorre durante a execução de um
programa que interrompe o fluxo normal das instruções. Muitos tipos de erros
podem causar exceções, tais como tentar acessar um elemento de um vetor
fora dos limites ou tentar dividir um número por zero.
7-3
Tratamento de Exceções
int leituraArquivo {
abre o arquivo;
le o arquivo;
fecha o arquivo;
}
Esta função poderia ter diversos erros potenciais, tais como erro na abertura
do arquivo, erro na leitura da primeira linha, erro no fechamento do arquivo.
int leituraArquivo {
int codigoErro = 0;
abre o arquivo;
if (erroAberturaArquivo)
codigoErro = -1;
else {
le o arquivo;
if (erroLeituraArquivo) codigoErro = -2;
fecha o arquivo;
if (erroFechamentoArquivo) codigoErro = -3;
}
return codigoErro;
}
Código 7-2: Exemplo de código condicional para tratamento de arquivos com retorno de valor.
7-4
Tratamento de Exceções
leituraArquivo {
try {
abre o arquivo;
le o arquivo;
fecha o arquivo;
}
catch (erroAberturaArquivo) {
manipula erro
}
catch (erroLeituraArquivo) {
manipula erro
}
catch (erroFechamentoArquivo) {
manipula erro
}
}
Código 7-3: Exemplo de código estruturado para tratamento de arquivos utilizando Java.
7-5
Tratamento de Exceções
7-6
Tratamento de Exceções
Com isso, o método informa aos seus chamadores sobre as exceções que
ele pode levantar e estes métodos podem decidir de modo inteligente o que
fazer com tais exceções.
7-7
Tratamento de Exceções
Além disso, é fácil imaginar que alguns métodos queiram fazer o tratamento
das exceções que se enquadrem numa categoria (por exemplo, todas as
exceções referentes a vetores), e outros métodos queiram manipular apenas
exceções específicas (por exemplo, apenas a inserção de um elemento de tipo
errado no vetor).
7-8
Tratamento de Exceções
catch (FileNotFoundException e) {
tratamento da exceção
}
(FileNotFoundException) é:
catch (IOException e) {
tratamento
}
usado.
Código 7-6: Bloco catch para tratamento de exceção de grupo (IOException).
exceção:
Código 7-7: Bloco catch para tratamento de qualquer exceção.
7-9
Tratamento de Exceções
7-10
Tratamento de Exceções
Manipulando Exceções
A classe Throwable é a superclasse de todos os erros e exceções na
linguagem Java, possuindo duas subclasses: Error e Exception.
Subclasse Error
Porém, embora estas exceções não precisem ser capturadas, elas não
podem ser ignoradas. Se uma exceção de execução ocorre e o código não as
7-11
Tratamento de Exceções
7-12
Tratamento de Exceções
Tratando Exceções
Quando um método utilizado pelo programa levantar uma exceção, o
programador possui três opções:
7-13
Tratamento de Exceções
Manipulando Exceções
O mecanismo para manipulação de exceções em Java é formado pelos
comandos try/catch/finally.
Para manipular uma exceção, o código deve ser organizado nos seguintes
blocos:
try {
...
chamada do método que pode levantar exceção
...
}catch (excecaoTipo1){
trata excecaoTipo1
}catch (excecaoTipo2){
trata excecaoTipo2
}catch (excecaoTipo3){
trata excecaoTipo3
}finally {
...
}
7-14
Tratamento de Exceções
O Bloco try
O Bloco catch
Um bloco try pode ser seguido por zero ou mais blocos catch, que
especificam como tratar os vários tipos de exceções. Cada cláusula catch é
declarada com um argumento, que deve ser do tipo Throwable ou uma
subclasse deste.
O Bloco finally
7-15
Tratamento de Exceções
Imagine agora o exemplo acima sem o bloco catch que trata a exceção
ArrayIndexOutOfBoundsException. O que aconteceria se a classe fosse
chamada utilizando apenas converteNumero?
7-16
Tratamento de Exceções
Propagando Exceções
Quando uma exceção não pode ser tratada localmente ou se deseja que
ela seja tratada em outro local, ela pode ser propagada para o código que
chamou o método.
Para propagar uma exceção para o método acima, a exceção deve ser
indicada na declaração do método chamado. Isto é feito utilizando o comando
throws.
Código 7-10: Propagação de exceções utilizando a cláusula throws.
Código 7-11: Tratamento de exceções utilizando a cláusula throws para o contexto anterior.
7-17
Tratamento de Exceções
Lançando Exceções
O programador pode lançar exceções em seu código para indicar alguma
condição anormal. Estas exceções podem ser exceções padrões do sistema ou
exceções criadas pelo programador.
7-18
Tratamento de Exceções
Criando Exceções
Para criar as suas próprias exceções, o programador deve estender a classe
Exception. A classe RuntimeException não deve ser estendida, pois esta classe
é utilizada para exceções comuns que não precisam ser verificadas.
7-19
Tratamento de Exceções
Código 7-14: Capturando exceções e lançando uma exceção diferente (exceção particular).
7-20
Tratamento de Exceções
7-21
Tratamento de Exceções
Exercícios
1. Neste exercício você irá criar uma exceção personalizada para tratar
erros de validação que podem ser então lançados quando estiver
executando a aplicação e um valor incorreto for passado, por exemplo,
para o método que atribui valores a um produto.
7-22
Java Fundamentals
Objetivos
8-2
Classes abstratas e interfaces
Abstração
Em Java você pode definir classes que representem, na definição de um
projeto, um nível mais alto de abstração. Ao usar estas classes o projetista terá
uma visão melhor de como as subclasses devem se parecer e mesmo quais
métodos são obrigatórios em todas as subclasses.
Figura 8-1: Definindo a classe Produto como abstrata para não ser instanciada.
Classes Abstratas
Uma classe abstrata é simplesmente uma classe que não pode ser
instanciada. Somente suas subclasses podem ser instanciadas. Por exemplo,
Produto não contém detalhes suficientes para fornecer algo útil para o negócio.
Métodos Abstratos
Métodos abstratos vão um passo além da herança padrão. Um método
abstrato definido dentro de uma classe abstrata deve ser implementado pelas
subclasses destas. Esta técnica permite que o projetista de classes decida
exatamente quais comportamentos as subclasses devem ter.
Interfaces
Interface é a especificação de um conjunto de métodos, similares a uma
classe abstrata. Além do que uma classe abstrata pode oferecer, uma interface
pode efetivamente permitir herança múltipla.
8-3
Classes abstratas e interfaces
sendo abstrata:
Figura 8-2: Definições das classes Produto, DVD e CD. Herança e Abstração da classe Produto.
O usuário não deveria ser capaz de criar objetos Produto, porque Produto
é apenas uma classe parcial e intermediária. Produto existe somente para que
possa ser estendida por classes mais especializadas, tais como CD ou DVD.
Código 8-1: Erro de compilação na criação de uma instância de uma classe abstrata.
subclasses. Uma classe abstrata não pode ser instanciada, ou seja, não podemos
chamar seus construtores.
8-5
Classes abstratas e interfaces
Métodos Abstratos
Ao projetar uma hierarquia de classes, há provavelmente algumas
operações que todas as classes deverão ter, cada qual de sua própria maneira.
Por exemplo, em um negócio de aluguel de fitas, o vendendo deve saber se um
item pode ser alugado ou não.
Para representar este conceito em Java, o método “este item pode ser
importado” é definido na classe Produto. Entretanto, não há uma
implementação sensata para este método em Produto, porque cada tipo de
item tem suas próprias exigências.
Esta abordagem não é boa o suficiente porque não força cada uma das
subclasses concretas a sobrescrever o método. Suponha, por exemplo, que a
classe DVD se esqueça de sobrescrever o método isImportado(), o que
aconteceria se o usuário chamasse este método a partir de uma referência para
DVD?
8-6
Classes abstratas e interfaces
8-7
Classes abstratas e interfaces
Interfaces
Uma interface é similar a uma classe abstrata, exceto que ela não possui
nenhum método concreto ou variáveis de instância. É apenas uma coleção de
declarações de métodos abstratos e constantes isto é, variáveis declaradas
como static public final.
Estes métodos podem ser usados por outras classes para implementar
comportamentos específicos como, por exemplo, uma rotina de ordenamento.
8-8
Classes abstratas e interfaces
Exemplos de interfaces
Interfaces descrevem um aspecto de comportamento que muitas classes
possuem. O nome de uma interface é geralmente um comportamento como:
Compra, Venda, etc. Difere, portanto, do nome de uma classe, que é usualmente
um substantivo, como cliente ou produto.
- void commit()
- void rollback()
- void close()
- void clearWarnings()
- Statement createStatement()
- void setAutoCommit(boolean)
- boolean isClosed()
8-9
Classes abstratas e interfaces
Definindo Interfaces
8-10
Classes abstratas e interfaces
Implementando Interfaces
O exemplo abaixo mostra o exemplo da classe OracleConn que implementa
a interface Conncetion. OracleConn deve implementar todos os métodos de
todas as interfaces que ele declare implementar (interfaces presentes na cláusula
implements).
Código 8-8: A classe OracleConn deve implementar TODOS os métodos da interface Conncetion.
8-11
Classes abstratas e interfaces
8-12
Classes abstratas e interfaces
Exercícios
boolean imprimir()
void parar()
boolean remover(Documento doc)
void refresh()
void pausa()
Passo 3: Transforme a operação que retorna o preço abstrata uma vez que
a forma de calcular o preço irá depender de cada uma das subclasses.
8-13