Buscar

23 - Programação Orientada a Objetos - SAGAH

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 255 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 255 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 255 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

Programação orientada a objetos: 
modelagem de problemas
APRESENTAÇÃO
O paradigma de programação orientada a objetos foi originalmente criado por Alan Kay, autor 
da linguagem de programação Smalltalk. Embora seja um paradigma de programação mais novo 
no que diz respeito ao seu emprego pelas linguagens de programação, algumas delas já haviam 
implementado as suas ideias, sendo a Simula 67, criada em 1967, a primeira linguagem a 
realmente utilizar a programação orientada a objetos. 
A programação orientada a objetos trouxe uma nova maneira de se pensar projetos de softwares, 
sendo que sua aplicação deixa bem clara as etapas de análise, projeto e codificação de softwares. 
Seu conceito básico está em abstrair que tudo pode ser classificado como um objeto, cada objeto 
implementando atributos e métodos e se relacionando a outros objetos, daí advém seu nome 
“programa orientado aos objetos”. Conhecer e entender esse paradigma de programação é 
fundamental, já que, atualmente, ele é implementado por muitas linguagens.
Nesta Unidade de Aprendizagem, você vai entender o que é programação orientada a objetos, 
bem como vai conhecer algumas linguagens que o implementam e como são aplicados os seus 
conceitos.
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Definir programação orientada a objetos.•
Identificar as linguagens orientadas a objetos.•
Aplicar a programação orientada a objetos.•
DESAFIO
O principal conceito da programação orientada a objetos é que todo programa é uma coleção de 
objetos que se relacionam e apresentam comportamentos e atributos únicos. 
1
Uma empresa contratou você para desenvolver um programa simples em uma linguagem 
orientada a objetos. O escopo desse programa é controlar os pedidos feitos em uma lanchonete. 
A seguir, no Desafio, veja como os pedidos são feitos atualmente e como eles deverão ser 
realizados após o desenvolvimento do programa:
Com base nos requisitos que você viu, elabore uma descrição das possíveis classes, métodos e 
2
atributos que seu programa deve apresentar para contemplar o escopo desse cenário. Agora, os 
atributos e os métodos não precisam ser definidos, apenas identificados.
INFOGRÁFICO
A programação orientada a objetos contém alguns conceitos considerados pilares desse 
paradigma. Para que uma linguagem de programação realmente seja considerada orientada a 
objetos é necessário que ela implemente os pilares abstração, encapsulamento, herança e 
polimorfismo.
A seguir, no Infográfico, veja o significado de cada um desses conceitos e o porquê de sua 
relevância para a programação:
3
4
CONTEÚDO DO LIVRO
O paradigma de orientação a objetos é amplamente implementado pelas linguagens de 
programação existentes. A programação orientada a objetos permite que o desenvolvimento de 
um programa resulte de uma organização do contexto a que se propõe, implementando seu 
universo como uma coleção de objetos que se relacionam e de que se abstraem características e 
métodos únicos.
Leia o capítulo Programação orientada a objetos: modelagem de problemas, da obra 
Paradigmas de programação, e veja como as linguagens de ampla adoção implementam esse 
paradigma e, ainda, confira alguns exemplos de implementação de código em linguagem 
orientada a objetos.
Boa leitura.
5
Programação orientada 
a objetos: modelagem 
de problemas
Objetivos de aprendizagem
Ao final deste texto, você deverá apresentar os seguintes aprendizados:
 � Definir programação orientada a objetos.
 � Identificar as linguagens orientadas a objetos.
 � Aplicar a programação orientada a objetos.
Introdução
A programação orientada a objetos (POO) surgiu como um paradigma 
que apresentava uma disciplina para novos projetos de desenvolvimento 
de software. Etapas com análise e projeto de software que, em outros 
paradigmas, acabavam sendo minimizados na POO, se tornam requisitos 
fundamentais.
Não é difícil imaginar que a POO acabou se tornando um padrão con-
sumido pela engenharia de software e que possibilitou avanços significati-
vos na programação de computadores. Seu uso permitiu que reutilização 
de código se tornasse algo praticamente comum em desenvolvimento 
de software, servindo como base para novos conceitos, como os serviços. 
Neste capítulo, você entenderá o conceito de POO, conhecerá al-
gumas linguagens que implementam esse paradigma e exemplos de 
aplicação em projetos de programas de computador.
6
Programação orientada a objetos
O conceito de POO tem suas raízes na linguagem de programação Simula 67, 
criada por Alan Kay, o precursor dos conceitos desse paradigma de programa-
ção. Contudo, sua grande evolução foi totalmente alcançada com a chegada 
da linguagem de programação Smalltalk 80: 
De fato, algumas pessoas consideram Smalltalk o modelo base para uma 
linguagem de programação puramente orientada a objetos. Uma linguagem 
orientada a objetos deve fornecer suporte para três recursos chave de lingua-
gem: tipos de dados abstratos, herança e vinculação dinâmica de chamadas 
a métodos (SEBESTA, 2018, p. 547).
Linguagens que suportam a POO são, atualmente, muito usadas. Algumas 
das linguagens de programação mais novas, projetadas para a POO, não 
implementam mais conceitos de linguagens procedurais como as primei-
ras implementavam. Porém, ainda assim, empregam estruturas básicas da 
programação estruturada e são imperativas, como as linguagens Java e C#, 
atualmente muito utilizadas e consideradas exemplos de sucesso de POO.
Smalltalk 80 foi primeira linguagem a implementar completamente os 
conceitos da POO, pois, em 1980, mesmo com a evolução dos módulos e pacotes 
pelas linguagens de programação da época, os problemas ainda persistiam. Um 
dos maiores problemas com os recursos atuais era que não existia mecanismo 
para inicialização e finalização automática do tipo fornecido. Segundo Tucker 
e Noonan (2009, p. 307) “As inicializações normalmente necessárias incluem 
abertura de um arquivo, alocação de memória e inicialização de variáveis locais 
ao módulo”. Já quanto às finalizações, incluem o fechamento de arquivos e 
a liberação de memória.
Além disso, alguns programadores e projetistas começaram a perceber 
que algumas necessidades não eram atendidas com as atuais linguagens de 
programação imperativa de decomposição funcional e abstração de dados, 
como os padrões de graphical user interfaces (GUI), que poderiam ser melhor 
implementadas com o conceito de objetos que pudessem trocar mensagens 
uns com os outros. Uma GUI poderia ser mais facilmente implementada se 
considerarmos, por exemplo, que seus componentes (botões, áreas de texto, 
imagens etc.) são tratados como objetos que podem interagir entre si e com 
o usuário do sistema.
Programação orientada a objetos: modelagem de problemas
7
Assim, a POO surge como um paradigma centrado no desenvolvimento 
de objetos, no lugar da atual decomposição funcional e abstração de dados. 
Na Figura 1, você pode perceber um pouco dessa diferença entre a atual 
programação estruturada e o conceito de objetos.
Figura 1. Comparativo entre programação estruturada e objetos.
Fonte: Adaptada de Gasparotto (2014).
...
...
...
...
...
Dados
globais
Programação estruturada
Procedimento
Procedimento
Procedimento
Procedimento
Procedimento
Dados objeto
Dados objeto
Dados objeto
POO
Método
Método
Método
Método
Método
Método
Em uma linguagem de POO, o encapsulamento dos tipos de dados e suas 
funções é alcançado por meio da implementação das classes. Uma classe é 
uma declaração de um tipo de objeto que encapsula os seus tipos de dados 
pelos seus atributos e funções por meio de seus métodos. É comum ouvir falar 
que uma classe serve como uma matriz de objetos, pois, ao determinar os seus 
atributos e métodos, serve como um modelo para que diversas instâncias de 
um objeto sejam criadas a partir de sua estrutura.
Ao analisar a Figura 1, você pode perceber que um programa em progra-
mação estruturalpossui um desempenho melhor que um mesmo programa 
em POO, e isso ocorre pelo fato de, na programação estruturada, um código 
ser executado após o outro sequencialmente, ao passo que na POO são ne-
cessários alguns desvios. Entretanto, a POO traz outros pontos que acabam 
sendo mais interessantes no contexto de aplicações modernas. Como, na 
maioria das aplicações, o desempenho das aplicações não é uma das grandes 
preocupações (devido ao poder de processamento dos computadores atuais), 
a POO se tornou muito difundida. 
Programação orientada a objetos: modelagem de problemas
8
Na próxima seção, vamos abordar como as linguagens Java, C# e Python 
implementam os conceitos da POO. Essas linguagens serão exemplos por serem 
muito utilizadas atualmente no contexto de desenvolvimento de software.
Linguagens orientadas a objetos
Agora, você entenderá um pouco sobre as linguagens Java, C# e Python, 
atualmente muito utilizadas e que implementam os conceitos da POO.
Java é uma linguagem de programação que foi desenvolvida pela Sun 
Microsystems no início da década de 1990. Ela se tornou um símbolo da POO, 
inclusive causando certa confusão, por julgarem que a POO era um paradigma 
de Java e não ao contrário (MACHADO; FRANCO; BERTAGNOLLI, 2016, 
p. 54).
De fato, a característica mais marcante da linguagem de programação
Java está relacionada a sua portabilidade, pois os sistemas construídos não 
são compilados em código nativo da plataforma. Programas em Java são 
compilados para um bytecode, que é executado por uma máquina virtual, a 
Java virtual machine, que permite que os programas escritos em Java possam 
ser rodados em qualquer plataforma compatível com a sua máquina virtual.
Em Java, todo o programa usa classes e objetos, e é fundamental que o 
programador compreenda esses conceitos da POO para conseguir programar 
em Java. Os programas são escritos em pequenos pedaços separados, chamados 
de objetos. Segundo Machado, Franco e Bertagnolli (2016, p. 78), “Objetos 
são pequenos programas que guardam dentro de si os dados — em suma, as 
variáveis — que precisam para executar suas tarefas”. Os objetos também 
trazem em si, como sub-rotinas, as instruções para processar esses dados. 
As variáveis que um objeto guarda são chamadas de atributos, e as suas sub-
-rotinas são chamadas de métodos.
Programação orientada a objetos: modelagem de problemas
9
Veja o exemplo de uma classe Cachorro em Java com os atributos nome, 
peso, altura e cor e o método pular().
public class Cachorro{
public String nome;
public float peso;
public float altura;
public String cor;
void pular{
 if(altura>=80){
System.out.println("Seu Cachorro pula alto");
 }
 }
}
Como você pode observar, a programação em Java é praticamente regrada 
pelos conceitos de POO, e as classes são a base de qualquer código Java. 
Qualquer análise para um novo programa em Java deve partir do entendimento 
do seu contexto e projeção das classes.
Agora, vamos analisar a linguagem C#. A linguagem C# (lê-se C Sharp) 
é definida pela Microsoft, que a desenvolve como uma linguagem de POO 
que faz parte de sua plataforma de desenvolvimento .NET. Embora a lingua-
gem C# tenha sido criada totalmente do zero pela Microsoft, foi baseada na 
linguagem C++, e possui muitos elementos das linguagens Java e Pascal. 
A plataforma .NET na qual teve seu desenvolvimento inicial, apresentou 
algumas limitações que motivaram que, em 1999, fosse montada uma força 
tarefa para o desenvolvimento de uma nova linguagem para essa plataforma.
Segundo Ledur (2018, p. 108):
A criação da linguagem C# ajudou muito no desenvolvimento do .NET, pois 
a plataforma não precisou se adequar a nenhum código de alguma linguagem 
já existente. O C# foi criado especificamente para .NET, sendo que muitas 
outras linguagens têm suporte à C#.
Programação orientada a objetos: modelagem de problemas
10
Os principais objetivos do projeto da linguagem C# são:
 � Ser simples moderna e de propósito geral OO.
 � Ter uma linguagem e suas implementações que forneçam suporte para
