Buscar

APOSTILA - PROGRAMAÇÃO ORIENTADA A OBJETOS

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Diretor Geral 
Gilmar de Oliveira
Diretor de Ensino e Pós-graduação
Daniel de Lima
Diretor Administrativo 
Eduardo Santini
Coordenador NEAD - Núcleo
de Educação a Distância
Jorge Van Dal
Coordenador do Núcleo de Pesquisa
Victor Biazon
Secretário Acadêmico
Tiago Pereira da Silva
Projeto Gráfico e Editoração
André Oliveira Vaz
Revisão Textual
Kauê Berto
Web Designer
Thiago Azenha
FICHA CATALOGRÁFICA
FACULDADE DE TECNOLOGIA E 
CIÊNCIAS DO NORTE DO PARANÁ. 
Núcleo de Educação a Distância;
VIEIRA, Ricardo Bortolo.
Programação Orientada a Objetos. Ricardo. Bortolo Vieira.
Paranavaí - PR.: Fatecie, 2020. 142 p.
Ficha catalográfica elaborada pela bibliotecária
Zineide Pereira dos Santos.
UNIFATECIE Unidade 1
Rua Getúlio Vargas, 333,
Centro, Paranavaí-PR
(44) 3045 9898
UNIFATECIE Unidade 2
Rua Candido Berthier
Fortes, 2177, Centro
Paranavaí-PR
(44) 3045 9898
UNIFATECIE Unidade 3
Rua Pernambuco, 1.169,
Centro, Paranavaí-PR
(44) 3045 9898
UNIFATECIE Unidade 4
BR-376 , km 102, 
Saída para Nova Londrina
Paranavaí-PR
(44) 3045 9898
www.fatecie.edu.br
As imagens utilizadas neste 
livro foram obtidas a partir
do site ShutterStock
Professor Me. Ricardo Bortolo Vieira
 
●	 Graduação em Ciência da Computação pela Universidade Estadual de Maringá 
(2003). 
●	 Especialização de Engenharia de Software pela Universidade Estadual de Londrina 
(2007). 
●	 MBA em Gestão em Saúde Suplementar pela São Marcos (2009). 
●	 Especialização de Gerência de Projetos pela Fundação Getúlio Vargas (2011). 
●	 Mestre em Desenvolvimento de Tecnologias pelo Instituto LACTEC.(2017)
●	 Doutorando em Informática para PUCPR . 
●	 Gerente	de	Desenvolvimento	de	software	e	profissional	do	mercado	de	TI	a	mais	de	
15 anos.
●	 Professor de nível superior da Faculdade Cidade Verde de Maringá (FCV), Universi-
dade Federal do Paraná (UFPR), Faculdade de Engenharia e Inovação Tecnológica 
(FEITEP), Fundação Getúlio Vargas (FGV) e Pontifícia Universidade Católica (PUC).
●	 Experiência na área de Ciência da Computação, com ênfase em Sistemas de Com-
putação e Automação e Robótica, além de experiência em Administração com ênfa-
se em Gerenciamento de Projetos.
●	 Empreendedor na área de automação industrial e consultoria de processos de indus-
triais e projetos
●	 Lattes: http://lattes.cnpq.br/5731213234468142
AUTOR
http://lattes.cnpq.br/5731213234468142
Seja muito bem-vindo(a)!
Olá prezado(a) aluno(a), este é o livro Programação Orientada a Objetos, sou o 
professor Ricardo Vieira, autor deste material, e o assunto que abordarei no decorrer do 
nosso estudo poderá contribuir com sua formação, especialmente a de desenvolvedor (a) 
de software. Além disso, este livro auxiliará em sua carreira e abrirá portas para o mundo 
dos negócios, mostrando-lhe as vantagens de trabalhar com programação. 
Meu objetivo, por meio deste livro, é ensiná-lo o paradigma Orientado a Objetos 
voltado a programação, e apresentar algumas técnicas que podem auxiliá-lo neste processo. 
Além disso, pretendo deixar claro que o uso correto desse paradigma poderá ajudá-lo a 
alcançar os objetivos estratégicos da organização onde trabalha ou auxiliá-lo a colocar em 
prática ideia, que por enquanto podem estar arquivadas e aguardando o momento certo 
para se tornarem grandes negócios. 
Este livro está organizado em quatro unidades, além da introdução e conclusão. 
Cada uma delas correspondendo a uma das partes importante na programação orientada 
a objetos.
Na primeira unidade, você vai estudar o histórico e conceitos desse paradigma 
que nos permite programar de forma mais próxima do nosso pensamento. Além de estudar 
sobre a relação da programação orientada a objetos com a análise orientada a objetos, ou 
seja, estudando sobre classes, objetos, atributos e instâncias. 
Já na unidade II você poderá constatar os conceitos relacionados ao operador this, 
e outros operadores, os construtores para classes e algumas instruções de repetição.
Depois, na unidade III, falaremos sobre comandos em geral para linguagens 
orientadas a objeto e aprendendo mais sobre construtores. Trataremos também sobre 
conceitos	inerentes	a	Orientação	a	Objetos	como	Herança	e	Polimorfismo.	Na	unidade	IV,	
vamos entender melhor sobre encapsulamento de propriedades e a forma correta de se 
utilizar um conceito muito poderoso chamado interface. Vamos tratar também sobre captura 
e tratamento de exceções e não poderíamos deixar de abordar a programação em um nível 
mais macro tratando sobre desenvolvimento em camadas.
Agora, sem perder mais tempos, vamos direto a leitura! Tenha um bom aprendizado.
APRESENTAÇÃO DO MATERIAL
SUMÁRIO
UNIDADE I ...................................................................................................... 6
Programação Orientada a Objetos
UNIDADE II ................................................................................................... 43
Trabalhando com os Métodos e suas Referências 
UNIDADE III .................................................................................................. 69
Pilares da Orientação a Objetos e seus Comandos
UNIDADE IV ................................................................................................ 115
Trabalhando com Interfaces, Tratamento de Erros e Novos 
Paradigmas
6
Plano de Estudo:
1. PARADIGMA DA PROGRAMAÇÃO ORIENTADA A OBJETOS 
2. CLASSES E OBJETOS
3. O USO DE ATRIBUTOS 
4. INSTANCIAÇÃO REFERÊNCIA PARA OBJETOS 
5. MENSAGENS ENTRE OBJETOS 
6. CONSIDERAÇÕES FINAIS 
7. REFERÊNCIAS
Objetivos de Aprendizagem:
●	 Conceituar e contextualizar os diferentes termos utilizados em Orientação a 
Objetos.
●	 Compreender as características dos métodos Orientação a Objetos.
●	 Entender os diferentes termos utilizados em Orientação a Objetos.
●	 Conhecer a evolução dos métodos Orientação a Objetos.
UNIDADE I
Programação Orientada a Objetos
Professor Mestre Ricardo Vieira
7UNIDADE I Programação Orientada a Objetos
INTRODUÇÃO
Caro (a) aluno (a), iniciaremos a primeira unidade do livro Programação Orientado 
a Objetos (POO) com uma breve introdução sobre o Paradigma Orientado a Objeto e 
a importância da elaboração de um código elegante dentro do projeto de produção de 
software.
Em seguida, você verá como os conceitos de Classes e Objetos utilizando classes 
predefinidas	e	suas	bibliotecas	da	linguagem	de	programação	Java,	a	utilização	de	estruturas	
dinâmicas como listas simplesmente ligadas/encadeadas.
Nesta unidade, também você conhecerá e entenderá os conceitos e termos utilizados 
na análise e no projeto Orientado a Objetos (OO). Dentre os conceitos que veremos, estão 
o de tipos de dados abstratos, classe, instância, atributo, mensagem, , entre outros. Com 
esses conceitos iniciais, você terá uma visão geral sobre OO.
Então, o que estamos esperando? Vamos ao trabalho?
Boa leitura a todos.
 
 
 
 
 
