Buscar

Modelagem Orientada a Objetos - Volume 3

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 58 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 58 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 58 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Recife, 2010
Modelagem 
Orientada a Objetos
Eduardo Araújo Oliveira
Patrícia Azevedo Tedesco
Volume 3
Universidade Federal Rural de Pernambuco
Reitor: Prof. Valmar Corrêa de Andrade
Vice-Reitor: Prof. Reginaldo Barros
Pró-Reitor de Administração: Prof. Francisco Fernando Ramos Carvalho
Pró-Reitor de Extensão: Prof. Paulo Donizeti Siepierski
Pró-Reitor de Pesquisa e Pós-Graduação: Prof. Fernando José Freire
Pró-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira
Pró-Reitora de Ensino de Graduação: Profª. Maria José de Sena
Coordenação Geral de Ensino a Distância: Profª Marizete Silva Santos
Produção Gráfica e Editorial
Capa e Editoração: Allyson Vila Nova, Rafael Lira, Italo Amorim, Gláucia Fagundes e Arlinda Torres
Revisão Ortográfica: Marcelo Melo
Ilustrações: Diego Almeida
Coordenação de Produção: Marizete Silva Santos
Sumário
Apresentação ...................................................................................................4
Conhecendo o Volume 3 .................................................................................5
Capítulo 1 - Classes Abstratas .......................................................................7
Classes Abstratas ..........................................................................................7
Modificador final ........................................................................................... 11
Capítulo 2 - A Linguagem Java .....................................................................21
A Linguagem Java .......................................................................................21
Tipos de Dados ............................................................................................29
Utilizando os Tipos de Dados ......................................................................30
Casting .........................................................................................................33
Capítulo 3 - Java: Estruturas condicionais, estruturas de repetição e 
arrays ..............................................................................................................40
Estruturas Condicionais ...............................................................................40
Estruturas de Repetição ..............................................................................44
Estruturas de Dados - Arrays .......................................................................46
Considerações Finais ....................................................................................56
Conhecendo os Autores ................................................................................58
Apresentação
Caro(a) Cursista,
Seja bem-vindo(a) ao terceiro módulo do curso Modelagem Orientada a Objetos. 
Neste terceiro módulo, vamos aprofundar os estudos que iniciamos no módulo passado, 
refletindo sobre as classes abstratas e sua importância na hierarquia de classes e, 
aprenderemos mais sobre a programação orientada a objetos. Para a implementação, 
vamos continuar estudando a linguagem JAVA, que como já vimos, é a linguagem OO 
mais utilizada no mundo. Aprenderemos agora um pouco mais sobre a sintaxe Java, 
as estruturas condicionais e de repetição, os tipos de dados e outros. Para auxiliar 
o entendimento, preparamos vários exemplos de exercícios resolvidos e também 
sugerimos vários exercícios para praticar. Como você já deve ter visto, na programação, 
a prática é a chave do aprendizado.
O objetivo principal deste terceiro módulo é aprofundar os conceitos aprendidos até 
agora para começar a construir sistemas mais avançados, com mais recursos. Assim, 
poderemos refletir mais profundamente sobre como os conceitos que vimos até agora, 
particulares da orientação a objetos, fazem diferença na construção dos sistemas. E aí, 
vamos ao trabalho?
Bons estudos!
Eduardo Oliveira e Patricia Tedesco
Conhecendo o Volume 3
Neste terceiro volume, você irá encontrar o Módulo 3 da disciplina Modelagem 
Orientada a Objetos. Para facilitar seus estudos, veja a organização deste segundo 
módulo.
Módulo 3 - Programação OO
Carga Horária do Módulo 03: 15 h/aula
Objetivo do Módulo 3
√ Apresentar as Classes Abstratas e aprofundar os estudos de programação 
OO (sintaxe Java, estruturas condicionais e de repetição, tipos de dados...).
Conteúdo Programático do Módulo 3
√ Classes Abstratas
√ Tipos de dados Java
√ Estruturas condicionais
√ Estruturas de repetição
6
Modelagem Orientada a Objetos
Capítulo 1
O que vamos estudar neste capítulo?
Neste capítulo, vamos estudar o seguinte tema:
» Classes Abstratas
Metas
Após o estudo deste capítulo, esperamos que você consiga:
» Compreender e utilizar classes abstratas
» Analisar a importância destes conceitos para a abordagem 
Orientada a Objetos
7
Modelagem Orientada a Objetos
Capítulo 1 - Classes Abstratas
Vamos conversar sobre o assunto?
Olá, seja bem vindo(a) ao terceiro volume do curso de Modelagem 
Orientada a Objetos! 
Neste terceiro volume, iremos aprofundar os estudos que iniciamos 
no volume passado, refletindo um pouco mais sobre as Hierarquias 
de Classes – e as possibilidades que a organização dos objetos em 
hierarquias nos trazem. Neste volume teremos ainda a oportunidade 
de praticar mais o conhecimento adquirido, através de exercícios 
práticos de programação, que resolveremos utilizando linguagem 
Java. 
É importantíssimo para a sua formação que você seja um 
estudante autônomo. Para isto, o primeiro passo é buscar outras 
fontes de aprendizado. Leia outros livros – nós sugerimos várias 
opções na lista de referências! Não se limite às informações contidas 
neste volume. Participe do fórum de discussão, converse e discuta 
com seu tutor, professores e outros colegas de sala. Lembre que 
apesar de estudar a distância, você não está sozinho... Vamos lá...
Classes Abstratas
Até agora, vimos apenas classes concretas, isto é, todas as 
classes que construímos podem originar objetos. Classes concretas 
são estruturas definidas e prontas para instanciarem objetos [JAVA 
STARTER].
As classes abstratas nunca podem ser instanciadas de forma 
direta. A classe abstrata tem como maior objetivo ser estendida e, 
por este motivo, uma classe abstrata se comporta de forma diferente 
de uma classe concreta. Para que serve a classe abstrata? Quando 
devemos utilizá-la? Para entender isto melhor, vamos refletir sobre 
o exemplo do funcionário (já apresentado no volume 2) e revisto a 
seguir:
8
Modelagem Orientada a Objetos
Figura 1. Representação em UML de herança
Como podemos visualizar na Figura 1, a classe Funcionário 
é herdada pelas classes Diretor, Professor e Secretaria. Quando 
vamos criar um objeto do tipo Funcionário, não instanciamos a 
própria classe Funcionário. Devemos criar um objeto do tipo Diretor 
ou Professor ou Secretaria, que são Funcionários. Como forma de 
evitarmos que a classe Funcionário seja instanciada de maneira 
errada e desnecessária, devemos criar a classe Funcionário como 
uma classe abstrata, que deverá, obrigatoriamente, ser estendida. 
As classes abstratas servem para agrupar todas as propriedades que 
são comuns a seus descendentes, desta forma facilitam o reuso de 
código.
public abstract class Funcionario {
Para transformar uma classe concreta em uma classe abstrata, 
adicionamos a palavra reservada abstract na declaração da classe. 
Feita a transformação, não podemos mais instanciar diretamente a 
classe Funcionário. Mais concretamente, quando definimos a classe 
funcionário como abstrata, a tentativa de criação de um objeto do 
tipo Funcionario “Funcionario func = new Funcionario();” não seria 
permitida.
Utilizando uma classe abstrata garantimos que nunca haverá 
um objeto da classe Funcionário e sim, sempre, de uma de suas 
subclasses (Diretor, Professor, Secretaria).
Vamos agora entender um pouco mais sobre os comportamentos 
de classes abstratas. Tomemos a classe Funcionário como exemplo:
public abstract class Funcionario {
9
Modelagem Orientadaa Objetos
 private String depto; 
 private double salario; 
 private double beneficio;
 public double getBeneficio() { 
 return beneficio;
 }
 public void setBeneficio(double beneficio) { 
 this.beneficio = beneficio;
 }
 public String getDepto() { 
 return depto;
 }
 public void setDepto(String depto) { 
 this.depto = depto;
 }
 public double getSalario() { 
 return salario;
 }
 public void setSalario(double salario) { 
 this.salario = salario;
 }
 public void baterPonto(){ 
 System.out.println(“Funcionario bateu o ponto”); 
 }
 public void escreverRelatorioMensal(){ 
 //colocar aqui o código do método 
 }
}
Em classes abstratas, podemos ter métodos abstratos ou 
concretos. No exemplo da classe Funcionário, os métodos que não 
possuem a palavra reservada abstract são concretos e podem ser 
sobrescritos por subclasses. Se quisermos garantir que um método 
de uma classe abstrata seja obrigatoriamente sobrescrito, devemos 
utilizar a palavra reservada abstract na assinatura do método e, não 
devemos implementá-lo. Vejamos o exemplo a seguir:
10
Modelagem Orientada a Objetos
public abstract class Funcionario {
 private String depto; 
 private double salario; 
 private double beneficio;
 public double getBeneficio() { 
 return beneficio;
 }
 public void setBeneficio(double beneficio) { 
 this.beneficio = beneficio;
 }
 public String getDepto() { 
 return depto;
 }
 public void setDepto(String depto) { 
 this.depto = depto;
 }
 public double getSalario() { 
 return salario;
 }
 public void setSalario(double salario) { 
 this.salario = salario;
 }
	 public	abstract	void	baterPonto();
 public void escreverRelatorioMensal(){ 
 //colocar aqui o código do método 
 }
}
Adicionando a palavra reservada abstract no método baterPonto 
(e retirando sua implementação), garantimos que qualquer 
subclasse de Funcionário terá, obrigatoriamente, que sobrescrever 
o método baterPonto(). Fazemos isto se soubermos que todos os 
descendentes da classe Funcionario têm que ter baterPonto() em seu 
comportamento, mas todos fazem isto de maneiras diferentes.
public class Testes extends Funcionario{
11
Modelagem Orientada a Objetos
 public static void main(String[] args) { 
 Diretor dir = new Diretor(); 
 dir.baterPonto();
 }
	 @Override	
	 public	void	baterPonto()	{	
	 	 //	TODO	Auto-generated	method	stub
	 }
}
Uma classe abstrata pode conter apenas métodos abstratos, 
concretos ou ambos. A presença de um método abstrato torna, 
obrigatoriamente, a classe abstrata também [Java Starter]. Se 
lembrarmos um pouco das interfaces, perceberemos que as interfaces 
são como classes totalmente abstratas (todos os métodos da interface 
devem ser implementados). No entanto, vale lembrar que as classes 
abstratas são uma espécie de modelo para a codificação de classes 
concretas, enquanto que as interfaces contém somente as assinaturas 
dos métodos. Assim, quando quisermos definir a estrutura (variáveis, 
constantes, etc) e comportamentos básicos (regras e a maneira como 
os objetos devem realizar determinados tipos de comportamento), 
devemos definir classes abstratas. Se só estivermos preocupados 
em criar a forma como objetos devem realizar determinadas ações 
(métodos) devemos optar por interfaces.
Outro modificador bastante utilizado é o final. De certa forma, o 
modificador final tem o objetivo inverso do abstract, como veremos 
abaixo.
Modificador final
O modificador final quando utilizado em classes ou métodos 
bloqueia, respectivamente, a extensão e a sobrescrita, isto é, 
utilizamos este modificador quando não desejamos que nossa 
classe tenha subclasses ou o método seja sobrescrito [Java Starter]. 
Um método que é declarado final não pode ser redefinido em uma 
subclasse. Os métodos que são declarados static e private são 
implicitamente final [DEITEL, 2005]. Assim como os métodos, as 
classes que são declaradas final não podem ser superclasses (ou 
seja, uma classe final não pode ser herdada).
Lembrete
Devido às suas 
características o 
modificador final 
deve ser utilizado 
com cuidado e 
sabedoria pois 
ele vai contra 
um dos pilares 
da orientação a 
objetos: o reuso 
de código através 
da herança e/ou 
sobrescrita [Java 
Starter].
12
Modelagem Orientada a Objetos
Vamos visualizar um exemplo do modificador final em código? 
Tomemos como exemplo, mais uma vez, a classe Funcionario e suas 
subclasses.
public final class Diretor extends Funcionario {
 public void demitirFuncionario(){ 
 //colocar aqui o código do método
 }
 public void contratarFuncionario(){ 
 //colocar aqui o código do método
 }
 public void baterPonto(){ 
 System.out.println(“Diretor bateu o ponto”);
 }
}
Ao adicionarmos o modificador final na classe Diretor, estamos 
assumindo que esta classe (Diretor) não pode ser herdada (ser 
superclasse). Contudo, isto não tem impacto algum na superclasse. 
Lembram que a superclasse sequer tem conhecimento sobre 
suas subclasses? E se quiséssemos modificar apenas um/alguns 
método(s)?
public class Diretor extends Funcionario {
 public void demitirFuncionario(){ 
 //colocar aqui o código do método
 }
 public void contratarFuncionario(){ 
 //colocar aqui o código do método
 }
 public final void baterPonto(){ 
 System.out.println(“Diretor bateu o ponto”);
 }
}
Neste outro exemplo, a classe Diretor poderia ser estendida (ser 
superclasse de alguma subclasse, ser herdada), mas o método 
baterPonto() não poderia ser sobrescrito. Como uma classe abstrata 
13
Modelagem Orientada a Objetos
pode ter métodos concretos, isto garante que o método implementado 
na classe sempre funcionará com o comportamento da superclasse. A 
classe seria herdada, mas o método não. Quando você for utilizar, se 
for utilizar, o modificador final pense sempre nas implicações e nos 
objetivos que espera obter com o seu uso. 
Conheça Mais
Aprofunde seus conhecimentos sobre classes abstratas. Consulte 
outras fontes de informação na internet e os livros indicados neste 
volume. Ao encontrar boas fontes de leitura, compartilhe este novo 
conhecimento com os demais colegas de sala. Compartilhe também 
os códigos que anda encontrando e desenvolvendo, desta forma 
aprenderemos de maneira mais fácil e ágil. É importante que você 
complemente os estudos deste capítulo com a leitura do capítulo 8 do 
livro de DEITEL. Bons estudos!
Excelente material em PDF:
http://www.t2ti.com/java_starter/modulos/Java_Basico_Modulo_08.pdf
Tutorial genérico, que discute bem as classes abstratas
http://javafree.uol.com.br/artigo/871497/
Material sobre classes (concretas e abstratas) do prof. Waldeck
http://www.dm.ufscar.br/~waldeck/curso/java/part27.html
Aprenda Praticando
Vamos agora representar os Eletrodomésticos através da POO. 
Pensemos ainda na relação entre TV e Rádio com esta classe. Para 
demonstrar, usaremos uma classe abstrata chamada Eletrodomestico, 
que servirá de modelo para todos os objetos que possam ser 
eletrodomésticos.
package classeAbstrata;
public abstract class Eletrodomestico {
 private boolean ligado; 
 private int voltagem;
14
Modelagem Orientada a Objetos
 // métodos abstratos //
 /*
 * não possuem corpo, da mesma forma que
 * as assinaturas de método de uma interface
 */
 public abstract void ligar();
 public abstract void desligar();
 // método construtor //
 /*
 * Classes Abstratas também podem ter métodos 
 * construtores, porém, não podem ser usados para
 * instanciar um objeto diretamente
 */
 public Eletrodomestico(boolean ligado, int voltagem) { 
 this.ligado = ligado;
 this.voltagem = voltagem;
 }
 // métodos concretos
 /*
 * Uma classe abstrata pode possuir métodos não abstratos 
 */
 public void setVoltagem(int voltagem) {
 this.voltagem = voltagem;
 }
 public int getVoltagem() {
 return this.voltagem;
 }
 public void setLigado(boolean ligado) {
 this.ligado = ligado;
 }
15
Modelagem Orientada a Objetos
 public boolean isLigado() {
 returnligado;
 }
}
Como podemos observar, criamos um modelo de classe que 
compreende a uma gama enorme de outros objetos. Isto é o que 
buscamos com a POO, não é mesmo? Desta forma poderemos 
aplicar o conceito de herança.
Note que agora, qualquer objeto que derivar desse modelo deve 
ter sua voltagem especificada e dizer se está ligado ou não.
Vamos agora pensar em outras classes que herdem as 
características da classe abstrata.
A primeira é a classe TV:
package classeAbstrata;
public class TV extends Eletrodomestico {
 private int tamanho;
 private int canal;
 private int volume;
 public TV(int tamanho, int voltagem) {
 super (false, voltagem); //construtor classe abstrata 
 this.tamanho = tamanho;
 this.canal = 0;
 this.volume = 0;
 }
 /* implementação dos métodos abstratos */
 public void desligar() {
 super.setLigado(false);
 setCanal(0);
 setVolume(0);
 }
 public void ligar() {
16
Modelagem Orientada a Objetos
 super.setLigado(true);
 setCanal(3);
 setVolume(25);
 }
 //abaixo teríamos todos os métodos construtores
 //get e set...
}
E agora veremos uma outra classe. A classe Radio.
package classeAbstrata;
public class Radio extends Eletrodomestico {
 public static final short AM = 1;
 public static final short FM = 2;
 private int banda;
 private float sintonia;
 private int volume;
 public Radio(int voltagem) {
 super(false, voltagem);
 setBanda(Radio.FM);
 setSintonia(0);
 setVolume(0);
 }
 /* implementação dos métodos abstratos */
 public void desligar() {
 super.setLigado(false);
 setSintonia(0);
 setVolume(0);
 }
 public void ligar() {
 super.setLigado(true);
 setSintonia(88.1f);
17
Modelagem Orientada a Objetos
 setVolume(25);
 }
 // abaixo teríamos todos os métodos construtores
 // get e set...
}
Como podemos notar, temos duas classes totalmente diferentes 
que têm como base o mesmo modelo. Também é perceptível o fato 
de que em ambas as classes, os métodos abstratos ligar() e 
desligar() foram implementados, porém, não há a implementação 
dos outros métodos como setVoltagem() ou isLigado().
As classes abstratas servem de base para codificação de uma 
classe inteira, diferentemente das interfaces que são apenas 
assinaturas dos métodos. Quando temos que definir variáveis, 
constantes, regras, e pequenas ações definidas devemos usar classes 
abstratas. Mas, se formos apenas criar a forma como objetos devem 
realizar determinadas ações (métodos) devemos optar por interfaces.
Abaixo está uma classe que testa a funcionalidade dessas classes.
package classeAbstrata;
public class Main {
 public static void main(String[] args) {
 TV tv1 = new TV(29, 110);
 Radio radio1 = new Radio(110);
 /*
 * chamando os métodos abstratos implementados
 * dentro de cada classe (TV e Radio)
 */
 tv1.ligar();
 radio1.ligar();
 System.out.print(“A TV está “);
 if(tv1.isLigado()){
 System.out.println(“ligada”);
 } else {
18
Modelagem Orientada a Objetos
 System.out.println(“desligada”);
 }
 System.out.print(“e o Rádio está “);
 if(radio1.isLigado()){
 System.out.println(“ligado”);
 } else {
 System.out.println(“desligado”);
 }
 }
}
Atividades e Orientações de Estudo
Exercícios
Para estes exercícios, elaborem as respostas em um documento 
WORD e postem como atividade no ambiente para que os tutores 
revisem as respostas. A última questão deve ser postada também 
no fórum, para que todos tenham acesso às soluções dos demais 
colegas e discutam em conjunto.
1– Qual a diferença entre interface e classes abstratas? 
2– Faça uma diferenciação entre os métodos não-abstract e os 
métodos abstract.
3– É possível criar instâncias de classes abstratas? Justifique sua 
resposta.
4– Escreva um código orientado a objetos para representar 
diferentes tipos de veículos (carros, motos, aviões, barcos). 
A classe abstrata veículos deve possuir os métodos voar(), 
navegar(), dirigir(), pilotar(), frear(), acelerar() e buzinar(). O avião 
não tem buzina, o carro buzina “FOM FOM”, a moto buzina “BI 
BI” e o barco buzina “FOOOMMM”. O carro pode ainda buzinar 
seguidas vezes, quantas o motorista quiser (valor recebido por 
parâmetro). Identifique que métodos devem ser concretos e que 
métodos devem ser abstratos (justifique sua escolha através de 
19
Modelagem Orientada a Objetos
comentários inseridos no código). Considere os conceitos vistos 
durante o curso (encapsulamento, herança...), caso necessário 
aplicá-los. Sobrescreva e sobrecarregue os métodos que julgar 
necessário. Ao final, discuta sua solução com o tutor e colegas. 
Represente sua solução em UML, através do ArgoUML ou 
ASTAH1.
Atividade de Pesquisa
Em duplas, criem um quadro resumo falando das classes concretas, classes 
abstratas, interfaces e modificadores vistos durante o curso. Expliquem quando 
devemos utilizar cada um deles. As soluções devem ser postadas no fórum.
Exemplo: As classes concretas são utilizadas para ... . Estas classes podem ser 
instanciadas diretamente, não podem ter métodos ... , etc...
As interfaces possuem métodos que diferem dos métodos das classes concretas 
porque... Etc...
Vamos Revisar?
Resumo
Neste capítulo aprendemos sobre as classes abstratas. Vimos que estas classes 
não podem ser instanciadas, que são usadas para organizar características 
comuns a diversas subclasses e que são desenvolvidas para serem herdadas. 
Estas classes não possuem instâncias diretas, só indiretas. Vimos ainda que 
as classes abstratas podem definir métodos sem implementação, chamados 
abstratos e que classes concretas não podem ter métodos abstratos (senão 
viram classes abstratas). Por fim, aprendemos sobre o modificador de acesso 
final, que pode ser utilizado em métodos e em classes, mas que quando utilizado 
não permite sobrescrita/herança. Este modificador é importante para garantir 
integridade e segurança de dados.
Lembrete
1 ASTAH – http://
jude.change-
vision.com/jude-
web/index.html
20
Modelagem Orientada a Objetos
Capítulo 2
O que vamos estudar neste capítulo?
Neste capítulo, vamos estudar o seguinte tema:
» A Linguagem Java
Metas
Após o estudo deste capítulo, esperamos que você consiga:
» Compreender e utilizar melhor a linguagem Java;
21
Modelagem Orientada a Objetos
Capítulo 2 - A Linguagem Java
Vamos conversar sobre o assunto?
Olá, seja bem vindo(a) ao segundo capítulo do terceiro volume do 
curso de Modelagem Orientada a Objetos! 
Até aqui, nos nossos estudos sobre o paradigma Orientado a 
Objetos, já vimos o que é uma Classe, aprendemos também que um 
objeto nada mais é do que a instanciação de uma classe e que o 
encapsulamento e a hierarquia de classes são pilares da orientação 
a objetos. Estudamos ainda um pouco sobre a linguagem Java e a 
linguagem UML.
Neste capítulo nós iremos continuar nossos estudos sobre a 
programação Orientada a Objetos. Iremos agora aprofundar nossos 
conhecimentos sobre a linguagem Java. Aprenderemos mais sobre 
seus tipos de dados e sobre as estruturas condicionais e de repetição.
É importantíssimo que você busque outras fontes de aprendizado. 
Leia outros livros! Não se acomode às informações contidas neste 
volume. Consulte a referência [CAELUM] e os livros de [DEITEL, 
2005; DEITEL, 2006]. Participe do fórum de discussão, converse e 
discuta com seu tutor, professores e outros colegas de sala. Vamos 
lá...
A Linguagem Java
Vamos agora entender um pouco mais sobre a linguagem Java e 
sua sintaxe. Até o momento aprendemos bastante sobre o paradigma 
da orientação a objetos e agora vamos aprender mais sobre a 
linguagem Java, que é uma linguagem orientada a objetos. Alguns dos 
conceitos que veremos a seguir já foram vistos em outros volumes, 
em exemplos de códigos comentados.
Antes de vermos os tipos de dados suportados pela linguagem 
Java e suas estruturas de controle e repetição, vamos identificar as 
palavras reservadas desta linguagem (sintaxe) [SABINO, 2003].
22
Modelagem Orientada a Objetos
Modificadores de acesso
»Como já vimos em nosso Volume 1 os modificadores de acesso 
proveem permissões de acesso aos atributos e métodos das 
classes. Utilizados para encapsular dados.
 public: acesso a partir de qualquer classe
 private: acesso apenas dentro da própria classe
 protected: acesso por classes no mesmo pacote e subclasses
Exemplo:
public class Exemplos {
 private String nome;
 private int idade;
public String getNome() {
 return nome;
 }
 public void setNome(String nome) {
 this.nome = nome;
 }
 public int getIdade() {
 return idade;
 }
 public void setIdade(int idade) {
 this.idade = idade;
 }
 public static void main(String[] args) {
 System.out.println(“Exemplos de modificadores 
de acesso de atributos e métodos”);
 }
}
Modificadores de classes, variáveis ou métodos
» Alguns dos modificadores de classes, variáveis ou métodos 
23
Modelagem Orientada a Objetos
suportados pela linguagem Java foram vistos durante os 
volumes 1, 2 e neste terceiro volume. 
 abstract: classe que não pode ser instanciada ou método que 
precisa ser implementado por uma subclasse não abstrata
 class: especifica uma classe
 extends: indica a superclasse que a subclasse está estendendo
 final: impossibilita que uma classe seja estendida, que um 
método seja sobrescrito ou que uma variável seja reinicializada
 implements: indica as interfaces que uma classe irá 
implementar
 interface: especifica uma interface
 native: indica que um método está escrito em uma linguagem 
dependente de plataforma, como o C
 new: instancia um novo objeto, chamando seu construtor
 static: faz um método ou variável pertencer à classe ao invés 
de às instâncias
 strictfp: usado em frente a um método ou classe para indicar 
que os números de ponto flutuante seguirão as regras de ponto 
flutuante em todas as expressões
 synchronized: indica que um método só pode ser acessado 
por uma thread de cada vez
 transient: impede a serialização de campos
 volatile: indica que uma variável pode ser alterada durante o 
uso de threads
Exemplo:
public class Exemplos extends SuperClasseExemplos 
implements InterfaceExemplos{
 private String nome;
 private int idade;
 //atributo com modificadores static e final
 private static final double PI = 3.14;
 public String getNome() {
24
Modelagem Orientada a Objetos
 return nome;
 }
 public void setNome(String nome) {
 this.nome = nome;
 }
 public int getIdade() {
 return idade;
 }
 public void setIdade(int idade) {
 this.idade = idade;
 }
 public final void metodoComFinal(){
 //nao poderia ser herdado
 //possui modificador final
 }
 public static void main(String[] args) {
 //cria instancia da classe Exemplos
 Exemplos ex = new Exemplos();
 //imprime uma saída
 System.out.println(“Exemplos de modificadores de 
classe/atributos/métodos”);
 }
}
Controle de fluxo dentro de um bloco de código
» Algumas das palavras reservadas de controle de fluxo foram 
vistas durante os volumes 1, 2 e neste terceiro volume. As 
palavras reservadas para o controle de fluxos servem para a 
criação e controle de estruturas condicionais e de repetição 
(exemplos a seguir) Algumas palavras reservadas de Java tem 
o mesmo comportamento de palavras reservadas já estudadas 
durante a disciplina da linguagem C (switch, case, if, break, 
continue e return).
25
Modelagem Orientada a Objetos
 break: sai do bloco de código em que ele está
 case: executa um bloco de código dependendo do teste do 
switch
 continue: pula a execução do código que viria após essa linha 
e vai para a próxima passagem do loop
 default: executa esse bloco de código caso nenhum dos teste 
de switch-case seja verdadeiro
 do: executa um bloco de código uma vez, e então realiza um 
teste em conjunto com o while para determinar se o bloco 
deverá ser executado novamente
 else: executa um bloco de código alternativo caso o teste if seja 
falso
 for: usado para realizar um loop condicional de um bloco de 
código
 if: usado para realizar um teste lógico de verdadeiro o falso
 instanceof: determina se um objeto é uma instância de 
determinada classe, superclasse ou interface
 return: retorna de um método sem executar qualquer código 
que venha depois desta linha (também pode retornar uma 
variável)
 switch: indica a variável a ser comparada nas expressões case 
(semelhante ao que já estudamos em C)
 while: executa um bloco de código repetidamente até que uma 
certa condição seja verdadeira
Exemplo:
public class Exemplos {
 //declaração do método principal - main
 public static void main(String[] args) {
 /*declaração de uma estrutura de repeticao contada 
(FOR) que vai de 1 ate 50 e verifica se o numero MOD 5 é 
igual a 0 se o contador da estrutura MOD 5 for zero, o 
break é executado. Quando o break é executado, o FOR para 
de ser executado. A estrutura para de repetir e vai para 
a proxima linha do programa.*/
26
Modelagem Orientada a Objetos
 for (int i = 1; i < 50; i++) {
 if(i%5==0){
 break;
 }
 System.out.println(“Valor impresso 1o FOR = “ 
+ i);
 }
 /*declaração de uma estrutura de repeticao contada 
(FOR) que vai de 1 ate 50 e verifica se o numero MOD 5 
é igual a 0 se o contador da estrutura MOD 5 for zero, 
o continue é executado. Quando o continue é executado, 
o FOR pula da instrução de continue para o inicio da 
estrutura de repeticao. Em outras palavras, se o i (que 
é o contador) for igual a 5 (5 MOD 5 == 0), o comando 
continue será executado. Neste momento, a linha seguinte 
a ser executada será o FOR com o i = 6. O system out nao 
será executado.*/
 for (int i = 1; i < 50; i++) {
 if(i%5==0){
 continue;
 }
 System.out.println(“Valor impresso 2o FOR = “ 
+ i);
 }
 //declaracao de um atributo i (os outros atributos
 //utilizados nos FOR eram atributos locais e não
 //são visiveis fora das estruturas
 int i = 10;
 /*Estrutura de repetição condicional. Repetirá 
enquanto a condição for verdadeira. Neste caso, o i começa 
em 10. 10 MOD 3 nao é igual a 0, pois este MOD tem resto. 
Entao o break nao será executado quando o i for igual 
a 10. O valor 10 será impresso, o i será decrementado 
e o while rodará novamente. Nesta nova execucao, com 
i == 9, o MOD será 0. O MOD sendo = 0, o break será 
executado. Quando o break for executado, o programa irá 
27
Modelagem Orientada a Objetos
executar a linha seguinte após a estrutura de repetição, 
saindo da repeticao. Neste caso, sequer o system out será 
executado. */
 while(i>1){
 if(i%3==0){
 break;
 }
 System.out.println(“Valor impresso WHILE == “ 
+ i);
 i--;
 }
 //volta o valor de i para 10
 i = 10;
 /*Estrutura de repetição condicional. Repetirá 
enquanto a condição for verdadeira. Neste caso, o i 
começa em 10. 10 MOD 5 é igual a 0, pois este MOD nao 
tem resto. Ao entrar no condicional (pois a operação com 
o MOD resultará em uma resposta true), o continue será 
executado. O continue ira executar novamente o inicio do 
while, sem imprimir o valor do atributo e sem decrementar 
seu valor. Qual o resultado disto? A aplicação entrará em 
loop.*/
 while(i>1){
 if(i%5==0){
 continue;
 }
 System.out.println(“Valor impresso WHILE == “ 
+ i);
 i--;
 }
 /**
 * Um excelente exercício é refazer estes exemplos 
 * em seu Eclipse. Execute e entenda cada uma das
 * instruções aqui comentadas.
28
Modelagem Orientada a Objetos
 */
 }
}
Tratamento de erros
» O tratamento de erros ou exceções permite detectar erros 
e manipular esses erros, ou seja, tratá-los. Este assunto não 
foi tratado durante esta disciplina, mas você pode aprender a 
respeito em: http://www.fundao.wiki.br/articles.asp?cod=172 e http://
camilolopes.wordpress.com/2009/02/04/tratamento-de-excecoes-em-java/. 
 assert: testa uma expressão condicional para verificar uma 
suposição do programador
 catch: declara o bloco de código usado para tratar uma exceção
 finally: bloco de código, após um try-catch,que é executado 
independentemente do fluxo de programa seguido ao lidar com 
uma exceção
 throw: usado para passar uma exceção para o método que o 
chamou
 throws: indica que um método pode passar uma exceção para 
o método que o chamou
 try: bloco de código que tentará ser executado, mas que pode 
causar uma exceção
Controle de pacotes
 import: importa pacotes ou classes para dentro do código
 package: especifica a que pacote todas as classes de um 
arquivo pertencem
Tipos de Dados Primitivos
» São 8 os tipos de dados primitivos suportados em Java
 boolean: um valor indicando verdadeiro ou falso
 byte: um inteiro de 8 bits (signed)
 char: um caracter unicode (16-bit unsigned)
 double: um número de ponto flutuante de 64 bits (signed)
29
Modelagem Orientada a Objetos
 float: um número de ponto flutuante de 32 bits (signed)
 int: um inteiro de 32 bits (signed)
 long: um inteiro de 64 bits (signed)
 short: um inteiro de 32 bits (signed)
Variáveis de referência
 super: refere-se a superclasse imediata
 this: refere-se a instância atual do objeto
Retorno de um método
 void: indica que o método não tem retorno
Palavras reservadas não utilizadas
 const: Não utilize para declarar constantes; use public static 
final
 goto: não implementada na linguagem Java por ser considerada 
prejudicial
Literais reservados
De acordo com a Java Language Specification2, null, true e 
false são tecnicamente chamados de valores literais, e não palavras 
reservadas Se você tentar criar algum identificador com estes nomes, 
você também terá um erro de compilação.
Tipos de Dados
Java é uma linguagem que possui oito tipos de dados primitivos3, 
conforme apresentado na Tabela 1 e na Tabela 2.
Hiperlink
2 Java Language 
Specification 
- http://java.sun.
com/docs/books/
jls/
Lembrete
3 Tipos de Dados 
Primitivos – são 
tipos de dados 
mais simples, 
não objetos.
30
Modelagem Orientada a Objetos
Tabela 1. Tipos de dados Java 
 
Tipo de Dados Tamanho
boolean 1 bit
byte 1 byte
short 2 bytes
char 2 bytes
int 4 bytes
float 4 bytes
long 8 bytes
double 8 bytes
Tabela 2. Descrição dos tipos de dados primitivos de Java 
 
Tipo Descrição
boolean Valores true ou false
char
Caractere em notação Unicode de 16 bits. Armazena dados 
alfanuméricos. Também pode ser usado como um dado inteiro com 
valores na faixa entre 0 e 65535.
byte Inteiro de 8 bits em notação de complemento de dois. Pode assumir valores entre -27 = -128 e 27 -1 = 127
short Inteiro de 16 bits em notação de complemento de dois. Os valores possíveis cobrem a faixa de -2-15 = -32.768 a 215 -1 = 32 .767
int Inteiro de 32 bits em notação de complemento de dois. Pode assumir valores entre -231 = 2.147.483.648 e 231 -1 = 2.147.483.647.
long Inteiro de 64 bits em notação de complemento de dois. Pode assumir valores entre -263 e 263-1
float
Representa números em notação de ponto flutuante normalizada em 
precisão simples de 32 bits em conformidade com a norma IEEE 
754-1985. O menor valor positivo representável por esse tipo é 
1.40239846 e -46 e o maior é 3.40282347 e +38
double
Representa números em notação de ponto flutuante normalizada em 
precisão dupla de 64 bits em conformidade com a norma IEEE 754-
1985. O menor valor positivo representável é 4.94065645841246544 
e o maior é 1.7976931348623157 e +308
Utilizando os Tipos de Dados
Podemos declarar variáveis dentro e fora de métodos da classe. 
As variáveis que são declaradas fora dos métodos têm escopo global, 
31
Modelagem Orientada a Objetos
e podem ser acessadas a partir de qualquer local da classe. Já as 
variáveis que são declaradas dentro dos métodos têm escopo local, 
ou seja, são acessadas apenas dentro dos métodos em que foram 
declaradas (visibilidade restrita). Vale lembrar que em Java, todas as 
variáveis são declaradas da seguinte maneira:
tipoDaVariavel nomeDaVariavel;
Independente do tipo da variável ser de um tipo primitivo ou ser um 
objeto (uma classe que tenhamos criado, por exemplo), toda variável 
é declarada da mesma forma. 
Vamos a um exemplo:
public class Funcionario {
 private String depto; 
 private double salario; 
 private double beneficio;
 public double getBeneficio() { 
 return beneficio;
 }
 public void setBeneficio(double beneficio) { 
 this.beneficio = beneficio;
 }
 public String getDepto() { 
 return depto;
 }
 public void setDepto(String depto) { 
 this.depto = depto;
 }
 public double getSalario() { 
 return salario;
 }
 public void setSalario(double salario) { 
 double salarioNovo = salario *10; 
 this.salario = salario;
 }
 public void escreverRelatorioMensal(){
32
Modelagem Orientada a Objetos
 //colocar aqui o código do método
 }
}
Na classe Funcionário, podemos notar a criação de três variáveis 
globais (declaradas no escopo da classe), de nomes depto (do 
tipo String, por lidar com nomes de departamentos), salario (do 
tipo double, por manipular valores reais) e beneficio (também do 
tipo double, como o atributo salário, por também manipular valores 
reais. Se olharmos o método getBeneficio(), perceberemos que este 
método retorna o valor contido em uma variável de nome beneficio, 
do tipo double. Esta variável foi declarada na classe e por isto possui 
visibilidade global. Por este motivo, ela pode ser acessada dentro dos 
métodos, mesmo sem ter sido declarada dentro deles.
No exemplo do método setBeneficio(double), percebemos algo 
diferente. Em Java, a atribuição é feita através do comando =. Dentro 
do método há a seguinte atribuição this.beneficio = beneficio. O que 
este comando nos diz? A palavra reservada this, como já visto em 
volumes anteriores, se refere a uma variável da classe. Portanto, este 
comando de atribuição está simplesmente atribuindo o valor recebido 
por parâmetro (variável local) a uma variável da classe (variável 
global). Por conta desta atribuição no método setBeneficio(double), 
o método getBeneficio() terá o valor da variável beneficio atualizado.
Ainda na classe Funcionário, se analisarmos o método 
setSalario(double) perceberemos a criação de uma nova variável 
local, de nome salarioNovo. Esta variável, do tipo double, é visível 
apenas dentro do método setSalario(double) (assim como o valor, 
recebido por parâmetro). Esta variável tem escopo local. Se tentarmos 
acessar a variável salarioNovo fora do método, teremos um erro de 
compilação (porque outros métodos não têm conhecimento sobre ela, 
não sabem que ela existe).
Caso quiséssemos criar um objeto do tipo Funcionário, a 
declaração seria feita da seguinte maneira:
Funcionario funcionário;
O primeiro nome se refere à classe Funcionário, que é um tipo 
de variável (objeto). O segundo funcionário é simplesmente o 
identificador, o nome da variável.
Os tipos de dados primitivos e os objetos definidos pelo 
33
Modelagem Orientada a Objetos
desenvolvedor ou já disponíveis pela biblioteca Java (String, por 
exemplo) podem ser utilizados como tipos de retornos em métodos, 
como parâmetros em métodos e construtores e nas estruturas 
condicionais e de repetição do Java. 
Exemplo:
//método com tipo de retorno int
 public int getCodigo() { 
 return codigo;
 }
 //método com parâmetro int
 public void setCodigo(int codigo) { 
 this.codigo = codigo;
}
Casting
Alguns valores são incompatíveis se tentarmos fazer uma 
atribuição direta. Se tentarmos atribuir um valor double (real) a uma 
variável int não conseguiremos [CAELUM]. Isto não é permitido 
porque, conforme apresentado na Tabela 1, um integer é um tipo de 
dado menor que um double. Ao tentarmos guardar um valor double 
em um integer, teríamos que admitir a perda de valores (visto que 
um double é maior que um inteiro). Por conta desta perda, Java não 
permite a conversão direta dos valores. Para compreender melhor, 
vamos a alguns exemplos.
 public static void main(String[] args) {
 int valorInteiro = 10; 
 double valorReal = 5.5;
 //aqui teríamos erro de compilação
 valorInteiro = valorReal;
 //as demaisatribuições estão corretas e seriam
 //permitidas
 valorReal = valorInteiro; 
 valorInteiro = (int)valorReal;
 }
34
Modelagem Orientada a Objetos
No código acima, criamos duas variáveis (valorInteiro e valorReal): 
uma de valor inteiro e outra de valor double. A primeira atribuição, 
onde tentamos atribuir um valor real (double) em uma variável do 
tipo inteiro (int) não seria permitida (pelos motivos explicados acima). 
O compilador acusaria erro. No segundo caso, uma variável do tipo 
real poderia receber o valor contido em uma variável do tipo inteiro 
sem problemas. Isto porque um double tem tamanho suficiente para 
receber valores do tipo inteiro. Por fim, na última atribuição do método 
main chegamos ao Cast. Caso o desenvolvedor entenda o que está 
fazendo, ele pode assumir os riscos de atribuir uma variável de um 
tipo maior em uma variável de um tipo menor. No exemplo, temos um 
valor inteiro recebendo um valor do tipo real. Neste caso, o compilador 
trunca o valor real para que este valor possa ser adicionado a 
um inteiro. Isto foi possível por conta do cast. Um cast informa ao 
compilador que o desenvolvedor entende os riscos da atribuição. Por 
conta disto, o compilador permite a atribuição. O único tipo primitivo 
que não pode ser atribuído a nenhum outro tipo é o boolean.
Na Tabela 3, estão relacionados todos os casts possíveis na 
linguagem Java, mostrando a conversão de um valor para outro. A 
indicação Impl. quer dizer que aquele cast é implícito e automático, 
ou seja, você não precisa indicar o cast explicitamente (lembrando 
que o tipo boolean não pode ser convertido para nenhum outro tipo) 
[CAELUM].
Tabela 3. Castings possíveis [CAELUM] 
 
PARA:
byte short char int long float double
DE:
byte - - - - - Impl. (char) Impl. Impl. Impl. Impl.
short (byte) - - - - - (char) Impl. Impl. Impl. Impl.
char (byte) (short) - - - - - Impl. Impl. Impl. Impl.
int (byte) (short) (char) - - - - - Impl. Impl. Impl.
long (byte) (short) (char) (int) - - - - - Impl. Impl.
float (byte) (short) (char) (int) (long) - - - - - Impl.
double (byte) (short) (char) (int) (long) (float) - - - - -
Agora que aprendemos sobre os tipos de dados primitivos 
suportados em Java, vamos aprender um pouco mais sobre as 
estruturas condicionais e de repetição da linguagem no capítulo a 
seguir.
35
Modelagem Orientada a Objetos
Conheça Mais
Aprofunde seus conhecimentos sobre os tipos de dados primitivos 
suportados pela linguagem Java e os casts entre estes. Este 
conhecimento é muito importante para a manipulação de objetos (e 
seus casts), é complementar a toda a base que vimos de modelagem 
orientada a objetos.
Excelente material em PDF:
www.caelum.com.br - Apostila FJ-11. Java e Orientação a Objetos
Aprenda Praticando
Vamos agora identificar novos cenários de tipos de dados e seus 
casts.
public class Exemplos {
 public static void main(String[] args) {
 int valorInteiro = 10;
 double valorReal = 5.5;
 String nome = “Bob”;
 //aqui teríamos erro de compilação (caso nao 
 //fizéssemos o cast) com o cast, o valor double é 
 //truncado para que caiba em um atributo do tipo 
 //inteiro. Como mostrado na tabela 2, faremos um 
 //cast de double para int, por isso utilizamos o 
 //cast (int).
 valorInteiro = (int)valorReal;
 System.out.println(“Valor inteiro == 
“+valorInteiro);
 //as demais atribuições estão corretas e seriam
 //permitidas
36
Modelagem Orientada a Objetos
 valorReal = valorInteiro;
 valorInteiro = (int)valorReal;
 //agora lidando com String (cast entre um tipo de
 //dado primitivo e um objeto).
 /*O cast de valores numéricos para String pode ser
 * feito através da concatenação do valor com “”.
 * A utilização da aspas garante que o dado
 * manipulado é do tipo String, por isso, ao
 * concaternarmos um valor double ou int com um
 * String, estes tipos primitivos se tornam String. */ 
 nome = valorInteiro+””;
 System.out.println(“Nome == “ + nome);
 /*No caso de um cast de um objeto para um tipo 
 * primitivo, temos algumas APIs (bibliotecas) Java
 * de apoio. No caso de um cast de um objeto para um
 * inteiro, temos a biblioteca parseInt, dentro da
 * classe Integer. As APIs disponíveis podem ser
 * acessadas aqui: java.sun.com/javase/6/docs/api/ */
 valorInteiro = Integer.parseInt(nome);
 System.out.println(“Valor Inteiro == “ + 
valorInteiro);
 }
}
Atividades e Orientações de estudo
Exercícios
Para o código abaixo, siga as instruções comentadas dentro do 
código e realize as modificações solicitadas (crie um novo projeto 
Java no Eclipse, adicione uma nova classe de nome Funcionario a 
37
Modelagem Orientada a Objetos
este projeto, e utilize este código como o código inicial da classe). 
Com este exercício praticaremos conceitos de encapsulamento e 
manipulação de dados (inclusive com casts). 
import javax.swing.JOptionPane;
public class Funcionario {
 private int codigo; 
 private String cpf; 
 private String nome; 
 private int idade; 
 private double salario;
 //crie os métodos SET e GET para manipular os atributos
 //encapsulados da classe
 public static void main(String[] args) {
 //crie uma instancia da classe para acessar os
 //métodos (fora do main) da classe
 /* utilize a função
 * JOptionPane.showInputDialog(Object) para ler
 * dados de entrada (digitados pelo usuário) para
 * os atributos. exemplo: JOptionPane.showInputDialog
 * (“Digite um cpf”); O valor digitado pelo usuario,
 * para cada um dos atributos existentes, deve ser 
 * armazenado nestes através de chamadas realizadas 
 * aos métodos SET correspondentes. Se voce leu um 
 * CPF, deve chamar o método setCpf, de dentro do
 * método main, fornecendo o valor do cpf que foi
 * lido. Alguns casts serão necessários. */
 /*
 * crie um método de nome castDoubleInt(double), 
 * que recebe um valor double como parametro.
 * realize uma chamada, a partir do método main, a 
 * este método, passando o salario como parametro.
 * dentro do método que voce criou (castDoubleInt),
38
Modelagem Orientada a Objetos
 * realize o cast de salario para um valor inteiro
 * e retorne o resultado (inteiro).
 * Imprima este valor no método main.
 */
 }
}
Este exercício deve ser entregue no ambiente para que seja 
corrigido e discutido pelo tutor. Em caso de dificuldades, lembre 
sempre de participar no fórum. Conte sempre com a ajuda de outros 
colegas e de seu tutor/professor. Nosso curso é a distância. É muito 
importante a sua participação.
Vamos Revisar?
Resumo
Neste capítulo você conheceu um pouco mais sobre a linguagem Java. Vimos 
os tipos de dados primitivos suportados pela linguagem, como e quando realizar 
Casts. A partir de agora, com este conhecimento, aprofundaremos ainda mais os 
conceitos sobre a linguagem Java.
39
Modelagem Orientada a Objetos
Capítulo 3
O que vamos estudar neste capítulo?
Neste capítulo, vamos estudar o seguinte tema:
» Java: Estruturas condicionais, estruturas de repetição e arrays.
Metas
Após o estudo deste capítulo, esperamos que você consiga:
» Compreender e utilizar melhor a linguagem Java;
40
Modelagem Orientada a Objetos
Capítulo 3 - Java: Estruturas 
condicionais, estruturas de 
repetição e arrays
Vamos conversar sobre o assunto?
Olá, seja bem vindo(a) ao terceiro capítulo do terceiro volume do 
curso de Modelagem Orientada a Objetos! 
Até aqui, nos nossos estudos sobre o paradigma Orientado a 
Objetos, já vimos o que é uma classe, o que é um objeto, vimos os 
conceitos de encapsulamento e hierarquia de classes. Estudamos 
ainda um pouco sobre a linguagem ML e neste volume estamos 
aprendendo mais sobre a linguagem Java.
Neste capítulo nós iremos aprofundar nossos conhecimentos 
sobre a linguagem Java. Aprenderemos mais sobre suas estruturas 
condicionais e de repetição, e sobre os as estruturas de dados 
homogêneos multidimensionais - arrays.
É importantíssimo que você busque outrasfontes de aprendizado. 
Leia outros livros! Não se acomode às informações contidas neste 
volume. Consulte a referência [CAELUM] e os livros de [DEITEL, 
2005; DEITEL, 2006]. Participe do fórum de discussão, converse e 
discuta com seu tutor, professores e outros colegas de sala. Vamos 
lá... 
Estruturas Condicionais
Como já vimos na disciplina de introdução a algoritmos, as 
estruturas condicionais são estruturas que operam em função de 
uma condição verdadeira ou falsa. Uma condicional (estrutura IF ou 
comandos de repetição while ou do-while) precisa, obrigatoriamente, 
de um valor que seja verdadeiro ou falso. Este valor pode ser obtido 
através de uma operação de comparação (>, <, >=, <=) ou de um 
booleano (variável que possui valor verdadeiro ou falso). Em Java, a 
estrutura condicional IF possui a seguinte sintaxe, e pode ser simples 
ou composta, como mostram os exemplos abaixo:
41
Modelagem Orientada a Objetos
Estrutura condicional simples
» Estrutura condicional simples se preocupa apenas com a 
condição verdade. Caso a condição seja verdadeira, executar 
o que está dentro do bloco. Caso a condição seja falsa, não 
executar o que está dentro do bloco. O programa segue a 
execução após o bloco do condicional (após o delimitador do if, 
a chave fechada).
if (condição){
 //caso a condição seja verdadeira, este bloco (o bloco
 //está delimitado entre a chave aberta e a chave 
 //fechada) é executado
}
Exemplo:
 private int velocidadeAtual = 60;
 private boolean estaCorrendo = false;
//codigos…
 private void acelerar(){
 if (velocidadeAtual <=60){
 velocidadeAtual++;
 estaCorrendo = true;
 }
 }
 private void frear(){
 if (estaCorrendo){ 
 velocidadeAtual--;
 }
 }
//codigos…
Estrutura condicional composta
Este tipo de estrutura lida com os dois possíveis cenários de 
condição. Caso a condição seja verdadeira, executar o que está 
42
Modelagem Orientada a Objetos
dentro do bloco. Caso a condição seja falsa, executar o bloco else 
do IF. Perceba que sempre, para o caso de uma estrutura condicional 
composta, um dos blocos e somente um, obrigatoriamente será 
executado. Ou a condição é verdade ou falsa.
if(condicao){
//se for verdade, execute este bloco 
}else{
//se for falso, execute este bloco 
}
Exemplo:
 private int velocidadeAtual = 60;
 private boolean estaCorrendo = false;
//codigos…
 private void acelerar(){
 if (velocidadeAtual <=60){
 velocidadeAtual++;
 estaCorrendo = true;
 } else {
 //carro não acelera pois percebe que
 //já está correndo. Limite de 60km/h.
 estaCorrendo = true;
 }
 }
 private void frear(){
 if (estaCorrendo){ 
 velocidadeAtual--;
 }
 }
//codigos…
Podemos também, como já vimos em períodos anteriores, agrupar 
vários condicionais. O tipo de estrutura resultante é chamado de 
43
Modelagem Orientada a Objetos
Estrutura condicional composta aninhada. Estrutura condicional 
composta aninhada agrupa diversos condicionais. Apenas um dos 
blocos é executado.
if (condicao){
} else if (condicao){
} else if (condicao){
} else{
}
Exemplo:
if (idade > 0 && idade<=5){
//nadador pre-mirim
}else if (idade >5 && idade <=10){
//nadador mirim
}else if (idade>10 && idade <=17){
//nadador juvenil
}else if (idade>=18){
//nadador adulto
}else if (idade <0){
//idade invalida
}
Note que neste último exemplo, um novo operador surgiu. O && é 
o operador lógico E do Java. O || é o operador lógico OU. Percebam 
que estes operadores fornecem respostas do tipo lógicas (verdadeiras 
ou falsas), em acordo com as estruturas condicionais.
Conforme já dito no início desta seção, as estruturas condicionais 
podem ter em suas cláusulas tipos de dados booleanos (o próprio 
atributo, que possui valor unicamente verdadeiro ou falso). Vamos a 
mais um exemplo:
 public static void main(String[] args) {
 //atributo que vai checar se um usuario é maior de
 //idade ou nao
 boolean maiorIdade = false;
44
Modelagem Orientada a Objetos
 //atributo que guarda valor da idade
 int idade = 18;
 if (idade >=18){
 maiorIdade = true;
 }
 if (maiorIdade){
 System.out.println(“O usuário é maior de 
idade”);
 }
 }
Neste exemplo, temos uma variável do tipo boolean que é avaliada 
diretamente dentro de uma cláusula de IF. Se maiorIdade possuir um 
valor true, o bloco do condicional será executado. Caso o valor seja 
false, por se tratar de uma estrutura condicional simples (sem else), 
nada será feito.
As estruturas condicionais são também utilizadas pelas estruturas 
de repetição condicionais, que executam determinado trecho de 
código com base no resultado da condicional. Vamos agora entender 
um pouco mais sobre o funcionamento destas estruturas em Java.
Estruturas de Repetição
Como também já vimos na disciplina de introdução a algoritmos, 
as estruturas de repetição podem ser de dois tipos: condicional ou 
contada. A seguir, vamos conhecer cada uma delas em Java.
A estrutura de repetição condicional WHILE repete o código que 
está dentro do bloco da estrutura de repetição enquanto a condição 
for verdadeira. A checagem da condição é feita no início da estrutura, 
ou seja, sempre antes da execução do bloco de código. Desta forma, 
o bloco de código da estrutura pode ser executado ou não. Para 
relembrar, apresentamos abaixo a estrutura while.
while (condicao){
//executar enquanto a condicao for verdadeira
}
Exemplo:
45
Modelagem Orientada a Objetos
int contador = 0;
while(contador < 50){
 System.out.println(“Contador == “ + contador);
 contador = contador + 1;
}
No entanto, às vezes é útil termos uma estrutura condicional 
que teste a condição só ao final – isto é, execute primeiro o bloco 
de código e depois cheque a condição. Nestes casos, podemos 
utilizar a estrutura de repetição condicional DO-WHILE, que repete o 
código que está dentro do bloco da estrutura de repetição enquanto 
a condição for verdadeira. A checagem da condição é feita no fim da 
estrutura, desta forma, o bloco de código da estrutura é executado 
pelo menos uma vez. Abaixo apresentamos a estrutura e um exemplo 
de sua utilização.
do{
//executar enquanto a condição for verdadeira
}while (condição);
Exemplo:
int contador = 0;
do{
System.out.println(“Contador == “ + contador);
//operador unário, equivalente a contador = contador + 1;
contador++;
}while(contador <50);
No caso das estruturas while e do-while, não podemos ter certeza 
de quantas vezes o bloco de código da estrutura será executado 
(porque dependem de uma condição). Quando precisamos que o 
bloco seja executado um número determinado/conhecido de vezes, a 
melhor opção é utilizar uma estrutura contada, como a estrutura FOR. 
Esta estrutura repete de maneira contada o código que está dentro do 
bloco da estrutura de repetição. Esta é a única estrutura de repetição 
que conseguimos saber com precisão quantas vezes será repetida. 
Nas estruturas condicionais não temos como prever o número de 
loops porque estes dependem de uma condição que varia durante a 
execução do código.
46
Modelagem Orientada a Objetos
for (inicializacao; condicao; incremento) {
//codigo;
}
Exemplo:
for (int i = 0; i < 50; i++) {
System.out.println(i);
}
Note que a variável da estrutura de repetição pode ser declarada 
dentro da própria estrutura. Esta é uma variável local que só existe 
durante a execução da estrutura (mas a estrutura poderia se utilizar 
de uma outra variável, local ou global, já declarada anteriormente). 
Como já aprendemos nas disciplinas de introdução aos algoritmos 
e introdução a C, utilizamos bastante as estruturas de repetição 
contada para a manipulação de estruturas de dados. Daremos 
continuidade a nossos estudos aprendendo um pouco mais sobre 
estas estruturas em Java.
Estruturas de Dados - Arrays
Os arrays são estruturas de dados que consistem em itens de 
dados relacionados do mesmo tipo. Arrays são estruturas “estáticas” 
no sentido de que, uma vez criados, eles mantêm o mesmotamanho, 
embora uma referência de array possa ser reatribuída a um novo 
array de tamanho diferente [DEITEL, 2005].
Os arrays guardam em memória posições consecutivas de dados 
de um mesmo tipo, conforme apresentado na Figura 2 e Figura 3.
47
Modelagem Orientada a Objetos
funcionário [0] Eduardo
funcionário [1] Patrícia
funcionário [2] Isabella
funcionário [3] Rafael
funcionário [4] Renata
funcionário [5] Antonio
funcionário [6] Auricea
funcionário [7] Bruno
funcionário [8] Ana
Figura 2. Array de funcionários do tipo String
numeros [0] 10
numeros [1] 51
numeros [2] 7
numeros [3] -9
numeros [4] 100
numeros [5] 5018
numeros [6] 16
numeros [7] 0
numeros [8] 4
Figura 3. Array de números do tipo int
Os arrays demonstrados na Figura 2 e Figura 3 podem ser 
declarados em Java da seguinte maneira:
 String funcionarios[] = new String[9];
 int numeros[] = new int[9];
Perceba que o atributo funcionarios é declarado com os colchetes 
[ ] e depois é declarado o tamanho do array que deve ser alocado. 
Esta declaração poderia ser feita também da seguinte maneira:
String funcionarios[];
 funcionarios = new String[9];
48
Modelagem Orientada a Objetos
 int numeros[];
 numeros = new int[9];
Ainda tomando os arrays funcionarios e numeros como exemplo, 
poderíamos, através das manipulação dos índices (vale ressaltar que 
neste caso estamos tratando ainda de arrays unidimensionais, pois 
temos apenas um índice), realizar operações aritméticas, atribuições, 
etc. Vamos ver alguns exemplos com o vetor de inteiros, identificado 
como ‘numeros’:
public class Exercicio01 {
 public static void main(String[] args) {
 //declaração do array unidimensional de nome
 // numeros, do tipo inteiro
 int numeros[] = new int[9];
 //estrutura de repetição que varrerá todo o array, 
 // populando-o. note aqui o uso do .length. esta 
 // função retorna o tamanho do array. neste caso o 
 // tamanho é 10, pois o array vai do indice 0 ao 
 // indice 9.
 for (int i = 0; i < numeros.length; i++) {
 //numeros[na posicao i] = receberá o valor de i 
 numeros[i] = i;
 }
 //numeros[na posicao 7 ou no indice 7] = receberá o 
 // valor inteiro 77
 numeros[7] = 77;
 //numeros[na posicao 3, que é o resultado da 
 // operação] = receberá o valor inteiro 33
 numeros[1+2] = 33;
 //numeros[na posicao 4, que é o resultado da 
 // operação] = receberá o valor inteiro 44
 numeros[2*2] = 44;
49
Modelagem Orientada a Objetos
 //estrutura de repetição que varrerá todo o array, 
 // para imprimi-lo
 for (int i = 0; i < numeros.length; i++) {
 //imprime os valores contidos no array, nas posicoes 
 // de 0 ate 9
 System.out.println(numeros[i]);
 }
 }
}
Os arrays podem ser passados como parâmetros para métodos, 
e podem ser utilizados também como tipos de retorno, conforme 
exemplo abaixo:
public class Exercicio01 {
 //metodo criado para imprimir arrays do tipo inteiro
 private void imprimeArray(int num[]){
 //estrutura de repetição que varrerá todo o array, 
 // para imprimi-lo
 for (int i = 0; i < num.length; i++) {
 //imprime os valores contidos no array, nas posicoes 
 // de 0 ate 9
 System.out.println(num[i]);
 }
 }
 public static void main(String[] args) {
 //instância da classe exercicio01
 Exercicio01 exerc = new Exercicio01();
 //declaração do array unidimensional de nome 
 // numeros, do tipo inteiro
 int numeros[] = new int[9];
 //estrutura de repetição que varrerá todo o array, 
50
Modelagem Orientada a Objetos
 // populando-o. note aqui o uso do .length. esta 
 // função retorna o tamanho do array. neste caso o 
 // tamanho é 10, pois o array vai do indice 0 ao 
 // indice 9.
 for (int i = 0; i < numeros.length; i++) {
 //numeros[na posicao i] = receberá o valor de i
 numeros[i] = i;
 }
 //numeros[na posicao 7 ou no indice 7] = receberá o 
 // valor inteiro 77
 numeros[7] = 77;
 //numeros[na posicao 3, que é o resultado da 
 // operação] = receberá o valor inteiro 33
 numeros[1+2] = 33;
 //numeros[na posicao 4, que é o resultado da 
 // operação] = receberá o valor inteiro 44
 numeros[2*2] = 44;
 //chamada ao método passando o array como parametro
 exerc.imprimeArray(numeros);
 }
}
Até o momento vimos arrays unidimensionais. Como sabemos, 
os arrays são estruturas de dados homogêneos, contudo, não 
obrigatoriamente devem ser unidimensionais. Podemos ter arrays 
multidimensionais. Vamos aprender um pouco mais sobre eles.
O tipo mais conhecido de array multidimensional são as matrizes 
(que, como você se lembra, são estruturas com linhas e colunas). 
Estes arrays (matrizes) são bidimensionais, pois trabalharemos 
com dois índices. Um índice representará as linhas e outro índice 
representará as colunas do array criado. A Figura 4 nos mostra um 
exemplo de matriz e como cada elemento desta seria identificado em 
um array de nome ‘numero’, bidimensional.
51
Modelagem Orientada a Objetos
coluna [0] coluna [1] coluna [2]
linha [0] numero [0] [0] numero [0] [1] numero [0] [2]
linha [1] numero [1] [0] numero [1] [1] numero [1] [2]
Figura 4. Array multidimensional
Os arrays bidimensionais têm sempre o primeiro índice se 
referindo a linha e o segundo índice se referindo a coluna da matriz. 
Esta ordem nunca é invertida. Você deve estar se perguntando, mas 
como eu declaro um array multidimensional? Vamos aos exemplos.
Vamos declarar um array de nome números:
int numeros[][] = new int[2][3];
Note que o array possui dois índices e que, para cada um, um 
tamanho é fornecido para que este seja alocado em memória. Neste 
exemplo de trecho de código, criamos um array com duas linhas e 
três colunas (como a matriz apresentada na Figura 4).
Poderíamos criar arrays com ainda mais índices, se assim fosse 
necessário:
int numero[][][] = new int [2][3][5];
Neste trecho de código, criamos 2 matrizes de 3 linhas e 5 
colunas. Temos uma estrutura tridimensional. Teríamos agora que 
nos preocupar com a manipulação sempre dos três índices. Neste 
fascículo focaremos nos arrays unidimensionais e nos bidimensionais, 
por serem os mais utilizados comumente.
Já vimos como declarar e como utilizar os arrays unidimensionais, 
mas e os bidimensionais? Como o nome já nos indica, teremos que 
nos preocupar sempre com dois índices, um que representa a linha e 
outro que representa a coluna. No array bidimensional, os dois índices 
representam um único elemento.
Vamos acompanhar agora um exemplo em código para facilitar o 
entendimento:
public class Exercicio02 {
 public static void main(String[] args) {
 //declaracao do array bidimensional
 int numeros[][] = new int[2][3];
52
Modelagem Orientada a Objetos
 //estrutura de repeticao para varrer as linhas
 for (int i = 0; i < numeros.length; i++) {
 //estrutura de repeticao para varrer as colunas
 for (int j = 0; j < numeros[i].length; j++) {
 numeros[i][j]= i+j;
 }
 }
 //estruturas de repetição contada aninhadas, para
 // imprimir o array bidimensional
 for (int i = 0; i < numeros.length; i++) {
 for (int j = 0; j < numeros[i].length; j++) {
 System.out.println(numeros[i][j]);
 }
 }
 
 }
}
Da mesma forma que o array unidimensional, os arrays 
multidimensionais podem ser utilizados como tipo de retorno ou como 
parâmetro em métodos. 
Agora que já aprendemos muitos fundamentos da linguagem 
Java, que tal praticarmos nossos conhecimentos? Em breve teremos 
um projeto para implementar, como forma de avaliação da disciplina. 
Vamos aproveitar este momento para praticar. É muito importante 
que todos acessem o fórum de discussões e esclareçam as dúvidas. 
Respondas as atividades sugeridas neste capítulo e a lista de 
exercícios que foi disponibilizada. Bons estudos!
Conheça Mais
Aprofunde seus conhecimentos sobre a linguagem Java. 
Consulte os livros de [DEITEL, 2005], [DEITEL, 2006] e a apostila da 
53
Modelagem Orientada a Objetos
[CAELUM]. Ao encontrar boas fontes de leitura, compartilheeste novo 
conhecimento com os demais colegas de sala. Compartilhe também 
os códigos que anda encontrando e desenvolvendo, desta forma 
aprenderemos de maneira mais fácil e ágil. Bons estudos!
http://www.guj.com.br
http://javafree.uol.com.br/forum.jbb
Conheça mais! Aproveite este momento!
Aprenda Praticando
Vamos agora revisar os conceitos vistos durante este volume? 
Neste exercício faremos uma revisão sobre as estruturas condicionais 
e estruturas de repetição da linguagem Java.
Imprima os fatoriais de 1 a 13.
public class Exercicio01 {
 public static void main(String[] args) {
 //atributo que terá o valor do fatorial
 int fatorial = 1;
 //estrutura de repetição contada - calcular 13
 //fatoriais
 for (int i = 1; i <= 13; i++) {
//checa se o fatorial é diferente de 1, porque o fatorial 
//de 1 é 1, não precisa ser calculado.
 if(i!=1){
 //se o fatorial é diferente de 1, executa um 
 //for. o for varia de 1 até o número do 
 //fatorial a ser calculado
 for (int j = 1; j <= i; j++) {
 //calcula o fatorial e atribui o valor 
 //ao atributo ‘fatorial’.
 fatorial = fatorial * j;
54
Modelagem Orientada a Objetos
 }
 }
 //saída do programa
 System.out.println(“O fatorial de “ + i + “ é 
== “ + fatorial);
 //reinicia o valor de fatorial, para ser 
 //calculado novamente
 fatorial = 1;
 }
 }
}
Atividade e Orientações de estudo
Exercícios
Cada aluno deve implementar a solução para os problemas a 
seguir no Eclipse. Após a finalização dos exercícios, todos devem 
postar as soluções encontradas no ambiente. O exercício 3 e 4 devem 
ser postados também no fórum, para discussões.
1. Faça um programa que imprima todos os números de 100 a 
170.
2. Faça um programa que receba valores inteiros de um usuário 
(utilize o JOptionPane - JOptionPane.showInputDialog(“Digite 
um valor”);) até que -1 seja fornecido como entrada. Exiba os 
valores fornecidos pelo usuário.
3. Faça um programa que imprima todos os múltiplos de 5, entre 
500 e 580 (utilizar o operador MOD – em Java representado 
por %).
4. Faça um programa que imprima a série Fibonacci (1 1 2 3 5 8...) 
com 12 elementos. Para a série, você começa com 0 e 1, e 
então produz o próximo número de Fibonacci somando os dois 
anteriores para formar o próximo.
55
Modelagem Orientada a Objetos
5. Considere um array de inteiros 2 por 3 de nome ‘ex’
» crie um novo projeto java para a implementação deste exercício
» escreva uma declaração para o array ex
» quantas linhas tem ex?
» quantas colunas tem ex?
» quantos elementos tem ex?
» escreva os nomes de todos os elementos na segunda linha de 
ex
» escreva os nomes de todos os elementos na terceira coluna de 
ex
» escreva uma única instrução que configura o elemento de t na 
linha 1 e na coluna 2 como 0
» escreva uma estrutura for aninhada que inicializa cada elemento 
de ex como zero
» escreva uma instrução que insere os valores para os elementos 
de ex a partir do teclado (valores fornecidos pelo usuário – 
utilize a classe JOptionPane, como no exercício 2)
» escreva uma série de instruções que determina e imprime o 
menor valor no array ex
Em caso de dúvidas, consulte o fórum de discussões do ambiente. 
Converse com seus colegas, professor e tutor.
Vamos Revisar?
Resumo
Neste capítulo você conheceu um pouco mais sobre a linguagem Java. Vimos as 
estruturas condicionais e de repetição da linguagem. Aprendemos ainda como 
manipular os arrays multidimensionais. A partir de agora você pode elaborar e 
desenvolver programas com ainda mais recursos. Não esqueça de organizar o 
seu sistema com o suporte da linguagem UML e os conceitos da orientação a 
objetos.
56
Modelagem Orientada a Objetos
Considerações Finais
Olá, cursista!
Neste volume, conhecemos o conceito de classes abstratas e 
aprendemos mais sobre a linguagem Java. Vimos quais são os tipos 
de dados primitivos suportados pela linguagem, além das estruturas 
condicionais e de repetição e os arrays.
Nosso foco agora será a elaboração de um projeto Java. Através 
deste projeto, praticaremos os conceitos de orientação a objetos e da 
linguagem UML vistos até o momento. 
Bons estudos e até o projeto final da disciplina.
Até lá e bons estudos!
57
Modelagem Orientada a Objetos
Referências
 [DEITEL, 2006] DEITEL, M. D.; DEITEL, P. J.: C++: Como 
Programar. 5a. Edição. Pearson. 2006.
 [DEITEL, 2005] DEITEL, M. D.; DEITEL, P. J.: Java, Como 
Programar. 6a. Edição. Bookman. 2005.
 [CORNEL, 2005] CORNEL, G., HORSTMANN C. S.: Core Java 
2. Fundamentos. 7a Edição. Alta Books. 2005.
 [ARNOLD, 2007] ARNOLD, KEN; GOSLING, JAMES: A 
Linguagem de Programação Java. 4a. Edição.Bookman.2007.
58
Modelagem Orientada a Objetos
Conhecendo os Autores
Eduardo Araujo Oliveira
http://lattes.cnpq.br/3887722014128939
Possui graduação em Ciencia da Computação pela Universidade 
Católica de Pernambuco (2005), mestrado em Ciência da Computação 
pela Universidade Federal de Pernambuco (2006-2008) e atualmente 
é doutorando pela UFPE. Trabalha como engenheiro de sistemas do 
Centro de Estudos e Sistemas Avançados do Recife (C.E.S.A.R) em 
projetos da Motorola desde 2004, tendo experiência com aplicações 
Java SE e Java ME. Possui certificação Java [SCJP]. Atua como 
Professor Conteudista no curso de Bacharelado em Sistemas de 
Informação da UAB/UFRPE e é professor titular da Faculdade 
Maurício de Nassau. Tem experiência nas áreas de Inteligência 
Artificial e Educação a Distância, tendo trabalhado e pesquisado com 
ambientes virtuais de ensino e aprendizado, agentes inteligentes e 
linguagens de programação.
Patrícia Tedesco
http://lattes.cnpq.br/7465148175791735
Possui graduação em Ciência da Computação pela Universidade 
Federal de Pernambuco (1994), mestrado em Ciência da Computação 
pela Universidade Federal de Pernambuco, na área de Inteligência 
Artificial Aplicada à Educação (1997) e doutorado em Ciência da 
Computação - University Of Leeds Computer Based Learning Unit 
(2001). Atualmente é professora adjunta do Centro de Informática 
- UFPE. Tem experiência na área de Ciência da Computação, 
com ênfase em Inteligência Artificial, atuando principalmente nos 
seguintes temas: Sistemas Multiagentes e Atores Sintéticos, Trabalho 
Colaborativo Apoiado por Computador, Contexto Computacional e 
Educação a Distância.

Outros materiais