Buscar

programacao-orientada-a-objetos-ii

Prévia do material em texto

www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Curso Técnico em Informática
Programação Orientada a Objetos II
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Robson Braga de Andrade
Presidente da Confederação Nacional da Indústria
Rafael Lucchesi
Diretor do Departamento Nacional do SENAI
Regina Maria de Fátima Torres
Diretora de Operações do Departamento Nacional do SENAI
Alcantaro Corrêa
Presidente da Federação da Indústria do Estado de Santa Catarina
Sérgio Roberto Arruda
Diretor Regional do SENAI/SC
Antônio José Carradore
Diretor de Educação e Tecnologia do SENAI/SC
Marco Antônio Dociatti
Diretor de Desenvolvimento Organizacional do SENAI/SC
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Confederação Nacional da Indústria
Serviço Nacional de Aprendizagem Industrial
Curso Técnico em Informática
Programação Orientada a Objetos II
Diogo Vinícius Winck
Florianópolis/SC
2011
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
É proibida a reprodução total ou parcial deste material por qualquer meio ou sistema sem o prévio consentimento 
do editor. 
Autor
Diogo Vinícius Winck
Fotografias
Banco de Imagens SENAI/SC
http://www.sxc.hu/
http://office.microsoft.com/en-us/ images/
http://www.morguefile.com/
http://www.bancodemidia.cni.org.br/
 
SENAI/SC — Serviço Nacional de Aprendizagem Industrial
Rodovia Admar Gonzaga, 2.765 - Itacorubi - Florianópolis/SC
CEP: 88034-001
Fone: (48) 0800 48 12 12
www.sc.senai.br 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Prefácio
Você faz parte da maior instituição de educação profissional do estado. 
Uma rede de Educação e Tecnologia, formada por 35 unidades conecta-
das e estrategicamente instaladas em todas as regiões de Santa Catarina.
No SENAI, o conhecimento a mais é realidade. A proximidade com as 
necessidades da indústria, a infraestrutura de primeira linha e as aulas 
teóricas, e realmente práticas, são a essência de um modelo de Educação 
por Competências que possibilita ao aluno adquirir conhecimentos, de-
senvolver habilidade e garantir seu espaço no mercado de trabalho. 
Com acesso livre a uma eficiente estrutura laboratorial, com o que existe 
de mais moderno no mundo da tecnologia, você está construindo o seu 
futuro profissional em uma instituição que, desde 1954, se preocupa em 
oferecer um modelo de educação atual e de qualidade. 
Estruturado com o objetivo de atualizar constantemente os métodos de 
ensino-aprendizagem da instituição, o Programa Educação em Movi-
mento promove a discussão, a revisão e o aprimoramento dos processos 
de educação do SENAI. Buscando manter o alinhamento com as neces-
sidades do mercado, ampliar as possibilidades do processo educacional, 
oferecer recursos didáticos de excelência e consolidar o modelo de Edu-
cação por Competências, em todos os seus cursos.
É nesse contexto que este livro foi produzido e chega às suas mãos. 
Todos os materiais didáticos do SENAI Santa Catarina são produções 
colaborativas dos professores mais qualificados e experientes, e contam 
com ambiente virtual, mini-aulas e apresentações, muitas com anima-
ções, tornando a aula mais interativa e atraente. 
Mais de 1,6 milhões de alunos já escolheram o SENAI. Você faz parte 
deste universo. Seja bem-vindo e aproveite por completo a Indústria 
do Conhecimento.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Sumário
Conteúdo Formativo 9
 
Apresentação 11
12 Unidade de estudo 1
Java Básico
Seção 1 - O que é Java?
Seção 2 - Tipos de distribui-
ções JAVA
Seção 3 - Alô SENAI!
Seção 4 - O que aconteceu?
Seção 5 - Variável
Seção 6 - Tipos primitivos de 
dados
Seção 7 - Promoção e casting
Seção 8 - Operadores arit-
méticos
Seção 9 - Controle de fluxo
Seção 10 - Escopo de 
variável
Seção 11 - Usando a 
documentação do Java
32 Unidade de estudo 2
Revendo a 
Orientação a 
Objetos 
Seção 1 - Orientação a 
objetos: classes, objetos e 
instâncias
Seção 2 - Atributos, 
métodos, interface, estados 
e comportamento
Seção 3 - Os três pilares da 
orientação a objetos
Seção 4 - Estudo de caso: Ta-
magotchi com personalidade
Seção 5 - Visibilidade
13
16
16
19
19
21
22
25
25
29
30
Seção 6 - Estudo de caso: 
sistema de cliente
Seção 7 - Javabeans
42 Unidade de estudo 3
Avançando no Java
Seção 1 - String
Seção 2 - Array
Seção 3 - Construtor
Seção 4 - Final e static
Seção 5 - Estudo de caso: 
relação de clientes
Seção 6 - Tratamento de 
exceções
Seção 7 - Estudo de caso: 
objetos de calcular
Seção 8 - Utilizando pacotes
58 Unidade de estudo 4
AWT e Swing
Seção 1 - Visão geral
Seção 2 - Alô SENAI!
Seção 3 - Containers e geren-
ciadores de layout
Seção 4 - Eventos
Seção 5 - Estudo de caso: 
objetos de calcular
68 Unidade de estudo 5
Arquivos
Seção 1 - Visão geral
Seção 2 - Manipulando 
arquivos
Seção 3 - Estudo de caso: 
editor de texto
82 Unidade de estudo 6
Collections
Seção 1 - Visão geral
86 Unidade de estudo 7
JDBC 
Seção 1 - Visão geral
Seção 2 - Interfaces do JDBC
94 Unidade de estudo 8
Apêndice 1 - 
Preparando o 
Ambiente de 
Trabalho
Seção 1 - Instalando JDK e 
NetBeans
Seção 2 - Instalando o 
PostgresSQL
100 Unidade de estudo 9
Apêndice 2 
- Padrões de 
Codificação
Seção 1 - Classes, interfaces 
e pacotes
Seção 2 - Nomeando 
atributos e variáveis
Seção 3 - Métodos
Seção 4 - Endentação, co-
mentários, blocos de código, 
espaços e linhas brancas
Finalizando 104
 
 
Referências 106
 
33
33
34
34
37
38
41
43
45
47
48
50
52
54
57
83
87
88
59
59
63
64
64
69
69
76
95
97
101
102
103
103
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
8 CURSOS TÉCNICOS SENAI
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Conteúdo Formativo
9PROGRAMAÇÃO ORIENTADA A OBJETOS II
Carga horária da dedicação
Carga horária: 150 horas
Competências
Analisar e implementar os recursos avançados da programação orientada a obje-
tos para solução de problemas computacionais.
Conhecimentos 
 ▪ Orientação a objetos: classes, objetos e instâncias. 
 ▪ Comentários. 
 ▪ Composição, agregação.
 ▪ Construtores.
 ▪ Encapsulamento.
 ▪ Herança.
 ▪ Interface de desenvolvimento (IDE).
 ▪ Interfaces gráficas.
 ▪ Métodos e atributos.
 ▪ Padrões de desenvolvimento (frameworks).
 ▪ Padronização de código.
 ▪ Polimorfismo.
 ▪ Reutilização de códigos.
 ▪ APIs.
 ▪ Sobrecarga e sobrescrita de métodos e construtores. 
Habilidades
 ▪ Aplicar os conceitos de orientação a objetos.
 ▪ Utilizar interfaces de desenvolvimento (IDE) de sistemas orientado a objetos.
 ▪ Utilizar os padrões de projeto em aplicações computacionais.
 ▪ Desenvolver aplicações para desktop.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
10 CURSOS TÉCNICOS SENAI
Atitudes
 ▪ Organização e zelo na utilização de equipamentos.
 ▪ Foco no conteúdo trabalhado.
 ▪ Acesso a sítios relacionados ao tema trabalhado.
 ▪ Organização e limpeza dos ambientes coletivos.
 ▪ Dedicação e empenho nas atividades curriculares e extracurriculares.
 ▪ Capacidade de abstração.
 ▪ Trabalho em equipe.
 ▪ Apresentação de novas soluções para situações problemas.
 ▪ Cumprimento de prazos.
 ▪ Análise crítica de suas produções.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Apresentação
PROGRAMAÇÃO ORIENTADA A OBJETOS II
Bem-vindo à disciplina de Programação Orientada a Objeto II. Este ma-
terial foi elaborado para facilitar o seu aperfeiçoamento neste importan-
te paradigma de desenvolvimento de software. A Programação Orientada 
a Objetos tornou-se um padrão amplamente utilizado, principalmente 
por limitar a complexidade e permitir soluções elegantes para problemas 
complexos, características que você verificará no decorrer desta unidade 
curricular. 
O grande objetivo deste material é apresentar os conceitos de orientação 
a objetosna prática. Para isto, serão explorados detalhes da linguagem de 
programação Java. Esta linguagem consolidou-se e continua expandido 
o seu uso nos mais diversos projetos. Pela frente há grandes desafios 
que contribuirão no seu desenvolvimento profissional, e este material o 
ajudará nesta tarefa, portanto, dedique-se e supere-os! 
Agora é com você. Bons Estudos!
Diogo Vinícius Winck
Bacharel em Ciências da Com-
putação pela Universidade 
do Estado de Santa Catarina 
(UDESC), especialista em Redes 
de Computador e mestre em Ci-
ências da Computação pela Uni-
versidade Federal de Santa Ca-
tarina (UFSC). Atua como líder 
técnico do time de Framework 
na TOTVS (Linha de Produtos 
Datasul), é Professor Univer-
sitário no SENAI Joinville. Em 
conjunto com Vicente Goetten, 
foi o autor do livro AspectJ - Pro-
gramação Orientada a Aspec-
tos com Java -, publicado pela 
editora Novatec. Atualmente, 
pesquisa e aplica metodologias 
ágeis e Lean Software em proje-
tos WEB/RIA, na criação de fra-
meworks e no desenvolvimento 
de ferramentas.
11
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Unidade de 
estudo 1
Seções de estudo 
Seção 1 - O que é Java?
Seção 2 - Tipos de distribuições JAVA
Seção 3 - Alô Senai!
Seção 4 - O que aconteceu?
Seção 5 - Variáveis 
Seção 6 - Tipos primitivos de dados
Seção 7 - Casting e promoção
Seção 8 - Operadores aritméticos
Seção 9 - Controle de fluxo
Seção 10 - Escopo de variável
Seção 11 - Usando a documentação do Java
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
13PROGRAMAÇÃO ORIENTADA A OBJETOS II
Java Básico
SEÇÃO 1
O que é Java
Em 1995, a Sun lançou uma lin-
guagem de programação chamada 
Java. Ela foi fruto de um projeto 
iniciado em 1992 que não deu 
certo comercialmente. O sucesso 
inicial aconteceu com os applets, 
que eram brinquedos para web 
que, naquela época, era estática. 
Em 2009, a Sun foi adquirida pela 
Oracle.
O Java se consolidou e, hoje, 
está presente nas mais variadas 
empresas, como IBM, Oracle e 
NASA. Mas por que esse suces-
so? Porque o Java consegue lidar 
bem com problemas comuns das 
demais linguagens: portabilida-
de, gerenciamento de memória, 
custo de ferramenta. Além disso, 
atualmente, é possível encontrar 
configurações para o uso dessa 
linguagem, por exemplo: em ser-
vidores web, desktops ou dispositi-
vos móveis. 
Afinal de contas, o que é o Java? 
O Java é:
 ▪ uma linguagem orientada a 
