Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila 3
Apostila 3
Linguagem Java
por Christian Cleber Masdeval Braz
Sumrio
1 Introduo ao Java
4
4
5
5
5
6
7
8
8
9
9
9
10
10
3 Variveis e Operadores
13
13
14
17
17
18
20
4 Controle de Fluxo
22
22
23
23
24
24
24
25
5 Mtodos
28
28
28
28
29
29
32
6.1 Encapsulamento
6.2 Criando Objetos e Acessando Dados Encapsulados
6.3 Construtores
6.4 O Ponteiro this
35
36
37
39
43
7.1 Pacotes
7.2 Atributos e Mtodos de Classe
7.3 Destrutores e o Mtodo finalize()
43
44
45
8 Herana e Polimorfismo
48
8.1 Herana
8.2 Polimorfismo
8.3 - Criao de um objeto de uma subclasse e o ponteiro super
8.4 Mtodos e Classes final
48
49
52
53
56
56
57
62
10.1 Strings
10.1.1 Operaes em Strings
10.1.2 Convertendo primitivos para Strings e vice-versa
10.1.3 A classe StringBuffer
10.2 Arrays
10.2.1 Arrays de Primitivos
10.2.2 Arrays de Referncias
10.2.3 Arrays como Objetos
10.2.4 Arrays e Excees
10.2.5 Arrays Multidimencionais
62
63
64
64
65
65
66
66
67
67
11 Tratamento de Excees
72
72
73
73
75
76
1 Introduo ao Java
A linguagem Java foi desenvolvida pela Sun Microsystems em 1995. Apesar de
relativamente nova, a linguagem obteve uma espetacular aceitao por programadores
do mundo inteiro, tendo se difundido como nunca antes ocorreu com uma linguagem de
programao. Um fator que colaborou com isso, o fato da linguagem possuir
vantagens agregadas tais como: orientao a objetos, independncia de plataforma,
multitarefa, robusta, segura e distribuda. Com o advento da Internet, que tornou ainda
mais necessrio a comunicao entre plataformas heterogneas, estes fatores fizeram
com que o Java fosse a tecnologia perfeita para este novo cenrio.
1.1 - Histrico da Linguagem
No incio da dcada de 90, um pequeno grupo de projeto da Sun pretendia criar uma
nova gerao de computadores portteis inteligentes, que pudessem se comunica entre si
de diversas formas. Para isso, decidiu-se criar uma plataforma de desenvolvimento onde
o software pudesse ser executado em diversos tipos de equipamentos. Para o
desenvolvimento desta plataforma foi escolhida a linguagem de programao C++.
A linguagem C++ no permitia realizar com facilidade tudo o que o grupo pretendia.
Neste ponto, James Gosling, coordenador do projeto, decidiu criar uma nova linguagem
de programao que pudesse atend-los em suas necessidades.
A criao dos chips inteligentes foi abandonada devido ao alto custo de produo.
Posteriormente, a exploso da Internet no mundo todo fez surgir a necessidade de uma
tecnologia onde computadores de diferentes plataformas pudessem conversar. Surge
da, baseada na linguagem criada para o projeto de Gosling, a linguagem Java.
1.2 Caractersticas da Linguagem
Neste curso, ser suficiente para ns utilizarmos apenas a plataforma J2SE, j que nosso
objetivo principal aprender a linguagem Java.
1.4 Java 2 System Development Kit (J2SDK)
O J2SDK corresponde ao produto disponibilizado pela SUN que implementa a
plataforma J2SE, provendo o ambiente bsico necessrio para o desenvolvimento de
aplicaes. Ele pode ser obtido no site da SUN no endereo http://java.sun.com.
O J2SDK consiste de:
JRE (Java Runtime Environment): ambiente para execuo de aplicaes
Ferramentas para desenvolvimento: compilador, debugger, gerador de
documentao, empacotador JAR, etc
Conjunto de APIs e cdigo fonte das classes
1.5 A Mquina Virtual Java
O JRE um conjunto de programas que possibilita executar aplicaes Java. O corao
do JRE a Mquina Virtual Java ou Java Virtual Machine (JVM). a JVM que
possibilita uma das caractersticas mais impressionantes da linguagem Java, a
portabilidade do cdigo. Vamos compreender um pouco como isso funciona
MeuPrograma.java
_____
_____
_____
_____
_____
_____
DOS
SCO
Win
Linux
JVM
JVM
JVM
JVM
Javadoc
Descrio
Interpreta arquivos .class (bytecode) para
instrues especficas de plataforma.
Somente o JVM no suficiente para uma
aplicao Java ser executada. O JRE consiste
do JVM mais ncleo de classes da
plataforma Java e arquivos de suporte. O
JRE o que deve estar instalado para a
execuo de uma aplicao Java.
Biblioteca de classes e interfaces que
auxiliam no desenvolvimento das aplicaes.
Corresponde ao nome da tecnologia Java at
Novembro de 1999. JDK 1.1 foi a ltima
verso. composto por : JVM, JRE,
compilador, ferramentas e APIs.
o nome da tecnologia a partir de
Novembro de 1999. Corresponde ao JDK 1.2
na antiga terminologia. composto por :
JVM, JRE, compilador, ferramentas e APIs.
Corresponde a documentao das APIs. A
ltima verso pode ser encontrada em
http://java.sun.com/j2se/1.4.2/docs/api/. A
ferramenta Javadoc auxilia na criao da
documentao das classes.
Definio de Mtodos
Corpo do Programa
}
2.1 Princpios Bsicos da Linguagem
Java case-sensitive
As classes, mtodos ou blocos de cdigo sempre estaro delimitados por um abrir (
{ ) e fechar ( } ) de chaves.
Um comando deve sempre ser finalizado por um ponto e vrgula ( ; )
Dois tipos de comentrio : //Comentrio de uma linha e /* Comentrio de Vrias */
Nomes de variveis, classes e mtodos devem sempre comear por letras, $ ou _
todos os seus mtodos. Os mtodos por sua vez definem as operaes que podem ser
realizadas pela classe. Mais sobre atributos ser visto no captulo Variveis e
Operadores e os mtodos sero vistos em maiores detalhes no captulo Mtodos.
2.3 O Mtodo Main
Uma aplicao em Java caracterizada por possuir o mtodo main(). A declarao do
mtodo deve ser : public static void main( String[] args ).
O mtodo main um mtodo especial pois representa o ponto de entrada para a
execuo de um programa em Java. Quando um programa executado, o interpretador
chamar primeiramente o mtodo main da classe. ele quem controla o fluxo de
execuo do programa e executa qualquer outro mtodo necessrio para a
funcionalidade da aplicao.
Nem toda classe ter um mtodo main. Uma classe que no possui um mtodo main no
pode ser executada pois no representa um programa em Java. Ela ser sim, utilizada
como classe utilitria para a construo de outras classes ou mesmo de um programa.
2.4 Modificadores de Acesso
A declarao de uma classe geralmente comea com o modificador de acesso public, o
que significa que pode ser acessada por qualquer outra classe. Se for omitido, a classe
ser visvel apenas por outras classes do mesmo pacote que a contm.
2.5 Conveno de Nomes
Nome de Arquivos :
O cdigo fonte de programas Java armazenado em arquivos com extenso
.java.
Um arquivo fonte poder armazenar a definio de mais de uma classe, mas
uma boa prtica armazenar apenas uma classe por arquivo fonte.
Use o nome da classe principal do arquivo como sendo o nome do arquivo.
Quando compilamos um arquivo fonte, ser gerado um arquivo com extenso
.class para cada classe definida e com o mesmo nome da classe. O arquivo .class
contm o bytecode gerado com a compilao.
Exemplos : Cliente.java , ItemEstoque.java
Nome de Mtodos : Use verbos para nome de mtodos. Faa a primeira letra do
nome minscula com cada letra inicial interna maiscula. Por exemplo :
getUserName()
Nome de Variveis : Escolha nomes que indiquem o uso pretendido da varivel.
Utilize a primeira letra do nome minscula e a inicial das outras palavras que
formam o nome maiscula. Exemplos : customerName, customerCreditLimit
Tamanho do segundo
10
Exerccios :
1 Siga os passos abaixo para criar e executar sua primeira aplicao Java. Ela possui
alguns erros do jeito que est. Tente descobrir e corrigi-los antes de compilar. Caso no
consiga, compile e tente descobrir os erros a partir da sada apresentada.
a) Abrir um editor de textos e escrever o programa
class PrimeiraApp
{
public void main( String args )
{
System.out.println(Primeira aplicao.)
}
}
b) Salvar o arquivo dando a ele o mesmo nome da classe e com a extenso .java.
c) Compilar o arquivo
prompt> javac PrimeiraApp.java
Se a compilao foi com sucesso, ela gerou um arquivo PrimeiraApp.class, que o
arquivo a ser executado.
d) Execute o programa utilizando o interpretador java
prompt> java PrimeiraApp
2 Examine o cdigo abaixo e responda as questes que seguem.
public class HelloWorld {
private int age;
private String telephone;
private String address;
public static void main (String[] args){
showMessage(Hello World!);
}
static void showMessage(String msg) {
int messageNumber = 0;
int messagePriority =;
messageNumber = messageNumber + 1;
System.out.println(msg + + messageNumber);
}
}
11
12
3 Variveis e Operadores
Uma varivel um nome simblico para uma poro de memria na qual um valor
pode ser armazenado. Toda varivel tem as seguintes caractersticas :
Como Java uma linguagem fortemente tipada, todas as variveis devem ser
declaradas antes de serem usadas. O tipo de uma varivel determina o tipo de
informao que pode ser armazenada nela. Variveis em Java podem ser declaradas
como atributos, no corpo da classe, ou podem ser declaradas localmente em qualquer
parte da implementao de um mtodo. Variveis tambm possuem um escopo, o qual
determina onde no programa ela estar visvel e poder ser acessada.
A declarao de variveis no Java segue a seguinte sintaxe :
item_Cost
_itemCost
itemCost2
Ilegais
item#Cost
item*Cost
2itemCost
item-Cost
sem%
Palavras-Chaves
Toda linguagem tem um grupo de palavras que o compilador reserva para seu prprio
uso. Essas palavras-chaves no podem ser usadas como identificadores em seus
programas. Em Java, as palavras reservadas so :
13
abstract
boolena
break
byte
case
*cast
*catch
char
class
*const
continue
default
do
double
else
extends
final
finally
float
for
*future
generic
*goto
if
implements
import
*inner
instanceof
int
interface
long
native
new
null
operator
*outer
package
private
protected
public
*rest
return
short
static
super
switch
synchronized
this
throw
throws
transient
try
*var
void
volatile
while
Categoria
Tipo
Tamanho
Inteiro
Inteiro
Inteiro
Inteiro
Ponto Flutuante
Ponto Flutuante
Caracter
Lgico
byte
short
int
long
float
double
char
boolean
8 bits
16 bits
32 bits
64 bits
32 bits
64 bits
16 bits
true / false
Inteiro
14
Tipo
Tamanho
Variao
byte
short
int
long
8 bits
16 bits
32 bits
64 bits
-128 a + 127
-32.768 a +32.767
-2.147.483.648 a +2.147.483.647
9.223.372.036.854.775.808 a
9.223.372.036.854.775.807
Por default, literais1 inteiros so de 32 bits (int) e podem ser especificados como
decimais, octais e hexadecimais. Para definir um literal como um nmero decimal, basta
atribuir um nmero decimal qualquer, como octal deve-se acrescentar um 0 no incio
do nmero e como hexadecimal um 0x ou 0X. Os octais contm os dgitos de 0-7 e os
hexadecimais os caracteres 0-9 e A-F em maisculo ou minsculo. possvel tambm
definir literais inteiros do tipo long, ou seja, com 64 bits. Para isso, basta acrescentar
um L no final do nmero. O efeito disso que, se a varivel foi definida como int, o
compilador passa a interpret-la como long.
Exemplos de literais do tipo Inteiro :
Decimal
Octal
Hexadecimal
Long
0
02
0x0
365L
1998
077
0x2a
077L
-23456
0123
0X1FF
0x1ffL
Ponto Flutuante
Os tipos de dados de ponto flutuante armazenam nmeros que possuem uma parte
decimal, isto , representam nmeros reias. Em Java so dois os tipos dessa categoria :
float e double. O tipo float permite representar valores reais com preciso simples (32
bits) enquanto o tipo double permite representar com preciso dupla (64 bits).
Deve ser utilizado o ponto como separador de casas decimais. Quando necessrio, os
nmeros podem ser escritos em notao exponencial, usando o caracter e ou E. Por
exemplo : 4.2 * 106 pode ser representado por 4.2e6.
A representao de um literal com ponto flutuante , por default, considerada do tipo
double. Para representar um literal do tipo float com preciso simples (32 bits) devemos
incluir a letra F ou f no final do nmero.
Alguns exemplos de literais com ponto flutuante so : 1.0 , 4.7 , .47 , 1.22e19 (1.22 *
1019 ) , 4.6E-9 (4.6 * 10-9) , 6.2f , 6.21F
Caracter
O nico tipo dessa categoria o tipo char. Uma varivel do tipo char permite armazenar
apenas um caracter. Caso seja necessrio armazenar palavras ou textos dever ser
utilizado o tipo String, que no um tipo primitivo. necessrio utilizar aspas simples
para atribuir um literal para uma varivel do tipo char, por exemplo : char letra = a;
Enquanto variveis armazenam valores, os literais so os prprios valores. Literais podem ser usados em
qualquer parte de um programa Java.
15
Java utiliza o padro UNICODE para armazenar as variveis do tipo char. Nesse
padro, cada caracter ocupa 16 bits, podendo representar at 32.768 caracteres
diferentes.
Os literais dessa categoria podem representar caracteres imprimveis ou no. Abaixo
segue uma relao de alguns deles :
a-z
A-Z
\n
\
\
Uma letra de a - z
Uma letra de A- Z
Nova linha
Aspas duplas
Aspas simples
\r
Retorno de carro
\b
Retrocesso do cursor
\u006F Valores Unicode
\t
Tabulao
Lgico
Essa categoria tambm possui apenas um tipo de dado que o tipo boolean. Uma
varivel do tipo boolean pode armazenar apenas dois valores lgicos : true ou false. O
Java no associa valores numricos para true e false como ocorre em outras linguagens
de programao.
Tipos de Dados Armazenados por Referncia
Os tipos podem ser primitivos ou de referncia. Os primitivos representam valores
numricos, caracteres individuais e valores booleanos. Os tipos de referncia so
representados por Classes, Interfaces e Arrays e podem ser definidos pelo usurio. A
principal diferena entre os tipos primitivos e de referncia a memria que deve ser
alocada, em tempo de execuo, para uma varivel de referncia, pois o ambiente de
execuo no sabe quanta memria ser necessria.
Na lista de tipos primitivos no encontramos um para tratar de strings de caracteres, isto
porque em Java strings so manipuladas atravs de uma classe especfica para isso, a
classe String. Veremos mais sobre ela posteriormente.
Todo programa em Java possui dois tipos de memria : principal (stack) e auxiliar
(heap). Uma varivel do tipo primitivo armazena o seu contedo diretamente na
memria principal. J uma varivel do tipo referncia armazena o seu contedo na
memria auxiliar e armazena na memria principal apenas o endereo onde foi
armazenado o contedo da varivel. Abaixo segue uma representao grfica desse
esquema :
Memria Stack
Memria Heap
(Tipo Primitivo)Var1
valor
valor(es)
endereo
16
Incio do bloco de x
Incio do bloco de y
int y;
x = 10;
}
y = 20;
Fim do bloco de x
byte
short
int
long
b3 = b1+ b2;
Erro, pois b1 + b2 resulta em 254
b3 = (byte) (b1 + b2);
Est correto, mas ir ocorrer perda de informao!
A tabela abaixo apresenta um resumo das possibilidades de cast, apontando os casos
quando isso poder causar perda de dados.
Tipo
Original
byte
Short
int
long
float
double
char
boolean
byte
short
int
C, P
C, P
C, P
C, P
C, P
C, P
X
C, P
C, P
C, P
C, P
C
X
C, P
C, P
C, P
C
X
Tipo Destino
long float double
C, P
C, P
C
X
C, P
C, P
C
X
C
X
char boolean
C
X
C
X
C, P
X
C, P
X
C, P
X
C, P
X
X
X
3.5 Operadores
Operadores so caracteres especiais usados para instruir o compilador a executar uma
determinada operao em um operando.
Operador de Atribuio
Operador
=
Nome
Atribuio
Exemplo
int var1 = 0, var2 = 0;
var2 = var1 + 10;
var1 = var2 = 50;
Operadores Aritmticos
Operador
+
*
/
%
Nome
Adio
Subtrao
Multiplicao
Diviso
Mdulo (resto da
diviso)
Exemplo
23+29
29-23
0.5 * salario
100/50
20%3
Resultado
52
6
2
2
Operadores Relacionais
Operador
==
!=
<
>
>=
<=
Nome
Igual
Diferente
Menor
Maior
Maior ou igual
Menor ou igual
true
false
true
true
false
Nome
AND
OR
NOT
XOR
Exemplo
(0 < 2) && ( 10 > 5)
( 10 >11 ) || (10 < 12 )
!( 1= = 4 )
( 1!= 0) ^ ( 2< 3 )
Resultado
true
true
true
false
Nome
mais igual
menos igual
vezes igual
mdulo igual
dividido igual
Exemplo (x = 10;)
x += 10;
x -= 10;
x *= 10;
x %= 10;
x /= 10;
Resultado
20
10
100
0
0
Atribuio Composta
Operador
+=
-=
*=
%=
/=
Resultado
Operadores Lgicos
Operador
&&
||
!
^
Exemplo
x = = 10
3 != 2
10 < 10
10 > 6
3 >= 3
7 <= 6
Incremento e Decremento
Operador ++ incrementa de um. Ex : int var1 = 4; var1++; //var1 = 5
Operador -- decrementa de um Ex : int var1 = 4; var1--; //var1 = 3
Este decremento ou incremento pode ser feito antes ou depois da utilizao da
varivel. Colocandose antes, primeiramente ser somado/subtrado 1 da
varivel e depois ela ser utilizada. Ao contrrio, se o operador vier aps a
varivel, primeiramente ela ser utilizada na expresso e o incremento ou
decremento ser feito depois disso. Ex :
int var1 = 2, var2;
var2 = var1++; //var2 vale 2
var2 = ++var1; //var2 vale 3
Precedncia de Operadores
A precedncia refere-se a ordem na qual os operadores so executados. Operadores de
mesma precedncia so executados de acordo com sua associatividade. Por exemplo,
considere a seguinte linha de cdigo :
19
int j = 3 * 10 % 7;
Os operadores * e % possuem a mesma precedncia e associatividade da esquerda para
direita. Assim, o * executado primeiro, produzindo o resultado 2. Se fosse colocado
um parnteses para modificar a precedncia desta forma int j = 3 * (10 % 7), o
resultado final seria completamente diferente (9).
A tabela baixo mostra os operadores Java em ordem de precedncia, onde a linha 1 tem
a mais alta precedncia. Com exceo dos operadores unrios, condicionais e o
operador de atribuio, os quais so associativos da direita para esquerda, todos os
outros operadores com a mesma precedncia so executados da esquerda para direita.
Precedncia
1
2
3
4
5
6
7
8
9
10
11
12
13
R = Direita
Operador
++ -- !
* / %
+ << >>
< > <= >=
= = !=
&
^
|
&&
||
?:
= op=
Comentrios
Operadores Unrios
Multi., Divi., Resto
Add, Sub.
Shift
Relacionais
Igualdade
Bit/Loginal AND
XOR (ou exclusivo)
Bit/Logical OR
AND
OR
Condicional
Atribuio
Associatividade
R
L
L
L
L
L
L
L
L
L
L
R
R
L = Esquerda
3.6 Constantes
Uma constante pode tanto ser definida como um atributo de classe como uma varivel
local. Uma constante uma vez que foi declarada e atribudo um valor para a mesma, no
permitido que outra atribuio seja efetuada, ocasionando um erro de compilao caso
isso ocorra. A atribuio do valor inicial pode ser feita no momento da declarao, ou
posteriormente em outra parte do programa.
Para declarar uma varivel do tipo constante, devemos utilizar o modificador final dessa
forma :
final <tipo> <identificador> [= valor];
Declare constantes com nomes descritivos, escritos com todas as letras em maisculo.
Separe nomes internos com underscores ( _ ). Exemplos :
final double MIN_WIDTH = 100.0;
final long MAX_NUMBER_OF_TIMES;
20
Exerccios :
1 Encontre os erros nas declaraes de variveis no cdigo abaixo e os corrija.
1.
2.
3.
4.
5.
6.
7.
2 Crie um programa seguindo as orientaes abaixo. Faa tudo que pede dentro do
mtodo main.
a) Declare duas variveis para armazenar os valores de dois itens de venda. Os valores
dos dois itens devem ser 2.95 e 3.50. Pense em nomes significativos para as
variveis e tambm considere qual deve ser seu tipo.
b) Use o System.out.println() para mostrar o contedo de suas variveis. Execute o
programa e veja a sada. Apresente uma mensagem significativa como O Item 1
custa 2.95 e ... (Dica : utilize o operador + para concatenar o texto com o valor da
varivel).
c) Declare uma outra varivel para armazenar o custo total dos itens. Utilize o operador
de adio para realizar o clculo e imprima o resultado.
d) Crie uma constante para armazenar a taxa de 8.25 % que deve ser cobrada sobre o
valor total. Armazene o clculo numa varivel chamada taxaCalculada e imprima o
resultado.
e) Adicione ao valor de cada item o valor da taxa calculado. Use a menor linha de
cdigo possvel para fazer isso. Some novamente os dois valores e atribua o
resultado a uma varivel chamada novoCusto.
f) Crie uma varivel booleana chamada muitoCaro. Escreva uma assertiva lgica para
setar esta varivel para true se novoCusto for maior que 10 e para false caso
contrrio. Imprima o valor obtido em muitoCaro. (No utilize if para escrever a
assertiva.)
3 Declare uma varivel chamada Long do tipo long e a inicialize com 100. Agora
declare duas variveis do tipo int, int1 e int 2, e inicialize int1 com 200. Agora faa int2
receber int1 mais Long e explique os resultados. Arrume o cdigo para que no ocorra o
erro anterior.
21
4 Controle de Fluxo
A maioria dos programas tomam decises que afetam seu fluxo. Os comandos que
tomam essas decises so chamados de comandos de controle.
4.1 Comando if else
Sintaxe :
if ( boolean_expr )
comando1;
[else
comando2;]
Exemplo :
if ( fim = = true )
System.out.println(Trmino!);
else
System.out.println(Continuando...);
Para mais de um comando ser executado depois da declarao, utiliza-se o conceito de
blocos, delimitados por { }.
Exemplo:
if ( fim = = false ) && (cont > 0){
cont ++;
System.out.println(Continuando...);
}
else {
cont = 0;
System.out.println(Trmino!);
}
recomendado sempre usar blocos de comandos para facilitar a leitura e compreenso
do cdigo.
possvel tambm criar comandos if aninhados.
Exemplo :
if ( fim = = false) && (cont < 0){
cont++;
}
else if (fim = = false) && (cont > 0){
cont--;
}
else {
cont = 0;
System.out.println(Trmino!!);
}
22
Deve resultar
em char, byte,
short ou int.
case constant1 :
comando1;
break;
case constant2 :
comando2;
break;
...
[default :
comando_default;]
}
Deve ser um
literal ou uma
constante !
Exemplos :
switch ( cmd ){
case 0: System.out.println(Item do menu 1);
menu = ++cmd;
break;
case 1: System.out.println(Item do menu 2);
menu = ++cmd;
break;
case 2: System.out.println(Item do menu 3);
menu = ++cmd;
break;
default: System.out.println(Comando invalido!);
}
4.3 Comando while
Implementa um loop para executar um bloco de comandos sucessivas vezes. A
expresso de comparao avaliada antes que o lao seja executado.
Sintaxe :
while ( boolean_expr ) {
comandos;
}
Enquanto a expresso
for verdadeira o lao
ser executado
Exemplo :
while ( i != 0 ){
salario = salario * 0.5;
i--;
}
23
Exemplo:
do {
do {
comandos;
} while ( boolean_expr );
}while ( i != 0 );
Exemplo:
for (i = 0; i < 20; i ++){
salario = salario * 0.5;
}
A inicializao e incremento podem ser feitos com mais de uma varivel. Neste caso
devem estar separados por vrgula.
for ( i = 0, j = 10 ; i < 8 && j > 2 ; i ++, j-- )
comando;
24
int i = 0;
while (true) {
System.out.println(i);
i++;
if ( i > 10 ) break;
}
...
4.7 Comando continue
Quando o comando continue encontrado (somente dentro de um lao), ele pra a
execuo naquele ponto e a transfere de volta para o incio do lao para dar incio a uma
nova iterao.
Exemplo :
Abandona a iterao corrente e
25
Exerccios :
1 Identifique e corrija os erros dos cdigos abaixo :
int x = 3, y = 5;
if (x >= 0)
if (y < 0)
System.out.println(y menor que x);
else
System.out.println(x negativo);
int x = 7;
if (x = 0)
System.out.println(x zero);
2 Determine o nmero de dias num ms. Voc deve usar um comando switch para
setar um inteiro com o nmero de dias no ms especificado. Por enquanto adicione todo
o cdigo no mtodo main().
a) Declare trs inteiros, um para manipular os dias (1-31), outro os meses (112) e um terceiro para manipular o ano. Inicialize estas variveis com um dia
da sua escolha.
b) Imprima a data no formato dd/mm/yyyy.
c) Declare uma varivel para armazenar o nmero de dias que contm o ms
escolhido. Ento, usando o comando switch, determine o valor para esta
varivel. So 30 dias em Abril, Setembro, Junho e Novembro e 31 nos
restantes exceto para Fevereiro que tem 28 (ignore o ano bissexto).
Experimente executar o programa com diferentes valores para o ms. O que
acontece se ele for executado com um ms invlido como 13 ? Para 27 de
Janeiro de 2000 a sada deve ser algo como
27/1/2000
31 dias no ms
3 Use um lao for para mostrar datas.
a) Usando um lao for, estenda seu programa de forma que ele imprima todas
as datas entre a que voc especificou at o final daquele ms. Para 27/1/2000
a sada deve ser
27/1/2000
28/1/2000
29/1/2000
30/1/2000
31/1/2000
26
Anos no Bissextos
1997
2001
1900
1967
5 Considere que a data que voc escolheu a data de emprstimo de uma mercadoria
e que necessrio saber qual a data de devoluo da mesma. A data de devoluo a
data atual mais 3 dias.
a) Declare trs variveis para controlarem o dia , ms e ano da data de
devoluo e uma outra com a quantidade de dias de emprstimo (inicializada
com 3).
b) Crie o cdigo para calcular a adio do tempo de emprstimo com a data
escolhida. A sada deve se assemelhar a algo como :
Data do Emprstimo : 27/2/2001
Nmero de Dias : 3
Data da Devoluo : 2/3/2001
Preste ateno na sada acima. A soma de trs dias na data de emprstimo resultou na
passagem de um ms para outro. Alm disso, como o ano 2001 no bissexto e o ms
de emprstimo foi fevereiro, ao somar-se 3 dias os dias que se passaram foram : 28/2
1/2 2/3 . Voc deve estar atento tambm para :
27
5 Mtodos
Quando definimos um objeto num programa orientado a objetos, implementamos todo o
comportamento desse objeto em um ou mais mtodos. Um mtodo em Java
equivalente a uma funo, subrotina ou procedimento em outras linguagens de
programao.
No existe em Java o conceito de mtodos globais. Todos os mtodos devem sempre
ser definidos dentro de uma classe.
A sintaxe para construo de um mtodo a seguinte :
[modificador] tipo_retorno identificador ([argumentos]) {
//Corpo do mtodo
}
5.1 Modificadores de Acesso
Java controla o acesso a atributos e mtodos atravs do uso dos modificadores de
acesso. So eles :
Conveno : Use verbos para nome de mtodos. Faa a primeira letra do nome
minscula com cada letra inicial interna maiscula. Por exemplo : getUserName(),
getMaxPrice().
5.3 Argumentos
28
Cada argumento deve ser declarado como define-se uma varivel, especificando o
seu tipo e nome.
Caso seja mais de um argumento, cada declarao deve estar separada por vrgula.
Exemplos :
public void setAge(int newAge)
{
age = newAge;
}
O comando return utilizado para passar o valor requerido de volta para quem chamou
o mtodo e obrigatrio quando o tipo de retorno no void. Ele deve receber um
nico valor ou uma expresso que deve ser compatvel com o tipo de retorno
especificado para o mtodo. Quando o comando encontrado, o mtodo termina sua
execuo imediatamente, ignorando todas as instrues subsequentes. Um comando
return sem valor de retorno retorna o tipo void, mas no obrigatria sua utilizao
nestes casos.
5.5 Passando Parmetros para um Mtodo
Passando um Primitivo : Quando um valor primitivo passado na chamada de um
mtodo, uma cpia deste valor criada e atribuda para o argumento do mtodo
responsvel por receb-la. Se o mtodo mudar este valor, apenas o valor do
argumento local ao mtodo afetado. Quando o mtodo terminar sua execuo, o
29
Imprimir 10
Texto inicial!
Texto inicial! Esta frase foi
acrescentada ao objeto dentro do
mtodo!
StringBuffer
30
Exerccios :
1) Digite e execute o cdigo abaixo, onde um objeto da classe String passado como
parmetro para um mtodo. Ocorreu algo de inesperado? Procure explicar o que.
public class testeMetodos{
public testeMetodos() {
}
public void concatMsg (String msg){
System.out.println("O valor de texto : " + msg.concat("Esta frase foi
acrescentada ao objeto dentro do mtodo!"));
}
public static void main(String[] args) {
testeMetodos testeMetodos1 = new testeMetodos ();
String texto = new String("Texto inicial!");
System.out.println("O valor de texto : " + texto);
testeMetodos1.concatMsg(texto);
System.out.println("O valor de texto : " + texto);
}
}
31
}
Ponto P1;
Estudo de Caso
Vamos analisar o problema abaixo extrado da computao grfica:
Desenhar um crculo na tela do computador. Deve ser possvel
configurar a cor que o crculo estar preenchido
bem como seu dimetro.
Dado o problema e seus requisitos, devemos proceder com a modelagem do mesmo,
isto , analisar suas caractersticas para decidir qual a melhor forma de representar a
soluo numa abordagem orientada a objetos. Vamos supor que no esteja disponvel
uma rotina que execute o que se pede. A nica coisa que sabemos como imprimir na
tela do computador uma linha dado seus pontos de origem e destino. Sendo assim,
baseado no que sabemos fazer, teremos que analisar o problema at conseguirmos
decomp-lo em estruturas mais primitivas que, quando combinadas, iro produzir uma
soluo. Os passos de raciocnio poderiam ser estes:
Deve ser possvel configurar o dimetro do crculo e o dimetro mede duas vezes o
raio.
O raio pode ser representado por uma linha cujo ponto inicial o centro do crculo e
o ponto final sua extremidade.
Uma linha formada por dois pontos, cada um com suas coordenadas (x,y) e possui
uma cor.
Uma cor definida por seus componentes RGB (Red, Green, Blue).
Bem, se sabemos pintar uma linha na tela, podemos definir o raio do crculo e ir
pintando uma linha do lado da outra, mantendo as coordenadas do centro constantes
e calculando as coordenadas da extremidade de forma que represente um grau de
distncia da linha anterior at completar 360.
ponto
linha
circulo
33
Em Java, os dados e os mtodos pertinentes a cada uma dessas entidades poderiam ser
modelados nas seguintes classes:
public class Cor
{
double Red;
double Green;
double Blue;
}
public class Ponto
{
double x;
double y;
void girar (int grau, Ponto p) {
Compoenentes
RGB da cor
Coordenadas do
ponto
raio.imprimeLinha();
for (int i = 0 ; i < GRAU ; i++)
{
//gira o ponto b do raio (extremidade) i graus em relao ao ponto a (centro)
raio.b.girar(i, raio.a);
//imprime a linha resultante
Este mtodo utiliza a Linha que
raio.imprimeLinha();
representa o raio do crculo e gera um
crculo da mesma cor da linha. A
}//fim for
funcionalidade do mtodo
}//fim criaCirculo
basicamente executada por chamadas a
}//fim Circulo
mtodos de outras classes,
simplificando sua implementao.
34
A classe Crculo foi composta basicamente pela agregao de outras classes que
implementam funcionalidades mais especficas. Essa abordagem bottom-up no
tratamento de um problema, onde pequenos mdulos so agrupados para gerarem outros
maiores e com funcionalidades mais complexas, facilita a implementao, aumenta a
legibilidade do cdigo e melhora em muito a manutenibilidade da aplicao.
6.1 Encapsulamento
Diferente da abordagem estruturada, onde dados e procedimentos so definidos de
forma separada na cdigo, na programao orientada a objeto os dados e procedimentos
que manipulam estes dados so definidos numa unidade nica, o objeto. Isso possibilita
uma melhor modularidade do cdigo, porm, a idia principal poder utilizar os objetos
sem ter que se conhecer sua implementao interna, que deve ficar escondida do usurio
do objeto que ir interagir com este apenas atravs de sua interface.
propriedade de se implementar dados e procedimentos correlacionados em uma
mesma entidade e de se proteger sua estrutura interna escondendo-a de observadores
externos d-se o nome de encapsulamento.
O objetivo do encapsulamento separar o usurio do objeto do programador do objeto e
seus principais benefcios so:
Os mtodos pblicos
consistuem a interface da
classe.
}
35
Crculo crculo;
null
if (crculo == null)
raio;
cor;
que uma varivel de um tipo no primitivo estar valendo algo e atravs dela ser
possvel acessar os dados e operaes do objeto em questo.
Uma vez um objeto tendo sido criado, seus mtodos e atributos pblicos podem ser
acessados utilizando o identificador do objeto (varivel que armazena sua referncia)
atravs do operador ponto:
<identificador>.<atributo>
<identificador>.<mtodo>
A aplicao que criou o objeto Crculo acima pode solicitar ao objeto que ele se desenhe
fazendo :
crculo.criaCrculo();
36
6.3 Construtores
O construtor de uma classe um mtodo especial com as seguintes caractersticas:
obrigatrio uma classe conter ao menos um construtor. Se uma classe for definida
sem a presena de um, o compilador Java ir criar automaticamente um construtor
default da seguinte forma:
Construtores devem ter o mesmo nome da classe.
Crculo() { }
Construtores no devem ter tipo de retorno.
}
Crculo (double x1, double y1, double x2, double y2, Cor c)
{
raio = new Linha(new Ponto(x1, y1), new Ponto(x2, y2), c);
cor = c ;
}
void criaCrculo () {
raio.imprimeLinha();
for (int i = 0 ; i < GRAU ; i++)
{
//gira o ponto b do raio (extremidade) i graus em relao ao ponto a (centro)
raio.b.girar(i, raio.a);
//imprime a linha resultante
raio.imprimeLinha();
}//fim for
}//fim criaCirculo
}//fim Circulo
Dado os construtores definidos, vamos analisar as possibilidades de implementao para
se construir um crculo:
38
Usando o construtor Crculo(double x1, double y1, double x2, double y2, Cor c):
Cor c = new Cor (1.0, 2.0, 1.0);
Crculo crculo = new Crculo(0, 0, 2, 0, c);
crculo.criaCrculo();
Definir mais de um construtor para a mesma classe fornece maior flexibilidade para sua
utilizao.
6.4 O Ponteiro this
Todos os mtodos de instncia recebem um argumento implcito chamado this, que
pode ser usado dentro do mtodo para se referir ao objeto ao qual aquele mtodo
pertence. Mas para que iramos querer um ponteiro para o prprio objeto se dentro de
um mtodo possvel acessar qualquer outro mtodo ou atributo da classe?
Existem duas situaes onde devemos usar uma referncia explcita ao this:
39
Exerccios :
1) Para iniciar a prtica deste captulo, voc deve modelar o problema descrito abaixo,
que descreve o negcio da ACME Vdeo Locadora. Sero apresentadas inmeras
informaes que ajudaro voc a determinar as classes, mtodos, atributos e
associaes que compem o negcio. Fique livre para escolher o formato que
pretende usar para comunicar o que voc encontrou.
A ACME vdeo locadora est no negcio de aluguel de vdeos e estamos interessados
neste momento em automatizar o processo de retirada das fitas. Este processo consiste
do cliente, aps ter escolhido as fitas que deseja, lev-las at o balco de retirada. O
funcionrio responsvel ir solicitar o nmero do carto de associado do cliente e depois
cadastrar os IDs dos itens que este escolheu.
Nossos clientes devem se cadastrar como associados antes de poderem efetuar qualquer
locao. Ns armazenamos informaes como nome, endereo e telefone e cada cliente
possui um ID nico que utilizar para efetuar as locaes.
Quando uma locao efetivada, damos um nmero nico para ela que ser utilizado
posteriormente para mantermos o controle da mesma. A efetivao de uma locao
possui informaes como: data de incio, o cliente que solicitou e uma lista dos itens
alugados.
Para cada item alugado controlamos a data que deve ser devolvido e a data que
realmente foi devolvido. A data de devoluo dependente de quantos dias um item
pode permanecer emprestado, sendo assim, cada item pode ter uma data diferente.
Os itens para emprstimo so atualmente apenas fitas de vdeo. Mas pretendemos alugar
em breve jogos e DVDs. Cada item para emprstimo possui as seguintes informaes:
preo do aluguel, o nmero de dias que pode permanecer emprestado, o ttulo do filme,
[0][0]
uma breve descrio (sinopse) e uma categoria (ao, aventura, etc).
a) Identifique as classes que compem o negcio da ACME Locadora. Escreva uma
breve descrio sobre ela para ter certeza de sua relevncia para o negcio.
b) Identifique os atributos de cada uma das novas classes. Lembre-se que um atributo
pode ser outra classe.
c) Defina alguns comportamentos para cada uma das classes.
2) A partir da anlise do exerccio anterior, provavelmente (:-)) voc vai ter chegado
nas seguintes classes, atributos e mtodos:
ItemAlugado
dataDevolucao
dataDevolvida
item
getPreco()
calcDataDevolucao
;;;
Aluguel
numeroAluguel
dataInicio
cliente
AddItem()
...
Cliente
Id
nome
endereco
telefone
getNome()
...
Item
Id
titulo
descricao
categoria
preco
numeroDias
setPreco
getPreco
...
40
41
42
44
Quando var1 modifica a varivel de classe a, o novo valor visvel a todos os objetos
desta classe, pois a representa a mesma posio de memria acessada por todos.
Variveis de classe no podem ser inicializadas nos construtores. Se precisarem de
inicializao, isto geralmente feito no momento da declarao da varivel.
Mtodos de classe tambm so declarados com o auxlio do modificador static:
[modificador] static tipo_retorno identificador ([argumentos]) {
//Corpo do mtodo
}
Como um mtodo de classe compartilhado por todas as instncias da classe, ele no se
refere a um objeto em particular e por isso no recebe o ponteiro implcito this. Mtodos
de classe podem acessar somente variveis de classe e outros mtodos estticos.
Uma caracterstica interessante dos mtodos estticos, bem como dos atributos, que
eles podem ser acessados mesmo sem a existncia de uma instncia da classe.
class X {
...
X.setA(20);
System.out.println(X.a);
46
Exerccios :
1) Dada a classe abaixo, assinale as expresses que so corretas.
public class Filme {
private static float preco = 3.50f;
private String taxa;
public static void setPreco(float novoPreco)
{
preco = novoPreco;
}
public float getPreco() {
return preco; }
Filme.setPreco(3.98f);
Filme mov1 = new Filme();
mov1.setPreco(3.98f);
float a = Filme.getPreco();
float b = mov1.getPreco();
2) Nesta lio iremos melhorar as classes da lio passada com os recursos que
aprendemos aqui. A classe Cliente possui dois construtores: um sem argumento e outro
que recebe o nome, endereo e telefone de um cliente como parmetro.
a) Crie uma varivel esttica e privada na classe Cliente do tipo inteiro e chamada
proximoId. Esta deve ser inicializada com zero.
b) Modifique o construtor default para que este incremente o valor desta varivel e
atribua o resultado para o atributo id do novo objeto.
c) Modifique o outro construtor para que ele chame o construtor default e desta forma
tambm inicialize o atributo id.
Obs: Em Java, para chamarmos um mtodo construtor dentro de outro mtodo
qualquer, no podemos chamar o mtodo pelo seu nome mas sim utilizando a
sintaxe abaixo:
this (<lista de argumentos>);
d) Recompile e execute novamente a aplicao. Observe que agora o valor de id no
mais zero.
e) Qual a vantagem de se usar um atributo de classe para fazer o controle do id dos
objetos?
3) Faa as mesmas modificaes para a classe Item, porm com a varivel esttica
proximoId iniciando em 1000.
47
8 Herana e Polimorfismo
Nas sees anteriores aprendemos sobre classes, objetos e encapsulamento, conceitos
fundamentais do paradigma da orientao a objeto. Nesta seo, abordaremos dois
outros conceitos importantes e relacionados entre si: herana e polimorfismo.
8.1 Herana
A herana a principal caracterstica de distino entre um sistema de programao
orientado a objeto e outros sistemas de programao. As classes so inseridas em uma
hierarquia de especializaes de tal forma que uma classe mais especializada herda
todas as propriedades da classe mais geral a qual subordinada na hierarquia. A classe
mais geral denominada superclasse e a classe mais especializada subclasse.
O principal benefcio da herana a reutilizao de cdigo. A herana permite ao
programador criar uma nova classe programando somente as diferenas existentes na
subclasse em relao superclasse. Isto se adequa bem a forma como compreendemos o
mundo real, no qual conseguimos identificar naturalmente estas relaes.
A fim de exemplificarmos este conceito, vamos considerar que queiramos modelar os
seres vivos pluricelulares existentes no planeta. Podemos ento comear com a classe
SerVivo abaixo:
SerVivo
Ela modela as caractersticas que todo ser vivo deve possuir, como a capacidade de
reproduzir-se ou a necessidade de alimentar-se. Sendo assim, a classe SerVivo define
atributos e mtodos tais como:
Os seres vivos por sua vez classificam-se em Animais e Vegetais, os quais possuem
caractersticas prprias que os distingue:
SerVivo
Animal
Vegetal
Animal
Habitat,
Locomoo, TMV
Locomover
8.2 Polimorfismo
O termo Polimorfismo origina-se do grego e quer dizer "o que possui vrias formas".
Em programao est relacionado possibilidade de se usar o mesmo nome para
mtodos diferentes e capacidade que o programa tem em discernir, dentre os mtodos
homnimos, aquele que deve ser executado. De maneira geral o polimorfismo permite a
criao de programas mais claros, pois elimina a necessidade de darmos nomes
diferentes para mtodos que conceitualmente fazem a mesma coisa, e tambm
programas mais flexveis, pois facilita em muito a extenso dos mesmos.
O polimorfismo pode ser de duas formas, esttico ou dinmico:
50
...
51
52
Vamos supor que num determinado momento quisssemos acessar o mtodo alimentarse tal qual como este foi implementado na superclasse. Para isto devemos usar o
ponteiro super da seguinte maneira:
...
super.alimentar();
...
Bem, mas como afinal de contas podemos mudar o comportamento padro de quando
uma subclasse instanciada os construtores default serem executados?
Um dos usos mais comuns da referncia super chamar um construtor de uma
superclasse. Para isso, este deve ser acrescentado na primeira linha do construtor da
subclasse. Por exemplo, se a classe SerVivo tiver um construtor que receba a idade do
ser vivo como parmetro
SerVivo(int idade){
this.idade = idade;
}
e queremos que este construtor seja chamado quando a classe Animal for instanciada ao
invs do construtor padro SerVivo(), fazemos
Animal (int idade){
super(idade);
...
}
8.4 Mtodos e Classes final
Vimos no Captulo 3 que para criar variveis que so constantes devemos usar o
comando final. Vamos agora ver duas novas utilizaes para ele:
Classes final: Uma classe declarada como final no poder ser estendida por outra
classe. Esta uma forte deciso no projeto e significa que a classe auto-suficiente
para dispor de todos os seus requisitos atuais e futuros. Classes definidas como final
podem ajudar o compilador a produzir cdigos mais otimizados. Como uma classe
final no pode ser estendida, quando o compilador encontra uma chamada a algum
mtodo desta classe ele no gerar o cdigo necessrio para execuo do
polimorfismo dinmico, o qual acarreta um overhead durante a execuo, mas sim
far um acoplamento esttico com o mtodo em questo.
53
Exerccios:
Nesta lio voc vai adicionar duas novas classes que derivam de Item. A ACME Vdeo
Locadora decidiu expandir seus negcios e comear a alugar jogos alm dos vdeos.
Como jogos possuem alguns atributos diferentes dos filmes, voc decidiu criar
subclasses para cada um destes tipos de itens. Cada item possui seus prprios mtodos e
redefinem o mtodo toString() da classe Item. Abaixo segue o diagrama UML que
mostra o relacionamento entre Item, Filme e Jogos. A seta a notao UML para
herana.
Item
int id
String titulo
String descricao
double preco
int numeroDias
String categoria
toString()
getId()
setId()
...
Filme
String diretor
int duracao
Jogo
int memoria
String tipo
toString()
setDiretor()
getDiretor()
setDuracao()
getDuracao()
toString()
setMemoria()
getMemoria()
setTipo()
getTipo()
54
O texto deve mostrar (filme) para indicar que este item um filme.
2) Defina uma nova classe Jogo
a) Defina a classe Jogo que estende a classe Item. A nova classe deve incluir os
atributos e mtodos definidos no diagrama acima.
b) Acrescente um construtor que aceite como argumentos a seguinte lista de atributos:
titulo, descricao, categoria, preco, numeroDias, memoria, tipo
c) Adicione uma chamada ao construtor da superclasse Item usando a seguinte sintaxe
super(titulo, descricao, categoria, preco , numeroDias)
na primeira linha deste construtor.
d) Rescreva o mtodo toString() de forma que este retorne uma string com os valores
concatenados de id, titulo, tipo e preco da seguinte maneira
1011 (jogo) Lifelike racing (Play Station) - R$ 5,00
O texto deve mostrar (jogo) para indicar que este item um jogo.
3) Teste a aplicao. No mtodo main() do projeto, declare duas variveis do tipo Item
chamadas filme e jogo respectivamente. Inicialize-as chamando os construtores
recm criados da seguinte maneira:
Item filme = new Filme(...);
Item jogo = new Jogo(...);
Chame o mtodo toString() dos dois objetos. Perceba como a atuao do
polimorfismo dinmico ir garantir a correta execuo do mtodo apropriado da
subclasse.
55
Animal
Vegetal
A classe SerVivo pode ser declarada como abstrata pois no possui detalhes o suficiente
para representar sozinha um objeto completo. O usurio no poder criar objetos da
classe SerVivo pois esta apenas uma classe parcial e existe apenas para ser estendida
por subclasses mais especializadas, tal como Animal e Vegetal.
public abstract class SerVivo {
String Alimentos;
int Idade;
public void locomover() { ... }
public void nascer() { ... }
public void crescer() { ... }
public void alimentar() { ... }
public void respirar() { ... }
public SerVivo reproduzir() { ... }
public morrer() { ... }
}
Utilizamos a palavra reservada abstract para definir uma classe abstrata. Se tentarmos
instanciar uma classe abstrata receberemos um erro de compilao. Uma classe abstrata
pode conter:
Mtodos abstratos podem existir apenas em classes abstratas. Como uma classe abstrata
est num nvel muito alto de abstrao, muito freqentemente no possui detalhes o
suficiente para implementar determinados comportamentos que sero comuns a todas as
suas subclasses. Ao invs disso, elas apenas definem quais sero estes comportamentos
obrigatrios atravs da criao de mtodos abstratos.
56
}
Para definir um mtodo abstrato devemos prover apenas a assinatura do mtodo, isto ,
seu nome, argumentos e tipo de retorno. A implementao deste ficar a cargo de cada
subclasse concreta, que poder dar a sua verso para ele.
A utilizao de classes e mtodos abstratos uma forma muito comum para criarmos e
utilizarmos bibliotecas orientadas a objetos: acoplamos nossas classes definindo
heranas e implementamos os mtodos abstratos, os quais garantem que estas classes
tero garantidamente um prottipo bsico.
9.2 Interfaces
Uma interface semelhante a uma classe abstrata exceto pelo fato desta no poder ter
qualquer mtodo concreto ou varivel de instncia. Uma interface representa uma
coleo de declaraes de mtodos abstratos e possivelmente constantes.
Qualquer classe que implementa uma interface deve obrigatoriamente implementar
todos os mtodos especificados pela interface. Assim, interfaces fornecem a idia de um
contrato que qualquer subclasse deve obedecer. Outra caracterstica importante que
uma classe pode derivar de apenas uma nica outra classe (herana simples), mas pode
implementar um nmero indeterminado de interfaces. Por exemplo, a classe Animal
poderia ser definida da seguinte forma:
class Animal extends SerVivo implements Sortable, Listable {
...
}
57
Alm disso, como fizemos Animal implementar as interfaces Sortable e Listable, este
deve implementar tambm todos os mtodos especificados nestas interfaces.
Uma interface descreve um aspecto de comportamento que muitas classes diferentes
podem requerer. O nome de uma interface freqentemente um adjetivo como Sortable
(ordenvel) ou Steerable (algo que pode ser pilotado). A interface Steerable pode incluir
mtodos tais como turnRight(), turnLeft(), turnAround(), etc. Qualquer classe que
precisar demonstrar o comportamento de poder ser dirigida pode implementar a
interface Steerable.
No pilotvel
Pilotvel
importante notar que classes que implementam a mesma interface podem no ter
absolutamente nada a ver umas com as outras (o que no ocorre quando classes
implementam herana em relao mesma superclasse), a no ser o fato de
apresentarem comportamentos semelhantes, porm, que podem estar implementados de
formas completamente diferentes. Por exemplo, os principais pacotes Java incluem
inmeras interfaces padro, tais como runnable, clonable, dentre outras. Estas interfaces
so implementadas por todos os tipos de classes que no tm nada em comum, exceto o
fato de precisarem ser clonveis ou executveis.
Para definir uma interface devemos usar a palavra reservada interface. Todos os
mtodos especificados so implicitamente pblicos e abstratos e qualquer varivel
implicitamente public static final, ou seja, so constantes. A interface Steerable por
exemplo, poderia ser definida da seguinte maneira
public interface Steerable{
int MAXTURN = 45;
void turnLeft (int deg);
void turnRight (int deg);
}
o que equivale a seguinte definio se no suprimirmos o public, static, final e abstract
public interface Steerable{
public static final int MAXTURN = 45;
public abstract void turnLeft (int deg);
public abstract void turnRight (int deg);
}
58
Uma interface pode ser definida de qualquer uma das maneiras mas mais comum
encontrarmos da primeira forma.
Para implementarmos uma interface usamos a palavra reservada implements. Como
exemplo, vamos considerar a classe Iate abaixo:
public class Iate extends Barco implements
Steerable {
public void turnLeft (int deg){ ... }
public void turnRight (int deg) { ... }
}
Neste exemplo, uma classe Iate que deriva da classe Barco tem a caracterstica de
precisar ser pilotada e, sendo assim, implementa a interface Steerable. A classe Iate
deve portanto, implementar todos os mtodos da interface, neste caso turnLeft(int deg) e
turnRight(int deg).
59
public class
MyApplication
Esquema de Execuo
MyApplication
4 sort(Object[] o) retorna a lista
ordenada
Sort
2 sort(Object[] o) pede ao animal
para este comparar a si mesmo
com outro animal
3 O animal retorna o
resultado da comparao
Animal
Interface Sortable
public interface Comparable {
//compareTo(Object): Compara este objeto
//com o outro passado como argumento
// Retorno:
// 0 se este objeto for igual a obj2
// um valor < 0 se este objeto for < obj2
// um valor > 0 se este objeto for > obj2
int compareTo (Object obj2);
}
60
A classe Arrays
public class Arrays{
public static void sort (Object[] items){
for (int i = 1; i < items.length; i++){
for (int j = 0; j < items.length 1; j++){
if (items[j].compareTo(items[j+1]) > 0){
Comparable tempitem = items[j+1];
items[j+1] = items[j];
items[j] = tempitem;
} } } }}
Note que o mtodo sort no sabe nada sobre o tipo de objeto que ele est ordenando. Ele
sabe apenas que estes so objetos que implementam a interface Comparable e, sendo
assim, ele pode contar com a existncia do mtodo compareTo nestes objetos.
Podemos considerar uma interface como um contrato entre o objeto que usa a interface
e o objeto que a implementa:
A classe Animal
public class Animal extends SerVivo
implements Comparable{
61
10.1 Strings
Como em muitas linguagens de programao, strings so usadas extensivamente em
programas Java o que fez com que a API do Java disponibiliza-se a classe String para
ajudar na manipulao deste tipo de dado. Ela faz parte do pacote java.lang, o qual
automaticamente importado em todas as classes java.
A classe String representa uma string imutvel. Isto significa que, uma vez criado criado
um objeto desta classe, voc no poder alter-lo. Se voc quer modificar o contedo de
uma String, voc deve pode usar a classe StringBuffer, a qual foi desenvolvida para este
propsito.
Existem vrias maneiras de se criar uma String:
Usando o construtor
String nome = new String(Joe Smith);
62
len = 7
c = o
sub = me
semEspaco = XXX
i=3
i=6
63
O mtodo System.out.println() tambm possui uma verso par cada tipo primitivo.
Desta forma, possvel fazer
int count = 10;
System.out.println(count);
sem a necessidade de antes concatenar count com uma string (o que faria com que ele
fosse automaticamente convertido para uma string).
possvel tambm converter uma string para um tipo primitivo atravs das classes de
wrapper3. Para cada tipo primitivo Java prov uma classe de wrapper correspondente, a
qual permite que um tipo primitivo seja tratado como um objeto. Cada classe de
wrapper disponibiliza um mtodo esttico para converter uma String para o tipo
primitivo correspondente. Exemplo :
int valor = Integer.parseInt(10);
float valor = Float.parseFloat(10.00);
Esta abordagem para modificar o texto de uma String no a mais eficiente, tendo em
vista que novas variveis so criadas em cada atribuio. O ideal utilizar a classe
StringBuffer e seu mtodo append:
StringBuffer texto = new StringBuffer(Tinha uma pedra);
texto.append( no meio do caminho);
texto.append(, no meio do caminho tinha uma pedra.);
10.2 Arrays
Um array til quando queremos agrupar objetos do mesmo tipo. Possui as seguintes
caractersticas:
type[] arrayName;
or
type arrayName[];
int[] powers;
powers = new int[4];
Cada elemento
inicializado com o valor 0.
Um array deve ser criado com o uso do operador new e seu tamanho deve ser fixado
dentro dos colchetes. O tamanho deve ser um inteiro mas no precisa ser uma constante,
pode ser tambm uma expresso que retorna um inteiro.
Quando um array de primitivos criado, seus elementos so inicializados
automaticamente com valores padro da seguinte forma:
arrayName[index] = value;
Exemplo: powers[0] = 1;
O ndice de um array inicia em 0.
65
Usando inicializadores:
String[] categorias;
2 Criao:
categorias = new String[3];
Atravs de inicializadores
String[] categoias = {
Ao, Comdia, Drama };
66
Exemplo :
int [] [] aux = new int [4][2];
aux [0][0] = 1;
aux [0][1] = 7;
aux[0][0]
aux [0][1]
aux[0]
aux[1]
aux[2]
aux[3]
67
Exerccios:
Abra a lio 10 e selecione o projeto ACMEVideo. Vamos realizar vrias modificaes
na classe a fim de por em prtica o que aprendemos nesta lio.
1) Faa as seguintes modificaes na classe ACMEVideo.
a) Defina um atributo array private static de objetos Cliente chamado clientes com
capacidade para armazenar seis objetos Cliente. Para economizar tempo, o cdigo
para criar um array de itens j foi adicionado para voc.
b) Adicione uma varivel de instncia booleana, privada e esttica chamada
clientesConstruidos que serve para controlar se o array de clientes j foi inicializado.
Inicialize esta varivel com false.
c) Crie um mtodo publico e esttico chamado constroiClientes(). Este mtodo contem
o cdigo necessrio para inicializar as seis posies do array de clientes (lembre-se
que o construtor de cliente espera receber um nome, endereo e telefone. Haja
imaginao!!). Uma inicializao deve parecer-se com isso:
clientes[0] = new Cliente(XXXX, YYYY, ZZZZ);
d) Sete a varivel clientesConstruidos para true no interior deste mtodo.
e) Adicione agora um mtodo pblico e esttico que recebe o ID de um cliente como
argumento, busca no array clientes por um cliente que tenha este ID e, caso
encontre-o, retorna o objeto correspondente. O mtodo pode usar um lao for para
fazer a busca no array (voc pode usar a propriedade array.length para saber o final
do array) e deve se chamar buscaClientePorId(). Se um cliente no for encontrado o
mtodo deve retornar null. Adicione uma condio no mtodo para verificar, antes
de iniciar a busca, se existem clientes cadastrados (atravs da varivel
clientesConstruidos). Caso ainda no, faa o mtodo inicializar o array chamando o
mtodo constroiClientes. O cdigo ir se assemelhar a isto:
if (!clientesConstruidos) { constroiClientes(); }
//o lao do for deve entrar aqui
Nessa altura do campeonato, j temos em nosso projeto de locadora quatro classes : a
classe Cliente que manipula os clientes da loja, a classe Item que manipula informaes
gerais sobre os itens que podem ser alugados, a classe Filme e a classe Jogo que so
tipos especficos de itens alugveis. Para concluir o diagrama apresentado no captulo 6,
faltam as classes ItemAlugado e Aluguel.
2) Vamos definir agora a classe ItemAlugado, a qual controla as informaes de um
item quando este alugado para um cliente.
a) Crie a classe ItemAlugado e inclua as seguintes variveis privadas (no esquea dos
mtodos getXXs e setXXs ):
Item item
String dataDevoluo
String dataDevolvida
Faa um import no pacote java.util.*
68
c) Crie um construtor para classe que aceite o ID de um Item (int) como parmetro. O
construtor
deve
usar
este
valor
para
chamar
o
mtodo
ACMEVideo.buscaItemPorId() (que j foi construdo para voc como um mtodo
da classe ACMEVideo), o qual retorna um objeto do tipo Item, e inicializar seu
atributo item. O construtor tambm deve inicializar a varivel dataDevolucao com o
valor retornado pelo mtodo calcDataDevolucao();
3) Neste momento voc est pronto para criar a ltima classe necessria para concluir a
aplicao. A classe Aluguel representa uma locao efetivada. Deve controlar por
exemplo qual cliente realizou a locao, os itens locados e a data que o emprstimo
foi feito.
a) Crie uma nova classe Aluguel e inclua um import no pacote java.util.*.
b) Adicione as seguintes variveis privadas:
ItemAlugado[] itens;
Cliente cliente;
int numeroAluguel;
Date dataAluguel;
int itemCount;
c) Adicione as seguintes variveis privadas e estticas:
static int proximoId = 500;
final static int MAXITENS = 10;
d) Crie um construtor que inicialize as trs variveis. Ele deve gerar o prximo nmero
de aluguel baseado na varivel esttica proximoId (lembra como fizemos no
capitulo 7 quando estudamos variveis estticas). Deve receber o Id de um cliente
como parmetro e utilizar o mtodo ACMEVideo.buscaClientePorId() para
inicializar a varivel cliente. Por fim, deve criar o array itens com o mximo de
MAXITENS posies. Voc mesmo pode fazer este cdigo ou usar o abaixo:
public Aluguel (int clienteId) {
numeroAluguel = ++proximoId;
cliente = ACMEVideo1.buscaClientePorId(clienteId);
itens = new ItemAlgugado[MAXITENS];
}
e) Crie um mtodo chamado addItem() para adicionar um item alugado num aluguel.
Use o cdigo abaixo como guia.
69
70
11 Tratamento de Excees
Uma exceo um evento que ocorre durante a execuo de um programa e que desfaz
o fluxo normal de instrues. Por exemplo, tentar acessar um elemento fora dos limites
de um array, tentar dividir um nmero por zero, so exemplos de excees. Um erro em
Java uma condio anormal irrecupervel. Por exemplo, uma condio de erro ocorre
se existe algum erro interno na JVM ou se a JVM fica sem memria. A diferena entre
um erro e uma exceo que uma exceo pode ser capturada e o programa pode seguir
em frente a partir dali, j quando um erro ocorre o programa necessariamente ir
terminar.
Quando uma exceo ocorre no interior de um mtodo Java, o mtodo cria um objeto do
tipo Exception e o retorna para o sistema. Este processo chamado de disparar uma
exceo. O objeto Exception contm informaes sobre a exceo, incluindo seu tipo e
o estado do programa quando a exceo ocorreu. Quando uma exceo disparada, o
sistema busca em seqncia na pilha todos os mtodos para tentar encontrar um capaz
de tratar este tipo de exceo. Na terminologia Java o mtodo captura a exceo. Se o
sistema no encontra nenhum mtodo apto a capturar a exceo, o programa inteiro
termina.
11.1 Classes de Excees
Todos os erros e excees em Java derivam da classe Throwlable, resultando na
hierarquia abaixo:
Throwable
Error
Erros
irrecuperveis
Exception
Excees
verificveis
RuntimeException
Excees no verificveis
(em tempo de excuo)
71
72
Por fim, vamos ver um exemplo de como pode ser usado o bloco finally. Este bloco
til quando queremos liberar recursos alocados num bloco try assim que este terminar.
73
FileInputStream f = null;
try{
f = new FileInputStream(filePath);
while (f.read() != -1)
charcount++;
}
catch(IOException e) {
System.out.println(Erro ao acessar arquivo + e);
}
finally {
//Este bloco sempre executado
f.close();
}
O exemplo acima conta quantos caracteres h num arquivo. O arquivo depois fechado
mesmo que a operao de leitura tenha resultado uma exceo.
Um bloco finally executado independente de como o bloco try terminou:
}
O mtodo que chamou changeURL pode optar por tratar a exceo ou tambm pass-la
adiante. Porm, se em nenhum momento algum mtodo trat-la, o programa terminar
em erro.
74
A exceo disparada
pode ser uma criada pelo
usurio.
75
Exerccios:
Na prtica do Captulo 10 supomos que os mtodos buscaClientePorId e
buscaItemPorId sempre recebem IDs vlidos para fazer a busca no array de Clientes e
Itens respectivamente. Porm, possvel que estes mtodos recebam IDs invlidos, isto
, IDs que no estejam cadastrados nos arrays correspondentes.
Iremos fazer a ltima melhoria em nossa aplicao ACME Vdeo para tratar estes
possveis erros. Abra o projeto relacionado lio 11.
1) Defina no arquivo que contm a classe ACMEVideo duas novas excees, uma para
emitir uma mensagem de erro caso um Cliente seja invlido e outra quando um Item
for invlido. As classes derivam de Exception e devem se chamar
ClienteNaoEncontrado e ItemNaoEncontrado:
class ClienteNaoEncontrado extends Exception {
public ClienteNaoEncontrado (String message) {
super(message);
}
}
2) Modifique o mtodo buscaClientePorId() para que este emite a exceo apropriada
se o Id for invlido:
a) Adicione o throws ClienteNaoEncontrado a especificao do mtodo
b) Logo antes do return, verifique se o que ir ser retornado um objeto Cliente ou se
null. Se for null, dispare uma exceo de ClienteNaoEncontrado. O cdigo ser algo
como:
if (cliente = = null) {
throw new ClienteNaoEncontrado (\n\t O ID informado no vlido! +
\n\t Verifique se voc entrou com o ID correto.);
}
3) Edite agora o construtor da classe Aluguel, que quem faz uso do mtodo
buscaClientePorId, a fim de capturar a nova exceo. Se o construtor receber uma
exceo de ClienteNaoEncontrado, o processo de locao no deve continuar.
a) Adicione um bloco try em torno da chamada do mtodo buscaClientePorId().
Adicione um bloco catch para tratar da nova exceo:
catch (ClienteNaoEncontrado e) {
System.out.println(e);
System.exit(0);
}
b) Modifique o exemplo no mtodo main que simula uma locao passando um Id de
cliente invlido, tal como 999.
c) Salve, compile e execute sua aplicao
76
77