8UNIDADE I Programação Orientada a Objetos
1. PARADIGMA DA PROGRAMAÇÃO ORIENTADA A OBJETOS 
A Orientação a Objetos (OO) surgiu de um trabalho acadêmico genial de Keith 
Tocher (1967) que formaliza a teoria da simulação no artigo intitulado The Art of Simulation. 
Ela foi baseada em modelos matemática e subdivida em três categorias: Discrete Events 
Simulation, Continuous Simulation e Monte Carlo Simulation. A categoria Discrete Events 
Simulation trabalha com mudanças de estado, relacionamentos e trocas de informações. 
Dessa forma, é fácil perceber que onde nossa OO surgiu (NANCE, 1995). 
À medida que os conceitos OO ganharam ampla aceitação durante as décadas 
de 1980 e 1990 surgiram muitas opiniões diferentes sobre as respostas corretas a essas 
perguntas, mas atualmente há uma visão coerente dos conceitos orientados a objeto. Esta 
introdução lhe proporcionará uma rápida visão do tópico e apresentará os conceitos básicos 
e a terminologia. (PRESSMAN, 2011). 
A principal característica do Paradigma Orientado a Objetos (POO) é uma maior 
e melhor expressividade das necessidades do nosso dia a dia.Possibilitando criar uma 
unidade de código mais próxima da forma como pensamos e agimos, assim facilitando 
o processo de transformação das necessidades diárias para uma linguagem orientada a 
objeto.
Assim, Orientação a Objetos é um paradigma de análise, projeto e programação 
de sistemas de softwares baseado na composição e interação entre diversas unidades de 
software chamadas de objetos. 
9UNIDADE I Programação Orientada a Objetos
Dá-se o nome de Programação Orientado a Objeto ao processo que utiliza uma 
linguagem OO. A sigla POO termina se fundindo entre a programação e o paradigma. A 
utilização de uma linguagem orientada a objeto somente, em alguns casos, não garante que 
se está programando efetivamente orientado a objeto. É importante prover um embasamento 
sobre	os	fundamentos	da	OO.	Todo	o	conceito	tem	como	finalidade	possibilitar	e	facilitar	
a aplicação destes conceitos. O uso correto destes conceitos eleva e facilita o processo 
de programação. O ponto de partida para a compreensão de OO é compreender o que é 
objeto e seus aspectos envolvidos em sua criação e sua manipulação (PRESSMAN, 2011).
No mercado atual de softwares, grande linguagens de programação como Java, 
ASP.NET, CSharp, C++, Python são OO, assim você consegue perceber a importância de 
estudar e absorver os conceitos de OO. Neste livro iremos discutir o assunto de OO usando 
como base a linguagem JAVA.
1.1. Métodos com Elegância 
Antes de conhecer a maneira apropriada de projetar um grande sistema de 
software Orientado a Objetos, inclusive a divisão adequada do sistema em classes com 
responsabilidades e colaborações convenientes, temos que entender o que torna uma 
classe individual elegante. Qual é o papel de uma classe? Que tipo de responsabilidades 
ela deve ter? Isto é, quais os dados ela deve manter e o que poderá ser feito com esses 
dados e com outros? Em outras palavras, qual deverá ser seu comportamento? 
Além disso, uma vez que tivermos tomado essa decisão, como iremos implementar 
esse comportamento com os métodos? Comecemos com os métodos. A elegância de um 
método está relacionada ao seu tipo de retorno, ao nome dos parâmetros ou ao corpo do 
método? Na verdade, está relacionada a todas essas partes. Para nos ajudar a entender 
as questões existentes em torno da elegância dos métodos, vamos considerar primeiro um 
exemplo simples. 
Suponhamos que estivéssemos desenvolvendo uma nova classe DataHolder que, 
quando solicitada, deverá inserir novos valores em um array de inteiros, referenciado por 
sua variável de instância privada data. Isto é, esse ato de inserção tem que fazer parte 
do comportamento da classe. Como resultado, temos de adicionar um ou mais métodos 
à classe para executar a inserção. Há vários métodos que poderíamos criar para dar à 
classe esse comportamento. Por exemplo, poderíamos criar um método insert( ) que use 
como parâmetro o novo valor inteiro a ser inserido e um índice inteiro indicando onde ele 
10UNIDADE I Programação Orientada a Objetos
deverá ser inserido. O método apenas insere o valor no local apropriado do array data. A 
alternativa será dividir o processo em três métodos separados, em que o primeiro método, 
increaseCapacity( ), aumentará o array, se necessário. O segundo, shift( ), deslocará os 
outros inteiros para dar espaço para o novo inteiro. E o terceiro, put( ), deverá inserir o novo 
inteiro no local recém liberado. Além disso, poderíamos deixar para o usuário a chamada 
aos três métodos individualmente ou criar um método insert( ) adicional que chamasse 
esses outros três métodos. 
Também poderíamos usar um nome que não fosse “insert” para o método ou alterar 
a ordem ou o número de parâmetros. Por exemplo, poderíamos sobrecarregar o método 
para que dois valores pudessem ser inseridos ao mesmo tempo. Também poderíamos ter 
vários tipos de retorno. O método poderia ter void como tipo de retorno ou, por exemplo, 
retornar informações indicando se foi bem sucedido na inserção do novo valor. Qual dessas 
opções seria a melhor? Voltaremos continuamente a esse exemplo nesta seção do capítulo 
e, no processo, responderemos a essa pergunta e a pergunta mais geral sobre o que torna 
um método elegante.
1.2. Convenções de Nomenclatura
Segundo Tucker (2009), vários princípios da criação de software pode nos ajudar a 
comparar e julgar as abordagens mencionadas no parágrafo anterior. Um princípio é usar 
nomes	que	revelem	a	finalidade.	Ele	será	examinado	com	mais	detalhes	porque	não	se	
aplica só aos métodos. Pode ser aplicado a qualquer parte do software que use nomes, 
inclusive métodos, variáveis, classes e interfaces. Um nome de método deve indicar a 
finalidade	do	método,	isto	é,	o	que	o	método	deverá	fazer.	O	nome	não	deverá	indicar	como	
o método atingirá seu objetivo e sim qual será o objetivo. Um método que não retornar um 
valor (um método com tipo de retorno void) deverá ter um nome composto por um verbo 
ou um verbo e seu complemento, como print( ) ou setName( ). Nomes vagos como doIt( 
)	são	 inadequados.	Um	método	que	retornar	um	valor	deverá	 ter	um	nome	que	reflita	o	
valor que estará sendo retornado, por exemplo, length( ) ou name( ). Esse tipo de método 
também poderia ter um verbo e seu complemento como nome. Como convenção pode-se 
utilizar a palavra “get” seguida do valor retornado. Por exemplo, um método que retorne o 
tamanho de alguma estrutura de dados poderia receber o nome size( ) ou getSize( ). Com 
relação ao nosso exemplo DataHolder, o nome insert( ) será satisfatório, pois descreverá 
sucintamente o que o método deverá fazer.
11UNIDADE I Programação Orientada a Objetos
Classes	e	 interfaces	deverão	 ter	 nomes	que	 reflitam	o	papel	 ou	a	 finalidade	de	
objetos desses tipos. O nome de uma classe será a primeira pista que o leitor tem do papel 
real que ela desempenha em um projeto e portanto, vale a pena dedicar algum tempo na 
busca de um nome apropriado. Normalmente os nomes de classes são substantivos, como 
Date ou ComputerCard. Quase sempre interfaces têm nomes que terminam em “-able”, 
como Cloneable ou Iterable (TUCKER, 2009). 
Para concluir, as variáveis têm que ser nomeadas apropriadamente para melhorar 
a legibilidade. Considere um programa com uma variável chamada nT. Um argumento a 
favor de um nome assim seria que ele é curto e, portanto, economiza tempo de digitação 
e	ajuda	a	encurtar	as	 linhas	de	código.	Contudo,	o	nome	não	é	significativo	no	que	diz	
respeito a indicar a função da variável e o leitor é forçado a memorizá-la. Por outro lado, 
chamar a variável de numberOfThreads ou NumThreads ou até mesmo numThrds em vez 
de nT, aumenta drasticamente a facilidade de entender o código.
Uma variável boolean deverá ter um nome apropriado para o valor que representa. 
Geralmente não deverá representar a negação de um valor, então, por exemplo, não 
deveremos chamar nossa variável de notYetDone, que poderia resultar na necessidade de 
expressões como a negativa dupla !notYetDone. Em vez disso, seria melhor chamá-la de 
done e usar a expressão !done sempre que notYetDone tivesse de ser usada. É claro que 
o nome done	 também	não	é	 ideal,	 já	que	a	palavra	não	contém	informações	suficientes	
para ajudar o leitor a entender o papel da variável. O nome da variável deverá informar 
que atividade é ou não executada. Por exemplo, se essa variável estiver sendo usada para 
indicar	que	uma	imagem	gráfica	acabou	de	ser	carregada	e	 já	pode	ser	vista,	um	nome	
melhor seria doneLoading. Lembrem-se, nomes ruins não levam apenas a enganos; eles 
tornam o sistema inteiro mais difícil de entender, o que vai contra nosso desejo de ter um 
software legível conforme trata Tucker (2009) em seu livro de princípios e paradigmas.
1.3. Métodos Coesos
Ainda conforme Tucker(2009), outro princípio da criação de softwares é: “os métodos 
devem fazer apenas uma coisa e fazê-la bem”. Isto é, um método não deve executar duas 
ou mais tarefas a menosque façam parte de uma mesma ação coesa. Por exemplo, faz 
sentido o método insert( ) mencionado acima aumentar o array, mover os outros valores 
para dar espaço para o novo valor e adicionar o novo valor, porque tudo isso faz parte de 
12UNIDADE I Programação Orientada a Objetos
uma ação coesa. Por outro lado, um método que tanto insira novos itens em um array data 
quanto determine se uma String está na forma de um endereço de e-mail não é coeso. A 
principal razão para evitar a criação desse tipo de método é que, com frequência, queremos 
executar uma das ações, mas não as duas. Nesse caso, um método que execute as duas 
é desnecessário. Um método é muito mais reutilizável quando faz apenas uma coisa. Na 
Figura 01 está um exemplo de um método não coeso.
Figura 01. Exemplo de método não coeso. Elaborado pelo autor.
Esse método está claramente tentando fazer duas coisas e usando o flag para 
determinar qual delas fazer. Seria melhor termos dois métodos auxiliares separados, como 
doThis( ) e doThat( ), nenhum deles precisando de um flag. Uma vez que tivermos esses 
métodos, poderemos reescrever o método acima conforme a Figura 02.
Figura 02. Exemplo de método coeso. Elaborado pelo autor.
Agora esse código será aceitável (exceto pelos nomes flag, this e that, que não 
revelam	a	finalidade),	já	que	o	método	está	apenas	agindo	como	uma	central	de	despachos	
e, portanto, está fazendo apenas uma coisa e fazendo-a bem. 
Um resultado interessante para o princípio da coesão, tratado por Tucker(2009), é 
o	princípio	que	um	método	deverá	modificar	o	estado	de	um	objeto	ou	de	objetos	existentes	
ou retornar um valor, mas não ambos. Com estado de um objeto, queremos dizer os valores 
de suas variáveis de instância. Novamente, o raciocínio por trás desse princípio é o de que, 
às	vezes,	podemos	querer	modificar	o	estado	de	um	objeto,	mas	não	retornar	um	valor,	
em	outras	palavras,	pode	querer	retornar	um	valor,	mas	não	modificar	um	objeto.	Logo,	a	
título de reutilização, é melhor separar essas ações em dois métodos separados. Observe 
que	a	adesão	rigorosa	a	esse	princípio	requer	que	não	haja	modificação	de	código	dentro	
13UNIDADE I Programação Orientada a Objetos
de métodos que retornem valores. Por exemplo, um método que informa se um array está 
classificado	ou	revele	qual	o	maior	valor	do	array retorna um valor e, portanto, não deve 
modificar	o	array. Outra maneira de formular esse princípio seria dizendo que métodos que 
retornam valores não devem ter efeitos colaterais, e métodos com efeitos colaterais não 
devem retornar valores. 
Dito isso, observe que temos usado as terminologias “diretrizes” e “princípios” em 
vez de “regras”. Ou seja, essas diretrizes devem ser levadas em consideração no projeto 
ou implementação de um sistema de software, mas não são regras a serem rigidamente 
seguidas conforme descreve Tucker (2009). Em algumas situações, pode ser melhor para 
o projeto se ignorarmos um ou mais desses princípios. E alguns códigos legados e de 
biblioteca não os seguem. Por exemplo, o pacote java.util tem uma classe Stack com um 
método pop( ) que tanto remove o objeto do topo da pilha quanto o retorna. Tecnicamente, 
esse comportamento desobedece ao princípio mencionado acima, mas é aceitável porque 
é um comportamento sensato nesse caso e, o mais importante, porque esse método vem 
sendo usado há anos e alterar seu comportamento agora seria muito pior do que deixar que 
ele continue desobedecendo à diretriz .
1.4. Objetos Bem Formados 
Aqui, ainda citando Tucker(2009), está outro princípio relativo a métodos elegantes: 
“um método não privado deverá manter um objeto em um estado bem formado”. Por 
exemplo, suponhamos que você tivesse uma classe com duas variáveis de instância: um 
array de inteiros data e um inteiro max, que armazenam o valor máximo do array data. Você 
deverá	tomar	cuidado	para	não	ter	métodos	na	classe	que	modifiquem	o	array sem atualizar 
também a variável max. É a esse tipo de coerência interna que nos referimos quando 
dizemos que uma classe é “bem formada”. Como formular os requisitos de coerência dos 
objetos de uma classe? Isto é, como saber se a instância de uma classe está bem formada? 
Uma boa maneira é criar uma lista das invariantes da classe. Uma invariante de classe é 
uma declaração que fornece os requisitos sobre o estado de instâncias da classe entre 
chamadas de método públicas. Um exemplo de invariante de classe é a declaração “O valor 
de max e o maior valor do array data deverão ser iguais”. Como outro exemplo, considere a 
implementação, apresentada na Figura 03, da classe DataHolder discutida anteriormente.
14UNIDADE I Programação Orientada a Objetos
Figura 03. Implementação da Classe DataHolder. Elaborado pelo autor.
Observe que o array data está sempre repleto de dados que foram inseridos. 
Isto é, nunca haverá locais não usados no array. Essa é uma invariante para objetos 
da classe DataHolder. Se a invariante for rompida, poderá ocorrer um comportamento 
inesperado. Para evitar isso, os três métodos auxiliares increaseCapacity( ), shift( ) e put( ) 
foram	construídos	como	privados.	Como	resultado,	os	objetos	desta	classe,	poderão	ficar	
temporariamente mal formados. Por exemplo, após increaseCapacity( ) ter sido chamado, 
mas serão restaurados para um estado bem formado, antes de algum método público 
retornar. Se increaseCapacity( ) ou shift( ) fossem públicos, qualquer usuário do objeto 
poderia chamá-los isoladamente, causando a má formação do objeto. 
Para que as invariantes de classe sejam mantidas, é preciso que as variáveis de 
instâncias	 sejam	privadas	 ou	 finais,	 se	 tiverem	envolvimento	 com	alguma	 invariante	 de	
15UNIDADE I Programação Orientada a Objetos
classe. Caso contrário, outro objeto poderia acidental ou maliciosamente alterar o valor da 
variável e gerar o objeto mal formado.
1.5. Tipo Abstrato de Dados 
Serra (2003) apresenta a noção de Tipo Abstrato de Dados (TAD), iniciando pela 
especificação	de	um	tipo	de	dado	com		as	suas	propriedades	fundamentais,	de	maneira	
independente da implementação da linguagem utilizada. 
São três passos envolvidos para implementar um tipo abstrato de dados (TAD):
●	 O	primeiro	passo	será	a	definição	de	uma	API Java (Application Programming Inter-
face), ou simplesmente interface, que descreverá os métodos que o TAD suportará 
e como eles serão declarados e como serão utilizados.
●	 O segundo passo será a escolha da representação Concreta do TAD que será utili-
zada na implementação. Assim, basicamente dois tipos de representação são intro-
duzidos:
○	 Estrutura Estática (com a utilização de arrays);
○	 Estrutura Dinâmica (com a utilização de listas ligadas/encadeadas, pilhas, 
árvore, etc.). 
●	 E o terceiro passo será a implementação da interface através de uma classe e le-
vando em consideração a representação escolhida no segundo passo. 
 Poderá existir muitas implementações para todo o TAD, contudo todas as 