objetos; 
 ▪ uma coleção de APIs (classes, 
componentes, frameworks) para 
o desenvolvimento de aplica-
ções, distribuída gratuitamente 
por meio do site <http://www.
oracle.com/technetwork/java/
index.html> e neutra de plata-
forma;
 ▪ um framework/ambiente de execução presente em browsers, mainfra-
mes, sistemas operacionais (SO’s), celulares, palmtops, cartões inteligen-
tes, eletrodomésticos.
O Java é uma linguagem de alto-nível que pode ser caracterizada como:
simples, orientada a objetos, distribuída;
 ▪ multithreaded, dinâmica, portável;
 ▪ independente de arquitetura; 
 ▪ de alto desempenho, robusta e segura.
A plataforma Java é composta por:
 ▪ JVM: Java Virtual Machine ou Máquina Virtual Java, que é responsá-
vel pela execução dos programas.
 ▪ JRE: Java Runtime Environment ou Ambiente de Execução a Java, que 
é o pacote necessário para executar programas Java, composto pelas 
bibliotecas e JVM.
 ▪ JDK: Java Development Kit ou Kit de Desenvolvimento Java, que é o 
kit necessário para desenvolver aplicações, contendo a JRE e ferramen-
tas, como, por exemplo, o compilador Java. 
Também compõem a plataforma, recursos como: 
 ▪ NetBeans: ambiente de desenvolvimento de código aberto para 
aplicações JSE, JME e JEE.
 ▪ Javadoc: ferramenta para geração da documentação em HTML.
 ▪ Tecnologias de Deployment: Java Web Start e plug-ins para distri-
buição de aplicações.
 ▪ User Interface Tookits: Java Foundation Classes, formado por Swing e 
Java 2D(Awt).
 ▪ Integration Libraries: bibliotecas de integração, tais como, Java 
IDL, JDBC, JNDI, Java RMI e Java RMI-IIOP.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
14 CURSOS TÉCNICOS SENAI
Figura 1: Visão geral da plataforma Java
Fonte: Adaptada de Oracle (2011)
As APIs (Application Programming Interface ou Interface de Programação 
de Aplicativos) Java mais conhecidas do JSE são:
 ▪ java.io – manipulação de arquivos;
 ▪ java.lang – classes básicas do Java;
 ▪ java.net – infraestrutura de software para rede;
 ▪ java.nio – definição de buffers;
 ▪ java.security – classes para segurança;
 ▪ java.text – textos, datas, números, mensagens;
 ▪ java.util – utilitários, coleções, datas etc;
 ▪ java.util.concurrent – programação concorrente.
A estrutura da linguagem é mantida por um processo chamado JCP (Java 
Community Process). Existem outras implementações dos padrões defini-
dos pelo JCP, além da disponibilizada pelo Oracle, como:
O JCP é um processo no qual, as partes interessadas na definição da 
plataforma Java ou de novas funcionalidades podem se envolver, 
respondendo aos JSRs (Java Specification Requests), sugerindo, por 
exemplo, melhorias.
Outra característica foi o desenvolvimento de uma cultura de partilha 
de informações – existem muitos grupos de usuários onde se comparti-
lham informações. Além disso, são publicados, diariamente, na internet 
informações, artigos e tutorias. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
15PROGRAMAÇÃO ORIENTADA A OBJETOS II
Neutralidade de plataforma indica que qualquer programa desenvolvido 
pode executar sem modificações em diferentes plataformas de computa-
ção (exemplo: Linux, Windows etc.). Esta capacidade deve-se ao fato de 
que os programas são compilados para o um formato chamado bytecode. 
Este é utilizado pela máquina virtual Java, que interpreta as instruções. 
A figura a seguir, ilustra o funcionamento da linguagem. 
Figura 2: Funcionamento e Distribuição do Java
 
Durante a execução, a API e a JVM (Java Virtual Machine ou Máquina 
Virtual Java) “isolam” o programa Java do sistema operacional, esta re-
lação pode ser observado na figura a seguir.
Figura 3: Execução de um programa Java
A máquina virtual corresponde a 
um computador abstrato e, por 
conta desse modelo, é possível a 
sua construção por meio de har-
dware. Quando uma aplicação Java 
é executada em uma máquina co-
mum, faz-se necessário uma im-
plementação concreta dessa abs-
tração e isso se torna disponível 
por meio da instalação e configu-
ração do JRE.
Durante a execução, cada aplica-
ção Java (o bytecode) executa dentro 
da sua própria instância da JVM, 
permitindo um alto grau de iso-
lamento e segurança. O código 
compilado no Java é portável en-
tre versões diferentes da JVM, por 
isso, o desenvolvedor não precisa 
preocupar-se com detalhes da 
JVM no ambiente de execução. 
Uma instância (runtime) é criada 
quando a aplicação inicia e des-
truída quando a aplicação termi-
na, isso implica, por exemplo, que 
três aplicações ao mesmo tempo, 
demandam três JVMs.
As etapas de execução de um pro-
grama Java são:
1. Class Loader: esta é primeira 
atividade executada pela JVM, 
sendo responsável por carre-
gar as classes necessárias para 
rodar a aplicação. A sequência 
da carga é: 
a. carrega as classes nativas do 
JRE – Java Runtime Environment 
(Ambiente de Execução Java 
em uma tradução livre).
b. são carregadas as extensões do 
JRE, disponíveis, por exemplo, 
em $JAVA_HOME/jre/lib/
ext
c. são carregadas as classes do 
sistema local, a ordem definida 
na variável de classpath define a 
precedência. 
d. são carregadas as classes do 
sistema remotas, disponíveis, 
por exemplo, em um servidor.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
16 CURSOS TÉCNICOS SENAI
2. Bytecode Verifier: nesta eta-
pa os Classes Javas (bytecodes) 
carregadas da dinamicamente/
intranet/internet são verifica-
das antes de serem executadas, 
pois o Class Loader considera 
as classes remotas potencial-
mente inseguras. Verifica-se, 
por exemplo, se o formato do 
arquivo recebidoestá correto 
ou se não há violações de se-
gurança.
3. Execução: o programa é exe-
cutado.
4. Garbage Collection: esta é a 
coleta de lixo. Durante a exe-
cução de um programa ob-
jetos são alocados. Quando 
estes deixam de ser necessá-
rios, precisam ser eliminados 
da memória, disponibilizando 
espaço que era utilizado por 
ele. Em linguagens como C++ 
e Pascal, o programador deve 
realizar essa tarefa. No Java, a 
responsabilidade está delega-
da ao Garbage Collector (coletor 
de lixo). Ele deve identificar, 
marcar e eliminar da memória 
objetos que não são mais refe-
renciados de maneira válida. 
SEÇÃO 2
Tipos de distribuições 
JAVA
A partir de 2009, a tecnologia Java 
passou por um amplo processo 
segmentação de sua atuação, prin-
cipalmente, após a aquisição da 
Sun pela Oracle. Várias platafor-
mas foram derivadas para neces-
sidades específicas. Destacam-se 
algumas:
 ▪ Java Standard Edition (JSE): voltada para desenvolvimento de 
aplicações cliente e composta pelas APIs básicas do Java. Disponibiliza, 
por exemplo, APIs para desenvolvimento de telas.
 ▪ Java Enterprise Edition (JEE): permite melhor componentização 
das aplicações. É utilizada para desenvolvimento de aplicações empre-
sariais, como, por exemplo, comércio eletrônico. 
 ▪ Java Micro Edition (JME): projetado para atender às necessidades 
de desenvolvimento para aplicativos móveis, como celulares. 
 ▪ Java Card: fornece um ambiente seguro para que aplicações rodem 
em smart cards e outros dispositivos com grande limitação de memória 
e de capacidade de processamento. Isso possibilita o uso de ferramen-
tas de mercado para a criação das aplicações e as aplicações desenvol-
vidas podem ser executadas com segurança em cartões de diferentes 
fornecedores.
 ▪ Java TV: refere-se à JSR-927, que trata da especificação para TV 
digital. 
SEÇÃO 3
Alô Senai!
A realização desta seção, e das próximas, depende de preparação do am-
biente de trabalho, segundo a unidade de estudo 8 (Apêndice 1). 
A melhor forma de iniciar o entendimento, ou a relembrar como funcio-
na uma linguagem, é por meio de exemplos simples. Nesta seção, será 
elaborado um primeiro programa: Alô Senai!, que irá imprimir uma 
linha simples no console: “Alô Senai!”. 
A realização dessa tarefa será feita no Netbeans. Estando ele aberto, deve-
-se criar um novo projeto chamado JavaBasico. Na figura a seguir, são 
detalhados os passos para fazer isso. 
Figura 4: Novo projeto no NetBeans
 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
17PROGRAMAÇÃO ORIENTADA A OBJETOS II
Podem-se observar alguns pontos importantes no arquivo apresentan-
do. Na figura 5, esses pontos são detalhados.
Figura 5: Exemplo de arquivo Java
 
O próximo passo é adicionar ao main, o seguinte trecho de código de 
modo, então o projeto ficará como na figura 6.
System.out.println(“Alo Senai!”);
 
Figura 6: Código fonte do programa AloSenai 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
18 CURSOS TÉCNICOS SENAI
Alguns pontos sobre este exemplo merecem destaque.
 ▪ O método main indica que a classe é um ponto de entrada de apli-
cação. 
 ▪ public é um modificador de acesso (será visto na seção de Orienta-
ção a objetos).
 ▪ static é um modificador que indica que o método pertence a classe 
