Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Orientação a objetos 
em Java – JOO 
 2016 v1 
 
 
 
 
 
 
 
 
LogusTI – Treinamento em Informática 
 
Tel (61) 3244 - 5000 
WhatsApp (61) 9 8548-0058 
SCS QD 02 BL C n 252 
BRASÍLIA – DF 
www.logusti.com.br 
logusti@logusti.com.br 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 2 
LogusTI 
 
A LogusTI nasceu da necessidade de oferecer novos treinamentos na área de Tecnologia da 
Informação em Brasília, visto que este segmento é escasso na Capital Federal. 
A excelência dos serviços prestados pela LogusTI está apoiada em profissionais especializados, 
processos estabelecidos e uma larga experiência em seus profissionais. O capital humano é um 
elemento chave na estratégia de atuação da empresa, que investe continuamente na atualização e 
capacitação de seus profissionais, propiciando um ambiente encorajador para serem os melhores 
naquilo que fazem. 
A alta qualidade dos serviços prestados aliada ao compromisso em gerar resultados e 
proporcionar maior vantagem competitiva a seus clientes tem propiciado a LogusTI relacionamentos 
duradouros e bem sucedidos com empresas de diversos segmentos de mercado. 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 3 
Sobre o autor Gleidson Porto 
 
 Bacharel em Ciência da Computação, Pós-graduação em Sistemas Orientados a Objetos, MBA 
em Gestão Estratégica de TI pela FGV e Mestre em Gestão Estratégica das Organizações. 
 Tem experiência na área de Ciência da Computação, com ênfase Fábrica de Software, 
Engenharia de Software e Governança Estratégica de TI; 
 Atuou como Gerente de Projetos Estratégicos de TI na CAPGEMINI/CPMBRAXIS, a maior 
empresa de TI europeia e sétima maior do mundo, nas operações do Ministério de Ciência e 
Tecnologia, Caixa Econômica Federal, Brasiltelecom, Oi e Embratur. 
 Atuou como Coordenador de TI pela Stefanini IT Solutions, maior empresa de TI brasileira, em 
operações de missão crítica de TI na BrasilTelecom. 
 Atuou também professor de Informática da EIBNET – Escola de Informática de Brasília com 
mais de 15.000 horas de treinamentos em JAVA, SCRUM, COBIT, APF, RUP e ITIL. 
 Foi professor de ensino superior de TI no Instituto Fátima em Brasília – DF durante 6 anos. 
 Hoje atua como coordenador da divisão de Desenvolvimento de Software da autarquia pública 
CFM - Conselho Federal de Medicina e professor de ensino superior da Faculdade JK. 
 Atua também como instrutor da LogusTI. 
 Possui as certificações internacionais IBM Certified Solution Designer - Sun Certified Java 
Programmer, IBM Rational Unified Process V7.0, COBIT, ITIL Foundation Certified e 
ScrumMaster Certified pela ScrumAlliance. 
 
 
 
 
 
 
https://www.linkedin.com/in/gleidson-porto-06817637/ 
gleidsonporto@gmail.com 
 http://lattes.cnpq.br/6540446452817806 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 4 
Sumário 
1 INTRODUÇÃO .............................................................................................................................................. 8 
1.3 História da Linguagem Java ......................................................................................................................... 9 
2 A LINGUAGEM JAVA ................................................................................................................................. 10 
2.1 Java ......................................................................................................................................................... 10 
2.2 Máquina Virtual ......................................................................................................................................... 10 
2.3 Garbage Collection ................................................................................................................................... 11 
2.4 Instalando o Java ...................................................................................................................................... 12 
2.4.1 Instalando o JDK .................................................................................................................................... 12 
2.4.2 Configurando o Java no Windows ........................................................................................................... 13 
2.4.3 Confirmando a instalação e configuração do Java .................................................................................... 15 
2.5 Compilando e executando o primeiro programa .......................................................................................... 15 
3 AMBIENTE INTEGRADO DE DESENVOLVIMENTO - ECLIPSE ................................................................... 17 
3.1 O Eclipse .................................................................................................................................................. 17 
3.2 Característica e Ferramentas ..................................................................................................................... 17 
3.3 Instalando o Eclipse .................................................................................................................................. 18 
3.4 Conhecendo o Eclipse ............................................................................................................................... 18 
4 SINTAXE DA LINGUAGEM JAVA................................................................................................................ 20 
4.1 Delimitadores em Java .............................................................................................................................. 20 
4.2 Identificadores e palavras reservadas......................................................................................................... 21 
4.3 Declarando variáveis em Java ................................................................................................................... 23 
4.5 - Convenções de codificação ..................................................................................................................... 26 
4.6 Exercícios........................................................................................................................................ 27 
5 EXPRESSÕES ............................................................................................................................................ 28 
5.1 Operadores lógicos e aritméticos ............................................................................................................... 28 
5.2 Concatenação de Strings com o operador + ............................................................................................... 29 
Alguns métodos úteis em dados do tipo String:................................................................................................. 29 
5.3 Promoção e Casting .................................................................................................................................. 30 
5.4 Operadores de deslocamento (>>, <<, >>>)................................................................................................ 31 
5.5 Circuitos lógicos ........................................................................................................................................ 31 
5.6 Exercícios........................................................................................................................................ 32 
6 FLUXO DE CONTROLE .............................................................................................................................. 33 
6.1 Ramificação if,else ................................................................................................................................... 33 
6.2 Ramificação switch ................................................................................................................................... 34 
6.3 Repetição for ............................................................................................................................................ 35 
6.4 Repetição while ........................................................................................................................................ 36 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 5 
6.5 Comandos especiais de controle de fluxo: break, continue e label ................................................................ 37 
6.6 Lendo valores do teclado ........................................................................................................................... 38 
6.7 Exercícios................................................................................................................................................. 38 
7 AGRUPAMENTO DE DADOS (ARRAYS)..................................................................................................... 39 
7.1 Declarando e criando Arrays ...................................................................................................................... 39 
7.2 Modificando o conteúdo de um array .......................................................................................................... 41 
7.3 Acessando o conteúdo de um array ........................................................................................................... 41 
7.4 Percorrendo um Array ............................................................................................................................... 42 
7.5.1 Ordenando um Array .............................................................................................................................. 43 
7.5.2 Duplicando um Array .............................................................................................................................. 43 
7.5.3 Preenchendo um Array ........................................................................................................................... 43 
7.6 Arrays multidimensionais ........................................................................................................................... 44 
7.7 Array esparso ........................................................................................................................................... 44 
7.8 Exercícios........................................................................................................................................ 45 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA ................................................................................................... 46 
8.1 Fundamentos da Programação Orientada a Objetos ................................................................................... 46 
8.2. Paradigma Orientado por Objetos ............................................................................................................. 46 
8.3 Principais conceitos de POO...................................................................................................................... 46 
8.3.1 Objetos .................................................................................................................................................. 46 
8.3.2 Atributos e métodos................................................................................................................................ 48 
8.3.3 Classes ................................................................................................................................................. 49 
8.3.3 Instanciação........................................................................................................................................... 50 
8.4 - Exercício - Conceitos OO ........................................................................................................................ 51 
8.5 – Classes e Objetos em Java ..................................................................................................................... 52 
8.5.1 Criando objetos em Java ........................................................................................................................ 52 
8.5.2 Referências ........................................................................................................................................... 53 
8.5.3 Manipulando Atributos ............................................................................................................................ 54 
8.5.4 Valores Padrão ...................................................................................................................................... 54 
8.6 Exercícios Complementares ...................................................................................................................... 56 
9 OO - HERANÇA, POLIMORFISMO E INTERFACES .................................................................................... 57 
9.1 Objetos e Construtor ................................................................................................................................. 57 
9.2 Herança ................................................................................................................................................... 57 
9.3 Polimorfismo ............................................................................................................................................. 59 
9.3.1 Polimorfismo - Sobreescrita .................................................................................................................... 60 
9.3.2 Polimorfismo – Sobrecarga ..................................................................................................................... 61 
9.4 Exercício - Polimorfismo ............................................................................................................................ 62 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 6 
9.5 Interfaces ................................................................................................................................................. 63 
10 OO - CLASSES ABSTRATAS.................................................................................................................... 65 
11 MODIFICADORES JAVA ........................................................................................................................... 66 
11.1 Introdução .............................................................................................................................................. 66 
11.2 Modificadores de Acesso ......................................................................................................................... 66 
11.2.1 Private ................................................................................................................................................. 67 
11.2.2 Protected ............................................................................................................................................. 68 
11.2.3 Public .................................................................................................................................................. 69 
11.2.4 Default (padrão) ................................................................................................................................... 69 
11.3 Outros Modificadores ..............................................................................................................................69 
11.3.1 Final .................................................................................................................................................... 69 
11.3.2Abstract ................................................................................................................................................ 70 
11.3.3 Static ................................................................................................................................................... 70 
11.3.4 Transient ............................................................................................................................................. 71 
11.3.5 Synchronized ....................................................................................................................................... 71 
11.3.6 Volatile ................................................................................................................................................ 71 
11.3.7 Native .................................................................................................................................................. 71 
11.4 Encapsulamento ..................................................................................................................................... 71 
11.4.1 Métodos Getters e Setters .................................................................................................................... 72 
11.5 Exercício ................................................................................................................................................ 73 
12 EXCEÇÕES – CONTROLANDO OS ERROS .............................................................................................. 75 
12.1 Tratamento de exceções ......................................................................................................................... 75 
12.2 Erros e Exceções de runtime ................................................................................................................... 77 
12.3 Propagando exceções ............................................................................................................................. 77 
12.4 Definindo e gerando exceçoes ................................................................................................................. 78 
12.5 Hierarquia de exceções Java ................................................................................................................... 79 
13 THREADS .......................................................................................................................................... 81 
13.1 Conceito de Threads ............................................................................................................................... 81 
13.2 Ciclo de Vida de uma Thread ................................................................................................................... 82 
13.2.1 Criando Threads................................................................................................................................... 82 
13.2.2 Iniciando Threads ................................................................................................................................. 83 
13.2.3 Fazendo Thread Esperar ...................................................................................................................... 83 
13.2.4 Finalizando Threads ............................................................................................................................. 83 
13.2.5 Verificando se Threads estão Executando/Pronta/Esperando ou Novas/Mortas........................................ 83 
13.3 Implementando Threads em java ............................................................................................................. 83 
13.4 Escalonamento de Threads ..................................................................................................................... 85 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 7 
13.5 Exercícios ............................................................................................................................................... 88 
14 API JAVA - JAVA.IO ................................................................................................................................ 89 
14.1 Classe InputStream ................................................................................................................................. 89 
14.2 Lendo um arquivo ................................................................................................................................... 90 
14.3 OutputStream ......................................................................................................................................... 92 
14.4 Reader ................................................................................................................................................... 92 
14.5 Writer ..................................................................................................................................................... 92 
14.6 Buffers.................................................................................................................................................... 93 
14.7 Exercícios ............................................................................................................................................... 94 
15 COLLECTIONS FRAMEWORK .................................................................................................................. 95 
15.1 – Introdução............................................................................................................................................ 95 
15.2 – Tipos de Coleções ................................................................................................................................ 95 
15.2.1 – Lista.................................................................................................................................................. 98 
15.2.2 – Conjunto ........................................................................................................................................... 99 
15.2.3 – Mapas............................................................................................................................................... 99 
15.3 – Exercício ............................................................................................................................................ 101 
RESPOSTAS DO EXERCÍCIOS.................................................................................................................... 102 
REFERÊNCIAS ............................................................................................................................................ 137 
 
 
 
 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 8 
1 INTRODUÇÃO 
 
1.1 Sobre a LogusTI 
A LogusTI nasceu da necessidade de oferecer novos treinamentos na área de Tecnologia 
da Informação em Brasília, visto que este segmento é escasso na Capital Federal. 
A excelência dos serviços prestados pela LogusTI está apoiada em profissionais 
especializados, processos estabelecidos e uma larga experiência em seus profissionais. O 
capital humano é um elemento chave na estratégia de atuação da empresa, que investe 
continuamente na atualização e capacitação de seus profissionais, propiciando um ambiente 
encorajador para serem os melhores naquilo que fazem. 
A alta qualidade dos serviços prestados aliada ao compromisso em gerar resultados e 
proporcionarmaior vantagem competitiva a seus clientes tem propiciado a LogusTI 
relacionamentos duradouros e bem sucedidos com empresas de diversos segmentos de 
mercado. 
O principal objetivo da LogusTI é promover treinamentos de máxima qualidade que 
relacionados às principais tecnologias utilizadas pelas empresas. Por meio desses 
treinamentos, seus alunos se tornam capacitados para atuar no mercado de trabalho. 
 