princípios de engenharia de software.
 � Ser destinada à utilização no desenvolvimento de componentes de
software.
 � Possibilitar a portabilidade dos programas escritos em C#, assim como 
é possível na linguagem Java.
 � Fornecer suporte para a escrita de programa, tanto hospedados local-
mente como incorporados.
A Figura 2 mostra um exemplo da estrutura de uma classe em C#.
Figura 2. Exemplo da estrutura de uma classe em C#.
Fonte: Rodrigues (2017, documento on-line).
Você pode perceber que, assim como em Java, C# possui uma estrutura 
semelhante com a declaração dos atributos da classe logo no início e depois em 
seus métodos, além de uma semelhança na sintaxe entre as duas linguagens, 
o que é explicado devido ao embasamento do C# na linguagem Java.
Programação orientada a objetos: modelagem de problemas
11
Para finalizar esta seção, vamos abordar a POO na linguagem de progra-
mação Python, que é uma linguagem de programação bastante utilizada por 
sua facilidade de aprendizado, aliada as suas características de programação 
de alto nível, de script, imperativa, OO e interpretada. 
Python é uma linguagem que permite o desenvolvimento tanto no conceito 
de programação estruturada como a POO. Possui suporte a tipificação dinâ-
mica, recursos de gerenciamento de uso de memória, além de oferecer uma 
abrangente biblioteca padrão. Os interpretadores Python possuem suporte 
para diversos sistemas operacionais, possibilitando a adaptação dos sistemas 
construídos.
A origem do nome Python, apesar de confundido com o animal cobra, 
na realidade é oriunda do grupo de comédia britânico que era assistido pelo 
criador da linguagem, chamado Monty Python, formado por Graham Cha-
pman, John Cleese, Eric Idle, Michael Palin, Terry Jones e Terry Gilliam. 
Carinhosamente, são chamados de Pythonistas os programadores Python, 
e as referências aos trabalhos do grupo de comédia estão espalhadas pelos 
tutoriais e sua documentação (LUTZ; ASCHER, 2007).
Python é uma linguagem muito simples, fácil de usar e aprender, apesar 
disso, também é uma linguagem extremamente robusta e utilizada nas mais 
diversas soluções:
 � back-end de sistemas Web, customer relationship management (CRM),
ou gerenciamento de relacionamento com o cliente;
 � pesadas simulações de engenharia;
 � processamento pesado de efeitos especiais de filmes;
 � soluções de análise de dados (data analytics);
 � aprendizado de máquina, do inglês machine learning (ML).
Veja o exemplo de uma classe Pessoa em Python.
class Pessoa:
 def _ init _ (self, nome, idade):
self.nome = nome
self.idade = idade
 def setNome(self, nome):
self.nome = nome
Programação orientada a objetos: modelagem de problemas
12
 def setIdade(self, idade):
self.idade = idade
 def getNome(self):
return self.nome
 def getIdade(self):
return self.idade
Apesar da sintaxe do Python ser um pouco diferente da sintaxe de Java e 
C#, é possível verificar a estrutura da classe com a definição de atributos e 
métodos e que Python é outro exemplar de linguagem OO. Na próxima seção, 
você verá alguns exemplos da aplicação da programação OO em classes de 
exemplos, para fixar o entendimento.
Desenvolvendo com programação 
orientada a objetos
Para ajudar a elucidar o conceito de POO, vamos começar analisando a se-
guinte situação: um exemplo em Java que demonstra a criação da classe 
Pessoa com os atributos nome, dataNascimento e CPF; e o método
tirarCopias, que calcula o custo da geração de cópias em um sistema de
gestão de impressões de uma escola. Esse sistema deve calcular o valor da 
cópia embasado na seguinte regra:
 � para alunos da escola, o valor unitário da cópia será de R$ 0,07;
 � para os demais usuários, o valor unitário será de R$ 0,10.
A diferença é que este requisito será implementado com os seguintes 
conceitos da POO:
 � classes;
 � heranças.
Programação orientada a objetos: modelagem de problemas
13
Observe na Figura 3, ondeconsta a classe Pessoa.
Figura 3. Classe Pessoa em Java.
Fonte: Geovane (2012, documento on-line).
Na classe Pessoa podemos observar os seguintes atributos:
 � nome;
 � cpf;
 � data_nascimento.