e não a uma instância.
 ▪ System é uma classe padrão e possui vários métodos úteis sobre a 
plataforma que está sendo executada, como E/S.
 ▪ // e /* */ são comentários.
 ▪ void é o valor de retorno do método. Quando um método não 
retorna nenhum valor, uma espécie de valor vazio tem que ser especifi-
cado.
 ▪ String args [ ] é um vetor de strings que é formado quando são pas-
sados ou não argumentos por meio da linha de comando.
 ▪ System.out.println apresentada no console, a mensagem passada 
como parâmetro e entre aspas. Se for utilizado o System.out.print não 
será feita a quebra de linha no final da mensagem.
O Netbeans torna a execução dos projetos criados de maneira bem sim-
ples. Na figura a seguir, pode-se observar como executar esse primeiro 
exemplo. Pode-se também ver o resultado da execução. Confira. 
Figura 7: Resultado da execução 
Alguns erros podem acontecer na execução, por descuido do desen-
volvedor. É importante considerar algumas características da linguagem 
Java:
 ▪ ela diferencia letras maiúsculas de minúsculas (case-sensitive). Se o 
desenvolvedor escrever SYSTEM ao invés de System um erro será 
acusado; 
 ▪ as linhas de comando finalizam com ; (ponto-e-vírgula); 
 ▪ todo sinal de ‘abre chaves’ deve possuir um sinal de ‘fecha chaves’ 
correspondente.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
19PROGRAMAÇÃO ORIENTADA A OBJETOS II
SEÇÃO 4
O que aconteceu?
Quando foi acionado o botão executar projeto, o NetBeans compilou o có-
digo Java, gerando um ByteCode. Além disto, iniciou a máquina virtual 
Java (JVM), indicando para ela onde estava o código recém gerado. 
A Máquina Virtual Java procurou no ByteCode por um método main. Este 
é utilizado como ponto de entrada das aplicações Java Desktop. Um 
esquema dessa execução já foi detalhado na figura 3. 
Durante a execução, a JVM identificou a chamada para o método println, 
presente no atributo out da classe System. O método println imprime, na 
saída padrão, a String passada por parâmetro. Nesse exemplo, a saída pa-
drão era o console de execução e a String passada era “Alô Senai!”.
Altere o exemplo adicionando ‘\n’ ao final de mensagem. Ele é um ca-
ractere especial de saída que informa ao sistema se a saída em tela terá 
alguma característica diferente, nesse caso será uma quebra de linha. 
Confira alguns caracteres especiais de saída que podem ser testados:
\n nova linha;
\t tabulação;
\r retorno do carro (impressora);
\\ barra inversa;
\ “ aspas duplas.
Essa mesma operação poderia ser feita por meio do console do sistema 
operacional. Portanto, seria preciso utilizar o comando javac para compi-
lar o programa. E o comando java instanciar a máquina virtual e executar 
o bytecode. No ambiente, o Windows ficaria da seguinte maneira: 
C:\<caminho>\javac AloSenai.java 
C:\<caminho>\java AloSenai
SEÇÃO 5
Variável 
Uma variável é uma região de memória capaz de reter e representar um 
valor ou expressão. Ela possui um identificador e um tipo de dado. O 
identificador é o nome dado a uma variável, método, atributo, interface 
ou classe. 
Na linguagem Java, as variáveis são fortemente tipadas. Isso indica que 
toda declaração de uma variável deve explicitar o tipo de dado que a 
variável poderá tratar. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
20 CURSOS TÉCNICOS SENAI
O tipo de dado especifica as operações que uma variável pode executar, 
os valores que pode conter, por exemplo, uma variável para armazenar 
a idade de um aluno pode ser do tipo inteira. Sendo inteira, ela armazena 
apenas números inteiros. 
A forma geral de declaração de variável é: 
tipoVariável identificadorVariável;
O desenvolvedor, que deseja declarar uma variável para armazenar os 
juros de um empréstimo, poderia fazer da seguinte forma:
double juros;
São permitidas algumas variações. Veja: 
double juros = 0.05; //declaração com atribuição do valor
double vlParcela, vlEmprestimo; //declaração de múltiplas variáveis
Na figura 8, é um exemplo de onde o desenvolvedor gostaria de calcular 
o valor de um empréstimo, utilizando juros simples, e exibir, no console, 
o resultado.
Figura 8: Cálculo da parcela de um empréstimo 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
21PROGRAMAÇÃO ORIENTADA A OBJETOS II
O Java impõe regras na criação de identificadores (nome de variáveis). 
São elas:
 ▪ deve-se ter atenção quanto ao uso de letras maiúsculas e minúsculas; 
 ▪ deve-se iniciar com: uma letra, o sinal de cifrão “$” ou com um 
sinal de sublinhado “-“; 
 ▪ pode-se utilizar caracteres Unicode e ter qualquer tamanho. Não 
deve conter espaços;
 ▪ Não se deve utilizar as palavras reservadas, contidas na tabela a 
seguir. 
Tabela 1: Palavrasreservadas do Java
abstract continue for New switch
assert default goto package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
Além dessas regras, existe uma convenção amplamente aceita pelos de-
senvolvedores da comunidade Java, que pode ser observada na unidade 
de estudo 9 (apêndice 2).
SEÇÃO 6
Tipos primitivos de dados
Existem oito tipos de dados primitivos. Eles são chamados de primiti-
vos, pois correspondem diretamente a regiões de memória e não pontei-
ros para objetos na memória. Confira: 
 ▪ boolean – representa um valor lógico. Pode armazenar os valores 
true ou false. O valor padrão para o boolean é false. 
Exemplo: boolean cancelou = false;
 ▪ char – representa qualquer caractere (Unicode) entre aspas simples. 
Seu tamanho é 2 bytes. Pode armazenar valores entre ‘\u0000’ a ‘\
uFFFF’. O valor padrão para o char é ‘\u0000’. 
Exemplo: char sexo = ‘M’;
 ▪ byte – representa um valor 
inteiro. Seu tamanho é 1 byte. 
Pode armazenar os valores de 
-128 a 127. O valor padrão para 
o byte é 0. 
Exemplo: byte semana = 0;
 ▪ short – representa um valor 
inteiro com 2 bytes de tamanho. 
Pode armazenar os valores de 
-32.768 a 32.768. O valor padrão 
para o short é 0. 
Exemplo: short dia = 0;
 ▪ int – representa um valor 
inteiro com 4 bytes de tamanho. 
Pode armazenar os valores de 
-2.147.483.648 a 2.147.483.647. 
O valor padrão para o int é 0. 
Exemplo: int idade = 30;
 ▪ long – representa um valor 
inteiro com 8 bytes de tamanho. 
Pode armazenar os valores de 
-9.223.372.036.854.775.808 a 
9.223.372.036.854.775.807. O 
valor padrão para o long é 0L. 
Exemplo: long inteiroGrande = 
9.223.372.036.854.775.807L;
 ▪ float – representa um valor 
real com 4 bytes de tamanho, de-
finido segundo a norma IEEE-
754. Pode armazenar valores 
entre 1.40129846432481707e-45 
a 3.40282346638528860e+38. O 
valor padrão para o float é 0.0f. 
Exemplo: float pi = 3.14f;
 ▪ double – representa um valor 
real com 8 bytes de tamanho, de-
finido segundo a norma IEEE-
754. Pode armazenar valores 
entre 4.94065645841246544e-324 
a 1.79769313486231570e+308. 
O valor padrão para o double é 
0.0d. 
Exemplo: double estrelas = 
1e40; 
double preco = 119.99;
Nenhuma variável pode ser usa-
da antes de ser inicializada. Mais 
exemplos de uso de variáveis po-
dem ser observados na figura 9.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
22 CURSOS TÉCNICOS SENAI
SEÇÃO 7
Promoção e casting
Na seção anterior, pôde-se obser-
var que cada tipo de variável pos-
sui um tamanho e um formato: al-
gumas suportam caractere, outras 
suportam números inteiros ou 
reais. Por conta destas diferenças, 
deve-se tomar um pouco de cui-
dado ao atribuir variáveis de tipos 
diferentes. 
Quando se atribui uma variável, 
com tipos de dados mais restritos, 
para outra com tipo de dado mais 
amplo, isso é chamado de promo-
ção. Nesses casos, não há preo-
cupações: a JVM faz conversão 
automática. Por exemplo, atribuir, 
uma variável do tipo short (me-
nor) para outra variável do tipo int 
(maior): não há problema! Alguns 
exemplos de promoção podem 
ser observados a seguir: 
byte var0 = 10; 
short var1 = var0; 
int var2 = var1; 
long var3 = var2; 
float var4 = var3; 
double var5 = var4;
Há dois casos especiais: float, 
mesmo sendo menor em tama-
nho na memória que o long, pode 
receber valores de long, por conta 
do padrão que ele utiliza para ar-
mazenar. O segundo caso é o da 
promoção de char, que só pode 
ser feita para int (e superiores).
Uma característica da promoção 
é que não há risco de perda de 
precisão, e, por isso, a JVM faz 
automaticamente. Entretanto, há 
casos onde é necessário igualar 
valores, mesmo que haja risco de 
perda de precisão. Nesses casos, a 
JVM não pode decidir pelo desen-
volvedor e é necessário realizar 
um cast, caso ilustrado na figura 
10. Pode-se, também, observar a 
mensagem dada pelo compilador. 
Os tipos primitivos, por não serem objetos, não possuem operações que 
permitam realizar manipulações elaboradas, como, por exemplo, con-
versão para Strings. Essa deficiência foi suprida pela criação dos objetos 
Wrappers. Os objetos Wrapper correspondem ao objeto do tipo pri-
mitivo. Para cada tipo primitivo existe um wrapper. Confira na tabela a 
seguir.
Tabela 2: Objetos Wrappers
Tipo primitivo Classe wrapper Métodos de conversão String -> tipo
boolean Boolean Boolean.parseBoolean (String vl)
byte Byte Byte.parseBype(String vl)
char Character String.charAt(int pos)
double Double Double.parseDouble(String vl)
float Float Float.partFloat(String vl)
int Integer Integer.parseInt(String vl)
long Long Long.parseLong(String vl)
short Short Short.parseShort(String vl)
 
Os objetos wapper disponibilizam operações, como:
 ▪ ValueOf(): retorna o objeto wrapper criado;
 ▪ parseInt(), parseDouble() ou parseX() – de acordo com o wrapper 
em questão: retorna o tipo primitivo nomeado;
 ▪ toString(): retorna a String com o valor do tipo primitivo encapsula-