1.2 Objetivo 
O objetivo fundamental dos treinamentos da LogusTI é transmitir os conhecimentos necessários 
para que os seus alunos possam atuar no mercado de trabalho na área de Tecnologia da Informação. 
A plataforma Java é a mais utilizada no desenvolvimento de software no mundo. Para utilizar os 
recursos oferecidos por essa plataforma de forma eficiente, é necessário possuir conhecimento sólido 
em orientação a objetos. 
Assim sendo, esta apostila da LogusTI tem como intuito ensinar Java de uma maneira simples e 
objetiva. 
Esperamos que você aproveite esse material, e que ele possa contribuir positivamente para 
construção do conhecimento acerca da programação Java. 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 9 
1.3 História da Linguagem Java 
 
 
Java é uma linguagem de programação interpretada orientada a objetos 
desenvolvida na década de 90 por uma equipe de programadores chefiada 
por James Gosling, na empresa Sun Microsystems, adquirida pela Oracle. 
Diferente das linguagens de programação convencionais, que são 
compiladas para código nativo, a linguagem Java é compilada para um 
bytecode que é executado por uma máquina virtual. A linguagem de 
programação Java é a linguagem convencional da Plataforma Java, mas 
não é a sua única linguagem. 
Em 1991, na Sun Microsystems, foi iniciado o Green Project, o berço do Java, uma linguagem de 
programação orientada a objetos. Os mentores do projeto eram Patrick Naughton, Mike Sheridan, e James 
Gosling. Eles acreditavam que, eventualmente, haveria uma convergência dos computadores com os 
equipamentos e eletrodomésticos frequentemente usados pelas pessoas no seu dia-a-dia. 
Para provar a viabilidade desta ideia, 13 pessoas trabalharam arduamente durante 18 meses. No verão de 
1992 eles emergiram de um escritório de Sand Hill Road, no Menlo Park, com uma demonstração funcional da 
ideia inicial. O protótipo se chamava *7 (lê-se “Star Seven”), um controle remoto com uma interface gráfica 
touchscreen. Para o *7, foi criado um mascote, hoje amplamente conhecido no mundo Java, o Duke. O trabalho 
do Duke no *7 era ser um guia virtual ajudando e ensinando o usuário a utilizar o equipamento. O *7 tinha a 
habilidade de controlar diversos dispositivos e aplicações. James Gosling especificou uma nova linguagem de 
programação para o *7. Gosling decidiu batizá-la de “Oak”, que quer dizer carvalho, uma árvore que ele podia 
observar quando olhava através da sua janela. 
O nome da linguagem desenvolvida pelo projeto Green foi mudada de Oak para Java, que foi uma 
homenagem à uma ilha da Indonésia de onde os Norte-Americanos importavam o café que era consumido pela 
equipe de James Gosling. Ate 1994, não havia uma aplicação definida para o Java. Foi quando Jonathan Payne e 
Patrick Naughton criaram um novo navegador para Web que podia executar programas escritos em Java 
(applets), batizado de Web Runner. E em 1996, em uma iniciativa inédita, a Sun Microsystems resolveu 
disponibilizar gratuitamente um kit de desenvolvimento de software para a comunidade, que ficou conhecido como 
Java Developer`s Kit (JDK). Desde então a aceitação da tecnologia Java cresceu rapidamente entre empresas e 
desenvolvedores. A Sun Microsystems lançou o JDK 1.1 com melhorias significativas para o desenvolvimento de 
aplicações gráficas e distribuídas. Depois disso, a empresa continuou lançando novas versões gratuitas com 
novas melhorias e recursos. 
Em abril de 2009, a Oracle ofereceu US$ 7,4 bilhões pela aquisição da Sun Microsystems e a proposta foi 
aceita. Essa aquisição deu à Oracle a propriedade de vários produtos, incluindo o Java e o sistema operacional 
Solaris. Em comunicado, a Oracle afirmou que o Java foi o software mais importante adquirido ao longo de sua 
história. Muitas especulações foram feitas acerca do futuro do Java depois de passar a ser propriedade da Oracle. 
Mais com certeza essa aquisição contribuiu muito para que o Java tivesse um salto qualitativo. 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 10 
2 A LINGUAGEM JAVA 
2.1 Java 
Java é uma linguagem de programação orientada a objetos desenvolvida pela antiga Sun Microsystems, 
agora Oracle. Modelada depois de C++, a linguagem Java foi projetada para ser pequena, simples e portável a 
todas as plataformas e sistemas operacionais, tanto o código fonte como os binários. Esta portabilidade é obtida 
pelo fato da linguagem ser interpretada, ou seja, o compilador gera um código independente de máquina chamado 
byte-code. No momento da execução este byte-code é interpretado por uma máquina virtual instalado na máquina. 
Para portar Java para uma arquitetura hadware/s específica, basta instalar a máquina virtual 
(interpretador). Além de ser integrada à Internet, Java também é uma excelente linguagem para desenvolvimento 
de aplicações em geral. Dá suporte ao desenvolvimento de software em larga escala. 
2.2 Máquina Virtual 
De acordo com a especificação da SUN, a máquina virtual do Java pode ser vista como: 
 
 
 
 
Para um programa Java ser executado, ele precisa passar pelo processo ilustrado na figura abaixo: 
 
 
 
 
 
 
 
 
 
 
Figura 1- JVM 
 
O código é compilado, gerando um conjunto de instruções chamado de byte-code. Esse byte-code é 
aplicado à Máquina Virtual Java (JVM) que se encarrega de interpretar os comandos para o sistema 
operacional onde o programa está rodando. Ou seja, a máquina virtual traduz as instruções do código Java para 
instruções válidas no sistema operacional em que está rodando. Se essa portabilidade fosse requerida em C, o 
código deveria ser compilado várias vezes – uma para cada sistema operacional desejado. No caso do Java, o 
código é compilado apenas uma vez, gerando o byte-code. Esse byte-code poderá então ser interpretado por 
qualquer máquina virtual Java, rodando em Linux, Windows, Palm OS, Solaris ou qualquer outro sistema 
operacional que possua uma máquina virtual Java implementada. (Compile once, run anywhere). 
Uma máquina imaginária que é implementada via software ou hardware. Um código a ser 
executado por essa máquina deve ser gravado em um arquivo com extensão .class. e 
possuir um código compatível com as instruções Java. 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 11 
 
Uma JVM possui definições concretas para a implementação dos seguintes itens: 
 Conjunto de instruções (equivalentes às instruções da CPU) 
 Conjunto de registradores 
 Formato padrão de classes 
 Pilha de memória 
 Pilha de objetos coletados pelo garbage-collector 
 Área de memória 
 
IMPORTANTE: a JVM não permite que um programa Java acesse recursos de hardware diretamente, protegendo 
o computador de operações perigosas, como acesso à regiões protegidas da memória ou formatação física do 
disco rígido. 
 
Um programa Java só é executado caso o seu byte-code passe pela verificação de segurança da JVM, que 
consiste em dizer que: 
 O programa foi escrito utilizando-se a sintaxe e semântica da linguagem Java 
 Não existem violações de áreas restritas de memória no código 
 O código não gera Stack Overflow 
 Os tipos de parâmetrosdos métodos são corretos 
 Não existe nenhuma conversão ilegal entre dados do programa, como a tentativa de conversão de inteiros 
em ponteiros 
 O acesso a objetos está corretamente declarado 
Caso alguma das condições acima não seja satisfeita, a máquina virtual Java causará um erro de execução 
(runtime error). 
 
 
 
 
 
2.3 Garbage Collection 
Durante a execução de um programa de computador, ocorre a alocação e liberação dinâmica de memória 
RAM. Dados são escritos e lidos da memória do computador satisfazendo os requisitos de cada programa. Em 
linguagens tradicionais como Pascal, Basic e C/C++, o programador é responsável por controlar essa alocação, 
impedindo o estouro de memória (stack overflow) e outros problemas, como o acesso indevido a áreas reservadas 
de memória. Para facilitar a vida dos programadores, e evitar os erros comuns associados à alocação de 
memória, a linguagem Java introduziu um novo conceito: o garbage-collection. 
Garbage-collection é um mecanismo de controle automático de alocação e liberação de memória. 
Quando uma variável é declarada em um código de computador, a JVM cria um ponteiro para uma área 
de memória equivalente ao tamanho do tipo de dado utilizado por essa variável. Quando essa variável é 
associada a outra região de memória, a JVM coloca o espaço alocado anteriormente em uma pilha de objetos em 
Mais sobre 
Geralmente, as máquinas virtuais utilizam uma estratégia de compilação chamada Just-in-time 
compilation (JIT). Nessa abordagem, o código de máquina pode ser gerado diversas vezes durante o 
processamento de um programa com o intuito de melhorar a utilização dos recursos disponíveis em um 
determinado instante da execução. 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 12 
desuso. Caso o computador fique com pouca memória disponível, a JVM remove objetos dessa pilha, permitindo 
que esse espaço de memória seja realocado. 
O processo de garbage-collection ocorre automaticamente durante a execução de um programa Java. O 
programador não precisa se preocupar com aritmética de ponteiros (grande dificuldade em linguagens como C e 
Pascal). 
2.4 Instalando o Java 
Para desenvolver aplicações Java, o programador deve instalar em sua máquina um Java Development 
Kit(JDK). Um JDK contém diversas ferramentas utilizadas na criação de um programa Java. Mostraremos a 
seguir como instalar um JDK no sistema operacional Windows. 
 JDK: Faça o download da versão mais atual aqui: 
 http://www.oracle.com/technetwork/java/javase/downloads/index.html 
 
Observe abaixo que a Oracle disponibiliza a versão do JDK para vários sistemas operacionais. Vamos 
utilizar a versão jdk-8u101-windows-x64.exe para o Windows x64 de 193.68 MB. 
 
 
Figura 2 – Site da Oracle para download do JDK 
 
O procedimento de instalação no Windows é muito simples: basta você executar o arquivo e seguir os 
passos abaixo: 
2.4.1 Instalando o JDK 
 
Execute o instalador do JDK (jdk-8u101-windows-x64.exe) e siga as instruções até concluir (next > next > 
finish ), se desejar, é possível informar o diretório de instalação (que vai ser muito importante para 
realizarmos a configuração do JDK – Figura 3). 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 13 
 
Figura 3 – Tela de Instalação do JDK 
 
Juntamente com o JDK será feita a instalação do JRE (Java Runtime Environment) que é o aplicativo que 
permite executar os programas em JAVA no seu sistema operacional. 
 
2.4.2 Configurando o Java no Windows 
 
Clique com o botão direito em Computador e siga as opções Propriedades > Configurações 
avançadas do sistema > (aba Avançado) Variáveis de Ambiente… 
 
Crie/edite as variáveis do sistema listadas abaixo: 
 
JAVA_HOME 
 Informe o diretório da instalação do JDK (Figura 4). 
 Exemplo C:\Program Files\Java\jdk1.8.0_101 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 14 
 
Figura 4 – Configuração da variável de ambiente “JAVA_HOME”. 
 
PATH 
 Informe %JAVA_HOME%\bin (Figura 5). 
 
Figura 5– Configuração da variável de ambiente “PATH”. 
 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 15 
2.4.3 Confirmando a instalação e configuração do Java 
 
Para confirmar que a instalação e configuração do JAVA foi realizada com sucesso, execute os comandos 
“java -version” e “javac -version” no prompt de comando. O resultado esperado está na Figura 6. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Figura 6 – Validação de instalação e configuração do Java 
 
 
 
 
 
 
2.5 Compilando e executando o primeiro programa 
Vamos criar um simples programa para entendermos como funciona o processo de compilação e 
execução. Utilizaremos a linguagem Java, que é amplamente adotada nas empresas. Observe o código do 
exemplo de um programa escrito em Java que imprime uma mensagem na tela: 
1 public class OlaMundo { 
2 public static void main ( String [] args ) { 
3 System.out.println("Olá Mundo!"); 
4 } 
5 } 
Código Java 2.5: OlaMundo.java 
O código fonte Java deve ser colocado em arquivos com a extensão .java. Agora, não é necessário 
entender todo o código do exemplo. Basta saber que toda aplicação Java precisa ter um método especial 
chamado main para executar. 
O próximo passo é compilar o código fonte, para gerar um executável que possa ser processado pela 
máquina virtual do Java. O compilador padrão da plataforma Java ( javac) pode ser utilizado para compilar esse 
arquivo. O compilador pode ser executado pelo terminal. 
Mais sobre 
No Linux, são as mesmas variáveis, mas o PATH é separado por :. Nos Windows velhos, como o 98, você 
deve alterar isso no autoexec.bat. Nos Windows mais novos, como NT, 2000, e XP, procure onde você pode 
adicionar novas variáveis de ambiente (em Iniciar - Painel de Controle – Sistema – Avançado Variáveis de 
Sistema). No Linux, geralmente a alteração deverá ser feita no arquivo ~/.bashrc se você não tiver privilégios 
de administrador. 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 16 
C:\LOGUSTI\EXEMPLOS> dir 
OlaMundo.java 
C:\LOGUSTI\EXEMPLOS>javac OlaMundo.java 
C:\LOGUSTI\EXEMPLOS> dir 
OlaMundo.class 
OlaMundo.java 
O código gerado pelo compilador Java é armazenado em arquivos com a extensão .class. No exemplo, o 
programa gerado pelo compilador é colocado em um arquivo chamado OlaMundo.class e ele pode ser executado 
através de um terminal. 
C:\LOGUSTI\EXEMPLOS> dir 
OlaMundo.class 
OlaMundo.java 
C:\LOGUSTI\EXEMPLOS> java OlaMundo 
Olá Mundo! 
Importante 
Antes de compilar e executar um programa escrito em Java, é necessário que você tenha instalado e 
configurado em seu computador o JDK (Java Development Kit). 
 
 
2.5 – Exercícios 
 
 
 
 
 
 
Mais sobre 
Quando uma aplicação ou biblioteca Java é composta por diversos arquivos .class, podemos “empacotá-los” em um 
único arquivo com a extensão .jar com o intuito de facilitar a distribuição da aplicação ou da biblioteca. 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 17 
3 AMBIENTE INTEGRADO DE DESENVOLVIMENTO - 
ECLIPSE 
3.1 O Eclipse 
Na prática, alguma ferramenta de desenvolvimento é adotada para aumentar a produtividade. Essas 
ferramentas são chamadas IDE (Integrated Development Environment - Ambiente de Desenvolvimento Integrado).Uma IDE é uma ferramenta que provê facilidades para o desenvolvedor realizar as principais tarefas relacionadas 
ao desenvolvimento de um software. 
No caso específico da plataforma Java, a IDE mais utilizada é o Eclipse. Essa ferramenta é bem 
abrangente e oferece recursos sofisticados para o desenvolvimento de uma aplicação Java. Além disso, ela é 
gratuita. 
É a IDE líder de mercado. Formada por um consórcio liderado pela IBM, possui seu código livre. 
As diversas distribuições do Eclipse podem ser obtidas através do site http://www.eclipse. org/. 
Descompacte o arquivo e pronto; basta rodar o executável. 
3.2 Característica e Ferramentas 
A IDE Eclipse é um programa que reúne ferramentas de apoio ao desenvolvimento de software 
possibilitando uma agilidade maior no processo de construção de um software. 
 
 Editor – edita o código-fonte do programa escrito 
 Compiler – compila o código-fonte transformando em código de máquina. 
 Linker – são os vários pedaços de códigos reunidos transformando em um executável. 
 Debugger – processo de se localizar erros(famosos bugs) . 
 Modelling - criação do modelo de classes, objetos, interfaces, associações e interações 
dos artefatos envolvidos no software. 
 Geração de código - A IDE gera códigos(templates) comumente utilizados 
possibilitando algumas soluções. 
 Deploy - auxilia no processo de criação do instalador do software. (no nosso caso os famosos 
*.jar). 
 Automated tests - realiza testes no software de forma automatizada, 
 Refactoring - consiste na melhoria constante do código-fonte do software para construção 
de código mais otimizado. 
 
IMPORTANTE 
Preciso pagar pela ferramenta Eclipse? 
Não, é uma ferramenta OPEN SOURCE conforme mencionado acima é um software livre. 
 
Porque o Eclipse faz tanto sucesso? 
“Na prática ele cria um modelo de Open Innovation Network, onde empresas concorrentes podem criar redes de 
inovação, cooperando no desenvolvimento de softwares Open Source...” - Cezar Taurion(IBM) 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 18 
 
 
3.3 Instalando o Eclipse 
O Eclipse roda direto de um arquivo executável. Realize o download por meio do link 
http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/neonr e extraia o 
pacote “.zip” do Eclipse (eclipse-java-neon-R-win32-x86_64.zip) para o diretório de sua preferência. Execute o 
arquivo eclipse.exe para iniciar. 
Ao iniciar o eclipse, você deve definir o workspace de trabalho (que é a pasta onde será mantido seu 
espaço de trabalho – Figura 7). 
 
Figura 7 – Configuração do workspace do Eclipse. 
 
Figura 8 – Tela inicial do Eclipse. 
3.4 Conhecendo o Eclipse 
O eclipse possui uma interface amigável com as ferramentas agrupadas por perspectivas(Views e 
Perspective). Iremos utilizar a perspectiva Java que apresenta os seguintes recursos: 
 
 1 - Package Explorer - janela contendo todos os projetos desenvolvidos, cada projeto representa um 
programa ou aplicação; 
 2 - Problems - janela que indica erros contidos no código ordenados pela linha em que acontece; 
 3 - Console - janela responsável pela saída de padrão para mensagens proveniente qualquer 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 19 
programa Java; 
 4 - Janela com código - janela onde aparecerá o código fonte do arquivo .java selecionado no 
momento.Tal janela aparece automaticamente ou dando 2 cliques em algum arquivo .java presente na 
janela Package Explorer. 
 
 
 
 
 
 
 
 
 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 20 
4 SINTAXE DA LINGUAGEM JAVA 
4.1 Delimitadores em Java 
Em um código-fonte Java, alguns símbolos são utilizados pelo compilador para diferenciar comandos, 
blocos de comandos, métodos, classes, etc. Tais símbolos, chamados de delimitadores, são 
enumerados abaixo: 
 
Comentários 
Comentários servem para identificar a função de um comando, um trecho de código, ou um 
método. Além disso, os comentários podem ser utilizados para documentar aspectos de desenvolvimento 
de um programa: como o nome da empresa que o desenvolveu, nome dos programadores, versão, etc. 
Existem dois tipos de comentário: o simples e o de documentação. 
O comentário simples é delimitado por duas barras // e termina ao final de uma linha, conforme 
abaixo. 
 
 // comentário simples: não será incluído na documentação 
 // do programa (note que comentários simples exigem 
 // um par de barras para cada linha). 
 
 
O comentário de bloco é delimitado por duas barras /* e termina com */ ao final de uma linha. 
 /* Comentário de bloco 
 utilizado para comentar 
 várias linhas de código */ 
 
O comentário de documentação é iniciado pelo símbolo /** e encerrado pelo símbolo */, podendo 
conter várias linhas de texto e linhas em branco. Esse tipo de comentário será utilizado pela ferramenta 
geradora de documentação javadoc, que acompanha o ambiente de desenvolvimento SDK. 
Todo o texto entre os delimitadores de comentários do Javadoc é ignorado pelo compilador. 
Permitem incorporar a documentação do programa diretamente nos programas. O programa utilitário 
javadoc lê comentários no estilo Javadoc e utiliza-os para preparar a documentação do seu programa no 
formato HTML. 
Ponto e vírgula, blocos e espaços em branco: em Java, todo comando é terminado por um 
ponto e vírgula (;). 
Exemplo: 
 System.out.println ("note o ponto e vírgula no final  "); 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 21 
Um bloco é formado por um conjunto de instruções delimitadas por chaves, como no exemplo abaixo: 
 /** Exemplo de bloco */ 
 { // Chamamos essa chave de início de bloco 
 int ano; // Note o ponto e vírgula 
 ano = 2002; // sempre ao final de um comando Java 
 } // Chamamos essa chave de final de bloco 
 
O espaço em branco, quebra de linha e caracteres de tabulação são permitidos em qualquer trecho do 
código-fonte, devendo ser utilizados para realçar o aspecto visual de seu código. 
 
IMPORTANTE 
Apesar do aspecto visual do código-fonte não ter nenhum impacto no desempenho de um programa 
Java, o uso de endentação é uma característica de bons códigos-fonte. Lembre-se que você não será o 
único a ler o código-fonte de seus programas, portanto escreva-o da maneira mais organizada e legível 
possível. 
 
 
 
 
4.2 Identificadores e palavras reservadas 
Em Java, um identificador é uma sequência de símbolos UNICODE (64K símbolos) que começa 
com uma letra, um símbolo subscrito _, ou o caractere $. Os demais símbolos de um identificador podem 
conter também números. Identificadores são case-sensitive e não tem um tamanho máximo estabelecido. 
Apesar da tabela UNICODE ser bastante extensa, um bom hábito de programação é utilizar somente 
letras do alfabeto (a-Z) e números para nomear identificadores. 
Exemplo de identificadores válidos em Java: 
 data
 _data
 $data
 data_do_mês
 data1
 uma_variável_pode_SER_bastante_extensa_e_conter_Numeros234876238476 
 data_public_class_NoteQueEsseIdentificadorContemPalavrasReservadas
 
Apesar desta "liberdade" de opções para nomes de identificadores, algumas palavras não são 
permitidas. Tais palavras são ditas palavras reservadas, e representam o conjunto de comandos que 
forma a sintaxe da linguagem Java. O conjunto de palavras reservadas em Java é o seguinte: 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICAPÁGINA 22 
abstract double int strictfp 
boolean else interface super 
break extends long switch 
byte final native synchronized 
case finally new this 
catch float package throw 
char for private throws 
class goto protected transient 
const if public try 
continue implements return void 
default import short volatile 
do instanceof static while 
 
IMPORTANTE 
Você não precisa se preocupar em memorizar o nome das palavras reservadas em Java. À medida que 
você for praticando a programação em Java, isso se tornará natural. Além disso, o compilador acusa um 
erro de nomenclatura quando você tenta utilizar uma palavra reservada para nomear uma variável, um 
método ou uma classe. 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 23 
4.3 Declarando variáveis em Java 
Uma variável é sempre declarada seguindo do seguinte esquema: 
<tipo> + <espaço> + identificador + ; 
ou 
<tipo> + <espaço> + identificador + = + valor + ; 
onde: 
<tipo> é um tipo primitivo de dados ou o nome de uma classe ou interface 
identificador é o nome da variável 
valor é o valor atribuído à variável. 
Exemplos: 
 int number1 = 10; // primeiro número a somar 
 int number2 = 20; // segundo número a somar 
 int sum; // soma de number1 e number2 
 
IMPORTANTE 
Caso você declare uma variável e não atribua nenhum valor, ela não poderá ser utilizada em um código 
Java – a tentativa de utilizar uma variável não inicializada em Java gerará um erro de compilação. 
 
IMPORTANTE 
Veremos mais adiante que Java possui um mecanismo de inicialização de variáveis de seus tipos 
primitivos, mas o aluno deve evitar considerar essa inicialização como prática de programação. De fato, 
esta inicialização automática não funciona para variáveis de tipos agregados ou abstratos de dados e 
também que o escopo das variáveis – de classe ou de instância - tem influência na sua inicialização. O 
aluno é fortemente recomendado a pensar em variáveis como espaços alocados na memória RAM, 
inicialmente podendo conter qualquer valor (conhecido como lixo na memória). 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 24 
4.4 Tipos primitivos da linguagem Java 
A linguagem Java utiliza oito tipos primitivos de dados e um tipo especial. Esses tipos primitivos 
podem ser utilizados para declarar constantes ou variáveis utilizadas em programas Java. Os tipos 
primitivos estão divididos em quatro categorias: lógicos, textuais, numéricos inteiros e numéricos de ponto 
flutuante. 
 
Tipos lógicos: boolean 
Valores lógicos possuem dois estados, normalmente ditos verdadeiro/falso, sim/não e ligado/ 
desligado. Em Java um tipo lógico é definido pela palavra boolean, e pode assumir dois valores: true ou 
false. 
// Exemplo de variável que suporta valores booleanos 
 boolean anoBissexto = false; 
 boolean anoPar = true; 
 
// Apesar de uma variável poder ser declarada 
// sem receber um valor, ela só poderá ser usada 
// após a atribuição de algum valor a ela. 
 boolean valido; 
 
Tipos textuais: char e String 
 
Caracteres simples são representados pelo tipo char. Um char representa um caracter UNICODE, ou 
seja, um número inteiro sem sinal de 16 bits, no intervalo de 0 até 216-1. O valor de um literal char deve 
ser delimitado por aspas simples: 
 
// Exemplo de representação de caracteres UNICODE 
 char primeiraLetra = 'a'; 
 char tabulacao = '\t'; 
 
// Código UNICODE para o caractere de interrogação 
 char unicode = '\u0A02'; 
 
// Lembre-se: Uma variável só poderá 
// ser manipulada após receber um valor. 
 
 char inutil; // variável sem utilidade neste momento 
 inutil = '@'; // variável útil a partir de agora 
 
Palavras são representadas por uma sequência de dados do tipo char, agrupadas em um tipo 
“especial” de dados: a classe String. Apesar de ser uma classe, uma variável do tipo String suporta 
operações como se fosse um tipo primitivo de dados. O valor de uma variável String deve ser delimitado 
por aspas duplas "valor". 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 25 
 // Exemplo de uso de variáveis do tipo String 
 String curso = "Java Básico OO - LogusTI"; 
 
 // Uma variável pode receber o valor de outra 
 String outraVariavel = curso; 
 
 // A concatenação de Strings pode ser feita através do operador de soma (+) 
 curso = "Java Básico OO " + " Java Web" ; 
 
 // Concatenação de String com outro tipo de dados: 
 curso = "Java Básico OO" + 'I'; 
 curso = "Java Básico OO" + 1; 
 
 // Para comparar duas variáveis do tipo String devemos usar o método 
equals(): 
 // curso == "Java Básico OO..." INCORRETO 
 // curso.equals("Java Básico OO...") CORRETO 
 
A concatenação de qualquer tipo de dado com um dado do tipo String resulta em um novo dado do tipo 
String. 
 
Tipos numéricos inteiros: byte, short, int e long 
Existem quatro tipos primitivos de números em Java. Além disso, os valores numéricos podem 
ser representados de forma decimal, octal ou hexadecimal: 
Valores numéricos inteiros em Java: 
2 decimal 
077 um número que começa com zero está representado de forma octal 
0xBABE representação hexadecimal 
 
Todos os valores numéricos em Java tem sinal positivo ou negativo. 
Um valor numérico é sempre considerado do tipo int, a menos que seja acompanhado do sufixo 
L, que representa um valor do tipo long. A diferença de um inteiro para um longo é a capacidade de 
dígitos que podem ser representados, conforme aparece no quadro abaixo. 
Valores numéricos em Java, representados como long: 
2L decimal 
077L um número que começa com zero está representado de forma octal 
0xBABEL representação hexadecimal 
 // Valores inteiros representáveis pelos tipos numéricos em Java: 
 byte a = 127; // -27 ... 27 -1 
 short b = 32767; // -215 ... 215 -1 
 int c = 2147483647; // -231 ... 231 -1 
 long d = 9223372036854775807L; // -263 ... 263 –1 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 26 
Tipos numéricos de ponto flutuante: float e double 
Um valor fracionário pode ser representado em Java através dos tipos float e double. A diferença 
entre esses dois tipos é o tamanho de bits: 
float 32 bits 
double 64 bits 
 
Para um número ser considerado do tipo ponto flutuante, é necessário a inc lusão de um ponto, 
do caractere E (de expoente) ou do sufixo D ou F, conforme mostra o quadro abaixo: 
 // Representação de valores numéricos de ponto flutuante 
 float pi = 3.141516F; 
 float taxa = 15.02E23f; 
 double salario = 22521.20D; 
 
 // Quando não é definido o sufixo para um número decimal, o compilador entende 
que o tipo é double 
 double valor= 122.4E+306; 
 double valorX= 99.22; 
 
IMPORTANTE 
Todo o valor numérico de ponto flutuante é considerado do tipo double, a menos que o programador o 
declare explicitamente como float. 
4.5 - Convenções de codificação 
Em geral, as linguagens de programação possuem convenções para definir os nomes das 
variáveis. Essas convenções ajudam o desenvolvimento de um código mais legível. 
 Classes – as classes devem ser designadas por nomes, começando por uma letra maiúscula e 
depois minúsculas. Cada nova palavra que formar o nome da classe deve ser capitalizada. 
 Ex: class Calculadora, class PessoaFisica e class CalculadoraCientifica 
 
 Intefaces – igual às classes. 
Ex: interface Calculo e interface EquacaoLogaritmica. 
 
 Métodos – métodos devem nomeados por verbos, seguindo o mesmo formato de capitalização 
das classes. Entretanto, um método sempre deve começar comletra minúscula. 
Ex: public void calcular(int numero), public void extrairRaiz(int numero), ... 
 
 Constantes – constantes devem ter todas as suas letras em maiúsculo, com o símbolo de 
subscrito para separa as palavras. 
Ex: final int ANO = 2002, final boolean VERDADE = true, ... 
 
 Variáveis – tal qual os métodos, as variáveis devem começar com uma letra minúscula e depois 
alternar a cada palavra. Procure usar nomes significativos para variáveis. Evite declarar variáveis 
usando apenas um a letra. 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 27 
Mais Sobre 
Em geral, as linguagens de programação possuem convenções para definir os nomes das variáveis. 
Essas convenções ajudam o desenvolvimento de um código mais legível. 
Na convenção de nomes da linguagem Java, os nomes das variáveis devem seguir o padrão camel case 
com a primeira letra minúscula (lower camel case). Veja alguns exemplos: 
 nomeDoCliente 
 numeroDeAprovados 
A convenção de nomes da linguagem Java pode ser consultada na seguinte url: http://www. 
oracle.com/technetwork/java/codeconv-138413.html 
 
4.6 Exercícios 
 
a) Altere o programa AloMundo.Java para que ele imprima na tela todos os tipos primitivos de dados 
suportados pela linguagem Java. 
 
b) Altere o programa AloMundo para que ele imprima os parâmetros recebidos pela linha de comando de 
execução do programa. (Dica: são os valores do array args: args[0], args[1], etc.) 
 
c) Crie um programa que receba três argumentos da linha de comando e imprima-os na mesma linha, em 
ordem inversa. 
 
Exemplo: 
java Programa a1 a2 a3 
Saída: a3 a2 a1 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 28 
5 EXPRESSÕES 
 
Esta seção apresenta a manipulação de variáveis e implementação de tomada de decisões em 
programas Java. 
5.1 Operadores lógicos e aritméticos 
Os operadores Java são similares em estilo e função aos operadores da linguagem C/C++. A 
tabela abaixo enumera esses operadores. 
 
Delimitadores . [] () ; , Servem para delimitar partes 
distintas de um comando, 
método ou classe. 
 
Operador Função 
++ Incrementa o valor da variável em uma unidade. 
Exemplo: i++; contador++; 
-- Incrementa o valor da variável em uma unidade. 
Exemplo: i++; contador++; 
+ - Operadores aritméticos 
* / % Multiplicação, divisão, resto 
<< >> 
>>> 
Operadores de deslocamento aritmético e lógico 
== != Igualdade e desigualdade 
^ Potência 
&& AND 
|| OR 
?: Operador condicional. 
Exemplo: i=0; (i>2?i=0:i --); 
= *= %= 
+= -= 
<<= >>= 
>>>= &= 
^= |= 
 
Operadores aplicados sobre a atribuição. 
instance 
of 
Identificador de classes 
 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 29 
5.2 Concatenação de Strings com o operador + 
 
Quando o operador + é aplicado a dados do tipo String, ele cria um novo dado do tipo String, 
concatenando os dois operandos. 
 /** 
 * Concatenação de Strings 
 */ 
 String sigla = "JOO"; 
 String nome = "Java Orientado a Objetos"; 
 String titulo = sigla + " - " + nome; 
 
 // Esse comando imprimirá na tela a frase: 
 // JOO – Java Orientado a Objetos 
 
 System.out.println(titulo); 
 int i = 10; 
 
 String legenda = "valor = "; 
 
 // campo é uma variável do tipo String 
 String campo = legenda + i; 
 
Alguns métodos úteis em dados do tipo String: 
 String curso = "Java Orientado a Objetos"; 
 System.out.println("curso: " + curso); 
 
 // Isolando um caractere: 
 System.out.print("primeiro caractere: "); 
 System.out.println(curso.charAt(0)); 
 System.out.print("segundo caractere: "); 
 System.out.println(curso.charAt(1)); 
 
 // O primeiro caractere de uma String tem o 
 // índice 0, o segundo o índice 1 e assim por diante 
 // letra = 's'; 
 
 char letra = curso.charAt(2); 
 
 // substrings: 
 System.out.print("primeiras cinco letras: "); 
 System.out.println(curso.substring(0, 5)); 
 System.out.print("letras a partir da quarta: "); 
 System.out.println(curso.substring(4)); 
 
 // número de caracteres em uma String: 
 System.out.print("tamanho da frase: "); 
 System.out.println(curso.length() + " letras"); 
 
 // usando os caracteres de tabulação e quebra 
 // de linha: 
 System.out.println("" 
 + curso.length() 
 + " letras" 
 + " \n" 
 + " Nova linha\ttabulação" ); 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 30 
5.3 Promoção e Casting 
A linguagem Java não suporta atribuições arbitrárias entre variáveis de tipos diferentes. Por 
exemplo, você não pode inicializar uma variável inteira com um valor de ponto flutuante sem explicitar 
isso através de um processo que chamamos de casting. 
Quando atribuímos um valor a uma variável, e esse valor é incompatível com o tipo de dado 
definido para a variável, ocorrerá uma conversão. Em alguns casos, essa conversão será automática, em 
outros o programador deve indicar de que forma o valor será convertido ao tipo de dado da variável. 
Quando o processo de conversão for automático, dizemos que ocorreu uma promoção, ou seja, 
um valor com um tipo de dado foi promovido a outro tipo de dado. Veja no exemplo abaixo: 
// 
// Promoção entre valores de tipos de dados distintos 
// Apesar 6 ser um inteiro, o valor da variável grande 
// continua sendo do tipo long 
long grande = 6; 
// Uma variável do tipo inteiro não possui 
// espaço para armazenar um valor longo. 
// A instrução abaixo é ilegal, e causará um erro de compilação. 
int pequeno = 99L; 
float a = 12.121F; // correto 
float b = 12.121; // 12.121 é um double - incorreto 
Como visto acima, algumas conversões não podem ser realizadas de forma automática, pois o 
compilador não pode assumir que tipo de conversão ele deve realizar (o tamanho do tipo de dado a ser 
recebido por uma variável é maior que o tamanho pré-definido para o tipo dessa variável, logo o 
compilador não sabe como "ajustar" os bits excedentes). Nesse caso, o programador deve indicar ao 
compilador que tipo de conversão deverá ocorrer, digitando o tipo de dado que o valor deverá assumir 
entre parênteses: 
 // 
 // Casting entre valores de tipos de dados distintos 
 // 
 // Apesar 6 ser um inteiro, o valor da variável grande 
 // continua sendo do tipo long 
 long grande = 6; 
 int pequeno = (int)99L; // sem problemas 
 float a = 12.121F; 
 float b = (float)a; // sem problemas 
 
Abaixo estão relacionados todos os casts possíveis na linguagem Java, mostrando quando 
você quer converter 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). 
 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 31 
 
 
 
 
 
 
 
 
 
5.4 Operadores de deslocamento (>>, <<, >>>) 
Java provê operadores para a manipulação dos bits em variáveis de tipo numérico: o 
deslocamento aritmético >> e o deslocamento lógico >>>. 
O operador de deslocamento aritmético >> executa um deslocamento de um bit para a direita de 
um número (na prática, o primeiro argumento desse operador é dividido por dois 'n' vezes – onde n é o 
segundo argumento do operador): 
8 >> 2 = 2 
128 >> 1 = 64 
256 >> 4 = 16 
* Notação em complemento de dois: o operador >> mantém o sinal do bit mais significativo duranteo 
deslocamento. 
O operador de deslocamento lógico >>> executa um deslocamento no padrão dos bits ao invés do 
significado aritmético de um valor numérico. Esse operador sempre adiciona o valor 0 ao bit mais 
significativo: 
1010 ... >> 2 = 111010 ... 
 
1010 ... >>> 2 = 001010 ... 
* Os operadores de deslocamento reduzem seus operandos à direita módulo 32 para um valor do tipo int 
e módulo 64 para um tipo long. Dessa forma, para qualquer valor do tipo int: 
int x  x >>> 32 = x 
O operador de deslocamento lógico >>> só pode ser aplicado a valores inteiros, e não é efetivo em 
valores int e long. Se for aplicado a valor short ou byte, o valor será promovido a um int antes da 
aplicação do operador. Por isso, um deslocamento sem sinal acaba se tornando um deslocamento com 
sinal
5.5 Circuitos lógicos 
 Java possui três operadores básicos para implementar circuitos lógicos: 
NOT: operador ! 
Pág. 
 
5 EXPRESSÕES 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 32 
AND: operador && 
OR: operador || 
 
 Esses operadores permitem a representação de expressões booleanas, que formam o argumento 
para comandos de decisão (IF), seguindo a seguinte tabela: 
 
 AND: OR: 
true && true = true; true || true = true; 
true && false = false; true || false = true; 
false && true = false; false || true = true; 
false && false = false; false || false = false; 
!true = false; 
!false = true; 
!(a && b) = !a || !b 
!(a || b) = !a && !b 
5.6 Exercícios 
a) Implemente um programa para calcular a área de um trapézio, onde: 
 
h = altura 
b = base menor 
B = base maior 
Área = (h . (b + B)) / 2 
 
b) Faça o programa acima calcular utilizando valores de ponto flutuante e depois imprima na tela duas 
informações: 
 
Valor exato da área: 
Valor arredondado para inteiro: 
c) Calcule o valor das seguintes equações: 
a. 3 – 2 – 1 + 2 + 1 + 3 
b. 2 * 3 – 4 * 5 
c. 2 + 6 – 3 / 7 * 9 
d. 3 % 4 – 8 
 
d) Indique qual o valor verdade das seguintes expressões: 
a. (1 > 2) // exemplo: false 
b. (8 == 8) // exemplo: true 
c. ((12 – 5) > 6) 
d. (0 < 3) && (8 < 9) 
e. ((i++) > i) 
f. ((10 * 90 / 50 – 2) == 16) 
Pág. 
 
6 FLUXO DE CONTROLE 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 33 
6 FLUXO DE CONTROLE 
 
Esta seção demonstra como implementar tomada de decisões em códigos Java. 
 
6.1 Ramificação if, else 
 
A sintaxe básica para declarações if, else é a seguinte: 
if (expressão_booleana) 
{ 
 // bloco de comandos 
} 
else 
{ 
 // bloco alternativo de comandos 
} 
Exemplo: 
 /** 
 * Usando if, else */ 
 
 int maior = 10; 
 int menor = 5; 
 
 if (maior > menor) 
 { 
 // (10 > 5) = true 
 System.out.println(maior + ">" + menor); 
 } 
 else 
 { 
 // (10 > 5) != true 
 System.out.println(menor + ">" + maior); 
 } 
 
// Lembre-se que o controle de fluxo é feito através 
// do valor verdade de uma expressão booleana 
 
 boolean verdade = (10 > 5); 
 
 if (verdade) 
 { 
 // (10 > 5) = true 
 System.out.println(maior + ">" + menor); 
 
 } 
Pág. 
 
6 FLUXO DE CONTROLE 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 34 
 else 
 { 
 // (10 > 5) != true 
 System.out.println(menor + ">" + maior); 
 } 
 
6.2 Ramificação switch 
 
Switch é uma declaração semelhante ao if, mas que usa valores inteiros para a tomada de decisões ao invés 
de expressões booleanas. (só pode ser usada em dados dos tipos short, int, byte ou char). Se o tipo de dado não 
for inteiro, o comando switch irá executar uma promoção desse valor ao tipo int para somente depois 
executar a ramificação. 
A sintaxe básica para declarações switch é a seguinte: 
Switch ((int)expressão) 
{ 
// bloco de comandos 
case ((int) valor_1): 
// bloco de comandos break; 
 
case ((int) valor_2): 
// bloco de comandos break; 
default : 
// bloco de comandos padrão. 
// Se nenhum dos valores acima corresponder à 
// expressão definida no comando switch, então 
// o programa executará o trecho default. 
// o trecho default é opcional. 
break; 
} 
Exemplo: 
 /** 
 * Usando switch 
 */ 
 // Considere valorDoTeclado() como um número 
 // inteiro digitado pelo usuário 
 
 int valor = valorDoTeclado(); 
 switch (valor) 
 { 
 
 case 0: 
Pág. 
 
6 FLUXO DE CONTROLE 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 35 
 System.out.println("cadastro de produto"); 
 break; 
 case 1: 
 System.out.println("emitir nota fiscal"); 
 break; 
 case 2: 
 System.out.println("cancelar compra"); 
 break; 
 default: 
 System.out.println("efetuar venda"); 
 break; 
 } 
6.3 Repetição for 
A declaração for é utilizada para definir que um bloco de comandos deve ser executado 'n' vezes, onde 'n' é 
um número inteiro. A sintaxe do comando for é a seguinte: 
for (int i = 0; i < 10; i++) 
{ 
 // bloco de comandos 
} 
Exemplo: 
 /** 
 * repetição de comandos usando FOR 
 */ 
 // Calculando o fatorial de um número: 
 int numero = 10; 
 int fatorial = 1; 
 
 for (int i = numero; i > 0; i--) 
 { 
 fatorial = fatorial * i; 
 } 
 
 System.out.println("fatorial de " + numero + " = " + fatorial); 
 
 // Imprimindo os dias do ano: 
 for (int mes = 1; mes < 12; mes++) 
 { 
 switch (mes) 
 { 
 case 1: 
 System.out.println("janeiro"); 
 break; 
 case 2: 
 System.out.println("março"); 
 break; 
 case 3: 
 System.out.println("abril"); 
 break; 
 // escreva aqui os demais comandos 
Pág. 
 
6 FLUXO DE CONTROLE 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 36 
 } 
 } 
 
6.4 Repetição while 
A declaração while é utilizada para definir que um bloco de comandos e deve ser executado enquanto uma 
expressão booleana (condição de parada) não seja verdade. A sintaxe do comando while é a seguinte: 
While (expressão_booleana) 
{ 
// bloco de comandos executados enquanto a 
// expressão boolena tiver valor verdade = true 
} 
 ou 
do 
{ 
// bloco de comandos executados pelo menos uma vez 
} While (expressão_booleana); 
 
Exemplo: 
 public static void main(String[] args) { 
 
 /** 
 * repetição de comandos usando FOR 
 */ 
 // Calculando o fatorial de um número: 
 int numero = 10; 
 int fatorial = 1; 
 int i = numero; 
 
 while (i > 0) 
 { 
 fatorial = fatorial * i; 
 i--; 
 } 
 
 System.out.println("O fatorial de " + numero + " = " + fatorial); 
 // Lendo a condição de parada do teclado: 
 
 numero = 0; 
 while (numero < 10) 
 { 
 System.out.println("Digite um número: "); 
 numero = valorDoTeclado(); 
 } 
Pág. 
 
6 FLUXO DE CONTROLE 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 37 
 
 System.out.println("O usuário digitou um número maior que 10"); 
 
 } 
6.5 Comandos especiais de controle de fluxo: break, continue e label 
 
Os comandos de repetição em Java suportam dois tipos de desvios: o break e o continue. O break faz com 
que um laço seja interrompido, enquanto o continue é usado para "pular" uma execução e continuar a partir da 
próxima. 
Exemplo: 
 // pulando a execução No 10 e parando na No 15 
 for (int i=0; i<20; i++) 
 { 
 if(i== 10) 
 { 
 continue; 
 } 
 else if(i == 15) 
 { 
 break; 
 } 
 System.out.println("contador: " + i); 
 } 
Além disso, esse desvio pode ser direcionado, ou seja, o programador pode indicar para qual linha do código 
a execução do programa deve ser desviada (uma espécie de GOTO em Java). Essa prática é altamente 
desaconselhada, e foi mantida no Java por motivos de compatibilidade com a linguagem C. 
Um label em Java só pode ser usado para identificar um comando for, while ou do. 
Exemplo: 
 desvio: for (int i=0; i<20; i++) 
 { 
 if(i == 10) 
 { 
 continue desvio; 
 } 
 else if(i == 15) 
 { 
 // Essa linha nunca será executada 
 // pois o laço sempre será reiniciado 
 // quando o valor de i for igual a 10 
 break desvio; 
 } 
 System.out.println("contador: " + i); 
 
 } 
Pág. 
 
6 FLUXO DE CONTROLE 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 38 
6.6 Lendo valores do teclado 
 
Nem sempre é necessário fazer entrada byte a byte. Nestes casos, normalmente, é mais simples utilizar a classe 
Scanner do pacote java.util do Java. Essa classe possui métodos mais sofisticados para obter os dados de uma 
entrada. 
 // Criando objeto de entrada de dados 
 InputStream entrada = System.in; 
 Scanner scanner = new Scanner (entrada) ; 
 
 // Realizando a leitura 
 String linha = scanner.nextLine () ; 
 
 // Imprimindo a informação lida 
 System.out.println(linha); 
 
 
6.7 Exercícios 
 
1. Escreva um programa que imprima na tela a soma dos números ímpares entre 0 e 20 e a multiplicação dos 
números pares entre 0 e 20. 
 
2. Faça um programa para ler um número do teclado e imprimir na tela se ele é par ou ímpar. 
 
3. O valor pago por um Hotel da Praia de Iracema para seus porteiros é de R$ 10,25 por hora de trabalho. Faça um 
programa que pergunte ao usuário quantas horas ele trabalhou e imprima na tela o valor do salário a ser recebido 
por ele. 
 
4. Modifique o programa anterior para que o sistema imprima uma mensagem de alerta quando o valor a ser pago 
ao funcionário seja inferior a R$ 50,00: "Atenção, dirija-se à direção do Hotel!". 
 
5. Sabendo que na LogusTI a média mínima é 7,0 e a tolerância de faltas é 15 % da carga horária do curso, faça 
uma classe com o método main que peça as informações necessárias e informe a situação do usuário. 
 
6. Implemente uma classe java “Calculos” com um método”calcularMedia” que receba três números e calcule a 
média e imprima na tela essa média. O método “calcularMaior”, deverá receber também três números e retornar o 
maior número e o método “calcularMenor”, deverá receber três números e retornar o melhor número. Implemente a 
classe com o método main e instancie a classe Calculos executando todos os seus métodos. 
 
7. Construa uma classe que peça o Nome, Endereço, Sexo, Cidade, Estado, Idade dos funcionários. Além disto, 
dado o Salário Bruto do funcionário, calcule o seu Salário Líquido. Considere que os descontos podem ser o Vale 
Transporte (2%), Vale Alimentação (5%) e Plano de Saúde (10%). 
Pág. 
 
7 AGRUPAMENTO DE DADOS (ARRAYS) 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 39 
7 AGRUPAMENTO DE DADOS (ARRAYS) 
 
Nesta seção analisaremos o agrupamento de dados, uma estrutura simples mas essencial para a compreensão de 
como Java manipula dados na memória. 
7.1 Declarando e criando Arrays 
 
 Suponha que o sistema do banco tenha que gerar listas com os números das contas de uma agência. 
Poderíamos declarar uma variável para cada número 
 
int numero1; 
int numero2; 
int numero3; 
Contudo, não seria uma abordagem prática, pois uma agência pode ter uma quantidade muito grande de 
contas. Além disso, novas contas podem ser abertas todos os dias. Isso implicaria em alterações constantes no 
código fonte. 
Quando desejamos armazenar uma grande quantidade de valores de um determinado tipo, po-demos utilizar 
arrays. Um array é um objeto que pode armazenar muitos valores de um determinado tipo. 
 Podemos imaginar um array como sendo um armário com um determinado número de gavetas. E cada 
gaveta possui um rótulo com um número de identificação. 
 
Arrays são tipos indexados de dados que permitem a representação de agrupamento de dados como vetores 
e matrizes. 
 
Pág. 
 
7 AGRUPAMENTO DE DADOS (ARRAYS) 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 40 
Podemos declarar arrays de qualquer tipo de dado suportado em Java (primitivo ou agregado – tipos 
agregados de dados serão discutidos posteriormente). Essa declaração é feita pela adição do símbolo [] a um tipo de 
dado, que pode aparecer antes ou após o identificador da variável: 
char[] arrayDeCaracteres; 
String[] arrayDePalavras; 
Ponto[] arrayDeObjetosDoTipoPonto; 
int números[]; 
Na memória, um array é um agrupamento de dados, indexados pelo tamanho do tipo de dado que o array 
suporta:
 
 
O primeiro índice de um array é sempre 0, e o último índice é o N-1, onde N é o número de elementos do 
array. 
IMPORTANTE 
Apesar da posição do símbolo [] poder ser no início ou no final do nome da variável, é fortemente recomendado que 
você sempre aplique o [] após o tipo da variável. Isso torna o código muito mais legível. 
 
Para criar um array, usamos a palavra chave new: 
 
int[] números = new int[50]; 
 
A quantidade de elementos de um array sempre deve ser um valor inteiro. O comprimento de um array é dado pelo 
método length: 
 
// Imprimindo o comprimento de um array 
char [] alfabeto = new char[24]; 
int tamanhoDoAlfabeto = alfabeto.length; 
System.out.println("alfabeto com " + tamanhoDoAlfabeto " letras"); 
 
 
 
IMPORTANTE 
Um array de 10 elementos tem os índices de 0 a 9. 
Pág. 
 
7 AGRUPAMENTO DE DADOS (ARRAYS) 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 41 
 
7.2 Modificando o conteúdo de um array 
 
Para modificar o conteúdo de um array, devemos escolher uma ou mais posições que devem ser alteradas e utilizar 
a sintaxe abaixo: 
 int [] numeros = new int [100]; 
 numeros [0] = 136; 
 numeros [99] = 17; 
 
IMPORTANTE 
Quando um array é criado com o comando new, todas as posições são inicializadas com os valores padrão 
(números são inicializados com 0, booleanos com false e referências com null). 
 
Também podemos definir os valores de cada posição de um array no momento da sua criação utilizando as 
sintaxes abaixo: 
 int [] numeros1 = new int []{100 ,87}; 
 int [] numeros2 = {100 ,87}; 
 
7.3 Acessando o conteúdo de um array 
Para acessar o conteúdo de um array, devemos escolher uma ou mais posições e utilizar a sintaxe abaixo: 
 int [] numeros1 = new int []{100 ,87}; 
 int [] numeros2 = {100 ,87}; 
 System.out.println(numeros2[0]); 
 System.out.println(numeros1[1]); 
 
IMPORTANTE 
Acessar posições fora do intervalo de índices de um array gera erro de execução. Mais especificamente, em Java, 
ocorrerá a exception ArrayIndexOutOfBoundsException. 
 
Pág. 
 
7 AGRUPAMENTO DE DADOS (ARRAYS) 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 42 
7.4 Percorrendo um Array 
Quando trabalhamos com um array, uma das tarefas mais comuns é acessarmos todas ou algumas de suas 
posições sistematicamente. Geralmente, fazemos isso para resgatar todos ou alguns dos valores armazenados e 
realizar algum processamento sobre tais informações.Para percorrermos um array, utilizaremos a instrução de repetição for. Podemos utilizar a instrução while 
também. Porém, logo perceberemos que a sintaxe da instrução for, em geral, é mais apropriada quando estamos 
trabalhando com arrays. 
 int [] numeros = new int [100]; 
 for ( int i = 0; i < 100; i ++) { 
 numeros [ i ] = i ; 
 } 
 Para percorrer um array, é necessário saber a quantidade de posições do mesmo. Essa quantidade é 
definida quando o array é criado através do comando new. Nem sempre essa informação está explícita no código. 
Por exemplo, considere um método que imprima na saída padrão os valores armazenados em um array. 
Provavelmente, esse método receberá como parâmetro um array e a quantidade de posições desse array não estará 
explícita no código fonte. 
 public void imprimirArray(int[] numeros) { 
 // Implementação do Array 
 
 } 
 
Podemos imprimir todos os elementos do array utilizando o for e atributo length. 
 public void imprimirArray(int[] numeros) { 
 for (int i = 0; i < numeros.length; i++) { 
 // Imprimindo cada elemento do array 
 System.out.println(numeros[i]); 
 } 
 } 
 
Para acessar todos os elementos de um array, é possível aplicar o comando for com uma sintaxe um pouco 
diferente, utilizando o laço foreach. 
 
 public static void imprimirArray2(int[] numeros){ 
 
 for(int numero:numeros) { 
 System.out.println(numero); 
 } 
 
Pág. 
 
7 AGRUPAMENTO DE DADOS (ARRAYS) 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 43 
 } 
 
7.5 Operações com Arrays 
Nas bibliotecas da plataforma Java, existem métodos que realizam algumas tarefas úteis relacionadas a arrays. 
Veremos esses métodos a seguir. 
 
7.5.1 Ordenando um Array 
 
Considere um array de String criado para armazenar nomes de pessoas. Podemos ordenar esses nomes através 
do método Arrays.sort(). 
String [] nomes = new String []{ "João Paulo" , "Gabriel Jesus" , "André Santos", "Paulo 
Henrique" }; 
Arrays.sort(nomes); 
 
for (String nome:nomes) { 
 System.out.println (nome); 
} 
 
Analogamente, também podemos ordenar números. 
7.5.2 Duplicando um Array 
 
Para copiar o conteúdo de um array para outro com maior capacidade, podemos utilizar o mé-todo 
Arrays.copyOf(). 
 String [] nomes = new String []{"Neymar" , "Gabriel Jesus" , "Gabigol" }; 
 
 String [] nomesDuplicados = Arrays.copyOf(nomes,10); 
 
7.5.3 Preenchendo um Array 
Podemos preencher todas as posições de um array com um valor específico utilizando o método Arrays.fill(). 
 int [] numeros2 = new int [10]; 
 
 java . util . Arrays . fill ( numeros2 , 5) ; 
 
Pág. 
 
7 AGRUPAMENTO DE DADOS (ARRAYS) 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 44 
7.6 Arrays multidimensionais 
Quando declaramos um array através do símbolo [], estamos de fato criando um array unidimensional (vetor). 
Além de vetores, a linguagem Java permite a declaração de arrays n-dimensionais, conforme os exemplos abaixo: 
 // array unidimensional (VETOR) 
 String[] frases = new String[5]; 
 
 // array bidimensional (MATRIZ) 
 String[][] tabela = new String[5][15]; 
 
 // array n-dimensional 
 double [][][] densidade; 
 densidade = new double[10][10][10]; 
 
 // observe que nem todos os valores de um array 
 // precisam estar preenchidos. Sempre que você for 
 // usar o valor contido em uma posição de um array 
 // você deve ter certeza que essa posição 
 // foi inicializada 
 densidade[0][0][0] = 35.034; 
 densidade[1][0][0] = 30.876; 
 System.out.println("densidade na coordenada 1,0,0 = " 
 + densidade[1][0][0]); 
 
7.7 Array esparso 
 
Java permite a declaração de estruturas esparsas, ou seja, um agrupamento indexado de dados onde nem 
todas as dimensões são iguais: 
 
 
 // Matrizes esparsas podem ser representadas em Java 
 // através de arrays com dimensões heterogêneas: 
 int[][] esparso = new int[4][]; 
 esparso[0] = new int[10]; 
 esparso[1] = new int[2]; 
 
 esparso[2] = new int[5]; 
 esparso[3] = new int[1]; 
 
 // Na memória, o espaço de dados ocupado pelo 
 // array acima seria aproximadametne assim: 
 // [ | | | | | | | | | ] 
 // [ | ] 
 // [ | | | | ] 
 // [ ] 
Pág. 
 
7 AGRUPAMENTO DE DADOS (ARRAYS) 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 45 
7.8 Exercícios 
 
1) Crie um programa que imprima na tela os argumentos passados na linha de comando para o método main. 
Compile e execute a classe ImprimeArgumentos. Na execução, não esqueça de passar alguns parâmetros na linha 
de comando. 
2) Faça um programa que ordene o array de strings recebido na linha de comando.Compile e execute a classe 
Ordena. Na execução, não esqueça de passar alguns parâmetros na linha de comando. 
3) Faça um programa que calcule a média dos elementos recebidos na linha de comando. Dica: para converter 
strings para double utilize o método parseDouble() 
4) Faça um programa que leia cinco nomes do teclado, e depois imprima esses nomes na ordem inversa em 
que foram digitados pelo usuário. 
5) O tempo que um determinado avião dispensa para percorrer o trecho entre duas localidades distintas está 
disponível através da seguinte tabela: 
 
 A B C D E F G 
 02 11 06 15 11 01 
02 07 12 04 02 15 
11 07 11 08 03 13 
06 12 11 10 02 01 
15 04 08 10 05 13 
11 02 03 02 05 14 
01 15 13 01 13 14 
 
 
a) Construa uma classe java que leia a tabela anterior e informe ao usuário o tempo necessário para percorrer duas 
cidades por ele fornecidas, até o momento em que ele fornecer duas cidades iguais (origem e destino). 
 
b) Elabore uma classe que imprima a tabela sem repetições(apenas o triângulo superior ou o triângulo inferior). 
 
 
 
 
 
 
 
 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 46 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
8.1 Fundamentos da Programação Orientada a Objetos 
A Orientação a Objetos é uma tecnologia que enxerga os sistemas como sendo coleção de objetos 
integrantes. Ela permite melhorar a reusabilidade e extensibilidade dos softwares. 
A tecnologia orientada a objetos é fundamentada no que, coletivamente, chamamos de modelo de objetos, 
que engloba os princípios da abstração, hierarquização, encapsulamento, classificação, modularização, 
relacionamento, simultaneidade e persistência 
8.2. Paradigma Orientado por Objetos 
 
A proposta da orientação a Objetos é representar o mais fielmente possível as situações do mundo real nos 
sistemas computacionais. Nós entendemos o mundo como um todo composto por vários objetos que interagem uns 
com os outros. Da mesma maneira, a Orientação a Objetos consiste em considerar os sistemas computacionais não 
como uma coleção estruturada de processos, mas sim como uma coleção de objetos que interagem entre si. 
Os programas Orientados a objetos são programas estruturados em módulos que agrupam um estado e 
operações sobre este estado. Apresentam ênfase em reutilização de código. 
Um dos grandes diferenciais da programação orientada a objetos em relação a outros paradigmas de 
programação que também permitem a definição de estruturas e operações sobre essas estruturas está no conceito 
de herança, mecanismo através do qual definições existentes podem ser facilmente estendidas. Juntamente com a 
herança deve ser enfatizada aimportância do polimorfismo, que permite selecionar funcionalidades que um 
programa irá utilizar de forma dinâmica, durante sua execução. 
 
“Orientação a Objetos consiste em considerar os sistemas computacionais como uma 
coleção de objetos que interagem de maneira organizada. ” 
8.3 Principais conceitos de POO 
8.3.1 Objetos 
 
Usamos o termo objeto para representar um determinado elemento do mundo real. Mas somente 
analisaremos os objetos que tem relevância para a solução de um determinado problema. Portanto, o objeto é uma 
entidade do mundo real que merece representação para o ambiente estudado. 
Objetos são instâncias de classes, que determinam qual informação um objeto contém e como ele pode 
manipulá-la. É uma entidade capaz de reter um estado (informação) e que oferece uma série de operações 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 47 
(comportamento) ou para examinar ou para afetar este estado. É através deles que praticamente todo o 
processamento ocorre em sistemas implementados com linguagens de programação orientadas a objetos. 
Como exemplos de objetos, podemos citar os objetos físicos (um livro, uma mercadoria), funções de pessoas para os 
sistemas (cliente, vendedor), eventos (uma compra, um telefonema), interações entre outros objetos (um item de 
uma nota fiscal é uma interação entre uma compra e um produto do estoque) e lugares (loja matriz, revenda norte). 
Por exemplo, vamos considerar um cachorro(Bob) como nosso “objeto” para facilitar o entendimento acerca 
do conceito de OO: 
 
Analisando este objeto, o cachorro, podemos deduzir que o mesmo possui algumas características que 
pertencem apenas a ele próprio. Por exemplo, um cachorro possui: 
 
 Um nome, 
 Uma idade, 
 Um comprimento de pêlos, 
 Uma cor dos pelos, 
 Uma cor dos olhos, 
 Um peso, 
.... 
“As características que descrevem um objeto são chamadas de atributos”. 
 
Além do conjunto de características que descrevem o cachorro, podemos também identificar um conjunto de ações 
que ele é capaz de executar: 
 Latir, 
 Babar, 
 Correr em círculos, 
 Pegar a bola, 
 Sentar, 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 48 
 Comer, 
 Dormir. 
“As ações que um objeto pode executar são chamadas de métodos ou serviços”. 
 
A única maneira de interagir com os objetos é através dos métodos que ele disponibiliza. Para interagir com 
o cachorro, utilizamos os métodos que relacionamos acima: para alimentá-lo, utilizamos o método “comer”, para 
brincar com ele, utilizamos o método “pegar a bola”, etc. 
“Chamamos de interface ao conjunto de métodos disponíveis em um objeto.” 
8.3.2 Atributos e métodos 
 
Vimos então que os objetos são compostos de atributos e métodos, mas afinal, o que são atributos e o que são 
métodos? 
 
8.3.2.1 Atributos 
Os objetos do mundo real possuem propriedades que possuem valores. Estes valores definem o estado do 
objeto. As propriedades recebem o nome de atributos em OO. 
Podemos dizer que os atributos dos objetos são “variáveis” ou “campos” que armazenam os diferentes 
valores que as características dos objetos podem conter. 
O estado de um objeto é o conjunto de valores de seus atributos em um determinado instante. O 
comportamento de um objeto é como ele age e reage em termos de suas mudanças de estado e troca de 
mensagens com outros objetos. 
O cachorro(Bob) do nosso exemplo poderia ser representado pelos seguintes atributos: 
 
CACHORRO 
Nome Bob 
Idade 10 meses 
Cor dos pelos Bege 
Peso 4 kg 
 
 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 49 
Um outro objeto “cachorro” apresentaria valores diferentes para os mesmos atributos, por exemplo: 
 
 
CACHORRO 
Nome Lulu 
Idade 2 anos 
Cor dos pelos Laranja 
Peso 3 kg 
 
 
Os atributos de um objeto somente mudam de valor através de estímulos externos ou internos. A única forma 
de modificar os atributos dos objetos é disparando eventos que provocam a transição desses estados no objeto. 
 
8.3.2.2 Métodos 
Os métodos são procedimentos ou funções que realizam as ações próprias do objeto. Assim, os métodos 
são as ações que o objeto pode realizar. Tudo que o objeto faz é realizado através de seus métodos, pois é através 
dos seus métodos que um objeto se manifesta, e através deles que o objeto interage com os outros objetos. 
Um objeto exibe algum comportamento (executa uma operação) quando recebe um estímulo de outro objeto. 
Um objeto requisita a ação de algum outro objeto, enviando uma mensagem para ele. Esta mensagem é uma 
solicitação a um objeto para que seja executada as rotinas que chamamos de Método da classe. 
Os métodos são responsáveis por acessar ou alterar os atributos de um objeto. Imaginando os métodos do 
nosso objeto de estudo, o cachorro, enumeramos métodos (ações) como latir, babar, comer sentar, etc. 
 
8.3.3 Classes 
 
Uma classe representa um conjunto de objetos que possuem características e comportamentos comuns e de 
agora em diante, diremos que um objeto é uma instância de uma determinada classe, ou seja, criaremos nossos 
objetos baseados nas características definidas nas classes. A ênfase da metodologia orientada a objetos é dada na 
criação das classes, e não dos objetos, como se poderia pensar pelo nome. Olhando os dois cães do exemplo 
anterior, vemos que os dois possuem exatamente o mesmo conjunto de atributos. Isso acontece porque se trata de 
dois objetos da mesma classe, ou categoria. Isso significa que os dois possuem exatamente o mesmo conjunto de 
atributos e métodos, embora cada objeto possa ter valores diferentes para os seus atributos. 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 50 
 
 
 
 
 
 
 
 
Classe Cachorro 
 
 
Objetos de mesma classe possuem a mesma definição tanto para métodos quanto para atributos. 
Tomemos uma classe gatos formada de objetos “gato”. Estes objetos possuem as seguintes características: 
nome, idade, peso, cor de pelos, cor de olhos e comprimento de pelos. Além disso, o objeto possui as seguintes 
ações: miar, comer, dormir, subir na árvore. 
 
 
 
 
 
 
 
 
 
Classe Gato 
 
Muitos objetos do mundo real possuem características comuns e podem ser agrupados de acordo com elas. 
Uma classe representa um gabarito para muitos objetos e descreve como estes objetos estão estruturados 
internamente. 
As classes Cães e Gatos possuem características e métodos comuns, por exemplo: Características comuns 
(nome, idade, peso, cor de pelos, cor de olhos e comprimento de pelos), Métodos comuns (pegar a bola, comer, 
dormir). 
8.3.3 Instanciação 
 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 51 
A instanciação é quando a classe produz um objeto, como se ela fosse uma espécie de modelo ou gabarito 
para a criação de objetos. Conforme a teoria da orientação a objetos, dizemos que um objeto é, nada mais nada 
menos, que a instância de uma classe. 
Pelo exemplo que estamos estudando, cada cachorro que for armazenado é um novo objeto, uma nova 
instância da classe “Cachorro”. A classe serve de modelo para a criação de novos objetos.8.4 - Exercício - Conceitos OO 
 
Para atender as necessidades de informação de uma biblioteca universitária foi proposto um sistema que deve 
atender as seguintes características: 
 
 O cadastro dos usuários da biblioteca com endereço completo. Os usuários podem ser classificados em três 
grupos: Professores, Alunos e Funcionários. Para os Alunos é necessário conhecer o curso ao qual 
pertencem. Dos Professores e funcionários, é necessário conhecer o Departamento ao qual estão sempre 
vinculados. 
 O cadastro das obras da biblioteca, que podem ser classificadas em: Livros científicos, periódicos científicos, 
periódicos informativos, periódicos diversos, entretenimento, etc. 
 A língua em que se encontra o exemplar da obra. 
 A mídia onde se encontra o exemplar da obra. 
 Os autores da obra com o controle da nacionalidade do autor. 
 As editoras dos exemplares com o ano de edição de cada exemplar. 
 O histórico dos empréstimos. 
 
Identifique as possíveis classes e objetos com seus respectivos atributos e métodos. 
 
 
 
 
 
 
 
 
 
 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 52 
8.5 – Classes e Objetos em Java 
 
O conceito de classe apresentado anteriormente é genérico e pode ser aplicado em diversas linguagens de 
programação. Mostraremos como a classe Conta poderia ser escrita utilizando a linguagem Java. Inicialmente, 
discutiremos apenas sobre os atributos. Os métodos serão abordados posteriormente. 
class Conta { 
 
 double saldo; 
 
 double limite; 
 
 int numero; 
 
} 
A classe Java Conta é declarada utilizando a palavra reservada class. No corpo dessa classe, são 
declaradas três variáveis que são os atributos que os objetos possuirão. Como a linguagem Java é estaticamente 
tipada, os tipos dos atributos são definidos no código. Os atributos saldo e limite são do tipo double, que permite 
armazenar números com casas decimais, e o atributo número é do tipo int, que permite armazenar números inteiros. 
Importante 
Por convenção, os nomes das classes na linguagem C# devem seguir o padrão “Camel Case” com a primeira letra 
maiúscula. 
 
8.5.1 Criando objetos em Java 
Após definir a classe Conta, podemos criar objetos a partir dela. Esses objetos devem ser alocados na 
memória RAM do computador. Felizmente, todo o processo de alocação do objeto na memória é gerenciado pela 
máquina virtual. O gerenciamento da memória é um dos recursos mais importantes oferecidos pela máquina virtual. 
Do ponto de vista da aplicação, basta utilizar um comando especial para criar objetos e a máquina virtual se 
encarrega do resto. O comando para criar objetos é o new. 
class TestaConta { 
 
public static void main (String [] args ) { 
 // criando um objeto 
 new Conta () ; 
 } 
 
} 
 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 53 
A linha com o comando new poderia ser repetida cada vez que desejássemos criar (instanciar) um objeto da 
classe Conta. A classe TestaConta serve apenas para colocarmos o método main, que é o ponto de partida da 
aplicação. 
class TestaConta { 
 
public static void main (String [] args ) { 
 // criando três objetos 
 new Conta () ; 
 new Conta () ; 
 new Conta () ; 
 } 
 
} 
 
Analogia 
Chamar o comando new passando uma classe Java é como se estivéssemos contratando uma construtora passando a 
planta da casa que queremos construir. A construtora se encarrega de construir a casa para nós de acordo com a planta. 
Assim como a máquina virtual se encarrega de construir o objeto na memória do computador. 
 
8.5.2 Referências 
 
Todo objeto possui uma referência. A referência de um objeto é a única maneira de acessar os seus atributos e 
métodos. Dessa forma, devemos guardar as referências dos objetos que desejamos utilizar. 
Referências em Java 
Ao utilizar o comando new, um objeto é alocado em algum lugar da memória. Para que possamos acessar esse 
objeto, precisamos de sua referência. O comando new devolve a referência do objeto que foi criado. 
Para guardar as referências devolvidas pelo comando new, devemos utilizar variáveis não primitivas. 
 
 Conta referencia = new Conta () ; 
No código Java acima, a variável referencia receberá a referência do objeto criado pelo comando new. Essa 
variável é do tipo Conta. Isso significa que ela só pode armazenar referências de objetos do tipo Conta. 
 
 
 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 54 
8.5.3 Manipulando Atributos 
 
Podemos alterar ou acessar os valores guardados nos atributos de um objeto se tivermos a referência a esse 
objeto. Os atributos são acessados pelo nome. No caso específico da linguagem Java, a sintaxe para acessar um 
atributo utiliza o operador ".". 
public class TesteOO { 
 
public static void main (String [] args ) { 
 
 
 Conta referencia = new Conta () ; 
 
 referencia.saldo = 5000; 
 
 referencia.limite = 10000; 
 
 referencia.numero = 1; 
 
 System.out.println ( referencia . saldo ) ; 
 
 System.out.println ( referencia . limite ) ; 
 
 System.out.println ( referencia . numero ) ; 
 
 } 
 
} 
No código acima, o atributo saldo recebe o valor 5000. O atributo limite recebe o valor 10000 e o número recebe 
o valor 1. Depois, os valores são impressos na tela através do comando System.out.println. 
8.5.4 Valores Padrão 
 
Poderíamos instanciar uma classe para criar um objeto e utilizar seus atributos sem inicializá-los explicitamente, 
pois os atributos são inicializados com valores padrão. Os atributos de tipos numéricos são inicializados com 0, os 
atributos do tipo boolean são inicializados com false e os demais atributos com null (referência vazia). 
class Conta { 
 
 double limite ; 
 
} 
 
class TestaConta { 
 
 public static void main ( String [] args ) { 
 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 55 
 Conta conta = new Conta () ; 
 
 // imprime 0 
 System . out . println ( conta . limite ) ; 
 
 } 
 
} 
 
A inicialização dos atributos com os valores padrão ocorre na instanciação, ou seja, quando o comando new é 
utilizado. Dessa forma, todo objeto “nasce” com os valores padrão. Em alguns casos, é necessário trocar esses 
valores. Para trocar o valor padrão de um atributo, devemos inicializá-lo na declaração. Por exemplo, suponha que o 
limite padrão das contas de um banco seja R$ 2500. Nesse caso, seria interessante definir esse valor como padrão 
para o atributo limite. 
 
class Conta { 
 
 double limite = 2500; 
 
} 
 
 
class TestaConta { 
 
 public static void main ( String [] args ) { 
 
 Conta conta = new Conta () ; 
 
 // imprime 2500 
 System . out . println ( conta . limite ) ; 
 
 } 
 
} 
 
 
 
 
 
 
 
Pág. 
 
8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 56 
8.6 Exercícios Complementares 
 
a) Implemente uma classe chamada Aluno para definir os objetos que representarão os alunos de uma escola. 
Essa classe deve declarar três atributos: o primeiro para o nome, o segundo para o RG e o terceiro para o CPF dos 
alunos.b) Faça uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles. A classe 
também deve mostrar na tela as informações desses objetos. 
c) Em uma escola, além dos alunos temos os funcionários, que também precisam ser representados em nossa 
aplicação. Então implemente outra classe chamada Funcionario que contenha dois atributos: o primeiro para o cargo 
e o segundo para o salário dos funcionários. 
d) Faça uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a 
eles. Mostre na tela as informações desses objetos. 
e) Em uma escola, os alunos precisam ser divididos por turmas, que devem ser representadas den-tro da 
aplicação. Implemente uma classe chamada Turma que contenha quatro atributos: o primeiro para o período, o 
segundo para definir a série, o terceiro para sigla e o quarto para o tipo de ensino. 
f) Faça uma classe chamada TestaTurma para criar dois objetos da classe Turma. Adicione informações a eles 
e depois mostre essas informações na tela. 
Pág. 
 
9 OO - HERANÇA, POLIMORFISMO E INTERFACES 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 57 
9 OO - HERANÇA, POLIMORFISMO E INTERFACES 
 
9.1 Objetos e Construtor 
 
Objetos e Construtor 
Objetos são criados através da declaração new, seguida de um método construtor. Exemplo: 
Automovel gol1 = new Automovel(“Gol V”); 
Uma classe pode ter construtores especializados ou somente o construtor default (gerado pelo compilador). 
Um construtor recebe sempre o mesmo nome da sua classe. 
O método construtor gera uma instância do objeto em memória e o seu código é executado imediatamente após a 
criação do objeto provendo-lhe um estado inicial. Quando declaramos variáveis de qualquer tipo primitivo (boolean, 
byte, short, char, int, long, float, ou double) o espaço em memória (na área de dados) é alocado como parte da 
operação. A declaração de uma variável referência a um objeto não aloca espaço em memória. 
A alocação de memória (no heap) é feita somente quando o objeto é criado. 
Considere o exemplo abaixo: 
Automovel gol; 
gol = new Automovel(); 
• O primeiro comando, a declaração, aloca apenas o espaço suficiente para a referência. O segundo, aloca o 
espaço para os atributos do objeto gol. 
 
• Somente após a criação do objeto é que seus membros (atributos e métodos) podem ser referenciados. 
 
9.2 Herança 
Herança significa ser capaz incorporar os dados e métodos de uma classe previamente definida. Assim como 
a herança de todas as operações e dados, você pode especializar métodos da classe ancestral e especificar novos 
operações e dados, para refinar, especializar, substituir ou estender a funcionalidade da classe progenitora. 
Você pode fazer sempre com que um objeto mais geral armazene um objeto mais especializado, mas 
o contrário não é verdadeiro sem uma conversão explícita de tipos. 
Pág. 
 
9 OO - HERANÇA, POLIMORFISMO E INTERFACES 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 58 
Veja o exemplo abaixo: 
 
 
 
 
 
 
 
 
Herança - terminologia 
• estender = criar uma nova classe que herda todo o conteúdo da classe existente. 
• superclasse = uma classe progenitora ou “base”. 
• subclasse = uma classe filha que herda, ou estende, uma superclasse. 
Em Java, a classe “Object” é raiz de todas as classes: 
 
 
 
 
 
 
 
 
 
 
 
 
Pág. 
 
9 OO - HERANÇA, POLIMORFISMO E INTERFACES 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 59 
this é uma palavra-chave usada num método como referência para o objeto corrente. 
• ela tem o significado de: “o objeto para o qual este trecho de código está sendo executado”. 
 
//Classe ponto 
public class Ponto 
{ 
 
 private float x,y; 
 
 public Ponto(float x,float y) 
 { 
 this.x=x; this.y=y; 
 } 
 
 public void move(float dx,float dy) 
 { 
 this.x+=dx; this.y+=dy; 
 } 
 
 public float retorna_x() 
 { 
 return x; 
 } 
 
 public void mostra() 
 { 
 System.out.println( "(" + this.x + "," + this.y + ")" ); 
 } 
 
} 
 
super é uma palavra chave usada numa subclasse como referência para membros da superclasse. 
• ela tem o significado de: “a superclasse da classe corrente”. 
 
9.3 Polimorfismo 
Existem dois tipos de polimorfismo que são conhecidos como sobrecarga (overload) e sobreposição 
(override). 
Ocorre quando uma classe possui um método com o mesmo nome e assinatura (número, tipo e ordem de 
parâmetros) de um método na sua superclasse. Toda vez que isto ocorrer, a máquina virtual irá executar o método 
da classe mais especializada (a subclasse) e não o método da superclasse. Note que esta decisão ocorre em tempo 
de execução. 
Pág. 
 
9 OO - HERANÇA, POLIMORFISMO E INTERFACES 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 60 
Polimorfismo ocorre também quando existem dois métodos com mesmo nome, na mesma classe com e 
assinaturas diferentes. O método será escolhido de acordo com o número de parâmetros, tipo ou valor de retorno 
esperado. Note que esta decisão ocorre em tempo de compilação. 
Membros com mesmos identificadores substituem membros herdados. 
• Os membros definidos na superclasse podem ser acessados na subclasse através do qualificador super. 
• Métodos declarados como final não podem ser redefinidos. 
• Métodos abstratos devem ser redefinidos ou declarados como abstratos. 
9.3.1 Polimorfismo - Sobreescrita 
A sobrescrita (ou override) está diretamente relacionada à orientação a objetos, mais especificamente com a 
herança. Com a sobrescrita, conseguimos especializar os métodos herdados das superclasses, alterando o seu 
comportamento nas subclasses por um mais específico. 
A sobrescrita de métodos consiste basicamente em criar um novo método na classe filha contendo a mesma 
assinatura e mesmo tipo de retorno do método sobrescrito. 
Substituir a implementação de um método herdado por uma implementação própria da subclasse. 
public class Super 
{ 
... 
public void metodo1() 
{ 
 a = b * c; 
} 
} 
public class Sub extends Super 
{ 
... 
public void metodo1() 
{ 
 x = y + z; 
} 
} 
Pág. 
 
9 OO - HERANÇA, POLIMORFISMO E INTERFACES 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 61 
9.3.2 Polimorfismo – Sobrecarga 
A sobrecarga (overload) consiste em permitir, dentro da mesma classe, mais de um método com o mesmo 
nome. A sobrecarga de métodos (overload) é um conceito do polimorfismo que consiste basicamente em criar 
variações de um mesmo método, ou seja, a criação de dois ou mais métodos com nomes totalmente iguais em uma 
classe. A Sobrecarga permite que utilizemos o mesmo nome em mais de um método contanto que suas listas de 
argumentos sejam diferentes para que seja feita a separação dos mesmos. 
 
public class Fruta 
{ 
int gramas; 
int calorias_por_grama; 
 
public Fruta() 
{ 
gramas=55; 
calorias_por_grama=0; 
} 
public Fruta(int g, int c) 
{ 
this.gramas =g; 
this.calorias_por_grama =c; 
} 
} 
 
public class Feira 
{ 
public static void main(String args[]) 
{ 
Fruta melancia = new Fruta(4000, 5); 
Fruta manga = new Fruta (); 
manga.gramas=100; 
manga.calorias_por_grama=100; 
System.out.println(“manga “+ manga.gramas + “ gs “ + manga.calorias_por_grama); 
} 
} 
Pág. 
 
9 OO - HERANÇA, POLIMORFISMOE INTERFACES 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 62 
9.4 Exercício - Polimorfismo 
 
1) Crie duas classes que definam os seguintes atributos e métodos para objetos do tipo: 
 
 
 
 
 
 
 
 
 
 
Ao final crie um objeto da classe Empregado e um objeto da classe Gerente, atribuindo valores para seus 
salários e comissão para o gerente. Ao final execute os métodos getSalario() de ambos objetos. Lembrar que o 
salário do gerente é composto do salário + comissão. 
 
 
 
 
 
 
 
 
 
 
Pág. 
 
9 OO - HERANÇA, POLIMORFISMO E INTERFACES 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 63 
9.5 Interfaces 
Interface pode ser considerada como a forma com que um objeto se apresenta para outros, no que diz 
respeito aos seus atributos e métodos (sua funcionalidade). 
* É a representação externa de um objeto. 
* Na nossa vida, estamos acostumados a lidar com objetos através de sua interface, ignorando sua 
complexidade. 
 
 
 
 
 
 
 
 
 
 
 
 
• Criadas com a palavra reservada interface. 
• São sempre públicas. 
• Implementadas pelas classes com a palavra reservada implements. 
Exemplo Interface 
 public interface ControleRemoto 
 { 
 public void ligaTV(); 
 public void desligaTV(); 
 public void mudaCanalTV(int canalNovo); 
Pág. 
 
9 OO - HERANÇA, POLIMORFISMO E INTERFACES 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 64 
 } 
 
 public class TV implements ControleRemoto 
 { 
 public void ligaTV() {...} 
 public void desligaTV() {...} 
 public void mudaCanalTV(int canalNovo) {...} 
 } 
 
 
Pág. 
 
10 OO - CLASSES ABSTRATAS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 65 
10 OO - CLASSES ABSTRATAS 
 
Por vezes, no desenvolvimento de bibliotecas, pode ser útil criar e definir métodos para uma classe que 
represente algum comportamento fundamental. Entretanto o comportamento não será implementado nessa classe. 
Em vez disso, os métodos serão implementados nas subclasses. 
Por exemplo, considere uma classe para representar uma venda. O valor de uma venda é subdividido entre 
valor da mercadoria + valor do imposto. Nossa classe genérica não conhece todos os tipos de imposto, mas as 
subclasses podem conhecer. Por exemplo uma classe que representa venda à vista sabe que o imposto para este 
tipo de venda é 1% e outra classe que representa venda à prazo, sabe que o tipo de imposto para este tipo de venda 
é de 2%. Então a superclasse Venda pode delegar às suas subclasses a tarefa de descobrir a taxa do seu imposto. 
Regras para classes abstratas 
Classes abstratas funcionam de forma muito semelhante às classes normais e praticamente tudo o que é 
possível fazer com classes normais, também pode ser feito com classes abstratas. 
- Elas são identificadas pela palavra chave abstract na definição da classe. 
- Seus métodos abstratos também são identificados pela palavra chave abstract na definição da classe. 
- Não é possível construir uma instância de uma classe abstract, a não ser indiretamente, construindo 
uma instância de uma subclasse dela. 
- As subclasses das classes abstratas devem fornecer implementações para todos os métodos abstratos 
das respectivas classes pai. Caso contrário, elas também serão classes abstratas. Portanto qualquer 
subclasse da classe Venda que não forneça uma implementação para retornar o taxa do imposto 
também será abstrata. 
- Métodos abstratos não podem ser privados nem estáticos. 
 
public abstract class Venda( 
 ... 
 public abstract double getTaxaImposto(); 
 ... 
} 
 
Pág. 
 
11 MODIFICADORES JAVA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 66 
11 MODIFICADORES JAVA 
11.1 Introdução 
Os modificadores são utilizados para modificar os comportamentos das classes, métodos ou atributos. Os 
modificadores Java são public, protected, private, static, abstract, final, native, synchronized, transient e 
volatile. 
Alguns modificadores podem ser classificados como pertencentes a um grupo chamado modificadores de 
acesso, tais modificadores (public, protected, private) ditam como membros de uma classe são visíveis por outras 
classes. Os outros modificadores não possuem uma organização clara e serão explicados um a um. 
Para cada modificador será explicado o resultado de aplicá-lo sobre cada um dos seguintes elementos da 
linguagem: variáveis, métodos, construtores e classes. 
11.2 Modificadores de Acesso 
Os modificadores de acesso são padrões de visibilidade de acessos às classes, atributos e métodos. 
Esses modificadores são palavras-chaves reservadas pelo Java, ou seja, palavras reservadas não podem ser usadas 
como nome de métodos, classes ou atributos. 
Como boas práticas (best practices) do Java, na maioria das declarações de variáveis de instância são 
definidos os seus atributos com a palavra-chave private, para garantir a segurança de alterações acidentais, sendo 
somente acessíveis através dos métodos. Essa ação tem como efeito ajudar no encapsulamento dos dados, 
preservando ainda mais a segurança e a aplicação de programação orientada a objetos do Java. 
Por exemplo, quando um programa cria (instancia) um objeto da classe Banco, a variável senha é 
encapsulada (ocultada) no objeto onde pode ser acessada apenas por métodos da classe do objeto, os 
métodos getters e setters, que manipulam a variável de instância. Vejamos abaixo a explicação sobre cada um. 
 
Pág. 
 
11 MODIFICADORES JAVA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 67 
11.2.1 Private 
O modificador de acesso private e o mais restritivo de todos, variáveis, métodos e construtores com esse 
modificador são visíveis somente dentro da definição da própria classe, acessando-o diretamente ou através de uma 
instância da mesma classe. 
O modificador private pode ser usado em variáveis, métodos e construtores. Em classes, seu uso é restrito a 
classes internas, ou seja, classes declaradas dentro de outras classes. 
Da forma como nossa classe ContaCorrente foi construída, por mais que modifiquemos o atributo saldo 
através do método sacar, é possível atribuir qualquer valor ao atributo saldo. 
public class ContaCorrente { 
 int numero; 
 double saldo; 
 
 boolean sacar(float valor){ 
 
 if (saldo>=valor) { 
 saldo = saldo - valor; 
 return true; 
 } 
 else return false; 
 } 
} 
public class Teste2 { 
 
 public static void main(String[] args) { 
 // Criando um objeto passando dois parâmetros(número e saldo inicial) em seu 
método construtor. 
 ContaCorrente conta = new ContaCorrente(100,5500.00); 
 // Realizando o saque por meio do método sacar 
 conta.sacar(1000); 
 // Alterando diretamente o atributo saldo do objeto conta 
 conta.saldo = -100; 
 } 
 
} 
 A melhor forma de resolver isso seria forçar quem usa a classe a chamar sempre o método sacar e não 
permitir que seja atribuído um valor diretamente ao atributo saldo. Para fazer isso em Java, basta declarar que os 
atributos não podem ser acessados fora da classe usando a palavra chave private. 
 
Pág. 
 
11 MODIFICADORES JAVA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 68 
Isso é importante,pois pode ser que um valor inválido seja atribuído ao valor do saldo. A melhor forma de 
resolver isso seria forçar quem usa a classe ContaCorrente a chamar sempre o método sacar e não permitir que seja 
atribuído um valor diretamente ao atributo saldo. Para fazer isso em Java, basta declarar que os atributos não podem 
ser acessados fora da classe usando a palavra chave private. Assim, toda conversa de um objeto com outro é feita 
através de troca de mensagem (acessando seus métodos). Veja exemplo abaixo. 
public class ContaCorrente { 
 private int numero; 
 private double saldo; 
 
 // Método construtor da classe ContaCorrente 
 public ContaCorrente(int numero, double saldoInicial){ 
 // Atribuindo os valores recebidos no método construtor para os atributos da 
classe. 
 this.numero = numero; 
 this.saldo = saldo; 
 } 
 
 
 // Método para realizar o saque 
 public boolean sacar(float valor){ 
 
 if (saldo>=valor) { 
 saldo = saldo - valor; 
 return true; 
 } 
 else return false; 
 } 
 
} 
 
public class Teste2 { 
 
 public static void main(String[] args) { 
 // Criando um objeto passando dois parâmetros(número e saldo inicial) em seu 
método construtor. 
 ContaCorrente conta = new ContaCorrente(100,5500.00); 
 // Realizando o saque por meio do método sacar 
 conta.sacar(1000); 
 
 } 
 
} 
 11.2.2 Protected 
O modificador de acesso protected define que variáveis, métodos e construtores com esse modificador 
podem somente ser acessados por classes no mesmo pacote ou subclasses da classe onde o elemento foi definido, 
é importante notar que para os elementos serem acessados na subclasse não é preciso estar no mesmo pacote da 
Pág. 
 
11 MODIFICADORES JAVA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 69 
classe pai. O modificador protected pode ser aplicado somente em variáveis, métodos e construtores, o seu uso em 
classes não é permitido. 
11.2.3 Public 
O mais abrangente de todos os tipos de acesso, o modificador public declara que elementos com esse 
modificador são acessíveis de qualquer classe Java. Este modificador é aplicável a variáveis, métodos, construtores 
e classes. 
11.2.4 Default (padrão) 
 A classe e/ou seus membros são acessíveis somente por classes do mesmo pacote, na sua declaração não 
é definido nenhum tipo de modificador, sendo este identificado pelo compilador. 
 
public class ModificadorDefault { 
 
 public static void main(String[] args) { 
 String nome = "Roberto Carlos"; 
 System.out.printf("Nome.: %s",nome); 
 } 
} 
A tabela a seguir apresenta um resumo dos modificadores de acesso. 
Tabela dos modificadores de acesso 
Escopo de acesso private default protected public 
mesma classe sim sim sim sim 
mesmo pacote não sim sim sim 
pacotes diferentes (subclasses) não não sim sim 
pacotes diferentes (sem subclasses) não não não sim 
 
11.3 Outros Modificadores 
11.3.1 Final 
O modificador final pode ser aplicado a variáveis, métodos e classes. O comportamento descrito pelo 
operador final varia de elemento para elemento, mas tem um conceito em comum, o conceito de imutabilidade, isto é, 
Pág. 
 
11 MODIFICADORES JAVA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 70 
elementos final não podem ser mudados. Você pode desejar declarar classes que implementam seus algoritmos 
como classes final. 
11.3.2Abstract 
O modificador abstract pode ser aplicado somente a classes e métodos. Classes abstratas provem um 
modo de adiar a implementação de métodos para subclasses. Uma classe abstrata não pode ser instanciada, ou 
seja, não podemos chamar seus construtores. 
11.3.3 Static 
Este modificador pode ser aplicado a variáveis, métodos e a uma porção de código que não está dentro de 
nenhum método, geralmente referenciado como bloco estático. 
A ideia geral sobre o modificador static é que elementos com esse modificador estão associados com a 
classe e não com instâncias dessa classe. 
Uma variável estática é compartilhada por todas as instâncias de uma classe, ou seja, ao invés de cada 
instância da classe ter uma cópia dessa variável ela é uma única variável compartilhada por todos as instâncias. Para 
a existência de uma variável estática não é preciso nem mesmo a criação de uma instância da classe que contenha a 
variável, é necessário somente que a classe seja carregada na Máquina Virtual Java, já que está é criada e 
inicializada no momento de carga da classe. 
Em relação a métodos as mesmas explicações são verdadeiras, ou seja, métodos podem ser chamados 
mesmo sem nenhuma instância da classe ter sido construída. Um bom exemplo de métodos estáticos existe em toda 
aplicação Java, o método main() é invocado sem a existência de nenhuma instância. 
Métodos e variáveis podem ser referenciados além da forma padrão (através do nome do objeto) através do 
nome da classe. Embora as duas formas sejam corretas e trabalham exatamente da mesma forma a primeira pode 
tornar-se confusa quando referenciando métodos e variáveis estáticas, levando o programador a pensar que este 
método ou variável é não estático. Por esse motivo e conveniente sempre referenciar variáveis estáticas através do 
nome da classe para evitar confusões. 
É importante dizer que métodos estáticos podem somente acessar variáveis também estáticas, ou seja, é 
proibido o uso de variáveis não estáticas dentro de blocos estáticos, com exceção de variáveis criadas dentro do 
próprio bloco é claro. Essa restrição se deve ao fato de que é possível fazer uma chamada a um método estático 
mesmo sem haver nenhuma instância dessa classe, ou seja, a provável variável a ser referenciada dentro do método 
pode nem mesmo ter sido criada ainda. 
Pág. 
 
11 MODIFICADORES JAVA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 71 
Outra importante característica é que não podemos usar a palavra chave this com métodos e variáveis 
estáticas, já que este é uma referência para o objeto que contém o método o qual não é verdadeiro para métodos e 
variáveis estáticas já que estes não pertencem a um objeto em particular, mas sim a classe. 
11.3.4 Transient 
É aplicado somente a variáveis. Quando uma variável é declarada transient ela não é guardada como parte 
do estado de persistência do objeto. 
11.3.5 Synchronized 
Esse modificador é usado para sincronizar o acesso a código em ambientes paralelos. Este modificador será 
visto detalhadamento onde veremos threads e métodos de sincronização. 
11.3.6 Volatile 
São aplicados somente a variáveis. Volatile permite que várias threads acessem simultaneamente a mesma 
variável. 
11.3.7 Native 
 Esse modificador é usado somente em métodos. Algumas vezes é necessário executar código não Java em 
aplicações. Quando desejamos acessar chamadas do Sistema Operacional, interfacear com dispositivos de 
hardware, reusar código não Java, implementar código onde o tempo é um parâmetro crítico e etc... 
11.4 Encapsulamento 
Uma das ideias mais importantes da orientação a objetos é o encapsulamento. Encapsular significa esconder 
a implementação dos objetos. O encapsulamento favorece principalmente dois aspectos de um sistema: a 
manutenção e o desenvolvimento. 
A manutenção é favorecida pois, uma vez aplicado o encapsulamento, quando o funcionamento de um objeto 
deve ser alterado, em geral, basta modificar a classe do mesmo. 
O desenvolvimento é favorecido pois, uma vez aplicado o encapsulamento, conseguimos determinar 
precisamente as responsabilidades de cada classe da aplicação. 
OBJETIVOS DO ENCAPSULAMENTOServe para ocultar os dados; evita que o usuário acesse membros que ele não precisa manipular; permite a 
modificação interna de uma classe sem alterar a sua funcionalidade e o modo como é acessada e é utilizado em 
Java através dos modificadores de acesso. 
Pág. 
 
11 MODIFICADORES JAVA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 72 
 
11.4.1 Métodos Getters e Setters 
 
Na linguagem Java, há uma convenção de nomenclatura para os métodos que têm como finalidade acessar 
ou alterar as propriedades de um objeto. 
Segundo essa convenção, os nomes dos métodos que permitem a consulta das propriedades de um objeto 
devem possuir o prefixo get. Analogamente, os nomes dos métodos que permitem a alteração das propriedades de 
um objeto devem possuir o prefixo set. 
Na maioria dos casos, é muito conveniente seguir essa convenção, pois os desenvolvedores Java já estão 
acostumados com essas regras de nomenclatura e o funcionamento de muitas bibliotecas do Java depende 
fortemente desse padrão. 
class Cliente { 
 
 // Atributos da classe 
 private String nome; 
 private String cpf; 
 
 // Métodos acessadores para os atributos da classe 
 
 public String getNome() { 
 return nome; 
 } 
 public void setNome(String nome) { 
 this.nome = nome; 
 } 
 public String getCpf() { 
 return cpf; 
 } 
 public void setCpf(String cpf) { 
 this.cpf = cpf; 
 } 
 
} 
 
IMPORTANTE 
Os métodos gets e sets são utilizados para permitir o acesso aos atributos (já que eles são private) de uma 
maneira controlada, a prática mais comum é criar dois métodos 
 
 
Pág. 
 
11 MODIFICADORES JAVA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 73 
11.5 Exercício 
 
1) Julgue V ou F os seguintes itens a seguir acerca dos modificadores de Java. 
 
( ) public: Uma classe declarada como pública dá as outras classes, de todos os pacotes, acesso aos seus membros 
que forem públicos também. 
 
( ) private: O membro da classe não pode ser acessado por nenhuma outra classe, quando é declarado private. 
Como não é visto pelas subclasses, não se aplica regras de overriding. Esse modificador não se aplica a classes, 
somente a seus membros (métodos e atributos). 
 
( ) protected: Quando um membro da classe é declarado assim, ele se torna acessível por classes do mesmo pacote 
ou através de herança. 
 
( ) abstract: Quando é aplicado à classe não permite estendê-la, nos métodos impede que o mesmo seja sobrescrito 
(overriding) na subclasse, já nas variáveis impossibilita que essa seja reinicializada com outro valor. 
 
( ) final: Classes declaradas como abstratas provém um modo de adiar a implementação de métodos também 
declarados como abstratos para subclasses. Uma classe abstrata não pode ser instanciada, ou seja, não podemos 
chamar os seus construtores. 
 
( ) static: Variáveis e métodos marcados como static pertencem à classe, ao invés de alguma instância dessa, esse 
modificador não se aplica a classes. 
 
( ) public : É o mais restritivo de todos. Atributos e métodos declarados como public em uma classe podem ser 
acessados pelos métodos da própria classe, por classes derivadas desta e por qualquer outra classe em qualquer 
outro pacote. 
 
( ) protected : Atributos e métodos definidos como protected são acessíveis pelos métodos da própria classe e pelas 
classes derivadas. 
 
 ( ) private : É o mais restritivo. Atributos e métodos declarados como private só podem ser acessados pelos 
métodos da própria classe. 
 
 ( ) A instrução final indica que a classe, método ou variável assim declarada têm uma única atribuição que se 
mantém constante, ou seja, não pode ser alterada no decorrer do processamento. 
Pág. 
 
11 MODIFICADORES JAVA 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 74 
( ) O nível de acesso protected é mais restritivo do que o nível de acesso private. 
( ) Os métodos declarados como public só podem ser acessados a partir dos métodos da própria classe ou de 
classes derivadas. 
 
2) Porque esse código não compila? 
class Teste { 
 
int x = 37; 
 
public static void main(String [] args) { 
 System.out.println(x); 
 } 
} 
R = 
 
3) Defina uma classe Funcionário com os atributos nome, cargo e salário. Na mesma classe, defina os métodos 
acessadores para garantir o encapsulamento dos atributos. Defina outra classe com o método main para 
criar objetos da classe Funcionário e executar os seus métodos. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Pág. 
 
12 EXCEÇÕES – CONTROLANDO OS ERROS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 75 
12 EXCEÇÕES – CONTROLANDO OS ERROS 
 
 Exceção é uma indicação de um problema que ocorre durante a execução de um programa. O nome 
“exceção” significa que o problema não ocorre frequentemente. Com o tratamento de exceções, um programa 
pode continuar executando (em vez de encerrar) depois de lidar com um problema. Uma exceção é um sinal que 
indica que algum tipo de condição excepcional ocorreu durante a execução do programa. Assim, exceções estão 
associadas a condições de erro que não tinham como ser verificadas durante a compilação do programa. 
As duas atividades associadas à manipulação de uma exceção são: 
geração: a sinalização de que uma condição excepcional (por exemplo, um erro) ocorreu, e 
captura: a manipulação (tratamento) da situação excepcional, onde as ações necessárias para a recuperação 
da situação de erro são definidas. 
 
Para cada exceção que pode ocorrer durante a execução do código, um bloco de ações de tratamento (um 
exception handler) deve ser especificado. O compilador Java verifica e enforça que toda exceção “não-trivial” tenha 
um bloco de tratamento associado. 
 
O mecanismo de manipulação de exceções em Java, embora apresente suas particularidades, teve seu 
projeto inspirado no mecanismo equivalente de C++, que por sua vez foi inspirado em Ada. É um mecanismo 
adequado à manipulação de erros síncronos, para situações onde a recuperação do erro é possível. 
 
A sinalização da exceção é propagada a partir do bloco de código onde ela ocorreu através de toda a pilha 
de invocações de métodos até que a exceção seja capturada por um bloco manipulador de exceção. Eventualmente, 
se tal bloco não existir em nenhum ponto da pilha de invocações de métodos, a sinalização da exceção atinge o 
método main(), fazendo com que o interpretador Java apresente uma mensagem de erro e aborte sua execução. 
 
12.1 Tratamento de exceções 
 
A captura e o tratamento de exceções em Java se dá através da especificação de blocos try, catch e finally, 
definidos através destas mesmas palavras reservadas da linguagem. 
 
A estruturação desses blocos obedece à seguinte sintaxe: 
try { 
// código que inclui comandos/invocações de métodos 
// que podem gerar uma situação de exceção. 
} 
catch (XException ex) { 
Pág. 
 
12 EXCEÇÕES – CONTROLANDO OS ERROS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 76 
// bloco de tratamento associado à condição de 
// exceção XException ou a qualquer uma de suas 
// subclasses, identificada aqui pelo objeto 
// com referência ex 
} 
catch (YException ey) { 
// bloco de tratamento para a situação de exceção 
// YException ou a qualquer uma de suas subclasses 
} 
finally { 
// bloco de código quesempre será executado após 
// o bloco try, independentemente de sua conclusão 
// ter ocorrido normalmente ou ter sido interrompida 
} 
onde XException e YException deveriam ser substituídos pelo nome do tipo de exceção. Os blocos não podem ser 
separados por outros comandos — um erro de sintaxe seria detectado pelo compilador Java neste caso. Cada bloco 
try pode ser seguido por zero ou mais blocos catch, onde cada bloco catch refere-se a uma única exceção. 
O bloco finally, quando presente, é sempre executado. Em geral, ele inclui comandos que liberam recursos que 
eventualmente possam ter sido alocados durante o processamento do bloco try e que podem ser liberados, 
independentemente de a execução ter encerrado com sucesso ou ter sido interrompida por uma condição de 
exceção. A presença desse bloco é opcional. Alguns exemplos de exceções já definidas no pacote java.lang incluem: 
 
ArithmeticException: indica situações de erros em processamento aritmético, tal como uma divisão inteira por 0. A 
divisão de um valor real por 0 não gera uma exceção (o resultado é o valor infinito); 
 
NumberFormatException: indica que tentou-se a conversão de uma string para um formato numérico, mas seu 
conteúdo não representava adequadamente um número para aquele formato. É uma subclasse de 
IllegalArgumentException; 
 
IndexOutOfBounds: indica a tentativa de acesso a um elemento de um agregado aquém ou além dos limites 
válidos. É a superclasse de ArrayIndexOutOfBoundsException, para arranjos, e de StringIndexOutOfBounds, para 
strings; 
 
NullPointerException: indica que a aplicação tentou usar uma referência a um objeto que não foi ainda definida; 
 
ClassNotFoundException: indica que a máquina virtual Java tentou carregar uma classe mas não foi possível 
encontrá-la durante a execução da aplicação. 
 
Além disso, outros pacotes especificam suas exceções, referentes às suas funcionalidades. Por exemplo, no 
pacote java.io define-se IOException, que indica a ocorrência de algum tipo de erro em operações de entrada e 
saída. É a superclasse para condições de exceção mais específicas desse pacote, tais como EOFException (fim de 
Pág. 
 
12 EXCEÇÕES – CONTROLANDO OS ERROS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 77 
arquivo ou stream), FileNotFoundException (arquivo especificado não foi encontrado) e InterruptedIOException 
(operação de entrada ou saída foi interrompida). 
Uma exceção contém pelo menos uma string que a descreve, que pode ser obtida pela aplicação do método 
getMessage(), mas pode eventualmente conter outras informações. Por exemplo, InterruptedIOException inclui um 
atributo público do tipo inteiro, bytesTransferred, para indicar quantos bytes foram transferidos antes da interrupção 
da operação ocorrer. Outra informação que pode sempre ser obtida de uma exceção é a seqüência de métodos no 
momento da exceção, obtenível a partir do método printStackTrace(). 
Como exceções fazem parte de uma hierarquia de classes, exceções mais genéricas (mais próximas do topo 
da hierarquia) englobam aquelas que são mais específicas. Assim, a forma mais genérica de um bloco try-catch é 
try { ... } 
catch (Exception e) { ... } 
 
pois todas as exceções são derivadas de Exception. Se dois blocos catch especificam exceções em um mesmo ramo 
da hierarquia, a especificação do tratamento da exceção derivada deve preceder aquela da mais genérica. 
 
12.2 Erros e Exceções de runtime 
 
Exceções consistem de um caso particular de um objeto da classe Throwable. Apenas objetos dessa classe 
ou de suas classes derivadas podem ser gerados, propagados e capturados através do mecanismo de tratamento de 
exceções. 
Além de Exception, outra classe derivada de Throwable é a classe Error, que é a raiz das classes que 
indicam situações que a aplicação não tem como ou não deve tentar tratar. Usualmente indica situações anormais, 
que não deveriam ocorrer. Entre os erros definidos em Java, no pacote java.lang, estão StackOverflowError e 
OutOfMemoryError. São situações onde não é possível uma correção a partir de um tratamento realizado pelo 
próprio programa que está executando. 
Há também exceções que não precisam ser explicitamente capturadas e tratadas. São aquelas derivadas de 
RuntimeException, uma classe derivada diretamente de Exception. São exceções que podem ser geradas durante a 
operação normal de uma aplicação para as quais o compilador Java não irá exigir que o programador proceda a 
algum tratamento (ou que propague a exceção, como descrito na Seção 2.6.3). Entre essas incluem-se 
ArithmeticException, IllegalArgumentException, IndexOutOfBoundsException e NullPointerException. 
 
12.3 Propagando exceções 
 
Embora toda exceção que não seja derivada de RuntimeException deva ser tratada, nem sempre é possível 
tratar uma exceção no mesmo escopo do método cuja invocação gerou a exceção. Nessas situações, é possível 
propagar a exceção para um nível acima na pilha de invocações. Para tanto, o método que está deixando de capturar 
e tratar a exceção faz uso da cláusula throws na sua declaração: 
Pág. 
 
12 EXCEÇÕES – CONTROLANDO OS ERROS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 78 
 
void métodoQueNãoTrataExceção() throws Exception { 
invoca.métodoQuePodeGerarExceção(); 
} 
 
Nesse caso, métodoQueNãoTrataExceção() reconhece que em seu corpo há a possibilidade de haver a 
geração de uma exceção mas não se preocupa em realizar o tratamento dessa exceção em seu escopo. Ao 
contrário, ele repassa essa responsabilidade para o método anterior na pilha de chamadas. 
 
Eventualmente, também o outro método pode repassar a exceção adiante. Porém, pelo menos no método 
main() as exceções deverão ser tratadas ou o programa pode ter sua interpretação interrompida. 
 
12.4 Definindo e gerando exceçoes 
 
Exceções são classes. Assim, é possível que uma aplicação defina suas próprias exceções através do 
mecanismo de definição de classes. 
 
Por exemplo, considere que fosse importante para uma aplicação diferenciar a condição de divisão por zero 
de outras condições de exceções artiméticas. Neste caso, uma classe DivideByZeroException poderia ser criada: 
 
public class DivideByZeroExceptionextends ArithmeticException { 
 
public DivideByZeroException() { 
super("O denominador na divisão inteira tem valor zero"); 
 } 
 
} 
Neste caso, o argumento para o construtor da superclasse especifica a mensagem que seria impressa 
quando o método getMessage() fosse invocado para essa exceção. Essa é a mesma mensagem que é apresentada 
para um RuntimeException que não é capturado e tratado. 
Para gerar uma condição de exceção durante a execução de um método, um objeto dessa classe deve ser 
criado e, através do comando throw, propagado para os métodos anteriores na pilha de execução: 
 
public double calculaDivisao (double numerador, int denominador) 
throws DivideByZeroException { 
if (denominador == 0) 
throw new DivideByZeroException(); 
return numerador / denominador; 
} 
 
Pág. 
 
12 EXCEÇÕES – CONTROLANDO OS ERROS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 79 
O mesmo comando throw pode ser utilizado para repassar uma exceção após sua captura—por exemplo, 
após um tratamento parcial da condição de exceção: 
public void usaDivisao() throws DivideByZeroException { 
... 
try { 
d = calculaDivisao(x, y); 
} 
catch (DivideByZeroException dbze) { 
... 
throw dbze; 
} 
... 
} 
Nesse caso, a informação associada à exceção (comoo seu ponto de origem, registrado internamente no 
atributo do objeto que contém a pilha de invocações) é preservada. Caso fosse desejado mudar essa informação, 
uma nova exceção poderia ser gerada ou, caso a exceção seja a mesma, o método fillInStackTrace() poderia ser 
utilizado, como em 
throw dbze.fillInStackTrace(); 
12.5 Hierarquia de exceções Java 
 As classes de exceção herdam direta ou indiretamente da classe Exception, formando uma 
hierarquia de herança. Pode estender essa hierarquia com suas próprias classes de exceção.A figura 
abaixo mostra uma pequena parte da hierarquia de herança da classe Throwable (uma subclasse de 
Object), que é a superclasse da classe Exception. Somente objetos Throwable podem ser utilizados com o 
mecanismo de tratamento de exceções. A classe Throwable tem duas subclasses: Exception e Error. A 
classe Exception e suas subclasses representam situações excepcionais que podem ocorrer em um 
programa Java. Essas subclasses podem ser capturadas e tratadas pelo aplicativo. A classe Error e suas 
subclasses representam situações anormais que podem acontecer na JVM. 
Pág. 
 
12 EXCEÇÕES – CONTROLANDO OS ERROS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 80 
 
Pág. 
 
THREADS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 81 
13 THREADS 
 
13.1 Conceito de Threads 
Se pensarmos nos programas que utilizamos comumente no dia a dia, conseguiremos chegar a seguinte 
conclusão: um programa executa um conjunto de tarefas relativamente independentes entre si. Por exemplo, um 
navegador pode baixar vários arquivos diferentes além de permitir a navegação. Um software de visualização de 
vídeos além de reproduzir imagens também reproduzir sons. 
Se pensarmos em sistemas corporativos, também chegamos na mesma conclusão: um sistema corporativo 
executa um conjunto de tarefas relativamente independentes entre si. Por exemplo, dois ou mais usuários acessando 
o mesmo sistema para fazer coisas diferentes. 
Neste sentido uma thread trabalha como um subsistema, sendo uma forma de um processo se autodividir em 
duas ou mais tarefas. É o termo em inglês para Linha ou Encadeamento de Execução. 
O conceito de thread está intimamente ligado ao conceito de processo, assim é fundamental entender o que são 
processos, como eles são representados e colocados em execução pelo Sistema Operacional, para em seguida 
entender as threads. 
Dessa forma segue uma breve definição de Processo e posteriormente a de Thread. 
 
 
Definição de Processo 
“Um processo é basicamente um programa em execução, sendo constituído do código executável, dos dados 
referentes ao código, da pilha de execução, do valor do contador de programa (registrador PC), do valor do 
apontador do apontador de pilha (registrador SP), dos valores dos demais registradores do hardware, além de um 
conjunto de outras informações necessárias à execução dos programas.” Tanenbaum 
 
 
Definição de Thread 
“Thread, ou processo leve, é a unidade básica de utilização da CPU, consistindo de : contador de programa, conjunto de 
registradores e uma pilha de execução. Thread são estruturas de execução pertencentes a um processo e assim compartilham os 
segmentos de código e dados e os recursos alocados ao sistema operacional pelo processo. O conjunto de threads de um 
processo é chamado de Task e um processo tradicional possui uma Task com apenas uma thread.” Silberschatz 
 
 
Pág. 
 
THREADS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 82 
 
 Paralelismo x Concorrência 
Threads podem executar suas funções de forma paralela ou concorrente, onde quando as threads são 
paralelas elas desempenham o seus papeis independente uma das outras. Já na execução concorrente, as threads 
atuam sobre objetos compartilhados de forma necessitando de sincronismo no acesso a esses objetos, assim deve 
ser garantido o direito de atomicidade e exclusão mútua nas operações das threads sobre objetos compartilhados. 
13.2 Ciclo de Vida de uma Thread 
Durante a vida de uma thread ela pode estar em vários estados, conforme pode ser visto abaixo. 
 
 
13.2.1 Criando Threads 
A criação de uma thread é feita através do chamado ao seu construtor colocando a thread no estado Nova, o 
qual representa uma thread vazia, ou seja, nenhum recurso do sistema foi alocado para ela ainda. Quando uma 
thread está nesse estado a única operação que pode ser realizada é a inicialização dessa thread através do método 
start(), se qualquer outro método for chamado com a thread no estado Nova irá acontecer uma exceção 
(IllegalThreadStateException), assim como, quando qualquer método for chamado e sua ação não for condizente 
com o estado atual da thread. 
Pág. 
 
THREADS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 83 
13.2.2 Iniciando Threads 
A inicialização de uma thread é feita através do método start() e nesse momento os recursos necessários 
para execução da mesma são alocados, tais como recursos para execução, escalonamento e chamada do método 
run da thread. 
13.2.3 Fazendo Thread Esperar 
Uma thread irá para o estado Esperando quando: 
 
 O método sleep (faz a thread esperar por um determinada tempo) for chamado; 
 O método wait (faz a thread esperar por uma determinada condição) for chamado; 
 Quando realizar solicitação de I/O. 
13.2.4 Finalizando Threads 
Uma Thread é finalizada quando acabar a execução do seu método run, e então ela vai para o estado Morta, 
onde o Sistema de Execução Java poderá liberar seus recursos e eliminá-la . 
13.2.5 Verificando se Threads estão Executando/Pronta/Esperando ou Novas/Mortas 
 
A classe Thread possui o método isAlive, o qual permite verificar se uma thread está nos estado 
Executando/Pronta/Esperando ou nos estados Nova/Morta. Quando o retorno do método for true a thread esta 
participando do processo de escalonamento e o retorno for false a thread está fora do processo de escalonamento. 
Não é possível diferenciar entre Executando, Pronta ou Esperando, assim também como não é possível diferenciar 
entre Nova ou Morta. 
13.3 Implementando Threads em java 
Podemos, em Java, facilmente criar uma classe que tem um método que vai ser executado 
concorrentemente com o seu main. Para isso, você precisa implementar a interface Runnable, que define o método 
run. 
 
class ThreadTeste 
{ 
 public static void main (String args[]) 
 { 
 ThreadInterface tiJ = new ThreadInterface(); 
 Thread thread = new Thread(tiJ); 
 thread.start(); 
 } 
} 
// Classe que implementa a interface Runnable 
Pág. 
 
THREADS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 84 
public class ThreadInterface implements Runnable { 
 public void run() 
 { 
 for (int i=0; i<100; i++) { 
 System.out.println(" Contador --> "+i); 
 } 
 } 
} 
Como a classe Thread implementa Runnable, é possível criar uma subclasse de Threads e reescrever o run, 
que na classe Thread não faz nada, conforme exemplo abaixo: 
package threads; 
 
class MinhaThread extends Thread 
{ 
 public MinhaThread(String nome){ 
 super(nome); 
 } 
 
 public void run(){ 
 
 for (int i=0; i<10; i++) 
 { 
 System.out.println(getName()+ " - " +i ); 
 } 
 } 
 
} 
package threads; 
 
public class Teste { 
 public static void main(String args[]){ 
 MinhaThread a,b; 
 a = new MinhaThread("Joao"); 
 b = new MinhaThread("Jose"); 
 a.start();b.start(); 
 } 
} 
 
 
Threads: Alguns métodos 
 
• public static native void yield() 
– faz uma suspensão temporária da execução da Thread e permite que outra execute. 
 
• public static native void sleep(long millis) throws InterruptedException 
– faz a corrente threat em execução “dormir” por um período de tempo (cessa a execução temporariamente) por um 
número de milisegundos específico. 
– Throws: caso outra thread tenha interrompido esta thread. 
 
• public native synchronized void start() 
– causa o início da execução da thread. A Java Virutal Machine chama o método run para a thread. 
– Throws: IilegalThreadStateException ocorre caso a thread já tenha sido iniciada. 
Pág. 
 
THREADS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 85 
 
• public void run() 
– Se essa thread tenha sido construída usando um objeto Runnable, então o método run deste objeto será chamado. 
Caso contrário nada é executado e retorna. 
 
• public final void stop() 
– força a thread para a execução. 
 
• public final void setPriority (int newPriority) 
– muda a prioridade de uma thread. 
 
• public final int getPriority() 
– retorna a prioridade da thread 
 
• public final void setName (String name) 
– muda o nome da thread para o novo nome 
 
• public final String getName() 
– retorna o nome da thread 
Threads Daemon 
São threads que rodam em background e realizam tarefas de limpeza ou manutenção, as quais devem rodar 
enquanto a aplicação estiver em execução, as threads daemons somente morrerem quando a aplicação for 
encerrada. Threads daemons são denominadas de Threads de Serviço e as não daemon são denominadas de 
Threads de Usuário. 
Os métodos para manipulação de threads daemon são: 
public final void setDaemon(boolean) Torna ou não uma thread daemon 
public final boolean isDaemon() Verifica se uma thread é daemon 
13.4 Escalonamento de Threads 
O escalonamento é fundamental quando é possível a execução paralela de threads, pois, certamente 
existirão mais threads a serem executadas que processadores, assim a execução paralela de threads é simulada 
através de mecanismos do escalonamento dessas threads, onde os processadores disponíveis são alternados pelas 
diversas threads em execução. O mecanismo de escalonamento utilizado pelo Sistema de Execução Java é bastante 
simples e determinístico, e utiliza um algoritmo conhecido como Escalonamento com Prioridades Fixas, o qual 
escalona threads baseado na sua prioridade. As threads escalonáveis são aquelas que estão nos estados 
Executando ou Pronta, para isso toda thread possui uma prioridade, a qual pode ser um valor inteiro no intervalo 
[MIN_PRIORITY ... MAX_PRIORITY], (estas são constantes definidas na classe Thread), e quanto maior o valor do 
inteiro maior a prioridade da thread. Cada thread Nova recebe a mesma prioridade da thread que a criou e a 
prioridade de uma thread pode ser alterada através do método setPriority(int priority). 
 
Exemplo de aplicação usando threads com diferentes prioridades 
Pág. 
 
THREADS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 86 
Observe que essa corrida não é justa pois os sapos 4 e 5 possuem prioridades máximas e com certeza 
ganharão a corrida. 
Exemplo1: 
/* Aplicação que simula uma corrida de sapos usando threads */ 
public class CorridaDeSapos { 
 
 final static int NUM_SAPOS = 5; // QTE. de sapos na corrida 
 final static int DISTANCIA = 500; // Distância da corrida em cm 
 public static void main (String[] args) { 
 
 /* Criando as threads para representar os sapos correndo */ 
 SapoCorrendoThread sapo_1 = new SapoCorrendoThread("SAPO_01", DISTANCIA); 
 SapoCorrendoThread sapo_2 = new SapoCorrendoThread("SAPO_02", DISTANCIA); 
 SapoCorrendoThread sapo_3 = new SapoCorrendoThread("SAPO_03", DISTANCIA); 
 SapoCorrendoThread sapo_4 = new SapoCorrendoThread("SAPO_04", DISTANCIA); 
 SapoCorrendoThread sapo_5 = new SapoCorrendoThread("SAPO_05", DISTANCIA); 
 
 /* Estabelecendo prioridades para as threads */ 
 sapo_1.setPriority(Thread.MIN_PRIORITY); 
 sapo_2.setPriority(Thread.MIN_PRIORITY); 
 sapo_3.setPriority(Thread.NORM_PRIORITY); 
 sapo_4.setPriority(Thread.MAX_PRIORITY); 
 sapo_5.setPriority(Thread.MAX_PRIORITY); 
 
 /* Iniciando as threads */ 
 sapo_1.start(); 
 sapo_2.start(); 
 sapo_3.start(); 
 sapo_4.start(); 
 sapo_5.start(); 
 } 
} 
 
Simulação de uma Corridas de Sapos, onde cada sapo na corrida é representado por uma 
thread. 
Exemplo2: 
public class CorridaDeSapos2 { 
 final static int NUM_SAPOS = 5; // QTE. de sapos na corrida 
 final static int DISTANCIA = 500; // Distância da corrida em cm 
 
 public static void main (String[] args) { 
 /* colocando sapos na corrida */ 
 for (int i = 1; i <= NUM_SAPOS; i++) { 
 new SapoCorrendoThread("SAPO_" + i, DISTANCIA).start(); 
 } 
 } 
} 
Pág. 
 
THREADS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 87 
 
Classe SapoCorrendoThread utilizada pelas duas classes dos exemplos acima. 
 
class SapoCorrendoThread extends Thread { 
 
 String nome; // nome do sapo 
 int distanciaCorrida = 0; // distância já corrida pelo sapo 
 int distanciaTotalCorrida; // distância a ser corrida pelo sapo 
 int pulo = 0; // pulo do sapo em cm 
 int pulos = 0; // quantidades de pulos dados na corrida 
 static int colocacao = 0; // colocação do sapo ao final da corrida 
 final static int PULO_MAXIMO = 50; // pulo máximo em cm que um sapo pode dar 
 /** Construtor da classe. Parâmtros : Nome do Sapo e Distância da Corrida */ 
 
 public SapoCorrendoThread (String nome, int distanciaTotalCorrida) { 
 /* chamando o construtor de Thread passando o nome do sapo como parâmetro */ 
 super(nome); 
 this.distanciaTotalCorrida = distanciaTotalCorrida; 
 this.nome = nome; 
 } 
 
 /** Imprime o último pulo do sapo e a distância percorrida */ 
 public void sapoImprimindoSituacao () { 
 System.out.println("O " + nome + " pulou " + pulo + "cm \t e já percorreu " + 
 distanciaCorrida + "cm"); 
 } 
 
 /** Faz o sapo pular */ 
 public void sapoPulando() { 
 pulos++; 
 pulo = (int) (Math.random() * PULO_MAXIMO); 
 distanciaCorrida += pulo; 
 if (distanciaCorrida > distanciaTotalCorrida) { 
 distanciaCorrida = distanciaTotalCorrida; 
 } 
 } 
 
 /** Representando o descanso do sapo */ 
 public void sapoDescansando () { 
 /* Método que passa vez a outras threads */ 
 yield(); 
 } 
 
 /** Imprime a colocação do sapo ao final da corrida */ 
 public void colocacaoSapo () { 
 colocacao++; 
 System.out.println(nome + " foi o " + colocacao + "º colocado com " + pulos + " 
pulos"); 
 } 
 
 /** Método run da thread Corrida de Sapos */ 
 public void run () { 
 while (distanciaCorrida < distanciaTotalCorrida) { 
Pág. 
 
THREADS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 88 
 sapoPulando(); 
 sapoImprimindoSituacao(); 
 sapoDescansando(); 
 } 
 colocacaoSapo(); 
 } 
} 
 
13.5 Exercícios 
 
a) Defina a classe Contador como uma subclasse de Thread, que imprime números de 0 a 10. Crie a classe 
TesteContador que deve definir o método main que cria e inicia a execução do thread Contador. Teste o 
resultado executando a classe TesteContador. 
 
b) Altere as classes Contador e TesteContador de modo que a classe Contador seja definida como uma 
implementação da interface Runnable. Teste o resultado. 
 
Pág. 
 
14 API JAVA - JAVA.IO 
 
 
 
JAVA OO LOGUSTI – TREINAMENTOEM INFORMÁTICA PÁGINA 89 
14 API JAVA - JAVA.IO 
A linguagem Java é capaz de processar arquivos que requisitam grandes quantidades de dados persistentes. 
Esses são os dados que ficam armazenados dentro dos arquivos, sendo que a sua duração vai além da finalização 
de um programa. Esse processamento de arquivos é uma capacidade que o Java oferece para ler e gravar dados na 
memória, arquivos e conexões de rede. 
Quando existe um dispositivo de entrada de dados ativo, para obter dados deste dispositivo é usada uma 
ação conhecida como read(). E para enviar um dado para um dispositivo de saída é utilizado o método write(). 
Para trabalhar com entrada e saída de dados são utilizadas as classes que estão dentro do java.io. Essas 
classes oferecem algumas funcionalidades como: 
 Manipulação de entrada e saída de bytes – transferência de dados binários; 
 Manipulação de entrada e saída de caracteres – transferência de textos; 
 Buffers - melhoram a eficiência da velocidade de leitura e escrita; 
 Conversão de formatos – texto e formato interno de dados binários. 
As entradas e saídas de dados são manipuladas como sequência de bytes, através das classes 
InputStream e OutputStream e as classes dependentes. 
 
14.1 Classe InputStream 
É uma classe abstrata que oferece a funcionalidade básica para a leitura de um byte ou de uma sequência 
de bytes a partir de alguma fonte. 
Pág. 
 
14 API JAVA - JAVA.IO 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 90 
14.2 Lendo um arquivo 
Os métodos read() oferecem a leitura de bytes. O valor de retorno desse método é um inteiro, que pode ser o 
byte lido do próprio método ou número de bytes lidos do método read(byte[] b) sendo que quando o retorno for o 
valor de -1, é informado que o final do arquivo foi atingindo. 
 InputStream is = new FileInputStream("arquivo.txt"); 
 int valor = is.read(); 
Exemplo 1 
No exemplo acima, a classe abstrata InputStream é declarada inicializando uma classe dependente, a 
FileInputStream. Essa classe recebe uma String como argumento no construtor. Esse argumento é a definição de 
onde está localizado o arquivo. 
 
 
Pág. 
 
14 API JAVA - JAVA.IO 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 91 
Então as principais subclasses de InputStream são: 
 ByteArrayInputStream – Valores são originários de um arranjo de bytes; 
 FileInputStream – Bytes com originalidade de um arquivo. 
 FilterInputStream – Filtra os dados de um InputStream. 
 BufferedInputStream – Faz a leitura de grandes volumes de bytes que armazena em um buffer interno. 
 DataInputStream – Permite a leitura de representações binárias dos tipos primitivos de Java. 
 ObjectInputStream – Oferece o método readObject para a leitura de objetos que foram serializados para um 
ObjectOutputStream. 
 PipedInputStream – Faz a leitura de um pipe de bytes cuja origem está associada a um objeto 
PipedOutputStream. 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
 
public class TestaEntrada { 
 
 public static void main(String[] args) throws IOException{ 
 
 InputStream is = System.in; 
 System.out.print("Digite um texto: "); 
 
 InputStreamReader isr = new InputStreamReader(is); 
 BufferedReader br = new BufferedReader(isr); 
 
 String digitado = br.readLine(); 
 
 while(digitado != null){ 
 System.out.println("Texto Digitado = "+digitado); 
 digitado = br.readLine(); 
 } 
 
 } 
} 
Exemplo 2 
Pág. 
 
14 API JAVA - JAVA.IO 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 92 
14.3 OutputStream 
É uma classe abstrata que transfere sequencialmente os bytes para algum destino. Os métodos write(), tem 
a função de escrever em forma de bytes para o destino onde vai enviar. 
 
Subclasses OutputStream 
As classes abstratas Reader e Writer se envolvem na manipulação de arquivos (leitura e escrita) que 
contém caracteres. 
14.4 Reader 
É uma classe abstrata sendo igual à InputStream, é voltada para a manipulação de caracteres. Nessa classe 
não é possível criar objetos diretos dela. Para criar objetos é necessário instanciar uma das subclasses concretas 
para ter o acesso à funcionalidade especificada por Reader. 
14.5 Writer 
É uma classe abstrata que escreve stream de caracteres. Os únicos métodos que uma subclasse writer deve 
implementar são: write(char [], int, int), flush () e close (). 
 
Subclasses da classe Writer 
Pág. 
 
14 API JAVA - JAVA.IO 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 93 
14.6 Buffers 
São entidades intermediárias entre duas ou mais entidades que produzem e consomem elementos. No Buffer 
existe uma área de memória que é utilizada para armazenamento temporário dos elementos que foram produzidos 
mas ainda não foram consumidos. 
Para aprendizado abaixo é mostrado um exemplo do que o código faz a criação e leitura do arquivo 
declarado dentro do construtor da classe File. 
A classe abaixo cria e lê o arquivo texto "ArquivoCriado.txt". 
import java.io.File; 
import java.io.IOException; 
import java.io.FileWriter; 
import java.io.FileReader; 
import java.io.BufferedWriter; 
import java.io.BufferedReader; 
 
class Cria_e_Le_Arquivo { 
 public static void main(String args[]) { 
 
 File f = new File("ArquivoCriado.txt"); 
 
 try { 
 FileWriter fw = new FileWriter(f); 
 BufferedWriter bw = new BufferedWriter(fw); 
 
 bw.write("Esse texto está sendo inserido"); 
 
 //INSERE UMA NOVA LINHA 
 bw.newLine(); 
 
 bw.write("Continua sendo inserido em uma nova linha"); 
 
 bw.newLine(); 
 
 bw.write("Continua sendo inserido em uma 3ª linha"); 
 
 bw.flush(); 
 bw.close(); 
 
 } catch (IOException e) { 
 e.printStackTrace(); 
 } 
 
 //EFETUANDO A LEITURA 
 try { 
 FileReader fr = new FileReader(f); 
 BufferedReader br = new BufferedReader(fr); 
 String s; 
Pág. 
 
14 API JAVA - JAVA.IO 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 94 
 
 //ENQUANTO EXISTE DADOS CONTINUA IMPRIMINDO 
 while ((s = br.readLine()) != null) { 
 System.out.println(s); 
 } 
 } catch (IOException e) { 
 System.out.println("###### Erro: "+e.getMessage()); 
 e.printStackTrace(); 
 } 
 } 
} 
Apenas vale lembrar que quando executado o código mostrado acima, é criado um arquivo chamado 
ArquivoCriado.txt dentro do projeto e com as saídas que foram dadas ao BufferedWriter. Efetue o teste achando esse 
arquivo e consulte se os valores que foram inseridos no programa são os mesmo que estão no arquivo. 
IMPORTANTE 
A partir do Java 5, foi criada a classe java.util.Scanner, que facilita bastante o trabalho de ler de um InputStream. 
Além disso, a classe PrintStream possui um construtor que já recebe o nome de um arquivo como argumento. Dessa 
forma, a leitura do teclado com saída para um arquivo ficou muito simples: 
 
Scanner s = new Scanner(System.in); 
PrintStream ps = new PrintStream("arquivo.txt"); 
while (s.hasNextLine()) { 
 ps.println(s.nextLine()); 
} 
A classe Scanner é do pacote java.util. Ela possui métodos muito úteis para trabalhar com Strings, em especial, 
diversos métodos já preparados para pegar números e palavras já formatadas através de expressões regulares. Fica 
fácil parsear um arquivo com qualquer formato dado. 
 
14.7 Exercíciosa) Faça um programa em Java que leia um texto informado pelo usuário no console e que salve o texto 
informado em um arquivo qualquer. 
Pág. 
 
15 COLLECTIONS FRAMEWORK 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 95 
15 COLLECTIONS FRAMEWORK 
 
15.1 – Introdução 
 
Quando uma aplicação precisa manipular uma quantidade grande de dados, ela deve utilizaralguma estrutura 
de dados. Podemos dizer que a estrutura de dados mais básica do Java são os arrays. Entretanto, trabalhar 
diretamente com arrays não é simples dado as diversas limitações que eles possuem. A limitação principal é a 
capacidade fixa, um array não pode ser redimensionado. Se todas as posições de umarray estiverem ocupadas não 
podemos adicionar mais elementos. Normalmente, criamos um outro array com maior capacidade e transferimos os 
elementos do array antigo para o novo. 
Além disso, adicionar ou remover elementos provavelmente gera a necessidade de deslocar parte do 
conteúdo do array. 
Para facilitar a manipulação de dados por meio das estruturas de dados, java possui a API Collection. 
 
15.2 – Tipos de Coleções 
 
 Existem várias coleções diferentes. Elas diferem, por exemplo, nos mecanismos de armazenagem usados, 
na maneira que acessam, dados e nas regras sobre quais dados podem ser armazenados. A API Collections 
oferecem uma variedade de interfaces e algumas classes de implementação concreta cobrindo essas variações. 
Uma interface geral, java.util.Collection, define a estrutura básica de coleções. Essa interface estipula os 
métodos que permitem a você acrescentar itens, remover itens, determinar se eles estão na coleção e contar a 
quantidade de itens na coleção. 
Algumas coleções são ordenadas; isto é, há uma clara noção de um item seguindo um outro. Uma coleção 
desse tipo, normalmente é conhecida como uma lista ou uma seqüência. Em algumas listas, a ordem é uma ordem 
em que os itens são acrescentados à coleção; em outras os próprios elementos parecem ter uma ordem natural, e 
aquela ordem é entendida pela lista. Na API Collections de Java, a interface java.util.List define uma estrutura 
básica para coleções desse tipo. 
Se uma coleção impõe a condição específica que ela não pode conter o mesmo valor mais do que uma vez, 
então ela é conhecida como um set(conjunto). A interface java.util.Set define a estrutura básica desse tipo de 
coleção. 
O tipo final de comportamento especializado, diretamente suportado pelas API Collectiosn é conhecido como 
uma map(mapa), java.util.Map. Um mapa usa um conjunto de valores-chave para buscar, ou indexar, os dados 
armazenados. Por exemplo, se você armazenar um objeto representando uma pessoa, então como valor chave você 
Pág. 
 
15 COLLECTIONS FRAMEWORK 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 96 
pode usar o nome daquela pessoa ou algum outro identificador único, como um número de seguro social ou um 
número de identificação de funcionário. É uma exigência para um mapa que a chave seja única, e por esse motivo, 
se você estiver armazenando dados sobre uma pessoa em um mapa, o nome não é uma chave muito boa – é bem 
possível que duas pessoas tenham o mesmo nome. A interface Map não herda a interface Collection! 
 
 
Collection 
Set – Sem repetição 
List – Com repetição/ordenação 
Coleção Map – Par/Valor 
 
Tanto a interface List como a interface Set herdam a interface Collection que define métodos para adicionar e 
remover um elemento, verificar se ele está na coleção e outras operações, alguns métodos da interface collection: 
 
Nome do Método Descrição 
boolean add(Object) Adiciona um elemento na coleção. Como algumas coleções não suportam 
elementos duplicados, este método retorna true ou false indicando se a 
adição foi efetuada com sucesso. 
boolean remove(Object) Remove determinado elemento da coleção. Se ele não existia, retorna 
false. 
int size() Retorna a quantidade de elementos existentes na coleção. 
boolean contains(Object) Procura por determinado elemento na coleção, e retorna verdadeiro caso 
ele exista. Esta comparação é feita baseando-se no método equals() do 
objeto, e não através do operador ==. 
Iterator iterator() Retorna um objeto que possibilita percorrer os elementos daquela 
coleção. 
 
Antes de começarmos a codificar alguns exemplos de como utilizar as collections, vamos tomar como base a 
classe abaixo: 
 
 
public class Livro { 
 
 // Atributos da classe 
 private String titulo; 
 private String editora; 
Pág. 
 
15 COLLECTIONS FRAMEWORK 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 97 
 
 // Método construtor sem parâmetros 
 Livro() { } 
 
 // Método construtor com parâmetros 
 Livro(String titulo, String editora) { 
 this.titulo = titulo; 
 this.editora = editora; 
 } 
 
 // Métodos acessadores 
 public String getEditora() { 
 return this.editora; 
 } 
 public void setEditora(String editora) { 
 this.editora = editora; 
 
 } 
 public String getTitulo() { 
 return this.titulo; 
 } 
 public void setTitulo(String editora) { 
 this.editora = editora; 
 } 
} 
 
 
Exemplo utilizando os Arrays 
 
 
public class TesteArray { 
 
 public static void main(String args[]) { 
 // Criando o array com três posições 
 Livro[] livros = new Livro[3]; 
 
 // Populando o array 
 livros[0] = new Livro("Java: Como Programar", "Bookman"); 
 livros[1] = new Livro("Tutorial do JEE", "Campus"); 
 livros[2] = new Livro("Core Java 2: Fundaments", "Makron Books"); 
 
 // Percorrendo e imprimindo os elementos do array 
 for( int i = 0; i < livros.length ; i++ ) { 
 System.out.println("Titulo: " + livros[i].getTitulo() + "Editora: " + 
livros[i].getEditora() ); 
 } 
 } 
 
} 
 
Pág. 
 
15 COLLECTIONS FRAMEWORK 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 98 
15.2.1 – Lista 
É uma coleção que permite elementos duplicados e mantendo uma ordenação específica entre os 
elementos. Você tem garantia de que quando percorrer a lista, os elementos serão encontrados em uma ordem pré-
determinada, definida na hora da inserção dos elementos. 
A implementação mais famosa da interface List é a ArrayList, ela trabalha com um array interna para gerar uma lista 
portanto ela é mais rápida que sua concorrente, a LinkedList que é mais rápida na inserção e remoção de itens nas 
pontas. 
 
Exemplo utilizando uma ArrayList 
 
import java.util.ArrayList; 
 
public class TesteArrayList { 
 
 public static void main(String[] args) { 
 
 ArrayList<Livro> list = new ArrayList<Livro>(); 
 list.add(new Livro("Java: Como Programar", "Bookman")); 
 list.add(new Livro("Tutorial do JEE", "Campus")); 
 list.add(new Livro("Core Java 2: Fundaments", "Makron Books")); 
 
 for( int i = 0; i < list.size() ; i++ ) { 
 Livro tempLivro = (Livro) list.get(i); 
 System.out.println(tempLivro.getTitulo() ); 
 } 
 } 
} 
 
 
 
 
IMPORTANTE 
A partir do Java 5 existe o suporte à Generics que evitam alguns erros de casting e facilitam muito a vida do 
desenvolvedor. A interface Collection agora é parametrizada. Isto é, temos uma Collection<Tipo> que indica 
qual é o tipo que estamos trabalhando com essa coleção. Com isso definimos o que os métodos vão receber 
e devolver. Uma 
Collection<Tipo> tem métodos como contains(Tipo o) e add(Tipo o), o que nos da uma enorme segurança em 
tempo de compilação, evitando castings. No exemplo acima, o tipo definido para o Arraylist foi da classe 
Livro.Pág. 
 
15 COLLECTIONS FRAMEWORK 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 99 
15.2.2 – Conjunto 
 
Uma das principais características de um conjunto(Set) é o fato de que a ordem em que os elementos são 
armazenados. 
A ordem vai variar de implementação para implementação, as principais implementações de uma interface 
Set são as classes HashSet e ThreeSet. 
Quantos elementos serão adicionados no Set chamado conjunto no exemplo abaixo? 
 
package collections; 
 
import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Set; 
 
public class TesteConjunto { 
 
 public static void main(String[] args) { 
 
 // Criando a estrutura de conjunto 
 Set conjunto = new HashSet(); 
 
 // Populando a estrutura criada 
 conjunto.add("Elemento 1"); 
 conjunto.add("Elemento 2"); 
 conjunto.add("Elemento 3"); 
 conjunto.add("Elemento 3"); 
 conjunto.add("Elemento 4"); 
 } 
} 
 
 
15.2.3 – Mapas 
 
Os mapas trabalham associando chaves a valores, para quem já tem uma certa experiência com Java e já 
trabalho com arquivos properties vai ficar fácil assimilar esta interface. As principais implementações da interface 
Map são o HashMap e o HashTable. 
 
Exemplo utilizando um HashMap 
 
 
import java.util.HashMap; 
import java.util.Map; 
 
public class ExemploMapas { 
 
 public static void main(String args[]) { 
Pág. 
 
15 COLLECTIONS FRAMEWORK 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 100 
 
 // Criando a estrutura de mapas 
 Map<String, String> mapa = new HashMap<>(); 
 
 // Variável auxiliar 
 String pessoaNome; 
 // Populando o mapa 
 mapa.put( "pessoa.nome", "Gleidson Porto"); 
 mapa.put( "pessoa.idade", "35") ; 
 mapa.put( "pessoa.email", "gleidsonporto@gmail.com"); 
 mapa.put( "pessoa.site", "www.logusti.com.br") ; 
 
 // Pegando o nome da chave pessoa.nome do mapa 
 pessoaNome = (String)mapa.get("pessoa.nome"); 
 System.out.println("Nome: " + pessoaNome); 
 
 } 
 
}} 
 
O método put(Object, Object) da interface Map recebe a chave e o valor de uma nova associação, caso já 
exista uma associação para esta chave o método irá retornar o objeto associado a esta chave, e irá trocar o este 
objeto pelo novo objeto passado no método put. 
 
SAIBA MAIS 
Um mapa importante é a tradicional classe Properties, que mapeia strings e é muito utilizada para a configuração 
de aplicações. 
A Properties possui, também, métodos para ler e gravar o mapeamento com base em um arquivo texto, 
facilitando muito a sua persistência. 
Properties config = new Properties(); 
 
config.setProperty("database.login", "logusti"); 
config.setProperty("database.password", "g1o4a1"); 
config.setProperty("database.url","jdbc:mysql:/localhost/teste"); 
 
// muitas linhas depois... 
 
String login = config.getProperty("database.login"); 
String password = config.getProperty("database.password"); 
String url = config.getProperty("database.url"); 
DriverManager.getConnection(url, login, password); 
Repare que não houve a necessidade do casting para String no momento de recuperar os objetos associados. 
Isto porque a classe Properties foi desenhada com o propósito de trabalhar com a associação entre Strings. 
 
Pág. 
 
15 COLLECTIONS FRAMEWORK 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 101 
15.3 – Exercício 
 
a) Implemente uma classe em Java com as funcionalidades de uma agenda telefônica, associando um nome a 
um número telefônico. A classe deve possuir a interface abaixo: 
 
 
b) Crie um programa em Java para testar a classe AgendaTelefonica desenvolvida no exercício anterior. Teste 
a classe com pelo menos 5 contatos diferentes na agenda de telefones. 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 102 
RESPOSTAS DO EXERCÍCIOS 
 
LISTA DE EXERCÍCIOS 4.6 
 
a) Altere o programa AloMundo.Java para que ele imprima na tela todos os tipos primitivos de dados suportados pela 
linguagem Java. 
 
public class Exercicio_4_6_A { 
 
 public static void main(String[] args) { 
 System.out.println("*** Tipos primitivos do Java ****"); 
 System.out.println(); 
 System.out.println("Tipo - Bits - Bytes "); 
 System.out.println("byte - 8 - 1 "); 
 System.out.println("short - 16 - 2 "); 
 System.out.println("int - 32 - 4 "); 
 System.out.println("long - 64 - 8 "); 
 System.out.println("float - 32 - 4 "); 
 System.out.println("double - 64 - 8 "); 
 System.out.println("char - 16 - 2 "); 
 System.out.println("boolean - 1 - - "); 
 } 
} 
 
b) Altere o programa AloMundo para que ele imprima os parâmetros recebidos pela linha de comando de execução 
do programa. (Dica: são os valores do array args: args[0], args[1], etc.) 
public class Exercicio_4_6_B { 
 
 public static void main(String[] args) { 
 // Considerando que neste momento pelo conteúdo apresentado, pressupõe-se que 
tenha conhecimento 
 // em estruturas de laço de repetição. Sendo assim, o exercício será realizado da 
forma mais simples. 
 // Nos capítulos seguintes o aluno, descobrirá outra forma para eficiente para 
resolução deste exercício. 
 
 // Recebendo os três argumentos. 
 // Observe que o primeiro elemento do array começa na posição 0(zero). 
 String parametroRecebido1= args[0]; 
 String parametroRecebido2= args[1]; 
 String parametroRecebido3= args[2]; 
 
 // Imprimindo os parâmetros recebidos 
 System.out.println(parametroRecebido1); 
 System.out.println(parametroRecebido2); 
 System.out.println(parametroRecebido3); 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 103 
 } 
 
} 
 
c) Crie um programa que receba três argumentos da linha de comando e imprima-os na mesma linha, em ordem 
inversa. 
 
Exemplo: 
java Programa a1 a2 a3 
Saída: a3 a2 a1 
 
public class Exercicio_4_6_C { 
 
 public static void main(String[] args) { 
 // Considerando que neste momento pelo conteúdo apresentado, pressupõe-se que 
tenha conhecimento 
 // em estruturas d e laço de repetição. Sendo assim, o exercício será realizado 
da forma mais simples. 
 // Nos capítulos seguintes o aluno, descobrirá outra forma para eficiente para 
resolução deste exercício. 
 
 // Recebendo os três argumentos. 
 // Observe que o primeiro elemento do array começa na posição 0(zero). 
 String parametroRecebido1= args[0]; 
 String parametroRecebido2= args[1]; 
 String parametroRecebido3= args[2]; 
 
 // Imprimindo os parâmetros recebidos na ordem invertida 
 System.out.println(parametroRecebido3); 
 System.out.println(parametroRecebido2); 
 System.out.println(parametroRecebido1); 
 
 } 
 
} 
LISTA DE EXERCÍCIO 5.6 
a) Implemente um programa para calcular a área de um trapézio, onde: 
 
h = altura 
b = base menor 
B = base maior 
Área = (h . (b + B)) / 2 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class Exercicio_5_6_A { 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 104 
 public static void main(String[] args) { 
 
 // Para leitura do parâmetros do cálculo, utilizaremos a classe Scanner. 
 // Você verá em detalhes este recurso no tópico 6.6 Lendovalores do teclado da 
apostila. 
 
 // O objeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
 
 // Objeto para captura das informações 
 System.out.println("Cálculo da Área do Trapézio"); 
 Scanner linha = new Scanner(entrada); 
 
 // Realizando a leitura da altura. 
 System.out.print("Forneça a altura: "); 
 double altura = linha.nextDouble(); 
 
 // Realizando a leitura da base menor. 
 System.out.print("Forneça a base menor: "); 
 double baseMenor = linha.nextDouble(); 
 
 // Realizando a leitura da base maior. 
 System.out.print("Forneça a base maior: "); 
 double baseMaior = linha.nextDouble(); 
 
 // Calculando a fórmula para obter a área do trapézio 
 double area = (altura * (baseMenor + baseMaior))/2; 
 
 
 // Imprimindo a área calculada 
 System.out.println("A área do trapézio é " + area); 
 
 
 } 
 
} 
 
b) Faça o programa acima calcular utilizando valores de ponto flutuante e depois imprima na tela duas 
informações: 
 
Valor exato da área: 
Valor arredondado para inteiro: 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class Exercicio_5_6_B { 
 
 public static void main(String[] args) { 
 
 // Para leitura do parâmetros do cálculo, utilizaremos a classe Scanner. 
 // Você verá em detalhes este recurso no tópico 6.6 Lendo valores do teclado da 
apostila. 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 105 
 
 // O objeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
 
 // Objeto para captura das informações 
 System.out.println("Cálculo da Área do Trapézio"); 
 Scanner linha = new Scanner(entrada); 
 
 // Realizando a leitura da altura. 
 System.out.print("Forneça a altura: "); 
 double altura = linha.nextDouble(); 
 
 // Realizando a leitura da base menor. 
 System.out.print("Forneça a base menor: "); 
 double baseMenor = linha.nextDouble(); 
 
 // Realizando a leitura da base maior. 
 System.out.print("Forneça a base maior: "); 
 double baseMaior = linha.nextDouble(); 
 
 // Calculando a fórmula para obter a área do trapézio 
 double area = (altura * (baseMenor + baseMaior))/2; 
 
 
 // Imprimindo a área EXATA calculada do trapézio 
 System.out.println("A área exata do trapézio é " + area); 
 
 // Imprimindo a área calculada do trapézio arredondada 
 System.out.println("A área exata arredondada do trapézio é " + (int)area); 
 
 } 
 
} 
 
c) Calcule o valor das seguintes equações: 
a. 3 – 2 – 1 + 2 + 1 + 3 
b. 2 * 3 – 4 * 5 
c. 2 + 6 – 3 / 7 * 9 
d. 3 % 4 – 8 
 
public class Exercicio_5_6_C { 
 
 public static void main(String[] args) { 
 
 
 // Realizando os cálculos das equações 
 double resultadoA = 3 - 2 - 1 + 2 + 1 + 3; 
 double resultadoB = 2 * 3 - 4 * 5; 
 double resultadoC = 2 + 6 - 3 / 7 * 9; 
 double resultadoD = 3 % 4 - 8; 
 
 // Imprimindo o resultado das equações 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 106 
 System.out.println("Resultado das Equações"); 
 System.out.println(" a) 3 – 2 – 1 + 2 + 1 + 3 = " + resultadoA); 
 
 System.out.println(" b) 2 * 3 – 4 * 5 = " + resultadoB); 
 
 System.out.println(" c) 2 + 6 – 3 / 7 * 9 = " + resultadoC); 
 
 System.out.println(" d) 3 % 4 – 8 = " + resultadoD); 
 
 //Resultado da Execução 
 
 /*Resultado das Equações 
 a) 3 – 2 – 1 + 2 + 1 + 3 = 6.0 
 b) 2 * 3 – 4 * 5 = -14.0 
 c) 2 + 6 – 3 / 7 * 9 = 8.0 
 d) 3 % 4 – 8 = -5.0*/ 
 
 
 } 
 
} 
d) Indique qual o valor verdade das seguintes expressões: 
a. (1 > 2) // exemplo: false 
b. (8 == 8) // exemplo: true 
c. ((12 – 5) > 6) - FALSE 
d. (0 < 3) && (8 < 9) - TRUE 
e. ((i++) > i) - FALSE 
f. ((10 * 90 / 50 – 2) == 16) TRUE 
 
LISTA DE EXERCÍCIO 6.7 
 
1. Escreva um programa que imprima na tela a soma dos números ímpares entre 0 e 20 e a multiplicação dos 
números pares entre 0 e 20. 
 
public class Exercicio_6_7_1 { 
 
 public static void main(String[] args) { 
 // Variáveis criadas para armazenar os valores dos cálculos 
 int totalImpares=0; 
 // Será utilizado o tipo double porque o int possui limitação de tamanho 
 double totalPares=1; 
 
 // Laço de repetição de 0 a 20. 
 for (int numero=1; numero <= 19;numero++){ 
 // Número par 
 if (numero % 2 == 0){ 
 // Multiplicando os números pares 
 totalPares = totalPares * numero; 
 
 } else 
 // Somando os números ímpares 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 107 
 totalImpares = totalImpares + numero; 
 
 } 
 
 System.out.println("Total da soma dos números ímpares de 0 a 20: " + 
totalImpares); 
 
 System.out.println("Total da multiplicação dos números pares de 0 a 20: " + 
totalPares); 
 
 } 
 
} 
 
Execução 
Total da soma dos números ímpares de 0 a 20: 100 
Total da multiplicação dos números pares de 0 a 20: 1.8579456E8 
 
 
 
2. Faça um programa para ler um número do teclado e imprimir na tela se ele é par ou ímpar. 
 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class Exercicio_6_7_2 { 
 
 public static void main(String[] args) { 
 
 
 // O objeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 // Objeto para captura das informações 
 System.out.println("Digite um número"); 
 
 int numero = linha.nextInt(); 
 
 
 // Verificando se o número é par 
 if (numero % 2 == 0){ 
 
 System.out.println( numero + " é um número par. "); 
 
 } else 
 System.out.println( numero + " é um número ímpar. "); 
 
 } 
 
} 
 
 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 108 
3. O valor pago por um Hotel da Praia de Iracema para seus porteiros é de R$ 10,25 por hora de trabalho. Faça um 
programa que pergunte ao usuário quantas horas ele trabalhou e imprima na tela o valor do salário a ser recebido 
por ele. 
 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class Exercicio_6_7_3 { 
 
 public static void main(String[] args) { 
 
 // Valor da hora de trabalho 
 double valorHora = 10.25; 
 
 System.out.println("** Cálculo de Salário de Porteiro - Hotel da Praia de Iracema 
**"); 
 
 // O objeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 // Objeto para captura das informações 
 System.out.println("Digite a quantidade de horas: "); 
 
 // Capturando a quantidade de horas 
 double horas = linha.nextDouble(); 
 
 // Cálculo do salário 
 double salario = horas * valorHora; 
 
 // Imprimindo o salário 
 System.out.println( " Valor do salário: " + salario); 
 
 } 
 
} 
 
4. Modifique o programa anterior para que o sistema imprima uma mensagem de alerta quando o valor a ser pago 
ao funcionário seja inferior a R$ 50,00: "Atenção, dirija-se à direção do Hotel!". 
 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class Exercicio_6_7_4 { 
 
 public static void main(String[] args) { 
 
 // Valor da hora de trabalho 
 double valorHora = 10.25; 
 
 System.out.println("** Cálculo de Salário de Porteiro - Hotel da Praia de Iracema 
**"); 
 
 // Oobjeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 109 
 Scanner linha = new Scanner(entrada); 
 
 // Objeto para captura das informações 
 System.out.println("Digite a quantidade de horas: "); 
 
 // Capturando a quantidade de horas 
 double horas = linha.nextDouble(); 
 
 // Cálculo do salário 
 double salario = horas * valorHora; 
 
 // Condição estabelecida no exercício 
 if (salario <50 ) 
 System.out.println("Atenção, dirija-se à direção do Hotel!"); 
 else System.out.println( " Valor do salário: " + salario); 
 
 } 
 
} 
 
 
5. Sabendo que na LogusTI a média mínima é 7,0 e a tolerância de faltas é 15 % da carga horária do curso, faça 
uma classe com o método main que peça as informações necessárias e informe a situação do usuário. 
 
public class Exercicio_6_7_5 { 
 
 public static void main(String[] args) { 
 
 String situacao; 
 
 System.out.println("** RENDIMENTO DE ALUNO - LOGUSTI **"); 
 
 // O objeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 // Capturando as informações para cálculo do rendimento 
 System.out.print("Digite o nome do aluno: "); 
 String nome = linha.nextLine(); 
 
 System.out.print("Digite a nota de média do aluno: "); 
 double nota = linha.nextDouble(); 
 
 System.out.print("Digite o percentual(%) de falta do aluno: "); 
 double percFalta = linha.nextDouble(); 
 
 
 // Verificação do rendimento escolar 
 if (nota>=7.0 && percFalta<=15) 
 situacao = "APROVADO"; 
 else situacao = "REPROVADO"; 
 
 
 System.out.println("\n** RENDIMENTO DO ALUNO ** "); 
 System.out.println("Nome............: " + nome); 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 110 
 System.out.println("Nota de Média...: " + nota); 
 System.out.println("Faltas(%).......: " + percFalta); 
 System.out.println("Situação........: " + situacao ); 
 
 } 
 
} 
 
Exemplo da execução 
 
** RENDIMENTO DE ALUNO - LOGUSTI ** 
Digite o nome do aluno: Gleidson Porto 
Digite a nota de média do aluno: 10 
Digite o percentual(%) de falta do aluno: 0 
 
** RENDIMENTO DO ALUNO ** 
Nome............: Gleidson Porto 
Nota de Média...: 10.0 
Faltas(%).......: 0.0 
Situação........: APROVADO 
 
 
 
6. Implemente uma classe java “Calculos” com um método”calcularMedia” que receba três números e calcule a 
média e imprima na tela essa média. O método “calcularMaior”, deverá receber também três números e retornar o 
maior número e o método “calcularMenor”, deverá receber três números e retornar o melhor número. Implemente a 
classe com o método main e instancie a classe Calculos executando todos os seus métodos. 
 
 
public class Calculos { 
 
 public double calcularMedia(double num1, double num2, double num3){ 
 // Calculando a média 
 double media = (num1 + num2 + num3)/3.0; 
 // Retornando a média 
 return media; 
 } 
 
 public double calcularMaior(double num1, double num2, double num3){ 
 
 double maior; 
 
 // Comparando para identificar o maior número 
 if (num1>num2 && num1>num3) 
 maior = num1; 
 else if (num2>num3) 
 maior = num2; 
 else maior = num3; 
 
 return maior; 
 } 
 
 public double calcularMenor(double num1, double num2, double num3){ 
 double menor; 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 111 
 // Comparando para identificar o maior número 
 if (num1<num2 && num1<num3) 
 menor = num1; 
 else if (num2<num3) 
 menor = num2; 
 else menor = num3; 
 
 return menor; 
 } 
 
} 
 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class Exercicio_6_7_6 { 
 
 public static void main(String[] args) { 
 
 // Criando o objeto da classe Cálculo 
 Calculos objCalculo = new Calculos(); 
 
 
 // O objeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 // Capturando os números 
 
 System.out.print("Número 1...: "); 
 double num1 = linha.nextDouble(); 
 
 System.out.print("Número 2...: "); 
 double num2 = linha.nextDouble(); 
 
 System.out.print("Número 3...: "); 
 double num3 = linha.nextDouble(); 
 
 // Calcular maior número 
 System.out.println("Maior número........: " + objCalculo.calcularMaior(num1, num2, 
num3)); 
 
 // Calcular média 
 System.out.println("Média dos números...: " + objCalculo.calcularMedia(num1, num2, 
num3)); 
 
 // Calcular menor número 
 System.out.println("Menor número........: " + objCalculo.calcularMenor(num1, num2, 
num3)); 
 
 
 } 
 
} 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 112 
 
Execução 
Número 1...: 2,2 
Número 2...: 9 
Número 3...: 4,5 
Maior número........: 9.0 
Média dos números...: 5.233333333333333 
Menor número........: 2.2 
 
7. Construa uma classe que peça o Nome, Endereço, Sexo, Cidade, Estado, Idade dos funcionários. Além disto, 
dado o Salário Bruto do funcionário, calcule o seu Salário Líquido. Considere que os descontos podem ser o Vale 
Transporte (2%), Vale Alimentação (5%) e Plano de Saúde (10%). 
 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class Exercicio_6_7_7 { 
 
 public static void main(String[] args) { 
 
 String situacao; 
 
 System.out.println("** CALCULO DE SALÁRIO **"); 
 
 // O objeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 // Capturando as informações do funcionário 
 
 System.out.print("Nome.........: "); 
 String nome = linha.nextLine(); 
 
 System.out.print("Idade.......: "); 
 int idade = Integer.parseInt(linha.nextLine()); 
 
 System.out.print("Endereço....: "); 
 String endereco = linha.nextLine(); 
 
 System.out.print("Sexo........: "); 
 String sexo = linha.nextLine(); 
 
 System.out.print("Cidade......: "); 
 String cidade = linha.nextLine(); 
 
 System.out.print("Estado......: "); 
 String estado = linha.nextLine(); 
 
 System.out.print("Salário Bruto...: "); 
 double salarioBruto = linha.nextDouble(); 
 
 // Calculando o salário 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 113 
 // Calculando os descontos Vale Transporte (2%), Vale Alimentação (5%) e Plano de 
Saúde (10%). 
 double valeTransporte = salarioBruto * (2/100.0); 
 double valeAlimentacao = salarioBruto * (5/100.0); 
 double planoSaude = salarioBruto * (10/100.0); 
 
 // Calculando o salário líquido 
 double salarioLiquido = salarioBruto - valeTransporte - valeAlimentacao - 
planoSaude; 
 
 System.out.println("** DEMONSTRATIVO DE SALÁRIO *** "); 
 System.out.println("Nome............: " + nome); 
 System.out.println("Salário Bruto...: " + salarioBruto); 
 System.out.println("Salário Líquido.: " + salarioLiquido); 
 
 
 } 
 
} 
 
Exemplo da Execução 
** CALCULO DE SALÁRIO ** 
Nome.........: Roberto Carlos 
Idade.......: 37 
Endereço....: SGAS 916 LT 32 
Sexo........: M 
Cidade......: BRASILIA 
Estado......: DF 
Salário Bruto...: 22500,50 
** DEMONSTRATIVODE SALÁRIO *** 
Nome............: Roberto Carlos 
Salário Bruto...: 22500.5 
Salário Líquido.: 18675.415 
 
LISTA DE EXERCÍCIOS 7.8 
1) Crie um programa que imprima na tela os argumentos passados na linha de comando para o método main. 
Compile e execute a classe ImprimeArgumentos. Na execução, não esqueça de passar alguns parâmetros na linha 
de comando. 
public class Exercicio_7_8_1 { 
 
 public static void main(String[] parametros) { 
 
 // Imprimindo todos os parametros recebidos 
 for (int i = 0; i < parametros.length; i++) { 
 System.out.print(parametros[i] + " "); 
 } 
 
 } 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 114 
} 
 
2) Faça um programa que ordene o array de strings recebido na linha de comando. Compile e execute a classe 
Ordena. Na execução, não esqueça de passar alguns parâmetros na linha de comando. 
import java.util.Arrays; 
 
//2) Faça um programa que ordene o array de strings recebido na linha de comando. Compile e 
execute a classe Ordena. 
//Na execução, não esqueça de passar alguns parâmetros na linha de comando. 
 
public class Exercicio_7_8_2 { 
 
 public static void main(String[] parametros) { 
 
 // Ordenando os elementos numéricos do arrays 
 Arrays.sort(parametros); 
 
 // Imprimindo os elementos ordenados 
 System.out.println("Valores ordenados" + Arrays.toString(parametros)); 
 
 } 
} 
 
Execução 
Valores digitados como parâmetros: 9 2 1 0 3 5 
Valores ordenados[0, 1, 2, 3, 5, 9] 
 
3) Faça um programa que calcule a média dos elementos recebidos na linha de comando. Dica: para converter 
strings para double utilize o método parseDouble() 
public class Exercicio_7_8_3 { 
 
 public static void main(String[] numerosRecebidos) { 
 
 // Variável auxiliar para soma 
 double soma =0; 
 
 // Percorrendo o array e realizando o somatório dos valores informados 
 for (int i = 0; i < numerosRecebidos.length; i++) { 
 soma = Double.parseDouble(numerosRecebidos[i]) + soma; 
 } 
 
 // Calculando a média dos valores recebidos 
 
 double media = soma/numerosRecebidos.length; 
 
 System.out.println("Média dos valores " + media); 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 115 
 } 
 
} 
 
4) Faça um programa que leia cinco nomes do teclado, e depois imprima esses nomes na ordem inversa em 
que foram digitados pelo usuário. 
public class Exercicio_7_8_4 { 
 
 public static void main(String[] numerosRecebidos) { 
 
 
 // Percorrendo o array e imprimindo os elementos na ordem inversa 
 for (int i = numerosRecebidos.length-1; i >= 0; i--) { 
 System.out.println(numerosRecebidos[i]); 
 } 
 
 } 
 
} 
5) O tempo que um determinado avião dispensa para percorrer o trecho entre duas localidades distintas está 
disponível através da seguinte tabela: 
 
 A B C D E F G 
 02 11 06 15 11 01 
02 07 12 04 02 15 
11 07 11 08 03 13 
06 12 11 10 02 01 
15 04 08 10 05 13 
11 02 03 02 05 14 
01 15 13 01 13 14 
 
 
a) Construa uma classe java que leia a tabela anterior e informe ao usuário o tempo necessário para percorrer duas cidades 
por ele fornecidas, até o momento em que ele fornecer duas cidades iguais (origem e destino). 
 
 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class Exercicio_7_8_5 { 
 
 public static void main(String[] args) { 
 
 // Carregando a matriz com os valores pré-definidos 
 int[][] matriz = new int[7][7]; 
 
 // Distâncias da linha 0 ou cidade A 
 matriz[0][0] = 0; 
 matriz[0][1] = 2; 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 116 
 matriz[0][2] = 11; 
 matriz[0][3] = 6; 
 matriz[0][4] = 15; 
 matriz[0][5] = 11; 
 matriz[0][6] = 1; 
 
 // Distâncias da linha 1 ou cidade B 
 matriz[1][0] = 2; 
 matriz[1][1] = 0; 
 matriz[1][2] = 7; 
 matriz[1][3] = 12; 
 matriz[1][4] = 4; 
 matriz[1][5] = 2; 
 matriz[1][6] = 15; 
 
 // Distâncias da linha 2 ou cidade C 
 matriz[2][0] = 11; 
 matriz[2][1] = 7; 
 matriz[2][2] = 0; 
 matriz[2][3] = 11; 
 matriz[2][4] = 8; 
 matriz[2][5] = 3; 
 matriz[2][6] = 13; 
 
 
 matriz[3][0] = 6; 
 matriz[3][1] = 12; 
 matriz[3][2] = 11; 
 matriz[3][3] = 0; 
 matriz[3][4] = 10; 
 matriz[3][5] = 2; 
 matriz[3][6] = 1; 
 
 
 matriz[4][0] = 15; 
 matriz[4][1] = 4; 
 matriz[4][2] = 8; 
 matriz[4][3] = 10; 
 matriz[4][4] = 0; 
 matriz[4][5] = 5; 
 matriz[4][6] = 13; 
 
 
 matriz[5][0] = 11; 
 matriz[5][1] = 2; 
 matriz[5][2] = 3; 
 matriz[5][3] = 2; 
 matriz[5][4] = 5; 
 matriz[5][5] = 0; 
 matriz[5][6] = 14; 
 
 matriz[6][0] = 1; 
 matriz[6][1] = 15; 
 matriz[6][2] = 13; 
 matriz[6][3] = 1; 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 117 
 matriz[6][4] = 13; 
 matriz[6][5] = 14; 
 matriz[6][6] = 0; 
 
 
 System.out.println("*** Calculo de Distância de Cidades A B C D E F G *** 
"); 
 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 System.out.println("Cidade origem(A, B, C , D, E, F ou G): "); 
 String cidadeOrigem = linha.next(); 
 
 System.out.println("Cidade destino(A, B, C , D, E, F ou G): "); 
 String cidadeDestino = linha.next(); 
 
 // Realizando o de - para para identificar a linha e coluna da matriz 
 int lin=0; 
 
 if (cidadeOrigem.toUpperCase().equals("A")) 
 lin = 0; 
 else if (cidadeOrigem.toUpperCase().equals("B")) 
 lin = 1; 
 else if (cidadeOrigem.toUpperCase().equals("C")) 
 lin = 2; 
 else if (cidadeOrigem.toUpperCase().equals("D")) 
 lin = 3; 
 else if (cidadeOrigem.toUpperCase().equals("E")) 
 lin = 4; 
 else if (cidadeOrigem.toUpperCase().equals("F")) 
 lin = 5; 
 else if (cidadeOrigem.toUpperCase().equals("G")) 
 lin = 6; 
 
 
 int col=0; 
 
 if (cidadeDestino.toUpperCase().equals("A")) 
 col = 0; 
 else if (cidadeDestino.toUpperCase().equals("B")) 
 col = 1; 
 else if (cidadeDestino.toUpperCase().equals("C")) 
 col = 2; 
 else if (cidadeDestino.toUpperCase().equals("D")) 
 col = 3; 
 else if (cidadeDestino.toUpperCase().equals("E")) 
 col = 4; 
 else if (cidadeDestino.toUpperCase().equals("F")) 
 col = 5; 
 else if (cidadeDestino.toUpperCase().equals("G")) 
 col = 6; 
 
 System.out.println("A distância entre as cidades " + cidadeOrigem + " e " + cidadeDestino + 
"é " + matriz[lin][col]); 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 118 
 
 } 
 
} 
 
*** Calculo de Distância de Cidades A B C D E F G *** 
Cidade origem(A, B, C , D, E, F ou G): 
A 
Cidade destino(A, B, C , D, E, F ou G): 
F 
A distância entre as cidades A e F é 11 
 
 
b) Elabore uma classe que imprima a tabela sem repetições(apenas o triângulo superior ou o triângulo inferior). 
 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class Exercicio_7_8_5 { 
 
 public static void main(String[] args) { 
 
 // Carregandoa matriz com os valores pré-definidos 
 int[][] matriz = new int[7][7]; 
 
 // Distâncias da linha 0 ou cidade A 
 matriz[0][0] = 0; 
 matriz[0][1] = 2; 
 matriz[0][2] = 11; 
 matriz[0][3] = 6; 
 matriz[0][4] = 15; 
 matriz[0][5] = 11; 
 matriz[0][6] = 1; 
 
 // Distâncias da linha 1 ou cidade B 
 matriz[1][0] = 2; 
 matriz[1][1] = 0; 
 matriz[1][2] = 7; 
 matriz[1][3] = 12; 
 matriz[1][4] = 4; 
 matriz[1][5] = 2; 
 matriz[1][6] = 15; 
 
 // Distâncias da linha 2 ou cidade C 
 matriz[2][0] = 11; 
 matriz[2][1] = 7; 
 matriz[2][2] = 0; 
 matriz[2][3] = 11; 
 matriz[2][4] = 8; 
 matriz[2][5] = 3; 
 matriz[2][6] = 13; 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 119 
 
 matriz[3][0] = 6; 
 matriz[3][1] = 12; 
 matriz[3][2] = 11; 
 matriz[3][3] = 0; 
 matriz[3][4] = 10; 
 matriz[3][5] = 2; 
 matriz[3][6] = 1; 
 
 
 matriz[4][0] = 15; 
 matriz[4][1] = 4; 
 matriz[4][2] = 8; 
 matriz[4][3] = 10; 
 matriz[4][4] = 0; 
 matriz[4][5] = 5; 
 matriz[4][6] = 13; 
 
 
 matriz[5][0] = 11; 
 matriz[5][1] = 2; 
 matriz[5][2] = 3; 
 matriz[5][3] = 2; 
 matriz[5][4] = 5; 
 matriz[5][5] = 0; 
 matriz[5][6] = 14; 
 
 matriz[6][0] = 1; 
 matriz[6][1] = 15; 
 matriz[6][2] = 13; 
 matriz[6][3] = 1; 
 matriz[6][4] = 13; 
 matriz[6][5] = 14; 
 matriz[6][6] = 0; 
 
 
 System.out.println("*** Calculo de Distância de Cidades A B C D E F G *** 
"); 
 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 System.out.println("Cidade origem(A, B, C , D, E, F ou G): "); 
 String cidadeOrigem = linha.next(); 
 
 System.out.println("Cidade destino(A, B, C , D, E, F ou G): "); 
 String cidadeDestino = linha.next(); 
 
 // Realizando o de - para para identificar a linha e coluna da matriz 
 int lin=0; 
 
 if (cidadeOrigem.toUpperCase().equals("A")) 
 lin = 0; 
 else if (cidadeOrigem.toUpperCase().equals("B")) 
 lin = 1; 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 120 
 else if (cidadeOrigem.toUpperCase().equals("C")) 
 lin = 2; 
 else if (cidadeOrigem.toUpperCase().equals("D")) 
 lin = 3; 
 else if (cidadeOrigem.toUpperCase().equals("E")) 
 lin = 4; 
 else if (cidadeOrigem.toUpperCase().equals("F")) 
 lin = 5; 
 else if (cidadeOrigem.toUpperCase().equals("G")) 
 lin = 6; 
 
 
 int col=0; 
 
 if (cidadeDestino.toUpperCase().equals("A")) 
 col = 0; 
 else if (cidadeDestino.toUpperCase().equals("B")) 
 col = 1; 
 else if (cidadeDestino.toUpperCase().equals("C")) 
 col = 2; 
 else if (cidadeDestino.toUpperCase().equals("D")) 
 col = 3; 
 else if (cidadeDestino.toUpperCase().equals("E")) 
 col = 4; 
 else if (cidadeDestino.toUpperCase().equals("F")) 
 col = 5; 
 else if (cidadeDestino.toUpperCase().equals("G")) 
 col = 6; 
 
 System.out.println("A distância entre as cidades " + cidadeOrigem + " e " + cidadeDestino + 
" é " + matriz[lin][col]); 
 
 imprimirTrianguloInferior(matriz); 
 } 
 
 public static void imprimirTrianguloInferior(int[][] matriz){ 
 
 for (int lin = 0; lin < matriz.length; lin++) { 
 
 for (int col = 0; col < matriz.length; col++) { 
 if (lin==col) 
 { System.out.println(); 
 break; 
 } 
 
 System.out.print(matriz[lin][col] + " "); 
 } 
 } 
 
 } 
 
} 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 121 
Execução 
*** Calculo de Distância de Cidades A B C D E F G *** 
Cidade origem(A, B, C , D, E, F ou G): 
a 
Cidade destino(A, B, C , D, E, F ou G): 
b 
A distância entre as cidades a e b é 2 
 
2 
11 7 
6 12 11 
15 4 8 10 
11 2 3 2 5 
1 15 13 1 13 14 
LISTA DE EXERCÍCIO 8.4 
 
Para atender as necessidades de informação de uma biblioteca universitária foi proposto um sistema que deve 
atender as seguintes características: 
 
 O cadastro dos usuários da biblioteca com endereço completo. Os usuários podem ser classificados em três 
grupos: Professores, Alunos e Funcionários. Para os Alunos é necessário conhecer o curso ao qual 
pertencem. Dos Professores e funcionários, é necessário conhecer o Departamento ao qual estão sempre 
vinculados. 
 O cadastro das obras da biblioteca, que podem ser classificadas em: Livros científicos, periódicos científicos, 
periódicos informativos, periódicos diversos, entretenimento, etc. 
 A língua em que se encontra o exemplar da obra. 
 A mídia onde se encontra o exemplar da obra. 
 Os autores da obra com o controle da nacionalidade do autor. 
 As editoras dos exemplares com o ano de edição de cada exemplar. 
 O histórico dos empréstimos. 
 
Identifique as possíveis classes e objetos com seus respectivos atributos e métodos. 
 
LISTA DE EXERCÍCIO 8.6 
 
a) Implemente uma classe chamada Aluno para definir os objetos que representarão os alunos de uma escola. 
Essa classe deve declarar três atributos: o primeiro para o nome, o segundo para o RG e o terceiro para o CPF dos 
alunos. 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 122 
public class Aluno { 
 
 // Definindo os atributos da classe 
 private String nome; 
 private String rg; 
 private String cpf; 
 
 
 // Definindo os métodos acessadores para garantir o encapsulamento 
 
 // Método para recuperar o nome 
 public String getNome() { 
 return nome; 
 } 
 // Método para atualizar o nome 
 public void setNome(String nome) { 
 this.nome = nome; 
 } 
 // Método para recuperar o RG 
 public String getRg() { 
 return rg; 
 } 
 // Método para atualizar o RG 
 public void setRg(String rg) { 
 this.rg = rg; 
 } 
 public String getCpf() { 
 return cpf; 
 } 
 public void setCpf(String cpf) { 
 this.cpf = cpf; 
 } 
 
 
} 
 
b) Faça uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles. A classe 
também deve mostrar na tela as informações desses objetos. 
public class TestaAluno { 
 
 public static void main(String[] args) { 
 
 // Criando objeto 1 da classe aluno 
 Aluno obj1 = new Aluno(); 
 
 // Populando o objeto criado 
 obj1.setNome("Gleidson Porto"); 
 obj1.setRg("888.888-8"); 
 obj1.setCpf("888.888.888-88"); 
 
 // Criando objeto 2 da classe aluno 
 Aluno obj2 = new Aluno(); 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 123 
 
 // Populando o objeto criado 
 obj2.setNome("Roberto Carlos"); 
 obj2.setRg("999.999-9"); 
 obj2.setCpf("999.999.999-99"); 
 
 // Imprimindo informações dos objetos criados 
 System.out.println(" NOME - RG - CPF "); 
 System.out.println(obj1.getNome() + " - " + obj1.getRg() + " - " + obj1.getCpf()); 
 System.out.println(obj2.getNome() + " - " + obj2.getRg() + " - " + obj2.getCpf()); 
 
 } 
} 
 
Execução: 
 NOME - RG - CPF 
Gleidson Porto - 888.888-8 - 888.888.888-88 
Roberto Carlos - 999.999-9 - 999.999.999-99 
c) Em uma escola, além dos alunos temosos funcionários, que também precisam ser representados em nossa 
aplicação. Então implemente outra classe chamada Funcionario que contenha dois atributos: o primeiro para o cargo 
e o segundo para o salário dos funcionários. 
public class Funcionario { 
 
 // Definindo os atributos da classe 
 private String cargo; 
 private double salario; 
 
 // Definindo os métodos acessadores 
 public String getCargo() { 
 return cargo; 
 } 
 public void setCargo(String cargo) { 
 this.cargo = cargo; 
 } 
 public double getSalario() { 
 return salario; 
 } 
 public void setSalario(double salario) { 
 this.salario = salario; 
 } 
 
} 
 
d) Faça uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a 
eles. Mostre na tela as informações desses objetos. 
public class TestaFuncionario { 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 124 
 public static void main(String[] args) { 
 
 // Criando objeto 1 da classe Funcionario 
 Funcionario obj1 = new Funcionario(); 
 
 // Populando o objeto criado 
 obj1.setCargo("Professor"); 
 obj1.setSalario(10500); 
 
 // Criando objeto 2 da classe Funcionario 
 Funcionario obj2 = new Funcionario(); 
 
 // Populando o objeto criado 
 obj2.setCargo("Diretor"); 
 obj2.setSalario(20500); 
 
 
 // Imprimindo informações dos objetos criados 
 System.out.println(" CARGO - SALÁRIO"); 
 System.out.println(obj1.getCargo() + " - " + obj1.getSalario()); 
 System.out.println(obj2.getCargo() + " - " + obj2.getSalario()); 
 
 } 
 
} 
 
Execução 
CARGO - SALÁRIO 
Professor - 10500.0 
Diretor - 20500.0 
 
e) Em uma escola, os alunos precisam ser divididos por turmas, que devem ser representadas dentro da 
aplicação. Implemente uma classe chamada Turma que contenha quatro atributos: o primeiro para o período, o 
segundo para definir a série, o terceiro para sigla e o quarto para o tipo de ensino. 
public class Turma { 
 
 // Definindo os atributos da classe 
 private String período; 
 private String serie; 
 private String sigla; 
 private String tipoEnsino; 
 
 
 // Definindo os métodos acessadores para garantir o encapsulamento 
 
 
 // Método para recuperar o período 
 public String getPeríodo() { 
 return período; 
 } 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 125 
 // Método para atualizar o período 
 public void setPeríodo(String período) { 
 this.período = período; 
 } 
 public String getSerie() { 
 return serie; 
 } 
 public void setSerie(String serie) { 
 this.serie = serie; 
 } 
 public String getSigla() { 
 return sigla; 
 } 
 public void setSigla(String sigla) { 
 this.sigla = sigla; 
 } 
 public String getTipoEnsino() { 
 return tipoEnsino; 
 } 
 public void setTipoEnsino(String tipoEnsino) { 
 this.tipoEnsino = tipoEnsino; 
 } 
 
 
} 
 
f) Faça uma classe chamada TestaTurma para criar dois objetos da classe Turma. Adicione informações a eles 
e depois mostre essas informações na tela. 
 
public class TestaTurma { 
 
 public static void main(String[] args) { 
 
 // Criando objeto 1 da classe Turma 
 Turma obj1 = new Turma(); 
 
 // Populando o objeto criado 
 obj1.setPeríodo("2016.2"); 
 obj1.setSerie("7a Série"); 
 obj1.setSigla("7A"); 
 obj1.setTipoEnsino("Ensino Médio"); 
 
 
 // Criando objeto 2 da classe aluno 
 Turma obj2 = new Turma(); 
 
 // Populando o objeto criado 
 obj2.setPeríodo("2016.1"); 
 obj2.setSerie("6a Série"); 
 obj2.setSigla("6A"); 
 obj2.setTipoEnsino("Ensino Médio"); 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 126 
 // Imprimindo informações dos objetos criados - obj 1 
 System.out.println("Período.......: " + obj1.getPeríodo()); 
 System.out.println("Série.........: " + obj1.getSerie()); 
 System.out.println("Sigla.........: " + obj1.getSigla()); 
 System.out.println("Tipo Ensino...: " + obj1.getTipoEnsino()); 
 
 System.out.println("-------------------------------------"); 
 // Imprimindo informações dos objetos criados - obj 2 
 System.out.println("Período.......: " + obj2.getPeríodo()); 
 System.out.println("Série.........: " + obj2.getSerie()); 
 System.out.println("Sigla.........: " + obj2.getSigla()); 
 System.out.println("Tipo Ensino...: " + obj2.getTipoEnsino()); 
 } 
} 
Execução 
Período.......: 2016.2 
Série.........: 7a Série 
Sigla.........: 7A 
Tipo Ensino...: Ensino Médio 
------------------------------------- 
Período.......: 2016.1 
Série.........: 6a Série 
Sigla.........: 6A 
Tipo Ensino...: Ensino Médio 
LISTA DE EXERCÍCIO 9.4 
1) Crie duas classes que definam os seguintes atributos e métodos para objetos do tipo: 
 
 
 
 
 
 
 
 
 
Ao final crie um objeto da classe Empregado e um objeto da classe Gerente, atribuindo valores para seus 
salários e comissão para o gerente. Ao final execute os métodos getSalario() de ambos objetos. Lembrar que o 
salário do gerente é composto do salário + comissão. 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 127 
public class Empregado { 
 
 // Atributos da classe empregado 
 private String nome; 
 private float salario; 
 
 // Métodos acessadores 
 public String getNome() { 
 return nome; 
 } 
 public void setNome(String nome) { 
 this.nome = nome; 
 } 
 
 public float getSalario() { 
 return salario; 
 } 
 
 public void setSalario(float salario) { 
 this.salario = salario; 
 } 
 
} 
 
public class Gerente extends Empregado { 
 
 // Atributo da classe 
 private float comissao; 
 
 public float getComissao() { 
 return comissao; 
 } 
 
 public void setComissao(float comissao) { 
 this.comissao = comissao; 
 } 
 
 // Método getSalario sobeescrito da classe Empregado. Pois o salário do Gerente é 
composto do salário + comissão. 
 public float getSalario() { 
 // A palavra reservada super faz referência ao método da super classe. 
 return super.getSalario() + comissao; 
 } 
 
} 
 
 
public class Exercicio_9_4_1 { 
 
 public static void main(String[] args) { 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 128 
 
 Empregado empregado = new Empregado(); 
 empregado.setNome("Carlos Alberto"); 
 empregado.setSalario(5600); 
 
 Gerente gerente = new Gerente(); 
 gerente.setNome("Carlos Alberto"); 
 gerente.setSalario(8000); 
 gerente.setComissao(1000); 
 
 System.out.println("Empregado...: " + empregado.getNome()); 
 System.out.println("Salário.....: " + empregado.getSalario()); 
 System.out.println("---------------------------------"); 
 System.out.println("Gerente................: " + gerente.getNome()); 
 System.out.println("Salário + comissão.....: " + gerente.getSalario()); 
 
 } 
 
} 
 
Empregado...: Carlos Alberto 
Salário.....: 5600.0 
--------------------------------- 
Gerente................: Carlos Alberto 
Salário + comissão.....: 9000.0 
LISTA DE EXERCÍCIO 11.5 
 
1) Julgue V ou F os seguintes itens a seguir acerca dos modificadores de Java. 
 
(V) public: Uma classe declarada como pública dá as outras classes, de todos os pacotes, acesso aos seus membros 
que forem públicos também. 
 
(V) private: O membro da classe não pode ser acessado por nenhuma outraclasse, quando é declarado private. 
Como não é visto pelas subclasses, não se aplica regras de overriding. Esse modificador não se aplica a classes, 
somente a seus membros (métodos e atributos). 
 
(V) protected: Quando um membro da classe é declarado assim, ele se torna acessível por classes do mesmo pacote 
ou através de herança. 
 
(F) abstract: Quando é aplicado à classe não permite estendê-la, nos métodos impede que o mesmo seja sobrescrito 
(overriding) na subclasse, já nas variáveis impossibilita que essa seja reinicializada com outro valor. 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 129 
(F) final: Classes declaradas como abstratas provém um modo de adiar a implementação de métodos também 
declarados como abstratos para subclasses. Uma classe abstrata não pode ser instanciada, ou seja, não podemos 
chamar os seus construtores. 
 
(V) static: Variáveis e métodos marcados como static pertencem à classe, ao invés de alguma instância dessa, esse 
modificador não se aplica a classes. 
 
(F) public : É o mais restritivo de todos. Atributos e métodos declarados como public em uma classe podem ser 
acessados pelos métodos da própria classe, por classes derivadas desta e por qualquer outra classe em qualquer 
outro pacote. 
 
(V) protected : Atributos e métodos definidos como protected são acessíveis pelos métodos da própria classe e pelas 
classes derivadas. 
 
(V) private : É o mais restritivo. Atributos e métodos declarados como private só podem ser acessados pelos métodos 
da própria classe. 
 
 (V) A instrução final indica que a classe, método ou variável assim declarada têm uma única atribuição que se 
mantém constante, ou seja, não pode ser alterada no decorrer do processamento. 
(F) O nível de acesso protected é mais restritivo do que o nível de acesso private. 
(F ) Os métodos declarados como public só podem ser acessados a partir dos métodos da própria classe ou de 
classes derivadas. 
 
2) Porque esse código não compila? 
class Teste { 
 
int x = 37; 
 
public static void main(String [] args) { 
 System.out.println(x); 
 } 
} 
R = O código não compila porque o atributo X não é estático, pois métodos estáticos podem somente acessar 
variáveis também estáticas, ou seja, é proibido o uso de variáveis não estáticas dentro de blocos estáticos, com 
exceção de variáveis criadas dentro do próprio bloco é claro. Essa restrição se deve ao fato de que é possível fazer 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 130 
uma chamada a um método estático mesmo sem haver nenhuma instância dessa classe, ou seja, a provável variável 
a ser referenciada dentro do método pode nem mesmo ter sido criada ainda. 
 
3) Defina uma classe Funcionário com os atributos nome, cargo e salário. Na mesma classe, defina os métodos 
acessadores para garantir o encapsulamento dos atributos. Defina outra classe com o método main para 
criar objetos da classe Funcionário e executar os seus métodos. 
public class Funcionario { 
 
 // Definindo os atributos da classe 
 private String nome; 
 private String cargo; 
 private double salario; 
 
 // Definindo os métodos acessadores 
 public String getNome() { 
 return nome; 
 } 
 public void setNome(String nome) { 
 this.nome = nome; 
 } 
 
 public String getCargo() { 
 return cargo; 
 } 
 public void setCargo(String cargo) { 
 this.cargo = cargo; 
 } 
 public double getSalario() { 
 return salario; 
 } 
 public void setSalario(double salario) { 
 this.salario = salario; 
 } 
 
} 
 
public class TesteFuncionario11_5 { 
 
 public static void main(String[] args) { 
 
 // Criando objeto 1 da classe Funcionario 
 Funcionario obj1 = new Funcionario(); 
 
 // Populando o objeto criado 
 obj1.setNome("Joao da Silva"); 
 obj1.setCargo("Professor"); 
 obj1.setSalario(10500); 
 
 
 // Imprimindo informações dos objetos criados 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 131 
 System.out.println(" CARGO - SALÁRIO"); 
 System.out.println("Nome......: " + obj1.getNome()); 
 System.out.println("Cargo.....: " + obj1.getCargo()); 
 System.out.println("Salário...: " + obj1.getSalario()); 
 
 } 
 
} 
 
Execução 
CARGO - SALÁRIO 
Nome......: Joao da Silva 
Cargo.....: Professor 
Salário...: 10500.0 
 
 LISTA DE EXERCÍCIO 13.5 
a) Defina a classe Contador como uma subclasse de Thread, que imprime números de 0 a 10. Crie a classe 
TesteContador que deve definir o método main que cria e inicia a execução do thread Contador. Teste o resultado 
executando a classe TesteContador. 
 
public class Contador extends Thread { 
 
 // Definição do método construtor atribuindo o nome para Thread 
 public Contador(String nome) 
 { 
 super(nome); 
 } 
 
 // Método de execução da Thread 
 public void run(){ 
 for (int i=0; i<=10; i++) 
 { 
 System.out.println(getName()+ " - " +i ); 
 } 
 } 
 
} 
public class TesteContador { 
 
 public static void main(String[] args) { 
 
 // Criando os objetos da classe contador 
 Contador contaA = new Contador("ContadorA"); 
 Contador contaB = new Contador("ContadorB"); 
 
 // Iniciando as Threads 
 contaA.start(); 
 contaB.start(); 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 132 
 
 } 
 
} 
 
b) Altere as classes Contador e TesteContador de modo que a classe Contador seja definida como uma 
implementação da interface Runnable. Teste o resultado. 
 
public class Contador implements Runnable { 
 
 public void run() { 
 for (int i=0; i<=10; i++) 
 { 
 System.out.println(" Contador --> "+i); 
 } 
 } 
} 
 
public class TesteContador { 
 
 public static void main(String[] args) { 
 
 // Criando os objetos da classe contador 
 Contador contaAInterface = new Contador(); 
 Contador contaBInterface = new Contador(); 
 
 Thread threadContaA = new Thread(contaAInterface); 
 Thread threadContaB = new Thread(contaBInterface); 
 
 
 // Iniciando as Threads 
 threadContaA.start(); 
 threadContaB.start(); 
 
 } 
 
} 
 
LISTA DE EXERCÍCIO 14.7 
 
a) Faça um programa em Java que leia um texto informado pelo usuário no console e que salve o texto informado em 
um arquivo qualquer. 
 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 133 
import java.io.PrintWriter; 
import java.util.Scanner; 
 
public class Exercicio_14_7_A { 
 
 public static void main(String[] args) { 
 
 System.out.println("**** Gravação em arquivo texto **** \n\n"); 
 
 
 // O objeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 // Capturando os números 
 System.out.print("Informe o texto......: "); 
 String texto = linha.nextLine(); 
 
 
 FileWriter arq; 
 try { 
 arq = new FileWriter("c:\\temp\\teste.txt"); 
 PrintWriter gravarArq = new PrintWriter(arq); 
 
 gravarArq.printf(texto); 
 arq.close(); 
 
 } catch (IOException e) { 
 // TODO Auto-generated catch block 
 e.printStackTrace(); 
 } 
 
 
 System.out.print("\nTexto gravado do sucessono arquivo " + 
"c:\\temp\\teste.txt"); 
 
 } 
 
} 
 
LISTA DE EXERCÍCIO 15.3 
 
a) Implemente uma classe em Java com as funcionalidades de uma agenda telefônica, associando um nome a 
um número telefônico. A classe deve possuir a interface abaixo: 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 134 
 
import java.util.HashMap; 
import java.util.Map; 
 
public class AgendaTelefonica { 
 
 // Criação da estrutura de dados HashMap para os contatos 
 Map<String, String> contatos = new HashMap<String, String>(); 
 
 
 // Método para inserir o nome e número na agenda de contatos 
 public void inserir(String nome, String numero){ 
 contatos.put(nome, numero); 
 System.out.println("Nome e número inseridos com sucesso! "); 
 
 } 
 
 
 // Método para buscar o número do contato 
 public String buscarNumero(String nome){ 
 return contatos.get(nome); 
 } 
 
 
 // Método para remover o contato 
 public void remover(String nome){ 
 if (contatos.remove(nome)!=null) 
 System.out.println(nome + " removido com sucesso da agenda! "); 
 else System.out.println(nome + " não encontrado na agenda. "); 
 } 
 
 
 // Método para retornar o número de contatos cadastrados 
 public int tamanho(){ 
 return contatos.size(); 
 } 
 
} 
 
b) Crie um programa em Java para testar a classe AgendaTelefonica desenvolvida no exercício anterior. Teste 
a classe com pelo menos 5 contatos diferentes na agenda de telefones. 
 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 135 
import java.io.InputStream; 
import java.util.Scanner; 
 
public class AppAgendaTelefonica { 
 
 public static void main(String[] args) { 
 
 AgendaTelefonica agenda = new AgendaTelefonica(); 
 
 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 String nome; 
 String numero; 
 
 
 int opcao = mostrarOpcoes(); 
 
 while (opcao!=0) { 
 
 
 switch (opcao) { 
 
 // Inserir contato 
 case 1: 
 System.out.println("*** 1 - Cadastro de Contato *** "); 
 System.out.print("Digite o nome: "); 
 nome = linha.nextLine(); 
 System.out.print("Digite o número: "); 
 numero = linha.nextLine(); 
 agenda.inserir(nome, numero); 
 break; 
 // Localizar número 
 case 2: 
 System.out.println("*** 2 - Localização de Número **** "); 
 System.out.print("Digite o contato: "); 
 nome = linha.nextLine(); 
 
 String numeroEncontrado = agenda.buscarNumero(nome); 
 
 if (numeroEncontrado!=null) 
 System.out.println(" Telefone " + numeroEncontrado + " do 
contato " + nome); 
 else System.out.println(" Telefone não encontrado para o contato " + 
nome); 
 
 break; 
 //Excluir contato 
 case 3: 
 System.out.println("*** 3 - Exclusão de Número *** "); 
 System.out.println("Digite o contato para exclusão: "); 
 nome = linha.nextLine(); 
 
 agenda.remover(nome); 
Pág. 
 
RESPOSTAS DO EXERCÍCIOS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 136 
 break; 
 
 // Quantidade de contatos 
 case 4: 
 System.out.println("*** 4 - Quantidade de Contatos *** "); 
 System.out.println(agenda.tamanho() + " contato(s) cadastrados na 
agenda. "); 
 break; 
 
 // Sair do sistema 
 case 0: 
 System.exit(0); 
 break; 
 } 
 
 opcao = mostrarOpcoes(); 
 
 } 
 
 } 
 
 public static int mostrarOpcoes(){ 
 System.out.println("\n*** AGENDA TELEFÔNICA *** \n"); 
 
 // apresentando as opções do menu ao usuário 
 System.out.println("1 - Incluir Contato "); 
 System.out.println("2 - Localizar Número "); 
 System.out.println("3 - Excluir Contato "); 
 System.out.println("4 - Quantidade de contatos "); 
 System.out.println("0 - Sair "); 
 System.out.print("\n Digite a opção: "); 
 
 // O objeto System.in possibilita a leitura do que se escreve no teclado 
 InputStream entrada = System.in; 
 Scanner linha = new Scanner(entrada); 
 
 // capturando a opçao do usuário 
 int opcao = linha.nextInt(); 
 
 // retornando a opção 
 return opcao; 
 
 } 
 
} 
*** AGENDA TELEFÔNICA *** 
 
1 - Incluir Contato 
2 - Localizar Número 
3 - Excluir Contato 
4 - Quantidade de contatos 
0 - Sair 
 
 Digite a opção: 
Pág. 
 
REFERÊNCIAS 
 
 
 
JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 137 
REFERÊNCIAS 
 
 Liang, Daniel, Eclipse Tutorial: a Supplement J, 2005. 
 Eclipse, In: Eclipse Foundation: Disponível em: http://www.eclipse.org. 
 Eclipse(IDE), In: Wikipédia: a enciclopédia livre. 
 Erickson, Marc (IBM), What is Eclipse, and how do I use it? 
 Paul Deitel Harvey Deitel. Java Como Programar. oitava edição. ISBN-10: 8576055635. Pearson, 2010. 
 Bertrand Meyer. Object-Oriented Software Construction. segunda edição. ISBN-10: 0136291554. Prentice 
Hall, 1997. 
 Heller, Philip. Guia Completo de Estudos para Certificação em Java. 
 Silveira, Paulo. Um pouco sobre o pacote java.util. 
 Rogers Cadenhead & Laura Lemay. Aprenda em 21 dias java. 
 Cornell, Gary. Core Java. 
 Documentação oficial – Java/Oracle. 
 Outros sites especializados em Java.

Mais conteúdos dessa disciplina