implementações	deverão	respeitar	a	interface	definida,	conforme	trata	Serra	(2003).	
1.5.1. Estruturas 
Segundo Serra(2003), precisamos frequentemente agrupar vários elementos e ou 
dados num conjunto. A princípio não saberemos o número exato de elementos que serão 
agrupados. A cada instante podemos remover ou acrescentar elementos ao conjunto. Dentro 
da programação deveremos considerar dois tipos de estruturas que permitirão guardar uma 
coleção de elementos, que poderão ser a Estrutura Estática e a Estrutura Dinâmica. Os 
elementos poderão ser organizados de maneira distinta. Poderemos destacar, entre as 
organizações possíveis: 
● Estrutura Linear: Determina que haja entre os elementos da coleção, a existência 
de uma determinada ordem. Por exemplo: Primeiro elemento, Segundo elemento, ... 
N elemento, Último elemento.
16UNIDADE I Programação Orientada a Objetos
● Estrutura Hierárquica: É a organização de elementos que poderão ser representa-
das em formade árvore. 
● Estrutura Grafo: É a organização de elementos que serão representadas em forma 
de rede. 
Neste capítulo serão apresentados exemplos de implementações destas três 
estruturas: Linear, Estática e Dinâmica. Começaremos pela Figura 04 apresentando uma 
estrutura linear.
Figura 04. Representação da estrutura linear. Elaborado pelo autor.
 
 
1.5.2. Estrutura Estática 
Ainda segundo Serra(2003), a principal característica da estrutura estática é possuir 
um espaço alocado e permanecerá inalterável até antes da sua utilização. Esta estrutura não 
deverá conter mais elementos do que foi inicialmente pré-determinado. A Estrutura Estática 
será representada através do uso de tabelas, em termos da linguagem de programação 
Java. Uma vez alocado um determinado espaço numa tabela, este permanecerá inalterável, 
independente das operações de de remoção e inserção dos elementos, mesmo que esta 
estrutura não possua nenhum elemento armazenado nela.
Para facilitar a compreensão de vocês, meus caros leitores, será apresentado uma 
implementação, na Figura 05, de uma interface denominada estruturaLinear por meio de 
uma determinada classe chamada ArrayCircularList. Esta implementação está baseada 
na utilização de uma Estrutura Estática, que servirá para guardar os elementos de uma 
determinada coleção. A opção foi a utilização de uma estrutura circular.
17UNIDADE I Programação Orientada a Objetos
1.5.3. Estrutura Dinâmica 
Continuando a referência segundo Serra (2003), Uma das principais características 
da estrutura dinâmica é que ela poderá sofrer alterações à medida que ocorrer a sua 
manipulação através de inserção e remoção de elementos em sua estrutura. A Estrutura 
Dinâmica, em sua dimensão, não possuirá limitações, com exceção da limitação física do 
espaço de memória do computador, sendo esta a sua única restrição, onde ocorrerá a 
execução do algoritmo. A Estrutura Dinâmica será instanciada com a utilização do tipo 
de	 dado	 que	 ela	 fizer	 a	 Referencia	 (apontador).	As	 Estruturas	 Dinâmicas	 poderão	 ser	
criadas para fazer a representação das coleções dos elementos com diferentes tipos 
de organização. A implementação de uma Estrutura Linear poderá ser realizada com a 
utilização de Estruturas Dinâmicas, com a representação de listas simplesmente ligadas, 
de listas duplamente ligadas, de listas circulares, etc. Será apresentado na Figura 06, a 
implementação de uma interface denominada estruturaLinear, como um exemplo de 
utilização destas listas.
Figura 05. Exemplo de implementação uma estrutura estática. Elaborado pelo autor.
18UNIDADE I Programação Orientada a Objetos
1.5.3.1. Listas simplesmente ligadas/encadeadas 
A forma mais simples para a representação de uma coleção de elementos será a 
utilização de uma lista encadeada, que juntos formarão uma ordenação linear, conforme 
trata Serra (2003). O objeto da classe No fará a representação de cada elemento da coleção. 
A ordenação será determinada com o armazenamento da referência em um nó para um 
elemento e uma referência, será chamada de próximo, para o próximo nó da coleção. 
Conforme será visto na Figura 06.
Figura 06. Representação de Lista Encadeada. Baseado em Serra (2003).
Serra (2003) indica que poderá ser vista como uma ligação ou apontador para 
outro nó a referência Próximo dentro de um nó. Serão chamados, respectivamente, de 
Cabeça e Cauda da lista o primeiro Elemento (nó) e os últimos Elementos (nós) de uma 
lista. A cauda será o Elemento (nó) que terá a referência Próximo igual à null, indicando 
o	 fim	 da	 lista.	 O	 deslocamento	 de	 um	Elemento	 (nó)	 para	 outro	 seguindo	 a	 referência	
Próximo será conhecido como percorrer a lista ou caminhar na lista. Será conhecida como 
uma	lista	simplesmente	encadeada,	uma	lista	encadeada	que	for	definida	desta	maneira.	
Uma	lista	simplesmente	encadeada,	diferentemente	de	uma	tabela,		não	terá	tamanho	fixo	
pré-determinado e alocará ao número de Elementos, os espaços proporcionais a cada 
um	deles.	Na	Figura	07,	será	definida	uma	classe	No,	para	 implementação	de	uma	lista	
simplesmente encadeada na linguagem de programação Java.
19UNIDADE I Programação Orientada a Objetos
Figura 07. Implementação de uma Lista Encadeada em Java. Elaborado pelo autor.
A interface estruturaLinear pode ser implementada usando uma lista simplesmente 
encadeada na classe ListaEncadeada conforme mostra a Figura 08.
Figura 08. Implementação de uma Lista Simplesmente Encadeada. Elaborado pelo autor.
20UNIDADE I Programação Orientada a Objetos
1.5.3.2. Inserir Elemento na Cabeça da Lista 
Numa lista simplesmente encadeada podemos inserir ou remover um elemento na 
cabeça da lista. Conforme ilustra a sequência de Figuras de 09 a 11.
Figura 09. Antes da inserção de novo nó na Cabeça da Lista. Baseado em Serra (2003).
 
Figura 10. Inserção de novo nó Cabeça da Lista. Baseado em Serra (2003).
Figura 11. Depois da inserção de novo nó Cabeça da Lista. Baseado em Serra (2003).
21UNIDADE I Programação Orientada a Objetos
O código para esta operação é descrito na Figura 12.
Figura 12. Código para a inserção de novo nó na Cabeça da Lista. Elaborado pelo autor.
 