do no objeto.
Figura 9: Exemplos de declaração e uso de variáveis 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
23PROGRAMAÇÃO ORIENTADA A OBJETOS II
Figura 10: Problemas de conversão 
A mensagem de erro por incompatibilidade entre tipos de classes é apre-
sentada da seguinte maneira: 
Exception in thread “main” java.lang.RuntimeException: Uncompila-
ble source code - possible loss of precision
 required: int
 found: double
 at Arredondamento.main(Arredondamento.java:13)
Nesse caso, e em situações similares, faz-se necessário, realizar um cas-
ting, indicando, explicitamente para a JVM, a conversão que deve ser 
feita. O tipo desejado é colocado entre parênteses e usado como um 
prefixo para a expressão que deve ser modificada. Na figura 11, pode-se 
observar o exemplo anterior corrigido de modo a utilizar o cast. Obser-
ve o formato padrão do casting. 
tipoDado variavelDestino = (tipoDado) variavelOrigem;
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
24 CURSOS TÉCNICOS SENAI
Figura 11: Conversão utilizando cast 
Na tabela a seguir, podem ser observados todos os possíveis casos de 
casts/promoções, presentes na linguagem Java. Nos casos em que apa-
rece promo, significa que a conversão é automática. Nos demais, é apre-
sentado o cast que deve ser utilizado.
Tabela 3: Tabela de conversão
PARA
byte short char int long float double
DE
byte ---- promo (char) promo promo promo promo
short (byte) --- (char) promo promo promo promo
char (byte) (short) --- promo promo promo promo
int (byte) (short) (char) --- promo promo promo
long (byte) (short) (char) (int) --- promo promo
float (byte) (short) (char) (int) (long) ---- promo
double (byte) (short) (char) (int) (long) (float) ----
Fonte: adaptado de Caelum (2010)
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
25PROGRAMAÇÃO ORIENTADA A OBJETOS II
SEÇÃO 8
Operadores aritméticos 
Você sabe quais são os operadores aritméticos disponibilizados pelo 
Java? Não? Então confira: 
Adição ‘+’. Exemplo: total = a + b;
Subtração ‘– ‘. Exemplo: total = a – b;
Multiplicação ‘*’. Exemplo: total = a * b;
Divisão ‘/’. Exemplo: total = a / b;
Módulo (resto de divisão inteira) ‘%’. Exemplo: total = a % b; 
Este operador pode ser usado, somente, quando ambos operandos 
são inteiros.
SEÇÃO 9
Controle de fluxo
Agora que você já sabe quais são os operadores aritméticos, confira al-
gumas informações sobre o controle de fluxo.
O entendimento sobre a estrutura de execução de programas em Java 
está ligado à compreensão do conceito de bloco de código. 
Blocos de código delimitam conjuntos de comando, possibilitando tra-
tar escopo de variáveis, sincronia entre processos e controlar exceções. 
Um bloco é delimitado por chaves { }.Observe um trecho de código, 
onde hádois blocos de código:
if( condição booleana ) { 
//código do if 
} 
else{ 
/* código do else. Importante observar que o bloco do 
 else pode ser suprimido */ 
}
Os dois blocos de códigos do trecho apresentado, são:
 ▪ o primeiro vinculado ao if. 
 ▪ o segundo vinculado ao else.
O Java disponibiliza as seguintes estruturas de controle de fluxo: 
 ▪ if-els; 
 ▪ while;
 ▪ do-while; 
 ▪ for; 
 ▪ switch.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
26 CURSOS TÉCNICOS SENAI
If-else é a estrutura de testes. Dependendo da satisfação da condição de-
clarada, executa um determinado bloco de código, senão, caso exista, é 
executado o bloco complementar. A sintaxe geral do if-else pode ser 
observada no quadro 1.10.
Uma condição booleana é uma expressão que utiliza um conjunto de 
operadores relacionais (tabela 4) e/ou operadores lógicos (tabela 5). O 
seu resultado é um valor booleano. Os operadores relacionais são:
Tabela 4: Operadores relacionais
Operador Símbolo Exemplo Resultado
maior > A > B Verdadeiro se A maior que B, senão, falso
menor < A < B Verdadeiro se A menor que B, senão, falso
maior ou igual >= A >= B Verdadeiro se A maior ou igual a B, senão, falso
menor ou igual <= A <= B Verdadeiro se A menor ou igual a B, senão, falso
igual == A == B Verdadeiro se A igual B, senão, falso
diferente != A != B Verdadeiro se A diferente B, senão, falso
 
 
Na figura a seguir, pode-se ver um programa que avalia se um cliente 
pode entrar em um determinado show.
Figura 12: Exemplos de If-else 
Tabela 5: Operadores lógicos
Operador Símbolo Exemplo Resultado
E && A && B Verdadeiro se A e B forem verdadeiros, senão, falso.
OU || A || B Verdadeiro A, B ou A e B forem verdadeiros, senão, falso
Negação ! !A Verdadeiro se A for falso, senão, falso
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
27PROGRAMAÇÃO ORIENTADA A OBJETOS II
O uso de vários operadores é mediado, segundo regras de precedência. 
Essas regras podem ser observadas na tabela 6.
Tabela 6: Operadores lógicos
Operador Precedência
Maior precedência
pós-fixado expr++ expr-- 
unário ++expr --expr +expr -expr ~ ! 
multiplicação * / % 
adição/subtração + - 
descolamento << >> >>> 
relacional < > <= >= instanceof 
igualdade == != 
bitwise AND & 
bitwise exclusive OR ^ 
bitwise inclusive OR | 
lógico AND && 
lógico OR || 
ternário ? : 
Menor precedência
atribuição = += -= *= /= %= &= ^= |= <<= >>= >>>= 
 
O while é a estrutura de repetição, desviando o fluxo de um programa, 
de modo que repita um bloco de código, enquanto uma determinada 
condição booleana for verdadeira. A sintaxe geral do if-else pode ser 
observada a seguir. 
while( condição booleana ) { 
//código 
}
Observe na figura a seguir, um programa que calcula os números da 
série de Fibonacchi menores que 100, sendo eles: { 1, 1, 2, 3, 5, 8, 13, 
21, 34, 55 e 89}.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
28 CURSOS TÉCNICOS SENAI
Figura 13: Exemplo de while – série de Fibonacci 
Outra estrutura de repetição amplamente utilizada é o for. Essa estrutu-
ra deve ser usada, quando se deseja controlar a quantidade de vezes que 
serão executados um determinado bloco de código. 
O fluxo de um programa é desviado, de modo que repita um bloco de 
código, enquanto uma determinada condição booleana for verdadeira. A 
sintaxe geral do for pode ser observada a seguir. 
for(inicialização, condição booleana, incremeto ) { 
//código 
}
Na figura 14, pode-se observar um programa que calcula os 10 primei-
ros números da série de Fibonacchi, dessa vez, utilizando um for.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
29PROGRAMAÇÃO ORIENTADA A OBJETOS II
Figura 14: Exemplo de for – série de Fibonacci 
A linguagem Java permite controlar o fluxo de execução dos laços de 
repetição, utilizando as palavras-chave: 
 ▪ break – interrompe a execução do laço, o fluxo continuará execu-
tando o próximo comando, após a estrutura. O break não consegue 
sair de todas as estruturas encadeadas, sendo necessário o uso de múlti-
plos breaks nesses casos;
 ▪ continue – faz com que seja interrompida a execução do bloco de 
código, passando para próximo ciclo do laço. A estrutura de repetição 
continua sendo executada a partir do seu início.
SEÇÃO 10
Escopo de variável
O escopo de uma variável é o alcance que uma variável possui, permi-
tindo o seu acesso ou mesmo a sua existência. O escopo é definido pe-
los blocos de código, onde essa variável foi declarada, existe e pode ser 
acessada. Na figura 15, pode-se observar um exemplo de um problema 
relacionado a escopo. 
Nesse trecho de código é declarada uma variável em um bloco de código 
e o desenvolvedor tenta acessá-la em outro, ocasionando o problema. 
Duas variáveis são criadas: contaLacoInterno e contaLacoExterno. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
30 CURSOS TÉCNICOS SENAI
A variável contaLacoExterno possui o escopo mais amplo, sendo declarada 
no main. Ela pode ser utilizada em qualquer lugar no método após a sua 
criação.A variável contaLacoInterno possui seu escopo restrito ao bloco 
de código do while. Após o fechamento desse bloco, ela deixa de existir, 
sendo eliminada pelo Garbage Collector. Tentativas de acesso à ela, geram 
um erro de compilação.
Figura 15: Escopo de variável 
SEÇÃO 11
Usando a documentação do Java
A documentação da linguagem, ferramentas e API podem ser acessadas 
online no site da Oracle <http://download.oracle.com/javase/6/docs/
index.html> ou pode ser feito um download separado do SDK. Ela é 
composta por uma coleção de arquivos HTML, com as classes e méto-
dos da linguagem Java. 
A documentação é hierárquica, de forma que a página inicial lista todos 
os pacotes como hyperlinks. Na figura 16, pode-se observar um exemplo 
de documento. Todo projeto pode ter sua documentação, gerada, au-
tomaticamente, nesse formato, por meio do uso da ferramenta javadoc.
As páginas são estruturadas nos seguintes tópicos:
 ▪ a hierarquia da classe;
 ▪ uma descrição da classe e seu propósito geral;
 ▪ uma lista de variáveis associadas;
 ▪ uma lista de construtores; 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
31PROGRAMAÇÃO ORIENTADA A OBJETOS II
 ▪ uma lista de métodos; 
 ▪ uma lista detalhada de variáveis, com descrições do propósito e uso 
de cada variável;
 ▪ uma lista detalhada de construtores, com descrições. 
 ▪ uma lista detalhada de métodos, com descrições.