Observamos, também, que essa classe possui o método tirarCopias,
que faz o cálculo do valor da cópia para pessoas em geral, ou seja, pessoas 
que não são alunos. Porém, você pode estar se perguntando, onde estão os 
dados do aluno e o método que faz o cálculo do valor da cópia quando se 
trata de um aluno? 
Esses dados estão na classe Aluno, mas, como o Aluno também é uma
pessoa e tem alguns atributos que são comuns as demais pessoas, não vamos 
repetir na classe Aluno. A Figura 4 mostra como ficaria a classe Alunos
em Java.
Programação orientada a objetos: modelagem de problemas
14
Figura 4. Classe Alunos em Java.
Fonte: Geovane (2012, documento on-line).
É possível, portanto, observar que no início da classe Aluno existe a
declaração extends. Essa declaração significa que a classe Aluno está
dizendo que herda a classe Pessoa, dessa forma, os atributos que são comuns
à classe Pessoa não necessitam ser repetidos. Além disso, percebe-se que a 
classe Aluno possui o atributo matrícula, que é específico do Aluno.
Por fim, veja que, na classe Aluno, o método tirarCopias é alterado
de acordo com o valor específico para os Alunos, o que é possível em razão 
de um outro recurso de POO: o polimorfismo. Polimorfismo é um recurso que 
permite ao objeto ter um comportamento diferente, dependendo da situação. 
Nesse caso, o cálculo do valor da cópia se altera por conta da situação de 
desconto de aluno.
Pelos exemplos apresentados, percebe-se na prática alguns recursos e usos 
da programação OO e seus benefícios para a programação, possibilitando, 
principalmente, a reutilização do código.
Conceitos como os observados nos exemplos das Figuras 3 e 4 são casos 
comuns em POO, por isso é importante todo programador conseguir abstrair 
classes com seus atributos e métodos separados e, quando utilizar conceitos 
bases da POO, como herança de classes, evitar reutilização de código.
Programação orientada a objetos: modelagem de problemas
15
GASPAROTTO, H. M. Os 4 pilares da Programação Orientada a Objetos. DevMedia, 
Rio de Janeiro, 2014. Disponível em: https://www.devmedia.com.br/os-4-pilares-da-
-programacao-orientada-a-objetos/9264. Acesso em: 15 set. 2019.
GEOVANE, H. Entendendo e Aplicando Herança em Java. DevMedia, Rio de Janeiro, 2012. 
Disponível em: https://www.devmedia.com.br/entendendo-e-aplicando-heranca-em-
-java/24544. Acesso em: 15 set. 2019.
LEDUR, C. L. Desenvolvimento de sistemas com C#. Porto Alegre: SAGAH, 2018. 268 p.
LUTZ, M.; ASCHER, D. Aprendendo Python. 2. ed. Porto Alegre: Bookman; O’Reilly, 2007. 
566 p.
MACHADO, R. P.; FRANCO, M. H. I.; BERTAGNOLLI, S. C. Desenvolvimento de software III: 
programação de sistemas web orientada a objetos em Java. Porto Alegre: Bookman, 
2016. 220 p. (Série Tekne; Eixo Informação e Comunicação).
RODRIGUES, J. Como criar minha primeira classe em C#. DevMedia, Rio de Janeiro, 2017. 
Disponível em: https://www.devmedia.com.br/como-criar-minha-primeira-classe-em-
-csharp/38785. Acesso em: 15 set. 2019.
SEBESTA, R. W. Conceitos de linguagem de programação. 11. ed. Porto Alegre: Bookman, 
2018. 758 p.
TUCKER, A. B.; NOONAN, R. E. Linguagens de programação: princípios e paradigmas. 2. 
ed. Porto Alegre: AMGH, 2009. 630 p.
Leituras recomendadas
EDELWEISS, N.; LIVI, M. A. C. Algoritmos e programação: com exemplos em Pascal e C. 
Porto Alegre: Bookman, 2014. 476 p. (Série Livros Didáticos Informática UFRGS).
MILETTO, E. M.; BERTAGNOLLI, S. C. Desenvolvimento de software II: introdução ao de-
senvolvimento web com HTML, CSS, JavaScript e PHP. Porto Alegre: Bookman, 2014. 
276 p. (Série Tekne; Eixo Informação e Comunicação).
NICOLETTI, M. C. A cartilha Prolog. São Carlos: Edufscar, 2003. 124 p. (Série Apontamentos).
OKUYAMA, F. Y.; MILETTO, E. M.; NICOLAO, M. Desenvolvimento de software I: conceitos bá-
sicos. Porto Alegre: Bookman, 2014. 236 p. (Série Tekne; Eixo Informação e Comunicação).
PINHEIRO, F. A. C. Elementos de programação em C: em conformidade com o padrão 
ISO / IEC 9899. Porto Alegre: Bookman, 2012. 548 p.
Programação orientada a objetos: modelagem de problemas
16
DICA DO PROFESSOR
Todo paradigma de programação tem vantagens e desvantagens, mas saber equilibrar os pontos 
positivos e negativos, entendendo qual é o melhor para determinada situação, é o desafio de um 
profissional de desenvolvimento de software.
A seguir, na Dica do Professor, veja algumas vantagens e desvantagens do paradigma de 
programação orientado a objetos, o que possibilitará o entendimento de quando é necessária a 
adoção de uma linguagem orientada a objetos.
Conteúdo interativo disponível na plataforma de ensino!
EXERCÍCIOS
1) O conceito principal da programação orientada a objetos, que justifica o nome do
próprio paradigma, é que tudo pode ser abstraído para um objeto e, assim, um
programa seria uma coleção de objetos que se relacionam e apresentam
comportamento único. Assinale a alternativa que apresenta os principais
componentes de um objeto:
A) Estados e atributos.
B) Métodos e colunas.
C) Tabelas e variáveis.
D) Atributos e métodos.
E) Estado e métodos.
A orientação a objetos trouxe alguns conceitos interessantes para a programação, e2)
17
um deles está relacionado ao conhecimento sobre a implementação interna da classe, 
o qual é desnecessário do ponto de vista do objeto. Assinale a alternativa correta
quanto ao seu nome:
A) Relacionamentos.
B) Encapsulamento.
C) Classes.
D) Abstração.
E) Herança.
3) Um dos novos conceitos surgidos sobre a programação orientada a objeto é o de que
ela é um mecanismo por meio do qual é possível selecionar as funcionalidades
utilizadas de forma dinâmica por um programa no decorrer de sua execução.
Assinale a alternativa correta que apresenta o nome desse mecanismo:
A) Atributos.
B) Herança.
C) Classes.
D) Abstração.
E) Polimorfismo.
Uma das grandes vantagens da adoção da programação orientada a objetos é a4)
18
reutilização de código e sua organização. Com relação às vantagens da reutilização de 
código na programação orientada a objetos, assinale a alternativa correta:
A) A reutilização de código é obtida pelo uso de funções nos programas.
B) Os códigos em linguagens OO são simplificados pelo uso de procedimentos.
C) A reutilização de código é consequência da análise e do projeto de código.
D) A reutilização de código é consequência de métodos e eventos.
E) A reutilização de código se obtém após a sua simplificação.
5) Um objeto é uma instância de uma classe em programação orientada a objetos. As
classes definem, então, a estrutura dos objetos que serão instanciados a partir dela.
Com base nessa afirmativa, analise a classe a seguir em Java e assinale a alternativa
correta:
public class Bola
{
String cor;
int tamanho;
boolean cheia;
void encher()
{
cheia = true;
}
void esvaziar()
{
cheia = false;
}
}
19
A) Cor, tamanho e cheia são métodos da classe bola.
B) Esvaziar e encher são atributos do tipo void, da classe bola.
C) Cor, tamanho e cheia são atributos da classe bola.
D) Esvaziar, encher e cheia são métodos da classe bola.
E) Cor e tamanho são atributos e cheia método booleano da classe bola.
NA PRÁTICA
Python é uma linguagem de programação orientada a objetos com grande aceitação no 
mercado. Atualmente, ela está entre uma das linguagens de programação mais utilizadas, 
principalmente por ser uma linguagem de fácil aprendizado que possibilita a profissionais 
conhecedores de qualquer outra linguagem orientada a objetos implementar programas 
rapidamente. Além disso, ela pode se adaptar a diferentes contextos de negócio.
A seguir, no Na Prática, veja o desenvolvimento de uma estrutura simples com operações 
básicas para serem utilizadas no gerenciamento de uma conta de um banco e confira como a 
linguagem Python implementa a programaçãoorientada a objetos:
20
21
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do 
professor:
Entendendo a orientação a objetos
A programação orientada a objetos é um paradigma de programação, isto é, uma forma de 
programar e desenvolver um sistema baseada no conceito de objetos, que podem conter dados 
na forma de campos, os quais também são denominados atributos, e códigos, na forma de 
procedimentos conhecidos como métodos. No vídeo a seguir, veja o conceito de orientação a 
objetos, classes, atributos e métodos.
Conteúdo interativo disponível na plataforma de ensino!
Aplicando herança em Java
Quando se faz uma programação em Java, existe a necessidade de se trabalhar com várias 
classes. Isso se explica pelo fato de que, na maioria das vezes, classes diferentes apresentam 
características comuns e, assim, ao invés de criar outra classe com essas características, é 
possível usar as características de um objeto ou classe já existente. Essa é a herança. Confira, no 
vídeo a seguir, a aplicação do conceito de herança em JAVA.
Conteúdo interativo disponível na plataforma de ensino!
22
Introdução a classes, objetos e métodos
APRESENTAÇÃO
Nesta Unidade de Aprendizagem estudaremos classes, objetos e métodos, conceitos de extrema 
importância para a evolução em programação orientada a objetos. As classes abrigam 
elementos, como atributos e métodos, definindo tanto os dados quanto os códigos que operam 
sobre os mesmos, ou seja, classes são como um plano, que determinam como o objeto será 
criado. 
Os métodos são pedaços de código ou sub-rotinas, que tratam os dados definidos por uma 
classe. Objetos são instâncias de uma classe, são compostos por estado e comportamento e se 
comunicam através de mensagens. 
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Definir classes, objetos e métodos.•
Construir uma classe com seus elementos, com auxílio de uma linguagem de programação 
orientada a objetos.
•
Criar objetos.•
DESAFIO
Para desenvolvermos uma aplicação, é necessário fazermos um levantamento de requisitos, ou 
seja, escrever quais as necessidades e objetivos que ela deverá atingir. Com isso, estamos 
construindo o domínio da aplicação, que define para que estamos criando esta solução.
Você trabalha no setor de informática em uma escola que ainda não possui uma gestão 
informatizada, e foi encarregado de criar o cadastro de alunos.
23
O resultado a ser entregue será um arquivo zipado do projeto, o qual poderá ser construído em 
qualquer IDE (NetBeans, eclipse, etc.).
INFOGRÁFICO
Observe no infográfico uma descrição de classe, objeto e método.
24
CONTEÚDO DO LIVRO
O paradigma de programação orientada a objetos é fundamentado na construção de classes, as 
quais possuem elementos que definem e manipulam dados. Portanto, para a construção de um 
sistema orientado a objetos, é necessário o conhecimento nestes fundamentos.
Acompanhe um trecho da obra Java para iniciantes, livro que serve de base teórica para esta 
Unidade de Aprendizagem e traz uma abordagem sobre classes, atributos e métodos. O domínio 
destes conceitos é vital para o desenvolvimento de softwares. Inicie o estudo pelo tópico 
Fundamentos das classes e finalize em Como os objetos são criados.
Boa leitura.
25
Atualizado para JAVA SE 8 (JDK 8)
Java
para iniciantes
Crie, compile e execute programas Java rapidamente
Herbert Schildt
26
Catalogação na publicação: Poliana Sanchez de Araujo – CRB 10/2094
S334j Schildt, Herbert.
Java para iniciantes : crie, compile e execute programas 
Java rapidamente [recurso eletrônico] / Herbert Schildt ; 
tradução: Aldir José Coelho Corrêa da Silva ; revisão 
técnica: Maria Lúcia Blanck Lisbôa. – 6. ed. – Porto Alegre : 
Bookman, 2015.
Editado como livro impresso em 2015.
 ISBN 978-85-8260-337-6
