Escolar Documentos
Profissional Documentos
Cultura Documentos
Algoritmo e Programação
Algoritmo e Programação
UAPI
Mdulo II
Organizao de Sistema Metodolgico
Algoritmos e Programao II
Mdulo II
Algoritmos e Programao II
Magno Santos
PRESIDENTE DA REPBLICA
Luiz Incio Lula da Silva
MINISTRO DA EDUCAO
Fernando Haddad
GOVERNADOR DO ESTADO
Wellington Dias
REITOR DA UNIVERSIDADE FEDERAL DO PIAU
Luiz de Sousa Santos Jnior
SECRETRIO DE EDUCAO A DISTNCIA DO MEC
Carlos Eduardo Bielschowsky
COORDENADORIA GERAL DA UNIVERSIDADE ABERTA DO BRASIL
Celso Costa
SECRETRIO DE EDUCAO DO ESTADO DO PIAU
Antonio Jos Medeiros
COORDENADOR GERAL DO CENTRO DE EDUCAO ABERTA A
DISTNCIA DA UFPI
Gildsio Guedes Fernandes
SUPERITENDNTE DE EDUCAO SUPERIOR NO ESTADO
Eliane Mendona
DIRETOR DO CENTRO DE CINCIAS HUMANAS E LETRAS
Antnio Fonseca dos Santos Neto
COORDENADOR DO CUSO DE ADMINISTRAO A DISTNCIA
Francisco Pereira da Silva Filho
COODENADORA DE MATERIAL DIDTICO DO CEAD/UFPI
Cleidinalva Maria Barbosa Oliveira
DIAGRAMAO
Emanuel Alcntara da Silva
Sumrio Geral
UNIDADE 1. FUNDAMENTOS DE PROGRAMAO
ORIENTADA A OBJETOS
07
09
21
27
31
36
46
53
56
62
69
75
77
83
89
91
107
125
138
APNDICES:
A01 - EXERCCIOS ADICIONAIS
A02 PLANO DE ENSINO
A03 - AGENDA DE ATIVIDADES
142
145
149
REFERNCIAS BIBLIOGRFICAS
151
Apresentao
Apresentao
U
ni
de
da
1
Unidade 1
sociolo
iologia
gia ee a
a Soc
Sociolo
iologia
gia
AA soc
da
Educa
Fundamentos
cao
o de
da
Edu
Programao Orientada
a Objetos
Resumo
Esta unidade tem como meta apresentar uma viso
geral sobre os elementos conceituais da programao
orientada a objetos. So abordados os fundamentos
da engenharia de software e da programao de
computadores. A anatomia de um programa em Java
apresentada com suas caractersticas e funes
onde se deve aprender a criar, editar, compilar e
executar um dos primeiro programa em Java. Como
objetivo principal, esta unidade ensina, a gerar um
cdigo simples dentro dos padres mnimos exigido
pela engenharia software.
Sumrio
07
09
21
27
31
36
46
82
9
1.1.3. Mtodo
Mtodos definem procedimentos sistemticos e
ordenados de construo de software. Eles proporcionam uma
estrutura global interna onde as atividades do engenheiro de
software so realizadas. Essas atividades incluem um conjunto
amplo de tarefas, tais como, anlise de requisitos, design,
construo do programa, teste e manuteno.
Metodologia a cincia de pensamento sistemtico,
usando os mtodos ou procedimentos para uma disciplina em
particular. Existem vrias metodologias da engenharia de
software que so usadas atualmente. Algumas delas esto
enumeradas abaixo:
Metodologias Estruturadas:
Informaes de Engenharia
Desenvolvimento do Ciclo de Vida do Software/Ciclo de
Vida do Projeto Metodologia de Desenvolvimento de Aplicao
Rapid
Metodologia de Desenvolvimento de Aplicao Joint
Mtodo CASE*
Metodologias Orientadas a Objeto:
Mtodo Booch
Mtodo Coad e Yourdon
Mtodo Jacobson
Mtodo Rambaugh
Mtodo Wirfs-Brock
1.1.4. Ferramentas
Promovem o suporte aos processos e mtodos.
Ferramentas CASE (Computer Aided Software Engineeing)
proporcionam um sistema de suporte ao projeto de
desenvolvimento, onde as informaes criadas por uma
ferramenta podem ser usadas por outras. Podem ser
automticas ou semi-automticas.
Muitas ferramentas so usadas para desenvolver
modelos. Modelos so patterns (padres) de algo que foi criado
ou so simplificaes. Existem dois modelos que geralmente so
desenvolvidos por um engenheiro de software, especialmente, o
modelo de sistema e o modelo de software. O modelo de sistema
uma representao acessvel de um sistema complexo que
precisa ser estudado, enquanto o modelo de software chamado
de blueprint do software que precisa ser construdo. Assim como
as metodologias, vrios modelos de ferramentas so usados
para representar sistemas e softwares. Alguns esto descritos
abaixo.
Abordagem de Modelos de Ferramentas Estruturada:
10
82
Diagrama de Entidade-Relacionamento
Diagrama de Fluxo de Dados
Pseudocdigo
Fluxograma
Abordagem de Modelo de Ferramenta Orientada a Objeto:
Linguagem de Modelagem Unificada (UML)
1.2. Qualidade dentro do Esforo de Desenvolvimento
Conforme mencionado anteriormente, a qualidade a
mente que influencia todo engenheiro de software. Focando na
qualidade em todas as atividades de engenharia de software,
reduz-se custo e melhora-se o tempo de desenvolvimento pela
minimizao de um novo trabalho de correo. Para proceder
dessa forma, um engenheiro de software tem que definir
explicitamente que qualidade de software ter um conjunto de
atividades que asseguraro que todo produto de trabalho da
engenharia de software exibe alta qualidade, fazer controle de
qualidade e atividades garantidas, o uso de mtricas para
desenvolver estratgias para melhorar o produto de software e o
processo.
1.2.1. O que qualidade?
Qualidade a caracterstica total de uma entidade para
satisfazer necessidades declaradas e implcitas. Essas
caractersticas ou atributos tm que ser mensurveis de modo
que possam ser comparados por padres conhecidos.
1.2.2. Como definimos qualidade?
Trs perspectivas so usadas na compreenso da
qualidade, especialmente, olhamos para a qualidade do produto,
do processo e no contexto do ambiente de negcios.
Qualidade do Produto
Significa coisas diferentes para cada pessoa. relativo
para uma pessoa analisar qualidade. Para os usurios finais, o
software tem qualidade se fornecer o que desejam e quando
desejam o tempo todo. Tambm julgam baseados na facilidade de
usar e de aprender como us-lo.
Normalmente avaliam e categorizam com base em
caractersticas externas, tal como, nmero de falhas por tipo.
Falhas podem ser categorizadas como: insignificantes,
importantes e catastrficas. Para que outros possam desenvolver
e manter o software, estes devem ficar de olho nas caractersticas
internas em vez das externas. Exemplos que incluem erros e
falhas encontradas durante as fases de anlise de requisitos,
design, e codificao so normalmente feitos anteriormente ao
carregamento dos produtos para os usurios finais.
82
11
82
12
chefe.
As inspees so realizadas em uma lista prescrita das
atividades.
As reunies de inspeo so limitadas a duas horas.
As inspees so conduzidas por um moderador treinado.
Inspetores so designados a especificar regras para aumentar a
eficcia. As listas de verificao dos questionrios a serem
perguntados pelos inspetores so usadas para definir tarefas e
estimular a encontrar defeitos. Os materiais so inspecionados
minuciosamente para que seja encontrado o mximo nmero de
possveis erros.
Estatsticas com os tipos de erros so vitais, so utilizadas para
obter anlises de uma maneira similar anlise financeira.
Conduzir inspees requer muitas atividades. Elas esto
categorizadas a seguir:
Planejamento. O moderador deve se preparar para a inspeo.
Decide quem sero os inspetores e as regras que estes devem
obedecer, quem e quando desempenharo seus papis e
distribuir a documentao necessria.
Uma rpida apresentao. 30 minutos de apresentao do
projeto dos inspetores o suficiente. Isto pode ser omitido se
todos estiverem bem familiarizados com o projeto.
Preparando. Cada inspetor ter de 1 a 2 horas sozinho para
inspecionar o produto de trabalho. Ele ir executar as regras
passadas a ele com base na documentao provida pelo
moderador. Ele ir tentar descobrir defeitos no produto de
trabalho. Ele no dever reparar defeitos ou criticar o
desenvolvedor do produto de trabalho.
Realizando a reunio. Os participantes das reunies so
inspetores, moderadores e desenvolvedores do produto de
trabalho. Os desenvolvedores do produto de trabalho esto
presentes para explicar o produto de trabalho, e responder s
perguntas que os inspetores fizerem. Nenhuma discusso se o
defeito ou no real permitida. Uma lista de defeitos deve ser
produzida pelo moderador.
Refazendo o produto de trabalho. A lista de defeitos deve ser
atribuda a uma pessoa para repar-la. Normalmente, esta o
desenvolvedor do produto de trabalho.
Acompanhando os reajustes. O moderador assegura-se que os
defeitos nos produtos de trabalho sejam endereados e
solucionados. Mais tarde este deve ser inspecionado por outro
inspetor.
Realizando uma reunio ocasional de anlise. Isto opcional,
momento onde dada a possibilidade aos inspetores de
expressarem sua viso pessoal sobre erros e melhorias. A nfase
dada maneira que a inspeo foi feita.
1.3.6. Walkthrough
O walkthrough menos formal que a inspeo. Aqui, o
produto de trabalho e sua documentao correspondente so
entregues para um time de revisores, normalmente em torno de 3
17
18
82
19
82
5.
Desafio:
6.
A equipe de desenvolvimento responsvel pela
construo do software que ir dar suporte ao sistema de
informao solicitado. Em geral formado por: analista de
sistemas, projetista, programadores e testadores. Qual papel de
cada um no processo de engenharia do software.
2. INTRODUO PROGRAMAO DE COMPUTADORES
2.1. O que uma linguagem de programao?
Uma linguagem de programao uma tcnica de
comunicao padronizada para se expressar instrues para um
computador. Assim como os idiomas utilizados pelos seres
humanos, cada linguagem tem sua prpria sintaxe e gramtica.
Linguagens de programao possibilitam ao programador
especificar precisamente com quais dados o computador ir
interagir, como estes dados sero gravados/transmitidos, e
precisamente quais aes sero tomadas de acordo com as
circunstncias.
Existem diferentes tipos de linguagens de programao
que podem ser usadas para a criao de programas, mas,
independente da linguagem utilizada, essas instrues so
traduzidas em linguagem de mquina, e podem ser entendidas
por computadores.
2.2. Categorias das Linguagens de Programao
2.2.1. Linguagens de Programao de Alto Nvel
Uma linguagem de programao de alto nvel uma
linguagem de programao que mais amigvel para o usurio,
em alguns casos independente de plataforma, e que abstrai
operaes de baixo nvel como acesso a memria. Uma
instruo de programao pode ser traduzida em uma ou vrias
instrues de mquina por um compilador.
Exemplos so Java, C, C++, Basic, Fortran
2.2.2. Linguagens de Montagem de Baixo Nvel
Linguagens de montagem so similares s linguagens de
82
21
23
25
82
Desafio:
26
82
29
82
Exerccios:
1.
O que a tecnologia Java inovou em relao as
tecnologias j existentes como C++, Delphi, Visual Basic?
2.
Com base a figura abaixo, escreva um fluxograma
das fases de implementao de um programa em Java.
Especifique os desvios lgicos e desvios com repeties.
3.
Com vista no desepenho em tempo de execuo,
compare a execuo de uma aplio em Java e outra em C++ no
ambiente Linux.
Desafio:
Pesquise e relacione os sistemas middlewares (mquinas
virtuais) existentes para linguagens e aplicativos. Descreva a
funo de cada um.
30
82
33
82
Exerccios:
1.
Baixe da Internet e instale o sistema de desenvolvimento
java (J2SDK) no ambiente Windowns. Edite (usando o editor
padro - NotePad), compile e execute (usando linha de comando
CMD) o programa Wello World.
2.
Baixe da Internet e instale o sistema de desenvolvimento
java (J2SDK) no ambiente Linux. Edite (usando o editor padro
vi ou pico, etc), compile e execute (usando linha de comando do
terminal console) o programa Wello World.
3.
Baixe e instale no NetBeans no ambiente Windonws e
Linux. Teste alguns exemplos.
35
82
java Hello
Veremos na mesma tela, em que foi executado o
comando, a seguinte mensagem:
Hello world!
5.2 Erros
Vimos um pequeno programa Java, geralmente no
encontraremos qualquer problema para compilar e executar
esses programas, entretanto nem sempre este o caso, como
mencionamos na primeira parte deste curso, ocasionalmente
encontramos erros durante esse processo.
Como mencionamos antes, h dois tipos de erros: o
primeiro pode ocorrer durante a compilao, chamado de erro de
sintaxe, o segundo pode ocorrer durante a execuo, chamado
runtime error.
5.2.1 Erros de Sintaxe
Os erros de sintaxe normalmente so erros de digitao,
ocasionados pelo programador que pode ter se equivocado e
digitar uma instruo errada, ou por esquecimento de alguma
parte da instruo, por exemplo, um ponto e vrgula. O
Compilador tenta isolar o erro exibindo a linha de instruo e
mostrando o primeiro caractere incorreto naquela linha,
entretanto, um erro pode no estar exatamente neste ponto.
Outros erros comuns so a troca de letras, troca de letras
maiscula por minscula (a linguagem Java completamente
case-sensitive, ou seja, o caractere "a" completamente
diferente do caractere "A", e o uso incorreto da pontuao.
Vamos retornar ao exemplo, o programa Hello.java.
Intencionalmente, escreveremos a palavrachave "static" de
forma errada e omitiremos o ponto-e-vrgula em uma instruo e
a deixaremos errada.
39
82
Depois de abrir a
IDE NetBeans ser
mostrada a interface
grfica GUI,
conforme Figura.
Clique em File
New Project, depois
de fazer isso, uma
janela de dilogo
aparecer. Neste
momento deve-se
clicar em "Java
Application" e em
seguida clicar no
boto "Next >".
Ser mostrada
uma nova janela de
dilogo, conforme
a figura.
40
82
Troque o local da
aplicao clicando
no boto
"Browse...".
Aparecer uma
janela de dilogo
para localizao
do diretrio. D
um clique duplo no
seu diretrio
home.
O contedo da
raiz do diretrio
ser
apresentado. D
um clique duplo
no diretrio
MYJAVAPROGR
AMS e depois d
um clique no
boto "Open".
Veja que a
localizao do
projeto mudou
para
/home/florence/M
YJAVAPROGRA
MS.
Finalmente, no
campo "Create
Main Class",
digite "Hello",
que ser o nome
da classe
principal, e em
seguida clique no
boto "Finish".
82
41
43
Se no existir erros
no programa,
veremos a
mensagem de
sucesso na janela
de sada.
Para executar o
programa, clique
em Run Run
Main Project, ou
utilize a tecla de
atalho F6, ou
utilize o boto de
atalho para
executar o
programa.
O resultado final
do programa
ser mostrado
na janela de
sada.
82
44
Exerccios:
1. Baixe e instale no NetBeans no ambiente Windonws e Linux.
Teste alguns exemplos inclusive o Hello World
2. Melhore o Hello World. Utilizando o NetBeans crie uma classe
chamada [MeuNome], o programa dever mostrar como
resultado a mensagem: Welcome to Java Programming
[MeuNome]!!!
3. Utilizando o NetBeans, crie uma classe chamada TheTree. O
programa dever mostrar as seguintes linhas na sada:
Estou aprendendo a usar a IDE NetBeans
Minha produtividade vai melhorar
O desenvolvimento fica facilitado
Desafio:
Baixe da Internet e instale a IDE, bastante conhecida pelo
desenvolvedores Java, chamada Eclipse
http://www.eclipse.org/. Instale no ambiente Win ou Linux.
Execute o memo aplicativo Wello World. Descreva as
dificuldades de manipulao entre o Eclipse e o NetBeans.
45
48
82
50
82
A primeira instruo:
import javax.swing.JOptionPane;
mostra que estamos importando a classe JOptionPane do
pacote javax.swing.
Poderamos, de forma semelhante, escrever estas
instrues do seguinte modo:
import javax.swing.*;
A instruo seguinte:
name = JOptionPane.showInputDialog("Please enter
your name");
cria uma caixa de entrada que exibir um dilogo com uma
mensagem, um campo de texto para receber os dados do
usurio e um boto OK, conforme mostrado na figura 1. O
resultado ser armazenado na varivel do tipo String name.
Na prxima instruo, criamos uma mensagem de
cumprimento, que ficar armazenada na varivel msg:
String msg = "Hello " + name + "!";
Finalizando a classe, exibiremos uma janela de dilogo
que conter a mensagem e o boto de OK, conforme mostrado
na figura pgina anterior.
JOptionPane.showMessageDialog(null, msg);
Exerccios:
1. Utilizando a classe BufferedReader ou Scanner, capture trs
palavras digitadas pelo usurio e mostre-as como uma nica
frase na mesma linha. Por exemplo:
Palavra 1: Meu nome
Palavra 2:
Palavra 3: Jesus
Sada : Meu nome Jesus
52
82
Unidade 2
Estruturas de controle
Resumo
Esta unidade tem como meta principal apresentar as
estruturas de controles bsicas como: desvios
condicionais simples (if/then) e compostos
(if/then/else), e repeties condicionais com teste no
incio (while/for) e no final (do/while) das estruturas da
programao Java. Estas estruturas so importantes
na especificao de algoritmos, pois de acordo com as
entradas o fluxo de execuo do algoritmo pode ser
alterado. O principal objetivo desta unidade trabalhar
com exemplos das estruturas de controle condicional
para desenvolver a capacidade de abstrao na
especificao dos algoritmos de acordo com os
problemas apresentados.
Sumrio
UNIDADE 2. ESTRUTURAS DE CONTROLE
07 Estruturas de Deciso: if-then-else, switch
08 Estruturas de Repetio: while, do-while, for
09 Estruturas de Interrupo: break, continue, return
54
82
53
56
62
69
Dicas de
programao:
1. Expresso
lgica uma
declarao que
possui um valor
lgico. Isso
significa que
a execuo desta
expresso deve
resultar em um
valor true ou false.
2. Coloque as
instrues de
forma que elas
faam parte do
bloco if. Por
exemplo:
if
(expresso_lgica
){
// instruo1;
// instruo2;
}
Instruo
Simples
Instrues
em Bloco
Dicas de programao:
1. Para evitar confuso,
sempre coloque a
instruo ou instrues
contidas no
bloco if ou if-else entre
chaves {}.
2. Pode-se ter
declaraes if-else
dentro de declaraes
if-else, por exemplo:
if (expresso_lgica) {
if (expresso_lgica) {
...
}else {
...
}
}else {
...
}
if (expresso_lgica)
instruo_caso_verdadeiro;
else
instruo_caso_falso;
Tambm podemos escrev-la na forma abaixo:
if (expresso_lgica) {
instruo_caso_verdadeiro1;
instruo_caso_verdadeiro2;
...
} else {
instruo_caso_falso1;
instruo_caso_falso2;
...
}
Por exemplo, dado o trecho de cdigo:
int grade = 68;
if (grade > 60)
System.out.println("Congratulations! You passed!");
else
System.out.println("Sorry you failed");
ou:
int grade = 68;
if (grade > 60) {
System.out.print("Congratulations! ");
System.out.println("You passed!");
} else {
System.out.print("Sorry ");
System.out.println("you failed");
}
57
82
Notas:
1. Ao contrrio da
declarao if,
mltiplas
instrues so
executadas sem a
necessidade das
chaves que
determinam o
incio e trmino de
bloco {}.
2. Quando um
case for
selecionado, todas
as instrues
vinculadas ao case
sero
executadas. Alm
disso, as
instrues dos
case seguintes
tambm sero
executadas.
3. Para prevenir
que o programa
execute instrues
dos outros case
subseqentes,
utilizamos a
declarao break
aps a ltima
instruo de cada
case.
// ERRADO
int number = 0;
if (number = 0) {
// algumas instrues aqui
}
3. Escrever elseif em vez de else if.
// ERRADO
int number = 0;
if (number == 0) {
// algumas instrues aqui
} elseif (number == 1) {
// algumas instrues aqui
}
7.5. Declarao switch
Outra maneira de indicar uma condio atravs de uma
declarao switch. A construo switch permite que uma nica
varivel inteira tenha mltiplas possibilidades de finalizao.
A declarao switch possui a seguinte forma:
switch (varivel_inteira) {
case valor1:
instruo1;
instruo2;
... //
break;
case valor2:
instruo1;
instruo2;
... //
break;
default:
instruo1
instruo2;
... //
break;
}
59
82
//
// bloco 1
//
// bloco 2
; //
// bloco n
Dicas de
Programao:
1. A deciso entre
usar uma declarao
if ou switch
subjetiva. O
programador
pode decidir com
base na facilidade de
entendimento do
cdigo, entre outros
fatores.
2. Uma declarao if
pode ser usada para
decises
relacionadas a
conjuntos,
escalas de variveis
ou condies,
enquanto que a
declarao switch
pode ser utilizada
para situaes que
envolvam varivel do
tipo inteiro. Tambm
necessrio que o
valor de cada
clusula case seja
nico, subseqentes,
utilizamos a
declarao break
aps a ltima
instruo de cada
case.
62
82
63
Dicas de
programao:
1. Erro comum de
programao ao
utilizar o lao dowhile esquecer o
ponto-evrgula
(;) aps a declarao
while.
do {
...
} while
(boolean_expression)
// ERRADO -> faltou;
2. Como visto para a
declarao while,
tenha certeza que a
declarao do-while
poder terminar em
algum momento.
PRATICANDO!
1.Modifique o programa abaixo com a estrutura for para
incrementar e decrementar valores de c.
// Increment.java
public class Increment {
// main method begins execution of Java application
public static void main( String args[] )
int c;
c = 5;
System.out.println( c ); // print 5
System.out.println( c++ ); // print 5 then postincrement
System.out.println( c ); // print 6
System.out.println(); // skip a line
c = 5;
System.out.println( c ); // print 5
System.out.println( ++c ); // preincrement then print 6
System.out.println( c ); // print 6
} // end method main
} // end class Increment
66
82
67
82
Exerccios:
1. Crie um programa que mostre seu nome cem vezes. Faa trs
verses deste programa:
a) Use uma declarao while para resolver este problema
b) Use uma declarao do-while para resolver este problema
c) Use uma declarao for para resolver este problema
2. Receba como entrada um nmero e um expoente. Calcule este
nmero elevado ao expoente. Faa trs verses deste programa:
a) Use uma declarao while para resolver este problema
b) Use uma declarao do-while para resolver este problema3. c)
Use uma declarao for para resolver este problema
3. O que o programa abaixo faz:
// Faz algo
public class Calculate {
public static void main( String args[] )
{
int sum, x;
x = 1;
sum = 0;
while ( x <= 10 ) {
sum += x;
++x;
}
System.out.println( "The sum is: " + sum );
}
}
Desafio
Encontre e faa a devida correo dos erros em cada um dos fragmentos de cdigo
abaixo.
// Cod A
x = 1;
while ( x <= 10 );
x++;
}
// Cod B
switch ( n ) {
case 1:
System.out.println( "The number is 1" );
case 2:
System.out.println( "The number is 2" );
break;
default:
System.out.println( "The number is not 1 or 2" );
break;
}
68
82
// Cod D
for ( y = .1; y != 1.0; y += .1 )
System.out.println( y );
70
82
71
PRATICANDO!
Digite o programa abaixo. Veja que brincadeira legal com o uso
do continue.
Exerccios:
1. Execute o programa abaixo. Se faz o lao de 1 a 10 vezes,
porque imprime somente at 5? Faa o teste passo a passo no
algoritmo.
// BreakTeste.java
// Lao 10 vezes
import javax.swing.JOptionPane;
public class BreakTest {
public static void main( String args[] ) {
String output = "";
int count;
for ( count = 1; count <= 10; count++ ) {
if ( count == 5 )
break;
output += count + " ";
}
output += "\nLao = " + count;
JOptionPane.showMessageDialog( null, output );
System.exit( 0 );
}
}
82
72
73
82
Unidade 3
Arranjos e Argumentos
Resumo
Esta unidade tratar a forma de se ter acesso a
conjunto de dados agrupados em um programa Java,
atravs do estudo de arranjos homogneos e
heterogneos elementares, destacando-se exemplos
com vetores, matrizes. Argumentos tambm so
apresentados como forma de transferncia de dados
para os aplicativos. O principal objetivo conhecer as
estruturas de dados bsicas constantes nos
programas e saber empreg-las no memento da
especificao do modo que o cdigo fique mais claro e
otimizvel.
75
82
Sumrio
UNIDADE 3. ARRANJOS E ARGUMENTOS
10 Arranjos em Java
11 Argumentos em Java
76
82
75
77
83
10 ARRAY EM JAVA
10.1. Introduo a Array
Em lies anteriores, discutimos como declarar diferentes
variveis usando os tipos de dados primitivos. Na declarao de
variveis, freqentemente utilizamos um identificador ou um
nome e um tipo de dados. Para se utilizar uma varivel, deve-se
cham-la pelo nome que a identifica.
Por exemplo, temos trs variveis do tipo int com
diferentes identificadores para cada varivel:
int number1;
int number2;
int number3;
number1 = 1;
number2 = 2;
number3 = 3;
Como se v, inicializar e utilizar variveis pode torna-se
uma tarefa tediosa, especialmente se elas forem utilizadas para
o mesmo objetivo. Em Java, e em outras linguagens de
programao, pode-se utilizar uma varivel para armazenar e
manipular uma lista de dados com maior eficincia. Este tipo de
varivel chamado de array.
Dicas de
programao:
1. Normalmente,
melhor inicializar, ou
instanciar, um array
logo aps declarlo.
Por exemplo, a
instruo:
int []arr = new
int[100];
prefervel, ao
invs de:
int [] arr;
arr = new int[100];
2. Os elementos de
um array de n
elementos tem
ndices de 0 a n-1.
Note que no
existe o elemento
arr[n]. A tentativa de
acesso a este
elemento causar
uma
exceo do tipo
ArrayIndexOutOfB
oundsException,
pois o ndice deve
ser
at n-1.
3. No possvel
modificar o tamanho
de um array.
Dicas de
programao:
1. Quando criar laos
com for para o
processamento de um
array, utilize o campo
length como
argumento da
expresso lgica. Isto
ir permitir ao lao
ajustarse,
automaticamente para
tamanhos de
diferentes arrays.
2. Declare o tamanho
dos arrays utilizando
variveis do tipo
constante para facilitar
alteraes posteriores.
Por exemplo:
final int ARRAY_SIZE
= 1000; // declarando
uma constante
...
int[] ages = new
int[ARRAY_SIZE];
EXERCCIOS
1. Criar um array de Strings inicializado com os nomes dos sete
dias da semana. Por exemplo:
String days[] = {"Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"};
Usando uma declarao while, imprima todo o contedo do array.
Faa o mesmo para as declaraes do-while e for.
2. Usando as classes BufferedReader, Scanner ou
JOptionPane, solicite 10 nmeros ao usurio. Utilize um array
para armazenar o valor destes nmeros. Mostre o nmero de
maior valor.
3. Dado o seguinte array multidimensional, que contm as
entradas da agenda telefnica:
String entry = {{"Florence", "735-1234", "Manila"},
{"Joyce", "983-3333", "Quezon City"},
{"Becca", "456-3322", "Manila"}};
mostre-as conforme o formato abaixo:
Name : Florence
Tel. # : 735-1234
Address: Manila
Name : Joyce
Tel. # : 983-3333
Address: Quezon City
Name : Becca
Tel. # : 456-3322
Address: Manila
DESAFIOS:
1. O programa abaixo ler os argumentos na linha de comando e
coloca no array de args. Altere o programa abaixo para mostrar as
opes disponveis caso o usurio entre com argumentos
invlidos.
public class Comand {
public static void main(String[] args) {
if (args[0].equals("-h"))
System.out.print("Help,");
else if (args[0].equals("-g"))
System.out.print("Go to do,");
for (int i = 1; i < args.length; i++)
System.out.print(" " + args[i]);
System.out.println("!");
}
}
82
81
82
11 ARGUMENTOS EM JAVA
11.1. Argumentos de linha de comando
Uma aplicao em Java aceita qualquer quantidade de
argumentos passados pela linha de comando. Argumentos de
linha de comando permitem ao usurio modificar a operao de
uma aplicao a partir de sua execuo. O usurio insere os
argumentos na linha de comando no momento da execuo da
aplicao. Deve-se lembrar que os argumentos de linha de
comando so especificados depois do nome da classe a ser
executada.
Por exemplo, suponha a existncia de uma aplicao
Java, chamada Sort, que ordena cinco nmeros que sero
recebidos. Essa aplicao seria executada da seguinte maneira:
java Sort 5 4 3 2 1
Lembre-se que os argumentos so separados por
espaos.
Em linguagem Java, quando uma aplicao executada,
o sistema repassa os argumentos da linha de comando para a o
mtodo main da aplicao atravs de um array de String. Cada
elemento deste array conter um dos argumentos de linha de
comando passados. Lembre-se da declarao do mtodo main:
public static void main(String[] args) {
}
Os argumento que so passados para o programa so
salvos em um array de String com o identificador args. No
exemplo anterior, os argumentos de linha de comando passados
para a aplicao Sort estaro em um array que conter cinco
strings: "5", "4", "3", "2" e "1". possvel conhecer o nmero de
argumentos passados pela linha de comando utilizando-se o
atributo length do array.
Por exemplo:
int numberOfArgs = args.length;
Se o programa precisa manipular argumento de linha de
comando numrico, ento, deve-se converter o argumento do
tipo String, que representa um nmero, assim como "34", para
um nmero. Aqui est a parte do cdigo que converte um
argumento de linha de comando para inteiro:
int firstArg = 0;
if (args.length > 0) {
firstArg = Integer.parseInt(args[0]);
}
83
Dicas de
programao:
1. Antes de usar
os argumentos de
linha de comando,
observe a
quantidade de
argumentos
passados para a
aplicao. Deste
modo, nenhuma
exceo ser
disparada.
84
86
Execute o projeto.
87
EXERCCIOS
1. Utilizando os dados passados pelo usurio atravs dos
argumentos de linha de comando, exiba os argumentos
recebidos. Por exemplo, se o usurio digitar:
java Hello world that is all
o programa dever mostrar na tela:
world
that
is
all
2. Obtenha dois nmeros, passados pelo usurio usando
argumentos de linha de comando, e mostre o resultado da
soma, subtrao, multiplicao e diviso destes nmeros. Por
exemplo, se o usurio digitar:
java ArithmeticOperation 20 4
o programa dever mostrar na tela:
sum = 24
subtraction = 16
multiplication = 80
division = 5
DESAFIO
Altere o programa abaixo para receber os parmetros atravs
da linha de comando.
import javax.swing.*;
public class InputArgs {
public static void
main(String[] args) {
String name =
JOptionPane.showInputDialog
("What is your name?");
String input =
JOptionPane.showInputDialog
("How old are you?");
int age =
Integer.parseInt(input);
System.out.println("Hello,
" + name +
88
Unida de 4
Paradigma de
programao Orientada a
Objetos
Resumo
Esta unidade tem como meta apresentar os fundamentos do
paradigma de programao orientada a objetos. Aborda o tema,
caracterizando com exemplos uma linguagem orientada a
objetos com Java. Apresentar os elementos inerentes como
classes, objetos e mtodos.
Mostra com exemplos,
caractersticas que podem ser exploradas como herana
polimorfismo e interface. Apresenta ainda com feito o
tratamento de excees em linguagem OO como Java. So
apresentados exemplos ilustrativos, exerccios propostos a
serem vencidos pelos aprendizes. O objetivo conhecer
fundamentalmente os recursos de programao orientada por
objetos como uma ferramenta poderosa que pode gerar cdigos
sofisticados e complexos. Nesta unidade o aprendiz ter a
oportunidade a implementar os algoritmos de seu interesse
usando a linguagem Java, para solidificar os conhecimentos
adquiridos nas sub-unidades anteriores.
89
Sumriol
UNIDADE 4. PARADIGMA DE PROGRAMAO
ORIENTADA A OBJETOS
12 Classes, Objetos e Mtodos
13 Definio de Classe em Java
14 Herana, Polimorfismo e Interface
15 Tratamento e Excees em Java
90
89
91
107
125
138
93
Usando os mtodos:
String str1 = "Hello";
char x = str1.charAt(0); // retornar o caracter H
// e o armazenar no atributo x
String str2 = "hello";
// aqui ser retornado o valor booleano true
boolean result = str1.equalsIgnoreCase(str2);
12.3.3. Envio de Argumentos para Mtodos
Em exemplos anteriores, enviamos atributos para os
mtodos. Entretanto, no fizemos nenhuma distino entre os
diferentes tipos de atributos que podem ser enviados como
argumento para os mtodos. H duas formas para se enviar
argumentos para um mtodo, o primeiro envio por valor e o
segundo envio por referncia.
94
Dicas de
programao:
1. Um erro comum
sobre envio por
referncia
acontece quando
criamos um
mtodo para fazer
trocas (swap)
usando referncia.
Note que Java
manipula
objetos 'por
referncia',
entretanto enviase a referncia
para um mtodo
'por
valor'. Como
conseqncia,
no se escreve
um mtodo
padro para fazer
troca
de valores (swap)
entre objetos.
ages[] - escopo A
i em B - escopo B
i em C escopo C
E, no mtodo test, os escopos dos atributos so:
arr[] - escopo D
i em E - escopo E
Quando atributos so declarados, o identificador deve ser nico
no escopo. Isto significa que se voc tiver a seguinte declarao:
{
int test = 10;
int test = 20;
}
Dicas de
programao:
1. Evite ter atributos
declarados com o
mesmo nome dentro
de um mtodo para
no causar
confuso.8.
Dicas de
programao:
1. A classe Void
representa vazio em
Java. Deste modo,
no existem motivos
para
ela ser usada na
converso de valores
primitivos e objetos.
Ela um tratador
para a palavra-chave
void, que utilizada
na assinatura de
mtodos indicando
que estes no
retornam valor.
EXERCCIOS
1. Conceitue os termos, com suas prprias palavras,: a) Classe,
b) Objeto, c) Instanciao, e) Atributo de objeto, f) Mtodo de
objeto, g) Atributo de classe ou atributos estticas, h) Construtor, i
) Mtodo de classe ou mtodos estticos.
104
Class Computer
Processador;
Memory;
System_Oper;
Computer(args);
Start(time );
Shutdown(time );
RunProgram(name);
Object Computer;
Processador=
PowerPc;
Memory=2Gb;
System_Oper=OS/2;
Computer(args);
Start(time );
Shutdown(time );
RunProgram(name );
DESAFIO
O cdigo seguinte cria uma lista
de objetos empregados
associados a uma identificao.
Perceba que nas classes
empregado e empresa est
declarado o mtodo main().
Compile execute as duas
classes. Justique a execuo.
Agora altere o cdigo para no
permitir execuo da classe
empregado e na criao de cada
empregado incrementar o
identificador automaticamente.
// classe Empresa
public class Empresa
public static void main(String[] args) {
// fill the staff array with three Employee objects
Employee[] staff = new Employee[3];
staff[0] = new Employee("Tom", 40000);
staff[1] = new Employee("Dick", 60000);
staff[2] = new Employee("Harry", 65000);
// print out information about all Employee objects
for (int i = 0; i < staff.length; i++)
Employee e = staff[i];
e.setId();
System.out.println("name=" + e.getName()
+ ",id=" + e.getId()
+ ",salary=" + e.getSalary());
}
int n = Employee.getNextId(); // calls static method
System.out.println("Next available id=" + n);
}
}
// classe Empregado
class Employee {
public Employee(String n, double s) {
name = n;
salary = s;
id = 0;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public int getId() {
return id;
}
public void setId() {
id = nextId; // set id to next available id
nextId++;
}
public static int getNextId() {
return nextId; // returns static field
}
106
Dicas de
programao:
1. Lembre-se de
que, para a
declarao da
classe, o nico
modificador de
acesso vlido o
public. De uso
exclusivo para a
classe que possuir
o mesmo nome do
arquivo externo.
Dicas de
programao:
1. Pense em nomes
apropriados para a
sua classe. No a
chame
simplesmente de
classe XYZ ou
qualquer outro nome
aleatrio.
2. Os nomes de
classes devem
iniciadas por letra
MAISCULA.
3. O nome do arquivo
de sua classe
obrigatoriamente
possui o
MESMO NOME da
sua classe pblica.
onde:
modificador tipo de modificador do atributo
tipo tipo do atributo
nome pode ser qualquer identificador vlido
valorInicial valor inicial para o atributo
Relacionaremos a lista de atributos que um registro de estudante
pode conter. Para cada informao, listaremos os tipos de dados
apropriados que sero utilizados. Por exemplo, no seria ideal
usar um tipo int para o nome do estudante ou String para a nota
do estudante.
Abaixo, por exemplo, temos algumas informaes que podemos
adicionar ao registro do estudante:
nome
- String
endereo
- String
idade
- int
nota de matemtica - double
nota de ingls
- double
nota de cincias
double
Dicas de
programao:
1. Declare todas
os atributos de
objeto na parte
superior da
declarao da
classe.
2. Declare cada
atributo em uma
linha.
3. Atributos de
objeto, assim
como qualquer
outro atributo
devem
iniciar com letra
MINSCULA.
4. Use o tipo de
dado apropriado
para cada atributo
declarado.
5. Declare
atributos de
objetos como
private de modo
que somente
os mtodos da
classe possam
acess-los
diretamente.
108
Dicas de
programao:
1. Nomes de
mtodos devem
iniciar com letra
MINSCULA.
2. Nomes de
mtodos devem
conter verbos
3. Sempre faa
documentao
antes da
declarao do
mtodo. Use o
estilo javadoc
para isso
annaRecord.setName("Anna");
beahRecord.setName("Beah");
crisRecord.setName("Cris");
// mostrar o nome de anna
System.out.println(annaRecord.getName());
//mostrar o nmero de estudantes
System.out.println("Count=" +
StudentRecord.getStudentCount());
}
}
A sada desta classe :
Anna
Count = 0
13.4. this
O objeto this usado para acessar atributos de objeto ou
mtodos da classe. Para entender isso melhor, tomemos o
mtodo setAge como exemplo.
Suponha que tenhamos o seguinte mtodo para setAge:
public void setAge(int age){
age = age; // No uma boa prtica
}
O nome do argumento nesta declarao age, que tem o
mesmo nome do atributo de objeto age. J que o argumento age
a declarao mais prxima do mtodo, o valor do argumento
age ser usado. Na instruo:
age = age;
estamos simplesmente associando o valor do argumento age
para si mesmo!
Isto no o que queremos que acontea no nosso cdigo.
A fim de corrigir esse erro, usamos o objeto this. Para utilizar o
objeto this, digitamos:
this.<nomeDoAtributo>
O ideal reescrever o nosso mtodo do seguinte modo:
public void setAge(int age){
this.age = age;
}
114
new
Nome do construtor
Argumentos, caso necessrio
3. No retornam valor
4. So executados automaticamente na utilizao do operador
new durante a instanciao da classe. Para declarar um
construtor, escrevemos:
[modificador] <nomeClasse> (<argumento>*) {
<instruo>*
}
13.6.1. Construtor Padro (default)
Toda classe tem o seu construtor padro. O construtor
padro um construtor pblico e sem argumentos. Se no for
definido um construtor para a classe, ento, implicitamente,
assumido um construtor padro.
Por exemplo, na nossa classe StudentRecord, o
construtor padro definido do seguinte modo:
116
public StudentRecord() {
}
13.6.2. Overloading de Construtores
Como mencionamos, construtores tambm podem sofrer
overloading, por exemplo, temos aqui quatro construtores:
public StudentRecord() {
// qualquer cdigo de inicializao aqui
}
public StudentRecord(String temp){
this.name = temp;
}
public StudentRecord(String name, String address) {
this.name = name;
this.address = address;
}
public StudentRecord(double mGrade, double eGrade,
double sGrade) {
mathGrade = mGrade;
englishGrade = eGrade;
scienceGrade = sGrade;
}
13.6.3. Usando Construtores
Para utilizar estes construtores, temos as seguintes
instrues:
public static void main(String[] args) {
// criar trs objetos para o registro do estudante
StudentRecord annaRecord = new
StudentRecord("Anna");
StudentRecord beahRecord =
new StudentRecord("Beah", "Philippines");
StudentRecord crisRecord =
new StudentRecord(80,90,100);
// algum cdigo aqui
}
Antes de continuarmos, vamos retornar o atributo esttico
studentCount que declaramos agora a pouco. O objetivo de
studentCount contar o nmero de objetos que so
instanciados com a classe StudentRecord. Ento, o que
desejamos incrementar o valor de studentCount toda vez que
um objeto da classe StudentRecord instanciado. Um bom local
para modificar e incrementar o valor de studentCount nos
construtores, pois so sempre chamados toda vez que um objeto
instanciado. Como no exemplo da pgina a seguir:
117
public StudentRecord() {
studentCount++; // adicionar um estudante
}
public StudentRecord(String name) {
studentCount++; // adicionar um estudante
this.name = name;
}
public StudentRecord(String name, String address) {
studentCount++; // adicionar um estudante
this.name = name;
this.address = address;
}
public StudentRecord(double mGrade, double eGrade,
double sGrade) {
studentCount++; // adicionar um estudante
mathGrade = mGrade;
englishGrade = eGrade;
scienceGrade = sGrade;
}
13.6.4. Utilizando o this()
Chamadas a construtores podem ser cruzadas, o que
significa ser possvel chamar um construtor de dentro de outro
construtor. Usamos a chamada this() para isso. Por exemplo,
dado o seguinte cdigo,
public StudentRecord() {
this("some string");
}
public StudentRecord(String temp) {
this.name = temp;
}
public static void main( String[] args ) {
StudentRecord annaRecord
StudentRecord();
}
new
120
C:\schoolClasses>javac StudentRecord.java
C:\schoolClasses>java StudentRecord
Exception in thread "main" java.lang.NoClassDefFoundError:
StudentRecord
(wrong name: schoolClasses/StudentRecord)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown
Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown
Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Surge o erro NoClassDefFoundError, que significa que o
Java desconhece onde procurar por esta classe. A razo disso
que a sua classe StudentRecord pertence a um pacote
denominado schoolClasses. Se desejamos executar esta
classe, teremos que dizer ao Java o seu nome completo
schoolClasses.StudentRecord. Tambm teremos que dizer
JVM onde procurar pelos nossos pacotes, que, neste caso, no
C:\. Para fazer isso, devemos definir a varivel classpath.
Para definir a varivel classpath no Windows, digitamos o
seguinte na linha de comando:
C:\schoolClasses>set classpath=C:\
onde C:\ o diretrio onde colocamos os pacotes. Aps definir a
varivel classpath, poderemos executar a nossa classe em
qualquer pasta, digitando:
C:\schoolClasses>java schoolClasses.StudentRecord
Para sistemas baseados no Unix, suponha que as nossas
classes estejam no diretrio usr/local/myClasses, escrevemos:
export classpath=/usr/local/myClasses
Observe que possvel definir a varivel classpath em qualquer
lugar. possvel definir mais de um local de pesquisa; basta
separ-los por ponto-evrgula (no Windows) e dois-pontos (nos
sistemas baseados em Unix). Por exemplo:
set classpath=C:\myClasses;D:\;E:\MyPrograms\Java
e para sistemas baseados no Unix:
121
export classpath=/usr/local/java:/usr/myClasses
13.8. Modificadores de Acesso
Quando estamos criando as nossas classes e definindo
as suas propriedades e mtodos, queremos implementar algum
tipo de restrio para se acessar esses dados. Por exemplo, ao
necessitar que um certo atributo seja modificado apenas pelos
mtodos dentro da classe, possvel esconder isso dos outros
objetos que estejam usando a sua classe. Para implementar
isso, no Java, temos os modificadores de acesso.
Existem quatro diferentes tipos de modificadores de
acesso: public, private, protected e default. Os trs primeiros
modificadores so escritos explicitamente no cdigo para indicar
o acesso, para o tipo default, no se utiliza nenhuma palavrachave.
13.8.1. Acesso padro
Especifica que os elementos da classe so acessveis
somente aos mtodos internos da classe e s suas subclasses.
No h palavra chave para o modificador default; sendo
aplicado na ausncia de um modificador de acesso. Por
exemplo:
public class StudentRecord {
// acesso padro ao atributo
int name;
// acesso padro para o mtodo
String getName(){
return name;
}
}
O atributo de objeto name e o mtodo getName() podem
ser acessados somente por mtodos internos classe e por
subclasses de StudentRecord. Falaremos sobre subclasses
em prximas lies.
13.8.2. Acesso pblico
Especifica que os elementos da classe so acessveis
tanto internamente quanto externamente classe. Qualquer
objeto que interage com a classe pode ter acesso aos elementos
pblicos da classe. Por exemplo:
public class StudentRecord {
// acesso pblico o atributo
public int name;
// acesso pblico para o mtodo
public String getName(){
return name;
}
}
122
123
Dicas de
programao:
Normalmente, os
atributos de objeto
de uma classe
devem ser
declarados
particulares e a
classe pode
fornecer mtodos
assessores e
modificadores
para estes
DESAFIO
A emprea MagSoft contrata desenvolvedores para trabalhar em
projetos de software. Implemente uma soluo em Java para o
controle do empregados e projetos usando pacote Java.
124
this.name = name;
this.address = address;
}
/**
* Mtodos modificadores e acessores
*/
public String getName(){
return name;
}
public String getAddress(){
return address;
}
public void setName( String name ){
this.name = name;
}
public void setAddress( String add ){
this.address = add;
}
}
Os atributos name e address so declarados como
protected. A razo de termos feito isto que queremos que estes
atributos sejam acessveis s subclasses dessa classe. Se a
declararmos com o modificador private, as subclasses no
estaro aptas a us-los. Todas as propriedades de uma
superclasse que so declaradas como public, protected e
default podem ser acessadas por suas subclasses.
Vamos criar outra classe chamada Student. E, como um
estudante tambm uma pessoa, conclumos que iremos
estender a classe Person, ento, poderemos herdar todas as
propriedades existntes na classe Person. Para isto,
escrevemos:
public class Student extends Person {
public Student(){
System.out.println("Inside
Student:Constructor");
//Algum cdigo aqui
}
// Algum cdigo aqui
}
public Student(){
super();
System.out.println("Inside Student:Constructor");
}
Este cdigo chama o construtor padro de sua
superclasse imediata (a classe Person) e o executa.
Devemos relembrar, quando usamos uma chamada ao
objeto super:
1. A instruo super() DEVE SER A PRIMEIRA INSTRUO EM
UM CONSTRUTOR.
2. As instrues this() e super() no podem ocorrer
imultaneamente no mesmo construtor.
O objeto super uma referncia aos membros da
superclasse (assim como o objeto this da sua prpria classe).
Por exemplo:
public Student() {
super.name = "person name"; // Nome da classe pai
this.name = "student name"; // Nome da classe atual
}
14.1.3. Override de Mtodos
Se, por alguma razo, uma classe derivada necessita que
a implementao de algum mtodo seja diferente da
superclasse, o polimorfismo por override pode vir a ser muito
til. Uma subclasse pode modificar um mtodo definido em sua
superclasse fornecendo uma nova implementao para aquele
mtodo.
Supondo que tenhamos a seguinte implementao para o
mtodo getName da superclasse Person:
public class Person {
...
public String getName(){
System.out.println("Parent: getName");
return name;
}
...
}
Para realizar um polimorfismo por override no mtodo
getName da subclasse Student, escrevemos:
public class Student extends Person {
...
public String getName(){
System.out.println("Student: getName");
return name;
}
...
128
}
Ento, quando invocarmos o mtodo getName de um
objeto da classe Student, o mtodo chamado ser o de Student,
e a sada ser:
Student: getName
possvel chamar o mtodo getName da superclasse,
basta para isso:
public class Student extends Person {
...
public String getName() {
super.getName();
System.out.println("Student: getName");
return name;
}
...
}
Inserimos uma chamada ao objeto super e a sada ser:
Parent: getName Student: getName
14.1.4. Mtodos final e Classes final
Podemos declarar classes que no permitem a herana.
Estas classes so chamadas classes finais. Para definir que uma
classe seja final, adicionamos a palavra-chave final na
declarao da classe (na posio do modificador). Por exemplo,
desejamos que a classe Person no possa ser herdada por
nenhuma outra classe, escrevemos:
public final class Person {
// Cdigo da classe aqui
}
Muitas classes na API Java so declaradas final para
certificar que seu comportamento no seja herdado e,
possivelmente , modificado. Exemplos, so as classes Integer,
Double e Math.
Tambm possvel criar mtodos que no possam ser
modificados pelos filhos, impedindo o polimorfismo por override.
Estes mtodos so o que chamamos de mtodos finais. Para
declarar um mtodo final, adicionamos a palavra-chave final na
declarao do mtodo (na posio do modificador). Por exemplo,
se queremos que o mtodo getName da classe Person
no possa ser modificado, escrevemos:
public final String getName(){
return name;
129
}
Caso o programador tente herdar uma classe final,
ocorrer um erro de compilao. O mesmo acontecer ao se
tentar fazer um override de um mtodo final.
14.2. Polimorfismo
Considerando a classe pai Person e a subclasse Student
do exemplo anterior, adicionaremos outra subclasse a Person,
que se chamar Employee. Abaixo est a hierarquia de classes
que
ilustra o cenrio:
}
}
Voltando ao mtodo main, quando tentamos chamar o
mtodo getName da referncia ref do tipo Person, o mtodo
getName do objeto Student ser chamado. Agora, se
atribuirmos ref
ao objeto Employee, o mtodo getName de Employee ser
chamado.
public static main(String[] args) {
Person ref;
Student studentObject = new Student();
Employee employeeObject = new Employee();
ref = studentObject; //ponteiro de referncia para um
Student
String temp = ref.getName(); //getName de Student
chamado
System.out.println(temp);
ref = employeeObject; // ponteiro de referncia Person
para um
// objeto Employee
String temp = ref.getName(); // getName de Employee
// classe chamada
System.out.println(temp);
}
A capacidade de uma referncia mudar de
comportamento de acordo com o objeto a que se refere
chamada de polimorfismo. O polimorfismo permite que
mltiplos objetos de diferentes subclasses sejam tratados como
objetos de uma nica superclasse, e que automaticamente
sejam selecionados os mtodos adequados a serem aplicados a
um objeto em particular, baseado na subclasse a que ele
pertena.
Outro exemplo que demonstra o polimorfismo realizado
ao passar uma referncia a mtodos.
Supondo que exista um mtodo esttico
printInformation que recebe como parmetro um objeto do tipo
Person, pode-se passar uma referncia do tipo Employee e do
tipo Student,
porque so subclasses do tipo Person.
public static main(String[] args) {
Student studentObject = new Student();
Employee employeeObject = new Employee();
printInformation(studentObject);
printInformation(employeeObject);
}
public static printInformation(Person p){
...
131
}
14.3. Classes Abstratas
Para criar mtodos em classes devemos,
necessariamente, saber qual o seu comportamento. Entretanto,
em muitos casos no sabemos como estes mtodos se
comportaro na classe que
estamos criando, e, por mera questo de padronizao,
desejamos que as classes que herdem desta classe possuam,
obrigatoriamente, estes mtodos.
Por exemplo, queremos criar uma superclasse chamada
LivingThing. Esta classe tem certos mtodos como breath, sleep
e walk. Entretanto, existem tantos mtodos nesta superclasse
que no podemos generalizar este comportamento. Tome por
exemplo, o mtodo walk (andar). Nem todos os seres vivos andam
da mesma maneira. Tomando os humanos como exemplo, os
humanos andam sobre duas pernas, enquanto que outros seres
vivos como os ces andam sobre quatro. Entretanto, existem
muitas caractersticas que os seres vivos tm em comum, isto o
que ns queremos ao criar uma superclasse geral.
Dicas de
programao:
Use classes
abstratas para definir
muitos tipos de
comportamentos no
topo de uma
hierarquia de classes
de programao
orientada a objetos.
Use suas subclasses
para prover detalhes
de implementao da
classe abstrata.
<retorno>
EXERCCIOS
1. Neste exerccio, queremos criar um registro mais
especializado de Student que contm informaes adicionais
sobre um estudante de Cincia da Computao. Sua tarefa
estender a classe StudentRecord que foi implementada nas
lies anteriores e acrescentar atributos e mtodos que so
necessrios para um registro de um estudante de Cincia da
Computao. Utilize override para modificar alguns mtodos da
super
2. Crie uma classe abstrata chamada Shape com os mtodos
abstratos getArea() e getName(). Escreva duas de suas
subclasses Circle e Square. E acrescente mtodos adicionais a
estas subclasses. classe StudentRecord, caso seja necessrio.
137
E x c e p t i o n
i n
t h r e a d
" m a i n "
java.lang.ArrayIndexOutOfBoundsException: 1
at ExceptionExample.main(ExceptionExample.java:5)
Para prevenir que isto ocorra, podemos colocar o cdigo
dentro de um bloco try-catch. O bloco finally opcional. Neste
exemplo, no utilizaremos o bloco finally.
public class ExceptionExample
{
public static void main( String[] args ){
try {
System.out.println( args[1] );
}catch (ArrayIndexOutOfBoundsException exp)
{
System.out.println("Exception caught!");
}
System.out.println("Finish");
}
}
Assim, quando tentarmos rodar o programa novamente
sem a informao dos argumentos, a sada trataria a exceo e o
fluxo do programa no seria interrompido, mostrando o resultado:
Exception caught!
Finish
EXERCCIOS
1. 1. Capturando Excees 1
Dada a seguinte classe:
public class TestException {
public static void main(String[] args) {
for (int i=0; true; i++) {
System.out.println("args["+i+"]="+ args[i]);
}
System.out.println("Quiting...");
}
}
Compile e rode a classe TestException. E como sada ser:
java TestExceptions one two three
args[0]=one
args[1]=two
args[2]=three
Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 3
at TestExceptions.main(1.java:4)
140
c a u g h t :
2. Capturando Excees 2
H uma boa chance de que algumas classes escritas
anteriormentes tenham disparados excees. Como as
excees no foram tratadas, simplesmente interromperam a
execuo.
Retorne a estes programas e implemente o tratamento de
excees.
141
2. Caa-Minas
Este jogo uma verso simplificada do popular jogo de
computador Caa-minas (minesweeper). Inicialmente,
questionado se o usurio quer jogar numa grade de 5x5 ou
numa grade de 10x10. Voc tem 2 arrays bidimensionais que
contm informaes sobre a grade selecionada. Um registro
desse array pode conter 0 ou 1. O valor 1 significa que existe
uma bomba nessa localizao e o valor 0 se no existir.
142
3. Converso Numrica
Criar uma calculadora cientfica que converta os nmeros
digitados para as quatro representaes numricas: decimal,
binrio, octal e hexadecimal. O projeto deve gerar o seguinte
menu na tela.
MENU PRINCIPAL:
Por favor, selecione o tipo de converso:
1 Binrio para Decimal
2 Decimal para Octal
3 Octal para Hexadecimal
4 Hexadecimal para Binrio
5 Sair
A seguinte tela deve ser mostrada quando uma das opes do
menu for escolhida.
Seleo 1: Digite um nmero binrio: 11000
11000 base 2 = 24 base 10 (volta para o menu principal)
Seleo 2: Digite um nmero Decimal: 24
24 base 10 = 30 base 8 (volta para o menu principal)
Seleo 3: Digite um nmero Octal: 30
30 base 8 = 18 base 16 (volta para o menu principal)
Seleo 4: Digite um nmero Hexadecimal: 18
18 base 16 = 11000 base 2
Seleo 1: Digite um nmero Binrio: 110A
Nmero binrio invlido!
Digite um nmero binrio: 1
1 base 2 = 1 base 10 (volta para o menu principal)
Usurio selecionou 5
Tchau!
144
Bibliografia
Livros textos:
DEITEL, H. M. e DEITEL, P. J. JAVA: como programar. 6 Ed.
Porto Alegre: Pearson, 2005.
Livros de referncia:
DEITEL, H. M. e DEITEL, P. J. JAVA: como programar. 3 Ed.
Porto Alegre: Bookman, 2001.
PRESSMAN, R. Software Engineering: A Pratctitioners
Approach. 5 Ed. So Paulo, Mc Graw-Hill, 2000.
SOMMERVILLE, Ian. Engenharia de Software. 8 Ed. Pearson,
2004.
GONALVES, Edson. Dominando Netbeans Construa
Aplicativos Java Tanto em Desktop, Como para
Web.CIENCIA MODERN, 2007.
BORATTI, Isaias Camilo. Programao Orientada A Objetos
em Java. VISUAL BOOKS, 2007.
BOENTE, Alfredo. Aprendendo a Programar em Java 2:
Orientado a Objetos. Brasport. Rio de Janeiro, 2003.
ASCENCIO, Ana Fernanda Gomes e CAMPOS, Edilene
Aparecida Veneruchi. Fundamentos da Programao de
Computadores - Algoritmos, Pascal, C/C++ E Java. Pearson,
2007.
CADENHEAD, Rogers. Aprenda em 21 Dias Java 2. 4 Ed.
Campus, 2005.
RUBINSTEIN, Roberto.
SERSON, Brasport, 2006.
Certificao
151
Java
Sobre o autor
Doutorando em Biotecnologia pelo programa RENORBIO (2006).
Mestre em Cincias da Computao pela Universidade Federal de
Minas Gerais (1997). Graduado em Fsica pela Universidade
Federal do Piau (1991). Experincia em Computao e
informtica, atuando principalmente nas reas de: redes de
computadores, modelagem de sistemas e bioinformtica.
Currculo Lattes: http://lattes.cnpq.br/5095626292200565
152