Figura 16: Exemplo de documentação 
Nessa primeira unidade de estudos, você conheceu um pouco sobre 
Java, na próxima unidade, você irá revisar os conceitos de orientação 
a objetos e conhecer um estudo de caso. Prepare-se, vem muita coisa 
interessante pela frente!
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Unidade de 
estudo 2
Seções de estudo 
Seção 1 – Orientação a objetos: classes, 
objetos e instâncias
Seção 2 – Atributos, métodos, interface, 
estados e comportamento
Seção 3 – Os três pilares da orientação a 
objetos
Seção 4 – Estudo de caso: Tamagotchi com 
personalidade
Seção 5 – Visibilidade
Seção 6 – Estudo de caso: sistema de cliente
Seção 7 – Javabeans
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
33PROGRAMAÇÃO ORIENTADA A OBJETOS II
Revendo a orientação a objetos
SEÇÃO 1
Orientação a objetos: classes, objetos e 
instâncias
Aplicar o paradigma de desenvolvimento orientado a objeto exige o ple-
no conhecimento dos conceitos que envolvem a orientação a objetos 
(OO), por isso, é importante revisar os conceitos que a compõem.
O termo orientação a objetos remete à tentativa de simular nos com-
putadores, aquilo que o desenvolvedor percebe no mundo real. Procura-
-se trazer para o desenvolvimento da solução, os elementos presentes no 
problema, que se procura resolver na forma de abstrações.
Uma abstração é uma simplificação concentrada nas características re-
levantes do elemento avaliado. Pode-se simplificar o esforço presente 
no Paradigma Orientado a Objeto(POO), no esforço realizado pelo 
desenvolvedor na procura por identificar as características de um pro-
blema, decompondo a solução em um conjunto de objetos definidos 
por classes. 
Um objeto é uma construção de software, que encapsula estado e com-
portamento, permitindo que se modele software em termos reais e abs-
tratos. Podem ser de vários tipos, como entidades físicas: nota-fiscal, 
cliente, aluno etc.; abstratas: listas, pilhas, vetores, conexões etc.
Não seria produtivo durante o desenvolvimento, codificar cada objeto 
isoladamente. Imagine, o desenvolvedor precisa criar um código para 
cada aluno de uma escola, ou funcionário de uma empresa. Por conta 
disso, os objetos são agrupados pelos seus métodos e atributos comuns, 
formando uma classe de objetos. 
As classes implementam as responsabilidades de um sistema. Nelas são 
definidos atributos e métodos. Elas são como formas, utilizadas para 
modelar os biscoitos. São utilizadas para definir a forma inicial, mas a 
partir do momento em que os biscoitos são retirados, passam a se dife-
renciar uns dos outros.
Cada solução teria a necessidade de classes diferentes, por exemplo:
 ▪ um sistema de gerenciamento escolar teria classes como: Aluno, 
Professor, Contrato, Sala etc.; 
 ▪ tratando-se de um sistema para controle de locadoras poderiam exis-
tir as classes: Cliente, Filme, Mídia etc.;
 ▪ no caso de um sistema de controle empresarial seriam necessárias 
classes como Funcionário, Gerente, Cliente, Setor, Item etc.
SEÇÃO 2
Atributos, métodos, 
interface, estados e 
comportamento
Os atributos são características 
relevantes de uma classe de ob-
jetos para a solução de um pro-
blema, sobre os quais podem ser 
executadas ações. O estado de 
um objeto é determinado pelo 
conjunto dos valores dos atribu-
tos. Para evitar estados inválidos 
ou inconsistentes e acessos inde-
vidos, os atributos devem ser ape-
nas manipuláveis por operações 
do próprio objeto. 
Um comportamento é uma ação 
executada por um objeto em res-
posta a alguma mensagem ou 
mudança de estado. Ele é aciona-
do pela execução de algum méto-
do. Entretanto, essa relação não é 
explícita, já que um mesmo com-
portamento pode ser realizado 
por vários métodos. 
Os métodos são operações 
(ações) explicitamente detalhadas 
e codificadas nas classes. O con-
junto das operações públicas de 
um objeto forma a lista de servi-
ços disponibilizados. A esse servi-
ço é dado o nome de interface do 
objeto. 
Uma interface é um contrato 
com o mundo exterior, informan-
do o que um objeto pode fazer, 
mas não sua implementação. Uma 
interface não possui implementa-
ção e não pode ser instanciada.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
34 CURSOS TÉCNICOS SENAI
Cada classe de solução teria a necessidade atributos diferente, por exem-
plo:
 ▪ em um sistema de gerenciamento escolar, a classe Aluno precisaria 
de atributos como: nome, endereço, telefone, número da matrícula etc.
 ▪ num sistema para controle de locadoras, a classe Filme necessitaria 
de atributos como: nome, gênero, ano de lançamento etc.
 ▪ no caso de um sistema de controle empresarial, a classe funcionário 
precisaria de atributos como: nome, endereço, setor e etc.
Na figura a seguir, você pode observar um diagrama que reúne todas as 
informações aprendidas até agora.
Figura 17: Diagrama dos conceitos da orientação a objetos 
Fonte: Adaptado de Winck e Goetten (2006)
SEÇÃO 3
Os três pilares da orientação a objetos
A orientação a objetos está apoiada em três pilares essenciais: encapcu-
lamento, herança e polimorfismo. Veja um pouco mais sobre cada um 
deles.
O encapsulamento é uma característica desejável na implementação 
de sistemas OO. Ele permite conhecer o que é feito, mas ignora-se o 
modo como é feito. Na OO, o encapsulamento é o pacote formado 
pelas operações e pelo conjunto de atributos de um objeto. Ele protege 
a estrutura interna de cada objeto contra a utilização arbitrária, que fuja 
dos objetivos propostos pelo projeto da classe. 
A herança é um mecanismo para reuso de código que possibilita a 
criação de uma classe baseada em outra previamente existente. A nova 
classe irá receber as características da classe-base, utilizando as partes 
comuns e especializando os pontos onde a classe derivada necessita de 
um comportamento mais específico. 
O polimorfismo é a capacidade 
de uma mesma referência, como, 
por exemplo, um ponteiro para 
objetos, representar implementa-
ções diferentes, sendo que a im-
plementação é selecionada por 
algum mecanismo automático, 
assim, permite-se que um único 
nome expresse comportamentos 
diferentes, possibilitando a uti-
lização de um mesmo nome de 
método em mais de uma classe 
e, ainda, assuma implementações 
diferentes em cada classe. 
SEÇÃO 4
Estudo de caso: 
Tamagotchi com 
personalidade
Tamagotchi é um brinquedo, lan-
çado pela empresa Bandai(1996). 
O seu objetivo era criar um ani-
mal de estimação virtual. Normal-
mente, esse brinquedo era apre-
sentado como um chaveiro. 
Figura 18: Tamagotchi
Nele, eram reproduzidos vários 
comportamentos de um bicho de 
estimação real. O proprietário era 
obrigado, por exemplo, a alimen-
tar, passear, medicar, brincar com 
seu companheiro virtual etc., caso 
não fosse cuidado, adequadamen-
te, o bichinho poderia morrer. 
Inspirado nos Tamagotchi, este 
estudo de caso simulará apenas o 
humor de um animal de estimação.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
35PROGRAMAÇÃO ORIENTADA A OBJETOS II
Observe na figura a seguir, um diagrama de classes desse estudo de caso. 
Figura 19: Figura 19: Diagrama de classes 
Esse exercício depende da criação de novas entidades: Animal, Humor, 
Alegre, Agitado, Triste e Bravo. 
Como o desejo é tratar apenas o humor do animal de estimação, este, 
quando solicitado, irá se apresentar e indicar o seu humor. Tal compor-
tamento será implementado por meio de um método, no caso, falar(). 
Veja o código da classe Animal:
public class Animal {
 private String nome = “”;
 private Humor humor;
 Animal(String nome){
 this.nome = nome;
 }
 public Humor getHumor() {
 return humor;
 }
 public void setHumor(Humor humor) {
 this.humor = humor;
 }
 public String getNome() {
 return nome;
 }
 public void falar(){
 System.out.println(“Oi! Meu nome é “+nome);
 System.out.println(“Hoje eu estou “+humor.toString());
 }
}
A classe Animal está associada à classe personalidade, que, por sua vez, 
possui quatro especializações: Agitado, Alegre, Bravo e Triste. 
No exemplo, a classe Animal não sabe detalhes (encapsulamento) sobre 
as classes especializadas de humor. Essa classe sabe que ao solicitar a 
operação toString (sobreposição/polimorfismo) da classe humor, rece-
berá o texto correto. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
36 CURSOS TÉCNICOS SENAI
Na figura 19 você pôde ver o uso dessas classes. Os códigos das demais 
classes você confere a seguir. 
Código fonte da classe Humor
public class Humor {
 public String toString() {
 return “Normal”;
 }
}
Código fonte da classe Agitado
public class Agitado extends Humor{
 public String toString() {
 return “Agitado”;
 }
}
Código fonte da classe Alegre
public class Alegre extends Humor{
 public String toString() {
 return “Alegre”;
 }
}
Código fonte da classe Bravo
public class Bravo extends Humor{
 public String toString() {
 return “Bravo”;
 }
}
Código fonte da classe Triste
public class Triste extends Humor{
 public String toString() {
 return “Triste”;
 }
}
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
37PROGRAMAÇÃO ORIENTADA A OBJETOS II
Figura 20: Programação dos códigos e classes
SEÇÃO 5
Visibilidade 
O encapsulamento só é garantido se a classe restringir o acesso direto a 
seus elementos. Um bom exemplo é uma classe que representa um car-
ro. A velocidade do carro é resultado dos métodosacelerar/frear e não 
da alteração direta da propriedade velocidade.Na implementação, feita 
no Java da orientação a objetos, foram disponibilizados quatros tipos de 
visibilidade ou controles de acesso: 
 ▪ public (público) - permite o acesso a todos os objetos;
 ▪ protected (protegido) – garante acesso à instância, ou seja, para 
aquele objeto e para todas as subclasses;
 ▪ private (privado) – garante acesso apenas para a instância. 
 ▪ default (pacote) – não é uma visibilidade padrão da orientação a ob-