1. Linguagem de programação - Java. I. Título.
CDU 004.438Java
O autor
O autor de best-sellers Herbert Schildt escreve incansavelmente sobre programação 
há quase três décadas e é uma das principais autoridades na linguagem Java. Seus 
livros de programação venderam milhões de cópias no mundo inteiro e foram tra-
duzidos para diversos idiomas. É autor de vários livros sobre Java, incluindo Java: 
The Complete Reference, Herb Schildt’s Java Programming Cookbook e Swing: A 
Beginner’s Guide. Ele também escreveu sobre C, C++ e C#. Embora tenha interesse 
em todas as áreas da computação, seu foco principal são as linguagens de progra-
mação, incluindo compiladores, interpretadores e linguagens de controle robótico. 
Também tem grande interesse na padronização de linguagens. Schildt tem gradua-
ção e pós-graduação pela Universidade de Illinois. Seu site é www.HerbSchildt.com.
O editor técnico
Dr. Danny Coward trabalhou em todas as edições da plataforma Java. Ele conduziu 
a definição dos Java Servlets para a primeira versão da plataforma Java EE e para 
além dela, os serviços web para a plataforma Java ME, e a estratégia e planejamento 
de Java SE 7. Fundou a tecnologia JavaFX e, mais recentemente, projetou o maior 
acréscimo feito ao padrão Java EE 7, a API Java WebSocket. Da codificação em Java 
ao projeto de APIs com especialistas da indústria e ao trabalho por vários anos como 
executivo do Java Community Process, ele adquiriu uma perspectiva singularmente 
ampla de vários aspectos da tecnologia Java. Além disso, é autor de JavaWebSo-
cket Programming e de um livro ainda a ser publicado sobre Java EE. Dr. Coward 
tem graduação, mestrado e doutorado em Matemática pela Universidade de Oxford.
27
Capítulo 4 Introdução a classes, objetos e métodos 
Principais habilidades e conceitos
• Saber os fundamentos da classe
• Entender como os objetos são criados
• Entender como as variáveis de referência são atribuídas
• Criar métodos, retornar valores e usar parâmetros
• Usar a palavra-chave return
• Retornar um valor de um método
• Adicionar parâmetros a um método
• Utilizar construtores
• Criar construtores parametrizados
• Entender new
• Entender a coleta de lixo e os finalizadores
• Usar a palavra-chave this
.....................................................................................................................................
Antes de poder se adiantar mais em seu estudo de Java, você precisa conhecer aclasse. Classe é a essência de Java. Ela é a fundação na qual toda a linguagem 
Java se estrutura, porque define a natureza de um objeto. Como tal, ela forma a base 
da programação orientada a objetos em Java. Dentro de uma classe, são definidos 
dados e o código que age sobre eles. O código fica contido em métodos. Já que as 
classes, objetos e métodos são fundamentais para Java, eles serão introduzidos neste 
capítulo. Ter um entendimento básico desses recursos permitirá que você escreva 
programas mais sofisticados e compreenda melhor certos elementos-chave de Java 
descritos no próximo capítulo.
Fundamentos das classes
Já que toda a atividade dos programas Java ocorre dentro de uma classe, temos usado 
classes desde o início deste livro. É claro que só classes extremamente simples foram 
usadas e não nos beneficiamos da maioria de seus recursos. Como você verá, elas 
são significativamente mais poderosas do que as classes limitadas apresentadas até 
agora.
Comecemos examinando o básico. Uma classe é um modelo que define a for-
ma de um objeto. Ela especifica tanto os dados quanto o código que operará sobre 
eles. Java usa uma especificação de classe para construir objetos. Os objetos são 
instâncias de uma classe. Logo, uma classe é basicamente um conjunto de planos 
28
Java para Iniciantes
que especifica como construir um objeto. É importante deixar uma coisa bem clara: 
uma classe é uma abstração lógica. Só quando um objeto dessa classe é criado é que 
existe uma representação física dela na memória.
Outro ponto: lembre-se de que os métodos e variáveis que compõem uma clas-
se são chamados de membrosda classe. Os membros de dados também são chama-
dos de variáveis de instância.
Forma geral de uma classe
Quando definimos uma classe, declaramos sua forma e natureza exatas. Fazemos 
isso especificando as variáveis de instância que ela contém e os métodos que operam 
sobre elas. Embora classes muito simples possam conter apenas métodos ou apenas 
variáveis de instância, a maioria das classes do mundo real contém ambos.
Uma classe é criada com o uso da palavra-chave class. Uma forma geral sim-
plificada de uma definição class é mostrada aqui:
class nome da classe {
 // declara variáveis de instância
 tipo var1;
 tipo var2;
 // ...
 tipo varN;
 // declara métodos
 tipo método1(parâmetros) {
 // corpo do método
 }
 tipo método2(parâmetros) {
 // corpo do método
 }
 // ...
 tipo métodoN(parâmetros) {
 // corpo do método
 }
}
Embora não haja essa regra sintática, uma classe bem projetada deve definir 
apenas uma entidade lógica. Por exemplo, normalmente, uma classe que armazena 
nomes e números de telefone não armazena também informações sobre o mercado 
de ações, a média pluviométrica, os ciclos das manchas solares ou outros dados não 
relacionados. Ou seja, uma classe bem projetada deve agrupar informações logi-
camente conectadas. A inserção de informações não relacionadas na mesma classe 
desestruturará rapidamente seu código!
Até o momento, as classes que usamos tinham apenas um método: main( ). 
Você verá como criar outros em breve. No entanto, observe que a forma geral de uma 
classe não especifica um método main( ). O método main( ) só é necessário quando 
a classe é o ponto de partida do programa. Alguns tipos de aplicativos Java, como os 
applets, também precisam de um método main( ).
29
Capítulo 4 Introdução a classes, objetos e métodos 
Definindo uma classe
Para ilustrar as classes, desenvolveremos uma classe que encapsula informações so-
bre veículos, como carros, furgões e caminhões. Essa classe se chama Vehicle e con-
terá três informações sobre um veículo: o número de passageiros que ele pode levar, 
a capacidade de armazenamento de combustível e o consumo médio de combustível 
(em milhas por galão).
A primeira versão de Vehicle é mostrada a seguir. Ela define três variáveis de 
instância: passengers, fuelcap e mpg. Observe que Vehicle não contém método. 
Logo, atualmente é uma classe só de dados. (Seções subsequentes adicionarão mé-
todos a ela.)
class Vehicle {
 int passengers; // número de passageiros
 int fuelcap; // capacidade de armazenamento de combustível em galões
 int mpg; // consumo de combustível em milhas por galão
}
Uma definição class cria um novo tipo de dado. Nesse caso, ele se chama Vehi-
cle. Você usará esse nome para declarar objetos de tipo Vehicle. Lembre-se de que 
uma declaração class é só uma descrição de tipo; ela não cria um objeto real. Logo, o 
código anterior não faz nenhum objeto de tipo Vehicle passar a existir.
Para criar realmente um objeto Vehicle, você usará uma instrução como a mos-
trada abaixo:
Vehicle minivan = new Vehicle(); // cria um objeto Vehicle chamado minivan
Após essa instrução ser executada, minivan será uma instância de Vehicle. Portanto, 
terá realidade “física”. Por enquanto, não se preocupe com os detalhes da instrução.
Sempre que você criar uma instância de uma classe, estará criando um objeto 
contendo sua própria cópia de cada variável de instância definida pela classe. Logo, 
todos os objetos Vehicle conterão suas próprias cópias das variáveis de instância 
passengers, fuelcap e mpg. Para acessar essas variáveis, você usará o operador pon-
to (.). O operador ponto vincula o nome de um objeto ao nome de um membro. A 
forma geral do operador ponto é mostrada aqui:
objeto.membro
Portanto, o objeto é especificado à esquerda e o membro é inserido à direita. Por 
exemplo, para atribuir o valor 16 à variável fuelcap de minivan, use a instrução a 
seguir:
minivan.fuelcap = 16;
Em geral, podemos usar o operador ponto para acessar tanto variáveis de instância 
quanto métodos.
Este é um programa completo que usa a classe Vehicle:
/* Um programa que usa a classe Vehicle.
 Chame este arquivo de VehicleDemo.java
*/
class Vehicle {
30
Java para Iniciantes
 int passengers; // número de passageiros
 int fuelcap; // capacidade de armazenamento de combustível em galões
 int mpg; // consumo de combustível em milhas por galão
}
// Essa classe declara um objeto de tipo Vehicle.
class VehicleDemo {
 public static void main(String args[]) {
 Vehicle minivan = new Vehicle();
 int range;
 // atribui valores a campos de minivan
 minivan.passengers = 7;
 minivan.fuelcap = 16;
 minivan.mpg = 21;
 // calcula a autonomia presumindo um tanque cheio de gasolina
 range = minivan.fuelcap * minivan.mpg;
 System.out.println("Minivan can carry " + minivan.passengers +
" with a range of " + range);
 }
}
Você deve chamar o arquivo que contém o programa de VehicleDemo.java, 
porque o método main( ) está na classe chamada VehicleDemo e não na classe cha-
mada Vehicle. Quando compilar esse programa, verá que dois arquivos .class foram 
criados, um para Vehicle e um para VehicleDemo. O compilador Java insere auto-
maticamente cada classe em seu próprio arquivo .class. Não é necessário as classes 
Vehicle e VehicleDemo estarem no mesmo arquivo-fonte. Você pode inserir cada 
classe em seu próprio arquivo, chamados Vehicle.java e VehicleDemo.java, respec-
tivamente.
Para executar o programa, você deve executar VehicleDemo.java. A saída a 
seguir é exibida:
Minivan can carry 7 with a range of 336
Antes de avançar, examinemos um princípio básico: cada objeto tem suas pró-
prias cópias das variáveis de instância definidas por sua classe. Logo, o conteúdo das 
variáveis de um objeto pode diferir do conteúdo das variáveis de outro. Não há co-
nexão entre os dois objetos exceto pelo fato de serem do mesmo tipo. Por exemplo, 
se você tiver dois objetos Vehicle, cada um terá sua própria cópia de passengers, 
fuelcap e mpg, e o conteúdo dessas variáveis será diferente entre os dois objetos. O 
programa abaixo demonstra esse fato. (Observe que a classe que tem main( ) agora 
se chama TwoVehicles.)
// Este programa cria dois objetos Vehicle.
class Vehicle {
 int passengers; // número de passageiros
 int fuelcap; // capacidade de armazenamento de combustível em galões
Observe o uso do operador ponto 
para o acesso a um membro.
31
Capítulo 4 Introdução a classes, objetos e métodos 
 int mpg; // consumo de combustível em milhas por galão
}
// Essa classe declara um objeto de tipo Vehicle.
class TwoVehicles {
 public static void main(String args[]) {
 Vehicle minivan = new Vehicle();
 Vehicle sportscar = new Vehicle();
 int range1, range2;
 // atribui valores a campos de minivan
 minivan.passengers = 7;
 minivan.fuelcap = 16;
 minivan.mpg = 21;
 // atribui valores a campos de sportscar
 sportscar.passengers = 2;
 sportscar.fuelcap = 14;
 sportscar.mpg = 12;
 // calcula a autonomia presumindo um tanque cheio de gasolina
 range1 = minivan.fuelcap * minivan.mpg;
 range2 = sportscar.fuelcap * sportscar.mpg;
 System.out.println("Minivan can carry " + minivan.passengers +
" with a range of " + range1);
 System.out.println("Sportscar can carry " + sportscar.passengers +
" with a range of " + range2);
 }
}
A saída produzida por esse programa é mostrada aqui:
Minivan can carry 7 with a range of 336
Sportscar can carry 2 with a range of 168
Como você pode ver, os dados de minivan são totalmente diferentes dos contidos em 
sportscar. A ilustração a seguir mostra essa situação.
minivan
passengers 7
fuelcap 16
mpg 21
passengers 2
fuelcap 14
mpg 12
sportscar
Lembre-se de que minivan 
e sportscar referenciam 
objetos separados.
32
Java para Iniciantes
Como os objetos são criados
Nos programas anteriores, a linha abaixo foi usada para declarar um objeto detipo 
Vehicle:
Vehicle minivan = new Vehicle();
Essa declaração faz duas coisas. Em primeiro lugar, ela declara uma variável chamada 
minivan da classe Vehicle. Essa variável não define um objeto. Em vez disso, ela pode 
apenas referenciar um objeto. Em segundo lugar, a declaração cria uma cópia física do 
objeto e atribui à minivan uma referência a ele. Isso é feito com o uso do operador new.
O operador new aloca dinamicamente (isto é, aloca no tempo de execução) 
memória para um objeto e retorna uma referência a ele. Essa referência é, mais ou 
menos, o endereço do objeto na memória alocado por new. A referência é então 
armazenada em uma variável. Logo, em Java, todos os objetos de uma classe devem 
ser alocados dinamicamente.
As duas etapas da instrução anterior podem ser reescritas desta forma para 
mostrarmos cada etapa individualmente:
Vehicle minivan; // declara uma referência ao objeto
minivan = new Vehicle(); // aloca um objeto Vehicle
A primeira linha declara minivan como referência a um objeto de tipo Vehicle. Por-
tanto, minivan é uma variável que pode referenciar um objeto, mas não é um objeto. 
Por enquanto, minivan não referencia um objeto. A próxima linha cria um novo ob-
jeto Vehicle e atribui à minivan uma referência a ele. Agora, minivan está vinculada 
a um objeto.
33
DICA DO PROFESSOR
Projetar um software é como projetar uma casa. Tanto a engenharia civil quanto a de software 
possuem um esquema ou desenho.
Na engenharia civil, chamamos de desenho arquitetônico ou planta; na engenharia de software, 
chamamos de arquitetura ou designer, todos inclusos na fase de projeto. Com isso, as pessoas 
que farão devem saber interpretar tais desenhos.
Agora, faremos uma aplicação prática, em que interpretaremos o desenho de uma classe e 
implementaremos seu código. 
Os objetivos são :
- Implementar uma classe chamada Media, definindo atributos e métodos para calcular a média
aritmética entre duas notas.
- Implementar uma classe chamada Principal, para instanciar a classe Media.
- Utilizar uma caixa de mensagens para mostrar o resultado na tela; para isso, importaremos a
classe JOptionPane do pacote swing do java.
A aplicação consiste em receber duas notas e calcular a média aritmética. Para o desenho, foi 
utilizada a ferramenta Astah Community que utiliza as notações UML (linguagem unificada de 
modelagem).
Conteúdo interativo disponível na plataforma de ensino!
EXERCÍCIOS
1) Em programação orientada a objetos, qual o papel da classe?
34
A) Classes possuem um papel irrelevante na programação orientada a objetos.
B) As classes são a fundação, na qual linguagens orientadas a objetos se estruturam.
C) Classes são boas práticas de programação.
D) Dentro de uma classe são escritos todos comentários de uma aplicação.
E) Uma classe é, basicamente, um conjunto de planos que especifica como construir um
pacote.
2) Em relação à forma geral de uma classe, podemos afirmar:
A) Uma classe é criada com o uso da palavra-chave public.
B) É impossível usar comentários dentro de uma classe.
C) Uma classe é criada com a palavra-chave class.
D) Os parênteses são caracteres que delimitam o bloco da classe.
E) Podemos usar palavras reservadas de uma linguagem de programação para nomearmos
classes.
3) Sobre objetos, podemos afirmar que:
A) É uma abstração lógica.
B) Um objeto é composto por estado e comportamento.
35
C) Para criarmos uma classe, é necessário seguirmos a especificação de um objeto.
D) Considere o seguinte código: “Cliente cli = new Cliente();” a palavra “new” é o método
construtor da classe.
E) Não há comunicação entre objetos dentro de um sistema orientado a objetos.
Analise o seguinte código: 
public class Veiculo { 
private String placa; 
private String cor; 
private int anoFabricacao; 
public String getPlaca() { 
return placa; 
} 
public void setPlaca(String placa) { 
this.placa = placa; 
} 
public String getCor() { 
return cor; 
} 
public void setCor(String cor) { 
this.cor = cor; 
4)
36
} 
public int getAnoFabricacao() { 
return anoFabricacao; 
} 
public void setAnoFabricacao(int anoFabricacao) { 
this.anoFabricacao = anoFabricacao; 
} 
} 
A) A classe Veiculo tem quatro variáveis de instância.
B) As palavras-chave this em this.cor, this.placa e this.anoFrabricacao informam ao método
que estamos nos referindo à variável de instância.
C) A palavra void é necessária para criação de todos os métodos.
D) As variáveis de instância da classe veículo poderão ser visualizadas por qualquer outra
classe da aplicação.
E) O código está incorreto, pois métodos e variáveis de instância não são elementos de uma
classe.
5) São implementados para realizarem algum tipo de tarefa:
A) Classes.
37
B) Objetos.
C) Atributos.
D) Métodos.
E) Comentários.
NA PRÁTICA
O grande objetivo do paradigma de programação orientada a objetos é facilitar a abstração do 
mundo real e transformá-lo em código. O mundo é composto por coisas ou objetos. Quem nunca 
passou pela situação de pedir que alcance aquele objeto? Com isso, podemos exemplificar como 
sendo objetos, pessoas, carros, animais, entre outros.
Todo objeto é composto por características e seus valores. A essas características e valores, dá-
se o nome de estado do objeto, é o que o unifica em relação a outros objetos, por exemplo: um 
objeto pessoa pode ter como característica o seu nome, e esse nome pode ter o valor "João", 
"Paulo", etc. Todo objeto possui um comportamento, isto é, uma ação; a pessoa, pode falar, 
comer; o carro pode acelerar, frear... Esses comportamentos do objeto são chamados de métodos
.
38
As classes têm uma característica importante, pois, além de classificar objetos com atributos 
semelhantes, elas modelam a criação destes objetos. 
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do 
professor:
Curso POO Java #02b - Criando Classes e Objetos em Java
Aprenda como criar uma Classe, com seus atributos e métodos, e a instanciar novos objetos a 
partir dessa classe inicial
Conteúdo interativo disponível na plataforma de ensino!
Orientação a Objetos em Java
Essa sessão visa ensinar os conceitos do paradigma de Orientação a Objetos (OO).
Conteúdo interativo disponível na plataforma de ensino!
Conceitos de Computação com Java - Compatível com Java 5 & 6
Cay Horstmann, 5ª edição, 2009
39
Projetando classes
APRESENTAÇÃO
Para desenvolvermos aplicações utilizando o paradigma orientação a objetos, podemos definir 
que projetar classes é um importante desafio. Segundo Cay Horstmann (2009), classes são 
coleções de objetos, portanto, precisamos começar a atividade de programação identificando os 
objetos e as classes às quais eles pertencem.
Nesta Unidade de Aprendizagem você verá os conceitos de coesão e acoplamento, que são 
importantes para formar uma estrutura de classes consistente e, por fim, pacotes, que são uma 
forma de organizar as classes do nosso projeto. 
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Identificar objetos e definir a quais classes eles pertencem.•
Definir coesão e acoplamento.•
Usar pacotes para organizar classes.•
DESAFIO
Projetar uma classe pode ser um bom desafio, mas quando seguimos algumas regras e padrões, 
nosso trabalho se torna menos árduo.
Você trabalha como analista/programador em uma fábrica de softwares e foi encarregado de 
atender um cliente que possui uma oficina mecânica. O cliente necessita automatizar o processo 
de manutenção de veículos, ou seja, fazer um controle dos clientes e dos veículos que os 
mesmos trazem para manutenção. Para tanto, será necessário construir um cadastro de clientes 
que armazene as seguintes informações: cpf, nome, endereço, fone e e-mail; também será 
necessário um cadastro de veículos que armazene as seguintes informações: placa, modelo, ano, 
fabricante e cor. Para tanto, será necessário criar dois pacotes, um chamado modeloe outro, 
controle.
40
No pacote modelo, coloque as classes modelo e, no pacote controle, coloque a classe que 
conterá o método main. Você pode colocar o nome da classe como Principal, e a mesma servirá 
para instanciar as classes modelo e iniciar o programa. Use uma linguagem de programação 
orientada a objetos para executar a tarefa, crie um projeto e, depois de concluídas as atividades, 
exporte o projeto no formato zip e envie o arquivo.
INFOGRÁFICO
Veja, no infográfico, uma descrição sobre escolha de classes, coesão, acoplamento e pacotes.
CONTEÚDO DO LIVRO
Escolher, nomear e estruturar bem as classes de uma aplicação, assim como organizá-las em 
pacotes, é de extrema importância no paradigma de orientação a objetos. Portanto, o domínio 
destes conceitos torna-se vital para o desenvolvimento de softwares.
Acompanhe um trecho do livro Conceitos de computação com Java; este livro serve de base 
teórica para esta Unidade de Aprendizagem. Inicie sua leitura pelo tópico Escolhendo classes e 
vá até o final do tópico Coesão e acoplamento.
41
Java
C A Y H O R S T M A N N
5a Edição
C O N C E I T O S D E
C O M P U TA Ç Ã O C O M
Compatível com
Java 5 & 6
42
Conceitos de Computação com Java
 8.1 Escolhendo classes
