Programaçao de Sistemas
Programaçao de Sistemas
Programação de Sistemas
1ª Edição
Brasília/DF - 2022
Autores
Jane Tavares Alvarez da Silva
Produção
Equipe Técnica de Avaliação, Revisão Linguística e
Editoração
Sumário
Organização do Livro Didático....................................................................................................................................... 4
Introdução.............................................................................................................................................................................. 6
Capítulo 1
Introdução à linguagem de programação............................................................................................................ 7
Capítulo 2
Comandos da linguagem Java.................................................................................................................................33
Capítulo 3
Conceitos e Implementação usando Orientação a Objetos.......................................................................... 61
Capítulo 4
Classes e objetos: uma visão mais aprofundada..............................................................................................92
Capítulo 5
Tratamento de exceções......................................................................................................................................... 125
Capítulo 6
Coleções de objetos................................................................................................................................................. 137
A seguir, apresentamos uma breve descrição dos ícones utilizados na organização do Livro
Didático.
Atenção
Cuidado
Importante
Observe a Lei
Para refletir
Questões inseridas no decorrer do estudo a fim de que o aluno faça uma pausa
e reflita sobre o conteúdo estudado ou temas que o ajudem em seu raciocínio.
É importante que ele verifique seus conhecimentos, suas experiências e seus
sentimentos. As reflexões são o ponto de partida para a construção de suas
conclusões.
4
Organização do Livro Didático
Provocação
Textos que buscam instigar o aluno a refletir sobre determinado assunto antes
mesmo de iniciar sua leitura ou após algum trecho pertinente para o autor
conteudista.
Saiba mais
Gotas de Conhecimento
Sintetizando
Posicionamento do autor
5
Introdução
Este Livro Didático fornece uma diretriz sólida para o estudo de vários tópicos relacionados
à linguagem de programação Java, incluindo conceitos importantes de Orientação a
Objetos, tais como herança e polimorfismo.
Ao longo dos seus seis capítulos, este Livro Didático tenta motivar o estudo da disciplina
Programação de Sistemas, apresentando vários conceitos, exemplos variados, além de
programas na linguagem de programação Java que conjuguem teoria e prática, permitindo
assim, que o leitor construa uma base consistente para a programação de sistemas de
computador.
Objetivos
6
CAPÍTULO
INTRODUÇÃO À LINGUAGEM DE
PROGRAMAÇÃO 1
Introdução ao Capítulo
Este primeiro capítulo abordará alguns dos principais conceitos relativos à linguagem de
programação Java, bem como sua sintaxe, através do estudo dos tipos de dados, entrada/saída
de dados e operadores, permitindo assim, que os primeiros programas sejam escritos.
Algumas seções deste capítulo somente receberão o devido formalismo em outro momento,
quando forem estudados os conceitos de orientação a objetos.
Objetivos do Capítulo
A linguagem Java é uma linguagem Orientada a Objetos (OO) e foi desenvolvida na década
de 1990 por James Gosling da Sun Microsystems.
Além da característica de ser uma linguagem orientada a objetos, a linguagem Java tem
outras características, como, por exemplo:
7
CAPÍTULO 1 • Introdução à linguagem de programação
Todo programa em Java deve ter um método main que determina o início da execução do
programa. Não se preocupe em entender tudo agora sobre o programa do exemplo, o que é
classe e o que é o método main.
Exemplo:
/* Arquivo: PrimeiroProg.java */
Importante
» O método main deve estar dentro de uma classe pública, cujo nome é igual ao nome do arquivo .java.
Apesar de estar apenas começando seus estudos em Java, o que você espera que o programa
anterior faça ao executar? O programa irá imprimir ou fazer o seguinte print ou impressão
na tela do computador: Meu primeiro programa.
Todo programa ou código Java deve ficar dentro de uma classe delimitada por chaves e
para definir uma classe, usamos uma palavra reservada para esse fim, que é a palavra class.
Saiba mais
Os comentários são uma boa prática de programação e servem como documentação do programa, orientando quem for ler
ou fazer a manutenção no programa.
8
Introdução à linguagem de programação • CAPÍTULO 1
Nas linguagens compiladas que geram código nativo (binário), é necessário um processo
de compilação para cada plataforma, pois o código gerado só executa naquela plataforma
específica.
Diferentemente das linguagens que são compiladas para código nativo, a linguagem Java é
compilada para bytecode (.class ou .jar) que é executado por uma JVM (Java Virtual Machine).
Saiba mais
A API Java oferece uma rica coleção de classes e métodos para, por exemplo:
9
CAPÍTULO 1 • Introdução à linguagem de programação
Essa camada extra entre o Sistema Operacional e o programa permite que este seja
executado em diversas plataformas, sem a necessidade de alteração ou recompilação
(portabilidade). Na Figura 1, o mesmo programa teste.java (observe a extensão .java)
poderá ser executado, sem qualquer ajuste ou mudança, em um ambiente com Linux ou em
um ambiente com Windows 10.
Saiba mais
Simplificadamente, o papel de qualquer compilador é traduzir o programa escrito em alguma linguagem de alto nível em
linguagem de máquina. As linguagens de alto nível têm instruções que se parecem, em geral, com o inglês do dia a dia. Já a
linguagem de máquina consiste em sequências de zeros e uns.
Veja o modelo de compilação e execução na figura 2. Note que o programa Java (arquivo
de extensão .java) é compilado para bytecode, gerando um arquivo com extensão .class.
Esse arquivo contém o código executável que independe da plataforma. Para executar esse
código é necessário uma máquina virtual (JVM), que irá traduzir e executar o bytecode no
ambiente desejado, seja ele Linux, Windows© ou MacOS©.
Importante
Desenvolvedores Java devem fazer download do Java SE Development Kit (JDK), da Plataforma Java, no site https://www.
oracle.com/java/.
JDK é o Kit de Desenvolvimento Java para standard edition (SE) ou edição padrão. Tal kit inclui o ambiente de execução, que
é o JRE (Java Runtime Environment), além de ferramentas para desenvolvimento, debugging (depuração) e monitoramento
das aplicações Java. Note que o compilador Java (javac) encontra-se no JDK.
Para se escrever e executar um programa em Java são necessários um editor para escrevermos
o programa e um prompt de comando, para chamarmos o compilador (javac) e, por fim,
executarmos o programa. No entanto, existe uma forma mais amigável, através das IDEs,
de escrevermos e manipularmos programas em Java, seja para editar, compilar, depurar ou
executar.
10
Introdução à linguagem de programação • CAPÍTULO 1
» Eclipse;
» NetBeans;
» IntelliJ.
Java é classificada como uma linguagem fortemente tipada. Isso quer dizer que todos os
dados básicos manipulados por um programa Java estão associados a determinado tipo.
Quando realizamos qualquer operação com diversos dados diferentes, o Java usa o
tipo de cada dado para verificar se a operação é válida. Assim, se houver qualquer
incompatibilidade entre os tipos de dados, o compilador Java acusa como um erro.
A linguagem Java tem oito tipos primitivos de dados, como mostrado na Tabela 1.
Saiba mais
O tamanho dos tipos de dados independe da arquitetura da máquina, ou seja, o tipo int terá sempre 32 bits, seja qual forda
máquina onde o programa Java estiver sendo executado.
As variáveis irão armazenar dados que serão, muitas vezes, de um dos tipos de dados
apresentados na seção anterior. E como declaramos uma variável em Java? Vejamos alguns
exemplos:
11
CAPÍTULO 1 • Introdução à linguagem de programação
int _a;
double $c;
long nomeBastanteExtensoParaMinhaVariavel;
int i, j;
boolean achou;
Atenção
Quando temos duas ou mais variáveis do mesmo tipo podemos declará-las juntas, separando-as por vírgula.
TipoDeDados IdentificadorDaVariável;
Então, para declarar uma variável para armazenar a idade, por exemplo, teremos:
int idade;
» underscore ( _ ).
12
Introdução à linguagem de programação • CAPÍTULO 1
extends, final, finally, float, for, goto, if, implements, import, instanceof, int, interface,
long, native, new, package, private, protected, public, return, short, static, strictfp,
super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while,
assert, enum
Importante
» Palavras reservadas não devem ser usadas para identificar variáveis ou constantes ou classes ou métodos.
Podemos inicializar uma variável no momento da declaração. Para isso, é preciso atribuir um
valor à variável. Normalmente, no estudo de algoritmos, o operador de atribuição usado é ←.
Aqui em Java, o operador para atribuição é o = .
Exemplos:
double $c = 0.1;
int i = 0, j = 1;
Importante
» Se você tentar usar uma variável antes de definir seu valor, o compilador Java vai acusar um erro.
13
CAPÍTULO 1 • Introdução à linguagem de programação
As constantes são, muitas vezes, definidas no programa por trazerem legibilidade e facilitarem
a manutenção. Mais adiante, em outro capítulo, haverá essa percepção.
Importante
Constantes não podem ter seu valor alterado durante o programa. Portanto, caso haja uma tentativa de alterar um desses
valores, o compilador Java acusará erro.
Pelo que foi visto até agora, as variáveis ou constantes podem receber valores inteiros, de
ponto flutuante, caracteres, booleanos e strings, conforme indicado a seguir:
» Valor inteiro
› Composto de dígitos de 0 a 9.
› Exemplos:
19 → int
-3 → int
› Exemplos:
0.234 → double
-125.65 → double
» Valor caracter
› Exemplos:
14
Introdução à linguagem de programação • CAPÍTULO 1
» Valor booleano
» Valor string
› Exemplos:
“Oba!”
“Rio de Janeiro”
“A resposta é:”
“a”
Saiba mais
Quando as aspas fazem parte de uma string, precisamos usar \ antes da aspa. Isso ocorre porque as aspas são usadas para
delimitar uma string, ou seja, para abri-la e fechá-la.
Convenções
Apesar de não ser obrigatório, Java tem algumas convenções de nomenclatura que os
programadores seguem:
nomeCliente
matriculaAluno
cpf
dataNascimento
» Nomes de constantes: devem ser definidas em caixa alta e usar o underscore como
separador. Exemplos:
LIMITE_SUPERIOR
MAX
15
CAPÍTULO 1 • Introdução à linguagem de programação
AloMundo
Cliente
Disciplina
SistemaAcademico
AlunoBolsista
UnidadeEnsino
Vejamos como fazer entrada e saída de dados em Java, por enquanto, sem muitos
formalismos.
16
Introdução à linguagem de programação • CAPÍTULO 1
Observe o uso da classe System e o uso de out, que representa a saída de vídeo (output).
Além deles, usou-se o método println que imprime na tela e faz, em seguida, uma quebra
de linha (ln).
Classe System
» A classe System define, dentre outras coisas, os arquivos de entrada e saída padrões.
» Note que in e out são objetos e, por isso, podemos acessar seus métodos.
» Para a saída de dados via console (vídeo) usamos os métodos print, println ou printf
do objeto out.
Se a linha de código
a mensagem seria impressa na tela sem quebra de linha, pois o método print imprime na tela,
sem posicionar o cursor na próxima linha.
Para a entrada de dados via teclado, será usada a classe Scanner. Note que Scanner vem de
scan, que remete a “varredura”. Podem ser realizadas várias ações nessa “varredura”, como,
por exemplo: ler o próximo inteiro, ler o próximo valor real (tipos double ou float), entre
outros.
Classe Scanner
» Como a classe Scanner não está definida em uma biblioteca padrão, é necessário
informar onde ela se encontra. Para isso, é preciso usar o comando import: import
java.util.Scanner;
17
CAPÍTULO 1 • Introdução à linguagem de programação
import java.util.Scanner;
int idade;
idade = teclado.nextInt();
System.out.println(“Idade = “ + idade);
} // fim da classe
Analisando cada linha do programa Leitura, considerando que foi digitado o valor 25 na
entrada padrão:
18
Introdução à linguagem de programação • CAPÍTULO 1
Saiba mais
» O pacote pode ser padrão, como o java.lang ou não. O pacote java.util tem várias classes, entre elas, a classe Scanner.
import java.util.Scanner;
19
CAPÍTULO 1 • Introdução à linguagem de programação
nota1 = teclado.nextFloat();
nota2 = teclado.nextFloat();
media = (nota1+nota2)/2;
System.out.println(“Média = “ + media);
} // fim da classe
Atenção
O ponto é o separador de casas decimais quando programamos e trabalhamos com float ou double.
Para entrada de dados, o usuário vai usar a vírgula, que é o separador padrão de decimais no sistema numérico brasileiro.
Note que a média foi impressa com duas casas decimais. E se quisermos especificar apenas
uma casa decimal? Nesse caso, é preciso usar o printf ao invés de print ou println. Assim, a
linha
20
Introdução à linguagem de programação • CAPÍTULO 1
System.out.println(“Media = “ + media);
ficará
O printf não trabalha com a concatenação (+) e precisa do formato de impressão. O formato
de impressão, que deverá estar sempre entre aspas, será “%.1f” indicando que se trata de
ponto flutuante (%f) e que se terá exatamente uma casa decimal (.1).
Saiba mais
System.out.println(“Idade = “ + idade);
O formato de impressão é o %d porque idade é uma variável inteira. Note ainda, o uso do código especial \n que indica nova
linha. Com printf é necessário usar \n, sempre entre aspas duplas, se quisermos ter uma nova linha após a impressão.
21
CAPÍTULO 1 • Introdução à linguagem de programação
variável = expressão
» Uma variável
» Uma constante
» Uma expressão
Exemplos:
int i, j, k;
22
Introdução à linguagem de programação • CAPÍTULO 1
x = 10;
y = 3;
soma = x + y;
produto = x * y;
quociente = x/y;
resto = x%y;
x = 10 y = 3 soma = 13
Produto = 30
Quociente = 3
Resto = 1
Resultado da divisão:
3.3333333333333335
Temos no trecho desse programa várias expressões, a saber: x * y, x/y, x/z e x%y. Observe
que, como não foi usado printf, apareceram muitas casas decimais. Se a linha
23
CAPÍTULO 1 • Introdução à linguagem de programação
x = 10 y = 3 soma = 13
Produto = 30
Quociente = 3
Resto = 1
Resultado da divisão:
3.3333333333333335
Quando existem vários operadores em uma mesma expressão, é importante saber a ordem
de precedência, ou seja, que operação deve ser realizada primeiro e quais as próximas
operações a serem realizadas.
Operadores Associação
++ -- Direita para esquerda
* / % Esquerda para direita
+ - Esquerda para direita
Por exemplo, a multiplicação, a divisão e o cálculo do resto são feitos antes da soma e
subtração. E quando se faz a multiplicação, se lê a expressão da esquerda para a direita. E
quando se tem multiplicação e divisão em uma mesma expressão? Vale a regra matemática: a
operação que aparecer primeiro é feita primeiro.
Mas, note que, assim como na Matemática, é possível mudar a precedência das operações
usando parênteses nas expressões. Vejamos alguns exemplos:
int z = 10;
z++; //z passará a valer 11. O efeito com ++z; seria o mesmo.
24
Introdução à linguagem de programação • CAPÍTULO 1
Importante
» O operador / pode ser aplicado tanto a valores inteiros quanto a valores de ponto flutuante (float ou double).
» Quando todos os argumentos do operador / são inteiros, então o resultado será um número inteiro, ou seja, a parte
decimal é desprezada.
int i = 6, j = 3, k = 4, r;
r = i / j; r recebe o valor 2
Vejamos agora os operadores de incremento e decremento, que são muito usados em Java.
{ x++
++x
usa o valor de x e depois incrementa x
int i, j, k;
i = 10;
j = i++;
k = ++j;
i = 10;
j = i;
i++;
++j;
k = j;
25
CAPÍTULO 1 • Introdução à linguagem de programação
Observe o seguinte:
Então, como ficarão os exemplos mostrados? Considere que as variáveis quantidade, salario e
percentual já foram previamente declaradas.
ficará
26
Introdução à linguagem de programação • CAPÍTULO 1
Saiba mais
Sintaxe de uma linguagem de programação diz respeito às regras ou normas da linguagem. Por exemplo, toda declaração
de variável em Java é finalizada com ponto e vírgula. Isso é uma regra da linguagem, que pode ou não existir em outras
linguagens de programação.
Quando misturamos vários tipos em uma expressão, o Java tenta sempre converter os tipos
com valores menos significativos para tipos mais significativos para não haver perda de
dados durante o processamento.
Exemplos:
Se uma expressão envolve tipos byte e int, os valores das variáveis do tipo byte serão
convertidos para int antes de avaliar a expressão.
Se uma expressão envolve os tipos int, float e double, os valores das variáveis int e float serão
convertidos para double antes da avaliação.
Uma expressão só pode ser atribuída a uma variável se o tipo dessa expressão for igual
ou menos significativo que o tipo da variável. Caso contrário, será gerado um erro de
compilação. Assim, a atribuição deve ser feita obedecendo à seguinte ordem:
Exemplos:
» Um expressão do tipo float pode ser armazenada em uma variável do tipo float ou
double.
» Uma expressão do tipo long pode ser armazenada em uma variável do tipo long,
float ou double. Se tentar atribuir a uma variável do tipo int, ocorrerá erro.
27
CAPÍTULO 1 • Introdução à linguagem de programação
Para forçarmos a conversão de um tipo para outro usamos o operador de casting. Existem
duas sintaxes:
Exemplos:
int i = 6, j = 3, k = 4;
» Uma vez que tudo foi devidamente instalado, como começar a usar o Eclipse?
Vamos focar no que é essencial, visto que o Eclipse tem muitas opções além do
que iremos usar aqui.
» Veja que o menu Help tem uma ajuda, inclusive com tutorial.
Passos para criar um programa Java (arquivo de extensão .java), compilar e executar na IDE
eclipse (Version: 2022-03 (4.23.0)):
28
Introdução à linguagem de programação • CAPÍTULO 1
29
CAPÍTULO 1 • Introdução à linguagem de programação
Passo 4: Com o botão direito do mouse na pasta src, escolha New – File, para criar um novo
arquivo na pasta. Note que src vem de source, que significa fonte. Assim, na pasta src será
escrito o arquivo .java, que é o arquivo fonte.
Passo 5: Aparecerá uma nova janela, na qual deverá ser digitado o nome do arquivo fonte,
que será PrimeiroProg. Logo em seguida, clique no botão Finish para finalizar a criação do
arquivo.
Passo 6: Foi criado um arquivo (ainda vazio) de nome PrimeiroProg dentro do pacote default
(padrão). Veja à direita, parte do arquivo .java onde serão escritas as linhas do programa.
30
Introdução à linguagem de programação • CAPÍTULO 1
Passo 7: Editando o primeiro programa na janela do editor à direita, conforme a Figura 13.
Passo 8: Salvando, compilando e executando com Run. Note que apenas para salvar,
pode ser usado o ícone do disquete ou escolher File – Save. Para apenas compilar, escolha
Project – Build Project. Mas se você já está decidido que quer executar, escolha Run – Run,
pois o projeto será compilado e executado.
31
CAPÍTULO 1 • Introdução à linguagem de programação
Passo 9: Provocando um erro de sintaxe no arquivo. Veja que o erro já é apontado de imediato.
Apareceu a mensagem indicando “erro de sintaxe, insira ; para completar o bloco”. Nem foi
preciso compilar, neste caso.
Sintetizando
Síntese do capítulo:
» A plataforma Java é definida apenas em software e tem dois componentes: a JVM e a API Java.
» JDK é o kit de desenvolvimento Java que inclui o compilador javac, o ambiente de execução (JRE), debugging, entre outros.
» Existem oito tipos de dados primitivos em Java: int, long, float, double, char, boolean, byte e short.
» Toda declaração de variável em Java começa pelo tipo e é finalizada com ponto e vírgula.
» Para entrada de dados podemos usar a classe Scanner, que precisa ser importada com import.
» Operador de atribuição: =
32
COMANDOS DA LINGUAGEM JAVA
CAPÍTULO
2
Introdução ao capítulo
Neste capítulo serão estudados vários comandos da linguagem Java, a saber: comandos de
seleção (if, if/else e switch...case) e comandos de repetição (while, for e do/while). Além
disso, serão estudados os operadores relacionais e lógicos, entre outros, nos levando ao uso da
tabela verdade de cada operador lógico.
Objetivos do capítulo
Assim como acontece no dia a dia, os programas em Java também usam condições para
decidir se determinadas instruções serão executadas ou não.
Fonte: https://www.shutterstock.com/pt/image-vector/business-man-character-has-take-difficult-357576257.
33
CAPÍTULO 2 • Comandos da linguagem Java
Seleção
Simples
Estruturas
de Seleção
Seleção de
Seleção
Múltipla
Escolha
Composta
A seleção simples é implementada pelo comando if. Note que if significa se.
Sintaxe:
if (expressão_lógica) comando;
if (expressão_lógica) {
bloco de instruções
Importante
Se for verdadeira, o comando ou o bloco de instruções será executado. Caso contrário, ou seja, se a expressão_lógica for
falsa, nem o comando e nem o bloco de instruções será executado.
» As expressões lógicas, ou seja, as expressões que podem ser verdadeiras ou falsas, podem fazer uso de operadores
relacionais e/ou lógicos.
34
Comandos da linguagem Java • CAPÍTULO 2
System.out.println(“Maior de idade.”);
System.out.println(“Continuando... “);
Análise do exemplo: Primeiro a variável idade recebe o valor 20. Em seguida, é feito um teste:
idade é maior ou igual a 18? Verdadeiro ou falso? Note o uso do operador relacional >= (maior
ou igual).
Vejamos:
Maior de idade
Continuando...
System.out.println(“Maior de idade.”);
A única diferença deste último exemplo para o anterior é que as duas instruções, a saber:
System.out.println(“Maior de idade.”);
35
CAPÍTULO 2 • Comandos da linguagem Java
serão executadas caso a condição (idade >= 18) seja verdadeira e depois o fluxo da execução
seguirá para a próxima instrução após o bloco. Caso a condição seja falsa, nada no bloco
será executado e o fluxo da execução seguirá para a primeira instrução após o fim do bloco.
Atenção
Note que todo bloco, visto aqui ou com qualquer outro comando, terá duas ou mais instruções que deverão ser postas,
obrigatoriamente, entre chaves.
Qualquer comando, além do comando condicional simples, que trabalhe com expressões lógicas poderá ou não fazer uso de
operadores relacionais e lógicos.
Nos dois últimos exemplos foi usado o operador relacional >= (maior igual). Para podermos
comparar valores ou expressões ou conteúdo de variáveis, por exemplo, a linguagem Java
oferece os operadores relacionais. Além estes, existem os operadores lógicos que nos
permitem escrever expressões lógicas mais interessantes.
» Operadores relacionais
Operador Significado
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a
== Igual a
!= Diferente de
Exemplos:
36
Comandos da linguagem Java • CAPÍTULO 2
» Operadores lógicos
Operador Significado
&& E (AND)
|| OU (OR)
! NEGAÇÃO (NOT)
Note que a condição numero1 < numero2 é verdadeira, em ambos os trechos. Considerando
o 2º exemplo, temos que a condição numero2 < 100 também é verdadeira. Nesse caso, temos
que a condição é inteiramente verdadeira e, assim, a instrução
será executada.
Para podermos trabalhar com expressões que usam operadores lógicos, é preciso que se tenha
conhecimento da tabela verdade desses operadores. Vamos, então, relembrar!
» Tabela Verdade
Considere que Expr1 e Expr2 são duas expressões que podem ser verdadeiras ou falsas,
sendo V para verdadeiro e F para falso.
37
CAPÍTULO 2 • Comandos da linguagem Java
|| que é o OU lógico
Expr1 Expr2 Expr1 || Expr2
V V V
V F V
F V V
F F F
! que é o NÃO
Expr ! Expr
V F
F V
int a = 2, b = 4, c = 3;
Qual foi o raciocínio? Vejamos, considerando aqui, para facilitar, V para verdadeiro e F para
falso:
38
Comandos da linguagem Java • CAPÍTULO 2
VeV → verdadeira
→V eV → verdadeira
→ -8 >= 0 e 4 > 0
→ F eV
→ falsa
→ (V e V) ou V
→ V ou V → verdadeira
Até agora vimos muitos tipos de operadores: aritméticos, de atribuição, de casting, relacionais,
lógicos etc. Como fica a precedência quando temos vários operadores em uma grande
expressão? Para responder a essa pergunta, temos que ver a tabela 11, que também mostra
como associar esses operadores: da direita para a esquerda (←) ou da esquerda para a direita
(→).
39
CAPÍTULO 2 • Comandos da linguagem Java
Considere que seja preciso calcular a média de duas notas e a partir daí, dar uma das
mensagens: “Aprovado” ou “Reprovado”. Vamos considerar que a média para aprovação seja
7.0.
Sintaxe:
if (expressão_lógica)
comando1;
else
comando2;
if (expressão_lógica)
bloco1 de instruções
else
bloco2 de instruções
if (expressão_lógica1)
comando1;
else if (expressão_lógica 2)
comando2;
else
comando3;
40
Comandos da linguagem Java • CAPÍTULO 2
Importante
» Um bloco de comandos/instruções é formado por duas ou mais instruções e deve estar entre chaves.
» Em um bloco de comandos, seja no if ou no else, é possível termos outro comando condicional, simples ou composto,
bem como qualquer outra instrução, como uma atribuição, por exemplo.
» O último retângulo mostra o comando if/else aninhado ou encadeado. Nesse caso, no lugar de qualquer um dos
comandos (comando1 ou comando2 ou comando3) é possível também termos blocos de instruções.
Exemplo: Para fazer um programa para o problema proposto, será adicionado o trecho com if/
else a um exemplo já visto.
import java.util.Scanner;
nota1 = teclado.nextFloat();
nota2 = teclado.nextFloat();
media = (nota1+nota2)/2;
System.out.println(“Media = “ + media);
System.out.println(“Aprovado “);
else
41
CAPÍTULO 2 • Comandos da linguagem Java
System.out.println(“Reprovado “);
} //fim main
} //fim classe
O comando condicional composto pode ser substituído por uma versão mais enxuta se for
usado o operador ternário ? : . Portanto, tal operador é usado em expressões condicionais e
sua sintaxe é:
senão
int menor, i, j;
if (i < j)
menor = i;
else menor = i < j ? i : j;
menor = j;
» Com if/else
System.out.println(“Aprovado “);
else
System.out.println(“Reprovado “);
42
Comandos da linguagem Java • CAPÍTULO 2
» Com o operador ? :
int i = 1, j = 2, k = 3;
i = i > k ? i : k; // Resposta: 3
i = i > 0 ? j : k; //Resposta : 2
int num;
System.out.println(“Digite um número:”);
num = teclado.nextInt();
if (num < 0)
else
if (num == 0)
else
Considere um trecho de código em Java com vários testes em igualdade. Pode ser ruim ler
ou dar manutenção a um programa deste tipo? Sim! Imagine se o programa tiver muito mais
linhas de código.
43
CAPÍTULO 2 • Comandos da linguagem Java
int num;
num = teclado.nextInt();
if (num == 10)
System.out.println(“Valor 10.”);
else
if (num == 20)
System.out.println(“Valor 20.”);
else
if (num == 30)
System.out.println(“Valor 30.”);
else
if (num == 40)
System.out.println(“Valor 40.”);
else
Usar o comando
switch.
Fonte: https://pixabay.com/pt/vectors/l%c3%a2mpada-el%c3%a9trica-id%c3%a9ia-ilumina%c3%a7%c3%a3o-1926533/.
44
Comandos da linguagem Java • CAPÍTULO 2
int num;
num = teclado.nextInt();
switch (num) {
break;
break;
break;
break;
} //fim do switch
Observe o seguinte:
» O valor de num pode ou não estar de acordo com um dos valores constantes (10
ou 20 ou 30 ou 40). Caso não esteja, a opção default (padrão) será executada.
45
CAPÍTULO 2 • Comandos da linguagem Java
Importante
O comando switch:
» É um comando de seleção semelhante ao if-else, porém ele é mais recomendado quando temos muitos caminhos
possíveis a partir de uma única condição.
» A expressão do switch deve ser do tipo caractere (char) ou inteiro (byte, short, int ou long) ou String.
Sintaxe:
switch(expressão) {
comando2;
break;
break;
comando5;
break;
Atenção
» Quando o switch encontra uma opção igual ao valor da expressão, ele executa todos os comandos daí em diante até
encontrar o comando break.
46
Comandos da linguagem Java • CAPÍTULO 2
Exemplo: Trecho de programa em Java com o comando switch. Considere a variável caracter
previamente declarada char caracter; e definida.
switch (caracter) {
case ‘a’:
case ‘e’:
case ‘i’:
case ‘o’:
break;
break;
1ª execução: Suponha que o caracter seja o e. Neste caso, o case e é alcançado e como está
vazio, segue-se em frente, “invadindo” os cases seguintes, até encontrar um break e o switch
terminar.
Então, será impressa a mensagem É uma vogal e depois, o switch termina. Note que o mesmo
ocorrerá para qualquer vogal.
2ª execução: Suponha que o caracter seja o x. Neste caso, o case x é alcançado e é impresso
Letra X . Como não tem break neste case, a execução continua e invade o trecho a seguir, que
é o default. Então, logo em seguida é impressa Letra inválida e, por fim, o switch termina.
3ª execução: Suponha que caracter armazene um valor que não tenha em nenhum case.
Neste caso, a opção default será executada, imprimindo a mensagem Letra inválida, para
logo em seguida o switch terminar.
47
CAPÍTULO 2 • Comandos da linguagem Java
» while
» for
» do...while
Avalia uma expressão lógica e executa um bloco de comando enquanto a expressão lógica
for verdadeira, sendo que o bloco é executado ZERO ou mais vezes. Note que while significa
enquanto.
Sintaxe:
while (expressão_lógica)
bloco de comandos;
while (expressão_lógica)
comando;
int num;
num = 1;
48
Comandos da linguagem Java • CAPÍTULO 2
Este comando executa um bloco de comando enquanto uma expressão lógica for verdadeira.
Sintaxe:
comando;
bloco de comandos;
comando1;
comando2;
49
CAPÍTULO 2 • Comandos da linguagem Java
inicialização;
while (expressão_lógica) {
comando1;
comando2;
incremento/decremento;
Saiba mais
O for é constituído de três partes: inicialização, expressão lógica e incremento/decremento. Entretanto, nenhuma dessas
partes é obrigatória.
int num;
Observe que:
» System.out.println(num); é a instrução/comando
int num;
50
Comandos da linguagem Java • CAPÍTULO 2
Ou ainda:
int num = 1;
System.out.println(num);
num++;
No caso deste comando é necessário primeiro fazer (do) para depois testar. Então, podemos
ler: faça o bloco de comandos enquanto for verdade a condição ou expressão lógica. Dessa
forma, o bloco é executado uma ou mais vezes.
Sintaxe:
do {
} while (expressão_logica);
É interessante usar este comando quando, por exemplo, o usuário entra com um valor
inválido e queremos dar outra(s) chance(s) para que a entrada seja corretamente fornecida.
Exemplo: Seja um programa em Java para ler um valor inteiro maior que zero e depois
imprimir os números de 1 até o valor fornecido na entrada.
1. Para tratar a entrada do valor inteiro que deve ser maior que zero será usado o
comando do...while.
2. Para imprimir os números de 1 até o valor inteiro positivo é possível usar for ou
while. Vejamos com for.
import java.util.Scanner;
51
CAPÍTULO 2 • Comandos da linguagem Java
int n, i;
do {
n = teclado.nextInt();
if (n <= 0)
System.out.println(i);
} //fim da main
52
Comandos da linguagem Java • CAPÍTULO 2
1. A execução do trecho
do {
n = teclado.nextInt();
if (n <= 0)
2. Considere que o 1º valor digitado para n foi -1. Então n recebeu -1. Em seguida, o
teste do if é executado. Ou seja, -1 <= 0 ? Sim! Verdadeiro. Então, a instrução dentro
do if é executada e é impressa na tela a mensagem Entrada inválida. Em seguida, a
condição do do...while é testada e também é verdadeira. Isso faz com que o fluxo da
execução volte para o do (faça) e entre no bloco do comando.
System.out.println(i);
53
CAPÍTULO 2 • Comandos da linguagem Java
i n i <= n TELA
1 3 1 <= 3? Verdadeiro 1
2 2 <= 3? Verdadeiro 2
3 3 <= 3? Verdadeiro 3
4 4 <= 3? Falso. Sai do for
5. O trecho
System.out.println(i);
I = 1;
while (i <= n) {
System.out.println(i);
i++;
Conforme já estudado, o comando break pode ser usado nos cases do comando switch para
permitir a saída do switch. Mas existe outro uso: a saída de loops, ou seja, dos blocos de
repetição escritos com for, while ou do...while.
O trecho com do...while, do exemplo anterior, pode usar o comando break da seguinte forma:
do {
n = teclado.nextInt();
if (n <= 0)
System.out.println““Entrada invalida.““);
else
54
Comandos da linguagem Java • CAPÍTULO 2
Assim, se o valor de n for maior que zero, por exemplo 5, o teste do if será falso e o trecho
do else será executado. Ou seja, o break será executado, interrompendo o loop. Nesse caso, a
expressão lógica do do...while não será alcançada.
Se por um lado o comando break termina o loop, o comando continue força o início da
próxima iteração do loop de um comando de repetição. Vejamos um exemplo.
Exemplo:
if (i == 3)
System.out.println(i);
i i >= 1 i == 3 TELA
5 5 >= 1? Verdadeiro Falso
4 4 >= 1? Verdadeiro Falso 5
3 3 >= 1? Verdadeiro Verdadeiro 4
Obs.: Executa o continue, que direciona a execução 2
para a linha do for, não imprimindo o valor 3.
1
2 2 >= 1? Verdadeiro Falso
1 1 >= 1? Verdadeiro Falso
0 0 >= 1? Falso (sai do for)
Vejamos alguns exemplos de programa em Java usando Eclipse, seguindo um outro possível
caminho diferente do mostrado no Capítulo 1.
Passo a passo:
55
CAPÍTULO 2 • Comandos da linguagem Java
2. Com o botão direito do mouse no nome do projeto (janela criada à esquerda), clique
em New → Class.
Aparecerá uma janela onde deverá ser escrito o nome da classe (Name: ) e depois,
deverá ser marcada a opção public static void main(String [] args). Por fim, clique
em Finish.
Exemplo: Programa para ler um valor inteiro e dizer se o valor é par ou ímpar.
import java.util.Scanner;
int num;
num = teclado.nextInt();
if (num % 2 == 0)
System.out.println(num + “ eh par”);
else
System.out.println(num + “ eh impar”);
}//fim main
}//fim classe
Observações:
56
Comandos da linguagem Java • CAPÍTULO 2
import java.util.Scanner;
int num;
num = teclado.nextInt();
if (num % 3 == 0)
else
}//fim main
}//fim classe
import java.util.Scanner;
int num;
57
CAPÍTULO 2 • Comandos da linguagem Java
num = teclado.nextInt();
else
}//fim main
}//fim classe
if (i % 2 == 1)
ou
if (i % 2 != 0)
int i;
if (i % 2 == 0)
System.out.println(i);
} //fim main
} //fim classe
58
Comandos da linguagem Java • CAPÍTULO 2
Observação: A variável i poderia ter sido inicializada com 2, visto que 1 é ímpar.
int i;
i = 1;
if (i % 2 == 0) //testa se é par
System.out.println(i);
} //fim while
} //fim main
} //fim classe
import java.util.Scanner;
int i;
59
CAPÍTULO 2 • Comandos da linguagem Java
System.out.println(i);
} //fim main
} //fim classe
Observação: i += 2 equivale a i = i + 2
Sintetizando
Síntese do capítulo:
» Pode-se usar o comando break para terminar um loop com qualquer um dos três comandos.
60
CAPÍTULO
CONCEITOS E IMPLEMENTAÇÃO
USANDO ORIENTAÇÃO A OBJETOS 3
Introdução do capítulo
De forma simplificada, podemos dizer que desenvolver um sistema é criar uma solução
computacional para um problema do mundo real.
O sistema orientado a objetos pressupõe que o mundo é composto por objetos, que integram
dados e funções. Os sistemas são criados a partir de objetos que existem no domínio do
problema, isto é, os sistemas são modelados como um conjunto de objetos que interagem
entre si.
Saiba mais
Objetivos do capítulo
61
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
Fonte: https://pixabay.com/pt/vectors/casa-%c3%adcone-s%c3%admbolo-arquitetura-2492054/.
Fonte: https://pixabay.com/pt/vectors/bmw-carro-roadster-carro-esporte-158703/.
Para cada um dos objetos citados, é possível pensar nas características e nos comportamentos.
» Cor
» Marca
» Ano de fabricação
» Tipo de combustível
É possível associar um conjunto de valores aos atributos. No caso do objeto carro, a cor do
carro pode ser vermelha, azul, verde, entre outras.
62
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
» Acelerar;
» Frear;
» Ligar farol;
» Desligar farol;
» Estacionar.
Atenção
característica atributo
comportamento método
etc.
63
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
Observe que, a partir desse conjunto de atributos podemos representar todos os alunos.
› Inscrever em disciplina
› Trancar matrícula
› Consultar nota
› Consultar frequência
etc.
Fonte: https://www.shutterstock.com/pt/image-photo/happy-young-
university-students-studying-books-522554425. Fonte: elaborada pela autora.
Classificação
A criação da classe Aluno a partir dos objetos Aluno ocorre por um processo de abstração,
de acordo com as características (atributos) e os comportamentos (métodos) dos objetos
em questão.
abstrair
em
Fonte: elaborada pela autora.
64
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
Note que:
» A classe é um molde a partir do qual todos os objetos daquela classe são criados.
Quando criamos um objeto a partir de uma classe, dizemos que temos uma instância da
classe.
Importante
Um objeto tem valores associados aos atributos da classe à qual ele pertence.
» Nome
» CPF
» Data de nascimento
65
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
» Matrícula
» Altura
» Cor do cabelo
Como o contexto do objeto é um sistema acadêmico, temos que altura, cor do cabelo ou cor
dos olhos são irrelevantes. Então, para atributos dos objetos de uma classe Aluno teremos,
das possibilidades listadas acima, o nome, o CPF, a data de nascimento e a matrícula.
Atenção
As classes são os elementos básicos para construção de programas OO em linguagens como C++, Java e C#. Assim, para
construir um programa OO devemos, inicialmente, identificar as classes que fazem parte do problema que estamos tentando
resolver. As técnicas para identificação de classes fogem do escopo deste livro.
Exemplo: Imagine que desejamos implementar um editor gráfico que irá manipular figuras
geométricas em um plano cartesiano, como, por exemplo, retângulo, círculo, triângulo etc.
Quais as classes candidatas para esse projeto?
» Retângulo.
» Círculo.
» Triângulo.
» Base, altura, posição (x,y) no plano, cor da borda, cor de preenchimento, etc.
Para criar uma classe precisamos definir o lugar onde iremos colocar essa classe. No Java,
esse lugar é chamado de pacote.
Podemos imaginar o pacote como sendo um diretório ou uma pasta onde colocamos a
classe, sendo que podemos definir quantos pacotes quisermos e ainda, escolher o seu
nome, pois o nome do pacote é definido pelo próprio desenvolvedor.
66
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
De acordo com a convenção adotada no Java, os nomes dos pacotes devem ter somente
letras minúsculas.
Da mesma forma que podemos ter uma hierarquia de pastas, também podemos ter uma
hierarquia de pacotes. Assim, quando um pacote está dentro de outro, usamos o ponto (.)
para definir a hierarquia de pacotes.
Na figura anterior, é mostrado o exemplo da classe Pessoa que está dentro do pacote java.
mhs.unitri.javapos.
Vimos o que é pacote, mas precisamos saber das possibilidades em relação às classes.
Como uma classe pode ser?
» abstract
» final
package principal;
67
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
Por ser pública, a classe Retangulo é visualizada por todas as demais classes do sistema.
Importante
3.2 Encapsulamento
» private: só pode ser lido ou alterado na própria classe, ou seja, esse atributo não é
visível fora da classe.
» package: só pode ser lido ou alterado pelas classes do mesmo pacote. É a visibilidade
default (não precisa escrever package).
68
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
Saiba mais
Ser static significa que o atributo é da classe e ser final significa que o atributo é constante, ou seja, seu valor inicial não pode
ser alterado.
Importante
» Pelo princípio do encapsulamento, que é uma das características de OO, os atributos não devem ser visíveis por nenhum
objeto que não seja um objeto da própria classe ou de uma classe descendente ou filha (herança).
Um atributo pode ser, explicitamente, inicializado da mesma forma que as variáveis. Note
que os atributos da classe Retangulo não foram inicializados. O que acontece neste caso? A
JVM (Java Virtual Machine) os inicializa, automaticamente, com valores default (padrão).
Importante
» boolean: false
69
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
A classe é um molde a partir do qual podemos representar objetos reais, como criar os objetos
da classe Retangulo que terão os atributos base e altura?
Vemos que, no caso da classe Retangulo, não há nada escrito além dos atributos. Então, qual
será o mecanismo para criar objetos desta classe?
É o construtor da classe Retangulo que permitirá que retângulos de diferentes bases e alturas
sejam criados ou construídos.
Saiba mais
Veremos, em outro momento, que é possível escrever código no construtor para dizer que queremos criar objetos com
valores não default para seus atributos.
Como é o construtor default ou padrão da classe Retangulo, que neste caso, não precisa ser
explicitado?
public Retangulo() {
Atenção
» Os parênteses estão vazios, o que significa que o construtor não recebe nada, ou seja, não tem parâmetros.
» Dentro das chaves nada está escrito, visto que os atributos da classe serão inicializados com valores default.
//atributos privados
70
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
public Retangulo() {
Agora veremos como criar retângulos, ou seja, objetos ou instâncias da classe Retangulo.
Para isso, iremos trabalhar na main. Lembra que é pela main que a execução começa? Note
que a main sempre será escrita dentro de uma classe pública. Neste caso, será a classe
TestaRetangulo.
Importante
» O operador new é usado para criar um objeto, ou seja, uma instância de uma classe.
» Ao declararmos uma variável do tipo de uma classe não estamos criando o objeto em si, mas somente uma referência para
o objeto.
?
Fonte: elaborada pela autora.
71
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
Ou seja, r referencia uma área de memória, sem ainda se ter um objeto da classe Retangulo.
» Em r = new Retangulo(); a variável r passa a referenciar o objeto criado. E como o construtor é o default, os valores dos
atributos do objeto são inicializados, na sua criação, com zero.
base = 0.0
altura = 0.0
» Um retângulo com base e altura zero deve, após a sua criação, ter os valores de seus atributos ajustados para valores
realistas. Ou seja, valores maiores que zero. Mas como fazer isso? Usando métodos de acesso.
» Note que:
Retangulo r;
r = new Retangulo();
Podem existir várias formas diferentes de criar um objeto. Assim, podemos ter vários
construtores diferentes para uma mesma classe.
<corpo do construtor>
Observe que:
Vamos escrever um construtor que receba, como parâmetros, os valores da base e da altura:
72
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
Como criar, por exemplo, um retângulo s com base 3.5 e altura 118.3 usando o construtor
acima? Basta escrever na main:
base = 3.5
altura = 118.3
73
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
this.base = base;
this.altura = altura;
//atributos privados
public Retangulo() { }
//outro construtor
this.base = base;
this.altura = altura;
74
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
} //fim main
Como acessar e alterar os valores dos atributos do objeto r que foi construído com base e
altura nulas, já que os atributos da classe Retangulo são privados?
A resposta é:
Métodos de acesso!
Métodos de acesso são usados para obter ou alterar atributos e usam os seguintes padrões:
return atributo;
75
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
atributo = novoValor;
Observe que os métodos getters irão retornar um valor de acordo com o tipo indicado
antes do nome do método. Já os setters não retornarão nada (void) e farão atribuições aos
atributos do objeto, pois recebem valor(es) passado(s) por parâmetro(s).
No caso da classe Retangulo, precisamos ter acesso à base e à altura para manipular seus
valores, seja alterando-os ou apenas usando-os. Nesse caso, teremos os métodos:
//atributos privados
public Retangulo() {
76
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
this.base = base;
this.altura = altura;
//métodos de acesso
Agora é possível alterar e obter os valores dos objetos r e s, criados na classe TestaRetangulo.
Vejamos algumas possibilidades de uso para os getters e setters:
77
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
+ “ Altura de r = “ + r.getAltura());
r.setAltura(4.0);
r.setBase(2.5);
//Imprimindo os dados de r e s
+ “ Altura de r = “ + r.getAltura());
+ s.getAltura());
} //fim da main
78
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
Importante
Para chamar um método de uma classe para um objeto da classe, usa-se a regra:
objeto.método
No programa acima tivemos as chamadas para os setters e os getters para os objetos r e s da classe Retangulo.
Além dos getters e setters, uma classe tem outros métodos que permitirão que os objetos
ou instâncias da classe realizem as operações dentro do contexto do problema.
» marca
Quais seriam os comportamentos desse robô, se fosse um robô voltado para tarefas
domésticas? Lavar, passar, cozinhar, limpar... Dessa forma, é possível ter, por exemplo, os
seguintes métodos:
» lavar;
» limpar;
» cozinhar;
» passar.
79
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
//atributos privados
public Retangulo() { }
this.base = base;
this.altura = altura;
//métodos de acesso
80
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
//outros métodos
+ “ Altura de r = “ + r.getAltura());
81
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
r.setAltura(4.0);
r.setBase(2.5);
//Imprimindo os dados de r e s
+ “ Altura de r = “ + r.getAltura());
+ s.getAltura());
r.imprimirDados();
s.imprimirDados();
82
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
System.out.println(“\n\nArea de r = “ + r.calcularArea());
System.out.println(“Area de s = “ + s.calcularArea());
System.out.println(“\n\nPerimetro de r = “ + r.calcularPerimetro());
System.out.println(“Perimetro de s = “ + s.calcularPerimetro());
} //fim da main
Java permite que tenhamos, na mesma classe, métodos com o mesmo nome, mas com
parâmetros diferentes. Isso é chamado sobrecarga de métodos (overload de métodos).
Mas é possível escrever, na mesma classe Retangulo, um outro redimensionar que receba
valores inteiros:
largura = larg;
83
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
altura = alt;
Os dois métodos para redimensionar o retângulo têm o mesmo nome, mas se diferenciam
pelos tipos dos parâmetros: double e int.
A linguagem Java não confunde os dois métodos porque eles têm assinaturas diferentes.
Atenção
E no seguinte caso:
Haverá erro de compilação. Apesar de um método não retornar nada (void) e o outro retornar um boolean, ambos recebem
dados inteiros. Por essa razão, são considerados métodos iguais.
//atributos privados
public Retangulo() { }
84
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
this.base = base;
this.altura = altura;
No Java existe uma classe bastante usada que implementa funções matemáticas chamada
Math. Todos os métodos dessa classe são estáticos (static), isto é, não dependem de
nenhum objeto para serem executados.
//Outros métodos
Importante
» sqrt é um método estático (static) que deve receber um valor double (veja o parâmetro x) e retornar um valor double.
85
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
Importante
Exemplos:
double x = 12.2;
Atenção
Uma outra classe super importante é a String. A classe String é pré-definida e está na
biblioteca de classes da linguagem. Portanto, note que a linguagem Java não possui um
tipo primitivo string como em algumas outras linguagens de programação.
86
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
Importante
Repare que não precisamos do operador new para criar o objeto String. O Java chama implicitamente esse operador.
A classe String tem mais de 60 métodos para manipulação de strings. Alguns dos métodos
mais usados são definidos na figura a seguir:
char c;
boolean ok;
c = str.charAt(2);
c = str.charAt(7);
ok = str.isEmpty();
87
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
Cada caractere possui uma posição dentro da string, que é, na verdade, o índice do elemento.
O 1º caractere está na posição 0, o 2º caracter na posição 1, o 3º caracter na posição 2 etc.
Então, podemos visualizar que em
int p;
p = str.indexOf(‘a’);
p = str.indexOf(‘O’);
p = str.indexOf(‘x’);
p = str.lastIndexOf(‘a’);
p = str.length();
p = str.indexOf(‘a’); // p recebe 5
p = str.indexOf(‘O’); // p recebe 12
p = str.indexOf(‘x’); // p recebe -1
p = str.lastIndexOf(‘a’); // p recebe 22
p = str.length(); // p recebe 31
88
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
boolean ok;
ok = str.startsWith(‘Progra’);
ok = str.startsWith(‘grama’);
System.out.println(str.toUpperCase());
System.out.println(str.substring(0, 6));
System.out.println(str.substring(3, 8));
System.out.println(str.toUpperCase());
89
CAPÍTULO 3 • Conceitos e Implementação usando Orientação a Objetos
System.out.println(nome.trim());
System.out.println(nome.trim().toUpperCase());
System.out.println(nome.trim().toUpperCase());
Importante
Isso significa dizer que, uma vez criada, não podemos alterar o conteúdo de uma string.
» Quando usamos um método que “altera” a string, na realidade estamos criando um outro objeto na memória.
Exemplo:
"PROGRAMAÇÃO-ORIENTADA-A-OBJETOS"
» equals()
» equalsIgnoreCase()
90
Conceitos e Implementação usando Orientação a Objetos • CAPÍTULO 3
» compareTo()
» compareToIgnoreCase()
Exemplo: Seja o trecho em Java. Para testar, não esqueça de importar o pacote da classe
Scanner.
nome1
"Joao" nome1 == nome3
nome3
nome1 != nome2
"Joao"
nome2
Sintetizando
Síntese do capítulo:
» Todo objeto tem atributos e métodos que serão definidos na classe a qual o objeto pertence.
» As classes podem pertencer a um pacote, mas quando o pacote não é definido temos o default.
» Para acessar os atributos privados de uma classe podemos contar com os getters e setters.
» A classe Math tem vários métodos estáticos (static) que realizam as mais variadas tarefas matemáticas, como, por exemplo,
calcular a raiz quadrada, arredondamento etc.
» Para chamar um método static não é preciso instanciar a classe, ou seja, não é preciso criar um objeto da classe.
» A classe String tem um conjunto variado de métodos, como, por exemplo, pôr em letras maíusculas, pôr em minúsculas,
calcular o tamanho da string etc.
91
CAPÍTULO
CLASSES E OBJETOS: UMA VISÃO MAIS
APROFUNDADA 4
Introdução ao capítulo
Neste capítulo você estará diante da criação de programas mais elaborados, através da
aplicação de conceitos mais aprofundados como, por exemplo, herança e polimorfismo.
Após este estudo, ficará registrado como a linguagem de programação Java nos permite
reaproveitar código, possibilitando, dessa forma, ganho de produtividade e tempo.
Objetivos do capítulo
» Apresentar conceitos mais avançados, tais como classe abstrata e interface, na teoria
e na prática usando a linguagem Java.
4.1 Vetor
Importante
Para declarar um vetor, usamos o operador [ ] imediatamente após o tipo desejado. Exemplos:
int [ ] v;
float [ ] nota;
92
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Outra diferença importante é que, ao declarar um vetor, NÃO definimos o seu tamanho. Isso
significa dizer que, ao declarar um vetor, o Java NÃO aloca espaço na memória para o vetor.
float [ ] nota;
NULO
Saiba mais
Como vetor é um objeto, precisamos criá-lo com o operador new. É nesse momento que
definimos o seu tamanho. Exemplo:
float[ ] nota;
Aqui definimos o
nota = new float[10]; tamanho do vetor!
0 1 2 3 4 5 6 7 8 9
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Importante
93
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
Exemplo: Considere um projeto de nome TesteVetor com apenas uma classe, a classe
TesteVetor. Veja:
import java.util.Scanner;
Importante
Uma vez definido o tamanho do vetor com o operador new não podemos mais alterar esse tamanho.
Em algumas linguagens, o índice inicial do vetor pode ser negativo. Em Java, no entanto, os
índices variam de zero em diante. Caso um índice que esteja fora dos limites do vetor seja
acessado, ocorrerá erro.
float [ ] nota;
nota[10] = 8.0;
Assim como fazemos com variáveis comuns, também podemos inicializar vetores.
onde:
lista de valores é uma lista cujos elementos são separados por vírgula.
94
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Exemplos:
Cria automaticamente
float[ ] nota = { 5.5, 6.5, 7.0, 9.0, 8.0 }; um vetor de 5 posições.
Cria automaticamente
um vetor de 7 posições.
O atributo length do vetor pode ser usado para recuperar o tamanho do vetor. Não
confunda com o método length() da classe String!
} //fim da main
} //fim da classe
Existe uma outra sintaxe do comando for para percorrer vetores: o for-each. Essa forma é
usada apenas para ler os dados do vetor, mas não serve para alterar os dados do vetor.
Usando essa nova sintaxe, o programa anterior poderia ser reescrito como:
for (int n : v)
System.out.println(n); n é uma variável auxiliar que
} percorre o vetor v
}
95
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
1ª iteração: n = v[0]
imprimir n, ou seja, 2.
2ª iteração: n = v[1]
imprimir n, ou seja, 4.
3ª iteração: n = v[2]
imprimir n, ou seja, 6.
4ª iteração: n = v[3]
imprimir n, ou seja, 8.
5ª iteração: n = v[4]
imprimir n, ou seja, 10.
Além de vetor de tipos primitivos (int, float, char...), como mostrado nos exemplos, é possível
termos vetor de objetos.
Quando usamos um vetor de objetos, ao criar o vetor não estamos criando os objetos em
si, apenas referências para os objetos. Além do vetor, cada objeto deve ser criado com o
operador new.
96
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Retangulo [ ] r;
r
indefinido !
r = new Retangulo[3];
null null
base = 40
altura = 20
Quando criamos o primeiro retângulo,
este passa a ser referenciado por r[0].
r 0 1 2
base = 40
altura = 20
base = 10
base = 20
altura = 30
altura = 20
97
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
r[2].setBase(100);
r[2].setAltura(200);
r[i].imprimirDados();
} //fim main
} //fim classe
4.2 Relacionamento
Um objeto de uma classe pode estar relacionado a um objeto de outra classe ou a vários
objetos de outra classe. Ou ainda, vários objetos de uma classe podem estar relacionados a
vários objetos de outra classe.
98
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Exemplos:
está sendo dito que Um carro tem um motor. Um objeto da classe Carro está relacionado a
um objeto da classe Motor. Neste caso, podemos pensar em um esboço da classe Carro da
seguinte forma:
99
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
Definindo dessa forma, teríamos que representar os atributos e métodos comuns nas duas
classes, o que indica duplicidade de código.
Uma das características da Orientação a Objetos que vem a sanar a questão acima chama-se
herança.
Importante
» Herança é o mecanismo pelo qual classes herdam atributos e métodos através de um relacionamento hierárquico.
» Na herança, temos sempre uma classe definida de forma genérica que, posteriormente, é refinada em classes mais
específicas.
Exemplos:
ou subclasses ou superclasses
Atenção
Observe a forma de dizer que uma classe “é um tipo de” outra classe quando configurado o relacionamento hierárquico.
É possível existirem várias classes específicas para uma mesma classe genérica.
Veja os exemplos:
100
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Como dito antes, as classes específicas (filhas ou subclasses) herdam atributos e métodos
da sua classe genérica (mãe ou superclasse). Além disso, as classes específicas podem ter
atributos e métodos somente seus.
No exemplo:
A classe Veiculo vai conter os atributos e métodos comuns a todos os veículos e as classes
Carro e Caminhao vão conter os atributos e métodos específicos de carros e caminhões,
respectivamente.
101
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
Outro exemplo:
Importante
Para definir a herança entre duas classes devemos usar a palavra reservada extends na
definição da subclasse. Veja a sintaxe:
102
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
} //fim do construtor
103
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
this.qtdPassageiros = qtdPassageiros;
this.capacidadeBagagem = capacidadeBagagem;
} //fim construtor
Importante
this.qtdPassageiros = qtdPassageiros;
this.capacidadeBagagem = capacidadeBagagem;
this.cargaMaxima = cargaMaxima;
this.numeroEixos = numeroEixos;
104
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
this.cargaMaxima = cargaMaxima;
this.numeroEixos = numeroEixos;
Para testar, podemos criar, por exemplo, dois objetos: ca e cm. Veja!
ca
cm
placa = "KNX-3428"
modelo = "Ford Focus"
anoFabricacao = 2015
placa = "JRT-4983"
quilometragem = 8560
modelo = "VW Delivery"
qtdPasssageiros = 5
anoFabricacao = 2012
capacidadeBagagem = 350
quilometragem = 126385
cargaMaxima = 10000
numeroEixos = 2
Importante
105
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
Poli = vários
Morfismo = forma
Dentro do contexto de herança, sabemos que quando definimos uma subclasse, ela herdará
os métodos da superclasse. Entretanto, a subclasse pode redefinir um método herdado, ou
seja, implementar o método herdado de outra forma.
Importante
A palavra reservada super permite chamar o método da classe mãe que está sendo reescrito na classe filha (sobrescrita ou
overriding).
106
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
this.placa = placa;
this.modelo = modelo;
this.anoFabricacao = anoFabricacao;
this.kilometragem = kilometragem;
} //fim do construtor
+ “ Kilometragem= “ + kilometragem);
} //fim imprimirDados
O método imprimirDados na classe filha Carro pode ser escrito da seguinte forma:
+ “ Kilometragem= “ + kilometragem
Observe que os atributos da classe mãe Veiculo estão sendo acessados sem getters, pois os
atributos de Veiculo são protected.
107
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
this.qtdPassageiros = qtdPassageiros;
this.capacidadeBagagem = capacidadeBagagem;
} //fim construtor
super.imprimirDados();
+ “ Capacidade de Bagagem = “
+ capacidadeBagagem);
} //fim imprimirDados
108
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Exemplo:
Método original
public class Animal {
Vamos testar? Para isso, considere que foi criado o projeto Teste com as classes Teste
(com a main), Animal, Gato e Cachorro.
} //fim main
} //fim classe Teste
Exemplo: E se usarmos o exemplo anterior com uma nova versão da classe Gato conforme
indicado a seguir?
System.out.println(“miado”);
} //fim Gato
109
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
???
miado
latido
Exemplo: Considere a seguinte versão da classe Teste, a última versão da classe Gato e a
versão da classe Cachorro já vista.
} //fim main
} //fim classe Teste
Atenção
Apesar das variáveis a2 e a3 serem do tipo Animal, elas referenciam instâncias de Gato e Cachorro.
Assim, o Java decide qual método emiteSom() chamar baseado na instância que está sendo referenciada e não no tipo da
variável.
Exemplo: Considere as classes Animal, Gato (última versão) e Cachorro já vistas, mas uma
nova classe Teste como mostrado a seguir:
a = new Animal();
a.emiteSom(); Saída do programa:
} //fim main
} //fim Teste
110
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Exemplo: Ainda considerando as classes Animal, Gato (última versão) e Cachorro já vistas,
segue uma nova versão da classe Teste usando vetor.
Atenção
No momento da execução, o Java verifica o objeto referenciado por v[i] e decide qual método emiteSom() deve ser chamado.
111
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
Importante
Existem diferenças fundamentais entre os conceitos OO de sobrecarga e sobrescrita como mostra o quadro a seguir:
Exemplo: Uma outra maneira de programar a main da classe Teste é usando o comando
for-each e o operador instanceof.
Atenção
Para verificarmos a instância referenciada por uma variável, em tempo de execução, usamos
o operador instanceof.
112
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Traduzindo: instância de
Classes Abstratas são classes que representam abstrações (conceitos) e não objetos
concretos do mundo que estamos representando. Elas são usadas como moldes para a
criação de outras classes e podem conter atributos e métodos.
No exemplo da concessionária, Veiculo é uma classe abstrata. Note que Veiculo define um
molde a partir do qual as classes concretas Carro e Caminhao são definidas.
Poligono
113
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
Animal
Vertebrado Invertebrado
Mamifero Oviparo
E como indicar, durante a programação, que uma classe é abstrata? Usando a palavra
reservada abstract.
Importante
Classes abstratas são definidas em Java com o uso da palavra abstract na sua definição.
this.modelo = modelo;
this.anoFabricacao = anoFabricacao;
114
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Importante
Por não representarem elementos concretos, não é possível criar objetos a partir de classes abstratas. Ou seja, não é possível
instanciar uma classe abstrata.
Atenção
Quando definimos uma classe abstrata, muitas vezes nos deparamos com métodos que fazem sentido para aquela classe,
mas não temos como implementá-lo, porque a classe abstrata representa apenas uma abstração.
Exemplo:
Importante
As classes concretas que herdam da classe abstrata devem, obrigatoriamente, implementar os métodos abstratos.
Exemplo: Imagine um projeto Java com a classe abstrata Poligono (última versão do
exemplo anterior) e a classe Retangulo a seguir:
115
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
this.base = base;
this.altura = altura;
4.5 Interface
Cliente
ClientePF ClientePJ
Funcionario
116
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
Fornecedor
Fornecedor Fornecedor
Internacional Nacional
Note que, Cliente, Funcionario e Fornecedor precisam acessar o sistema usando um login
e uma senha. Por esta razão, é preciso implementar um método para verificar se, dado um
login e uma senha, esse usuário tem acesso ao sistema.
Neste caso específico, o que se quer é que as classes Cliente, Funcionario e Fornecedor
implementem o método:
Apesar de serem classes distintas, espera-se que todas as três classes sigam esse padrão
para autenticar os usuários, recebendo o login e a senha. Por esta razão, vamos definir uma
interface que todas essas classes devem implementar.
O método autenticar será implementado de forma diferente em cada caso, mas terá a mesma
assinatura.
Atenção
Não confunda interface com interface gráfica. Interface gráfica lida com botão, caixas de texto etc.
A definição de interface é parecida com a de uma classe, mas note que ela não implementa
os métodos! Observe a interface Autenticavel a seguir:
117
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
Repare que a interface só expõe o que o objeto deve fazer, e não como ele faz. Como ele faz
vai ser definido em uma implementação dessa interface, em cada classe que implementar
esta interface.
Assim como as classes, uma interface deve estar em um arquivo próprio, com o mesmo
nome da interface.
Atenção
Uma classe pode implementar várias interfaces. É só separar os nomes das interfaces por
vírgula. Exemplo:
Atenção
É permitido que uma mesma classe use o extends e o implements ao mesmo tempo.
118
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
// para o cliente
// para o funcionário
Atenção
Exemplo:
Autenticavel a;
Erro de compilação.
a = new Autenticavel();
Exemplo:
Autenticavel a;
a = new Cliente();
a.autenticar(“joao”, “123”);
119
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
Veja a figura 49 para saber o que pode e o que não pode ao definir uma interface.
Atenção
As constantes definidas em uma interface são herdadas pelas classes que implementam essa interface. Entretanto, como elas
são públicas, podem ser usadas em qualquer lugar.
//atributos privados
120
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
//construtor
this.matricula = matricula;
this.salario = salario;
this.nome = nome;
this.titulacao = titulacao;
//métodos
121
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
+ “ de matricula “ + matricula);
} //fim imprimir
import java.util.Scanner;
int mat;
float salario;
122
Classes e objetos: uma visão mais aprofundada • CAPÍTULO 4
System.out.print(“Matricula: “);
mat = teclado.nextInt();
System.out.print(“Nome: “);
nome = teclado.nextLine();
System.out.print(“Titulacao: “);
titulo = teclado.nextLine();
System.out.print(“Salario: “);
salario = teclado.nextFloat();
System.out.println(“Professor(a) “ + v[i].getTitulacao() +
“ “ + v[i].getNome() + “ de matricula “ +
v[i].getMatricula() + “ recebe “ +
} //fim main
Atenção
A linha teclado.nextLine(); foi necessária para, durante a execução, ler o enter acionado logo após a entrada da matrícula.
Caso isso não fosse feito, não seria possível digitar com o nome.
123
CAPÍTULO 4 • Classes e objetos: uma visão mais aprofundada
Sintetizando
Síntese do capítulo:
» Vetor ou array é um agregado de dados homogêneos, ou seja, dados do mesmo tipo, dispostos de forma contígua na
memória.
» Em Java, vetores são objetos. Por isso, usa-se o new para criá-los.
» Os vetores em Java podem ser de tipos primitivos (int, float, double ...) ou de objetos.
» Um ou vários objetos de uma classe podem estar relacionados com um ou vários objetos de outra classe.
» Herança é o mecanismo pelo qual classes herdam atributos e métodos por meio de um relacionamento hierárquico,
garantindo reaproveitamento de código.
» Em herança existem as classes genéricas (superclasses ou classes mães) e as classes específicas (subclasses ou classes
filhas).
» Herança pode ser simples ou múltipla. No entanto, Java não tem herança múltipla.
» Para definir a herança entre duas classes devemos usar a palavra reservada extends na definição da subclasse.
» A palavra reservada super permite chamar o construtor da classe mãe dentro do construtor da classe filha, possibilitando
reaproveitamento de código.
» A palavra reservada super permite também chamar o método da classe mãe que está sendo reescrito na classe filha,
possibilitando reaproveitamento de código.
» Polimorfismo pode ser compreendido como um mesmo comportamento (método) pode se apresentar de forma diferente
em classes diferentes.
» Classes abstratas são usadas como moldes para a criação de outras classes e podem conter atributos e métodos.
» Interfaces só expõem o que o objeto deve fazer, e não como ele faz.
» Uma classe define que vai implementar uma interface por meio da palavra implements.
» É possível uma classe herdar de uma classe mãe e implementar uma ou mais interfaces.
124
TRATAMENTO DE EXCEÇÕES
CAPÍTULO
5
Introdução do capítulo
Neste capítulo estaremos diante de vários tipos de erros. Dentre eles, erros que podem
ocorrer durante a execução do programa e que, normalmente, fogem do nosso controle.
Imagine um programa que irá ler a sua idade, mas você sem querer, digita o seu nome. O que
ocorrerá? Uma exceção.
Objetivos do capítulo
» Conceituar exceção.
» Tratar exceções.
5.1 Conceitos
» Erro na conversão de tipos. Por exemplo, converter uma string que só contém letras
em um número inteiro.
Todas essas situações em Java são chamadas de exceções e existe um mecanismo específico
para tratá-las chamado de tratamento de exceções.
As exceções em Java estão organizadas em uma hierarquia de classes, como ilustrado pela
figura a seguir.
125
CAPÍTULO 5 • Tratamento de exceções
A partir da figura anterior vemos que, no topo da hierarquia, está a classe Throwable e
depois surgem dois grandes ramos de classes de exceção: o da classe Error e o da classe
Exception.
O nosso interesse está na classe Exception. Essa é a classe mãe de todas as exceções que
nossos programas podem tratar. Ela está subdividida em dois ramos:
» RuntimeException:
› Pode ocorrer devido a um erro de programação, como, por exemplo: divisão por
zero, índice inválido do vetor, acesso a objeto nulo etc.
» Demais exceções:
› Ocorrem devido a um erro no programa causado por fatores externos, como, por
exemplo: erro na abertura de um arquivo, erro na impressão etc.
126
Tratamento de exceções • CAPÍTULO 5
3 System.out.println(3/0);
4 System.out.println(«imprime»);
5}
6}
4 d.exec();
5 }
6}
Como o programa não está tratando essa exceção (divisão por zero), o tratador padrão do
Java executa as seguintes tarefas:
» Termina o programa.
127
CAPÍTULO 5 • Tratamento de exceções
» Blocos try...catch...finally
» Comando throws
» Comando throw
Saiba mais
128
Tratamento de exceções • CAPÍTULO 5
import java.util.Scanner;
} catch(Exception e) {
} //fim main
Que exceções podem ocorrer?
} // fim classe
1. Usuário digitar um valor
inválido para a
2. Usuário digitar um valor
inválido para b
3. Usuário digitar ZERO para b
» Exceção 1: Foi digitado um valor não inteiro, como mostra a figura a seguir. Nesse
caso, a variável a não poderá receber a letra r e ocorrerá desvio na execução para o
bloco do catch a fim de capturar a exceção. Por fim, uma mensagem é impressa
usando getMessage e o objeto e.
129
CAPÍTULO 5 • Tratamento de exceções
» Exceção 2: Foi digitado valor inteiro e depois um valor não inteiro. Nesse caso,
a variável a receberá o valor 45 e a variável b não poderá receber o valor real
indicado na figura. Nesse momento ocorrerá desvio na execução para o bloco do
catch a fim de capturar a exceção. Por fim, uma mensagem é impressa usando
getMessage e o objeto e.
» Exceção 3: Foram digitados dois valores inteiros, sendo que o segundo valor
digitado e que será atribuído à variável b é o valor 0. Neste caso, ocorrerá erro
na divisão por zero e a atribuição c = a / b não será executada. Nesse momento,
portanto, ocorrerá desvio na execução para o bloco do catch a fim de capturar a
exceção. Por fim, uma mensagem é impressa usando getMessage e o objeto e.
É possível tratar várias exceções associando vários catch’s ao mesmo try. Nesse caso, a ordem
dos tratadores é importante: eles devem estar ordenados das subclasses para a superclasse.
try {
// Código a ser tratado
} catch (ArithmeticException e3) {
System.out.printf("Erro de aritmetica: %s\n",e3.getMessage());
} catch(IOException e2) {
System.out.printf("Erro de E/S: %s\n", e2.getMessage());
} catch(Exception e1) {
System.out.printf("Erro desconhecido: %s\n", e1.getMessage());
}
130
Tratamento de exceções • CAPÍTULO 5
A JVM procura um bloco try...catch para tratar a exceção no método que gerou a exceção. Se
encontrar, desvia a execução para o catch.
Se não encontrar, procura um bloco try...catch para tratar a exceção na pilha de execução,
ou seja, nos métodos que chamaram o método que gerou a exceção. Se encontrar, desvia a
execução para o primeiro catch que encontrar.
Se não encontrou nenhum tratador na pilha de execução, desvia para o tratador padrão da JVM
que interrompe a execução do programa.
O bloco try ...catch pode contar, opcionalmente, com o trecho do finally (significa
finalmente). Veja:
try {
// Código a ser tratado
} catch (Exception e) {
System.out.println("Erro: %s\n”, e.getMessage());
}
finally {
// Esse código será sempre executado, independente
// se houve exceção ou não
}
v
Fonte: elaborada pela autora.
131
CAPÍTULO 5 • Tratamento de exceções
» checked (verificadas): são exceções verificadas pelo compilador, como veremos mais
adiante.
ou
132
Tratamento de exceções • CAPÍTULO 5
Para avisar ao compilador que não desejamos tratar esses erros, temos
que usar o comando throws. Assim, a compilação é realizada.
Veja a seguir como ficou o programa anterior com throws.
Saiba mais
» Para separar exceções com throws usa-se vírgula, como mostrado no exemplo anterior. Reveja aqui apenas uma linha do
exemplo:
133
CAPÍTULO 5 • Tratamento de exceções
Após estudarmos os comandos try...catch (para capturar exceção) e throws (para declarar
que uma exceção pode ocorrer), veremos agora o comando throw.
A palavra throw em Inglês, quando traduzida, significa lançar. O objetivo no uso do throw
é que a exceção seja disparada ou lançada para outra parte do programa. Normalmente,
throw é usado para lançar uma exceção que nós mesmos criamos.
Atenção
Não confunda throws com throw. Enquanto throws declara que uma exceção pode ocorrer, throw lança uma exceção.
this.base = base;
this.altura = altura;
} //fim do construtor
E para onde será lançada tal exceção criada no construtor da classe Retangulo? Irá para o
ponto onde o construtor foi chamado. Veja o próximo exemplo:
134
Tratamento de exceções • CAPÍTULO 5
Importante
Para indicar o uso de parâmetros inválidos ou ilegais é possível usar a exceção IllegalArgumentException em vez de
Exception.
this.base = base;
this.altura = altura;
throw ex;
135
CAPÍTULO 5 • Tratamento de exceções
Sintetizando
Síntese do capítulo:
» Erros de lógica de programação, tais como acesso a índice fora dos limites do vetor, divisão por zero, entre outros, são
exceções.
» Erros devido a condições do ambiente de execução, que estão fora do controle do programador, mas podem ser
contornados em tempo de execução, tais como, arquivo não encontrado, rede fora do ar, entre outros, são exceções.
» Erros graves onde não adianta tentarmos recuperação, pois fogem do controle do programador e não podem ser
contornados, tais como falta de memória, erro interno na JVM, são exemplos de exceção.
» Existe uma hierarquia de classes de exceção. Das exceções dessa hierarquia, usaremos a classe Exception e suas subclasses.
» Quando uma exceção ocorre, são informados o nome da exceção que ocorreu e seu pacote, uma pilha de execução com a
sequência de chamadas dos métodos e a descrição da exceção, que contém a mensagem de erro.
» O tratamento de exceções é um mecanismo que permite que o programa defina como as situações inesperadas serão
tratadas.
» Comandos para tratamentos de exceções: try ...catch (com ou sem finally), throws e throw.
» O comando try...catch (com ou sem finally) irá executar o trecho e, caso a exceção ocorra, irá capturar a exceção no bloco
do catch.
» O comando throws é usado para declararmos que uma exceção pode ocorrer.
» O comando throw serve para lançar uma exceção para outro trecho do programa poder tratá-la.
136
CAPÍTULO
COLEÇÕES DE OBJETOS 6
Introdução do capítulo
A linguagem Java tem um conjunto de classes que servem para armazenar, na memória,
coleções de objetos.
Tais classes oferecem a vantagem de não termos que saber, de antemão, a quantidade de
elementos que iremos armazenar, o que é uma grande vantagem se compararmos com vetor.
Objetivos do capítulo
6.1 Conceitos
137
CAPÍTULO 6 • Coleções de objetos
Atenção
» Um Map é um objeto que mapeia chaves em valores. Um map não pode conter
chaves duplicadas, ou seja, cada chave pode ser mapeada em no máximo um valor.
138
Coleções de objetos • CAPÍTULO 6
Importante
ArrayList é uma classe concreta que implementa a interface List, ou seja, uma lista de objetos.
Cada objeto armazenado no ArrayList tem um índice e por meio desse índice, é possível
manipular o objeto da lista. Note que o índice inicial é zero.
Atenção
» A figura anterior mostra as interfaces List e Collection, além das classes LinkedList, ArrayList e Vector que implementam a
interface List.
A classe ArrayList conta com vários métodos importantes, como, por exemplo:
139
CAPÍTULO 6 • Coleções de objetos
Importante
Exemplo: Criando uma lista com nomes e usando os métodos add e remove. Note que lista é
um objeto da classe ArrayList.
import java.util.ArrayList;
lista.add("Dinardo");
Insere no fim da lista.
lista.add("Rosa");
lista.add("Dinardo");
lista.add("Rafael");
lista.add(2, "Carlos"); Insere em uma posição específica.
lista.add("Luís");
lista.remove("Carlos");
Remove o objeto.
lista.remove("Rafael");
lista.remove("Dinardo");
lista.remove(2);
} Remove o objeto dessa posição.
}
140
Coleções de objetos • CAPÍTULO 6
Rosa → Dinardo
import java.util.ArrayList;
public class ExemploArrayList {
lista.add("Dinardo");
lista.add("Rosa");
lista.add(10); Definido dessa forma, o ArrayList
lista.add(2465); armazena objetos do tipo Object.
lista.add(3.14159);
lista.add('A');
}
}
Exemplo: Podemos recuperar um elemento da lista pelo seu índice. Para isso, basta usar o
método get.
import java.util.ArrayList;
lista.add("Dinardo");
lista.add("Rosa");
lista.add(10);
lista.add(2465);
lista.add(3.14159);
lista.add('A');
System.out.println(lista.get(0));
System.out.println(lista.get(3));
System.out.println(lista.get(4));
System.out.println(lista.get(5));
}
}
141
CAPÍTULO 6 • Coleções de objetos
Depois, cada elemento da lista é acessado pelo índice usando o método get. Assim, por
exemplo, lista.get(0) obtém o 1º elemento do objeto lista e com o System.out.println,
ocorre a impressão na tela.
Dinardo
2465
3.14159
A
Exemplo: Observe a melhoria na hora de percorrer a lista e imprimir seus dados. Para isso, foi
usado o método size.
import java.util.ArrayList;
lista.add("Dinardo");
Saída do programa:
lista.add("Rosa");
Dinardo
lista.add(10);
Rosa
lista.add(2465);
10
lista.add(3.14159);
2465
lista.add('A');
3.14159
A
142
Coleções de objetos • CAPÍTULO 6
No exemplo anterior, vimos que podemos percorrer um ArrayList com for. Note que também
é possível percorrer com for...each. Nesse caso, não usamos índice.
Veja:
System.out.println(obj);
Em Java, os tipos básicos int, long, byte, short, float, double, char e boolean não são objetos.
Entretanto, a maioria das classes da biblioteca Java, como as classes que implementam as
coleções, por exemplo, trabalha somente com objetos.
Para resolver esse problema foram definidas classes wrapper, ou seja, classes que encapsulam
ou “embrulham” os tipos básicos para que estes possam ser tratados como objetos.
Na maior parte das vezes, o Java converte o tipo básico em uma classe wrapper (boxing) ou
uma classe wrapper em um tipo básico (unboxing) de forma automática.
Exemplo:
int x = 10;
Integer a = 10;
143
CAPÍTULO 6 • Coleções de objetos
Integer b = x + 1;
int y = a;
a = a + 1;
b++;
A partir daí e do último exemplo da seção anterior, vemos que, quando é adicionado um
valor qualquer, por exemplo, o inteiro 2465 à lista
lista.add(2465);
O valor 2465 é “embrulhado” com a classe wrapper adequada e é adicionado com o método
add à lista criada com ArrayList. Ou seja, tínhamos um valor inteiro para ser adicionado ou
inserido em uma lista de objetos e, com a classe wrapper, passamos a ter um objeto com o
valor inteiro para que a inserção na lista ocorresse.
Para adicionar o valor inteiro 2465 foi usada a classe wrapper Integer. E para os valores 3.14159
e ‘A’ do mesmo exemplo? Foram usadas, respectivamente, as classes Double e Character.
Sintetizando
Síntese do capítulo:
» As coleções em Java são divididas em três grandes grupos: Set, List e Map.
» As coleções mencionadas são definidas a partir de quatro interfaces principais: Collection, Set, List e Map.
» A classe ArrayList permite criar listas redimensionáveis de objetos, cujos elementos podem ser acessados via índice.
» Classes wrapper: Integer, Long, Byte, Short, Float, Double, Character e Boolean.
» Na maior parte das vezes, o Java converte o tipo básico em uma classe wrapper (boxing) ou uma classe wrapper em um
tipo básico (unboxing) de forma automática.
144
Referências
DEITEL, Paul J.; DEITEL, Harvey M. Java: como programar. São Paulo: Pearson Education do Brasil, 2017. 10ª.
Edição.
ECKEL, Bruce. Java Platform Standard Edition Documentation. Disponível em: https://docs.oracle.com/
search/?q=Java%20plataform&pg=2&size=10&product=en%2Fjava&category=en%2Fjava&showfirstpage
=true&lang=en. Acesso em: 23 out. 2022.
HORSTMANN, Cay S.; CORNELL, Gary. Core Java. Volume I – Fundamentos. São Paulo: Pearson Education do
Brasil, 2010.
Sites
https://www.shutterstock.com/pt/image-photo/kazan-russia-april-11-2017-set-645421069.
https://www.oracle.com/java/.
https://pixabay.com/pt/vectors/computador-port%c3%a1til-computador-2298286/.
www.eclipse.org.
https://www.shutterstock.com/pt/image-vector/business-man-character-has-take-difficult-357576257.
https://pixabay.com/pt/vectors/l%c3%a2mpada-el%c3%a9trica-id%c3%a9ia-ilumina%c3%a7%c3%a3o-1926533/.
https://pixabay.com/pt/vectors/casa-%c3%adcone-s%c3%admbolo-arquitetura-2492054/.
https://pixabay.com/pt/vectors/bmw-carro-roadster-carro-esporte-158703/.
https://www.shutterstock.com/pt/image-photo/happy-young-university-students-studying-books-522554425.
https://www.shutterstock.com/pt/image-photo/biophilia-workspace-home-office-room-computer-1899736342.
145