jetos. Está disponível no Java e permite acesso a instâncias do mesmo 
pacote da classe.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
38 CURSOS TÉCNICOS SENAI
Nenhum atributo de uma classe deve ser declarado como público, e 
acessado diretamente por um objeto externo, a menos que haja uma 
grande justificativa. 
Os atributos devem possuir métodos de acesso get/set, possibilitando a 
sua manipulação controlada. Isto pode ser observado na classe Animal 
nos atributos nome e humor.
SEÇÃO 6
Estudo de caso: sistema de cliente
Uma empresa necessita controlar seus clientes. O diretor comercial des-
sa empresa deseja ter acesso ao nome do cliente, telefone e endereço. 
Os clientes possuem um valor máximo para compra, se tentar comprar 
além do que o valor permitido, o sistema não deve impedir. Um cliente 
pode ser considerado especial, pois, ele não possui limite no valor de 
compras. Nesses casos, também, se deseja saber o nome da pessoa de 
contato e o telefone dela. Se um cliente estiver devendo, é importante 
que seja informado qual cliente está devendo. Um cliente devedor não 
pode fazer novas compras. 
Analisando o problema, modelou-se o digrama. Confira na figura a se-
guir. 
Figura 21: Diagrama de classes para um sistema de controle de clientes
A classe Cliente possuirá os seguintes atributos: nome, telefone, ende-
reco e limite de compras. Deve possuir um método que avalia se uma 
determinada compra pode ser feita. Observe o código da classe Cliente: 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
39PROGRAMAÇÃO ORIENTADA A OBJETOS II
package org.senai.cliente;
public class Cliente {
 private String nome;
 private String telefone;
 private String endereco;
 private double limiteCompras;
 public Cliente() {
 }
 public Cliente(String nome) {
 this.nome = nome;
 }
 public void setNome(String nome) {
 this.nome= nome;
 }
 public String getNome() {
 return nome;
 }
 public String getEndereco() {
 return endereco;
 }
 public void setEndereco(String endereço) {
 this.endereco = endereço;
 }
 public double getLimiteCompras() {
 return limiteCompras;
 }
 public void setLimiteCompras(double limiteCompras) {
 this.limiteCompras = limiteCompras;
 }
 public String getTelefone() {
 return telefone;
 }
 public void setTelefone(String telefone) {
 this.telefone = telefone;
 }
 public boolean liberarCompra(double value){
 return value <= limiteCompras;
 }
 public String toString() {
 return “Cliente:”+ nome + “ Telefone=” + telefone + “ Endereço=” + 
 endereco + “ Limite de Compras=” + limiteCompras;
 }
}
É importante observar que todos os atributos são privados. O acesso a 
eles só pode ser feito via métodos get/set. A seguir você pode observar 
o código da classe cliente especial. Ela é uma especialização da classe 
Cliente e, por isso, não é necessário redefinir os atributos nome, telefo-
ne, endereço e limite de crédito. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
40 CURSOS TÉCNICOS SENAI
package org.senai.cliente;
public class ClienteEspecial extends Cliente {
 private String nomeContato;
 private String telefoneContato;
 public ClienteEspecial() {
 super();
 }
 