Você já utilizou um bom número de classes nos capítulos anteriores e provavelmente pro-
jetou algumas como parte de seus exercícios de programação. Projetar uma classe pode ser 
um desafi o – nem sempre é fácil dizer como começar ou se o resultado é de boa qualidade.
Estudantes com alguma experiência anterior em programação, em uma outra lingua-
gem, estão acostumados a programar funções. Uma função executa uma ação. Na pro-
gramação orientada a objetos, as ações aparecem como métodos. Cada método, porém, 
pertence a uma classe. Classes são coleções de objetos e objetos não são ações – eles 
são entidades. Portanto, você precisa começar a atividade de programação identifi cando 
objetos e as classes às quais eles pertencem.
Lembre-se da regra geral do Capítulo 2: nomes de classe devem ser substantivos e 
nomes de método devem ser verbos.
O que faz uma boa classe? Acima de tudo, uma classe deve 
representar um único conceito. Algumas classes que vimos repre-
sentam conceitos matemáticos:
Point•
Rectangle•
Ellipse•
Outras classes são abstrações de situações da vida real.
BankAccount•
CashRegister•
Uma classe deve 
representar um único 
conceito do domínio do 
problema, como negócios, 
ciência ou matemática.
43
CAPÍTULO 8 � Projetando Classes 
Para essas classes, as propriedades de um objeto típico são fáceis de entender. Um objeto 
Rectangle tem uma largura e uma altura. Dado um objeto BankAccount, você pode depo-
sitar e sacar dinheiro. Geralmente, conceitos da parte do universo compreendida pelo 
programa, como ciências, negócios ou um jogo, fazem boas classes. O nome para essa 
classe deve ser um substantivo que descreve o conceito. Alguns nomes de classes padrão 
em Java são um pouco estranhos, como Ellipse2D.Double, mas você pode escolher no-
mes mais apropriados para suas classes.
Uma outra categoria útil de classe pode ser descrita como atores. Objetos de uma 
classe de atores realizam alguns trabalhos para você. Exemplos de atores são a classe 
Scanner do Capítulo 4 e a classe Random no Capítulo 6. Um objeto Scanner varre um fl uxo 
de dados em busca de números e strings. Um objeto Random gera números aleatórios. Se 
utilizar a língua inglesa para atribuir nomes, uma boa idéia é escolher nomes de classes 
para os atores que terminem em “er” ou “or”. (Um nome melhor para a classe Random 
poderia ser RandomNumberGenerator.)
Ocasionalmente, uma classe não tem nenhum objeto, mas contém uma coleção de 
constantes e métodos estáticos relacionados. A classe Math é um exemplo típico. Uma 
classe assim é chamada de classe utilitária.
Por fi m, você viu classes com somente um método main. O único propósito dessas 
classes é iniciar um programa. Da perspectiva de projeto, estes são exemplos mais ou 
menos degenerados de classes.
O que não poderia ser uma boa classe? Se você não pode afi rmar a partir do nome da 
classe o que um objeto da classe supostamente deve fazer, provavelmente você não está 
no caminho certo. Por exemplo, sua lição de casa poderia solicitar para você escrever 
um programa que imprima cheques de pagamento. Suponha que inicialmente você tente 
projetar uma classe PaycheckProgram. O que um objeto dessa classe faria? Um objeto des-
sa classe teria que fazer tudo o que a lição de casa exige fazer. Isso não simplifi ca nada. 
Uma classe melhor seria Paycheck. Seu programa pode então manipular um ou mais 
objetos da classe Paycheck.
Um outro equívoco comum, especialmente de estudantes habituados a escrever 
programas que consistem em funções, é transformar uma ação em uma classe. Por 
exemplo, se sua lição de casa fosse calcular um cheque de pagamento, você poderia 
considerar escrever uma classe ComputePaycheck. Mas você consegue visualizar um ob-
jeto do tipo ComputePaycheck? O fato de que ComputePaycheck não é um substantivo 
leva você a achar que está no caminho errado. Por outro lado, uma classe Paycheck tem 
um sentido intuitivo. O termo “cheque de pagamento” (ou Paycheck) é um substantivo. 
Você pode visualizar um objeto de cheque de pagamento. Então você pode pensar em 
métodos úteis para a classe Paycheck, como computeTaxes, que o ajudarão a resolver a 
lição de casa.
AUTOVERIFICAÇÃO DA APRENDIZAGEM
1. Qual é a regra geral para escolher classes?
2. Seu trabalho é escrever um programa de xadrez. A classe ChessBoard (Tabuleiro)
poderia ser uma classe apropriada? Que tal MovePiece?
44
Conceitos de Computação com Java
 8.2 Coesão e acoplamento