1.5.3.3. Inserir Elemento na Cauda da Lista 
Nesta situação Serra (2003) indica que teremos que percorrer todos os elementos 
a partir do ponteiro da cabeça até chegar no último Elemento, caso não tenha a referencia 
para o último Elemento da lista (ponteiro Cauda). A representação escolhida para a lista, 
como nosso exemplo, possui uma variável com a referência para o último Elemento (Cauda). 
Esta operação será descrita nas Figuras de 13 a 15.
Figura 13. Antes da inserção de novo nó na Cauda da Lista. Baseado em Serra (2003).
Figura 14. Inserção de novo nó na Cauda da Lista. Baseado em Serra (2003).
22UNIDADE I Programação Orientada a Objetos
Figura 15. Depois da inserção de novo nó Cauda da Lista. Baseado em Serra (2003).
O código para esta operação é apresentada na Figura 16.
Figura 16. Código para a inserção de novo nó na Cauda da Lista. Elaborado pelo autor.
1.5.3.4. Remoção do Nó 
Serra (2003) trata essa situação da seguinte forma - o elemento (nó) da cabeça 
ou da Cauda da lista poderá ser removido. A implementação do método seguinte permitirá 
remover o Elemento da Cabeça da lista.
Figura 17. Método para a remoção do elemento da Cabeça da Lista. Elaborado pelo autor.
Para a remoção do Elemento da cauda da lista, obrigatoriamente deverá percorrer 
cada Elementos da lista, desde a cabeça até ao penúltimo elemento da lista.
23UNIDADE I Programação Orientada a Objetos
Figura 18. Método para a remoção do elemento da Cauda da Lista. Elaborado pelo autor.
1.5.3.5. Listas Duplamente Encadeada/Ligadas 
Deverá existir para cada Elemento (nó) da lista duplamente encadeada, uma 
ligação não somente para o próximo Elemento, mas também para o Elemento anterior 
da lista. Com esta variante, da lista simplesmente encadeada, permitirá a inserção e a 
remoção o Elemento (nó) na cabeça e na cauda da lista. Para implementação deste tipo 
de	lista,	Devemos	especificar	a	classe	NoD, composta por Elemento (nó) referência para 
o Elemento (nó) seguinte e referência para o Elemento (nó) anterior. Estes são os passos 
descritos por Serra (2003) para o tratamento de lista duplamente encadeadas. Além disso, 
o código desta classe poderá ser visualizado na Figura 18.
24UNIDADE I Programação Orientada a Objetos
Figura 18. Método para inserção e a remoção de elementos da Lista Simplesmente Encadeada. Elaborado 
pelo autor.
Assim o código para lista dupla é apresentado nas Figuras 19, 20 e 21.
Figura 19. Método para inserção e a remoção de elementos da Lista Duplamente Encadeada. Elaborado 
pelo autor.
25UNIDADE I Programação Orientada a Objetos
Figura 20. Método para inserção e a remoção de elementos da Lista Duplamente Encadeada. (Continua-
ção). Elaborado pelo autor.
Figura 21. Método para inserção e a remoção de elementos da ListaDuplamente Encadeada. (Continua-
ção). Elaborado pelo autor.
26UNIDADE I Programação Orientada a Objetos
2. CLASSES E OBJETOS
2.1. Classes Predefinidas 
Conforme apresenta Sierra (2012), os nomes dos pacotes da linguagem de 
programação Java sempre começarão com Java, para pacotes do núcleo da linguagem ou 
Javax para as extensões ao núcleo. Será utilizada a instrução de import 		para	identificar	e	
carregar as classes que precisarmos utilizar em nossas implementações. Sempre antes da 
definição	das	classes	é	que	as	instruções	import	deverão	aparecer.	Exemplo:	import java.
util.Scanner;. 
Na linguagem de programação Java,	 as	 classes	 predefinidas	 serão	 agrupadas	
em categorias de classes conhecidas como pacotes (package), também são chamadas 
de bibliotecas de classes Java ou são chamadas ainda de Interface de Programação de 
Aplicativos Java (Java API). Na linguagem de programação Java, a Biblioteca (API – 
Application Programming Interface), ela será composta por um conjunto de classes do JDK, 
que são organizadas em pacotes;
São exemplos de pacotes Java apresentados por Sierra (2012):
●	 java.util: Contém a estrutura de coleções, classes de coleção herdadas, modelo de 
evento, facilidades de data e hora, internacionalização e classes de utilidade diver-
sas (um tokenizer de string, um gerador de números aleatórios e uma matriz de bits).
●	 java.net: Fornece as classes para implementar aplicativos de rede (sockets e URLs);
●	 java.lang: Fornece classes que são fundamentais para o design da linguagem de 
programação Java. Tipos e funcionalidades básicas da linguagem. Incluindo entre 
outras, as classes String, Math, Integer e Thread. Ela será importada automatica-
27UNIDADE I Programação Orientada a Objetos
mente em seus programas Java;
●	 java.io:	Fornece	entrada	e	saída	do	sistema	através	de	fluxos	de	dados,	serialização	
e sistema de arquivos. São classes para escrita e leitura em arquivos;
●	 java.awt: Contém todas as classes para criar interfaces com o usuário e pintar grá-
ficos	e	imagens.	São	componentes	gráficos	originalmente	da	linguagem	de	progra-
mação Java (Abstract Window Toolkit);
●	 java.applet: Fornece as classes necessárias para criar um applet e as classes que 
um applet usa para se comunicar com seu contexto de applet.	São	classes	específi-
cas para tratamento de applets;
●	 javax.swing: Fornece um conjunto de componentes “leves” (a toda linguagem Java) 
que, no grau máximo possível, funcionam da mesma maneira em todas as platafor-
mas. É um framework da plataforma Java para melhoramentos à biblioteca AWT; 
(Fonte: https://docs.oracle.com/javase/8/docs/api/overview-summary.html).
2.1.1. Biblioteca java.lang
Schildt (2013) trata sobre a biblioteca java.lang como sendo importada 
automaticamente para todos os programas. Ela contém classes e interfaces que são 
fundamentais para praticamente toda a programação Java. É o pacote Java mais 
amplamente usado e todos os programadores de Java devem ter um conhecimento geral 
do que ele fornece. O pacote java.lang inclui as classes de nível superior apresentadas na 
Tabela 01. 
Tabela 01. Pacote java.lang. Elaborado pelo autor.
As	interfaces	de	nível	superior	definidas	por	java.lang	são	as	mostradas	na	Tabela	02.
28UNIDADE I Programação Orientada a Objetos
Tabela	02.	Interfaces	de	nível	superior	definidas	por	java.lang. Elaborado pelo autor.
Como podemos ver, as classes e interfaces de java.lang	definem	um	grande	número	
de funcionalidades. Nem todas as partes são amplamente usadas, ou usadas por todos 
os programadores. Por exemplo, algumas classes, como StrictMath e Compiler, são mais 
aplicáveis	a	situações	específicas.	
2.1.2. Bibliotecas AWT	e	Swing	
Segundo Pereira (2017), será fornecido pela biblioteca AWT todas as classes para a 
criação	de	interfaces	com	o	usuários,	imagens	e	pintará	gráficos.	Ela	é	uma	interface	gráfica	
de usuário ( Graphical User Interface - GUI).	Ela	delegará	para	a	Interface	Gráfica	de	Usuário	
(GUI) da plataforma nativa (Windows, Linux, Mac) a criação, estilo e comportamento.
Com o seu lema “Write once, run anywhere” (“Escreva uma vez, execute em 
qualquer	 lugar”),	 	o	estilo	será	o	mesmo	da	plataforma,	se	fizermos	uma	caixa	de	texto,	
por exemplo, no Windows ou Linux, que atenderá à promessa de portabilidade do Java, 
conforme apresenta Schildt (2013). 
Para aplicações simples, o sistema funciona perfeitamente. O problema será para 
as aplicações mais complexas, as mudanças sutis nos comportamentos de Textfields, scrolls 
ou menus poderão causar alterações na experiência do usuário e até causar problemas 
diferentes em cada sistema, acabando com a ideia de portabilidade. 
Com o pacote “java.awt”, biblioteca AWT foi introduzida no Java 1.0.
Logo depois, como uma extensão, é que a biblioteca Swing foi introduzida na 
versão do Java 1.1 e também como parte do pacote padrão na versão do Java 1.2, dentro 
do pacote “javax.swing”.
A biblioteca Swing não delegará a criação, estilo e comportamento da interface 
gráfica	de	usuário	(GUI) para a plataforma nativa, mas ela tomará para si este trabalho, 
cumprindo o objetivo de portabilidade.
A biblioteca Swing é uma biblioteca que complementa o pacote AWT. 
29UNIDADE I Programação Orientada a Objetos
 No exemplo da Figura 22, as classes terão pelo menos três linhas com a diretiva 
import apontando para pacotes de classes externas, conforme as declarações seguintes: 
●	 import	java.awt.*; => permite a utilização de diversas classes do pacote awt, além 
de possuir uma série de constantes numéricas.
●	 import	java.awt.event.*;	=> usado para o processamento dos eventos que ocorrem 
na janela, tais como clique do mouse.
●	 import	javax.swing.*; => permite a utilização de diversas classes do pacote swing.
 
 
Figura 22. A sequência dos exemplos import java.awt.*; import java.awt.event.*;	import java.awt.event.*;	
import javax.swing.*;	 Elaborado pelo autor.
 
 
2.1.3. Biblioteca java.applet
“Os applets diferem dos tipos de programa mostrados nos exemplos anterio-
res. Eles são programas pequenos projetados para transmissão pela Internet 
e serem executados dentro de um navegador. Já que a máquina virtual Java 
se encarrega da execução de todos os programas Java, inclusive applets, 
oferecem uma maneira segura de baixar e executar dinamicamente progra-
mas pela Web.”( SCHILDT, 2015, p.499). 
Há dois tipos gerais de applets: os baseados apenas no Abstract Window Toolkit 
(AWT) e os baseados em Swing.	Ambos	dão	suporte	à	criação	de	uma	interface	gráfica	
de usuário (GUI). AWT é o kit de ferramentas de GUI original e Swing é a alternativa leve 
e moderna de Java. Segue um exemplo de um Applet simples apresentada na Figura 23.
30UNIDADE I Programação Orientada a Objetos
Figura 23. Exemplo de um Applet simples baseado em AWT. Elaborado pelo autor.
2.1.4. Biblioteca	java.net: 
Ainda conforme Schildt (2013), java foi projetada para atender às necessidades 
do ambiente de programação da Internet. Portanto, não deve surpreender o fato que a 
linguagem dá amplo suporte à rede em sua biblioteca de APIs. O principal pacote de rede 
de Java é o java.net. Ele fornece classes que permitem que um aplicativo acesse recursos 
de	rede	de	maneira	conveniente	e	eficaz.
É necessário enfatizar que rede é um assunto avançado. Além disso, é um assunto 
muito extenso e, às vezes, complexo. Uma discussão sobre rede pode facilmente envolver 
vários outros tópicos, como detalhes relacionados a protocolos e à arquitetura geral da 
Internet, que não fazem parte do escopo deste livro. 
O conceito básico do suporte Java ao uso de rede é o soquete. Um soquete	identifica	
uma extremidade em uma rede. Ele é à base das redes, porque permite que um único 
computador atenda muitos clientes diferentes ao mesmo tempo e forneça vários tipos de 
informações diferentes. Isso é feito com o uso de uma porta, que é um soquete numerado 
em	uma	máquina	específica.	Diz-se	que	um	processode	servidor	está	“escutando”	uma	
porta até um cliente se conectar a ela. Um servidor pode aceitar vários clientes conectados 
ao mesmo número de porta, mas cada sessão é exclusiva.
2.1.5. Biblioteca	java.io
Conforme Silveira (2006), a parte que controlará a entrada e saída de dados, 
conhecido como io, da mesma maneira como em todas as bibliotecas em Java, será 
também orientada a objetos. Ela usará os principais conceitos de utilização de interfaces, 
de	polimorfismo	e	das	classes	abstratas.	
31UNIDADE I Programação Orientada a Objetos
A	ideia	atrás	da	utilização	do	polimorfismo	no	pacote	java.io, será a utilização para 
toda	e	qualquer	operação	de	fluxos	de	entrada	(InputStream) e de saída (OutputStream), 
referente a um arquivo, a uma conexão remota via soquete, a um campo blob do banco 
de dados, ou até mesmo às entrada e saída padrão de um programa , normalmente os 
teclados e os consoles. 
Na linguagem de programação Java as classes abstratas InputStream e 
OutputStream definirão,	 respectivamente,	 o	 padrão	 de	 comportamento	 dos	 fluxos.	 Será	
possível ler bytes em	um	fluxo	de	entrada	e	escrever	bytes no	fluxo	de	saída.	
Pode ser exibida a grande vantagem dessa abstração, em um método qualquer 
que implemente uma classe OutputStream, que receberá como argumento para escrever 
um	fluxo	de	saída.	
O método está escrevendo onde? Não será necessário saber e isso também não 
importará, porque quando o sistema realmente precisar escrever em um arquivo ou em um 
soquete,	bastará	chamar	esse	mesmo	método,	já	que	ele	aceitará	qualquer	classe	“filha”	
de OutputStream. 
2.1.6.	Biblioteca	java.util:
o pacote java.util	define	classes	e	interfaces	que	atendem	várias	tarefas	comumente	
encontradas quando se programa. Por exemplo, ele contém o Collections Framework. O 
Collections Framework é um dos subsistemas mais poderosos do Java e dá suporte a uma 
sofisticada	hierarquia	de	interfaces	e	classes	que	gerenciam	grupos	de	objetos.	O	pacote	
java.util também fornece várias classes utilitárias, inclusive as que formatam dados para 
saída, leem dados formatados e trabalham com data e hora. Como java.util dá suporte a 
um conjunto tão amplo de funcionalidades, é um pacote muito extenso.
O pacote java.util é muito grande, mas seu tamanho é gerenciável porque as 
classes e interfaces que compõem o Collections Framework podem ser examinadas 
separadamente, como um grupo.
32UNIDADE I Programação Orientada a Objetos
3. O USO DE ATRIBUTOS 
Os atributos são pertencentes à classe, eles podem ser do tipo primitivo ou 
referência	(objetos),	os	seus	modificadores	podem	ser:	public, private, protected ou default. 
O ciclo de vida destes atributos está vinculado ao ciclo de vida da classe. 
Um carro, além de ter a capacidade de realizar tarefas, também tem atributos, como 
cor, número de portas, quantidade de gasolina no tanque, velocidade atual e registro dos 
quilômetros totais dirigidos (isto é, a leitura do odômetro). Assim como suas capacidades, 
os atributos do carro são representados como parte do seu projeto nos diagramas de 
engenharia (que, por exemplo, incluem um odômetro e um medidor de combustível). Ao 
dirigir um carro real, esses atributos são incorporados a ele. Cada carro mantém seus 
próprios atributos. Cada carro sabe a quantidade de gasolina que há no seu tanque, mas 
desconhece quanto há no tanque de outros carros. 
Um objeto, da mesma forma, tem atributos que ele incorpora à medida que é usado 
em	um	programa.	Esses	atributos	são	especificados	como	parte	da	classe	do	objeto.	Por	
exemplo, um objeto conta bancária tem um atributo saldo que representa a quantidade de 
dinheiro disponível. Cada objeto conta bancária sabe o saldo que ele representa, mas não 
os	saldos	de	outras	contas	bancárias.	Os	atributos	são	especificados	pelas	variáveis	de	
instância da classe.
33UNIDADE I Programação Orientada a Objetos
No encapsulamento, as classes e seus objetos encapsulam, isto é, contêm seus 
atributos e métodos. Os atributos e métodos de uma classe (e de seu objeto) estão 
intimamente relacionados. Os objetos podem se comunicar entre si, mas eles em geral 
não sabem como outros objetos são implementados, os detalhes de implementação 
permanecem ocultos dentro dos próprios objetos. 
3.1. Continuando Com Atributos 
As variáveis do tipo atributo, diferentemente das variáveis temporárias (declaradas 
dentro de um método), recebem um valor padrão. No caso numérico, pode ser zero, no 
caso de boolean, pode ser false. Você também pode dar valores default, como apresentado 
na Figura 24.
Figura 24. Exemplo de atributos da classe Conta. Elaborado pelo autor.
Nesse caso, quando você criar uma conta, seus atributos já estão “populados” 
com esses valores colocados. Imagine que comecemos a aumentar nossa classe Conta e 
adicionar nome, sobrenome e CPF do cliente dono da conta. Teríamos muitos atributos. E 
se você pensar bem, uma Conta não tem nome, nem sobrenome nem CPF, quem tem esses 
atributos é um Cliente. Então podemos criar uma nova classe e fazer uma composição. 
Seus atributos também podem ser referências para outras classes. Suponha as seguintes 
classes Cliente e Conta apresentado nas Figuras 25 e 26.
Figura 25. Exemplo de atributos da classe Cliente. Elaborado pelo autor.
34UNIDADE I Programação Orientada a Objetos
Figura 26. Exemplo de referência de atributos da classe Conta. Elaborado pelo autor.
E dentro do main da classe de teste como mostra a Figura 27.
Figura 27. Exemplo de referência de atributos dentro do main da classe de teste. Elaborado pelo autor.
Aqui, simplesmente houve uma atribuição. O valor da variável c é copiado para o 
atributo titular do objeto ao qual minhaConta se refere. Em outras palavras, minhaConta 
tem uma referência ao mesmo Cliente que c se refere, e pode ser acessado através de 
minhaConta.titular.
Você pode realmente navegar sobre toda essa estrutura de informação, sempre 
usando o ponto: Cliente clienteDaMinhaConta = minhaConta.titular; clienteDaMinhaConta.
nome = “Luke”; Ou ainda, pode fazer isso de uma forma mais direta e até mais elegante: 
minhaConta.titular.nome = “Luke”;
Um sistema orientado a objetos é um grande conjunto de classes que vai se 
comunicar, delegando responsabilidades para quem for mais apto a realizar determinada 
tarefa. A classe Banco usa a classe Conta que usa a classe Cliente, que usa a classe 
Endereco. Dizemos que esses objetos colaboram, trocando mensagens entre si. Por isso 
acabamos tendo muitas classes em nosso sistema e elas costumam ter um tamanho 
relativamente curto.
35UNIDADE I Programação Orientada a Objetos
4. INSTANCIAÇÃO REFERÊNCIA PARA OBJETOS 
No contexto de uma atribuição, e conforme Deitel (2008), o operador new tem esta 
forma geral: var_classe = new nome_classe(lista_arg); O operador new é o responsável 
pelo processo de instanciação do objeto, representando uma forma extremamente simples 
de atribuir valores default a um objeto. 
A declaração: Televisor tv = new Televisor(); pode ser lida como: construa o objeto 
tv (do tipo Televisor) com valores default. Como o próprio nome diz, o método construtor é 
o responsável por construir um objeto com determinados valores. 
Se	uma	classe	não	definir	seu	próprio	construtor,	new usará o construtor padrão 
fornecido por Java. Logo, new poderá ser usado para criar um objeto de qualquer tipo de 
classe. O operador new retornará uma referência ao objeto recém-criado, que (nesse caso) 
será atribuído a var-classe. 
Já	 que	 a	 memória	 é	 finita,	 e	 conforme	 Deitel	 (2008),	 é	 possível	 que	 new	 não	
consiga	alocar	memória	para	um	objeto	por	não	existir	memória	suficiente.	Se	isso	ocorrer,	
haverá uma exceção de tempo de execução. Para os exemplos de programa deste livro, 
não	precisamos	nos	preocupar	em	ficar	 sem	memória,	mas	 temos	que	considerar	essa	
possibilidade em programas do mundo real que escrevermos ou quando desenvolvemos 
para dispositivos embarcadoscom baixa quantidade de memória.
36UNIDADE I Programação Orientada a Objetos
4.1. Acessando objetos por referências
Quando declaramos uma variável para associar a um objeto, na verdade, essa 
variável não guarda o objeto, e sim uma maneira de acessá-lo, chamada de referência. É 
por esse motivo que, diferente dos tipos primitivos como int e long, precisamos dar new 
depois de declarada a variável, conforme apresenta a Figura 28.
Figura 28. Exemplo de referência de objeto utilizando new. Elaborado pelo autor.
O correto aqui é dizer que c1 se refere a um objeto. Não é correto dizer que c1 
é um objeto, pois c1 é uma variável referência, apesar de que, depois de um tempo, os 
programadores Java falarem “Tenho um objeto c do tipo Conta”, mas apenas para encurtar 
a frase “Tenho uma referência c a um objeto do tipo Conta”. Basta lembrar que, em Java, 
uma variável nunca será um objeto. Não há, no Java, uma maneira de criarmos o que é 
conhecido como “objeto pilha” ou “objeto local”, pois todo objeto em Java, sem exceção, é 
acessado por uma variável referência, assim como Deitel (2008) trata em seu livro.
37UNIDADE I Programação Orientada a Objetos
5. MENSAGENS ENTRE OBJETOS
Agora	vamos	definir	outro	conceito	em	OO,	assim	como	menciona	Jacobi	(2006):	
mensagens entre objetos. Já aprendemos que um objeto pode possuir diversos métodos 
definidos	em	sua	classe.	Em	uma	aplicação	real	é	muito	comum	que	existam	diversos	tipos	
de	objetos	e	que	um	objeto	necessite	 realizar	uma	 tarefa	que	 já	está	definida	em	outro	
objeto, ou seja, numa aplicação poderá haver comunicação e interação entre objetos por 
meio de mensagens. Em outras palavras, um objeto X pode necessitar de um procedimento 
(método)	 já	definido	em	um	objeto	Y. Para realizar esse processo, o objeto X solicita ao 
objeto Y que execute o método, ou seja, uma mensagem nada mais é do que o fato de um 
objeto chamar um método de outro objeto (ou ainda um método estático de uma classe). 
Vamos tentar elucidar com um exemplo. Digamos que um objeto “gerente” precise 
enviar um e-mail. Ele não sabe como fazer isso, porém o objeto “email” sabe. Então, o 
objeto “gerente” solicita ao “email” que faça isso por ele. Em orientação a objetos, quando 
um objeto X solicita a um objeto Y que execute um de seus métodos, diz-se que o objeto 
X enviou uma mensagem ao objeto Y. Uma mensagem pode conter parâmetros que são 
valores enviados de um objeto a outro, quando um método for invocado. Observe a Figura 
29, em que o objeto “gerente” envia uma mensagem ao objeto “email” (invocando o método 
enviar). Serão enviados quatro parâmetros: de, para, assunto e mensagem. Esse padrão 
do	 envio	 de	mensagens	 é	 definido	 pela	UML	 e	 pode	 ser	 encontrado,	 por	 exemplo,	 em	
diagramas de comunicação e sequência.
38UNIDADE I Programação Orientada a Objetos
Figura 29. Mensagem do objeto gerente para o objeto email. Elaborado pelo autor.
O processo de comunicação entre os objetos “gerente” e “email” poderá ser assim 
descrito:
1. O objeto “gerente” solicita ao objeto “email” o envio de e-mail pelo método 
“enviar” contido em “email”, e fornece os parâmetros adequados;
2. O objeto “email” envia o e-mail usando os dados recebidos de “gerente”;
3. Nesse caso o objeto “email” não fornecerá nenhum retorno para o objeto 
“gerente” (veja a palavra void	 adicionada	 ao	 final	 da	 mensagem),	 mas	 isso	
poderia ser diferente e o objeto “email” poderia retornar uma mensagem, por 
exemplo, informando se houve sucesso ou não no envio.
5.1. Relação hierárquica entre chamadas de método 
Como você sabe, e tratado por Jacobi (2006), um método será invocado por uma 
chamada de método e quando o método chamado terminar sua tarefa, ele retornará o 
controle e possivelmente um resultado para o chamador. Uma analogia a essa estrutura de 
programa é a forma hierárquica de gerenciamento, ilustrado na Figura 30 e apresentado 
a seguir: Um chefe (o chamador) solicita que um trabalhador (o método chamado) realize 
uma tarefa e informe (retorne) os resultados depois de completar a tarefa. O método chefe 
não tem conhecimento sobre como o método trabalhador realiza suas tarefas designadas. 
O trabalhador também poderá chamar outros métodos trabalhadores, sem que o chefe 
saiba. Essa “ocultação” dos detalhes de implementação promove a boa engenharia de 
software. A Figura 30 mostra também o método chefe se comunicando com vários métodos 
trabalhadores de uma maneira hierárquica. O método chefe divide as responsabilidades 
entre os vários métodos trabalhadores. Aqui, trabalhador1 atuará como um “método chefe” 
para trabalhador4 e trabalhador5.
39UNIDADE I Programação Orientada a Objetos
Figura 30. Relacionamento hierárquico de método trabalhador / método chefe. Elaborado pelo autor.
 
 
REFLITA
A maior parte da criatividade é uma transição de um contexto para outro, onde as 
coisas são mais surpreendentes. Há um elemento de surpresa, e especialmen-
te na ciência, muitas vezes há risos que vão junto com o “Aha”. A arte também tem 
esse elemento. Nosso trabalho é nos lembrarmos de que existem mais contex-
tos do que aquele em que estamos - o que achamos ser realidade. (Alan Kay). 
 
Referência: https://citacoes.in/citacoes/1923990-alan-kay-our-job-is-to-remind-us-that-
-there-are-more-contex/
40UNIDADE I Programação Orientada a Objetos
SAIBA MAIS
QUALIFICAÇÃO DE SOFTWARES
Como	pode	ser	qualificado	um	software?	É	muito	simples	definir	isso	pelo	tempo	de	de-
senvolvimento ou pela excelência na programação. Existem casos de desenvolvimento 
de softwares em que o analista ouve todas as informações e apresenta uma solução, 
quase que “surreal”. Algo que poderá resolve perfeitamente o que foi solicitado. Olhando 
assim, a sensação que temos parece que o atendimento foi excepcional, contudo, na 
maioria das vezes, os programas feitos neste formato não atendem a real necessidade 
dos clientes.
Não devemos julgar o cliente por não apresentar de forma assertiva as suas necessida-
des.	E	a	consequência	disso	tudo	é	a	perda	de	investimento	financeiro	e	de	tempo	em	
um projeto que não vai atender as suas necessidades. Casos assim são muito comuns 
de acontecer, é muito provável que você já tenha vivenciado ou ouvido falar sobre isso.
Esse tipo de problema não é exclusivo do desenvolvimento de softwares, é algo que 
ocorre com frequência no mercado, em geral. Para provar isso, basta surgir a necessi-
dade de um serviço, em sua casa ou trabalho, em que não tenha nenhum conhecimento 
do	processo,	como	consertar	uma	porta,	uma	 janela	ou	uma	 infiltração	na	parede.	A	
solução	só	vem	quando	um	profissional	qualificado	está	mais	preocupado	em	satisfazer	
o	cliente	do	que	resolver	exclusivamente	o	problema	apresentado.	Os	profissionais	que	
mantêm esse tipo de procedimento de atendimento vão sendo substituídos aos poucos. 
Na rotina diária de um programador, normalmente, o início do projeto vem de um conver-
sa informal e só lá na primeira apresentação, depois de um grande tempo de dedicação, 
é que o cliente consegue esclarecer ainda de forma abstrata com frases como “não é 
bem isso que eu queria”. Outro caso comum que acontece, pela falta de alinhamento, 
são as solicitações do cliente, ir aumentando durante o processo de desenvolvimento 
e como nada está estabelecido de forma clara no início do trabalho, você poderá até 
prolongar o projeto, mas, possivelmente, não atenderá todas as necessidades do seu 
cliente.
Lembrando que cliente não tem obrigação de entender de programação e que a preo-
cupação deverá ser do programador, de atender o cliente e não o contrário. Um bom 
profissional	deve	fazer	uso	de	uma	excelente	interpretação	às	necessidades	do	cliente	
e oferecer não o que ele está pedindo, mas sim o que realmente vai suprir sua neces-
sidade.
(Fonte o autor)
41UNIDADE I Programação Orientada a Objetos
CONSIDERAÇÕES FINAIS
Nesta unidade, aprendemos que o Paradigma Orientado a Objeto (OO)nos propicia 
a elaboração de um código elegante dentro de um projeto de produção de software. Já o 
projeto	é	o	resultado	do	refinamento	da	análise	e	considerar	os	detalhes	da	implementação,	
tal como a linguagem de programação a ser utilizada, que poderá ser Java, CSharp, C++, 
Python, ASP.NET, dentro do contexto OO.
Juntos pudemos nos familiarizar com o conceito de Orientação a Objetos, que 
é um paradigma para o desenvolvimento de aplicações, ou seja, é uma estratégia de 
desenvolvimento de software que organiza o software como uma coleção de objetos, que 
contém tanto a estrutura dos dados como o comportamento deles.
Você	 pode	 verificar	 que	 os	 métodos	 coesos,	 dentro	 de	 um	 projeto	 orientado	 a	
objetos, devem fazer apenas uma coisa e fazê-la bem. Isto é, um método não deve executar 
duas ou mais tarefas, a menos que façam parte de uma mesma ação coesa. Outro princípio 
relativo	a	métodos	elegantes	que	você	pode	verificar	foi	que	um	método	não	privado	deverá	
manter um objeto em um estado bem formado.
Você	pode	 verificar	 as	 características	 dos	 principais	métodos	OO	e	 foi	 possível	
verificar	os	tipos	abstratos	de	dados,	os	dois	tipos	de	estruturas	que	permitem	guardar	uma	
coleção de elementos: Estrutura Estática e Estrutura Dinâmica. 
Você	pode	verificar	os	principais	métodos,	visualizar	as	suas	características	e	entrar	
em contato com os conceitos de OO, em que pode aprender sobre objetos, abstração, 
classes, operações, atributos, instância, dentre outros.
Por	fim,	você	pode	verificar	que	um	objeto	pode	possuir	diversos	métodos	definidos	
em sua classe. Em uma aplicação real é muito comum que existam diversos tipos de 
objetos	e	que	um	objeto	necessite	realizar	uma	tarefa	que	já	está	definida	em	outro	objeto,	
ou seja, numa aplicação poderá haver comunicação e interação entre objetos por meio de 
mensagens.
A partir dos conceitos que foram abordados nesta unidade, você pode ter uma 
visão geral sobre a Programação Orientada a Objetos. 
Estaremos juntos na próxima unidade.
Até lá!
42UNIDADE I Programação Orientada a Objetos
 
MATERIAL COMPLEMENTAR
LIVRO
•	Título: Java como Programar.
•	Autor: Paul Deitel e Harvey Deitel.
•	Editora: Pearson Education do Brasil Ltda.
•	 Sinopse:	 Java: como programar, 10ª edição, fornece uma 
introdução clara, simples, envolvente e divertida à programação 
Java com ênfase inicial em objetos. Destaques incluem: rica 
cobertura dos fundamentos com exemplos reais; apresentação 
com ênfase inicial em classes e objetos; uso com Java™ SE 
7, Java™ SE 8 ou ambos; Java™ SE 8 abordado em seções 
modulares	 opcionais;	 lambdas,	 fluxos	 e	 interfaces	 funcionais	
usando métodos padrão e estáticos do Java SE 8; Swing e GUI do 
JavaFX:	elementos	gráficos	e	multimídia;	conjunto	de	exercícios	
“”Fazendo a diferença””; tratamento de exceções integrado; 
arquivos,	 fluxos	 e	 serialização	 de	 objetos;	 concorrência	 para	
melhor desempenho com multiprocessamento; o livro contém 
o conteúdo principal para cursos introdutórios; outros tópicos: 
recursão,	pesquisa,	classificação,	coleções	genéricas,	estruturas	
de dados, multithreading, banco de dados (JDBC ™ e JPA).
 
FILME/VÍDEO
• Título: Curso de Java SE
• Ano: 2018
• Sinopse: Neste curso de Java avançado irá nos aprofundar em 
tópicos de programação que ajudam você a entender os conceitos 
mais avançados de Java.	 Isso	 significa	 que	 o	 programador	 já	
precisa ter conhecimentos prévios da linguagem Java, bem como 
dos seus recursos, lógica de programação, depuração de código, 
IDEs, dentre outros conceitos básicos de programação. Dentre 
os tópicos avançados que iremos cobrir neste curso, destacam-
se: Java Avançado; programação genérica, estruturas de dados 
sequenciais e associativas, estruturas de dados clássicos, 
classificação	e	pesquisa,	 tratamento	de	exceções,	 programação	
de GUI com acesso a rede usando Swing e uma visão geral de 
multithreading. Você também vai explorar os Applets Java, entrada 
e saída avançadas, strings mais avançadas, expressões regulares, 
gráficos	 Java,	manipulação	 de	 arquivos	 e,	 finalmente,	 fechando	
com um olhar mais crítico e profundo sobre a IDE Eclipse.
• Link do vídeo:
https://www.devmedia.com.br/curso/curso-java-se/423
https://www.devmedia.com.br/curso/curso-java-se/423
43
Plano de Estudo:
1. USO DA PALAVRA RESERVADA this 
2. CONSTRUTORES
3. VISÃO GERAL DOS OPERADORES 
4. INSTRUÇÕES DE REPETIÇÕES 
5. CONSIDERAÇÕES FINAIS
6. REFERÊNCIAS 
Objetivos de Aprendizagem:
●	 Conceituar e contextualizar a importância da utilização da palavra reservada this.
●	 Compreender os tipos de construtores e sua utilização.
●	 Apresentar uma visão geral dos operadores.
●	 Estabelecer a importância das instruções de repetições. 
UNIDADE II
Trabalhando com os Métodos e suas 
Referências 
Professor Mestre Ricardo Vieira
44UNIDADE II Trabalhando com os Métodos e suas Referências
INTRODUÇÃO
Caro (a) aluno (a), iniciaremos a segunda unidade do livro Programação Orientado 
a Objetos. Nesta unidade iremos nos aprofundar mais ainda sobre os conceitos OO e 
v. poderá estudar o uso da palavra reservada this. Poderá também ver como a palavra 
reservada this será usada para a autorreferência, com atributos e métodos estáticos.
Na sequência, será apresentado, os tipos de construtores e sua utilização. Será 
possível ver que o método construtor será responsável por alocar espaço na memória para 
a manipulação do objeto e poderá conter também a chamada para outros métodos. Será 
apresentado o construtor default e as regras para se escrever um método construtor.
Em seguida, será apresentada uma visão geral dos operadores e suas estruturas. 
Você	 verá	 que	 para	 tratar	 situações	 em	 que	 o	 fluxo	 de	 execução	 do	 programa	 deverá	
ser alterado, Java fornecerá um amplo conjunto de estruturas condicionais, de exceção 
e repetição. Você poderá estudar as estruturas condicionais usados em Programação 
Orientada a Objetos, que são if-else e switch-case. Essas duas estruturas de desvio 
existentes na linguagem possibilitam executar diferentes trechos de um programa com 
base em certas condições.
Nesta unidade, também será apresentado os conceitos a respeito das instruções 
de repetições. Também chamados de looping, formam uma importante estrutura nas 
linguagens de programação por possibilitarem a repetição da execução de um bloco de 
instruções em um programa. 
Tenha um bom aprendizado e um excelente aproveitamento.
Então vamos lá! 
Bons estudos!
45UNIDADE II Trabalhando com os Métodos e suas Referências
1. USO DA PALAVRA RESERVADA this
Segundo Goodrich (2013), o this é uma palavra reservada que é usada para a 
autorreferência. Esta situação ocorrerá quando quisermos referenciar a métodos e atributos 
da própria classe e objeto. Embora seja possível usar o this com atributos e métodos 
estáticos,	será	mais	usual	utilizá-lo	com	membros	de	instância.	Mais	especificamente	ainda,	
com atributos. 
O não uso em membros estáticos será simples: estes já pertencem à classe e só 
existirá uma versão deles. Já com atributos de instância, cada objeto, guardará seu próprio 
estado neles, e o uso do this poderá ajudar a diferenciar, por exemplos, parâmetros que 
possam vir a ter o mesmo nome dos atributos.
1.1. Referenciando Membros Do Objeto Atual Com A Referência this
Cada objeto poderá acessar uma referência a si própria, com a palavra chave this 
(às vezes chamada de referência this). Quando um método de instância for chamado para 
um objeto particular, o corpo do método utilizará implicitamente a palavra-chave this para 
referenciar as variáveis de instância do objeto e outros métodos. Isso permite que o código 
da classe saiba qual objeto deve ser manipulado. Você também poderá usar a palavra 
chave this explicitamente no corpo do método de uma instância, assim trata Deitel (2017).
46UNIDADE II Trabalhando com os Métodos e suas Referências
Agora demonstraremos o uso implícito e explícito da referência this(Figura 31). 
Esse exemplo é o primeiro em que declaramos duas classes em um único arquivo, a classe 
ThisTest é declarada nas linhas 2 a 9 e a classe SimpleTime, nas linhas 12 a 45. Isso 
foi feito para demonstrar que, quando você compilar um arquivo .java que contenha mais 
de uma classe, o compilador produzirá um arquivo separado da classe com a extensão 
.class para cada classe compilada. Nesse caso, dois arquivos separados serão produzidos: 
SimpleTime.class e ThisTest.class. Quando um arquivo de código-fonte (.java) contiver 
múltiplas declarações de classe, o compilador irá inserir ambos os arquivos de classe para 
essas classes no mesmo diretório. 
Observe também na Figura 31, que só a classe ThisTest é declarada public. Um 
arquivo de código-fonte pode conter somente uma classe public, caso contrário, um erro de 
compilação ocorrerá. As classes não public só poderão ser utilizadas por outras classes no 
mesmo pacote. Assim, nesse exemplo, a classe SimpleTime só pode ser usada pela classe 
ThisTest.
A classe SimpleTime (linhas 12 a 45) declara três variáveis de instância private: 
hour, minute e second (linhas 14 a 16). O construtor da classe (linha 21 a 26) recebe três 
argumentos int para inicializar um objeto SimpleTime. Mais uma vez, utilizamos nomes 
de parâmetro para o construtor (linha 21) que são idênticos aos nomes das variáveis de 
instância da classe (linhas 14 a 18). Assim, usamos a referência this para nos referirmos às 
variáveis de instância nas linhas 23 a 25.
O método buildString (linhas 29 a 34) retorna uma String criada por uma instrução 
que utiliza a referência this explícita e implicitamente. A linha 34 usa-a explicitamente 
para chamar o método toUniversalString. A linha 32 utiliza-a implicitamente para chamar 
o mesmo método. Ambas as linhas realizam a mesma tarefa. Em geral, você não utilizará 
this explicitamente para referenciar outros métodos dentro do objeto atual. Além disso, a 
linha 44 no método toUniversalString utiliza explicitamente a referência this para acessar 
cada variável de instância. Isso não é necessário aqui, porque o método não tem variáveis 
locais que sombreiam as variáveis de instância da classe.
O método main (linhas 4 a 8) da classe ThisTest demonstra a classe SimpleTime. A 
linha 6 cria uma instância da classe SimpleTime e invoca seu construtor. A linha 7 invoca o 
método buildString do objeto e então exibe os resultados.
47UNIDADE II Trabalhando com os Métodos e suas Referências
Figura 31. Exemplo de this utilizado implícita e explicitamente como uma referência a 
membros de um objeto. Elaborado pelo autor.
48UNIDADE II Trabalhando com os Métodos e suas Referências
2. CONSTRUTORES
O operador new é o responsável pelo processo de instanciação do objeto, 
representando uma forma extremamente simples de atribuir valores default a um objeto. 
Como o próprio nome diz, o método construtor é o responsável por construir um objeto com 
determinados valores. 
O método construtor será responsável por alocar espaço na memória para 
a manipulação do objeto e poderá conter também a chamada para outros métodos, 
possibilitando	a	criação	de	objetos	mais	complexos.	Na	criação	de	janelas	gráficas	(frames), 
por	exemplo,	o	método	construtor	pode	definir	 todas	as	propriedades	dos	componentes	
visuais do frame (cor do formulário, tamanho dos botões etc.), conforme descreve Furgeri 
(2015).
2.1. Construtor default
“Se um construtor não for declarado, será assumido um construtor default da 
linguagem Java, em que as variáveis serão inicializadas com os conteúdos 
default (variáveis numéricas recebem zero, valores lógicos recebem false e 
objetos recebem null). Quando declarado, ele deverá possuir, obrigatoria-
mente, sempre o mesmo nome (idêntico) da classe em que se está locali-
zado. Dependendo das necessidades, uma classe pode conter de zero a N 
construtores declarados.” (Furgeri, 2015 p. 115)
Toda a classe Java deverá ter um construtor. Quando não declaramos o construtor, 
default será inicializado automaticamente pelo Java. Mas existem casos que se faz 
49UNIDADE II Trabalhando com os Métodos e suas Referências
necessário à declaração explícita dos construtores. O Construtor não poderá ser herdado. 
Para chamá-lo a partir de uma subclasse usamos a referência super. 
Para escrever um construtor, devemos seguir algumas regras: 
1. O nome do construtor precisa ser igual ao nome da classe; 
2. Não deve ter tipo de retorno;
3. Podemos escrever vários construtores para mesma classe. 
 
Esta sintaxe pode ser vista na Figura 32 e um exemplo dessa declaração na Figura 
33.
Figura 32. Representação da sintaxe de um construtor. Elaborado pelo autor.
Figura 33. Exemplo de sintaxe de um construtor na classe Mamifero. Elaborado pelo autor.
2.2. Chamando Outro Construtor
Um construtor só poderá ser executado durante a construção do objeto, depois 
disso, você não conseguirá chamar o construtor em um objeto já tenha sido construído. 
Porém,	para	você	não	ter	que	ficar	copiando	e	colando,	você	poderá	fazer	um	construtor	
chamar outro construtor, durante a construção de um objeto. Essa técnica é apresentada 
por Silveira (2006) e poderá ser vista na Figura 34.
50UNIDADE II Trabalhando com os Métodos e suas Referências
Figura 34. Exemplo de chamada de outro construtor. Elaborado pelo autor.
Ainda seguindo a técnica de Silveira (2006), existe outro motivo para a utilização 
desta técnica, a facilidade para sua implementação. Poderemos criar um construtor que 
receberá diversos argumentos para que o usuário de uma classe não seja obrigado a 
chamar diversos métodos do tipo set().
Quando implementamos uma classe com todos os seus atributos privados, seus 
métodos getters() e setters() e um construtor default (vazio), na verdade nós estaremos 
criando um Java Bean, que não deverá ser confundido com o EJB, que é Enterprise Java 
Beans. Para saber mais acesse: http://java.sun.com/products/javabeans/
51UNIDADE II Trabalhando com os Métodos e suas Referências
3. VISÃO GERAL DOS OPERADORES 
Dentro de um método, a execução prosseguirá na sequência em que as instruções 
ocorrerem. Em outras palavras, a execução se dará, a partir do cabeçalho do método para 
a próxima, de cima para baixo. No entanto, as regras de negócios nos exibem alterar esse 
fluxo	para	contemplar	condições	diferentes.	Essas	situações	são	extremamente	comuns	
em programação. Por exemplo: um site poderá pedir uma senha e seu código não deverá 
dar acesso a ele, se a senha for inválida. Logo, o código que dará acesso não deverá ser 
executado, se uma senha inválida for inserida. Se uma senha inválida for inserida, você 
poderá dar ao usuário mais duas (e somente duas) oportunidades de inseri-la corretamente. 
Para	tratar	situações	em	que	o	fluxo	de	execução	do	programa	deverá	ser	alterado,	Java 
fornecerá um amplo conjunto de estruturas condicionais, de exceção e repetição. 
3.1. Estruturas Condicionais 
Schildt (2013) trata sobre as estruturas condicionais existem em todas as linguagens 
de programação e descreve como elas possibilitam que a execução de um programa, seja 
desviada de acordo com certas condições. Os comandos condicionais ou ainda instruções 
condicionais, usados em Java, são if-else e switch-case. Essas duas estruturas de desvio 
existentes na linguagem possibilitam executar diferentes trechos de um programa com 
base em certas condições.
52UNIDADE II Trabalhando com os Métodos e suas Referências
3.1.1. A Estrutura if-else 
Schildt (2013) ainda trata sobre o if, em conjunto com o else, formando uma 
estrutura que permite a seleção entre dois caminhos distintos para execução, dependendo 
do resultado (verdadeiro ou falso) de uma expressão lógica (condição). Nesse tipo de 
estrutura, se a condição for verdadeira, serão executadas as instruções que estiverem 
posicionadas entre as instruções if/else. Sendo a condição falsa, serão executadas as 
instruções que estiverem após a instruçãoelse. A sintaxe para a utilização do conjunto if 
else será demonstrada em seguida. Observe, na Figura 35, que a condição sempre deverá 
aparecer entre parênteses, item obrigatório na linguagem Java.
Figura 35. Exemplo de sintaxe para a utilização do conjunto if else. Elaborado pelo autor.
A	Figura	36	traz	uma	representação	gráfica	para	ajudá-lo		a	entender	o	funcionamento	
dessa estrutura. Cada losango poderá ser considerado uma instrução if que contém uma 
expressão lógica (condição). Veja que dependendo do resultado da condição (verdadeira 
ou falsa) será executado um bloco diferente (1 ou 2) de instruções. É importante entender 
também que toda estrutura if	possui	um	início	e	um	final,	nos	quais	os	dois	caminhos	se	
encerram.
Figura	36.	Representação	gráfica	da	instrução	if else.(FURGERI, 2015, p.43).
53UNIDADE II Trabalhando com os Métodos e suas Referências
“Assim como a maioria das instruções em Java, o conjunto if-else deverá ser 
utilizado com minúsculas e, caso haja apenas uma instrução a ser executada, 
tanto no if como no else, o uso das chaves será desnecessário. Lembre-se 
de que as chaves serão utilizadas quando um bloco de instruções precisa ser 
executado, isto é, mais do que uma instrução. A estrutura if-else apresentada 
não é a única válida, pois existem outras maneiras diferentes de se criar essa 
estrutura: if sem o else, if com o else e if com o else aninhado.” (FURGERI, 
2015, p.43).
Compare	as	representações	gráficas	dessas	variações	nas	Figuras	37,	38	e	39.
Figura	37.	Representação	gráfica	da	instrução	if sem else. (FURGERI, 2015, p.43).
Figura	38.	Representação	gráfica	da	instrução	if com else. (FURGERI, 2015, p.44).
54UNIDADE II Trabalhando com os Métodos e suas Referências
Figura	39.	Representação	gráfica	da	instrução	if com else aninhado. (FURGERI, 2015, 44).
No primeiro caso é executado um bloco de instruções somente se a condição for 
verdadeira; no segundo caso será executado um bloco de instruções para a condição 
verdadeira e outro para a falsa. Já no terceiro caso, quando encontrada a primeira condição 
verdadeira todas as outras serão desconsideradas. Seja o caminho que for apenas um 
bloco de instruções será executado. O terceiro caso demonstra que para cada condição 
falsa, será executada outra condição, mas poderia ser representado ao contrário, ou seja, 
a condição verdadeira poderia levar à execução de outra condição.
3.1.2. Estrutura 1: if Sem else 
O Exemplo apresentado na Figura 40, mostra um uso prático do if sem a presença 
do else. Trata-se de uma classe em que o usuário seleciona uma opção (Masculino ou 
Feminino) e a partir disso será usada a instrução if para executar instruções diferentes. 
55UNIDADE II Trabalhando com os Métodos e suas Referências
Figura 40. Exemplo da listagem da classe if. Elaborado pelo autor.
Figura 41. Tela de execução da Figura 40 com seleção de Feminino. (FURGERI, 2015, 46).
O Exemplo da Figura 42, mostra um uso prático do if-else para validar a entrada do 
usuário.	Serão	realizadas	três	validações:	em	primeiro	lugar,	verifica	se	o	usuário	realmente	
entrou	com	um	valor	na	caixa	de	diálogo,	depois	verifica	se	o	valor	digitado	é	numérico,	logo	
a	seguir	verifica	se	esse	valor	está	entre	1	e	12	(a	faixa	de	valores	possíveis,	uma	vez	que	
um mês deverá assumir apenas valores entre 1 e 12).
Figura 42. Listagem da classe IfComElse. Elaborado pelo autor.
56UNIDADE II Trabalhando com os Métodos e suas Referências
Figura 43. Tela de execução da Figura 42 com seleção do mês 5. (FURGERI, 2015, 47).
O Exemplo 44, mostra como é possível criar uma estrutura em que cada instrução 
else realiza a abertura de um novo if. Ao analisar essa estrutura, podemos notar que existe 
um (ou mais) if dentro de um else.
Figura 44. Listagem da classe IfComElseAninhado. Elaborado pelo autor.
3.1.3. Estrutura switch-case
“A estrutura switch-case se refere à outra modalidade de desvio da execução do 
programa de acordo com certas condições, semelhante ao uso da instrução if. Ao trabalhar 
com uma grande quantidade de desvios condicionais contendo instruções if, pode-se 
comprometer	 a	 inteligibilidade	 do	 programa,	 dificultando	 sua	 interpretação.	 A	 estrutura	
switch-case	 possibilita	uma	 forma	mais	adequada	e	eficiente	de	atender	a	esse	 tipo	de	
situação, constituindo-se uma estrutura de controle com múltipla escolha.” (FURGERI, 
2015, 48).
57UNIDADE II Trabalhando com os Métodos e suas Referências
A estrutura switch-case equivale a um conjunto de instruções if encadeadas, 
fornecendo maior inteligibilidade. Sua sintaxe é a apresentada na Figura 45.
Figura 45. Exemplo de sintaxe da estrutura switch-case. Elaborado pelo autor.
Na primeira linha do switch é avaliado o resultado da expressão, que é comparado 
nas diretivas case, executando o bloco de instruções quando a expressão coincidir com 
o valor colocado ao lado direito do case. Em outras palavras, supondo que o valor da 
expressão seja igual a 2, serão executadas as instruções localizadas entre case 2: e break. 
A cada case o programa compara o valor da expressão com o valor colocado no case. Caso 
os valores sejam iguais, todas as instruções serão executadas até que se encontre uma 
instrução break, que encerra o switch e faz a execução do programa desviar para o ponto 
após a chave de encerramento do switch. O programa percorre todas as diretivas case 
até que uma delas seja igual à expressão inserida no switch. Caso nenhuma diretiva case 
possua o valor correspondente da expressão, serão executadas as instruções localizadas 
na diretiva default	que	será	opcional.	Veja	a	representação	gráfica	da	estrutura	do	switch-
case na Figura 46.
Figura	46.	Representação	gráfica	da	estrutura switch-case. (FURGERI, 2015, p.49).
58UNIDADE II Trabalhando com os Métodos e suas Referências
O Exemplo da Figura 47, demonstra de forma clara a utilização da estrutura switch-
case, simulando os meses do ano, em que o usuário entra com um número e o programa 
retorna o mês correspondente por extenso.
Figura 47. Listagem da classe SwitchCase. Elaborado pelo autor.
Figura 48. Tela de execução da Figura 47 com seleção do mês 2. (FURGERI, 2015, p.50).
59UNIDADE II Trabalhando com os Métodos e suas Referências
4. INSTRUÇÕES DE REPETIÇÕES 
“Os laços de repetição (looping) formam uma importante estrutura nas lin-
guagens de programação por possibilitarem a repetição da execução de um 
bloco de instruções em um programa. Eles determinam que um certo bloco 
seja	executado	repetidamente	até	que	uma	condição	específica	ocorra.	A	re-
petição é uma das estruturas mais usadas em programação, possibilitando a 
criação	de	contadores,	temporizado-	res,	rotinas	para	classificação,	obtenção	
e recuperação de dados. A criação de laços de repetição em Java é feita a 
partir das estruturas for, while e do-while” (FURGERI, 2015, p.56). 
4.1. Instrução De Repetição While
Tucker	(2009)	trata	uma	instrução	de	repetição	como	uma	especificação	que	um	
programa deverá repetir uma ação enquanto alguma condição permanecer verdadeira. 
A instrução de pseudocódigo descreve a repetição durante uma viagem de compras. A 
condição “enquanto houver mais itens em minha lista de compras” poderá ser verdadeira ou 
falsa. Se ela for verdadeira, então a ação “Compre o próximo item e risque-o de minha lista” 
será realizada. Essa ação será realizada repetidamente, enquanto a condição permanecer 
verdadeira. 
A(s) instrução (ões) contida(s) na trecho de código de repetição While constitui 
(em)	seu	corpo,	que	poderá	ser	uma	instrução	única	ou	um	bloco.	Por	fim,	a	condição	se	
tornará falsa, quando o último item da lista de compras tiver sido comprado e removido. 
Neste ponto, a repetição termina e a primeira instrução depois da instrução de repetição 
será executada, conforme trata Deitel (2013).
60UNIDADE II Trabalhando com os Métodos e suas Referências
Figura 49. Sintaxe da instrução de repetição While. Elaborado pelo autor.
● Condição: poderá

Continue navegando