 public ClienteEspecial(String nome) {
 super(nome);
 }
 public boolean liberarCompra(double value) {
 return true;
 }
 public String getNomeContato() {
 return nomeContato;
 }
 public void setNomeContato(String nomeContato) {
 this.nomeContato = nomeContato;
 }
 public String getTelefoneContato() {
 return telefoneContato;
 }
 public void setTelefoneContato(String telefoneContato) {
 this.telefoneContato = telefoneContato;
 }
 public String toString() {
 return “Cliente Especial \tnome:”+getNome() + “ Telefone:” + 
 getTelefone()+ “ Endereco:” + getEndereco() +” Contato: 
 “+nomeContato+ “ Telefone Contato:”+telefoneContato + 
 “ Limite de Compras: sem limite” ;
 }
}
Por conta da lógica do negócio, foram redefinidas a construtora e o mé-
todo liberarCompra – um cliente especial possui compras sempre libera-
das. Observe, também, a criação de dois novos atributos: nomeContato 
e telefoneContato, e os respectivos métodos get/set. Na construtora, 
pode-se ver a aplicação do operador super. Aqui, ele indica que está sen-
do chamada a construtora da classe pai.
No exemplo a seguir, pode-se observar o código da classe cliente de-
vedor. Assim como, cliente especial, ela é uma especialização da classe 
Cliente e, por isso, não é necessário redefinir os atributos: nome, tele-
fone, endereço e limite de crédito. Foram redefinidas a construtora e o 
método liberarCompra, por conta, da lógica de negócio e, agora, um 
cliente devedor não pode fazer compras. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
41PROGRAMAÇÃO ORIENTADA A OBJETOS II
package org.senai.cliente;
public class ClienteDevedor extends Cliente {
 public ClienteDevedor() {
 }
 public ClienteDevedor(String nome) {
 super(nome);
 }
 public boolean liberarCompra(double value) {
 return false;
 }
 public String toString() {
 return “Cliente Devedor \tnome:” + getNome() + “ Telefone:” + 
 getTelefone() + “ Endereco:” + getEndereco() + 
 “ Limite de Compras: BLOQUEADO”;
Veja na figura o código para executar esse programa.
Figura 22: Testes das classes Cliente, ClienteEspecial e ClienteDevedor 
SEÇÃO 7
 Javabeans
Javabeans são componentes de sof-
tware, projetados para serem reuti-
lizados. Eles possuem, como pre-
missa, garantir o encapsulamento. 
Por isso, são classes que possuem 
construtores sem argumentos e as 
suas propriedades são acessadas 
externamente, apenas por meio 
de métodos get/set. Nos exem-
plos anteriores, as classes podem 
ser consideradas Javabeans.Cui-
dado para não confundir Javabeans 
com Enterprise Javabeans. Enterprise 
Javabeans é um dos componentes 
da plataforma Entreprise (Java En-
terprise Edition), que são executa-
dos nos servidores, sendo aces-
sados por meio do uso interfaces 
locais/remotas e um protocolo, 
como, por exemplo, RMI-IIOP. 
Nessa unidade de estudos você 
acompanhou uma breve revisão 
sobre a orientação a objetos, além 
de acompanhar dois estudos de 
caso: o Tamagotchi com persona-
lidade e um sistema de cliente. Na 
próxima unidade, você começará 
a avançar no Java, então, prepare-
-se. Todas as informações são im-
portantes para o seu aprendizado 
na área.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
Unidade de 
estudo 3
Seções de estudo 
Seção 1 – String 
Seção 2 – Array
Seção 3 – Construtor
Seção 4 – Final e static
Seção 5 – Estudo de caso: relação 
de clientes
Seção 6 – Tratamento de exceções
Seção 7 – Estudo de caso: objetos 
de calcular
Seção 8 – Utilizando pacotes
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
43PROGRAMAÇÃO ORIENTADA A OBJETOS II
Avançando no Java
SEÇÃO 1
String 
String é a classe de objetos destinada a representar uma cadeia de carac-
teres. Diferentes dos tipos primitivos, as variáveis do tipo String guar-
dam referências aos objetos, e não um valor.
Veja um exemplo de como criar uma String.
String x = “Criando uma String utilizando literal”;
String y = new String(“Criandouma String utlizando operador new “);
/* Existem métodos que retornam que retornam Strings
 String z = String.valueOf(30); 
Uma vez criada uma variável do tipo String, ela é imutável. As Strings 
são adicionadas a um pool de Strings e, sendo preciso, são reutilizadas.
Pode-se observar, na figura a seguir, um exemplo das implicações do uso 
do operador new e do pool de Strings. 
Figura 23: Comparação a String 
Na declaração e criação das variá-
veis x e y, a VM utilizará os mes-
mos objetos presentes no cache de 
Strings. Entretanto, para z, o uso 
do operador new força a criação 
de uma nova String no pool.
Pode-se observar que foram uti-
lizadas duas estratégias diferentes 
para a comparação de Strings:
 ▪ quando foi utilizado o opera-
dor ‘==’ (comparação booleana), 
a VM compara as referências 
para as quais as duas variáveis 
apontam, e não o seu conteú-
do. No caso de x, comparando 
com y, poderá dar certo, pois as 
variáveis apontam para mesma 
referência.
 ▪ nos casos onde foi utilizado o 
método equals, a VM irá compa-
rar o conteúdo das referências, 
que é de fato o desejo neste caso. 
Por isso, a comparação de Strings 
deve ser feita sempre utilizando 
equals. 
O operador + executa uma con-
catenação de objetos de Strings, 
gerando uma nova String. Veja, a 
seguir, a demonstração de conca-
tenação de Strings, usando o ope-
rador ‘+’ as implicações da imuta-
bilidade das Strings. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
44 CURSOS TÉCNICOS SENAI
String exemplo = “parte1 ” + “ parte 2”;
Nessa demonstração, o desenvolvedor pode ter a impressão de ter cria-
do apenas uma String, mas na verdade, foram criadas três: “parte 1”, 
“parte 2” e “parte 1 parte 2”. Pode-se concatenar string com qualquer 
objeto ou tipos primitivos. Veja: 
double peso = 79.4;
System.out.println(“O seu peso é: “ + peso);
A classe possui alguns métodos importantes que devem ser estudados 
com atenção. Segue uma lista deles:
 ▪ split: divide uma String em um vetor de Strings. Exemplo: 
String frase = “Alô Senai!”; 
String lista = frase. split(“ “); //o resultado é um vetor com 2 posições
 ▪ compareTo: compara duas String. Esse método retorna um número 
negativo, se a primeira for menor, zero se forem iguais, e um número 
positivo se a segunda for menor. Esse método diferencia letras maiús-
culas e minúsculas, por isso, deve-se ter atenção ao usá-lo. Exemplo: 
String primeira = “Diogo”; 
String segunda = “Vinícius”; 
int compara = primeira.comparaTo(segunda); 
//compara será menor que, pois ‘D’ é considerado menor que ‘V’
 ▪ toUpperCase / toLowerCase: converte uma String de maiúscula 
para minúscula ou vice-versa. Exemplo: 
String texto = “eu estudando muito.”; 
String novoTexto = texto.toUpperCase();
 ▪ replace: substitui em uma string, uma ocorrência por outro valor. 
Exemplo: 
String frase = “Estudando Java”; 
frase = frase.replace(“Java”,“Orientação a Objetos”);
Outros métodos importantes da classe String são:
 ▪ charAt – indica qual caractere ocupa o índice informado. Exemplo: 
String vl =”JAVA Senai”; 
char c = vl.charAt(1);//c será igual a ‘J’
 ▪ substring – permite obter apenas parte de uma String. Exemplo: 
String vl =”JAVA Senai”; 
String subVl = vl.substring(5,10); //subVl será igual a ‘Senai’
 ▪ length – retorna o tamanho da String. Exemplo: 
String vl =”JAVA Senai”; 
int tamanho = vl. length(); // tamanho igual a 10
 ▪ indexOf – retorna o índice de uma determinada ocorrência Exem-
plo: 
String vl =”JAVA Senai”; 
int pos = vl. indexOf (“Senai”); //pos será 5
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
45PROGRAMAÇÃO ORIENTADA A OBJETOS II
 ▪ trim – retorna uma nova string sem caracteres brancos do início e 
do fim de uma string Exemplo: 
String vl =”JAVA Senai ”; 
String vlTrim = vl.trim(); // vlTrim será igual a “Java Senai”
 ▪ isEmpty – retorna true se a string estiver vazia. Exemplo: 
String vl = ”JAVA Senai”; 
boolean vazia = vl.isEmpty(); //vazia = false
Dependendo da aplicação, o fato da imutabilidade dos objetos do tipo 
String pode gerar uma grande carga, por exemplo, na geração de arqui-
vos textos. Um opção é o uso das classes StringBuffer e StringBuidler. 
Essas classes disponibilizam o método ´append´, que permite concate-
nar Strings, modificando seu conteúdo, ao invés de criar novos objetos. 
Observe um exemplo, o uso do StringBuffer.
StringBuffer palavra = new StringBuffer();
palavra.append(“primeiro”);
palavra.append(“\nsegundo”);
palavra.append(“\nterceiro”);
palavra.append(“\nquarto”);
palavra.append(“\nquinto”);
System.out.println(palavra);
A instanciação de classes do tipo StringBuffer (ou StringBuilder) deve 
ser feita por meio do operador new. Outros métodos importantes das 
classes StringBuffer e StringBuilder são: insert, reverse, replace.
As classes StringBuffer e StringBuilder possuem os mesmos métodos, a 
diferença é que a classe StringBuilder não é threadsafe. Threadsafe é uma 
característica desejável em programas multitarefa, onde o trecho de có-
digo funciona corretamente em situações de concorrência. 
SEÇÃO 2
Array
Um array é um container de objetos de um determinado tipo que pos-
sibilita tratar um número fixo de elementos, definidos no momento da 
sua instanciação. Também é conhecido por vetor (unidimensional) ou 
matriz (multidimensional). Podem-se criar vetores de qualquer tipo pri-
mitivo ou classe.
Os elementos de um array são acessados por meio de um índice inteiro. 
O índice do primeiro elemento é igual a zero (0), e índice do último é 
igual ao tamanho do vetor -1.
Um array pode ter vários níveis e seu tamanho é definido no momento 
da criação. No Java, a declaração não cria o objeto propriamente dito. Ao 
invés disso, a declaração de um array cria uma referência que pode ser 
usada para percorrer um array. Observe um exemplo:
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
46 CURSOS TÉCNICOS SENAI
char vetorChars[ ]; //esta forma é desencorajada.
 int [ ] vetorInts; 
String [ ][ ] matrizStrings;
É importante observar que não se deve determinar o tamanho dese-
jado do vetor na sua declaração. Isso deve ser feito no momento da 
instanciação, por meio do uso do operador new.
Os objetos do vetor não são criados instantaneamente, sendo necessá-
rio, criá-los separadamente. 
String [ ] matrizStrings; 
matrizStrings= new String[3];
matrizStrings[0] = new String(“Santa Catarina”);
matrizStrings[1] = new String(“Joinville”);
matrizStrings[2] = new String(“Senai”);
Veja mais exemplos de criação de vetores e matrizes.
String [ ] matrizStrings2 = {“Santa Catarina”, “Joinville”, “Senai”}; 
// exemplo de matriz de inteiros 4x3
int [ ] [ ] notas = new int[4][ ];
notas[0] = new int[3]; 
notas[1] = new int[3];
notas[2] = new int[3];
notas[3] = new int[3];
// exemplo de matriz de inteiros 3x3
int [ ] [ ]frequencia = {{7,5,4} , {7,7,7}, {9,8,7}};
Uma questão interessante, sobre matrizes no Java, é que a linguagem 
permite que a matriz possua linhas de tamanhos diferentes. Veja, a se-
guir, um exemplo de matrizes com linhas de tamanhos diferentes. 
/* Exemplo de matriz de inteiros com linhas de tamanhos diferentes 
*/
int [ ] [ ] notasProvas = new int[6][ ];
notasProvas [0] = new int[3]; 
notasProvas [1] = new int[2];
notasProvas [2] = new int[2];
notasProvas [3] = new int[5];
notasProvas[4] = new int[4];
notasProvas[5] = new int[12];
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
47PROGRAMAÇÃO ORIENTADA A OBJETOS II
O tamanho de um array está no seu atributo length. Esse atributo não 
pode ser alterado - ele é imutável após a sua criação -, entretanto, é 
possível atribuir à variável, que referencia o array um novo vetor com 
tamanho diferente.
Na listagem, a seguir, pode-se observar alguns métodos importantes 
para manipulação de Arrays. 
 ▪ arrayCopy da classe System: permite copiar o conteúdo de um vetor 
para outro vetor. Exemplo: 
char[] origem = { ‘d’, ‘e’, ‘c’, ‘a’, ‘f ’, ‘e’, ‘i’, ‘n’, ‘a’, ‘t’, ‘e’, ‘d’ }; 
char[] destino = new char[7]; 
 System.arraycopy(origem,2, destino, 0, 7); 
//o conteúdo de destino será ‘c’, ‘a’, ‘f ’, ‘e’, ‘i’, ‘n’, ‘a’,
 ▪ sort da classe java.util.Arrays. Oderna um vetor. Exemplo: 
int[] valores = { 10, 5, 6, 1, 2, 8}; 
java.util.Arrays.sort(valores); 
//o conteúdo do vetor valores será ordenado crescentemente 
SEÇÃO 3
Construtor
O construtor é o método chamado no momento que uma nova instância 
do objeto é criada. Ele possibilita inicializar a instância e suas variáveis, 
alocando os recursos necessários ao funcionamento do objeto.
O construtor deve possuir o mesmo nome da classe e não deve ser de-
finido um tipo de retorno. 
Toda classe possui um construtor. Se o desenvolvedor não definir um cons-
trutor, a classe recebe um construtor padrão sem argumentos. Um cons-
trutor pode ser sobrecarregado, permitindo que uma mesma classe possua 
vários construtores. 
Observe, a seguir, um exemplo de classe com construtor sobrecarregado.
public class Empregado {
 private String nome;
 private int salario;
 public Empregado(String n, int s) {
 nome = n;
 salario = s;
 }
 public Empregado(String n) {
 this(n, 0);
 }
 public Empregado( ) {
 this(“Não definido”);
 }
}
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
48 CURSOS TÉCNICOS SENAI
SEÇÃO 4
Final e static
O Java disponibiliza duas palavras-chave, que modificam o comporta-
mento da linguagem sobre classes, atributos, argumentos, variáveis e 
métodos: static e final. 
O final pode ser aplicado à classe, métodos, atributos, variáveis e argu-
mentos. Quando aplicada, na declaração de uma classe, indicada que a 
classe não pode ser extendida. Isso permite, ao desenvolvedor da classe, 
garantir que o comportamento da classe não será alterado por uma ques-
tão de segurança, por exemplo: 
public final class ValidadorSenha{
 public boolean isSenhaValida(String user, String senha){
 {
 // código de validação...
 }
}
Um desenvolvedor que queira burlar a segurança, derivando a classe, 
como, no exemplo a seguir, receberia um erro no momento da compila-
ção, indicando que a operação é ilegal. 
public class ValidadorSenhaNovo extends ValidadorSenha { 
//<<o compilador irá indicar um erro na linha acima.
 public boolean isSenhaValida (String user, String senha){
 {
 return true;
 }
}
Assim, como uma classe final, um método final de uma classe não pode 
ser sobrescrito nas suas subclasses.
Quando aplicado a uma variável, argumento ou atributo, o operador 
final impede que o conteúdo seja alterado após a sua declaração, ou, no 
caso dos atributos de uma classe, na sua costrutora. Qualquer tentativa 
de mudança de valor, após a sua declaração, causa um erro de compila-
ção. Por conta dessa restrição à escrita, a VM pode aperfeiçoar o acesso 
a esta variável, reduzindo o tempo despendido para operação, algo que 
pode ser positivo dependendo da situação. Veja um exemplo de tentativa 
de derivar uma classe fina. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
49PROGRAMAÇÃO ORIENTADA A OBJETOS II
public class Carro{
 private final int anoFabricacao;
 public Carro(int anoFabricacao)
 {
 this .anoFabricacao = anoFabricacao; 
 
 } 
 
 public void adulteraCarro(int novoAnoFabricacao){
{
 this.anoFabricacao = novoAnoFabricacao; 
//<<o compilador irá indicar um erro na linha acima.
 
}
}
O static permite que um atributo ou um método fique vinculado à classe 
e não às instâncias. No caso das variáveis, o seu valor é compartilhado 
entre todas as instâncias de uma classe. O resultado é semelhante a uma 
variável global em outras linguagens. O acesso à variável, se não for 
privada, utiliza a referência da classe, conforme pode ser observado a 
seguir. 
public class Servidor{
 public static String url;
 // código ...
}
public class Cliente{
 public void conectar(){
 /* para acessar o atributo static, basta usar 
 * a forma classe.atributo
 */
 String url = Servidor.url;
 }
}
Um uso comum do static e final é a definição de constantes, permitindo 
criar atributos acessíveis pelas instâncias, sem permitir que seus valores 
possam ser alterados. As constantes são criadas para melhorar a legibi-
lidade do código, possibilitando evitar o uso de valores fixos no código, 
prática conhecida como Magic Number.
O exemplo, a seguir, define uma classe para fazer Log de operações. 
Nessa classe são definidas quatro constantes, utilizadas no momento de 
registrar, definindo o tipo de operação: ERROR, WARNING, INFO, 
DEBUG. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
50 CURSOS TÉCNICOS SENAI
public class Log{
 public static final int ERROR = 3;
 public static final int WARNING = 2;
 public static final int INFO = 1;
 public static final int DEBUG = 0;
 public static void log(int type, String msg){
 //... código do log ..
 }
}
SEÇÃO 5
Estudo de caso: relação de clientes
Você se lembra que, nas seções anteriores, foram definidas as classes 
Cliente, ClienteEspecial e ClienteDevedor? Elas compõem uma mesma 
hierarquia de classes, possibilitando tratar qualquer instância especializa-
da por meio e uma referência de Cliente. 
Por conta disso, para criar uma lista de clientes, pode-se usar um array 
do tipo cliente. No exemplo de código, a seguir, você pode observar a 
implementação São criados três objetos, inicializados, apropriadamente, 
e é feita a referência, as posições e o array para os objetos. Confira: 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
51PROGRAMAÇÃO ORIENTADA A OBJETOS II
package com.senai.main;
import org.senai.cliente.Cliente;
import org.senai.cliente.ClienteDevedor;
import org.senai.cliente.ClienteEspecial;
public class RelacaoCliente {
 public static void main(String args[]){
 Cliente[] clientes = new Cliente[3];
 
 Cliente joao = new Cliente(“Loja do Joao”);
 joao.setEndereco(“Rua dos programadores, 100”);
 joao.setLimiteCompras(150);
 joao.setTelefone(“2235-0813”);
 ClienteEspecial maria = new ClienteEspecial(“Loja da Maria”);
 maria.setEndereco(“Rua dos desenvolvedores, 101”);
 maria.setLimiteCompras(150);
 maria.setTelefone(“2235-0813”);
 maria.setNomeContato(“Maria”);
 maria.setTelefoneContato(“2357-1113”);
 ClienteDevedor juka = new ClienteDevedor(“Loja da juka”);
 juka.setEndereco(“Rua dos analistas, 110”);
 juka.setLimiteCompras(150);
 juka.setTelefone(“2235-0813”);
 clientes[0] = joao;
 clientes[1] = maria;
 clientes[2] = juka;
 
 listarClientes(clientes);
 }
 public static void listarclientes(Cliente[] clientes){
 System.out.println(“Listagem de Clientes”);
 for(Cliente cliente : clientes){
 System.out.println(cliente);
 }
 }
}
No trecho de código, onde são exibidas as informações dos clientes, o 
compilador não sabe dos detalhes dos objetos, só valida se a referências 
é permitida. Na execução, por polimorfismo, os métodos são executados 
de acordo com a instância presente na memória. 
É importante, também, observar o uso do for-each. No método listar-
Clientes, foi utilizado um interator, que varre o array, igualando a posi-
ção atual com a variável cliente. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
52 CURSOS TÉCNICOS SENAI
de Throwable. Das diversas derivações de Throwable, duas merecem 
uma atenção especial: Error e RuntimeException.
O tratamento de exceções é expresso por meio de dois grupos de pala-
vras reservadas, que trabalham em conjunto:
 ▪ um grupo para o lançamento de exceções: throw/throws, onde as 
exceções são originadas ou passadas para frente;
 ▪ outro para a captura de exceções lançadas e/ou garantia de execu-
ção: try-catch-finally, com as quais, de fato, se trata as exceções.
Figura 24: Gerando exceção NullPointerException 
O desenvolvedor, durante a criação de uma aplicação, pode identificar 
situações no código onde o fluxo deva ser interrompido, por exemplo, 
pela inconsistência de uma informação. Também pode ocorrer queo 
desenvolvedor não deseja tratar uma determinada situação, como, por 
exemplo, a falta de um arquivo. Nessas situações, ele pode lançar uma 
exceção. O desenvolvedor, para lançar uma exceção, usa as palavras re-
servadas throw e throws. Veja, a seguir, um exemplo dessa utilização.
//... código da classe
public void loadData(String caminho) throws IOException{
 if(verificarArquivo(caminho) == false){
 throw new IOException(“Erro a verificar arquivo”);
 }
 //código de carga dos dados
 
 }
SEÇÃO 6
Tratamento de exceções
O tratamento de exceções é o me-
canismo para tratar erros durante 
a execução de um programa. Ele 
representa uma parte significativa 
do esforço em projetos desenvol-
vidos em Java. Entretanto, esse 
esforço não agrega valor ao pro-
duto e, normalmente, implica em 
problemas quando não é adequa-
damente codificado. 
As exceções são classes que repre-
sentam erros durante a execução 
de um programa Java. Os objetos 
que representam as exceções po-
dem ser “lançados”, capturados 
e manipulados. São considerados 
condições de erro:
 ▪ tentar abrir um arquivo que 
não existe;
 ▪ tentar usar uma conexão de 
rede interrompida;
 ▪ tentar acessar posição de 
arrays fora da faixa;
 ▪ tentar carregar uma classe que 
não está no classpath.
Na figura 23, você pôde observar 
a execução de um código que gera 
uma exceção. É criada uma refe-
rência à classe String. Ela é inicia-
lizada com null. Antes que seja 
instanciado um objeto do tipo 
String para esta referência, tenta-
-se utilizar o método isEmpty(), 
que ainda não existe. A exceção 
gerada é uma do tipo NullPoin-
terException.
As exceções no Java derivam da 
classe Throwable. Ela é a única, 
cujas instâncias, diretas ou indire-
tas, podem ser usadas para serem 
lançadas. Existe um grande núme-
ro de classes presentes na lingua-
gem para tratar todas as catego-
rias de erro. Também é possível 
criar novas exceções, derivando 
de Exception, um tipo derivado 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
53PROGRAMAÇÃO ORIENTADA A OBJETOS II
A linguagem Java exige que toda exceção, que possa ser lançada, deve ser 
tratada. No exemplo anterior de código, o desenvolvedor, que disparar 
o método loadData, precisará tratar a exceção do tipo IOException, caso 
contrário, o compilador indicará que há um problema no código. Essa 
situação não é aplicada, caso as exceções lançadas, envolvam instâncias 
da classe Error, RuntimeException e das classes delas derivadas.
Ainda no código mostrado, anteriormente, caso o método verificarArqui-
vo retornar falso, será criado um objeto do tipo IOException. O fluxo de 
controle será interrompido, e retornará para o método chamador, um 
objeto de exceção. Observe, a seguir, o código que dispara o método ve-
rificarArquivo. Ele está envolvido com um conjunto de try/catch/finally. 
//... código da classe
String arquivo = “data.txt”;
try{ 
 loadData(arquivo);
 otimizarData(); 
}
catch(IOException ioex){
 System.out.println(“Problemas ao importar arquivo:”+arquivo);
 ioex. printStackTrace(); //imprime todo a pilha de execução
}
finally{
 System.out.println(“Processo Encerrado”);
}
//... código da classe
Caso o método loadData, ou qualquer outro método dentro de um bloco 
try-catch, lance uma exceção de um tipo previsto por uma cláusula ca-
tch, o fluxo é desviado para uma cláusula catch apropriada.
Isso permite uma consideração sobre os métodos, que podem terminar 
por uma das condições abaixo:
 ▪ o fluxo de controle atingiu o final do método; 
 ▪ o fluxo de controle atingiu um comando return; 
 ▪ ocorreu um problema grave, impedindo o fluxo normal, foi exe-
cutado um throw implícito ou explícito, que não foi apanhado por 
um comando try-catch daquele método. Não existindo a execução do 
programa, será finalizada, com mensagem de erro provida pela JVM, 
dizendo que uma exceção foi lançada sem que fosse apanhada.
Considerando apenas o encerramento, por conta de problemas, é im-
portante observar que a linguagem Java classifica os erros e exceções em 
dois grupos: 
 ▪ checked: a verificação é obrigatória;
 ▪ unchecked: a verificação não é obrigatória. 
O desenvolvedor, para lançar as 
exceções checked, deve marcar o 
método com o tipo de exceção a 
ser lançado. Isso é feito, por meio 
do uso da palavra reservada thro-
ws. Isso pode ser observado na 
declaração de método presente 
no exemplo try/catch/finally (có-
digo anterior). Toda a chamada ao 
método calcular precisará tratar 
ou lançar exceções do tipo Ex-
ception.
Ainda nesse exemplo, pode-se 
observar a existência de um bloco 
finally. O finally define um bloco 
de código que sempre será exe-
cutado, mesmo que uma exceção 
seja lançada ou não.Isso permite 
ao desenvolvedor, garantir que 
um determinado bloco de código 
sempre será executado, mesmo 
que algum problema ocorra quan-
do, por exemplo, se trabalha da 
abertura de arquivos ou conexões 
com bancos.
Um bloco try pode conter: try-ca-
tch-finally, try-catch ou try-finally. 
A seleção pela forma mais apro-
priada cabe ao desenvolvedor.
O tratamento de exceções permi-
te ao desenvolvedor, decidir entre 
tratar uma exceção ou lançá-la 
para o método invocador. Isso 
leva à seguinte questão: quando se 
utiliza uma forma ou outra? 
A decisão deve levar em conta a 
lógica envolvida e relação com 
usuário. Se o problema necessita 
de uma ação do usuário e ocorre 
em uma camada muito interna da 
aplicação, deve-se lançar exceção 
até um ponto no qual haja intera-
ção com usuário. 
Além de contar com ampla bi-
blioteca de exceções disponíveis 
na linguagem, o desenvolvedor 
pode optar por criar uma nova ex-
ceção. No exemplo, a seguir, você 
pode observar a criação de exce-
ção – que trata da ocorrência de 
timeout em um servidor.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
54 CURSOS TÉCNICOS SENAI
public class ServerTimedOutException extends Exception {
 private int port; 
 public ServerTimedOutException(String motivo, int porta){
 super(motivo); // chama construtor da classe pai
 this.porta = porta;
 }
 public int getPorta( ) {
 return porta;
 }
}
SEÇÃO 7
Estudo de caso: objetos de calcular
Nessa seção, você acompanhará o desenvolvimento de uma aplicação, 
capaz de receber uma operação e executá-la. Observe na figura, a seguir, 
um diagrama de classes representando o problema.
Figura 25: Diagrama UML
A classe ParserOperacao recebe uma String, contendo a operação a ser 
executada. Ela interpreta essa operação e encaminha para o objeto de 
calculadora efetivar a operação. 
Na figura 26, pode ser visto o código da classe Calculadora. Essa classe 
possui o método calcular com duas implementações distintas. Uma que 
recebe duas variáveis do tipo double e realiza a operação; outra que rece-
be duas variáveis do tipo String, converte-as, e chama a outra operação 
de calcular. Isso caracteriza polimorfismo de sobrecarga – a Máquina 
Virtual Java selecionará, no momento de execução, a implementação 
apropriada. 
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
55PROGRAMAÇÃO ORIENTADA A OBJETOS II
Figura 26: Código-fonte calculadora 
Na figura 25, você pôde ver o código da classe ParserOperacao, que 
possui, associada a ela, uma referência à classe Calculadora. A operação 
principal é processar, que fragmenta a expressão e repassa para a calcu-
ladora executar a operação de fato.
É importante observar que a análise da operação é bastante restrita: 
ela apenas conseguirá interpretar uma operação, se entre os elemen-
tos, existir um espaço em branco e o formato for: Número Operador 
Número.
www.cliqueapostilas.com.br
http://www.cliqueapostilas.com.br
56 CURSOS TÉCNICOS SENAI
Figura 27: Código-fonte ParserExpressao
Na figura a seguir, você verá o código da classe Main. É nessa classe, 
que inicia a execução da aplicação. Ela utiliza uma classe do Swing: o 
JOptionPane, que será detalhada na próxima sessão. Por meio do JOp-
tionPane, é exibida

Continue navegando