Nesta seção você aprenderá dois critérios úteis para analisar a qualidade da interface 
pública de uma classe.
Uma classe deve representar um único conceito. As constantes 
e os métodos públicos que a interface pública expõe devem ser co-
esos. Isto é, todos os recursos da interface devem estar intimamente 
relacionados ao único conceito que a classe representa.
Se achar que a interface pública de uma classe referencia vá-
rios conceitos, isso é um bom sinal de que pode ser a hora de utili-
zar classes separadas. Considere, por exemplo, a interface pública da classe CashRegister 
no Capítulo 4:
public class CashRegister
{
 public void enterPayment(int dollars, int quarters,
int dimes, int nickels, int pennies)
 . . .
 public static fi nal double NICKEL_VALUE = 0.05;
 public static fi nal double DIME_VALUE = 0.1;
 public static fi nal double QUARTER_VALUE = 0.25;
 . . .
}
Na verdade há dois conceitos aqui: uma caixa registradora que armazena moedas e cal-
cula o total e os valores das moedas individuais. (Por simplicidade, supomos que a caixa 
registradora só contém moedas, não cédulas. O Exercício P8.1 discute uma solução mais 
geral.)
Faz sentido ter uma classe Coin separada e tornar as moedas responsáveis pelos seus 
valores.
public class Coin
{
 public Coin(double aValue, String aName) { . . . }
 public double getValue() { . . . }
 . . .
}
A interface pública de uma 
classe é coesa se todos os 
seus recursos estiverem 
relacionados ao conceito 
que a classe representa.
Figura 1 
Relacionamento de dependência 
entre as classes CashRegister e Coin. 
CashRegister
Coin
45
CAPÍTULO 8 � Projetando Classes 
A classe CashRegister pode então ser simplifi cada:
public class CashRegister
{
 public void enterPayment(int coinCount, Coin coinType) { . . . }
 . . .
}
Agora a classe CashRegister não precisa conhecer mais nada sobre os valores das moe-
das. A mesma classe pode muito bem tratar euros ou zorkmids!
Claramente essa é uma solução melhor, porque ela separa as responsabilidades entre 
a caixa registradora e as moedas. A única razão por que não seguimos essa abordagem no 
Capítulo 4 foi manter o exemplo da CashRegister simples.
Muitas classes precisam de outras classes para que possam fazer 
o seu trabalho. Por exemplo, a classe CashRegisterreestruturada ago-
ra depende da classe Coin para determinar o valor do pagamento.
Para visualizar os relacionamentos, como a dependência entre 
as classes, programadores criam diagramas de classes. Neste livro, utilizamos a nota-
ção UML (“Unifi ed Modeling Language”) para objetos e classes. UML é uma notação 
para análise orientada a objetos cujo projeto foi criado por Grady Booch, Ivar Jacobson 
e James Rumbaugh, três importantes pesquisadores em desenvolvimento de software 
orientado a objetos. A notação UML distingue entre diagramas de objetos e diagramas de 
classes. Em um diagrama de objetos os nomes das classes são sublinhados; em um dia-
grama de classes os nomes das classes não são sublinhados. Em um diagrama de classes, 
você indica a dependência por meio de uma linha tracejada usando uma seta com a ponta 
aberta apontando para a classe dependente. A Figura 1 mostra um diagrama de classes 
que indica que a classe CashRegister depende da classe Coin.
Observe que a classe Coin não depende da classe CashRegister. Moedas não fazem 
idéia de que são coletadas pela caixa registradora e elas podem realizar suas funções sem 
nunca chamar um método qualquer na classe CashRegister.
Se muitas classes de um programa dependerem umas das outras, dizemos então que 
o acoplamento entre as classes é alto. Inversamente, se houver poucas dependências entre
as classes, dizemos que o acoplamento é baixo (veja Figura 2).
Uma classe depende de 
outra classe se ela usa 
objetos dessa classe.
Acoplamento baixoAcoplamento alto
Figura 2 Acoplamento alto e acoplamento baixo entre classes.
46
Conceitos de Computação com Java
Por que o acoplamento é importante? Se a classe Coin muda na 
próxima distribuição do programa, todas as classes que dependem 
dela podem ser afetadas. Se a alteração for drástica, todas as clas-
ses associadas devem ser atualizadas. Além disso, se quisermos 
utilizar uma classe em outro programa, teremos que levar junto 
todas as classes das quais ela depende. Portanto, queremos remo-
ver o acoplamento desnecessário entre as classes.
AUTOVERIFICAÇÃO DA APRENDIZAGEM
3. Por que a classe CashRegister do Capítulo 4 não é coesa?
4. Por que a classe Coin não depende da classe CashRegister?
5. Por que o acoplamento deve ser minimizado entre as classes?
Consistência
Nesta seção você aprendeu dois critérios para analisar a qualidade da interface pública 
de uma classe. Você deve maximizar a coesão e eliminar o acoplamento desnecessá-
rio. Há um outro critério que gostaríamos que você prestasse atenção – consistência. 
Quando você tem vários métodos, siga um esquema consistente para os nomes e parâ-
metros desses métodos. Isso é simplesmente um sinal de bom estilo.
Infelizmente, você pode localizar várias inconsistências na biblioteca padrão. Eis 
um exemplo. Para mostrar uma caixa de diálogo de entrada, você chama
JOptionPane.showInputDialog(promptString)
Para mostrar uma caixa de diálogo de mensagem, você chama
JOptionPane.showMessageDialog(null, messageString)
O que é o parâmetro null? Sabemos que o método showMessageDialog precisa de um 
parâmetro para especifi car a janela pai ou null se nenhuma janela pai for requerida. 
Mas o método showInputDialog não requer nenhuma janela pai. Por que essa incon-
sistência? Não há razão alguma. Seria mais fácil fornecer um método showMessage-
Dialog que espelhasse exatamente o método showInputDialog.
Inconsistências como essas não são uma falha fatal, mas são uma dor de cabeça, 
especialmente porque podem ser facilmente evitadas.
DICA DE QUALIDADE 8.1
Uma boa prática é 
minimizar o acoplamento 
(isto é, a dependência) entre 
classes.
47
DICA DO PROFESSOR
Acompanhe, no vídeo, mais conceitos de projetando classes.
Conteúdo interativo disponível na plataforma de ensino!
EXERCÍCIOS
1) Em orientação a objetos, como devemos começar as atividades de programação?
A) Identificando os atributos.
B) Identificando os métodos.
C) Identificando os requisitos funcionais da aplicação.
D) Identificando objetos e as classes às quais eles pertencem.
E) Identificando nomes de classes.
2) Marque a afirmativa correta:
A) Nomeamos uma classe utilizando um verbo que define o objetivo dessa classe.
B) Uma classe deve ser criada para representar vários conceitos do domínio do problema.
C) Se você não pode afirmar, a partir do nome da classe, o que um objeto da classe
supostamente deve fazer, provavelmente você não está no caminho certo.
48
D) Uma categoria útil de classes pode ser descrita como atores. Essas classes servem para
iniciar um programa.
E) Uma prática comum é nomear métodos com algum substantivo.
3) Referente a coesão e acoplamento, podemos afirmar que:
A) Uma classe coesa representa uma solução bem estruturada no que se refere à criação do
objeto.
B) A interface pública de uma classe é coesa se abrange todos os requisitos funcionais do
sistema.
C) Quando a interface pública de uma classe referencia vários conceitos, é um bom sinal de
que pode ser hora de utilizar classes separadas.
D) Acoplamento refere-se à dependência que as classes possuem em relação aos seus
métodos.
E) Se muitas classes de um programa dependerem umas das outras, dizemos, então, que o
acoplamento entre as classes é baixo.
4) O que é um pacote?
A) É uma forma de organizar os métodos.
B) É um modificador de acesso.
C) Servem para iniciar programas.
49
D) Criamos objetos a partir das definições de um pacote.
E) É um conjunto de classes relacionadas.
5) Analise o código abaixo:
/* 
package media; 
public class calcularMedia { 
private double nota1; 
private double nota2; 
private double media; 
private int matricula; 
private String nome; 
public void calcularMedia(double nota1, double nota{ 
this.nota1 = nota1; 
this.nota2 = nota2; 
media = (nota1 + nota2)/2; 
} 
public void cadastrarAluno(int cod, String matricula){ 
this.cod=cod; 
this.matricula = matricula; 
} 
} 
*/ 
É correto afirmar que: 
A) A classe “calcularMedia” segue a regra geral para nomes de classes.
50
B) O método “calcularMedia” não irá executar a expressão aritmética.
C) Esta classe não está dentro de nenhum pacote.
D) Esta classe não apresenta coesão.
E) A classe está escrita totalmente correta.
NA PRÁTICA
Veja, na prática, a identificação de um objeto, sua classificação e implementação em uma 
linguagem de programação. 
Conteúdo interativo disponível na plataforma de ensino!
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do 
professor:
Diferenças entre classe e objeto em Java
Conteúdo interativo disponível na plataforma de ensino!
O que são e para que servem as classes e objetos
Conteúdo interativo disponível na plataforma de ensino!
51
Classes com tipos genéricos
APRESENTAÇÃO
Tipos genéricos são muito usados nas APIs da linguagem java. Como exemplo, podemos citar 
as coleções, as quais também podem ser implementadas em nossas aplicações. 
Nesta Unidade de Aprendizagem veremos alguns conceitos sobre classes com tipos genéricos. 
Trabalharemos um escopo básico, já que este assunto é muito extenso, mas é necessário que 
todos os programadores tenham um conhecimento básico. 
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Definir o que é um tipo genérico.•
Reconhecer classes genéricas.•
Construir uma aplicação utilizando tipos genéricos.•
DESAFIO
Classes genéricas podem ter mais de um parâmetro de tipo, isto é, mais uma das facilidades que 
os tipos genéricos nos proporcionam. 
Você é analista/programador em uma fábrica de software e seu trabalho é entregar uma 
aplicação de cadastro de clientes. Para isso, deve criar uma classe modelo e uma de controle 
para instanciar a modelo, no entanto, deve utilizar as técnicas de tipos genéricos. O cadastro de 
cliente deverá conter nome, sobrenome, idade, endereço e e-mail.
Para executar o desafio, utilize uma linguagem de programação orientada a objetos, um IDE 
paraauxiliar na organização do projeto (sugerido: netBeans ou Eclipse).
Crie um projeto com o nome de cadastro; dentro, crie um pacote com o mesmo nome, e, dentro 
do pacote, crie as classes necessárias.
Observação: a classe controle, além de instanciar a classe modelo e inserir os valores, deverá 
52
invocar um método para impressão do objeto na tela.
INFOGRÁFICO
Veja no infográfico os conceitos de classes com tipos genéricos.
CONTEÚDO DO LIVRO
Os genéricos adicionaram um elemento de sintaxe totalmente novo e causaram mudanças em 
muitas das classes e métodos da API principal. Não é exagero dizer que sua inclusão 
basicamente reformulou a natureza de Java. Acompanhe um trecho do livro Java para iniciantes, 
o qual traz uma abordagem sobre tipos genéricos e é a base teórica para esta Unidade de
Aprendizagem. Inicie o estudo pelo tópico Fundamentos dos tipos genéricos e finalize ao final
de Tipos genéricos diferem de acordo com seus argumentos de tipo.
Boa leitura.
53
Capítulo 13 Tipos genéricos 
Principais habilidades e conceitos
• Entender as vantagens dos tipos genéricos
• Criar uma classe genérica
• Aplicar parâmetros de tipo limitado
• Usar argumentos curingas
• Aplicar curingas limitados
• Criar um método genérico
• Criar um construtor genérico
• Criar uma interface genérica
• Utilizar tipos brutos
• Aplicar a inferência de tipos com o operador losango
• Entender a técnica erasure
• Evitar erros de ambiguidade
• Conhecer as restrições dos genéricos
.....................................................................................................................................
Desde sua versão original, muitos recursos novos foram adicionados a Java.Todos melhoraram e expandiram seu escopo, mas o que teve impacto parti-
cularmente profundo e extenso foi o tipo genérico, porque seus efeitos foram sen-
tidos em toda a linguagem. Por exemplo, os genéricos adicionaram um elemento 
de sintaxe totalmente novo e causaram mudanças em muitas das classes e métodos 
da API principal. Não é exagero dizer que sua inclusão basicamente reformulou a 
natureza de Java.
O tópico “genéricos” é muito extenso e parte dele é avançado demais para 
entrar no escopo deste livro. No entanto, um conhecimento básico dos genéricos é 
necessário a todos os programadores Java. À primeira vista, a sintaxe dos genéricos 
pode parecer um pouco complicada, mas não se preocupe, os genéricos são muito 
fáceis de usar. Quando você terminar este capítulo, terá uma noção dos conceitos-
-chave que estão por trás dos genéricos e terá conhecimento suficiente para usá-los
de maneira eficaz em seus próprios programas.
Fundamentos dos tipos genéricos
Na verdade, com o termo genéricos queremos nos referir aos tipos parametrizados. 
Os tipos parametrizados são importantes porque nos permitem criar classes, inter-
54
Java para Iniciantes
faces e métodos em que o tipo de dado usado é especificado como parâmetro. Uma 
classe, interface ou método que opera sobre um parâmetro de tipo é chamado de 
genérico, como em classe genérica ou método genérico.
Uma vantagem importante do código genérico é que ele funciona automatica-
mente com o tipo de dado passado para seu parâmetro de tipo. Muitos algoritmos são 
logicamente iguais, não importando o tipo de dado ao qual estão sendo aplicados. 
Por exemplo, uma classificação rápida é igual classificando itens de tipo Integer, 
String, Object ou Thread. Com os genéricos, você pode definir um algoritmo uma 
única vez, independentemente do tipo de dado, e então aplicá-lo a uma ampla varie-
dade de tipos de dados sem nenhum esforço adicional.
É importante entender que Java sempre permitiu a criação de classes, interfaces 
e métodos generalizados usando referências de tipo Object. Já que Object é a super-
classe de todas as outras classes, uma referência Object pode referenciar qualquer 
tipo de objeto. Logo, em códigos anteriores aos genéricos, classes, interfaces e méto-
dos generalizados usavam referências Object para operar com vários tipos de dados. 
O problema é que eles não faziam isso com segurança de tipos, já que coerções 
eram necessárias para converter explicitamente Object no tipo de dado que estava 
sendo tratado. Portanto, era possível gerar acidentalmente discrepâncias de tipo. Os 
genéricos adicionam a segurança de tipos que estava faltando, porque tornam essas 
coerções automáticas e implícitas. Resumindo, eles expandem nossa habilidade de 
reutilizar código e nos permitem fazê-lo de maneira segura e confiável.
Exemplo simples de genérico
Antes de discutir mais teoria, é melhor examinarmos um exemplo simples de genéri-
co. O programa a seguir define duas classes. A primeira é a classe genérica Gen e a 
segunda é GetDemo, que usa Gen.
// Classe genérica simples.
// Aqui, T é um parâmetro de tipo que
// será substituído pelo tipo real quando
// um objeto de tipo Gen for criado.
class Gen<T> {
 T ob; // declara um objeto de tipo T
Declara uma classe genérica. T é o 
parâmetro de tipo genérico.
P: Ouvi dizer que os genéricos Java são semelhantes aos templates de C++. É isso
mesmo?
R: Sim, os genéricos Java são semelhantes aos templates de C++. O que Java chama de
tipo parametrizado, C++ chama de template. No entanto, os genéricos Java e os tem-
plates C++ não são iguais e há algumas diferenças básicas entre as duas abordagens 
de tipos genéricos. Geralmente, a abordagem Java é mais fácil de usar.
Uma advertência: se você tiver experiência em C++, é importante não tirar con-
clusões precipitadas sobre como os genéricos funcionam em Java. As duas abordagens 
de código genérico diferem de maneiras sutis, mas básicas.
Pergunte ao especialista
55
Capítulo 13 Tipos genéricos 
 // Passa para o construtor uma
 // referência a um objeto de tipo T
 Gen(T o) {
 ob = o;
 }
 // Retorna ob.
 T getob() {
 return ob;
 }
 // Exibe o tipo de T.
 void showType() {
 System.out.println("Type of T is " +
ob.getClass().getName());
 }
 }
// Demonstra a classe genérica.
class GenDemo {
 public static void main(String args[]) {
 // Cria uma referência Gen para Integers.
 Gen<Integer> iOb;
 // Cria um objeto Gen<Integer> e atribui sua
 // referência a iOb. Observe o uso do autoboxing no
 // encapsulamento do valor 88 dentro de um objeto Integer.
 iOb = new Gen<Integer>(88);
 // Exibe o tipo de dado usado por iOb.
 iOb.showType();
 // Obtém o valor de iOb. Observe
 // que nenhuma coerção é necessária.
 int v = iOb.getob();
 System.out.println("value: " + v);
 System.out.println();
 // Cria um objeto Gen para Strings.
 Gen<String> strOb = new Gen<String>("Generics Test");
 // Exibe o tipo de dado usado por strOb.
 strOb.showType();
 // Obtém o valor de strOb. Novamente, observe
 // que nenhuma coerção é necessária.
 String str = strOb.getob();
 System.out.println("value: " + str);
 }
}
Cria uma referência a um 
objeto de tipo Gen<Integer>.
Instancia um objeto 
de tipo Gen<Integer>.
Cria uma referência e um 
objeto de tipo Gen<String>.
56
Java para Iniciantes
A saída produzida pelo programa é mostrada abaixo:
Type of T is java.lang.Integer
value: 88
Type of T is java.lang.String
value: Generics Test
Examinemos esse programa com detalhes. Primeiro, observe como Gen é de-
clarada pela linha a seguir:
class Gen<T> {
Aqui, T é o nome de um parâmetro de tipo. Esse nome é usado como espaço reser-
vado para o tipo real que será passado para Gen quando um objeto for criado. Logo, 
T será usado dentro de Gen sempre que o parâmetro de tipo for necessário. Observe 
que T está dentro de < >. Essa sintaxe pode ser generalizada. Sempre que um pa-
râmetro de tipo estiver sendo declarado, ele será especificado dentro de colchetes 
angulares (< >). Já que Gen usa um parâmetro de tipo, é uma classe genérica.
Na declaração de Gen, não há um significado especial no nome T. Qualquer 
identificador válido poderia ter sido usado, mas o uso deT é tradicional. Além disso, 
é recomendável que os nomes dos parâmetros de tipo tenham apenas um caractere: 
uma letra maiúscula. Outros nomes de parâmetros de tipo normalmente usados são 
V e E.
Em seguida, T é usado para declarar um objeto chamado ob, como mostrado 
abaixo:
T ob; // declara um objeto de tipo T
Como explicado, T é um espaço reservado para o tipo real que será especificado 
quando um objeto Gen for criado. Logo, ob será um objeto do tipo passado para T. 
Por exemplo, se o tipo String for passado para T, então, nesse caso, ob será de tipo 
String.
Agora, considere o construtor de Gen:
Gen(T o) {
 ob = o;
}
Observe que seu parâmetro, o, é de tipo T. Ou seja, o tipo real de o será determinado 
pelo tipo passado para T quando um objeto Gen for criado. Além disso, já que tanto 
o parâmetro o quanto a variável membro ob são de tipo T, ambos terão o mesmo tipo
quando da criação de um objeto Gen.
O parâmetro de tipo T também pode ser usado para especificar o tipo de retor-
no de um método, como ocorre com o método getob( ), mostrado aqui:
T getob() {
 return ob;
}
Já que ob também é de tipo T, seu tipo é compatível com o tipo de retorno especifi-
cado por getob( ).
57
Capítulo 13 Tipos genéricos 
O método showType( ) exibe o tipo de T. Ele faz isso chamando getName( ) 
no objeto Clas retornado pela chamada a getClass( ) em ob. Não usamos esse recur-
so antes, logo, vamos examiná-lo em detalhes. Você deve lembrar que, no Capítulo 
7, vimos que a classe Object define o método getClass( ). Portanto, getClass( ) é 
membro de todos os tipos de classe. Ele retorna um objeto Class correspondente ao 
tipo de classe do objeto em que foi chamado. Class é uma classe definida dentro de 
java.lang que encapsula informações sobre outra classe. Ela define vários métodos 
que podem ser usados na obtenção de informações sobre uma classe no tempo de 
execução. Entre eles, está o método getName( ), que retorna uma representação do 
nome da classe na forma de string.
A classe GenDemo demonstra a classe genérica Gen. Primeiro, ela cria uma 
versão de Gen para inteiros, como vemos abaixo:
Gen<Integer> iOb;
Examine bem essa declaração. Primeiro, observe que o tipo Integer é especificado 
dentro de colchetes angulares após Gen. Nesse caso, Integer é um argumento de tipo 
que é passado para o parâmetro de tipo de Gen, que é T. Isso cria uma versão de Gen 
em que todas as referências a T são convertidas para referências a Integer. Logo, 
para essa declaração, ob é de tipo Integer e o tipo de retorno de getob( ) também.
Antes de prosseguirmos, é preciso dizer que o compilador Java não cria real-
mente versões diferentes de Gen ou de qualquer outra classe genérica. Embora seja 
útil pensar assim, não é o que acontece. Em vez disso, o compilador remove todas as 
informações do tipo genérico, substituindo pelas coerções necessárias, para fazer o có-
digo se comportar como se uma versão específica de Gen fosse criada. Logo, na ver-
dade, há apenas uma versão de Gen no programa. O processo de remover informações 
do tipo genérico se chama erasure e ele será discutido posteriormente neste capítulo.
A próxima linha atribui a iOb uma referência a uma instância de uma versão 
Integer da classe Gen.
iOb = new Gen<Integer>(88);
Observe que quando o construtor de Gen é chamado, o argumento de tipo Integer 
também é especificado. Isso é necessário porque o objeto (nesse caso, iOb) ao qual a 
referência está sendo atribuída é de tipo Gen<Integer>. Logo, a referência retornada 
por new também deve ser de tipo Gen<Integer>. Se não for, ocorrerá um erro de 
tempo de compilação. Por exemplo, a atribuição a seguir causará um erro de tempo 
de compilação:
iOb = new Gen<Double>(88.0); // Erro!
Já que iOb é de tipo Gen<Integer>, não pode ser usada para referenciar um objeto 
de Gen<Double>. Esse tipo de verificação é um dos principais benefícios dos gené-
ricos porque assegura a segurança dos tipos.
Como os comentários do programa informam, a atribuição
iOb = new Gen<Integer>(88);
faz uso do autoboxing para encapsular o valor 88, que é um int, em um Integer. 
Isso funciona porque Gen<Integer> cria um construtor que recebe um argumento 
58
Java para Iniciantes
Integer. Já que um Integer é esperado, Java encapsulará automaticamente 88 dentro 
dele. É claro que a atribuição também poderia ter sido escrita explicitamente, da 
seguinte forma:
iOb = new Gen<Integer>(new Integer(88));
No entanto, não teríamos vantagem usando essa versão.
Em seguida, o programa exibe o tipo de ob dentro de iOb, que é Integer. De-
pois, obtém o valor de ob usando a linha abaixo:
int v = iOb.getob();
Como o tipo de retorno de getob( ) é T, que foi substituído por Integer quando iOb 
foi declarada, ele também é Integer, que é encapsulado em int quando atribuído a v 
(que é um int). Logo, não há necessidade de converter o tipo de retorno de getob( ) 
para Integer.
Agora, GenDemo declara um objeto de tipo Gen<String>:
Gen<String> strOb = new Gen<String>("Generics Test");
Como o argumento de tipo é String, T é substituído por String dentro de Gen. Isso 
cria (conceitualmente) uma versão String de Gen, como as linhas restantes do pro-
grama demonstram.
Genéricos só funcionam com tipos de referência
Na declaração de uma instância de um tipo genérico, o argumento de tipo passado 
para o parâmetro de tipo deve ser um tipo de referência. Você não pode usar um tipo 
primitivo, como int ou char. Por exemplo, com Gen, é possível passar qualquer tipo 
de classe para T, mas você não pode passar um tipo primitivo para T. Logo, a decla-
ração a seguir é inválida:
Gen<int> intOb = new Gen<int>(53); // Erro, não pode usar um tipo primitivo
Certamente, não poder especificar um tipo primitivo não é uma restrição grave, por-
que você pode usar os encapsuladores de tipos (como fez o exemplo anterior) para 
encapsular um tipo primitivo. Além disso, o mecanismo Java de autoboxing e autou-
nboxing torna o uso do encapsulador de tipos transparente.
Tipos genéricos diferem de acordo com seus 
argumentos de tipo
Um ponto-chave que devemos entender sobre os tipos genéricos é que uma referên-
cia de uma versão específica de um tipo genérico não tem compatibilidade de tipo 
com outra versão do mesmo tipo genérico. Por exemplo, supondo o programa que 
acabei de mostrar, a linha de código abaixo está errada e não será compilada:
iOb = strOb; // Errado!
Ainda que tanto iOb quanto strOb sejam de tipo Gen<T>, são referências a tipos 
diferentes porque seus argumentos de tipo diferem. Isso faz parte da maneira como 
os genéricos adicionam segurança de tipos e evitam erros.
59
DICA DO PROFESSOR
Veja no vídeo a seguir os conceitos de classes com tipos genéricos.
Conteúdo interativo disponível na plataforma de ensino!
EXERCÍCIOS
1) Em relação a tipos genéricos, marque a alternativa INCORRETA.
A) O tópico genérico é extenso.
B) Genéricos não são tipos primitivos de dados.
C) Quando declaramos um atributo como String, estamos declarando como genérico.
D) Com um genérico você pode definir um algoritmo apenas uma vez, independentemente do
tipo de dados.
E) Com genéricos, podemos reutilizar código.
2) Nos fundamentos dos tipos genéricos, quando utilizamos o termo “genérico”, estamos
nos referindo a:
A) Estrutura de herança.
B) Um tipo primitivo de dados que pode receber qualquer valor.
60
C) Quando uma aplicação pode ser executada sem o método main em java.
D) Usamos variáveis de referência ao instanciarmos uma classe.
E) Quando nos referimos a tipos parametrizados.
3) Para declararmos uma classe que utilizará tipos genéricos, utilizamos qual sintaxe?
A) class NomeDaClasse{ //implementação. }
B) class abstract NomeDaClasse{ //implementação. }
C) class NomeDaClasse extends Generica{ //implementação. }
D) class NomeDaClasse implements Generica{ //implementação. }
E) class NomeDaClasse <Parâmetro de tipo>{ //implementação. }
Analise o código e marque a alternativa INCORRETA. 
1 - class Gen<T>{ 
2 - T ob; 
3 - 
4 -

Outros materiais