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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

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

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

Prévia do material em texto

PROGRAMAÇÃO II
Professor Dr. Edson A. Oliveira Junior
Professor Me. Rogério de Leon Pereira
GRADUAÇÃO
Unicesumar
Reitor
Wilson de Matos Silva
Vice-Reitor
Wilson de Matos Silva Filho
Pró-Reitor de Administração
Wilson de Matos Silva Filho
Pró-Reitor de EAD
Willian Victor Kendrick de Matos Silva
Presidente da Mantenedora
Cláudio Ferdinandi
NEAD - Núcleo de Educação a Distância
Direção Operacional de Ensino
Kátia Coelho
Direção de Planejamento de Ensino
Fabrício Lazilha
Direção de Operações
Chrystiano Mincoff
Direção de Mercado
Hilton Pereira
Direção de Polos Próprios
James Prestes
Direção de Desenvolvimento
Dayane Almeida 
Direção de Relacionamento
Alessandra Baron
Gerência de Produção de Conteúdo
Juliano de Souza
Supervisão do Núcleo de Produção de 
Materiais
Nádila de Almeida Toledo
Coordenador de Conteúdo
Danillo Xavier Saes
Design Educacional
Camila Zaguini Silva
Fernando Henrique Mendes 
Nádila de Almeida Toledo
Rossana Costa Giani 
Iconografia
Amanda Peçanha dos Santos
Ana Carolina Martins Prado
Projeto Gráfico
Jaime de Marchi Junior
José Jhonny Coelho
Arte Capa
André Morais de FreitasEditoração
Editoração
Robson Yuiti Saito
Revisão Textual
Ana Paula da Silva, Flaviana Bersan Santos, 
Jaquelina Kutsunugi, Keren Pardini, Maria 
Fernanda Canova Vasconcelos, Nayara 
Valenciano, Rhaysa Ricci Correa e Viviane 
Favaro Notari
Ilustração
Robson Yuiti Saito
 CENTRO UNIVERSITÁRIO DE MARINGÁ. Núcleo de Educação a 
Distância; JUNIOR, Edson A. Oliveira; Pereira, Rogério de Leon
C397 
 Programação II / Edson A. Oliveira Junior; Rogério de Leon Pe-
reira.
 (Reimpressão revista e atualizada)
 Maringá-Pr.: UniCesumar, 2016. 
 199 p.
“Graduação em Análise e Desenvolvimento de Sistemas - EaD”.
 
 1. Programação 2. Java 3. EaD. I. Título.
ISBN 978-85-8084-605-8
CDD - 22 ed. 005.1
CIP - NBR 12899 - AACR/2
Ficha catalográfica elaborada pelo bibliotecário 
João Vivaldo de Souza - CRB-8 - 6828
Viver e trabalhar em uma sociedade global é um 
grande desafio para todos os cidadãos. A busca 
por tecnologia, informação, conhecimento de 
qualidade, novas habilidades para liderança e so-
lução de problemas com eficiência tornou-se uma 
questão de sobrevivência no mundo do trabalho.
Cada um de nós tem uma grande responsabilida-
de: as escolhas que fizermos por nós e pelos nos-
sos farão grande diferença no futuro.
Com essa visão, o Centro Universitário Cesumar – 
assume o compromisso de democratizar o conhe-
cimento por meio de alta tecnologia e contribuir 
para o futuro dos brasileiros.
No cumprimento de sua missão – “promover a 
educação de qualidade nas diferentes áreas do 
conhecimento, formando profissionais cidadãos 
que contribuam para o desenvolvimento de uma 
sociedade justa e solidária” –, o Centro Universi-
tário Cesumar busca a integração do ensino-pes-
quisa-extensão com as demandas institucionais 
e sociais; a realização de uma prática acadêmica 
que contribua para o desenvolvimento da consci-
ência social e política e, por fim, a democratização 
do conhecimento acadêmico com a articulação e 
a integração com a sociedade.
Diante disso, o Centro Universitário Cesumar al-
meja ser reconhecido como uma instituição uni-
versitária de referência regional e nacional pela 
qualidade e compromisso do corpo docente; 
aquisição de competências institucionais para 
o desenvolvimento de linhas de pesquisa; con-
solidação da extensão universitária; qualidade 
da oferta dos ensinos presencial e a distância; 
bem-estar e satisfação da comunidade interna; 
qualidade da gestão acadêmica e administrati-
va; compromisso social de inclusão; processos de 
cooperação e parceria com o mundo do trabalho, 
como também pelo compromisso e relaciona-
mento permanente com os egressos, incentivan-
do a educação continuada.
Seja bem-vindo(a), caro(a) acadêmico(a)! Você está 
iniciando um processo de transformação, pois quan-
do investimos em nossa formação, seja ela pessoal 
ou profissional, nos transformamos e, consequente-
mente, transformamos também a sociedade na qual 
estamos inseridos. De que forma o fazemos? Criando 
oportunidades e/ou estabelecendo mudanças capa-
zes de alcançar um nível de desenvolvimento compa-
tível com os desafios que surgem no mundo contem-
porâneo. 
O Centro Universitário Cesumar mediante o Núcleo de 
Educação a Distância, o(a) acompanhará durante todo 
este processo, pois conforme Freire (1996): “Os homens 
se educam juntos, na transformação do mundo”.
Os materiais produzidos oferecem linguagem dialó-
gica e encontram-se integrados à proposta pedagó-
gica, contribuindo no processo educacional, comple-
mentando sua formação profissional, desenvolvendo 
competências e habilidades, e aplicando conceitos 
teóricos em situação de realidade, de maneira a inse-
ri-lo no mercado de trabalho. Ou seja, estes materiais 
têm como principal objetivo “provocar uma aproxi-
mação entre você e o conteúdo”, desta forma possi-
bilita o desenvolvimento da autonomia em busca dos 
conhecimentos necessários para a sua formação pes-
soal e profissional.
Portanto, nossa distância nesse processo de cres-
cimento e construção do conhecimento deve ser 
apenas geográfica. Utilize os diversos recursos peda-
gógicos que o Centro Universitário Cesumar lhe possi-
bilita. Ou seja, acesse regularmente o AVA – Ambiente 
Virtual de Aprendizagem, interaja nos fóruns e en-
quetes, assista às aulas ao vivo e participe das discus-
sões. Além disso, lembre-se que existe uma equipe de 
professores e tutores que se encontra disponível para 
sanar suas dúvidas e auxiliá-lo(a) em seu processo de 
aprendizagem, possibilitando-lhe trilhar com tranqui-
lidade e segurança sua trajetória acadêmica.
Diretoria Operacional 
de Ensino
Diretoria de 
Planejamento de Ensino
Professor Dr. Edson A. Oliveira Junior
Bacharel em Informática pela Universidade Estadual de Maringá (UEM), 
Mestre em Ciência da Computação pela Universidade Estadual de Maringá 
(UEM) e Doutor em Ciências de Computação e Matemática Computacional 
pelo Instituto de Ciências Matemáticas e de Computação (ICMC) da 
Universidade de São Paulo (USP). Todos esses títulos foram obtidos na área 
de concentração de Engenharia de Software, em que minha especialidade 
é Linha de Produto de Software e Gerenciamento de Variabilidade, além de 
Arquitetura de Software, Desenvolvimento Baseado em Componentes (DBC), 
Frameworks e Metamodelagem e Modelagem UML. DBC e Frameworks 
são temas de pesquisa que envolvem não só a modelagem de sistemas, 
mas a implementação de sistemas e suas arquiteturas. Participo de vários 
cursos de Pós-Graduação em diversas instituições de ensino superior, 
como a própria UEM, UNIPAR, Faculdade Integrado, UniCesumar, Faculdade 
Alfa, Instituto Paranaense de Ensino e Faculdade Cidade Verde. Possuo as 
seguintes certificações da Tecnologia Java: Sun Certified Java Associate, 
Sun Certified Java Programmer, Sun Certified Java Developer, Sun Certified 
Web Component Developer e Sun Certified Business Component Developer, 
todas elas certificadas pela Sun Microsystems, entre os anos de 2003 e 2007. 
Ministro esta disciplina em cursos de treinamento técnico, graduação e pós-
graduação desde o ano de 2000.
A
U
TO
RE
S
SEJA BEM-VINDO(A)!
Prezado(a) acadêmico(a), é com grande satisfação que apresento a você o livro de Pro-
gramação em Java II. Este material foi elaborado com o objetivo de contribuir em sua 
formação, especialmente a de desenvolvedor(a) de software. Sou o professor Edson A. 
Oliveira Junior, autor deste material. Você pode ter certeza que este material foi prepara-
do com carinho especial para que você possa entender o que essa disciplina pode te tra-
zer de benefício ao longo de sua vida como desenvolvedor(a) e/ou analista de sistemas.
Inicialmente, como você já deve ter lido e exercitado todos osconceitos básicos de Java 
no livro Programação em Java I, este livro abordará conceitos mais avançados de orien-
tação a objetos como sobreposição e sobrecarga em Java. A sobreposição permite rede-
fir o comportamento (implementação) de um método que foi herdado, possibilitando 
que a subclasse possua os dois comportamentos: o herdado e o implementado. Já a 
sobrecarga permite que você use um mesmo identificador (nome) para métodos e cons-
trutores de uma mesma classe, mudando somente a assinatura destes.
A Unidade II abordará classes abstratas e interfaces. As classes abstratas podem possuir 
métodos concretos (com implementação) e métodos abstratos (somente a assinatu-
ra) sem fornecer uma implementação padrão. As subclasses concretas de uma classe 
concreta devem implementar os métodos concretos. Esta é uma forma de garantir que 
o método será implementado de acordo com a classe a qual se destina. Já interfaces 
possuem somente métodos abstratos, porém não fornecem suporte à característica de 
herança.
Na Unidade III, você entenderá os elementos essenciais para se trabalhar com vários 
objetos de uma mesma classe ao mesmo tempo: arrays e coleções Java. Existem vários 
tipos de coleções, cada uma com um propósito e um conjunto de características pró-
prias que são usadas em diversas situações diferentes.
A Unidade IV abordará a criação de interfaces gráficas desktop por meio das API AWT e 
Swing, além de tratamento de exceções. Interfaces gráficas em Java envolvem o projeto 
e a construção de layouts para que os elementos gráficos de interação (botões, caixas, 
campos etc.) possam ser acomodados. Interfaces gráficas não podem dispensar o tra-
tamento de exceções, caracterizadas por interrupções abruptas da execução de código 
Java, sem que o usuário possa ter a chance de interagir com o programa. Para tanto, iso-
lamos esses códigos permitindo que o programa Java não seja simplemente abortado 
sem uma justificativa.
APRESENTAÇÃO
PROGRAMAÇÃO II
Por fim, na Unidade V, serão apresentados os conceitos de persistência de dados por 
meio das APIs JDBC e JPA. JDBC é o método tradicional de armazenamento de dados em 
um banco de dados. Já JPA permite mapear as classes Java para entidades de um banco 
de dados, facilitando a persistência dos dados.
Lembre-se sempre que programar é uma “arte moderna” em que aquele que detém o 
maior poder de abstração possível é aquele que melhor saberá desenvolver os seus pro-
gramas.
Ótima leitura e sucesso em sua vida de desenvolvedor de software.
Prof. Dr. Edson A. Oliveira Junior
APRESENTAÇÃO
SUMÁRIO
09
UNIDADE I
SOBREPOSIÇÃO E SOBRECARGA
15 Introdução
15 O que é Sobreposição 
18 A Anotação @Override 
20 A Reescrita do Método toString ( ) 
22 A Reescrita do Método Equals( ) 
25 Regras para Sobreposição em Java 
26 O Que é Sobrecarga 
36 Considerações Finais 
UNIDADE II
CLASSES ABSTRATAS E INTERFACE
41 Introdução
41 O Que é Classe Abstrata? 
43 Modelando um Projeto com Classes Abstratas 
44 Implementando um Projeto com Classes Abstratas 
50 Regras Sobre Classes e Métodos Abstratos 
56 O Que são Interfaces? 
56 Características das Interfaces 
58 Modelando um Projeto com Interfaces 
59 Implementando um Projeto com Interfaces 
SUMÁRIO
64 Comparando Interfaces e Classes Abstratas
66 Considerações Finais 
UNIDADE III
ARRAYS E COLEÇÕES
73 Introdução 
73 Entendendo um Array 
74 Declarando Arrays de Objetos e de Tipos Primitivos 
76 Construindo Arrays Unidimensionais 
77 Construindo Arrays Multidimensionais 
79 Inicializando Arrays 
83 Passando Arrays para Métodos 
85 Exemplos com Arrays 
92 Visão Geral das Coleções 
93 A Interface List 
98 A Interface Set 
103 A Interface Map 
106 A Interface Queue 
109 Considerações Finais 
SUMÁRIO
11
UNIDADE IV
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
115 Introdução
115 O Que é a Biblioteca Swing? 
116 Criando um Projeto no Netbeans Ide 
117 Criando um Contêiner Jframe 
119 Adicionando Componentes Swing 
120 Construindo a Interface 
126 Escrevendo o Código 
134 Tratamento de Exceções 
134 Captura de Exceções 
136 Definindo Exceções 
137 Hierarquia de Exceções 
138 Declaração de Exceções e a Interface Pública 
140 Considerações Finais 
SUMÁRIO
UNIDADE V
PERSISTÊNCIA DE DADOS COM JPA
148 Introdução
149 JDBC – Java Database Connectivity 
149 Drivers JDBC 
150 Conectando a um Sgdb com Connection 
155 Executando Instruções Sql com Statement 
158 Executando Instruções Sql com Preparedstatement 
162 Recuperando e Utilizando Dados de um RESULTSET 
165 O JPA – Java Persistence Api 
178 Considerações Finais 
197 CONCLUSÃO
199 REFERÊNCIAS
U
N
ID
A
D
E I
Professor Dr. Edson A. Oliveira Junior
SOBREPOSIÇÃO E 
SOBRECARGA
Objetivos de Aprendizagem
 ■ Criar códigos com métodos que utilizam conceitos de sobreposição e 
sobrecarga.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
 ■ O que é sobreposição 
 ■ A anotação Override
 ■ A Reescrita do método toString() e equals()
 ■ Regras para sobreposição em Java
 ■ O que é sobrecarga
 ■ Exemplos de Sobrecarga
 ■ Conversões implícitas
 ■ Construtores com sobrecarga
INTRODUÇÃO
Caro(a) aluno(a), nesta etapa do nosso treinamento iremos trabalhar o conceito 
de sobreposição em Java. É um conceito simples, porém com muitos detalhes, 
detalhes estes que nos farão diferenciar facilmente uma sobreposição de uma 
sobrecarga. Para isto é necessário que os conceitos de herança que já vimos 
esteja muito claro de agora em diante. Faremos alguns exemplos práticos e tam-
bém utilizaremos métodos da classe Object como exemplo de uma sobreposição 
ou reescrita (overriding). Trataremos algumas regras específicas para entender 
melhor nossa utilização de sobreposição. 
O QUE É SOBREPOSIÇÃO 
Bem, já sabemos que sobreposição em Java é algo que vamos entender melhor caso 
já tenhamos visto como se trabalha herança em Java. Por quê? Por que a sobre-
posição nada mais é do que reescrevermos um método que já possuímos. Mas 
como assim já possuímos? É neste ponto que precisamos relembrar alguns con-
ceitos de herança. Bem, vamos lá. Sabemos que por herança nós herdamos tudo 
que contém na nossa classe pai, todos os atributos e métodos, portanto imagine 
a seguinte situação, temos uma classe chamada Aluno, nela temos um atributo 
idAluno e um atributo nome, temos ainda um método chamado imprimeTi-
tulo(). Depois criamos outras duas classes uma chamada AlunoGraduacao 
e AlunoMestrado. Pronto, essas duas classes vão herdar da classe Aluno, por-
tanto já vão possuir tudo que contém em Aluno.
Agora temos a seguinte situação, se nas nossas classes AlunoGraduacao e 
AlunoMestrado nos herdamos de Aluno, isso significa que já temos o método 
imprimeTitulo(), mas o que acontece se nós escrevermos um método com 
este mesmo nome? Isso é sobreposição, também chamado de reescrita. Veja que 
estamos reescrevendo um método que já possuímos, isto é reescrita. Vejamos 
agora como ficou nosso código da nossa Classe Aluno:
15
Introdução
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
public class Aluno {
 // colocamos aqui nossos atributos da classe aluno
 int idAluno;
 String nome;
 String ra;
 String endereco; 
 
 // nosso método imprimeTitulo
 void imprimeTitulo(){
 System.out.println(“Titulos do Aluno”);} 
 }
Quadro 1: Classe Aluno com um simples método que será reescrito
Agora veja como ficou o código da nossa Classe AlunoGraduacao:
public class AlunoGraduacao extends Aluno {
 
 //criamos nosso atributo serie 
 String serie; 
 // criamos nosso método imprimeTitulo 
 void imprimeTitulo(){
 System.out.println(“Titulo de Graduação”);
 } 
 
 }
Quadro 2: Classe estendendo a classe Aluno para usar a sobreposição
E agora veja como ficou o código da nossa classe AlunoMestrado: 
17
O que é Sobreposição 
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
 public class AlunoMestrado extends Aluno {
 
 //criamos nosso atributo notaPosComp
 
 double notaPosComp;
 //criamos nosso método imrpimeTitulo
 void imprimeTitulo(){
 System.out.println(“Tiulo de Mestrado”);
 }
 
 }
Quadro 3: Classe estendendo a classe Aluno para usar a sobreposição
Agora vejamos o comportamento destes métodos. Vamos analisar a seguinte 
situação: temos duas classes que herdaram o mesmo método imprimeTi-
tulo() que está na classe Aluno, agora como será que estes métodos serão 
utilizados por seus objetos? Bom, cada classe tem uma reescrita específica, infor-
mando uma mensagem distinta, portanto seu objeto irá informar este tratamento 
e não o código que está na classe pai Aluno. Criamos uma classe chamada 
TestaAlunos contendo o método main, nesta classe colocamos dois objetos, 
um do tipo AlunoGraduacao e outro do tipo AlunoMestrado, e chama-
mos os métodos imprimeTitulo( ). 
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
Veja como ficou a classe TestaAlunos:
public class TestaAlunos {
 
 public static void main(String[] args) {
 
 //criamos um objeto com os dados de um aluno de graduação 
 AlunoGraduacao ag = new AlunoGraduacao(); 
 //criamos um objeto com os dados de um aluno de mestrado 
 AlunoMestrado am = new AlunoMestrado();
 //chamamos o metodo imprimeTitulo do aluno de graduação
 ag.imprimeTitulo();
 //chamamos o metodo imprimetitulo do aluno de mestrado
 am.imprimeTitulo(); 
 }
}
Quadro 4: Classe com método main para testar a sobreposição
E agora veja o que foi impresso em nosso console:
 Titulo de Graduação
 
 Titulo de Mestrado
Quadro 5: Resultado da impressão dos métodos reescritos
A ANOTAÇÃO @OVERRIDE
Muitos devem se perguntar para que serve esta anotação. Quando criamos uma 
sobreposição costumamos utilizar a anotação @Override que identifica que 
este método está sendo reescrito. Quando usamos a anotação o código, alem de 
legível, obriga ao compilador a aplicar as regras de reescrita para esta marcação. 
Veja como ficou nosso código com a anotação abaixo: 
19
A Anotação @Override
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
public class AlunoGraduacao extends Aluno {
 //criamos nosso atributo serie
 String serie;
 
 //criamos nosso método reescrito imprimeTitulo
 @Override
 void imprimeTitulo(){
 System.out.println(“Titulo de Graduação”);
 } 
 
}
Quadro 6: Classe com a anotação @override
E agora veja como ficou o código da nossa classe AlunoMestrado: 
public class AlunoMestrado extends Aluno {
 //criamos nosso atributo notaPosComp
 double notaPosComp;
 @Override
 void imprimeTitulo(){
 System.out.println(“Titulo de Mestrado”);
 } 
 }
Quadro 7: Classe com a anotação @override 
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
A REESCRITA DO MÉTODO TOSTRING ( )
Caro(a) aluno(a), agora imagine a seguinte situação: criamos uma classe cha-
mada Pessoa. Após isso, criamos uma classe TestaPessoa com um método 
main e instanciamos um objeto do tipo Pessoa, o que acontece se imprimirmos 
direto o objeto em si ao invés de imprimirmos os valores de atributo por atri-
buto? Veja como ficaram nossas classes.
Classe Pessoa:
public class Pessoa { 
 //declaramos o atributo idPessoa 
 int idPessoa; 
 //declaramos o atributo nome da pessoa 
 String nome; 
}
Quadro 8: Classe Pessoa para testar impressão sem o método toString()
Classe TestaPessoa:
public class TestaPessoa {
 public static void main(String[] args) { 
 //cria o objeto do tipo pessoa 
 Pessoa p1 = new Pessoa(); 
 //passa um valor para o idPessoa 
 p1.idPessoa = 1; 
 //passa um valor para o nome da pessoa 
 p1.nome = “João”; 
 //imprime os dados do objeto pessoa
 System.out.println(p1); 
 } 
}
Quadro 9: Classe com método main para testar a impressão sem o método toString( )
Bom o que sairia em nosso console com esta impressão?
21
A Reescrita do Método Tostring ( )
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
 main.Pessoa@1befab0
Quadro 10: Resultado da impressão sem o método toString( )
Veja que nossa impressão não foi algo que um usuário gostaria de visualizar, 
portanto vejamos: Se eu mando a impressão de um objeto a JVM procure na 
nossa classe se ela tem um critério de formatação para apresentar este objeto, 
este critério nós colocamos para ela, e fazemos isso sobrepondo um método da 
classe Object chamado toString( ). Portanto, na reescrita do método 
toString( ) é que definimos como queremos apresentar nosso objeto em 
impressão.
Veja como ficou a reescrita do método:
public class Pessoa { 
 //declaramos o atributo idPessoa 
 int idPessoa; 
 //declaramos o atributo nome da pessoa 
 String nome;
 @Override
 public String toString() {
 return “Código: “ + idPessoa + “ Nome= “ + nome;
 } 
}
Quadro 11: Classe Pessoa com o método toString()
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
E veja como ficou a impressão em nosso console:
 Código: 1 Nome= João
Quadro 12: Resultado da impressão com o método toString( )
A REESCRITA DO MÉTODO EQUALS( )
Caro(a) aluno(a), vamos agora imaginar uma nova situação, imagine que esta-
mos desenvolvendo uma aplicação que cadastre cidades, para isso criamos uma 
classe chamada Cidade depois criamos uma classe com o método main cha-
mada App. Nossos objetos do tipo Cidade serão armazenados em uma lista 
com objetos do tipo Cidade. Nesta rotina, quando um usuário for excluir ou 
alterar uma cidade, faremos uma busca por código, o usuário digita um código 
e por meio deste código faremos a pesquisa para encontrar o objeto em ques-
tão, bom, aí vem o nosso problema, o usuário digita somente um código, e não 
um objeto inteiro, portanto como faremos para mediante este código procurar 
um objeto? Quando a JVM compara dois objetos ela verifica primeiramente se 
existe um critério de comparação para este objeto, se existe ela obedece ao cri-
tério que foi definido, este critério, portanto é definido na reescrita do método 
equals() que é mais um método da classe Objetc. Vejamos o seguinte exem-
plo no qual criamos uma classe Pessoa
23
A Reescrita do Método Equals()
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
public class Pessoa { 
 //declaramos o atributo idPessoa 
 int idPessoa; 
 //declaramos o atributo nome da pessoa 
 String nome;
 @Override
 public String toString() {
 return “Código: “ + idPessoa + “ Nome= “ + nome;
 } 
 @Override
 public boolean equals(Object obj) {
 return ((Pessoa)obj).idPessoa==this.idPessoa;
 } 
}
Quadro 13: Classe Pessoa com reescrita do método equals( )
Nesta classe reescrevemos o método equals( ) e definimos que o critério 
de comparação de objetos será apenas o atributo idPessoa, isto significa que 
quando a JVM fizer uma comparação de objetos, o critério adotado por ela para 
fazer esta comparação será somente a comparação do atributo idPessoa.
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
import java.util.ArrayList;
import java.util.List;
public class TestaEquals {
 public static void main(String[] args) { 
 //cria nossa lista para preencher os objetos
 List dados = new ArrayList();
 Pessoa p1 = new Pessoa();
 p1.idPessoa = 1;
 p1.nome = “Douglas”; 
 Pessoa p2 = new Pessoa();
 p2.idPessoa = 2;
 p2.nome = “Edson”; 
 Pessoa p3 = new Pessoa();
 p3.idPessoa = 3;
 p3.nome = “Fabio”;
 //cria um objeto chamado p4 somente com um id já 
existente 
 Pessoa p4 = new Pessoa();
 p4.idPessoa = 3;
 //adiciona os objetos na lista 
 dados.add(p1);
 dados.add(p2);
 dados.add(p3);
 //remove da lista o objeto p4 que não foi adicionado 
 dados.remove(p4);
 //buscamos agora na lista o objeto p3 
 int indice = dados.indexOf(p3); 
 System.out.println(indice);
 int total = dados.size();
 System.out.println(total);
 }
}
Quadro 14: Classe com o método main para testar a usabilidade do método equals( )
Como vimos no código acima criamos uma lista e adicionamos objetos nela do 
tipo Pessoa, depois criamos um objeto do tipo Pessoa somente com um 
código que já existia em outro objeto, note que este objeto fica sem nome e ele 
tem somente um código e este código é o mesmo de outro objeto já existente. 
Depois mandamos remover da lista um objeto que não foi adicionado à lista, neste 
25
Regras para Sobreposição em Java
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
momento a JVM verifica se existe um critério de comparação na classe Pessoa, 
caso exista ela obedece este critério que no nosso caso está definindo compara-
ção apenas pelo atributo idPessoa. Desta forma a JVM percorre os objetos da 
lista e verifica se o objeto que foi mencionado para remoção tem o idPessoa 
e sendo encontrado o objeto ela remove, depois imprimimos o total de objetos 
da lista e podemos identificar que ele foi realmente removido.
REGRAS PARA SOBREPOSIÇÃO EM JAVA
Caro(a) aluno(a), devemos sempre lembrar um detalhe muito importante para 
usar a sobreposição em Java, algumas regras que devem ser respeitadas para 
que possamos ter uma sobreposição correta. Quando um método é sobreposto, o 
mesmo não pode restringir um grau de acessibilidade do método sobreposto, ou 
seja, se eu tenho um método. Veja um exemplo: alteramos a nossa classe Aluno 
e colocamos nosso método imprimeTitulo( ) como Protected, assim 
os métodos sobrepostos por meio dele deverão conter o modificador de acesso 
como protected ou public. Veja abaixo:
public class Aluno {
 int idAluno;
 String nome;
 String ra;
 String endereco; 
 protected void imprimeTitulo(){
 System.out.println(“Titulos do Aluno”);
 } 
}
Quadro 15: Classe Aluno para exemplificar as regras referentes à sobreposição
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
Como vemos abaixo nossa reescrita do método imprimeTitulo() deve ser 
com o modificador protected ou public não restringindo assim o grau de aces-
sibilidade do método sobreposto.
Veja como ficou nossa classe AlunoGraduacao: 
 public class AlunoGraduacao extends Aluno { 
 String serie; 
 @Override
 protected void imprimeTitulo(){
 System.out.println(“Titulo de Graduação”);
 } 
}
Quadro 16: Classe AlunoGraducao para exemplificar as regras referentes à sobreposição
O QUE É SOBRECARGA 
Caro(a) aluno(a), é importante aqui no início do nosso trabalho com a sobre-
carga, que tenhamos claro as diferenças entre sobreposição e sobrecarga. A 
sobreposição, como já vimos, nada mais é do que escrever um método que já 
possuímos, sendo possível pelos recursos de herança, já a sobrecarga consiste 
no recurso que a linguagem Java nos oferece de escrever métodos com o mesmo 
nome, fazendo-se a distinção apenas pelos parâmetros de entrada que obrigato-
riamente precisam ser diferentes.
O recurso oferecido pela sobrecarga vai nos ajudar muito, pois podemos 
trabalhar métodos com mesmo nome, mas de várias formas diferentes sem 
perder o sentido do que o método se propõe a oferecer. Como na figura acima, 
imagine a seguinte situação, seu sistema precisa fazer um cadastro de cliente, 
sendo este cliente tanto pessoa física, quanto pessoa jurídica, se for pessoa física 
o sistema irá fazer uma validação de CPF no momento em que é preenchido o 
cadastro, mas caso nosso cliente seja pessoa jurídica, o sistema irá fazer uma 
27
O Que é Sobrecarga 
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
validação de CNPJ. Tanto o CPF quanto o CNPJ são campos que tem a mesma 
função, só que um se refere a pessoa física e a outra a jurídica. Podemos criar 
dois métodos com o mesmo nome, mas que possuem parâmetros de entrada 
diferentes e podemos fazer a chamada do método com o mesmo nome, todavia 
em um momento passaremos um CPF para ser validado e em outro momento 
passaremos um CNPJ para ser validado.
Exemplos de Sobrecarga
Caro(a) aluno(a), vejamos então alguns exemplos de sobrecarga para entender 
melhor. Vamos começar com um exemplo bem simples, vamos criar uma classe 
chamada ExemplosSobreCarga e nesta classe vamos colocar um método 
chamado calculaNumeroMaior( ). No primeiro momento nosso método 
receberá apenas dois parâmetros de entrada, que serão duas variáveis do tipo 
double, depois criaremos outro método com o mesmo nome, mas vamos pas-
sar três números para serem verificados dentre os três o maior.
Veja como ficou nossa classe ExemplosSobreCarga( ):
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
public class ExemplosSobrecarga {
 //criamos aqui a variável maior que será usada na verificação 
do 
 // maior numero digitado
 double maior;
 //método que verifica o maior entre dois números digitados
 public double calculaNumeroMaior(double n1, double n2){ 
 if (n1 == n2){
 maior = 0;
 }else if(n1 > n2){
 maior = n1;
 }else if(n2 > n1){
 maior = n2;
 } 
 return maior;
 } 
 
 //metodo que verifica o maior numeor entre ter números 
digitados
 public double calculaNumeroMaior(double n1, double n2, doublen3){
 if ( (n1>n2) && (n1>n3) ){
 maior = n1;
 }else if ( (n2>n1) && (n2>n3) ){
 maior = n2;
 }else if ( (n3>n1) && (n3>n2) ){
 maior = n3;
 }else {
 maior = 0;
 } 
 return maior;
 } 
}
Quadro 17: Classe com exemplo de sobrecarga
Agora veja como ficou nossa classe TestaSobreCarga:
29
O Que é Sobrecarga 
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
import javax.swing.JOptionPane;
import main.ExemplosSobrecarga;
public class TestaSobreCarga {
 public static void main(String[] args) {
 double n1,n2,n3,maior; 
 //testando o primeiro metodo
 n1 = Double.parseDouble(JOptionPane.showInputDialog(
 “Digite o primeiro numero:”));
 n2 = Double.parseDouble(JOptionPane.showInputDialog(
 “Digite o segundo numero:”)); 
 
 ExemplosSobrecarga e1 = new ExemplosSobrecarga();
 maior = e1.calculaNumeroMaior(n1, n2);
 JOptionPane.showMessageDialog(null,”Maior numero 
digitado: “+
 maior);
 
 //testando o primeiro segundo metodo
 n1 = Double.parseDouble(JOptionPane.showInputDialog(
 “Digite o primeiro numero:”));
 n2 = Double.parseDouble(JOptionPane.showInputDialog(
 “Digite o segundo numero:”)); 
 n3 = Double.parseDouble(JOptionPane.showInputDialog(
 “Digite o terceiro numero:”)); 
 
 ExemplosSobrecarga e2 = new ExemplosSobrecarga();
 maior = e2.calculaNumeroMaior(n1, n2, n3);
 JOptionPane.showMessageDialog(null,”Maior numero 
digitado: “+
 maior); 
 } 
}
Quadro 18: Classe com método main para testar sobrecarga
Executando este nosso código, podemos ver claramente que temos a utilização 
de um método que verifica o maior número, porém de duas formas diferentes: 
no primeiro passamos dois números para serem verificados, no segundo pas-
samos três números para serem verificados. Os dois métodos contêm o mesmo 
nome, mas com parâmetros de entrada diferentes. Este é um exemplo bem sim-
ples de sobrecarga.
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
Caro(a) aluno(a), podemos também perceber que os parâmetros de entrada 
podem se diferenciar somente pelo tipo de dados que estamos passando para o 
método. Como exemplo, vamos criar uma classe chamada SegundoExemplo. 
Esta classe contém dois métodos chamados retornaDddMascara( ), neste 
método vamos passar primeiro um DDD do tipo int e depois um DDD do tipo 
string e o método vai nos retornar somente uma string com o DDD for-
matado com mascara.
Veja como ficou a classe SegundoExemplo:
 public class SegundoExemplo {
 // criamos aqui uma string que sera o ddd formatado
 String dddComMascara;
 //criamos aqui um metodo que retorna o ddd formatado 
recebendo
 //um DDD to dipo int
 String retornaDddMascara(int ddd){
 dddComMascara = “(“ +ddd+ “)”;
 return dddComMascara;
 }
 
 //criamos aqui um metodo que retorna o ddd formatado 
recebendo
 //um DDD to dipo string
 String retornaDddMascara(String ddd){
 dddComMascara = “(“ +ddd+ “)”;
 return dddComMascara;
 } 
}
Quadro 19: Classe do segundo exemplo de sobrecarga
Agora veja como ficou nossa classe TestaDdd:
31
O Que é Sobrecarga 
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
import javax.swing.JOptionPane;
public class TestaDdd {
 public static void main(String[] args) {
 //criamos aqui duas variaveis para ddd uma int oura 
string
 int ddd;
 String strDdd;
 //vamos ler aqui a variavel ddd que é integer
 ddd = Integer.parseInt(JOptionPane.showInputDialog(
 “Digite o ddd de sua cidade:”) );
 //vamos ler aqui a variavel ddd que é string
 strDdd = JOptionPane.showInputDialog(“Digite o ddd de sua 
cidade:”);
 
 SegundoExemplo se = new SegundoExemplo();
 //vamos imprimir primeiro o ddd int com mascara
 JOptionPane.showMessageDialog(null,”DDD int com mascara: 
“+
 se.retornaDddMascara(ddd));
 //vamos imprimir agora o ddd string com mascara
 JOptionPane.showMessageDialog(null,”DDD string com 
mascara: “+
 se.retornaDddMascara(strDdd));
 }
}
Quadro 20: Classe com método main para testar sobrecarga
Portanto, executando nosso código vamos concluir que podemos criar méto-
dos com mesmo nome e até os nomes dos parâmetros de entradas iguais, nomes 
e quantidade tendo apenas o tipo de dados diferentes. Assim, como no exem-
plo acima, nós podemos usar o método retornaDddMascara() passando 
tanto um DDD do tipo int como passando um DDD do tipo String, o sentido de 
utilização do método é o mesmo, mas em várias situações no dia a dia de nossa 
programação teremos casos deste gênero, em que um mesmo método que se 
comporta da mesma forma pode receber o mesmo valor de entrada só que com 
tipos de dados diferentes.
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
CONVERSÕES IMPLÍCITAS
Caro(a) aluno(a), também é possível usar conversões implícitas em nos-
sos métodos utilizados na sobrecarga, embora dependendo da situação 
nossos valores fiquem incorretos. Veja um exemplo: criamos uma classe cha-
mada ConversaoImnplicita e depois criamos outra classe chamada 
TestaCovnersaoImplicita, se o valor passado no argumento for válido 
pela conversão implícita o método poderá ser utilizado sem erro de execução, mas 
seus valores poderão sofrer alterações, como podemos ver no exemplo abaixo:
 public class ConversaoImplicita { 
 int retornaQuadradoNumero(int numero){
 numero = numero * numero; 
 return numero;
 }
}
Quadro 21: Classe para exemplo de conversão Implícita usada na sobrecarga
Agora veja como ficou nossa classe TestaConversaoImplicita:
public class TestaConversaoImplicita {
 public static void main(String[] args) {
 ConversaoImplicita c1 = new ConversaoImplicita();
 JOptionPane.showMessageDialog(null,”Quadrado de 3= “ + 
c1.retornaQuadradoNumero(3) );
 JOptionPane.showMessageDialog(null,”Quadrado de 3= “ + 
c1.retornaQuadradoNumero(‘3’));
 } 
}
Quadro 22: Classe com método main para testar conversão implícita
33
O Que é Sobrecarga 
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
CONSTRUTORES COM SOBRECARGA
Caro(a) aluno(a), quando falamos de sobrecarga, abre-se um leque muito 
grande de recursos que ajudam e muito na nossa programação do dia a dia. Um 
recurso muito utilizado é usar sobrecarga com o construtor da classe. Veja, 
sabemos que o construtor é o primeiro método a ser executado quando instan-
ciamos um objeto, ou seja, quando nós instanciamos é executado o da classe, 
vamos ver um exemplo simples do construtor e entender por que se faz neces-
sário em vários momentos usarmos sobrecarga no construtor. Vamos criar uma 
classe chamada Cliente com um construtor vazio veja:
public class Cliente {
 //criamos aqui um constructor vazio para a classe
 public Cliente() { 
 } 
 //criamos aqui atributosnormais de uma classe Cliente
 int codigo;
 String nome;
 String cpf;
 String endereco; 
}
Quadro 23: Classe para exemplificar construtores sem sobrecarga
Agora vejamos como fica nossa classe que instancia a classe Cliente. Vamos 
dar o nome a ela de TestaCliente:
public class TestaCliente {
 public static void main(String[] args) {
 //veja instanciamos um objeto do tipo cliente
 //neste momento estamos executando o construtor
 // que definimos como vazio 
 Cliente c1 = new Cliente();
 }
}
Quadro 24: Classe com método main para testar construtores sem sobrecarga
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
Caro(a) aluno(a), veja que quando fazemos isso, nossos atributos do objeto c1 
estão nulos, ou seja, ainda sem valor, agora, imagine a seguinte situação, se nós 
já no momento em que vamos instanciar o objeto c1 precisarmos passar valo-
res para os atributos, como faríamos isto? É ai que podemos usar a sobrecarga 
com os construtores, pois podemos já criar um objeto e iniciar os atributos com 
valores já no momento de instanciar. Se usarmos a sobrecarga podemos ins-
tanciar o objeto das duas formas diferentes passando valores iniciais ou não 
passando valores iniciais.
Veja como ficou nossa classe Cliente:
 public class Cliente { 
 //criamos aqui atributos normais de uma classe Cliente
 int codigo;
 String nome;
 String cpf;
 String endereco;
 //criamos aqui um constructor vazio para a classe
 public Cliente() { 
 }
 //criamos aqui outro constructor passando valores
 //de entrada para inicializar os atributos
 public Cliente(int codigo, String nome, String cpf, String 
endereco) {
 this.codigo = codigo;
 this.nome = nome;
 this.cpf = cpf;
 this.endereco = endereco;
 }
}
Quadro 25: Classe com construtores usando sobrecarga
Agora veja como ficou nossa classe TestaCliente:
35
O Que é Sobrecarga 
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
import javax.swing.JOptionPane;
public class TestaCliente {
 public static void main(String[] args) {
 //criamos aqui os atributos a serem lidos
 //referente ao cliente 1 e cliente 2
 int codigo;
 String nome;
 String cpf;
 String endereco;
 //aqui lemos os valores dos atributos pelo usuaio
 //referente ao primeiro cliente
 codigo = Integer.parseInt(JOptionPane.
showInputDialog( 
 “Digite o codigo do primeiro cliente:”));
 nome = JOptionPane.showInputDialog(
 “Digite o nome do primeiro cliente”);
 cpf = JOptionPane.showInputDialog(
 “Digite o cpf do primeiro cliente”);
 endereco = JOptionPane.showInputDialog(
 “Digite o endereço do primeiro cliente”);
 //criamos um objeto do tipo cliente e usamos um
 //construtor vazio, passamos os valores para 
 //os atributos depois dele instanciado 
 Cliente c1 = new Cliente();
 c1.codigo = codigo;
 c1.nome = nome;
 c1.cpf = cpf;
 c1.endereco = endereco;
 //aqui lemos os valores dos atributos pelo usuaio
 //referente ao segundo cliente
 codigo = Integer.parseInt(JOptionPane.
showInputDialog( 
 “Digite o codigo do segundo cliente:”));
 nome = JOptionPane.showInputDialog(
 “Digite o nome do segundo cliente”);
 cpf = JOptionPane.showInputDialog(
 “Digite o cpf do segundo cliente”);
 endereco = JOptionPane.showInputDialog(
 “Digite o endereço do segundo cliente”);
 //aqui então instanciamos o objeto passando para 
 //o construtor os valores dos atributos já neste
SOBREPOSIÇÃO E SOBRECARGA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
I
 //momento
 Cliente c2 = new Cliente(codigo,nome,cpf,endereco); 
 }
}
Quadro 26: Classe com método main testando construtores com sobrecarga
Caro(a) aluno(a), veja que a sobrecarga em construtores é muito útil e que 
nos oferece uma facilidade muito grande para a flexibilidade na utilização de 
passagem de valores dos atributos. Muitas vezes, objetos de uma mesma classe 
necessitam de serem utilizados de formas diferentes, alguns momentos precisa-
mos passar valor para os atributos, já no momento de instanciar o objeto já em 
outros momentos não temos esta informação e precisamos passar valores para 
os atributos depois, se criarmos somente um construtor que inicializa os atri-
butos quando executado, ficamos sempre obrigados a passar os valores neste 
momento de criação do objeto, se usamos a sobrecarga temos a flexibilidade de 
utilizar as duas formas. 
CONSIDERAÇÕES FINAIS
A Reescrita de método ou sobreposição consiste em reescrever um método 
que minha classe já contenha por herança, ou seja, na superclasse ou classe pai, 
depois na classe filha criamos um método com o mesmo nome, como a classe 
filha herda todos os atributos e métodos da classe pai, significa que ela já tem o 
método, portanto estamos reescrevendo o mesmo.
Aproveitamos o exemplo do construtor para trabalharmos o conceito de 
sobrecarga. Sobrecarga nada mais é do que ter mais de um método com o mesmo 
nome, só que com assinaturas diferentes.
Percebemos que com esse conteúdo podemos facilitar nossa programação 
e também entender um pouco mais sobre os conceitos de orientação a objetos 
utilizada na linguagem Java.
37 
 
1. Crie uma classe chamada Grupo com um método imprimeDescricao() 
apenas imprimindo o texto “Grupo”. Depois crie uma classe chamada SubGru-
po herdando de Grupo, use sobreposição e reescreva o método imprime-
Descricao() e este método deverá imprimir o texto “Sub-Grupo”. Crie uma 
classe chamada Produto herdando de SubGrupo, use sobreposição e rees-
creva o método imprimeDescricao() e este método deverá imprimir o 
texto “Produto”. Obs.: use a anotação @override.
2. Crie uma classe chamada Cidade com os atributos int codigo, String nome, 
String uf. Use sobreposição e reescreva o método toString(), depois crie 
uma classe chamada TestaCidade com o método main, crie um objeto do tipo 
Cidade, passe valores para os atributos e imprima o objeto direto no console, a im-
pressão deverá sair neste formato “Código: 1 Nome: Maringá Estado: PR ”;.
3. Crie uma classe chamada ValidaImpostos e nela coloque dois métodos 
chamados calculaImpostos, só que um método receberá um double 
valor e uma String imposto, e o outro método receberá somente uma 
String imposto, o método que recebe apenas a String imposto verifica se o 
conteúdo da String é “INSS” ou “IR”, se for o primeiro retorna “8” se for o segundo 
retorna “20”. O método que recebe um valor e mais a String imposto calcula o 
valor de imposto pelo valor recebido, por exemplo se chamar o método cal-
culaImpostos(100.00, ‘INSS’) o retorno será “8.00”;.
4. Crie uma classe chamada Fornecedor, adicione os atributos int codigo, 
string razaoSocial e coloque dois construtores, um inicializando os 
atributos e outro vazio, depois crie uma classe TestaFornecedor nela e 
coloque dois objetos do tipo Fornecedor, um usando um construtor e o outro 
objeto o outro construtor.
MATERIAL COMPLEMENTAR
Sobrecarga e sobreposição em Java
Por javafree.org
Fonte: <http://javafree.uol.com.br/artigo/6947/Cap-5-Orientacao-a-Objetos.html>.
Sobreposição (override) em Java
Fonte: <http://www.youtube.com/watch?v=NSH8CvaJ6Qs>.
UN
ID
A
D
E II
Professor Dr. Edson A. Oliveira Junior 
CLASSES ABSTRATAS E 
INTERFACE
Objetivos de Aprendizagem
 ■ Entender o que é a classe Abstrata.
 ■ Entender o que é Interface.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
 ■ O que é classe abstrata
 ■ Modelando um projeto com classes abstratas
 ■ Implementando um projeto com classes abstratas
 ■ Regras sobre classes e métodos abstratos
 ■ O que são Interfaces
 ■ Modelando um Projeto com Interfaces
 ■ Implementando um projeto com Interfaces
 ■ Comparando Interfaces e Classes Abstratas
INTRODUÇÃO
Caro(a) aluno(a), nesta unidade iremos compreender o que são classes abstra-
tas e interfaces e implementar um simples sistema para cada tópico analisado. 
O objetivo é elucidar as dúvidas referentes a esses dois conceitos importantes.
A finalidade de uma classe abstrata é a de funcionar como um modelo para 
as subclasses. Ao contrário de interfaces, classes abstratas podem conter campos 
(atributos) que não são static e final, e elas podem conter métodos não abs-
tratos implementados. Tais classes abstratas são semelhantes às interfaces, exceto 
que elas fornecem uma implementação parcial, deixando a subclasses completar 
a execução. Se uma classe abstrata contém apenas declarações de métodos abs-
tratos, deve ser declarada como uma interface e não como uma classe abstrata.
As interfaces podem ser implementadas por classes em qualquer lugar na 
hierarquia de classe, quer estejam ou não relacionados uns com os outros. Em 
comparação, classe abstrata é uma subclasse de classes semelhantes que têm 
muito em comum (as partes implementadas da classe abstrata), mas também 
tem algumas diferenças (os métodos abstratos).
O QUE É CLASSE ABSTRATA?
Uma classe abstrata é desenvolvida para representar classes e conceitos abstratos. 
A classe abstrata é sempre uma superclasse que não permite que nenhum objeto 
seja criado a partir dela, ou seja, não pode ser instanciada. O uso das classes abs-
tratas é dirigido para a construção de classes que constituirão um modelo, isto é, 
classes abstratas servirão como especificações básicas de novas classes, que serão 
implementadas por meio do mecanismo de herança. Assim, uma classe abstrata 
deve ser estendida, ou seja, deve ser a classe-base de outra, mais específica, que 
contenha os detalhes que não puderam ser incluídos na superclasse (abstrata).
Para formalizar que uma classe seja abstrata, usamos a palavra reservada 
abstract antes da palavra reservada class. Vejamos um exemplo: 
41
Introdução
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
Figura 1: Classe Abstrata
Métodos abstratos são declarados com o modificador abstract. Se uma classe 
tiver algum método abstrato, a classe também deverá obrigatoriamente ser declarada 
com o modificador abstract. Os métodos de uma classe abstrata classificados 
como abstratos devem terminar sempre com ; (ponto e vírgula) e a classe que a 
estender deverá implementá-los. Vejamos um exemplo de método abstrato:
Figura 2: Classe Abstrata
Note que esses métodos não têm uma implementação, isto é, não possuem um 
corpo delimitado por chaves contendo qualquer código. 
Uma classe também pode ser declarada abstrata mesmo que tenha um 
método não abstrato, ou a combinação de métodos abstratos e não abstratos. 
Veja exemplo abaixo:
Figura 3: Classe Abstrata
Como geralmente as classes abstratas pertencem ao nível superior de uma hierar-
quia de classes, recomenda-se que contenham tanto código quanto for possível, 
deixando para suas subclasses apenas as implementações específicas dos méto-
dos abstratos. 
43
Modelando um Projeto com Classes Abstratas
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
É importante lembrar que uma classe abstrata que herda de outra classe 
abstrata não precisará fornecer implementação de todos os métodos abstratos 
herdados.
MODELANDO UM PROJETO COM CLASSES 
ABSTRATAS
Agora que entendemos o que é classe abstrata vamos implementar um simples 
sistema de locadora de Dvds e Cds utilizando os mais variados recursos que 
as classes abstratas oferecem. Lembrando que o sistema a ser desenvolvido é 
meramente instrutivo para que você possa compreender o funcionamento desse 
componente importante da linguagem orientada a objetos. 
É importante observar que o uso do conceito de classes abstratas precisa 
ser modelado nas atividades de aná-
lise e design do projeto, caso contrário, 
se usarmos a técnica de codificação 
direta, talvez nunca apareça a necessi-
dade de usar esse conceito. O programa, 
a seguir, representa a implementação do 
diagrama de classe presente na figura 
abaixo.
A modelagem acima demonstra uma 
árvore de herança com uma classe abs-
trata (ItemAbstrato) e duas concretas 
(Dvd e Cds). Observe que tanto a classe 
como os métodos abstratos estão repre-
sentados com a fonte em itálico e esse 
comportamento representa um padrão 
nas modelagens UML. 
Figura 4: Diagrama de Classe do 
sistema de locadora
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
IMPLEMENTANDO UM PROJETO COM CLASSES 
ABSTRATAS
Vamos seguir a modelagem da figura anterior e implementar um sistema sim-
ples de locadora de Dvds e Cds. 
CRIANDO A CLASSE ABSTRATA ITEMABSTRATO
Primeiramente, vamos criar um projeto no NetBeans IDE 7.3 chamado locadora-
Abstrata; desmarque o campo Criar Classe Principal. Em seguida, crie uma classe 
nova com o nome ItemAbstrato e coloque como nome do pacote locadora.
Figura 5: Criando a classe ItemAbstrato
Agora que temos nossa classe, insira a palavra abstract antes de class 
ItemAbstrato e também os seguintes atributos e métodos abstratos da figura 
abaixo após isso gere os respectivos gets e sets dos atributos:
45
Implementando um Projeto com Classes Abstratas
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
. Figura 6: Classe abstrata ItemAbstrato
Observe que nossa classe ItemAbstrato apresenta a definição de uma classe abs-
trata que representa um item de uma locadora. Nessa classe definimos atributos 
e métodos comuns a um Dvd, Cd. Como a nossa intenção é analisar o compor-
tamento de classes abstratas não será implementado aqui todos os atributos e 
objetos que poderiam existir em uma locadora real, mas sim o elementar para 
compreendermos quando devemos usar classes abstratas. 
CRIANDO A CLASSE DVD QUE HERDARÁ A CLASSE ITEMABSTRATO
Agora vamos criar outra classe chamada Dvd que irá herdar a classe ItemAbstrato. 
Para isso basta acrescentar a palavra-chave extends e logo após o nome da 
classe que desejamos herdar os métodos e atributos, no caso, ItemAbstrato. Veja 
a figura abaixo como ficou nossa classe:
Figura 7: Classe Dvd
Observe na figura acima que o NetBeans IDE faz uma marcação no nome da classe 
Dvd indicando que devemos implementar os métodos da classe pai, ItemAbstrato, 
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
para isso basta posicionar o ponteiro do mouse sobre o nome da classe e pres-
sionar as teclas alt+enter para abrir o menu que implementará todos os métodos 
automaticamenteou você pode utilizar o alt+insert e selecionar quais métodos 
você deseja implementar. Lembrando que uma classe não é obrigada a imple-
mentar todos os métodos abstratos da classe pai.
Figura 8: Classe Dvd
Após gerar os métodos a nossa classe Dvd ficará igual a figura abaixo:
Figura 9: Classe Dvd
Observe que foi gerado todos os métodos abstratos da classe ItemAbstrato. Caso 
o NetBeans IDE gere automaticamente um código para cada método basta ignorá-
-los deletando ou apenas comentando. Note que foi gerado uma anotação acima 
dos métodos: @Override. Embora não seja necessário usar esta anotação reco-
mendo que use, pois você terá a vantagem do compilador verificar algum erro 
de ortografia e/ou erro na combinação dos parâmetros no método da classe pai 
e também tornará seu código mais fácil de ser compreendido.
Agora é necessário implementar o código de cada método. Como o nosso 
objetivo é o estudo das classes abstratas aqui, iremos simplificar o código. Veja 
47
Implementando um Projeto com Classes Abstratas
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
na figura abaixo o código para cada método.
Figura 10: Classe Dvd
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
Observe na figura acima que utilizamos todos os atributos da classe ItemAbstrato 
e também implementamos mais dois novos métodos concretos na classe Dvd: 
(imprimir( ) e getInstance( )). O método estático getInstance( ) retorna uma 
instância da classe Dvd que será utilizada na nossa Classe Principal. Depois fala-
remos mais sobre seu funcionamento.
CRIANDO A CLASSE CD QUE HERDARÁ A CLASSE DVD
Agora, vamos criar mais uma classe chamada Cds e vamos estender da classe 
Dvd conforme pode ser visto na figura abaixo:
Figura 11: Classe Cds
Observe que dessa vez o NetBeans não destacou o nome da Classe forçando a 
implementação dos métodos da classe herdada, pois a classe herdada não é uma 
classe abstrata como o é a classe ItemAbstrato. Porém, assim como a classe Dvd 
que herda diretamente da classe abstrata, a classe Cds passa a poder reutilizar 
todos os atributos e métodos da classe ItemAbstrato e Dvd, como também defi-
nir suas particularidades e usá-las. 
49
Implementando um Projeto com Classes Abstratas
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Dessa forma, vamos implementar a classe Cds conforme a figura abaixo:
Figura 12: Classe Cds
Observe que estamos utilizando métodos da classe ItemAbstrato e também da 
classe Dvd além de escrever métodos exclusivos da classe Cds como o método 
vender( ) e getInstance( ). A classe Cds herda esses métodos, pois eles são públi-
cos e concretos. 
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
REGRAS SOBRE CLASSES E MÉTODOS ABSTRATOS
Alguns pontos interessantes das imagens acima exemplificam algumas das regras 
de criação de classe e métodos abstratos que são:
 ■ Os métodos construtores não podem ser declarados como abstratos. 
Mesmo que a classe abstrata não possa ser instanciada, seus construtores 
podem inicializar os campos da classe que serão usados por subclasses, 
sendo imprescindível em praticamente todos os casos.
 ■ Métodos declarados como abstratos não podem ser privados (private). 
 ■ Classes abstratas não podem conter métodos estáticos (static).
 ■ Os campos de uma classe abstrata serão herdados pelas classes descen-
dentes e poderão ser usados por instâncias destas a não ser que sejam 
declarados como private. 
CRIANDO A CLASSE PROGRAMA PARA EXECUTAR NOSSO SISTEMA
Para finalizar nosso sistema, vamos criar mais uma classe com o método main 
chamada Programa. E nela vamos criar um menu e um método de escolha para 
que possamos chamar todos os métodos implementados em nosso exemplo. Veja 
na figura abaixo o código dessa classe:
51
Regras Sobre Classes e Métodos Abstratos
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura 13: Classe Programa
Explicando o código
Observe que criamos um laço de repetição com o método while( ) sendo 
a condição de parada a variável opcao igual a 0. Fizemos uso também da classe 
java.util.Scanner que permite a leitura de dados vindos do teclado. Com 
o método switch criamos um menu de opções. Cada opção (case) recebe 
uma instância da classe fazendo uso do método getInstance( ). Esse método 
não cria um objeto toda vez que ele é chamado e se torna ideal para o nosso 
exemplo, pois o nosso objetivo é apenas demonstrar o uso e as chamadas dos 
métodos abstratos. 
Agora que você já implementou o código acima execute o programa e visu-
alize os resultados na saída do NetBeans IDE. 
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
run
Digite 0 para SAIR ou a opcao abaixo desejada
1- Cadastrar DVD 2- Emprestar DVD 3- Devolver DVD
4- Cadastrar CDs 5- Vender CD 6- Imprimir CDs
Opcao: 1
DVD Cadastrado: - Cod: 1 - Titulo: Senhor dos Aneis - Situacao: L
DVD cadastrado utilizando método abstrato herdado da classe abstrata Item 
Abstrato
Digite 0 para SAIR ou a opcao abaixo desejada:
1- Cadastrar DVD 2- Emprestar DVD 3- Devolver DVD
4- Cadastrar CDs 5- Vender CD 6- Imprimir CDs
Opcao: 2
Dvd Emprestado: - Situacao: E - Data Emprestimo: 10/03/2013
DVD Emprestado utilizando método abstrato herdado da classe abstrata Item 
Abstrato
Digite 0 para SAIR ou a opcao abaixo desejada:
1- Cadastrar DVD 2- Emprestar DVD 3- Devolver DVD
4- Cadastrar CDs 5- Vender CD 6- Imprimir CDs
Opcao: 3
Dvd Devolvido: - Situacao: E - Data Devolucao: 10/03/2013
DVD Devolvido utilizando método abstrato herdado da classe abstrata ItemAbs-
trato
Digite 0 para SAIR ou a opcao abaixo desejada:
1- Cadastrar DVD 2- Emprestar DVD 3- Devolver DVD
4- Cadastrar CDs 5- Vender CD 6- Imprimir CDs
Opcao: 4
CD Cadastrado: - Cod: 1 - Titulo: The Best of Joy Division - Situacao: L
Cd Cadastrado utilizando método herdado da classe abstrata ItemAbstrato
53
Regras Sobre Classes e Métodos Abstratos
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Digite 0 para SAIR ou a opcao abaixo desejada:
1- Cadastrar DVD 2- Emprestar DVD 3- Devolver DVD
4- Cadastrar CDs 5- Vender CD 6- Imprimir CDs
Opcao: 5
CD Vendido utilizando método concreto da classe Cds
Digite 0 para SAIR ou a opcao abaixo desejada:
1- Cadastrar DVD 2- Emprestar DVD 3- Devolver DVD
4- Cadastrar CDs 5- Vender CD 6- Imprimir CDs
Opcao: 6
Impressao da Lista de CDs método herdado da classe Dvds
Digite 0 para SAIR ou a opcao abaixo desejada:
1- Cadastrar DVD 2- Emprestar DVD 3- Devolver DVD
4- Cadastrar CDs 5- Vender CD 6- Imprimir CDs
Opcao: 0
CONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 0 segundos)
Quadro 27: Resultado do Programa
Importante lembrar que o uso de classes abstratas é realizado com classes que tem 
métodos e atributos em comum, ou pelo menos a maioria. No nosso exemplo 
a mídia DVD possui muito em comum com CDs. Além dos atributos os méto-
dos podem ser utilizados para ambas as classes. O nosso programa de locadorase limitou a cadastrar e vender os CDs, o que não impediria de colocá-los para 
serem alugados assim como os Dvds. 
Item 1: Considerando o uso de métodos de fabricação estáticos ao invés de 
construtores
A maneira comum de uma classe permitir que um cliente obtenha uma instância 
de si próprio é fornecendo um construtor público. Há outra técnica que deve fazer 
parte do kit de ferramentas de qualquer programador. A classe pode fornecer um 
método de fabricação estático público, que é simplesmente um método estático 
que retorna uma instância da classe. Aqui está um exemplo com a classe Boolean 
(a classe primitiva encaixotada referente ao tipo primitivo boolean). Esse método 
converte um valor primitivo boolean em um objeto de referência Boolean:
Observe que um método de fabricação estático não é o mesmo que o padrão Fac-
tory Method de Design Patterns [Gamma95, p. 107]. O método de fabricação estáti-
co descrito neste item, não tem equivalente direto com em Design Patterns.
Uma classe pode oferecer a seus clientes métodos de fabricação estáticos ao invés 
de, ou além de construtores. O Fornecimento de um método de fabricação estático 
em vez de um construtor público apresenta vantagens e desvantagens.
Vantagens (citando o livro):
Uma das vantagens de métodos de fábrica estáticos é que, ao contrário de constru-
tores, eles têm nomes.
Uma segunda vantagem de métodos de fabricação estáticos é que, ao contrário 
de construtores, eles não são obrigados a criar um novo objeto sempre que são 
chamados.
Uma terceira vantagem de métodos de fabricação estáticos é que, diferente dos 
construtores, eles podem retornar um objeto de qualquer subtipo do seu tipo de 
retorno.
A quarta vantagem dos métodos de fabricação estáticos é que eles reduzem a ver-
bosidade na criação de instâncias de tipo parametrizadas.
 public static Boolean valueOf (boolean b) {
 voltar b? Boolean.TRUE: Boolean.FALSE;
 }
55
Desvantagens (ainda citando o livro):
A principal desvantagem do fornecimento exclusivo de métodos de fabricação es-
táticos é que as classes, sem construtores públicos ou protegidos, não podem ter 
subclasse.
Uma segunda desvantagem dos métodos de fabricação estáticos é que não é possí-
vel distingui-los imediatamente de outros métodos estáticos. 
getInstance – retorna uma instância que é descrita pelos parâmetros, mas não temos 
como saber se tem o mesmo valor. No caso de um singleton, getInstace não usa 
parâmetros e retorna somente a instância.
Fonte: Effective Java – Segunda Edição Joshua Bloch.
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
O QUE SÃO INTERFACES?
Há uma série de situações em engenharia de software onde é importante para 
diferentes grupos de programadores concordarem com um “contrato” que expõe 
a forma como o software vai interagir. Cada grupo deve ser capaz de escrever o 
seu código, sem qualquer conhecimento de como o código do outro grupo está 
escrito. De um modo geral isso se aplica ao importante componente da orienta-
ção a objetos conhecido por interfaces. 
Interface é um recurso da orientação a objeto utilizado em Java que define 
ações que devem ser obrigatoriamente executadas, mas que cada classe pode 
executar de forma diferente.
Na linguagem de programação Java, uma interface é um tipo de referên-
cia, semelhante a uma classe, que pode conter apenas constante, assinaturas de 
métodos e tipos aninhados. Não há corpo de método. Interfaces não podem 
ser instanciadas, elas só podem ser implementadas por classes ou prorrogado 
por outras interfaces. E por que isso? Isso se deve ao fato de que muitos objetos 
(classes) podem possuir a mesma ação (método), porém, podem executá-la de 
maneira diferente.
Usando um exemplo bem remoto, podemos ter uma interface chamada 
marinho que possui a assinatura do método nadar( ). Ou seja, toda classe 
que implementar marinho deve dizer como nadar(). Portanto, se eu tenho 
uma classe chamada pessoa e outra chamada peixe, ambas implementando a 
interface marinho, então, nestas duas classes devemos codificar a forma como 
cada um irá nadar( ).
CARACTERÍSTICAS DAS INTERFACES
Uma interface tem as seguintes características:
 ■ Uma interface não pode ser instanciada, mas podem ser definidos refe-
rências do seu tipo. Vejamos um exemplo:
57
Características das Interfaces
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura 14: Interface
Nesse exemplo não executamos o operador new, por isto temos apenas uma 
referência.
 ■ Todos os métodos definidos são implicitamente do tipo public ou abs-
tract. Por essa razão, ao declarar um método em uma interface, não é 
necessário fornecer a palavra-chave public. Os métodos não podem 
ter corpo definido, somente definimos sua assinatura.
Figura 15: Interface
 ■ Uma interface pode estender mais de uma interface. É importante lem-
brar que uma classe pode estender somente de uma outra classe.
Figura 16: Interface
 ■ A classe que implementa uma interface deve obrigatoriamente implemen-
tar todos os métodos definidos na interface.
 ■ Uma interface é formalmente uma classe abstrata, somente com atributos 
constantes (final) e estáticos (static) e métodos sem corpo. Estes 
deverão ser implementados pelas classes que irão implementar a inter-
face. É importante observar que os atributos na interface precisam ser 
inicializados. Vejamos um exemplo na figura abaixo:
Figura 18: Diagrama de Classe do Sistema cadastro de Blu-Ray
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
Figura 17: Interface
MODELANDO UM PROJETO COM INTERFACES
Após compreendermos sobre interfaces e seu comportamento vamos imple-
mentar um simples sistema de cadastro de Blu-Rays, utilizando a interface como 
principal recurso. 
As interfaces são um conjunto de ope-
rações que definem os serviços de uma 
classe ou de um componente. No nosso 
caso as interfaces existirão apenas na 
classe. Segue abaixo o diagrama de classe 
do nosso projeto de cadastro de Blu-Rays. 
A figura acima mostra as características básicas para representar Interfaces. A 
linha tracejada e com uma ponta de flecha vazada demonstra que a classe Bluray 
implementa a interface. Outra forma de mostrar que uma classe implementa uma 
interface é desenhar uma linha com um círculo em uma das extremidades com 
59
Implementando um Projeto com Interfaces
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
o nome dessa interface. As interfaces e seus métodos sempre são abstratos em 
Java. Estranhamente, ambos não aprecem em itálico, como ocorre com as clas-
ses abstratas e os métodos abstratos em classes.
IMPLEMENTANDO UM PROJETO COM INTERFACES
Vamos seguir a modelagem da figura anterior e implementar um sistema de ven-
das de Blu-Rays.
CRIANDO A CLASSE ITEMBLURAY
Primeiramente, vamos criar um projeto no NetBeans IDE 7.3 chamado blu-
rayInterface; desmarque o campo Criar Classe Principal. Em seguida, crie 
uma classe nova com o nome ItemBluRay e coloque como nome do pacote 
blurayInterface.
Na classe ItemBluRay vamos criar dois atributos e implementar os métodos 
gets e sets conforme pode ser visualizado na figura abaixo: 
Figura 19: Classe ItemBluRay
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
Essa classe será o nosso objeto para armazenarmos os dadossalvos em nosso 
cadastro.
CRIANDO A INTERFACE INTERFACEBLURAY
Para criar uma interface no NetBeans IDE basta clicar com o botão direito do 
mouse sobre o pacote do projeto e no menu escolher Novo > Interface Java... e 
adicionar InterfaceBluRay como nome da Interface e clique em Finalizar.
Figura 20: Interface InterfaceBluRay
Nessa interface vamos criar um atributo estático e dois métodos conforme a 
figura abaixo: 
Figura 21: Interface InterfaceBluRay
Observe que estamos utilizando um atributo do tipo final e static. A instru-
ção final indica que a classe, método ou variável assim declarada tem uma única 
atribuição que se mantém constante, ou seja, não pode ser alterada no decorrer 
do processamento. A instrução static é utilizada para se criar uma variável que 
poderá ser acessada por todas as instâncias de objetos desta classe como uma vari-
ável comum. No nosso exemplo atribuímos para a variável estática PROMOCAO 
o valor de 20, e essa variável será responsável por gerar o desconto em nosso sis-
tema. A vantagem em ter um atributo estático e final é que ao alterar a variável 
61
Implementando um Projeto com Interfaces
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
estática, todo o sistema receberá o novo valor atualizado. 
Observe que os métodos estão sem os modificadores de acesso public, e 
conforme já apresentado anteriormente não é necessário declarar os modifica-
dores de acesso, pois todos os métodos e atributos de uma Interface são públicos.
CRIANDO A CLASSE BLURAY E ESTENDENDO A INTERFACE
Agora crie a classe Bluray e acrescente a palavra reservada implements e a 
nossa interface InterfaceBluRay. Observe na figura abaixo que o NetBeans 
IDE destacou a nossa classe para que seja criado todos os métodos exigidos pela 
interface. A interface obriga o uso de todos os métodos declarados, porém você 
quem decide como implementá-los. 
Figura 22: Classe Bluray
Implemente os métodos utilizando o atalho do NetBeans IDE posicionando o 
mouse sobre o nome da classe em destaque e pressione alt+enter.
Figura 23: Classe Bluray
Observe que o NetBeans IDE gerou os métodos automaticamente e adicionou 
a anotação @override, pois estamos sobrescrevendo os métodos da Interface. 
Vamos deletar o código que o NetBeans gerou e escrever as instruções conforme 
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
a figura a seguir:
Figura 24: Código da Classe Bluray
Nessa classe criamos um vetor de ItemBluray para armazenar os objetos 
ItemBluRay e assim obter uma lista. O método adicionarLista( ) recebe 
por parâmetro o objeto salvo na classe. Programa que será implementado a 
seguir. O método imprimirLista( ) apresenta a relação de BluRay sal-
vos no programa. 
Ainda falta um método para realizarmos os cadastros de todos os Blu-Rays. 
Como ele não foi implementado na Interface vamos criá-lo diretamente na classe 
conforme a figura abaixo:
Figura 25: Método cadastrar da Classe Bluray
O método cadastrarBluRay( ) recebe por parâmetro o objeto ItemBluRay 
da classe Programa que será implementado a seguir. 
63
Implementando um Projeto com Interfaces
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
CRIANDO A CLASSE PROGRAMA
Para finalizar vamos criar a classe Programa para executar nosso projeto. Confira 
na imagem abaixo o código para essa Classe. 
Figura 26: Código da Classe Programa
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
Explicando o código
Observe na linha 16 da classe Programa que criamos uma instância da classe 
Bluray, chamada objBluray, lembrando que o termo instância e objeto são 
sinônimos. A criação do objeto envolve o operador new( ) que foi o utilizado 
no código acima. Em seguida, criamos a variável do tipo ItemBluRay cha-
mado objItem. 
Na linha 18 criamos o método while( ) que controla a saída ou perma-
nência no programa e logo em seguida instanciamos a variável do tipo objItem 
que será responsável por salvar as informações de cada item de Blu-Ray no 
objeto Bluray. 
Utilizamos também a classe Scanner( ) para adquirir todas opções do 
menu digitadas pelo usuário. 
Observe que por meio do objeto objBluray temos acesso a todos os méto-
dos da classe Bluray. E na linha 40 fazemos uso, pela primeira vez, do atributo 
estático que criamos na InterfaceBluRay, lembra? Na linha 41 aproveita-
mos esse recurso para realizar um cálculo de desconto ao cadastrar o Blu-Ray. 
Na nossa interface definimos que o valor do desconto seria de 20%. Caso um 
dia o desconto mude, basta alterar o valor da variável estática e todos os progra-
mas que fazem uso dela serão atualizados automaticamente.
Pronto! Agora é só executar o programa e visualizar os resultados. 
COMPARANDO INTERFACES E CLASSES ABSTRATAS
Se você leu a seção sobre classes abstratas, talvez esteja se perguntando por que 
os projetistas da linguagem Java se deram ao trabalho de introduzir o conceito 
de interfaces? Por que a interface que criamos InterfaceBluRay não pode 
ser simplesmente uma classe abstrata? 
Há, infelizmente, um sério problema com o uso de uma classe básica abs-
trata para expressar uma propriedade genérica. Uma classe só pode estender 
uma única classe. Suponha que a classe Bluray já estenda uma classe diferente, 
65
Comparando Interfaces e Classes Abstratas
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
digamos Midia. Ela então, não poderá estender uma segunda classe. Mas cada 
classe pode implementar quantas interfaces quiser.
Outras linguagens de programação, especialmente o C++, permitem que 
uma classe tenha mais de uma superclasse. Esse recurso é chamado de Herança 
Múltipla. Os projetistas do Java optaram por não dar suporte à herança múlti-
pla, porque ela torna a linguagem muito complexa (como no C++). 
Ao invés disso, as interfaces suportam a maioria dos benefícios da herança 
múltipla e, ao mesmo tempo, evitam as complexidades e ineficiências. 
Abaixo um quadro comparativo para tornar mais fácil a compreensão entre 
diferenças e similaridades entre Classes Abstratas e Interfaces.
CARACTERÍSTICA INTERFACE CLASSE ABSTRATA
Herança
múltipla
Uma classe pode implementar 
diversas interfaces.
Uma classe pode herdar somente 
uma classe.
Implementação
Padrão
Uma interface não pode conter 
qualquer tipo de código, muito 
menos código padrão.
Uma classe abstrata pode for-
necer código completo, código 
padrão ou ter apenas a decla-
ração de seu esqueleto para ser 
posteriormente sobrescrita.
Constantes
Suporta somente constantes 
do tipo estática.
Pode conter constantes estáticas 
e de instância.
Componentes
de terceiros
Uma implementação de uma 
interface pode ser incluída a 
qualquer classe de terceiros.
Uma classe de terceiros precisa 
ser reescrita para estender so-
mente a partir da classe abstrata.
Homogeneidade
Se todas as diversas imple-
mentações compartilham a 
assinatura do método então a 
interface funciona melhor.
Se as várias implementações são 
todas do tipo e compartilham um 
comportamento e status comum, 
então a classe abstrata funciona 
melhor.
Manutenção
Se o código do seu cliente 
conversa somente em termos 
de uma interface, você pode 
facilmente alterar a implemen-
tação concreta usandoum 
método factory.
Idêntico.
Velocidade
Lento, requer trabalho extra 
para encontrar o método cor-
respondente na classe atual.
Rápido.
CLASSES ABSTRATAS E INTERFACE
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
II
Clareza
Todas as declarações de cons-
tantes em uma interface são 
presumidamente públicas ou 
estáticas.
Você pode pôr código compar-
tilhado em uma classe abstrata. 
Você pode usar código para 
computar o valor inicial de suas 
constantes e variáveis de instân-
cia ou estáticas.
Funcionalidades
Adicionais
Se você incluir um novo mé-
todo em uma interface você 
precisa ajustar todas as imple-
mentações da interface.
Se você incluir um novo método 
em uma classe abstrata você tem 
a opção de fornecer uma imple-
mentação padrão para ele.
Quadro 28: Comparativo entre classe abstrata e Interface
CONSIDERAÇÕES FINAIS
Nesta unidade você aprendeu duas estruturas muito importante da orientação a 
objetos. Viu que classes abstratas podem conter tanto métodos abstratos quanto 
não abstratos, mas que se ao menos um deles for marcado com abstract, a classe 
também terá de ser abstrata. Não esqueça que a subclasse concreta (não abstrata) 
de uma classe abstrata terá de fornecer implementações de todos os métodos abs-
tratos da superclasse, mas que uma classe abstrata não tem de implementar os 
métodos abstratos de sua super classe. Viu também, que uma classe abstrata nunca 
poderá ser instanciada em sua única finalidade, missão de vida, é ser estendida. 
Além disso, abordamos a implementação de interfaces. Aqui você apren-
deu que as interfaces podem estender outra interface (até mesmo várias) e que 
qualquer classe que implementar uma interface terá de implementar os méto-
dos de todas as interfaces existentes na árvore de herança da interface que estiver 
sendo implementada.
67 
1. Dado o código a seguir:
1. abstract class Automovel {
2. abstract short metodo1 () ;
3. short metodo2() { return (short) 420; }
4. }
5. 
6. abstract class MiniCarro extends Automovel {
7. // codigo faltando?
8. short metodo1() { return (short) 42; }
9. }
Três das declarações abaixo são verdadeiras. Quais? (selecione três).
a) O código será compilado sem alterações.
b) A classe MiniCarro criará uma declaração abstract do metodo2() ou implemen-
tará esse método para permitir que o código seja compliado.
c) É válido, mas não necessário, que a classe MiniCarro crie uma declaração abs-
trata do método metodo2() ou implemente esse método para permitir que o 
código seja compilado.
d) Já que a linha 8 existe, a classe Automovel deve declarar o método metodo1() 
de alguma maneira.
e) Se a linha 6 fosse substituída por “MiniCarro extends Automovel { “ o código 
seria compilado.
f ) Se a classe Automovel não fosse abstrata e o método metodo1() da linha 2 fosse 
implementado, o código não seria compilado.
2. Marque somente as verdadeiras:
( ) Toda classe que possui um método abstrato é obrigatoriamente uma classe 
abstrata.
( ) Uma classe abstrata pode ter métodos não abstratos (não marcados com a pa-
lavra-chave abstract).
( ) Para se evitar erros de compilação, todo método de uma interface necessita ser 
marcado com a palavra-chave abstract.
( ) Tanto classes abstratas quanto interfaces necessitam possuir um método ou 
variável.
( ) Uma classe não abstrata que herda de uma classe abstrata obrigatoriamente 
deve implementar todos seus métodos herdados.
3. Três das opções são assinaturas de métodos válidos em uma interface. Quais? 
(selecione três).
a) private int getArea( );
b) public float getVolume(float x);
c) public void main (String[ ] args);
d) public static void main (String [ ] args);
e) boolean setFlag (Boolean [ ] test [ ]);
4. O que está errado com a seguinte interface?
public interface Curso {
 void metodo(int nota) {
 System.out.println(“Nota máxima”);
 }
}
Material Complementar
MATERIAL COMPLEMENTAR
Interfaces x Classes Abstratas
Por Luiz Agnelo C. Maia
Com o início do paradigma de desenvolvimento OO, alguns termos se tornam corriqueiros no 
mundo de programadores e analistas de sistema. Classes, herança, polimorfismo são alguns 
destes termos.
Saiba mais sobre o assunto no artigo completo.
Fonte: <http://www.devmedia.com.br/interfaces-x-classes-abstratas/13337>. Acesso em: 03 abr. 
2013.
Classes Abstratas
Fonte: <http://www.youtube.com/watch?v=DyrztWb8Ok0>.
Quando houver a possibilidade de reutilização de código, prefira classe abs-
trata. Se o código reaproveitado é muito pequeno, talvez seja mais interes-
sante uma interface.
U
N
ID
A
D
E III
Professor Dr. Edson A. Oliveira Junior
ARRAYS E COLEÇÕES
Objetivos de Aprendizagem
 ■ Criar códigos que declarem, inicializem e utilizem arrays.
 ■ Estudar algumas das principais Interfaces e Classes do Framework 
Collections.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
 ■ Entendendo um Array
 ■ Declarando Array de Objetos e de Tipos Primitivos
 ■ Construindo Arrays Unidimensionais
 ■ Construindo Arrays Multidimensionais
 ■ Inicializando Arrays
 ■ Passando Arrays para métodos
 ■ Exemplos com Arrays
 ■ Visão geral das Coleções
 ■ A Interface List
 ■ A Interface Set
 ■ A Interface Map
 ■ A Interface Queue
INTRODUÇÃO
Caro(a) aluno(a), esta unidade irá abordar dois assuntos fundamentais no que 
se refere à estrutura de dados, Arrays e Coleções. 
Arrays são estruturas estáticas que consistem em itens de dados de um mesmo 
tipo, ou seja, são objetos que armazenam diversas variáveis de um mesmo tipo 
primitivo ou de referência a outros objetos. Uma vez criado, um Array mantêm 
o mesmo tamanho, por isso são chamados de estáticos, embora seja possível atri-
buí-lo por referência a outro Array de tamanho diferente. 
Coleções são estruturas que permitem armazenar outros objetos, em que o 
desenvolvedor as utiliza sem se preocupar como essas estruturas foram criadas. 
Uma coleção possui interfaces, como listas (List), conjuntos (Sets), mapas (Maps) 
e filas (Queues), entre outras, que definem as operações que um programa pode 
executar sobre cada tipo de coleção, por exemplo, adicionar e remover objetos à 
coleção; verificar se um objeto está na coleção; recuperar um objeto da coleção 
sem removê-lo; iterar pela coleção, examinando cada elemento um após o outro.
ENTENDENDO UM ARRAY
Para entendermos melhor a estrutura de um Array, devemos pensar nele como 
um grupo de posições na memória, um imediatamente após o outro, que pos-
suem o mesmo nome e o mesmo tipo de dado. Quando precisamos localizar 
algum elemento deste Array, utilizamos o nome declarado para o mesmo, assim 
como o número, ou índice, ou ainda, subscrito da posição que queremos acessar. 
A imagem, a seguir, mostra um Array de 6 elementos com números intei-
ros para o qual demos o nome de meuArray. Para fazermos referência a uma 
posição específica deste Array, devemos fornecer o nome do Array seguido pelo 
índice da posição entre colchetes ( [ ] ). Note, caro(a) aluno(a), que o primeiro 
elemento do Array possui o número de posição zero (meuArray [ 0 ]), 
as vezes chamado de zero-ézimo elemento, ou seja, não devemos relacionar a 
73
Introdução
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura 27: Um Array de 6 elementos
©
Fo
nt
e:
 o
 a
ut
or
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
primeira posição de um Array com a posição um, a partir deste momento você 
deve ter em mente que o primeiro elemento doArray meu meuArray é meuAr-
ray [ 0 ], o segundo elemento do Array meu meuArray é meuArray 
[ 1 ], o quinto elemento do Array meu meuArray é meuArray [ 4 ]. 
Para fixar melhor esta regra, adote a seguinte expressão: o i-ésimo elemento do 
Array meuArray é meuArray [ 
i - 1 ]. 
Se recordarmos a introdução 
desta unidade e analisarmos melhor 
o Array meuArray, podemos notar 
que esse Array possui 6 elementos 
(meuArray [ 0 ] com valor -45, 
meuArray [ 1 ] com valor 6, 
meuArray [ 2 ] com valor 0, ..., 
meuArray [ 5 ] com valor -4) 
onde todos são do mesmo tipo, isso 
significa que todos os Arrays em Java 
conhecem seu próprio tamanho. Esta 
informação pode ser acessada por 
meio da variável length. Portanto, para 
recuperar o tamanho do Array meuArray, devemos usar a expressão meuAr-
ray.length.
DECLARANDO ARRAYS DE OBJETOS E DE TIPOS 
PRIMITIVOS
Em Java, os Arrays são declarados mediante a descrição do tipo de dado arma-
zenado seguido de colchetes à direita ou à esquerda do identificador.
O código, a seguir, mostra declarações válidas e inválidas de Arrays de tipo 
primitivo.
75
Declarando Arrays de Objetos e de Tipos Primitivos
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Quadro 29: Declarações válidas e inválidas de Arrays
O código, a seguir, mostra declarações válidas e inválidas de referência a objetos. 
Quadro 30: Declarações válidas e inválidas de referência a objetos
Analisando os códigos anteriores, é interessante quando que for declarar uma 
variável de referência a um Array, procure definir os colchetes imediantamente 
após a declaração do tipo e não após o identificador. Ambas as situações são 
válidas, no entanto fica mais legível para quem for ler seu código, perceber de 
maneira fácil, que id é uma variável de referência do objeto Array do tipo long e 
não um tipo primitivo de long.
Note que até o momento, vimos apenas declarações de Arrays Unidimensionais, 
no entanto, podemos criar Arrays Multidimensionais, que nada mais é que um 
Array com outros Arrays armazenados. Veja o código a seguir.
Quadro 31: Declarações válidas e inválidas de Arrays Multidimensionais
long [] id; // neste exemplo os colchetes foram definidos antes do 
nome (válido e recomendado)
int sequencia[]; // neste exemplo os colchetes foram definido 
depois do nome (válido, mas menos legível)
[] double valor; //neste exemplo os colchetes foram definidos no 
início da declaração do Array (inválido)
String[] nomes; // neste exemplo os colchetes foram definidos 
antes do nome (válido e recomendado)
Thread threads[]; // neste exemplo os colchetes foram definido 
depois do nome (válido, mas menos legível)
[] Thread threads; //neste exemplo os conchetes foram definidos no 
início da declaração do array (inválido)
String[][][] ocupantePoltronas; //válido e recomendado
String[] aniversariantesMes[]; //deselegante, porém válido
[][] String cardapioSemana; //inválido
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
Perceba que o primeiro exemplo se trata de um Array com três dimensões 
(Tridimensional – um Array com outros Arrays também armazenando Arrays), 
já o segundo, é um Array com duas dimensões (Bidimensional), no entanto um 
colchete foi declarado antes do identificador da variável aniversariantes-
Mes e outro logo após. Totalmente válido, porém não é uma maneira correta de 
realizar este tipo de declaração.
CONSTRUINDO ARRAYS UNIDIMENSIONAIS
Dando sequência ao nosso estudo, agora vamos aprender como construir Arrays. 
No tópico anterior apenas vimos como realizamos as declarações de Arrays e 
as maneiras como estas declarações podem ser feitas da melhor forma possível. 
Para que seja possível trabalhar com Arrays precisamos construir, ou melhor, 
criar um objeto de Array e a maneira mais simples de alcançarmos este feito é 
por meio do operador new. Todo e qualquer Array se trata de um objeto que 
ocupa espaço na memória e para o compilador saber quanto espaço alocar você, 
caro(a) aluno(a), precisa especificar o tamanho do seu Array na hora da sua cons-
trução. Para alocar 6 elementos para o Array de inteiros meuArray, devemos 
usar a seguinte declaração.
Quadro 32: Declarando e construindo Arrays
//declarando e construindo o array com apenas uma instrução
int[] meuArray = new int[6]; 
//executando a declaração e construção em etapas separadas
int[] meuArray; 
meuArray = new int[6];
Figura 28: Um Array Unidimensional na pilha
©
Fonte: o autor
77
Construindo Arrays Multidimensionais
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
No exemplo acima, quando o compilador 
executar a instrução new int[6], será 
criado um novo objeto na memória con-
tendo 6 elementos com um tipo int de 
valor default igual a 0. Agora, preste bem 
atenção nesta frase: todo e qualquer Array 
alocado na memória possui um valor default 
para cada elemento do Array de acordo 
com o tipo do elemento. Para variáveis 
numéricas do tipo primitivo, será atribuído o valor 0, false para variáveis 
boolean ou null para qualquer tipo não primitivo. Veja, a seguir, uma ima-
gem que ilustra nosso Array unidimensional meuArray na memória.
CONSTRUINDO ARRAYS MULTIDIMENSIONAIS
Como já vimos anteriormente, um Array multidimensional consiste em um 
Array onde cada elemento possui outro Array armazenado. O tipo mais comum 
de Array multidimensional é o Array bidimensional que consiste em dois subs-
critos. São utilizados frequentemente para representar tabelas de valores que 
consistem em informações organizadas em linhas e colunas. Para identificar 
um elemento específico da tabela, devemos utilizar os dois subscritos, no qual 
o primeiro representa uma linha do elemento e o segundo representa a coluna. 
Portanto, um Array bidimensional do tipo int é um objeto com o tipo de Array 
int (int [ ]), onde cada elemento fará referência a outro Array do tipo int.
O código, a seguir, representa a criação de um Array bidimensional com 3 
linhas e 4 colunas.
Quadro 33: Criando Array Bidimensional com 3 linhas e 4 colunas
int[][] a = new int[3][4];
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
Uma representação do Array 
criado no código anterior 
pode ser representada na 
imagem que segue.
Agora, veremos uma repre-
sentação deste Array alocado 
na memória.
Nos exemplos anteriores vimos como criar um Array bidimensional definindo 
os valores literais 3 e 4 para especificar o número de linhas e o número de colu-
nas, respectivamente. Nessa situação, caro(a) aluno(a), você se pergunta: seria 
possível definir para cada linha um número de colunas diferente, por exemplo, 
para linha 1 definir 2 colunas e para a linha 2 definir 3 colunas? Nós te respon-
demos: claro que sim. Note o exemplo a seguir.
Figura 30: Um Array Bidimensional na pilha 
©Fonte: o autor
©
Fo
nt
e:
 o
 a
ut
or
Figura 29: Representação de um Array Bidimensional com 3 linhas e 4 colunas
Figura 31: Um Array com 2 linhas, onde uma contém 5 colunas e a outra 3 colunas
©
Fo
nt
e:
 o
 a
ut
or
©
Fonte: o autor
Figura 32: Representação do Array da Figura 31 na pilha
79
Inicializando Arrays
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Quadro 34: Alocando colunas para linhas de um Array
Agora, percebacomo ficaria uma representação deste Array.
Perceba também este mesmo Array alocado 
na memória.
INICIALIZANDO ARRAYS
Nos estudos anteriores o que fizemos 
até então foi simplesmente declarar e 
construir Arrays unidimensionais e mul-
tidimensionais. A partir de agora, vamos 
aprender como inicializar um Array, ou 
seja, inserir itens nele, seja com valores 
primitivos (5,’y’,true e outros) ou com objetos citados pelas variáveis de referên-
cia do Array. É muito importante ressaltar que quando dizemos que um Array 
foi inicializado com um objeto, não signfica que o objeto propriamente dito está 
armazenado em um determinado elemento do Array e sim a referência deste 
int[][] a;
a = new int[2][]; //aloca linhas
a[0] = new int[5]; //aloca 5 colunas para a linha 0
a[1] = new int[3]; //aloca 3 colunas para a linha 1
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
objeto na memória. Lembre-se que quando construímos um Array de referên-
cia a objetos, por padrão, o valor de cada elemento deste Array é null. Portanto, 
se o Array não for inicializado adequadamente e tentarmos acessar a referên-
cia null aplicando o operador ponto, você irá receber a famosa exceção java.
lang.NullPointerException.
Como já vimos anteriormente, os elementos de um Array podem ser acessa-
dos por meio de um índice ou subscrito. Vimos também que o primeiro elemento 
de um Array é o zero-ésimo elemento, ou seja, um elemento com índice 0. Logo, 
sabemos então, que um Array com 7 elementos possuirá índices de 0 a 6. Então, 
caro(a) aluno(a), o que teríamos de fazer para criar um Array com 4 carros? Sim, 
4 carros. Veja a seguir.
Quadro 35: Criando um Array com referência a 4 objetos de Carro
No código acima, quando o programa for executado, será criado na memória 
um Array com o nome carros contendo 4 referências a objetos do tipo Carro. 
Lembre-se, o Array ainda não foi inicializado, não temos nenhum objeto Carro 
criado, portanto, essas referências são null. O que temos de fazer agora? Vamos 
criar 4 objetos do tipo Carro. Veja a seguir.
Quadro 36: Criando 4 objetos de Carro
A partir deste momento temos criados 4 objetos do tipo Carro, onde a refe-
rência de cada objeto na memória foi armazenado em um elemento do Array 
carros. Note que para inicializarmos os elementos foram utilizados os índi-
ces de cada elemento, desta maneira, conseguimos acessar elementos específicos 
e armazenar a referência de cada novo objeto Carro.
Carro[] carros = new Carro[4];
carros[0] = new Carro();
carros[1] = new Carro();
carros[2] = new Carro();
carros[3] = new Carro();
81
Inicializando Arrays
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Bem, até aqui tudo perfeito e funcionando corretamente, mas o que acon-
teceria se você tentasse armazenar um novo objeto Carro ao elemento [4] do 
Array carros? Ao recordarmos os estudos anteriores, vamos lembrar que a 
partir do momento que usamos o operador new para construir um Array, esse 
Array passa a conhecer o seu tamanho, portanto, se você tentar acessar um ele-
mento com um índice que não existe, será lançada em tempo de execução a 
exceção java.lang.ArrayIndexOutOfBoundsException. A mesma 
exceção será lançada se você tentar utilizar um índice com número negativo, ex: 
-1. Veja os exemplos a seguir.
int[] y = new int[3];
y[2] = 7; //Correto, o último elemento está no índice 2
y[3] = 4; //Errado, será gerado uma exceçao em tempo de execução. 
Não há nenhum elemento no índice 3. 
 
int[] w = new int[7];
int k = -1;
w[k] = 3; //Exceção, pois k é um número negativo.
Quadro 37: Utilizando índices de um Array
Nos exemplos anteriores, vimos primeiramente como criamos e, em seguida, 
inicializamos os elementos de um Array. Agora, vamos aprender como decla-
ramos, construímos e inicializamos um Array em apenas uma linha. Considere 
o seguinte exemplo.
long x = 2;
long[] id;
id = new long[3];
id[0] = 1;
id[1] = x;
id[2] = 3;
Quadro 38: Declarando e inicializando Array com várias linhas
O código acima não possui nada de diferente do que vimos até agora. Contudo, 
veja o código a seguir.
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
long x = 2;
long[] id = {1,x,3};
Quadro 39: Declarando e inicializando Array em uma linha
Os dois códigos são equivalentemente funcionais, no entanto o segundo bem 
mais curto. Analisando a segunda linha do código acima, podemos notar que 
foram executadas quatro operações:
 ■ Declaramos uma variável de referência ao Array de long chamada id.
 ■ Criamos um Array de long com tamanho igual a três, ou seja, três elementos.
 ■ Atribuimos a estes elementos os valor 1, 2 e 3.
 ■ Atribuimos um novo objeto de Array à variável de referência id.
Da mesma maneira que inicializamos em apenas uma linha um Array de tipos 
primitivos, também podemos fazer referência a objetos, como mostra o código 
a seguir.
Carro fiat = new Carro(“fiat”);
Carro[] carros = {fiat, new Carro(“audi”), new Carro(“chevrolet”), 
new Carro(“ford”)};
Quadro 40: Realizando referência a objetos em um Array
Perceba, caro(a) aluno(a), que a inicialização do Array Carro referenciada pela 
variável carros é muito semelhante ao exemplo dado anteriormente com tipos 
primitivos. Note também que este Array possui um tamanho de quatro elemen-
tos onde ao primeiro elemento foi atribuída uma referência para o objeto fiat 
do tipo Carro criado anteriormente. Foram criados também três novos objetos 
do tipo Carro (audi, chevrolet e ford) atribuindo, respectivamente, 
a referência destes objetos aos três últimos elementos.
Vamos voltar agora lá no início do nosso estudo sobre Arrays. Você lembra 
que aprendemos que podemos recuperar o tamanho de uma Array utilizando a 
variável length? Então, agora vamos ver um exemplo que utiliza esta variável em 
um laço de repetição para inicializarmos nosso Array carros, por exemplo, for.
83
Passando Arrays para Métodos
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Carro[] carros = new Carro[6]; //cria um Array de 6 referências a 
Carro
for (int i = 0; i < carros.length; i++) {
 carros[i] = new Carro(); //atribui um novo elemento Carro a 
posiçao de índice i 
}
Quadro 41: Inicializando um Array em um laço de repetição
PASSANDO ARRAYS PARA MÉTODOS
Para enterdermos melhor a passagem de Arrays para métodos, precisamos abor-
dar um assunto que implica diretamente nessa questão, a passagem de parâmetros 
por referência.
A maioria das linguagens de programação, por exemplo, C++, possuem 
duas maneiras de passar argumentos para métodos. Uma é a passagem por valor, 
também chamadas de chamada por valor e a outra se trata da passagem por refe-
rência também conhecida por chamada por referência.
Quando passamos um argumento por valor, é realizada uma cópia do valor 
deste argumento e passado essa cópia para o método chamador. Quando fazemos 
uma chamada por referência, na verdade estamos passando para o método cha-
mado, o endereço daquele objeto na memória, ou seja, estamos passando uma 
referência desse objeto. Neste caso, o método chamador permite que o método 
chamado possa acessar e modificar os dados do chamador se for necessário.
No entanto, Java difere das outras linguagens quando precisamos passar argu-
mentos por valor ou referência. Java não permite que você escolha entre passar 
cada argumento por valor ou referência. Quando você trabalha com variáveis 
de tipos primitivos, estassempre serão passadas por valor. Quando falamos de 
objeto, estes não são passados para o método e sim a referência desse objeto. 
Nesse caso, a referência que é passada por valor, ou seja, é feita uma cópia da 
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
referência do objeto e passado esta cópia para o método chamado, permitindo 
assim, por meio da referência, acessar o objeto e manipulá-lo se necessário. No 
caso de retornar informações de um método mediante a instrução return, a 
regra é praticamente a mesma. Variáveis do tipo de dado primitivo são retor-
nadas por valor, ou seja, devolvida uma cópia cujos objetos são retornados por 
referência.
Bem, agora que você aprendeu como os argumentos em Java são passados 
para um método, chegou a hora de aplicarmos esse conceito com Arrays. Como 
já vimos até agora, Arrays em Java são tratados como objetos, sendo assim, os 
Arrays também são passados para os métodos como referência. Ora, isso sig-
nifica então que também podemos manipular os elementos de um Array? Sim, 
podemos, o método chamado pode acessar os elementos dos Arrays originais 
do chamador. Para isso, bastar passar para o método chamado o nome do Array 
sem colchetes, que na verdade é uma referência para um objeto que contém os 
elementos do Array. O exemplo, a seguir, demonstra esta situação.
int[] temperaturaHora = new int[24];
modificarArray(temperaturaHora);
Quadro 42: Passando Arrays para métodos
Note que o método modificarArray recebe como argumento a variável tem-
peraturaHora, sem colchetes, que contém uma referência para um Array de 
int de 24 elementos. Para que isso seja possível, o método que recebe o Array 
deve conter em sua lista de argumentos um argumento que seja um Array ou 
vários, se mais de um Array for recebido pelo método. Veja a seguir, como pode-
mos definir o escopo do método modificarArray. 
85
Exemplos com Arrays
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
void modificarArray( int[] a )
Quadro 43: Método esperando um Array como argumento
No código anterior você pôde perceber que o método modificarArray espera 
receber no argumento a um Array do tipo int. Neste caso, quando o método 
chamado utilizar o Array a, na verdade ele estará se referindo ao Array real no 
chamador que é temperaturaHora.
EXEMPLOS COM ARRAYS
Bem, mãos à obra. Chegou a hora de colocar em prática tudo aquilo que você 
aprendeu até agora. Vamos criar exemplos funcionais para aplicar de forma prá-
tica os conceitos estudados até agora.
Como no nosso primeiro exemplo, vamos criar uma classe que declara e 
aloca um Array de 10 elementos na memória. Em seguida, vamos recuperar o 
valor contido nos elementos desse Array e imprimir em uma janela o índice e 
o valor respectivo.
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
 1 
 2 
 3 import javax.swing.*;
 4 
 5 public class Exemplo1 {
 6 
 7 public static void main(String[] args) {
 8 int[] array; //declara referência para um 
array
 9 array = new int[10]; //cria um array com 10 elementos
10 String saida = “Índice\tValor\n”;
11 
12 //adicionando o valor de cada 
13 //elemento do Array na variável saida
14 for (int i = 0; i < array.length; i++) {
15 saida += i + “\t” + array[i] + “\n”;
16 }
17 
18 JTextArea saidaArea = new JTextArea();
19 saidaArea.setText(saida);
20 
21 JOptionPane.showMessageDialog(null, saidaArea, 
22 “Criando um Array de Inteiros”,
23 JOptionPane.INFORMATION_MESSAGE);
24 
25 System.exit(0);
26 }
27 }
Quadro 44: Exemplo que apresenta os índices de um Array
Vamos entender o que aconteceu. Note que na linha 8 foi declarada a variá-
vel array capaz de referir-se a um Array de elementos int. Na linha 9, foi 
utilizado o operador new para construir o Array e alocar os 10 elementos na 
memória. Declaramos também na linha 10 uma variável do tipo String cha-
mada saida, na qual será responsável por armazenar os índices e os valores dos 
elementos para, posteriormente, serem exibidos em um diálogo de mensagem. 
87
Exemplos com Arrays
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Nas linhas 14, 15 e 16, utilizamos uma estrutura for para adicionar o índice 
e o valor de cada elemento do Array a saida. Note o uso da contagem na vari-
ável i, perceba que a contagem se inicia em zero (nesse momento, você deve 
recordar que os índices iniciam em 0 em um Array). Desse modo, o laço irá aces-
sar cada elemento do Array iniciando por 0. Perceba agora o uso da expressão 
array.length para recuperar o comprimento do Array. Neste nosso exem-
plo o comprimento do Array é 10 e o laço será executado enquanto a variável 
de controle i for menor que 10. Lembre-se que para um Array com 10 elemen-
tos os valores dos índices vão de 0 a 9, portanto, ao utilizarmos o operador 
menor que, <, garantimos que o laço não irá acessar um elemento além do fim 
do Array, evitando assim, um erro e também o lançamento da famosa exceção 
java.lang.ArrayIndexOutOfBoundsException. Veja na imagem, 
a seguir, o resultado apresentado em um diálogo de mensagem quando execu-
tamos o exemplo que acabamos ver.
Figura 33: Resultado apresentando índice e valores de um Array
Fonte: o autor
Vamos a mais um exemplo? Bem, o nosso segundo exemplo com Arrays será 
bem semelhante ao exemplo anterior, a diferença é que agora vamos inicializar 
os elementos do Array, apresentar o Array inicializado e, em seguida, vamos 
somar os elementos deste Array. Por fim, também vamos apresentar esta soma 
em um diálogo de mensagem. 
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
Quadro 45: Somando os elementos de um Array
Você pode notar que o exemplo acima é bem parecido com o primeiro exemplo 
que estudamos há pouco. Em nosso primeiro exemplo, nós não inicializamos 
o Array. Note que quando executamos o primeiro exemplo, os valores de cada 
elemento do Array é zero. No segundo exemplo, não fizemos nada de diferente 
do que estudamos até aqui. O que fizemos foi declarar na linha 10 uma variável 
 1
 2 
 3 import javax.swing.JOptionPane;
 4 import javax.swing.JTextArea;
 5 
 6 public class Exemplo2 {
 7 
 8 public static void main(String[] args) {
 9 //cria um array com 6 elementos
10 int[] array = {10, 15, 25, 3, 8, 7};
11 int total = 0;
12 String saida = “Índice\tValor\n”;
13 
14 //adicionando o valor de cada 
15 //elemento do Array na variável saida
16 for (int i = 0; i < array.length; i++) {
17 total += array[i];
18 saida += i + “\t” + array[i] + “\n”;
19 }
20 
21 saida += “\n\nA soma dos elementos do array é: “ + 
total;
22 
23 JTextArea saidaArea = new JTextArea();
24 saidaArea.setText(saida);
25 
26 JOptionPane.showMessageDialog(null, saidaArea,
27 “Criando um Array de Inteiros”,
28 JOptionPane.INFORMATION_MESSAGE);
29 
30 System.exit(0);
31 }
32 }
89
Exemplos com Arrays
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
array que faz referência a um Array do tipo int,já inicializando este Array com 
os valores (10, 15, 25, 3, 8, 7). Quando o programa executar esta linha, automa-
ticamente um Array com 6 elementos será alocado na memória e já inicializado. 
Perceba agora, que na linha 11 foi declarada uma variável total do tipo int, 
para podermos armazenar nesta variável a soma dos valores dos elementos do 
Array. Se analisarmos a linha 17, note que uma soma está sendo realizada nessa 
variável com base no valor do elemento. Nesse momento, utilizamos o índice 
corrente no laço de repetição for para recuperar o valor do Array por meio da 
expressão array[i]. Por fim, atribuimos na variável saida um texto apre-
sentando o total da soma. Veja, a seguir, o resultado.
Figura 34: Resultado apresentando índices, valores e a soma dos elementos de um Array
Fonte: o autor
Dando continuidade aos nossos estudos, agora vamos ver um exemplo traba-
lhando com Arrays multidimensionais e passagem de Array por referência. O 
exemplo, a seguir, irá demonstrar a inicialização de dois Arrays bidimensionais e 
o uso de laços de repetição aninhados (laços aninhados é o mesmo que um laço 
sendo executado dentro de outro e assim sussecivamente) for para percorrer 
os Arrays. Vamos ao exemplo.
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
Quadro 46: Exemplo de como declarar e inicializar Arrays Multidimensionais
 1 import java.awt.Container;
 2 import javax.swing.JApplet;
 3 import javax.swing.JTextArea;
 4 
 5 public class Exemplo3 extends JApplet{
 6 JTextArea saidaArea;
 7 
 8 @Override
 9 public void init() {
10 super.init();
11 
12 saidaArea = new JTextArea();
13 Container container = getContentPane();
14 container.add(saidaArea);
15 
16 int[][] array1 = { {1,2,3}, {4,5,6} };
17 int[][] array2 = { {1,2}, {3}, {4,5,6} };
18 
19 saidaArea.setText(“Os valores do array1 são\n”);
20 buildSaida(array1);
21 
22 saidaArea.append(“Os valores do array2 são\n”);
23 buildSaida(array2);
24 }
25 
26 public void buildSaida(int[][] array) {
27 //percorre as linhas do array com um for
28 for (int linha = 0; linha < array.length; linha++) {
29 //percorre as colunas da linha corrente com outro 
30for
31 for (int coluna = 0; coluna < array[linha].length; 
32 coluna++) {
33 saidaArea.append(array[linha][coluna] + “ “); 
34 }
35 saidaArea.append(“\n”);
36 }
37 saidaArea.append(“\n”);
38 }
39 
40 }
91
Exemplos com Arrays
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
O exemplo acima declara e inicializa dois Arrays bidimensionais. O primeiro 
Array referenciado pela variável array1 na linha 18 cria seis elementos em 
duas sublistas. Perceba que se trata de um Array com duas linhas e 3 colunas em 
que a primeira sublista é inicializada com os valores (1,2,3) e a segunda sublista 
com os valores (4,5,6). O segundo Array referenciado pela variável array2 na 
linha 19 também fornece seis elementos, porém inicializados em três sublistas 
com os valores (1,2), (3) e (4,5,6), respectivamente. Note na linha 22 e 25 as cha-
madas para o método buildSaida, no qual é responsável por percorrer todos 
os elementos do Array passado como parâmetro para e apresentar em um diá-
logo de mensagem os valores de cada elemento. A mágica neste método é o tipo 
do argumento que ele está esperando, que neste caso é um Array bidimensio-
nal do tipo int. Se você retornar ao nosso estudo de passagem de parâmetros 
por referência, recordará que um Array nada mais é do que um objeto, portanto, 
também pode ser passado por referência. No nosso exemplo, foi passado na pri-
meira chamada do método buildSaida a variável array1 e array2 na 
segunda, desta maneira, o método tem a capacidade de percorrer os elementos 
dos dois Arrays e apresentar no diálogo de mensagem os valores de cada ele-
mento do Array. 
Agora repare o uso do laço de repetição for (linhas 30 e 32) para per-
correr um Array bidimensional. No laço externo for, foi utilizada a expressão 
array.lenght para determinar o número de linhas do Array. Para determi-
nar o número de colunas do Array, foi utilizada a expressão array[linha].
lenght para determinar o número de colunas na linha corrente do Array, per-
mitindo assim determinar o número exato de colunas em cada linha. Veja, a 
seguir, o resultado da execução do código acima.
Figura 35: Resultado mostrando valores de Arrays Multidimensionais
Fonte: o autor
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
VISÃO GERAL DAS COLEÇÕES
No começo do nosso estudo, vimos que Arrays são estruturas que consistem em 
itens de dados de um mesmo tipo, seja este primitivo ou de referência a outros 
objetos, e que quando precisamos manipular informações de um Array, temos 
que criar programas que atendam a essa necessidade. Quando trabalhamos com 
estruturas de Coleções, o desenvolvedor não precisa se preocupar como estas 
estruturas foram criadas e sim qual a Coleção que ele irá utilizar e em que deter-
minada situação se encontra isso, graças às interfaces que a estrutura de Coleções 
fornece. As interfaces definem várias operações a serem realizadas generica-
mente sobre vários tipos de Coleções minimizando a quantidade de código que 
um programador precisa escrever para criar e manipular Coleções. 
O conjunto de interfaces e classes de coleções contidos na API Java consti-
tui o chamado Framework Collections que tem por raíz duas interfaces 
básicas: Collection, utilizada para manipular coleções onde os elementos 
são objetos individuais, e Map, onde se mapeia uma chave única para um valor 
específico, por meio de uma estrutura de pares de objetos, no qual um é utli-
zado como chave para acesso. 
Veja, a seguir, algumas das principais interfaces fornecidas pelo pacote 
java.util.*.
 ■ Collection – interface raiz da hierarquia de Coleções a partir da qual se 
derivam as interfaces Set e List.
 ■ Set – dá relevância à exclusividade, ou seja, contém elementos únicos.
 ■ List – interface onde o índice tem relevância. Esta interface possui diversas 
operações relacionadas ao índice que outras interfaces não list não têm.
 ■ Map – diz respeito a identificadores únicos, onde se mapeia uma única 
chave para um determinado valor. Para os Maps são associados chaves e 
valores onde estas não podem ser duplicadas, ou seja, cada chave pode 
mapear somente um valor.
Figura 36: Representação do pacote java.util.*
©
Fo
nt
e:
 o
 a
ut
or
93
A Interface List
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
 ■ Queue – o mesmo que fila. Geralmente utilizada para se manter uma lista 
de execuções a serem processadas. A ela se atribui o conceito de FIFO (first 
in, first out. Que em português significa primeiro a entrar, primeiro a sair).
Veja, a seguir, uma representação da hierarquia de interfaces e classes para 
coleções.
A INTERFACE LIST
Também chamada de sequência, a interface List é uma Collection que 
permite elementos duplicados de maneira ordenada, onde o programador tem 
controle preciso sobre onde o elemento está inserido na lista. Assim como os 
Arrays, essa interface também á baseada em índice, onde o primeiro elemento 
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610de 19 de fevereiro de 1998.
III
da lista é zero. Uma das vantagens que uma coleção list possui sobre as cole-
ções não list é a grande variedade de métodos relacionados com índices, como 
o get(int index), indexOf(Object o), add(int index, Object obj), entre outros. A 
interface List possui três classes que a implementa: ArrayList, LinkedList 
e Vector. A seguir, vamos estudar a classe mais utilizada entre as três, estamos 
falando da classe ArrayList. 
Quando falamos de ArrayList, devemos considerar esse conjunto como um 
Array redimensionável, isto é, que pode crescer. Pois além de implementar a 
interface List, essa classe fornece métodos que permitem manipular o tamanho 
da matriz que á usada internamente para armazenar a lista. Cada instância de 
uma ArrayList possui uma capacidade que define o tamanho da matriz usada 
para armazenar os elementos da lista. Quando adicionamos um elemento a uma 
ArrayList, sua capacidade aumenta automaticamente. A seguir, vamos ver um 
exemplo de como se usa um ArrayList que contenha uma lista de frutas.
 1import java.util.ArrayList;
 2 import java.util.List;
 3 import javax.swing.JOptionPane;
 4 import javax.swing.JTextArea;
 5 
 6 public class Exemplo4 {
 7 public static void main(String[] args) {
 8 List<String> listaFrutas = new ArrayList<String>();
 9 String s = “uva”;
10 listaFrutas.add(“melancia”);
11 listaFrutas.add(s);
12 listaFrutas.add(“caju”);
13 
14 String saida = “”; 
15 saida += “Frutas da Lista: “+
16 listaFrutas.toString();
17 saida += “\nTotal de Frutas na lista: “+
28 listaFrutas.size();
29 saida += “\nA lista possui pera? “+
20 listaFrutas.contains(“pera”);
21 saida += “\nA lista possui caju? “+
22 listaFrutas.contains(“caju”);
95
A Interface List
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Quadro 47: Criando um ArrayList
Perceba que este pequeno programa executou vários controles relacionados com 
a ArrayList. Bem, caro(a) aluno(a), vamos entender o que acontece então? Se 
você recordar ao nosso estudo sobre Arrays, sempre que precisávamos alocar um 
Array na memória com o operador new era necessário definir o tamanho deste 
Array assim como o seu tipo de dado (primitivo ou referenciando um objeto), 
por exemplo, int[] meuArray = new int[6];. Perceba que quando 
declaramos nosso ArrayList na linha 10, não demos a ele um tamanho e, mesmo 
assim, conseguimos pedir para o ArrayList nos informar seu tamanho na linha 
19 por meio do método listaFruta.size(), isso, graças à capacidade que 
o ArrayList tem de definir o seu tamanho automaticamente quando adiciona-
mos ou removemos um objeto da lista como foi feito na linha 26. Note que ao 
consultarmos novamente o tamanho da lista na linha 28, o ArrayList foi capaz 
de nos informar esse novo tamanho sem a necessidade de você, caro(a) aluno(a), 
precisar programar códigos e mais códigos para isso. Perceba agora que utiliza-
mos a sintaxe <String> no nosso ArrayList. Esse tipo de programação segue 
23 listaFrutas.remove(“uva”);
24 
25 saida += “\nTotal de Frutas na lista “
26 + “apos remover uva: “+listaFrutas.size();
27 saida += “\nFrutas da Lista “
28 + “apos remover uva: “+listaFrutas.toString();
29 saida += “\nÍndice da Fruta “
30 + “caju na lista: “+listaFrutas. 
31 indexOf(“caju”);
32 
33 JTextArea saidaArea = new JTextArea();
34 saidaArea.setText(saida);
35 
36 JOptionPane.showMessageDialog(null, saidaArea,
37 “Trabalhando com ArrayList”,
38 JOptionPane.INFORMATION_MESSAGE);
39 
40 System.exit(0);
41 }
42 }
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
o princípio da POO (Programação Orientada a Objetos) de “programar para 
uma interface” fazendo o uso de genéricos para declarar o tipo de uma coleção. 
Não entraremos em detalhes sobre o uso de genéricos neste tópico, por enquanto 
basta você saber que essa é a maneira correta de definir tipos em coleções. Bem, 
vamos continuar nossa análise. 
Outro ponto interessante neste programa é que pudemos perguntar para o 
ArrayList se ele possuía determinadas frutas na lista por meio do método lis-
taFrutas.contains(). Agora, por favor, pare e pense. Como você faria 
isso com um Array? Provavelmente, você criaria um laço de repetição for, e 
com base no tamanho do seu Array, você percorreria esse Array, verificando ele-
mento por elemento por meio do índice. Trabalhoso, não? Note que você seguiria 
a mesma ideia se precisasse recuperar o índice de uma determinada fruta se 
estivesse trabalhando com Array. No nosso exemplo acima, simplesmente uti-
lizamos o método listaFrutas.indexOf(), como mostra a linha 33 do 
nosso programa. Veja, a seguir, o resultado no nosso exemplo.
Figura 37: Apresentando informações de um Array
Fonte: o autor
Continuando nossos estudos, agora vamos ver um exemplo que nos mostra 
como classificar um ArrayList. Algo bem simples, por exemplo, classificar uma 
lista com nomes por ordem alfabética. Certamente, você pensou: “Vou procu-
rar o método sort() na classe ArrayList”. Boa sorte. Essa classe não fornece de 
forma alguma uma maneira que permita classificar o seu conteúdo. Mas não 
desanime, para isso vamos utilizar a classe java.util.Collections. Veja 
o exemplo a seguir.
97
A Interface List
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Quadro 48: Classificando um ArrayList
No exemplo acima, a linha 12 declara um ArrayList de String, e nas seguintes, 13 
a 18, utilizamos o método listaNomes.add() para adicionarmos na lista, 
nomes de pessoas de forma desordenada. Note que na linha 21 adicionamos na 
1
 2 
 3 import java.util.ArrayList;
 4 import java.util.Collections;
 5 import java.util.List;
 6 import javax.swing.JOptionPane;
 7 import javax.swing.JTextArea;
 8 
 9 public class Exemplo5 {
10 
11 public static void main(String[] args) {
12 List<String> listaNomes = new ArrayList<String>();
13 listaNomes.add(“Maria”);
14 listaNomes.add(“João”);
15 listaNomes.add(“José”);
16 listaNomes.add(“Adriano”);
17 listaNomes.add(“Willian”);
18 listaNomes.add(“Patrícia”);
19 
20 String saida = “”; 
21 saida += “Lista desordenada: “+listaNomes;
22 
23 Collections.sort(listaNomes);
24 
25 saida += “\nLista ordenada: “+listaNomes;
26 
27 JTextArea saidaArea = new JTextArea();
28 saidaArea.setText(saida);
29 
30 JOptionPane.showMessageDialog(null, saidaArea,
31 “Trabalhando com ArrayList”,
32 JOptionPane.INFORMATION_MESSAGE);
33 
34 System.exit(0);
35 
36 }
37 }
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
variável saida os nomes contidos na lista antes de realizarmos qualquer tipo 
de ordenação. Agora vamos dar atenção para a execução da linha 23. Perceba 
que utilizamos o método sort() da classe Collections para realizar a clas-
sificação, ou melhor, ordenação da lista. Em seguida, na linha 25, recuperamos 
novamente os nomes contidos na lista para que possamos nos maravilhar com 
a mágica demonstrada a seguir.
Figura 38: OrdenandoArrays
Fonte: o autor
A INTERFACE SET
Diferentemente da interface List, a interface Set é uma Collection que não 
permite elementos duplicados, ou seja, só contém elementos únicos. O que deter-
minará que dois objetos seja idênticos é o metodo equals(), situação onde só 
um objeto poderá ficar no Set, ou seja, se você tentar adicionar um elemento que 
já existe nele, o método add() retornará false e o elemento não será adicio-
nado. As três classes que implementam Set são HashSet, LinkedHashSet 
e TreeSet. 
Como exemplo de estudo para a interface Set, vamos codificar e analisar 
um exemplo utilizando HashSet. Esta classe trata-se de um conjunto Set não 
ordernado e não classificado. Você pode utilizar esta classe quando quiser obter 
um conjunto sem elementos duplicados sem precisar de ordem na sua iteração. 
Quando construimos um HashSet, ele remove qualquer duplicidade existente 
na Collection como mostra o exemplo a seguir.
99
A Interface Set
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Quadro 49: Exemplo utilizando HashSet
 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 import java.util.Collection;
 4 import java.util.HashSet;
 5 import java.util.Arrays;
 6 import java.util.Iterator;
 7 import java.util.SortedSet;
 8 import java.util.TreeSet;
 9 import javax.swing.JOptionPane;
10 import javax.swing.JTextArea;
11
12 public class Exemplo7 {
13 String saida = “”;
14 private String[] cores = {“vermelho”, “branco”,
15 “azul”, “verde”, “cinza”, “laranja”,
16 “bronzeado”, “branco”, “ciano”, “pêssego”,
17 “cinza”, “laranja”};
18
19 public static void main(String[] args) {
20 new Exemplo7();
21 }
22 
23 public Exemplo7() {
24 TreeSet tree = new TreeSet(Arrays.asList(cores));
25 
26 saida += “\nSet de elementos não “
27 + “duplicados e ordenados:\n”;
28 this.mostrarSet(tree);
29 
30 saida += “\n\nSubconjunto de TreeSet “
31 + “menor que ‘laranja’:\n”;
32 this.mostrarSet(tree.headSet(“laranja”));
33 
34 saida += “\n\nSubconjunto de TreeSet “
35 + “maior que ou igual a ‘laranja’:\n”;
36 this.mostrarSet(tree.tailSet(“laranja”));
37 saida += “\n\nPrimeiro elemento de set: “
38 + tree.first();
39 saida += “\nÚltimo elemento de set: “
40 + tree.last();
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
No exemplo anterior utilizamos um HashSet para remover Strings duplicados de 
uma ArrayList. Perceba que o método gerarListaNaoDuplicada recebe 
como argumento uma Collection onde na linha 45 é construído um HashSet desta 
Collection. Quando esta construção é realizada, quaisquer elemento duplicado 
na Collection, neste caso nosso ArrayList declarado e criado na linha 28, é remo-
vido. No nosso exemplo, declamos e criamos na linha 16 um Array cores com 
nomes duplicados, perceba as cores branco, cinza e laranja. Na constru-
ção do ArrayList na linha 28, utilizamos o Array de cores para criar a lista de 
cores duplicadas. Depois que construimos nosso HashSet na linha 45 com base 
na nossa lista de cores duplicadas, foi utilizado um Iterator para podermos 
acessar os elementos do HashSet. Note que na linha 46 foi obtido um Iterator 
de HashSet e nas linhas 50 e 51, utilizamos os métodos hasNext e next de 
Iterator para acessarmos os elementos de HashSet. Veja, a seguir, a execução do 
nosso exemplo.
Figura 39: Utilizando Sets para mostrar elementos não duplicados
Fonte: o autor
No exemplo anterior utilizamos HashSet para apresentar um conjunto de ele-
mentos não duplicados e não ordenados. Mas, e se você precisar ordenar estes 
elementos? A seguir, vamos ver um exemplo utilizando a classe TreeSet e da 
interface SortedSet que estende Set. A interface SortedSet mantém seus ele-
mentos em ordem natural ou uma ordem especificada por um Comparator. 
A classe TreeSet implementa SortedSet e cria uma estrutura de árvore garan-
tindo que os elementos estejam ordenados de forma ascendente, de acordo com 
a ordem natural. No entanto, ela nos possibilita criar um TreeSet com um cons-
trutor que permite gerar suas próprias regras de ordenação. Vamos ao exemplo?
Quadro 50: Utilizando a classe TreeSet
101
A Interface Set
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
 1
 2 
 3 import java.util.Arrays;
 4 import java.util.Iterator;
 5 import java.util.SortedSet;
 6 import java.util.TreeSet;
 7 import javax.swing.JOptionPane;
 8 import javax.swing.JTextArea;
 9 
10 public class Exemplo7 {
11 
12 String saida = “”;
13 private String[] cores = {“vermelho”, “branco”,
14 “azul”, “verde”, “cinza”, “laranja”,
15 “bronzeado”, “branco”, “ciano”, “pêssego”,
16 “cinza”, “laranja”};
17 
18 public static void main(String[] args) {
19 new Exemplo7();
20 }
21 
22 public Exemplo7() {
23 TreeSet tree = new TreeSet(Arrays.asList(cores));
24 
25 saida += “\nSet de elementos não “
26 + “duplicados e ordenados:\n”;
27 this.mostrarSet(tree);
28 
29 saida += “\n\nSubconjunto de TreeSet “
30 + “menor que ‘laranja’:\n”;
31 this.mostrarSet(tree.headSet(“laranja”));
32 
33 saida += “\n\nSubconjunto de TreeSet “
34 + “maior que ou igual a ‘laranja’:\n”;
35 this.mostrarSet(tree.tailSet(“laranja”));
36 
37 saida += “\n\nPrimeiro elemento de set: “
38 + tree.first();
39 saida += “\nÚltimo elemento de set: “
40 + tree.last();
41 
42 JTextArea saidaArea = new JTextArea();
43 saidaArea.setText(saida);
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
Perceba que no código anterior a linha 28 cria-se um objeto TreeSet com base 
no Array cores e atribui uma referência para esse objeto a tree. A linha 36 
realiza uma chamada para o método headSet no qual retorna um subcon-
junto de TreeSet com elementos menores que “laranja”. Para retornar os 
elementos maiores que ou igual a “laranja”, realizamos um chamada para 
o método tailSet. Quaisquer alterações realizadas por meios destas duas 
visões, headSet e tailSet, serão refletidas em TreeSet. Note agora as chamadas 
para os métodos first e last nas linhas 43 e 45. Estes são responsáveis por obter o 
menor e o maior elemento, respectivamente. Finalmente, vamos nos atentar ao 
método mostrarSet declarado na linha 57. Este método recebe como argu-
mento um SortedSet e o imprime quando realizamos chamadas deste método 
nas linhas 32, 36 e 40 para mostrar o set ordenado, os elementos menores que 
“laranja” e os elementos maiores que ou igual a “laranja”, respectiva-
mente. Veja o resultado desta execução.
44 
45 JOptionPane.showMessageDialog(null, saidaArea,
46 “Trabalhando com Sets”,
47 JOptionPane.INFORMATION_MESSAGE);
48 
49 System.exit(0);
50 }
51 
52 private void mostrarSet(SortedSet ss) {
53 Iterator iterator = ss.iterator();
54 
55 while (iterator.hasNext()) {
56 saida += iterator.next() + “ “;
57 }
58 }
59 }
103
 A Interface Map
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
irod
e 
19
98
.
Figura 40: Trabalhando com Sets
Fonte: o autor
 A INTERFACE MAP
O primeiro ponto que você precisa saber sobre a interface Map é que embora as 
classes SortedMap, Hashtable, HashMap, TreeMap e LinkedHashMap 
sejam consideradas coleções, nenhuma destas estendem de Collection como 
as classes que implementam as interfaces Set e List. Você deve considerar um 
objeto Map como um objeto que mapeia chaves para valores não permitindo que 
existam chaves duplicadas (assim como Sets, Maps conta apenas com o método 
equals() para derterminar se as chaves são iguais ou diferentes) e que cada 
chave pode ser mapeada para no máximo um valor. 
Chamamos este tipo de mapeamento de mapeamento um para um. Um 
objeto Map difere de um Set no fato de que Map possui chave e valor, enquanto 
Set possui somente chave. A inteface que estente Map responsável por manter 
suas chaves ordenadas é a SortedMap. Implementações realizadas com Maps per-
mitem buscar um valor com base em uma determinada chave, recuperar uma 
coleção apenas dos valores ou apenas das chaves. No exemplo que iremos estu-
dar a seguir, vamos utilizar um HashMap para contar o número de Strings que 
iniciam com uma determinada letra.
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
 1
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 import javax.swing.JOptionPane;
 6 import javax.swing.JTextArea;
 7 
 8 public class Exemplo8 {
 9 
10 private static String[] nomes = {“João”, “José,
11 “Pedro”, “Carlos”, “Jaqueline”,
12 “Matheus”, “Marcelo”};
13 
14 public Exemplo8() {
15 HashMap map = new HashMap();
16 Integer i;
17 
18 for (int j = 0; j < nomes.length; j++) {
19 i = (Integer) map.get(
20 new Character(nomes[j].charAt(0)));
21 
22 if (i == null) {
23 map.put(new Character(nomes[j].charAt(0)),
24 new Integer(1));
25 } else {
26 map.put(new Character(nomes[j].charAt(0)),
27 new Integer(i.intValue() + 1));
28 }
29 }
30 
31 this.geraSaidaMap(map);
32 }
33 
34 private void geraSaidaMap(Map mapRef) {
35 String saida = “”;
36 saida += “Número de palavras iniciadas com a letra:”;
37 saida += “\n” + mapRef.toString();
38 saida += “\nQuantidade de valores do Map: “ + mapRef.
size();
39 saida += “\né vazio?: “ + mapRef.isEmpty();
40
105
 A Interface Map
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Quadro 51: Exemplo utilizando HashMap
Na linha 15 do nosso exemplo, construímos um HashMap para armazenar a 
quantidade de palavras nomes que iniciam por uma determinada letra em map. 
Perceba que este armazenamento é realizado no laço for das linhas 18 a 29. Note 
que nas linhas 19 e 20 foi realizada uma chamada para o método get de map 
para recuperar do HashMap a primeira letra de uma String em nomes utilizando 
Character. Se não for encontrado um objeto mapeado em HashMap, o método 
get irá devolver null, caso contrário, o valor do mapeamento é devolvido como 
um objeto, convertido para Integer e atribuído em i.
Perceba que na linha 22 do nosso exemplo é verificado se i é null. Caso 
seja, as linhas 23 a 24 realizam uma chamada para o método put de map para 
armazenar um Integer com valor 1 no HashMap. Esse valor é o número de pala-
vras que inicia com Character. Se i não for null, significa que Character está 
no HashMap, por isso, as linhas 26 a 27 incrementam o valor de Integer em 1 
atualizando o valor no HashMap.
O método geraSaidaMap declarado na linha 34 recebe como argumento 
um Map e atribui o seu conteúdo na variável saida utilizando o método toS-
tring. A linha 38 recupera o número de valores no Map por meio do método 
size e a linha 39 recupera um boolean pro meio do método isEmpty indi-
cando se o Map está vazio. Veja, a seguir, o resultado da execução deste programa.
41 JTextArea saidaArea = new JTextArea();
42 saidaArea.setText(saida);
43 
44 JOptionPane.showMessageDialog(null, saidaArea,
45 “Trabalhando com Maps”,
46 JOptionPane.INFORMATION_MESSAGE);
47 
48 System.exit(0);
49 }
50 
51 public static void main(String[] args) {
52 new Exemplo8();
53 }
54 }
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
Figura 41: Trabalhando com Maps
Fonte: o autor
A INTERFACE QUEUE
Você, provavelmente, já deve ter ouvido falar do conceito FIFO (first in, first out), 
ou em português: primeiro a entrar, primeiro a sair. Pois bem, uma Queue, que 
significa fila em português, segue este conceito (embora outras ordens sejam 
possíveis) e tem como objetivo manter uma lista de tarefas a serem processa-
das de alguma maneira. Além de suportar todos os métodos padrões de uma 
Collection, ela também possui métodos adicionais para adicionar, extrair e revi-
sar os elementos da fila.
A classe responsável por implementar uma Queue é a PriorityQueue. 
Adicionada no Java 5, seus elementos são ordenados pela ordem natural e seu 
objetivo é criar uma fila onde o elemento que tem prioridade para entrar, tem 
prioridade para sair (priority in, priority out), ou seja, os elementos ordenados 
primeiro serão acessados pimeiro, o que difere de uma fila do tipo FIFO (pri-
meiro a entrar é o primeiro a sair). 
Vimos no começo desse tópico que uma Queue é uma interface com o pro-
pósito de manter uma lista de tarefas ou coisas a se fazer. A seguir, vamos ver 
um exemplo de implementação de Queue utilizando a classe LinkedList.
107
A Interface Queue
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
 1
 2 
 3 import java.util.LinkedList;
 4 import java.util.Queue;
 5 import javax.swing.JOptionPane;
 6 import javax.swing.JTextArea;
 7 
 8 public class Exemplo9 {
 9 
10 String saida = “”;
11 
12 public Exemplo9() {
13 Queue<Integer> queue = new LinkedList<Integer>();
14 this.adicionarElemento(queue);
15 saida += “\n”;
16 this.removerElemento(queue);
17 
18 JTextArea saidaArea = new JTextArea();
19 saidaArea.setText(saida);
20 
21 JOptionPane.showMessageDialog(null, saidaArea,
22 “Trabalhando com Queues”,
23 JOptionPane.INFORMATION_MESSAGE);
24 
25 System.exit(0);
26 }
27 
28 public static void main(String[] args) {
29 new Exemplo9();
30 }
31 
32 private void adicionarElemento(Queue qe) {
33 int elemento = 10;
34 for (int i = elemento; i >= 0; i--) {
35 saida += “Adicionando o elemento: “ + i + “ na 
fila\n”;
36 qe.add(i);
37 }
38 }
39 
40 private void removerElemento(Queue qe) {
41 while (!qe.isEmpty()) {
42 saida += “Removendo o elemento: “ + qe.remove()
43 + “ da fila\n”;
44 }
45 }
46 } Q
ua
dr
o 
52
: I
m
pl
em
en
ta
çã
o 
de
 Q
ue
ue
 u
til
iz
an
do
 L
in
ke
dL
ist
ARRAYS E COLEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
III
Vamos analisar nosso exemplo. Note que na linha 13 estamos declarando uma 
Queue (fila) que recebe uma instância de uma LinkedList. Assim como um 
ArrayList, LinkedList éuma classe onde seus elementos são ordenados pela 
posição no índice exceto pelos elementos serem duplamente encadeados. Além 
dos métodos obtidos da interface List, esse encadeamento fornece métodos para 
inserção ou remoção do início ou final da fila tornando-se a melhor opção para 
implementações de pilha ou fila.
Vamos agora analisar o método adicionarElemento() declarado na 
linha 32. Este método recebe como argumento uma Queue na qual são adiciona-
dos 6 elementos. Perceba na linha 33 que foi declarada uma variável elemento 
de tipo int e inicializa com o valor 5. A linha 34 realiza um laço for decre-
mento este valor até 0 e adicionando o valor decrementado na fila como mostra 
a linha 33, ou seja, o primeiro elemento a entrar na fila é o 5, o próximo é o 4, 3 
o seguinte e assim sucessivamente decrementando e adicionando até 0.
O método removerElemento declarado na linha 40 também recebe como 
argumento uma Queue da qual serão removidos os elementos contidos nela. A 
linha 41 realiza um laço while que enquanto a fila não for vazia (verificação 
realizada com o método isEmpty()) será removido um elemento como mos-
tra a linha 42 ao utilizar o método remove(). Esse método tem a finalidade de 
recuperar e remover um objeto da fila.
Como dito anteriormente, uma Queue segue o conceito FIFO, onde o pri-
meiro que entra é o primeiro que sai. Em nosso exemplo, o primeiro elemento 
que entrou na fila é o 5 e o último foi o 0. Portanto, o primeiro elemento a sair 
da fila será o 5 e o último será o 0. Veja, a seguir, a execução do programa.
109
Considerações Finais
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura 42: Trabalhando com Queues
Fonte: o autor
CONSIDERAÇÕES FINAIS
Prezado(a) aluno(a), nesta unidade você estudou sobre duas estruturas de dados 
muito utilizadas para armazenamentos e processamento de informações, Arrays 
e Coleções. 
Você aprendeu que Arrays são estruturas simples que consistem em uma 
estrutura de dados de um mesmo tipo onde os elementos são armazenados um 
após o outro sendo possível seu acesso por meio de um índice e, que para pro-
cessarmos algum tipo de informação é preciso criar programas que atendam a 
tal necessidade.
Vimos que Coleções são estruturas de dados mais elaboradas que permi-
tem armazenar outros objetos. Diferentemente de Arrays, Coleções possuem um 
conjunto de interfaces que possibilita manipular os elementos de uma Coleção 
sem você se preocupar como a estrutura foi criada.
1. Três das declarações de Arrays são válidas. Selecione quais.
a) int [ ] idade;
b) [ ] int idade;
c) int idade [ ];
d) Thread [ ] threads;
e) [ ] threads Thread;
2. O código abaixo gera a exceção ArrayIndexOutOfBoundsExcep-
tion. Indique em qual linha ocorre esta exceção e por qual motivo.
3. Segundo o pacote java.util.*, quais as interfaces que implementam diretamente 
a interface Collection?
a) Set
b) Map
c) List
d) Queue
e) SortedSet
 1 
 2 
 3 public class Exercicio2 {
 4 
 5 public static void main(String[] args) {
 6 String[] texto = new String[10];
 7 
 8 for (int i = 0; i < 10; i++) {
 9 texto[i] = “Texto”+(i+1);
10 }
11 
12 for (int i = 0; i <= texto.length; i++) {
13 String stringTexto = texto[i];
14 System.out.println(stringTexto);
15 }
16 }
17 }
Material Complementar
MATERIAL COMPLEMENTAR
Collections Framework – Apostila Java e Orientação a Objetos (Capítulo 16)
Por Caelum
Ao término desta unidade, você será capaz de:
utilizar arrays, lists, sets ou maps dependendo da necessidade do programa;
iterar e ordenar listas e coleções;
usar mapas para inserção e busca de objetos.
Saiba mais sobre o assunto no artigo completo.
Fonte: <http://www.caelum.com.br/apostila-java-orientacao-objetos/collections-framework/>
Coleções no Java – Parte 1
Fonte: <http://www.youtube.com/watch?v=QTrlTt9kE4E>. 
Coleções no Java – Parte 2
Fonte: <http://www.youtube.com/watch?v=GyCzVTsp3Mo>. 
Coleções no Java – Parte 3
Fonte: <http://www.youtube.com/watch?v=KMp6QoMNPGM>.
Sempre que precisar manipular informações em uma estrutura de dados, 
lembre-se que as Coleções possuem métodos prontos que lhe auxiliam nes-
ta tarefa, diferentemente de Arrays que necessecitam de implementações 
para manipular os registros contidos no Array.
U
N
ID
A
D
E IV
Professor Dr. Edson A. Oliveira Junior
INTRODUÇÃO À INTERFACE 
GRÁFICA E TRATAMENTO DE 
EXCEÇÕES
Objetivos de Aprendizagem
 ■ Entender o que é a biblioteca SWING.
 ■ Estudar o tratamento de exceções do JAVA.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
 ■ O que é a biblioteca Swing
 ■ Criando um Projeto no NetBeans IDE
 ■ Criando um Container JFrame
 ■ Adicionando componentes SWING
 ■ Construindo Interface
 ■ Escrevendo o código
 ■ Tratamento de exceções
 ■ Captura de Exceções
 ■ Definindo Exceções
 ■ Hierarquia de Exceções
 ■ Captura de Exceções
 ■ Declaração de Exceções e Interface Pública
INTRODUÇÃO
Caro(a) aluno(a), nesta unidade iremos apresentar o processo de criação da 
interface gráfica do usuário (GUI) utilizando a biblioteca Swing do Java. Vamos 
implementar um simples sistema de cadastro de cursos de idiomas utilizando a 
ferramenta de desenvolvimento NetBeans. 
O GUI Builder do NetBeans IDE permite criar visualmente aplicações GUI 
em Java e esta ferramenta facilita o desenvolvimento das telas de forma integrada 
com o código-fonte. Também serão apresentadas técnicas básicas de tratamento 
de exceções. As exceções ocorrem quando algo imprevisto acontece, elas podem 
ser provenientes de erros de lógica ou acesso a recursos que talvez não estejam 
disponíveis. O tratamento de exceções ajuda a aprimorar a tolerância a falhas 
de um programa.
O QUE É A BIBLIOTECA SWING?
O Swing é um toolkit que inclui um conjunto de componentes para fornecer 
uma construção de interface gráfica para usuário (GUI) de programas Java. 
O Swing é a principal biblioteca para criação de aplicações desktop com Java.  
Aplicações desktop são aquelas que rodam diretamente na máquina do usuário, 
sendo necessária a instalação prévia do programa para que possam ser executa-
das. Aplicativos office, players de vídeo e áudio, ambientes de desenvolvimento 
de software são exemplos comuns desse tipo de aplicação.
O Swing foi desenvolvido para fornecer um conjunto mais sofisticado de 
componentes GUI comparando com o Abstract Window Toolkit (AWT). Swing 
fornece um visual nativo que simula a aparência de várias plataformas. Além de 
componentes familiares, tais como botões, caixas de seleção e rótulos, há ainda 
uma seção especialmente sobre gerenciamento de layout, os chamados “Layout 
Managers”, item muito importante quanto se trata de programação de Interfaces 
Gráficas. O GUI Builder do NetBeans torna possível construir interfaces de 
115
Introdução
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
aparência profissional sem um conhecimento profundo dos gerenciadores de 
layout. Você pode criar formulários simplesmente colocando componentes 
onde desejar.
CRIANDO UM PROJETO NO NETBEANS IDE
Para criar um novo projeto no NetBeans IDE, siga os passos abaixo: 
1. Escolha Arquivo > Novo Projeto. Se preferir é possível clicar no ícone 
Novo Projetona barra de ferramentas do NetBeans.
2. No painel Categorias, selecione o nó Java e no painel Projetos, escolha 
Aplicação Java. Clique em Próximo.
3. Insira o nome do projeto, aqui vamos nomear para “ProjetoSwing” 
e especifique o local do projeto.
4. Deixe desmarcada a caixa de seleção Utilizar Pasta Dedicada para Arma-
zenar Bibliotecas.
5. Verifique se a caixa de seleção Definir como Projeto Principal está mar-
cada e desmarque o campo Criar Classe Principal.
6. Clique em Finalizar.
117
Criando um Contêiner Jframe
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura 43: Criando projeto no NetBeans
O NetBeans criará o projeto ProjetoSwing no sistema. Esse projeto contém todos 
os arquivos associados como pastas para armazenamento de códigos-fontes e 
testes e uma pasta para os metadados específicos do projeto. 
CRIANDO UM CONTÊINER JFRAME
Para adicionar um contêiner JFrame:
1. Clique com o botão direito do mouse no nó ProjetoSwing e selecione 
Novo > Form JFrame.
2. Insira como Nome da Classe “Formulario”.
3. Clique em Finalizar.
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
Figura 44: Criando um JFRAME no NetBeans
Observe que será criada uma nova tela com uma caixa de edição, onde você irá 
construir toda sua interface gráfica, é possível redimensionar a tela com faci-
lidade. Observe ao lado direito da tela que há 2 seções, Paleta e Propriedades. 
Em paleta se encontra todos os componentes para criar sua interface gráfica e 
na seção Propriedades é possível definir vários atributos a cada componente. 
Figura 45: JFrame do NetBeans
119
Adicionando Componentes Swing
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
ADICIONANDO COMPONENTES SWING
Como já adicionamos um JFrame como container principal vamos separar os 
itens do nosso formulário com JPanel.
Para adicionar um JPanel:
Na janela Paleta, selecione o componente Painel na categoria Contêineres do 
Swing e mova até o canto esquerdo superior do form no GUI Builder. Alinhe o 
componente ao JPanel e, em seguida, acrescente mais um Jpanel para que pos-
samos separar as categorias em nosso form. 
Figura 46: Inserindo JPanel
Adicionando título aos JPanels:
1. Selecione o JPanel superior no GUI Builder.
2. Na janela Propriedades, clique no botão de reticências (...) ao lado da 
propriedade Borda.
3. No editor de Bordas do JPanel exibido, selecione o nó Borda com Título 
no painel Bordas Disponíveis.
4. No painel Propriedades abaixo, insira CADASTRO para a propriedade 
Título.
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
5. Clique nas reticências (...) ao lado da propriedade Fonte, selecione Negrito 
em Estilo de Fonte e insira 14 no Tamanho. Clique em OK para fechar 
as caixas de diálogo.
6. Selecione o JPanel inferior e repita as etapas acima.
As bordas com título serão adicionadas a ambos componentes JPanel.
Figura 47: Definindo as bordas dos JPanels
CONSTRUINDO A INTERFACE
Como vamos fazer um sistema simples de cadastro, utilizaremos os seguintes 
componentes: 
 ■ JLabel: permite inserir textos e imagens.
 ■ JTextField: caixa de texto para que o usuário insira os dados no pro-
grama. – lembrando que todos os dados inseridos em um JTextField são 
tratados como String. 
 ■ JRadioButton: botão que permite apenas seleção de uma opção quando 
121
Construindo a Interface
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
relacionado a um ButtonGroup.
 ■ JComboBox: componente semelhante a um vetor, que permite ao usu-
ário escolher apenas uma opção.
 ■ JButton: botão onde serão implementados os eventos.
 ■ JTextArea: campo semelhante ao JTextField, normalmente usado para 
entrada de textos maiores. Como críticas, sugestões etc. 
 ■ JCheckBox: caixas de múltiplas seleções, permite o usuário marcar 
várias opções ao mesmo tempo.
Para adicionar os componentes JLabel ao form:
1. Na janela Paleta, selecione o componente Label na categoria Controles 
do Swing.
2. Mova o cursor acima do JPanel CADASTRO e posicione o Label no Canto 
superior esquerdo. 
3. Clique duas vezes no JLabel para selecionar a exibição de texto.
4. Digite “Nome:” e pressione Enter para que o novo nome do Label seja 
exibido.
Para adicionar um JTextField ao form:
1. Na janela Paleta, selecione o componente Campo de texto na categoria 
Controles do Swing.
2. Mova o cursor imediatamente à direita do JLabel Nome: recém-adicio-
nado. 
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
Figura 48: Inserindo os JTextField
Antes de continuar, vamos selecionar o campo JTextField e no menu proprieda-
des navegar até a propriedade text do componente.
Agora que você aprendeu a inserir os componentes de JTextField e JLabel, 
vamos deixar nosso formulário igual a figura abaixo: 
Figura 49: Inserindo os JTextField
Para você deixar os componentes JTextField do mesmo tamanho basta selecio-
nar todos ao mesmo tempo e clique com o botão direito do mouse em um deles 
e escolha, Definir Mesmo Tamanho > Mesma Largura no menu pop-up.
123
Construindo a Interface
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Para adicionar um JComboBox:
1. Selecione a Caixa de Combinação no GUI Builder.
2. Arraste o JComboBox e posicione conforme a figura abaixo.
Figura 50: Inserindo componentes SWING no Formulário 
Para inserir itens no JComboBox da opção ‘UF, você deverá clicar nas reticências 
(...) da opção model em propriedades, insira o nome do item que você quer que 
apareça e clique em adicionar. Nesse exemplo coloquei todos os estados brasileiros.
Para adicionar JRadioButton:
1. Na janela Paleta, selecione o componente Botão de Rádio na categoria 
Controles do Swing.
2. Arraste e posicione os JRadioButton conforme figura abaixo.
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
Figura 51: Inserindo componentes SWING no Formulário 
Para permitir que seja marcada apenas uma opção nos JRadioButtons, da 
opção Sexo de nosso cadastro, você deve adicionar ao projeto o componente 
ButtonGroup, este componente não apresenta nenhum tipo de interface, ao 
inseri-lo note que ele será adicionado no inspetor de componentes à esquerda 
da tela. Em seguida, vá até as propriedades dos JRadioButtons, opção button-
Group e escolha buttonGroup1 (nome padrão para este componente), faça isso 
para ambos os JRadioButtons.
Para adicionar JCheckBox:
1. Na janela Paleta, selecione o componente Caixa de Seleção na categoria Con-
troles do Swing.
2. Arraste e posicione os JCheckBox.
3. Altere o campo text de cada JCheckBox conforme abaixo.
125
Construindo a Interface
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura52: Inserindo componentes SWING no Formulário 
Para alinhar os JCheckBox selecione todos ao mesmo tempo e com o botão direito 
do mouse vá em redimensionamento automático horizontal.
Para adicionar JTextArea:
1. Na janela Paleta, selecione o componente Área de Texto na categoria 
Controles do Swing.
2. Arraste e posicione o JTextArea.
Para adicionar JButton:
1. Na janela Paleta, selecione o componente Botão na categoria Contro-
les do Swing.
2. Arraste e posicione o JButton.
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
Nosso formulário deve ficar conforme abaixo:
Figura 53: Inserindo componentes SWING no Formulário 
No exemplo acima, estamos usando todos os componentes mencionados 
anteriormente. 
ESCREVENDO O CÓDIGO
Para iniciar a implementação do código, deve-se alterar o nome das variáveis 
de todos os componentes que serão utilizados para que nosso código fique mais 
limpo e organizado.
Para alterar o nome da variável de um componente, clique sobre ele, com o 
botão direito do mouse escolha ‘Alterar o nome de variável...’.
Coloque:
 ■ Para os JTextField os nomes a seguir: nomeCampo; telefoneCampo; 
enderecoCampo; cidadeCampo; emailCampo. 
 ■ Para o JComboBox: estadoCampo.
127
Escrevendo o Código
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
 ■ Para os JRadioButton: masculinoCampo; femininoCampo.
 ■ Para JCheckBox: alemaoCampo; espanholCampo; francesCampo; ingles-
Campo; italianoCampo; japonesCampo.
 ■ Para JTextArea: motivoCampo.
 ■ Para JButton: salvar.
Não é necessário alterar os JPanels nem os JLabels. 
O próximo passo é criar uma classe com todas as variáveis utilizadas no 
formulário Swing. Lembrando que o nosso objetivo é compreender como os 
componentes do Swing funcionam e como adicionamos os eventos e métodos 
necessários à implementação dos componentes. Aqui será criada apenas uma 
classe que será o nosso objeto para manipular e armazenar os dados contidos 
em todos os componentes do nosso formulário. 
Para criar a classe que será nosso Objeto:
1. Clique com o botão direito do mouse sobre o pacote default, selecione 
Novo>classe Java.
2. No nome da Classe coloque Cadastro e clique em finalizar.
Observe que foi criado uma classe chamada Cadastro ao lado esquerdo da tela. 
Figura 54: Criando a Classe Cadastro 
Agora, vamos inserir todos os atributos que serão utilizados em nosso projeto e 
gerar todos os gets e sets. Para gerar os gets e sets clique com o botão direito do 
mouse e selecione a opção “Inserir código”; na janela pop up selecione “Getter 
e Setter ...” conforme a figura abaixo:
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
 Figura 55: Implementando os métodos da Classe Cadastro
Observe que os nomes dos atributos são semelhantes aos campos em nosso 
formulário. É importante manter nomes de atributos condizentes com as 
variáveis utilizadas no form do Swing para facilitar na implementação. 
Para criar um evento no Botão Salvar:
1. Clique com o botão direito do mouse sobre o botão Salvar.
2. Navegue até a propriedade evento>action>actionPerformed.
3. O NetBeans irá apresentar o método salvarActionPerformed criado auto-
maticamente.
Figura 56: Atribuindo evento ao botão Salvar 
Aqui, iremos implementar o código dos dados recebidos nos campos do nosso 
Form. Primeiramente, é necessário instanciar o objeto que criamos da seguinte 
maneira:
Figura 57: Instanciando o objeto Cadastro
129
Escrevendo o Código
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
É necessário utilizar o método getText() para receber os dados inseridos em um 
JTextField conforme a figura abaixo. 
Figura 58: Atribuindo os valores das variáveis aos atributos
Observe que a nomenclatura dos atributos e dos campos facilita a visualização 
do código, nesse caso está claro que o atributo nome do objeto está recebendo 
os dados do campo nome do formulário.
Agora implemente o mesmo método para os outros atributos de texto con-
forme abaixo incluído o campo JTextArea: 
Figura 59: Atribuindo os valores das variáveis aos atributos
Agora, vamos implementar os códigos dos campos de seleção JCheckBox, a 
diferença é que teremos de fazer algumas validações para descobrir se estão sele-
cionados ou não. Os atributos que fazem referência aos JCheckBox são do tipo 
boolean, então a chamada do método ficará da seguinte maneira:
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
Figura 60: Atribuindo os valores das variáveis aos atributos
A mesma ideia será utilizada para o campo sexo do nosso formulário, porém 
como é um buttonGroup, teremos de fazer uma condição para atribuir uma String 
ao nosso Objeto quando um deles estiverem selecionados da seguinte forma: 
Figura 61: Atribuindo os valores das variáveis aos atributos
E, finalmente, o JComboBox que se refere ao nosso atributo Estado, o método a 
ser implementado para esse componente é o getSelectedItem(), mas é necessário 
observar que o tipo do atributo Estado é String e, por isso teremos de realizar um 
“casting” ou moldagem para converter um objeto ou primitiva de um tipo para 
outro. No caso iremos converter a nossa primitiva para String. O nosso método 
ficará da seguinte forma:
Figura 62: Atribuindo os valores das variáveis aos atributos
Todos os métodos necessários para salvar os dados inseridos no nosso formu-
lário foram implementados. 
131
Escrevendo o Código
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Para concluir o método salvar devemos inserir uma informação apresen-
tando ao usuário que o formulário foi salvo. Para isso, fazemos uso da classe 
JOptionPane. Essa classe proporciona uma série de métodos estáticos que ao serem 
invocados criam caixas de diálogos simples e objetivas. Para usar JOptionPane 
temos de importar o pacote javax.swing.JOptionPane primeiro.
O método showMessageDialog é responsável por trazer a caixa de mensa-
gem, o qual pode ter muitos argumentos. Abaixo é possível visualizar o método 
para apresentação da Mensagem de confirmação do cadastro.
Figura 63: Declarando a mensagem de confirmação
Outro método que deve ser implementado em nosso projeto é o método lim-
par(). O objetivo desse método é eliminar da tela todas as informações que foram 
digitadas no formulário após clicar no botão Salvar. 
Para deixar o nosso código mais organizado vamos criar um método novo 
na mesma classe Formulário, abaixo do método salvar da seguinte forma: 
Figura 64: Implementando o método limpar
Aqui, vamos definir novos valores para limpar cada campo de nosso formulário. 
Para os campos de texto, JTextField e JTextArea, basta atribuirmos “” por meio 
do método setText(“”); para os JCheckBox devemos fazer uso do método setSe-
lected(false) conforme pode ser visto na figura abaixo:
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
Figura 65: Implementando o método limpar
Para alterar o estado dos JRadioButton definidos para representar Masculino e 
Feminino deve-se modificar o componentebuttonGroup1 por meio do método 
clearSelecion(). Segue abaixo o método para limpar esse componente. 
Figura 66: Implementando o método limpar
E, finalmente, para alterar o estado do JComboBox fazemos uso da propriedade 
índex definindo -1 para sua posição conforme abaixo:
Figura 67: Implementando o método limpar
Para que o método limpar() seja executado fazemos a chamada no método Salvar 
antes da mensagem de confirmação de cadastro salvo.
133
Escrevendo o Código
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura 68: Fazendo a chamada do método limpar no método salvar
Para executar o projeto é necessário pressionar o botão executar projeto ou ape-
nas pressionar a tecla F6. A tela do cadastro deve ser semelhante à tela da figura 
abaixo.
Observe que o formulário não possui validações quanto à inserção de dados 
vazios. E nem tratamento de exceções. Vamos ver esse tópico a seguir.
Figura 69: Formulário em execução
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
TRATAMENTO DE EXCEÇÕES
Quando um evento excepcional ocorre em Java, diz-se que uma exceção será 
lançada. O código que é responsável por fazer algo com a exceção é chamado de 
manipulador de exceções; ele captura a exceção lançada.
Uma exceção é uma ocorrência que altera o fluxo normal do programa. Ela 
pode ocorrer por diversos motivos, incluindo os seguintes:
 ■ Um usuário encontrou dados inválidos.
 ■ Um arquivo que precisa ser aberto não pode ser encontrado.
 ■ A conexão de rede foi perdida no meio de comunicação, ou a JVM está 
sem memória.
 ■ Falhas no Hardware.
 ■ Exaustão de recursos.
Com o tratamento de exceções, um programa pode continuar executando (ao 
invés de encerrar) depois de lidar com um problema. Isso ajuda a assegurar a 
robustez dos aplicativos.
CAPTURA DE EXCEÇÕES
A manipulação da exceção funciona pela transferência da execução de um pro-
grama para um manipulador de exceções apropriado quando uma exceção 
ocorrer. Por exemplo, se você chamar um método que abra um arquivo, mas o 
arquivo não puder ser aberto, a execução desse método será encerrada e o código 
que foi escrito para lidar com essa situação será processado. Portando, precisa-
mos de uma maneira para informar a JVM (Java Virtual Machine) que código 
executar quando uma determinada exceção ocorrer. Para fazer isso usamos as 
palavras-chaves try e catch.
135
Captura de Exceções
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
TRY / CATCH
Esta é a forma mais usada. O Código dentro de um bloco try / catch é chamado 
de código protegidos. Quando uma exceção é capturada temos de dar tratamento 
à exceção, ou seja, temos de ter um plano de contingência para resolver o pro-
blema que ela significa. Podemos declarar mais do que um bloco catch. Isso é 
importante porque podemos ter vários tipos diferentes de exceção sendo lança-
das e necessitar de um tratamento específico para cada um.
Figura 70: Implementação da exceção em bloco try / catch
No exemplo da figura acima as linhas 18 e 19 constituem a região protegida que 
será controlada pela cláusula try. A linha 20 é o manipulador para uma exce-
ção do tipo Exception. Observe que o bloco catch aparece imediatamente após o 
bloco try. Isso é um requisito; se você tiver um ou mais blocos catch, eles devem 
aparecer imediatamente após o bloco try. Além disso, todos os blocos catch pre-
cisam ficar um após o outro, sem nenhuma outra instrução ou bloco entre eles. 
A ordem na qual os blocos catch forem inseridos também importa.
A execução iniciará na linha 18. Se o programa for processado até a linha 
19 sem nenhuma exceção lançada, a execução será transferida para a linha 25, 
ou seja, no nosso exemplo, fora do bloco try / catch, e continuará daí em diante. 
Porém, se entre a linha 18 a 19 (o bloco try) uma exceção do tipo Exception for 
lançada, a execução será imediatamente transferida para a linha 21. Em seguida, 
as linhas 21 a 23 serão processadas para que todo o bloco catch seja executado e 
depois o processamento passará para a linha 25 e dará seguimento ao programa.
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
USANDO FINALLY
O bloco Finally é usado quando precisamos executar um código mesmo se hou-
ver uma exceção. Por exemplo, se você está escrevendo em um arquivo e acontece 
um erro, o arquivo tem que ser fechado mesmo assim. Ou se você está usando 
uma conexão a banco de dados e acontece algum problema a conexão tem de 
ser fechada. 
Figura 71: Implementação da exceção em bloco try/finally
DEFININDO EXCEÇÕES
Discutimos as exceções como um conceito. Sabemos que elas são lançadas quando 
um problema de algum tipo ocorre e que efeito terá sobre o fluxo de seu pro-
grama. Dissemos que a exceção é uma ocorrência que altera o fluxo normal do 
programa. Toda exceção é a instância de uma classe que possui a classe Exception 
em sua hierarquia de herança. 
Quando uma exceção é lançada, o objeto de um subtipo Exception especí-
fico é instanciado e inserido no manipulador de exceções como um argumento 
para a cláusula catch. Veja abaixo um exemplo:
137
Hierarquia de Exceções
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura 72: Implementação da exceção em bloco try/catch
Nesse exemplo é a instância de uma classe chamada resumidamente de 
ArrayIndexOutOfBoundsException. Como ocorrência com qualquer outro 
objeto, você pode chamar seus métodos.
HIERARQUIA DE EXCEÇÕES
Todas as classes de exceções são subtipos da classe Exception. Essa classe é deri-
vada da classe Throwable (que é derivada da classe Object). 
Java define 2 tipos de exceções:
 ■ As exceções verificadas: que herdam da 
classe Exception. O código do cliente 
tem de lidar com as 
exceções verificadas 
lançadas pelo API, ou 
em uma cláusula try /
catch ou encaminhan-
do-o para fora com a cláusula 
throws.
 ■ As Exceções não verificadas: As as 
RuntimeException que também se 
estende em Exception. No entanto, 
todas as exceções que herdam de 
RuntimeException recebem tratamento especial. Não 
há nenhuma exigência para o código do cliente para 
lidar com eles, e, portanto, eles são chamados de exceções 
não verificadas (unchecked). 
Figura 73: Hierarquia de exceções em Java
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
Ao decidir sobre exceções verificadas versus exceções não verificadas, pergunte 
a si mesmo: “Quais medidas o código pode tomar quando a exceção ocorrer?” 
Se o cliente conseguir tomar alguma ação alternativa para recuperar a exceção, 
essa será uma exceção verificada. Se o cliente não puder fazer nada para contor-
nar a exceção, então essa é uma exceção não verificada. 
Observe na imagem acima que NullPointerException estende de 
RuntimeException e, portanto, é uma exceção não verificada.
**Error: não são exceções e sim erros que jamais poderiam ter aconte-
cido.  Erros indicam que algo coisa está realmente muito errada na construção 
do código ou no ambiente de execução. Ex.: (OutOfMemoryError) quando 
o programa precisa de mais memória e (StackOverflowError ) que acontece 
quando a pilha estoura, porexemplo, quando um método chama a si mesmo 
sem nunca retornar.
DECLARAÇÃO DE EXCEÇÕES E A INTERFACE PÚBLICA
THROWS / THROW:
Como saberemos que um método lançará uma exceção que teremos de capturar? 
Da mesma forma que um método precisa especificar que tipo, quantos argu-
mentos aceitará e o que será retornado. As exceções que um método pode lançar 
devem ser declaradas (a menos que sejam subclasses de RuntimeException). A 
lista de exceções lançadas faz parte da interface pública de um método. A pala-
vra-chave throws é usada na forma descrita, a seguir, para listar exceções que 
um método pode lançar:
139
Declaração de Exceções e a Interface Pública
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura 74: Método com exceção throws
Esse método é um tipo de retorno void, que não aceita argumentos e declara 
que lança exceções do tipo MyException1 e MyException2 (só porque o método 
declara que lança uma exceção não significa que sempre o fará. Ele apenas informa 
que pode fazê-lo).
O conceito é semelhante ao de return, mas enquanto return está devolvendo 
um resultado de dentro do método, throws está lançando uma exceção. Nunca 
é possível considerar uma exceção como o resultado de um método, o objetivo 
do método é obter resultados sem lançar exceções. Veja abaixo um exemplo de 
método utilizando o throws e o throw. Vamos explicar a diferença deles a seguir.
Figura 75: Implementação da exceção throw e throws
A Principal diferença entre throw e throws é o uso e a funcionalidade. O throws 
são usados na assinatura do método para declarar exceção possivelmente lan-
çadas por qualquer método, throw é usado para lançar exceção no código Java, 
acima está um exemplo de ambos throw e throws.
INTRODUÇÃO À INTERFACE GRÁFICA E TRATAMENTO DE EXCEÇÕES
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
IV
CONSIDERAÇÕES FINAIS
Nessa unidade você aprendeu a construir aplicativos utilizando interface gráfica 
Swing. Você conheceu a ferramenta NetBeans IDE que torna muito simples o 
desenvolvimento de interfaces gráficas. Uma boa interface gráfica faz toda dife-
rença em qualquer programa, e a utilização de Swing para criação desta interface 
pode vir a ser muito útil.
Você aprendeu também que a linguagem Java fornece um mecanismo sofis-
ticado de manipulação de exceções. A manipulação de exceções permite que 
você isole seu código de correção de erros em blocos separados, de modo que o 
código principal não fique confuso por causa dele. Outro recurso interessante 
permite que você manipule erros semelhantes com um único bloco de manipu-
lações de erros, sem a duplicação de código. 
Você aprendeu que a palavra-chave try da linguagem Java é usada para espe-
cificar uma região protegida – um bloco de código no qual os problemas podem 
ser detectados. O bloco finally não é obrigatório, mas se houver um terá de vir 
após o bloco catch. 
141 
1. Crie o seguinte GUIs usando Java Swing. Você não tem de fornecer 
qualquer funcionalidade. 
2. Dado o código a seguir:
Sabendo-se que tanto o EOFException quanto FileNotFoundException são 
subclasses de IOException e presumindo que esse bloco de código seja 
inserido em uma classe, que declaração estará mais perto da verdade com 
relação a esse código?
1. System.out.print (“Inicio”);
2. try{
3. System.out.print (“ola_mundo”)
4. throw new FileNotFoundException();
5. }
6. System.out.print (“capturar_aqui”);
7. catch (EOFException e){
8. System.out.print (“fim_da_exceção_do_arquivo”);
9. }
10. catch (FileNotFoundException e){
11. System.out.print (“arquivo_nao_encontrado”);
12. }
a) O código não será compilado.
b) Saída do código: Inicio ola_mundo arquivo_nao_encontrado.
c) Saída do código: Inicio ola_mundo fim_da_exceção_do_arquivo.
d) Saída do código: Inicio ola_mundo capturar_aqui arquivo_nao_encon-
trado.
3. Há algo de errado com o manipulador de exceção a seguir? Será que este 
código compila?
try {
} catch (Exception e) {
 
} catch (ArithmeticException a) {
 
}
Material Complementar
MATERIAL COMPLEMENTAR
Quando trabalhar com Swing e projetar telas, lembre-se que as telas devem 
ser equilibradas e ordenadas.
Introdução à Programação Gráfica em Java com Swing
Por Rafael Steil
Neste artigo vamos ver como criar aplicações gráficas em Java, mais precisamente usando um 
Framework (conjunto de classes) chamado Swing. Veremos três exemplos, começando com um 
simples programa que apenas escreve uma mensagem na tela, passando para um programa que 
já trabalha com caixas de texto e botões, e por final veremos como trabalhar com listas. Há ainda 
uma seção especialmente sobre gerenciamento de layout, os chamados “Layout Managers”, item 
muito importante quanto se trata de programação GUI. Não é necessário que você tenha alguma 
experiência anterior em programação gráfica com Java, porém um mínimo de conhecimento 
da tecnologia ajudaria, apesar de não ser imprescindível, uma vez que é bastante comum as 
pessoas terem o primeiro contato com Java por meio de programação gráfica. Conhecimentos 
de lógica de programação são necessários, mesmo que seja apenas uma base. Para digitar os 
programas você pode usar qualquer editor de textos ou código de sua preferência, tais como 
Notedad, UltraEdit, VI, Emacs, KWrite e assim por diante. Programas em Java necessitam do JDK 
para serem desenvolvidos e, uma vez compilados, apenas a JRE faz-se ncessário. O JDK, por já 
ser um ambiente completo de desenvolvimento, já traz uma versão da JRE, portanto você não 
precisa ter os dois pacotes instalados na mesma máquina. Se você nunca mexeu com Java ou não 
tem (ou não sabe como instalar) o JDK, dê uma lida nos tutoriais “Instalando e configurando o 
JDK no Linux” (ou “Instalando e configurando o JDK no Windows” caso seja usuário de Windows), 
“Classpath, entendendo o que é e para que serve”, “Sopa de letrinhas sabor Java” e “Os erros e 
dúvidas de um iniciante”, disponíveis no site do GUJ seção “Artigos” e “Tutoriais”.
Saiba mais sobre o assunto no artigo completo.
Fonte: <http://www.guj.com.br/articles/38>. Acesso em: 03 abr. 2013
Projeto Java Completo com Swing – Parte 1
Fonte: <http://www.youtube.com/watch?v=HhulpEIWTds>.
Projeto Java Completo com Swing – Parte 2
Fonte: <http://www.youtube.com/watch?v=mxJos-f23ec>.
Os vídeos, a seguir, apresentam um Tutorial que mostra como desenvolver uma 
calculadora usando NetBeans IDE. Assista e aprenda um pouco mais.
Parte 1: <http://www.youtube.com/watch?v=v2w74ZwTrd4>.
Parte 2: <http://www.youtube.com/watch?NR=1&v=pjTHUlDpmls&feature=fvwp>.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
U
N
ID
A
D
E V
Professor Dr. Edson A. Oliveira Junior
PERSISTÊNCIA DE 
DADOS COM JPA
Objetivos de Aprendizagem
 ■ Estudar os principais fundamentos sobre JDBC.
 ■ Estudar os principais fundamentos sobre a API JPA.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
 ■ JDBC – Java Database Connectivity
 ■ Drivers JDBC
 ■ Conectando a um SGDB com Connection
 ■ Executando Instruções SQL com Statement
 ■ Executando Instruções SQL com PreparedStatement
 ■ Recuperando e utilizando dados de um ResultSet
 ■ O JPA – Java Persistence API
 ■ Entidades
 ■ Principais Anotações JPA
 ■ Relacionamentos JPA
 ■ Unidades de Persistência (Persistence Unit)
 ■ Gestor de Entidade (Entity Manager)
INTRODUÇÃO
Caro(a) aluno(a), nesta unidade iremos abordar os principais fundamentos da 
API JPA – Java Persistence API. 
Introduzida pelo EJB 3 (Enterprise Java Beans 3), o JPA é uma API que define 
um framework de persistência naqual fornece um modelo de mapeamento objeto 
relacional para a persistência em bancos de dados relacionais. Embora tenha sido 
projetado principalmente para o uso com grandes aplicações baseadas em servi-
dor, JPA pode ser usado diretamente tanto por aplicações web quanto desktop.
Quando falamos de persistência em Java com JPA, estamos falando de mapear 
objetos Java normais de forma automática para um banco de dados SQL. Sabe 
todos aqueles códigos pesados de consulta, inserção e atualização que estamos 
acostumados a fazer? Então. O JPA faz isto por você, ou seja, ele carrega, pes-
quisa e salva objetos do modelo de dados automaticamente sem você precisar 
se preocupar como isso é feito.
Mas antes de aprendermos sobre persistência com JPA, você irá estudar 
e conhecer alguns conceitos sobre a API JDBC – Java Database Connectivity. 
Diferentemente de JPA, JDBC não realiza persistência de dados utilizando um 
objeto Java mapeado para um modelo relacional e sim, realiza a persistência utili-
zando comandos SQL. Para isso a API JDBC fornece algumas interfaces para que 
essa persistência possa ser realiza como Connection, Statement, PreparedStatemen 
e outros que você irá estudar a seguir. Então, vamos aprender mais?
147
Introdução
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
JDBC – JAVA DATABASE CONNECTIVITY
Antes de entrarmos de cabeça nos estudos sobre o JPA, vamos falar um pouco 
sobre JDBC (Java Database Connectivity). JDBC trata-se de uma API para acesso 
a banco de dados relacionais por meio de comandos SQL em que a programação 
do sistema é a mesma para qualquer SGBD (Sistema Gerenciador de Banco de 
Dados), ou seja, não há necessidade de desenvolver aplicações amarradas com 
um banco específico. 
Com JDBC é possível: 
 ■ Estabelecer uma conexão com um banco de dados ou com qualquer fonte 
de dados tabular.
 ■ Executar instruções SQL.
 ■ Processar os resultados obtidos. 
DRIVERS JDBC
Para que seja possível estabelecer uma conexão com um banco de dados permi-
tindo que uma aplicação Java interaja com esse banco, o JDBC utiliza drivers 
específicos de acordo com cada SGDB. Por exemplo, para construir uma apli-
cação Java que realize acesso a um banco de dados MySQL é necessário utilizar 
os drivers específicos desse SGDB. Normalmente, os drivers JDBC são forneci-
dos pelos seus fabricantes ou por comunidades de usuários. 
Atualmente, existem quatro tipos de drivers que são classificados da maneira 
a seguir.
1. Ponte JDBC-ODBC – é o mais simples, porém restrito a plataforma Win-
dows. Geralmente utilizado quando não existe para o SGDB um driver 
nativo (tipo 4), sendo necessário um ODBC para se conectar ao banco 
de dados.
149
Conectando a um Sgdb com Connection
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
2. Driver API-Nativo – converte as chamadas JDBC para as chamadas da 
API cliente do SGDB.
3. Driver de Protocolo de Rede – trata-se do tipo mais flexível, pois possibi-
lita criar aplicações Java indepente de banco de dados, ou seja, a mesma 
aplicação pode se conectar a vários SGDBs diferentes.
4. Driver Nativo – é o mais recomendado, pois as chamadas JDBC são tra-
duzidas no protocolo do SGDB.
CONECTANDO A UM SGDB COM CONNECTION
A primeira interface que vamos estudar é a java.sql.Connection. Um 
objeto Connection representa uma sessão de conexão com um determinado 
banco de dados na qual as instruções SQL são executadas e os resultados obti-
dos dentro do contexto desta sessão. Para uma aplicação, ela permite que seja 
criada uma ou mais conexões com um mesmo banco de dados ou várias cone-
xões com diferentes bancos de dados.
Outro ponto interessante é que ela também permite obter informações do 
banco de dados a qual ela se conectou, por exemplo: 
 ■ Qual o fabricante e a versão do banco de dados.
 ■ O nome e versão do driver JDBC utilizado.
 ■ O nome do usuário utilizado na conexão.
 ■ A URL de conexão.
 ■ As estruturas das tabelas do banco de dados.
 ■ Qual a gramática SQL suportada.
 ■ Procedimentos.
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
Estas e outras informações podem ser obtidas por meio de um objeto 
DatabaseMetaData retornado pelo método getMetaData() acessado 
em uma instância de Connection. Ficou confuso(a)? Não se preocupe, tudo 
ficará mais claro adiante.
Você deve estar se perguntando: mas como eu crio ou obtenho uma cone-
xão com um banco de dados? A maneira mais comum de estabelecer uma 
conexão com um banco de dados é por meio de uma chamada para o método 
DriverManager.getConnection(). Esse método recebe como argu-
mento três Strings contendo a URL JDBC de conexão com o banco de dados, o 
usuário e a senha, respectivamente. Veja, a seguir, um pequeno trecho de código 
que representa uma conexão.
Quadro 53: Criando uma Connection
Quando utilizamos o DriverManager em uma aplicação para criarmos um objeto 
Connection, devemos fornecer para o método getConnection uma URL JDBC 
que tem a finalidade de fornecer uma maneira de identificar com qual banco de 
dados determinado driver irá estabeler uma conexão. Veja, a seguir, a sintaxe de 
uma URL JDBC, perceba que ela é separada em três partes utilizando dois pontos.
Quadro 54: Sintaxe de URL JDBC
A primeira parte jdbc indica que a URL em questão é uma URL JDBC. A segunda, 
<subprotocol>, representa o nome do driver de conexão utilizado para um 
determinado SGDB. O terceiro, <subname>, representa a fonte de dados a qual 
será realizada a conexão. Veja, a seguir, uma relação com os principais fabrican-
tes de banco de dados e o formato de URL JDBC de conexão de cada um.
jdbc: <subprotocol>: <subname>
//URL JDBC de conexão
String urlConexao = “jdbc:derby://localhost:1527/ead-bd”;
//obtendo um objeto Connection (uma conexão) com getConnection
Connection con = DriverManager.getConnection(urlConexao, usuario, 
senha);
151
Conectando a um Sgdb com Connection
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
SGDB Url de Conexão
Oracle jdbc:oracle:thin:@host:porta:nomeBanco (Porta padrão 1521)
PostgreSQL jdbc:postgresql://host:porta/nomeBanco (Porta padrão 5432)
DB2 jdbc:db2://host:porta/nomeBanco (Porta padrão 446, 6789, ou 50000)
SQL Server jdbc:sqlserver://host:porta;databaseName=nomeBanco (Porta padrão 1433)
MySQL jdbc:mysql://host:porta/nomeBanco (Porta padrão 3306)
Firebird jdbc:firebirdsql:host/porta:caminhoArquivo.fdb (Porta padrão 3050)
Tabela 1: Formatos de URL JDBC de conexão com banco de dados
Eu sei que você já deve estar ansioso(a) para começar a ver exemplos e pôr em 
prática o que estudamos até agora. Porém, você deverá executar alguns passos 
antes disso. O exemplo, a seguir, cria uma conexão com um banco de dados 
derby, portanto será necessário que você configure um banco de dados derby 
no seu computador. O NetBeans IDE possui ferramentas para iniciar e parar 
o serviço do derby e permitir criar o banco e as tabelas que iremos utilizar em 
nossos exemplos a partir de agora. O link, a seguir, contém um tutorial sobre 
como configurar o derby no NetBeans, siga o tutorial e para nossos estudos 
crie um banco com o nome ead-bd.
<http://netbeans.org/kb/docs/ide/java-db_pt_BR.html>.
Voltando aonosso exemplo, ele obtém informações da conexão e do banco de 
dados utilizando os métodos estudados até então. 
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
 1
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.SQLException;
 6 import javax.swing.JOptionPane;
 7 import javax.swing.JTextArea;
 8 
 9 public class ExemploConnection {
10 
11 private Connection con = null;
12 private String usuario = null;
13 private String senha = null;
14 private String urlConexao = null;
15 
16 public ExemploConnection() {
17 
18 urlConexao = “jdbc:derby://localhost:1527/ead-bd”;
19 usuario = “ead”;
20 senha = “ead”;
21 
22 this.conectarBanco();
23 
24 this.desconectaBanco();
25 }
26 
27 public static void main(String[] args) {
28 new ExemploConnection();
29 }
30 
31 private void conectarBanco() {
32 String saida = “”;
33 try {
34 con = DriverManager.getConnection(urlConexao,
35 usuario, senha);
36 
37 saida += “Informações de Conexão”;
38 saida += “\nFabricante SGDB: “
39 + con.getMetaData(). 
getDatabaseProductName();
153
Conectando a um Sgdb com Connection
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Quadro 55: Obtendo informações de conexão com banco de dados
40 saida += “\nVersão SGDB: “
41 + con.getMetaData().
getDatabaseProductVersion();
42 saida += “\nDriver SGDB: “
43 + con.getMetaData().getDriverName();
44 saida += “\nVersão Driver SGDB: “
45 + con.getMetaData().getDriverVersion();
46 saida += “\nUrl de Conexão: “
47 + con.getMetaData().getURL();
48 saida += “\nUsuário: “
49 + con.getMetaData().getUserName();
50 
51 JTextArea saidaArea = new JTextArea();
52 saidaArea.setText(saida);
53 
54 JOptionPane.showMessageDialog(null, saidaArea,
55 “Conexão realizada com Sucesso”,
56 JOptionPane.INFORMATION_MESSAGE);
57 } catch ( SQLException ex) {
58 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
59 “Erro ao conectar no banco”,
60 JOptionPane.ERROR_MESSAGE);
61 }
62 }
63 
64 private void desconectaBanco() {
65 try {
66 if (!con.isClosed()) {
67 con.close();
68 }
69 } catch (SQLException ex) {
70 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
71 “Erro ao desconectar”,
72 JOptionPane.ERROR_MESSAGE);
73 }
74 }
75 }
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
EXECUTANDO INSTRUÇÕES SQL COM STATEMENT
Um objeto Statement tem por objetivo executar uma instrução SQL sim-
ples sem parâmetros, retornando os resultados que ela produz por meio de um 
ResultSet (falaremos sobre ResultSet mais adiante, neste momento você só 
precisa saber que um ResultSet contém o resultado da execução de uma instru-
ção SQL). Por padrão, cada execução de Statement retorna apenas um ResultSet 
contendo todos os resultados daquela instrução SQL realizada. 
Quando criamos uma conexão com um determinado banco de dados utili-
zando um objeto Connection, podemos utilizar esta conexão para enviar instruções 
SQL neste banco por meio desse objeto. Para isso, precisamos criar um objeto 
Statement a partir do método createStatement() de Connection, como 
mostra o trecho de código a seguir.
Quadro 56: Criando um Statement
Para que seja possível executar instruções SQL com o objeto Statement obtido, 
você pode utilizar alguns dos métodos execute fornecidos por ele, passando 
como argumento uma String que contenha o SQL que será executado. Veja o 
trecho de código a seguir.
Quadro 57: Executando uma instrução SQL com Statement
//String SQL para seleção de dados
String sql = “SELECT * FROM TABELA”;
//cria um objeto Statement stmt para executar instruções SQL
Statement stmt = con.createStatement();
//executa instrução SQL com executeQuery
ResultSet rs = stmt.executeQuery(sql);
//obtendo um objeto Connection (uma conexão) com getConnection
Connection con = DriverManager.getConnection(urlConexao, usuario, 
senha);
//cria um objeto Statement stmt para executar instruções SQL
Statement stmt = con.createStatement();
155
Executando Instruções Sql com Statement
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
A seguir, veja um exemplo de como é realizada a declaração e execução de uma 
instrução SQL utilizando Statement. Porém, antes de prosseguir será necessá-
rio criarmos uma tabela em derby no banco de dados ead-bd. Este exemplo 
e os posteriores irão inserir e selecionar registros desta tabela. Crie no banco a 
seguinte estrutura de tabela.
Quadro 58: Instrução SQL para criar a tabela Produto
Agora que já temos a tabela criada, implemente o exemplo a seguir. Este exemplo: 
inserir um registro na tabela Produtos utilizando o método executeUpdate 
do objeto Statement.
CREATE TABLE PRODUTO (
 ID INTEGER NOT NULL, 
 DESCRICAO VARCHAR(60), 
 PRIMARY KEY (ID)
);
 1
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.SQLException;
 6 import java.sql.Statement;
 7 import javax.swing.JOptionPane;
 8 
 9 public class ExemploStatement {
10 
11 private Connection con = null;
12 private String usuario = null;
13 private String senha = null;
14 private String urlConexao = null;
15 private String driverJDBC = null;
16 
17 public ExemploStatement() {
18 driverJDBC = “org.apache.derby.jdbc.ClientDriver”;
19 urlConexao = “jdbc:derby://localhost:1527/ead-bd”;
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
20 usuario = “ead”;
21 senha = “ead”;
22 
23 this.conectarBanco();
24 this.executarStatement();
25 this.desconectaBanco();
26 }
27 
28 public static void main(String[] args) {
29 new ExemploStatement();
30 }
31 
32 private void conectarBanco() {
33 try {
34 Class.forName(driverJDBC);
35 con = DriverManager.getConnection(urlConexao,
36 usuario, senha);
37 } catch (ClassNotFoundException | SQLException ex) {
38 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
39 “Erro ao conectar no banco”,
40 JOptionPane.ERROR_MESSAGE);
41 }
42 }
43 
44 private void desconectaBanco() {
45 try {
46 if (!con.isClosed()) {
47 con.close();
48 }
49 } catch (SQLException ex) {
50 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
51 “Erro ao desconectar”,
52 JOptionPane.ERROR_MESSAGE);
53 }
54 }
55 
60 Statement stmt = con.createStatement();
61 int qtdRegistrosInseridos = stmt.
executeUpdate(sql);
157
EXECUTANDO INSTRUÇÕES SQL cOM PREPAREDSTATEMENT
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
oCó
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Quadro 59: Inserindo registros na tabela Produto
EXECUTANDO INSTRUÇÕES SQL COM 
PREPAREDSTATEMENT
O objetivo de um objeto PreparedStatement é executar uma instrução 
SQL pré-compilada, ou seja, um PreparedStatement envia a instrução SQL para 
o SGDB de modo a deixá-la pareparada para receber parâmetros esperados por 
esta instrução. A instrução SQL contida nesse objeto pode ter um ou mais parâ-
metros IN (entrada) em que o valor deste parâmetro não é definido quando o SQL 
é criado. Ao invés disso, é definido um ponto de interrogação “?” representando 
um espaço reservado para cada parâmetro. Veja o trecho de código que segue. 
62 String saida = “Quantidade de registros inseridos: 
“
63 + qtdRegistrosInseridos;
64 JOptionPane.showMessageDialog(null, saida,
65 “Registro Inserido com Sucesso”,
66 JOptionPane.INFORMATION_MESSAGE);
67 } catch (SQLException ex) {
68 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
69 “Erro ao inserir registro”,
70 JOptionPane.ERROR_MESSAGE);
71 }
72 }
73 }
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
Quadro 60: Criando um PreparedStatement
Antes de uma instrução SQL ser executada com PreparedStatement você deve 
definir um valor para cada ponto de interrogação. Isso pode ser feito por meio 
de chamadas do método setter (setInt, setString, ...) apropriado para cada 
tipo de parâmetro esperado pelo ponto de integerrogação. Por exemplo, se o 
parâmetro esperado é do tipo long, então você fará uma chamado para o método 
setLong passando dois argumentos para este método. O primeiro define a posi-
ção do parâmetro para qual será atribuído o valor (essa posição é iniciada por 1) 
e o segundo argumento define o valor que será atribuído. Veja o código a seguir.
Quadro 61: Executando uma instrução SQL com PreparedStatement
O exemplo, a seguir, mostra como inserir um registro no banco de dados utili-
zando PreparedStatement.
//SQL contendo dois parâmetros IN representados por “?”
String sql = “INSERT INTO EAD.PRODUTO (ID, DESCRICAO) VALUES (?, 
?)”;
//obtendo um objeto Connection (uma conexão) com getConnection
Connection con = DriverManager.getConnection(urlConexao, usuario, 
senha);
//cria um objeto PreparedStatement pstmt para executar instruções 
SQL
PreparedStatement pstmt = con.prepareStatement(sql);
//cria um objeto PreparedStatement pstmt para executar instruções 
SQL
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, 2000);
pstmt.setString(2, “DESCRICAO DO PRODUTO 2000”);
int qtdRegistrosInseridos = pstmt.executeUpdate();
159
EXECUTANDO INSTRUÇÕES SQL cOM PREPAREDSTATEMENT
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
1 
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.PreparedStatement;
 6 import java.sql.SQLException;
 7 import javax.swing.JOptionPane;
 8 
 9 public class ExemploPreparedStatement {
10 
11 private Connection con = null;
12 private String usuario = null;
13 private String senha = null;
14 private String urlConexao = null;
15 private String driverJDBC = null;
16 
17 public ExemploPreparedStatement() {
18 driverJDBC = “org.apache.derby.jdbc.ClientDriver”;
19 urlConexao = “jdbc:derby://localhost:1527/ead-bd”;
20 usuario = “ead”;
21 senha = “ead”;
22 
23 this.conectarBanco();
24 this.executarPreparedStatement();
25 this.desconectaBanco();
26 }
27 
28 public static void main(String[] args) {
29 new ExemploPreparedStatement();
30 }
31 
32 private void conectarBanco() {
33 try {
34 Class.forName(driverJDBC);
35 con = DriverManager.getConnection(urlConexao,
36 usuario, senha);
37 } catch (ClassNotFoundException | SQLException ex) {
38 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
39 “Erro ao conectar no banco”,
40 JOptionPane.ERROR_MESSAGE);
41 }
42 }
43 
44 private void desconectaBanco() {
45 try {
46 if (!con.isClosed()) {
47 con.close();
48 }
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
Quadro 62: Inserindo um registro no banco com PreparedStatement
49 } catch (SQLException ex) {
50 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
51 “Erro ao desconectar”,
52 JOptionPane.ERROR_MESSAGE);
53 }
54 }
55 
56 private void executarPreparedStatement() {
57 String sql = “INSERT INTO EAD.PRODUTO (ID, DESCRICAO) 
“
58 + “ VALUES (?, ?)”;
59 try {
60 PreparedStatement stmtProdutos = con.
prepareStatement(sql);
61 stmtProdutos.setInt(1, 2000);
62 stmtProdutos.setString(2, “DESCRICAO DO PRODUTO 
2000”);
63 int qtdRegistrosInseridos = stmtProdutos.
executeUpdate();
64 String saida = “Quantidade de registros inseridos: 
“
65 + qtdRegistrosInseridos;
66 JOptionPane.showMessageDialog(null, saida,
67 “Registro Inserido com Sucesso”,
68 JOptionPane.INFORMATION_MESSAGE);
69 } catch (SQLException ex) {
70 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
71 “Erro ao inserir registro”,
72 JOptionPane.ERROR_MESSAGE);
73 }
74 }
75 }
161
Recuperando e Utilizando Dados de um RESULTSET
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
RECUPERANDO E UTILIZANDO DADOS DE UM 
RESULTSET
Um ResultSet consiste em uma tabela que representa um conjunto de dados 
obtidos de um banco de dados por meior de uma instrução SQL executada por 
Statement ou PreparedStatement. 
Um objeto de ResultSet mantém um cursor para a linha corrente dos dados 
selecionados. Inicialmente, este cursor fica posicionado antes da primeira linha e 
para mover este cursor para a próxima linha você pode utilizar o método next 
retornando false quando não existir mais linhas para serem percorridas no 
objeto. O trecho de código a seguir obtém um ResultSet a partir da execução de 
uma instrução SQL com Statement.
Quadro 63: Obtendo um ResultSet
Para recuperar os valores da coluna da linha atual, você pode utilizar os méto-
dos getter fornecidos pelo objeto de ResultSet como getBoolean, getLong etc. 
Para isso, você pode utilizar o número do índice (mais eficiente) da coluna ou 
nome da coluna. Quando você utiliza métodos getter, o driver JDBC tenta con-
verter os dados ao tipo Java especificado no método getter retornando um valor 
Java adequado. Por exemplo, se você utilizar o método getString, será retor-
nado um valor do tipo String. Veja o exemplo a seguir.
String sql = “select ID, DESCRICAO from EAD.PRODUTO”;
Statement stmt = con.createStatement(
 ResultSet.TYPE_SCROLL_INSENSITIVE,
 ResultSet.CONCUR_READ_ONLY);
 
ResultSet dados = stmt.executeQuery(sql);
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
Quadro 64: Recuperando informações de um ResultSet
O exemplo, a seguir, mostra como percorrer os registros obtidos do banco de 
dados com Statement utilizando ResultSet.
1 package br.uem.ead.exemplos.jdbc.resultset;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Statement;
 8 import javax.swing.JOptionPane;
 9 import javax.swing.JTextArea;
 10 
 11 public class ExemploResultSet {
 12 
 13 private Connection con = null;
 14 private String usuario = null;
 15 private String senha = null;
 16 private String urlConexao = null;
 17 private String driverJDBC = null;
 18 
 19 public ExemploResultSet() {
 20 driverJDBC = “org.apache.derby.jdbc.ClientDriver”;
 21 urlConexao = “jdbc:derby://localhost:1527/ead-bd”;
 22 usuario = “ead”;
 23 senha = “ead”;
 24 
 25 this.conectarBanco();
 26 this.recuperarResultSet();
 27 this.desconectaBanco();
 28 }
 29 
ResultSet dados = stmt.executeQuery(sql);
dados.first();
while (!dados.isAfterLast()) {
 saida += “\n” + dados.getInt(1)
 + “\t” + dados.getString(2);
 dados.next();
}
163
Recuperando e Utilizando Dados de um RESULTSET
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
 30 public static void main(String[] args) {
 31 new ExemploResultSet();
 32 }
 33 
 34 private void conectarBanco() {
 35 try {
 36 Class.forName(driverJDBC);
 37 con = DriverManager.getConnection(urlConexao,
 38 usuario, senha);
 39 } catch (ClassNotFoundException | SQLException ex) {
 40 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
41 “Erro ao conectar no banco”,
 42 JOptionPane.ERROR_MESSAGE);
 43 }
 44 }
 45 
 46 private void desconectaBanco() {
 47 try {
 48 if (!con.isClosed()) {
 49 con.close();
 50 }
 51 } catch (SQLException ex) {
 52 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
 53 “Erro ao desconectar”,
 54 JOptionPane.ERROR_MESSAGE);
 55 }
 56 }
 57 
 58 private void recuperarResultSet() {
 59 String saida = “”;
 60 String sql = “select ID, DESCRICAO from EAD.PRODUTO”;
 61 try {
 62 Statement stmt = con.createStatement(
 63 ResultSet.TYPE_SCROLL_INSENSITIVE,
 64 ResultSet.CONCUR_READ_ONLY);
 65 
 66 ResultSet dados = stmt.executeQuery(sql);
 67 
 68 if (!dados.next()) {
 69 saida = “Nenhum registro cadastrado”;
 70 } else {
 71 saida = “Recuperando pelo índice da coluna”;
 72 saida += “\nCódigo\tDescrição”;
 73 
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
Quadro 65: Percorrendo registros obtidos com Statement por meio de um ResultSet
O JPA – JAVA PERSISTENCE API
Bem, caro(a) aluno(a), até o momento você estudou e aprendeu como se conectar 
74 dados.first();
 75 while (!dados.isAfterLast()) {
 76 saida += “\n” + dados.getInt(1)
 77 + “\t” + dados.getString(2);
 78 dados.next();
 79 }
 80 
 81 saida += “\n\nRecuperando pelo nome da 
coluna”;
 82 saida += “\nCódigo\tDescrição”;
83 dados.first();
 84 while (!dados.isAfterLast()) {
 85 saida += “\n” + dados.getInt(“ID”)
 86 + “\t” + dados.
getString(“DESCRICAO”);
 87 dados.next();
 88 }
 89 }
 90 
 91 JTextArea saidaArea = new JTextArea();
 92 saidaArea.setText(saida);
 93 JOptionPane.showMessageDialog(null, saidaArea,
 94 “Recuperando com ResultSet”,
 95 JOptionPane.INFORMATION_MESSAGE);
 96 } catch (SQLException ex) {
 97 JOptionPane.showMessageDialog(null, 
ex.getMessage(),
 98 “Erro ao recuperar registros”,
 99 JOptionPane.ERROR_MESSAGE);
100 }
101 }
102 }
165
O Jpa – Java Persistence Api
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
a um banco de dados relacional e interagir com ele a fim de realizar consultas e 
persistências de dados utilizando a API JDBC. Você aprendeu a utilizar Connection 
para se conectar a um banco, Statement e PreparedStatement para consultar e 
atualizar informações de acordo com métodos apropriados para cada situação 
e utilizou ResultSet para criar um cursor de dados e navegar por ele a fim de ler 
as informações obtidas por uma consulta com Statement e PreparedStatement. 
Sabe o que isto significa? Significa que você escreveu muito código que não escre-
veria se utilizasse o JPA.
O JPA ou Java Persistence API é um framework de persistência no qual per-
mite que um desenvolvedor Java realize mapeamentos objetos/relacionais para 
o gerenciamento de dados entre uma aplicação Java e um banco de dados rela-
cional. JPA permite que o desenvolvendor trabalhe diretamente com objetos e 
não com a execução de instruções SQL. Estamos falando de uma abstração de 
alto nível sobre JDBC que basicamente consiste em três áreas.
 ■ A API de persistência.
 ■ A linguagem de consulta.
 ■ Mapeamento objeto/relacional.
ENTIDADES
A partir deste momento vamos estudar os principais conceitos sobre JPA e ire-
mos aplicá-los em exemplos práticos no decorrer do nosso estudo. 
O primeiro conceito que vamos estudar é o de entidades. Uma Entity (ou em 
português, entidade) em JPA se refere a uma classe de entidade no qual repre-
senta uma tabela em um banco de dados e cada instância dessa classe é um objeto 
que se refere a um registro armazenado nesta tabela. Na programação em Java, 
o principal artefato que representa uma entidade é a Entity Class. Entity 
Class é uma classe também conhecida por Classe de Entidade em que o estado 
de persistência desta classe se dá pelos atributos com anotações que represen-
tam um mapeamento objeto/relacional para uma tabela de um banco de dados. 
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
Para que uma classe possa ser considerada uma Entity Class, ela deve seguir 
os seguintes requisitos:
 ■ A classe deve ser anotada como @Entity (javax.persistence.
Entity).
 ■ A classe deve possuir uma chave primária podendo ser um campo único 
ou uma combinação de campos.
 ■ A classe deve ter o mesmo nome da tabela quando não anotada como @
Table (javax.persistence.Table). Essa anotação define o 
nome da tabela que a Entity Class representa.
 ■ A classe deve possuir um construtor público ou protegido sem argumen-
tos havendo a possibilidade de declarar outros construtores.
 ■ Tanto a classe como os métodos ou atributos de persistência não podem 
ser declarados com o modificador final.
 ■ Uma classe de entidade pode estender outras classes de entidades e clas-
ses que não são entidades podem estender classes de entidades.
 ■ Uma classe de entidade deveimplementar a interface java.io.Serializable.
 ■ As variáveis de instâncias devem ser declaradas com os modificadores 
de acesso private ou protected permitindo ser acessados direta-
mente pelos métodos da classe.
Veja, a seguir, uma classe anotada com a anotação javax.persistence.Entity.
 1 package br.uem.ead.exemplos.jpa.entidades;
 2 
 3 import java.io.Serializable;
 4 import java.math.BigDecimal;
 5 import java.util.Date;
 6 import javax.persistence.Entity;
 7 import javax.persistence.Id;
 8 import javax.persistence.Table;
 9 import javax.persistence.Temporal;
10 
167
O Jpa – Java Persistence Api
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
11 @Entity
12 @Table(name=”PRODUTO”)
13 public class Produto implements Serializable {
14 
15 @Id
16 private long id;
17 private String descricao;
18 @Temporal(javax.persistence.TemporalType.DATE)
19 private Date dataCadastro;
20 private BigDecimal quantidadeEstoque;
21 
22 public Produto() {
23 }
24 
25 public long getId() {
26 return id;
27 }
28 
29 public void setId(long id) {
30 this.id = id;
31 }
32 
33 public String getDescricao() {
34 return descricao;
35 }
36 
37 public void setDescricao(String descricao) {
38 this.descricao = descricao;
39 }
40 
41 public Date getDataCadastro() {
42 return dataCadastro;
43 }
44 
45 public void setDataCadastro(Date dataCadastro) {
46 this.dataCadastro = dataCadastro;
47 }
48 
49 public BigDecimal getQuantidadeEstoque() {
50 return quantidadeEstoque;
51 }
52 
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
Quadro 66: Classe anotada com @Entity
Vamos analisar a classe anterior. Perceba que na linha 10 foi declarada a anotação 
@Entity de javax.persistence.Entity. Quando declaramos esta anotação, a classe 
tornou-se uma Entity Class ou Classe de Entidade e, a partir desta linha passou 
a representar uma tabela em um banco de dados. Note agora que os campos ou 
atributos desta classe, definidos da linha 14 a 18, são todos privados podendo ser 
acessados mediante os métodos públicos da classe. Repare na linha 20, o cons-
trutor da classe também é público. Com base nestas características podemos 
dizer que esta classe se trata de um POJO.
Um POJO (Plain Old Java Object) – que em português significa Velho 
e Simples Objeto Java – é uma classe que realiza referência a objetos 
que não dependem de herança ou quaisquer outras classes externas. São obje-
tos que seguem uma estrutura simplificada onde os construtores são default 
sem argumentos e os métodos seguem o padrão getter e setter para aces-
sar os atributos privados da classe.
PRINCIPAIS ANOTAÇÕES JPA
Você já deve ter percebido até o momento que para definirmos uma classe como 
entidade e os atributos desta classe como atributos de persistência foram utili-
zadas várias annotations (em português, anotações) JPA. A seguir, você vai 
conhecer as principais anotações JPA e suas funcionalidades. Essas anotações 
estão no pacote javax.persistence.
 ■ @Entity – define que a classe em questão é uma entidade a ser persistida 
em uma tabela no banco de dados. Caso esta tabela não exista o JPA cria 
ela para você.
53 public void setQuantidadeEstoque(BigDecimal 
quantidadeEstoque) {
54 this.quantidadeEstoque = quantidadeEstoque;
55 }
56 }
169
O Jpa – Java Persistence Api
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
 ■ @Id – define qual atributo da classe representa uma chave primária no 
banco de dados.
 ■ @GeneratedValue – define estratégias para a geração automática de uma 
chave primária simples.
 ■ @Table – quando anotada na classe, define o nome da tabela do banco 
de dados que a entidade representa. Se você não anotar a classe com @
Table(name=”nome_tabela”) o JPA irá definir o nome da tabela com o 
nome da classe.
 ■ @Transient – define quais atributos da classe não serão mapeados para 
o banco de dados.
 ■ @Temporal – define qual atributo será mapeado para uma coluna do tipo 
temporal que pode ser Date (data), Time (tempo) ou Timestamp (carimbo 
de tempo).
 ■ @Enumerated – mapeia um atributo para um campo enumerado de uma 
tabela onde a informação é persistida como uma string.
 ■ @Column – define quais atributos da classe representam colunas de uma 
tabela.
 ■ @Embeddable – uma entidade com esta anotação pode ser embutida em 
outra entidade.
 ■ @Embedded – embuti uma entidade dentro de outra.
 ■ @JoinColumn – indica que o atributo é um relacionamento para uma 
outra entidade (outra tabela).
 ■ @ManyToMany – define uma associação com multiplicidade de muitos 
para muitos.
 ■ @ManyToOne – define uma associação com valor único para outra enti-
dade com multiplicidade de muitos para um.
 ■ @MappedSuperclass – os mapeamentos realizados em uma entidade com 
esta anotação podem ser aplicados às entidades que herdam dela.
Veja, a seguir, uma classe mapeada com algumas das anotações vistas anterior-
mente. Memorize bem esta classe, pois mais adiante você verá um exemplo de 
persistência com uma instância desta entidade.
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
 1 package br.uem.ead.exemplos.jpa.entidades;
 2 
 3 import java.io.Serializable;
 4 import java.util.Date;
 5 import javax.persistence.Column;
 6 import javax.persistence.Entity;
 7 import javax.persistence.EnumType;
 8 import javax.persistence.Enumerated;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.GenerationType;
11 import javax.persistence.Id;
12 import javax.persistence.Temporal;
13 import javax.persistence.TemporalType;
14 import javax.persistence.Transient;
15 
16 @Entity
17 public class Pessoa implements Serializable {
18 
19 @Id
20 @GeneratedValue(strategy = GenerationType.AUTO)
21 private long id;
22 @Column(name = “nome”, nullable = false, length = 60)
23 private String nomePessoa;
24 @Enumerated(EnumType.STRING)
25 @Column(name = “fis_jur”, nullable = false, length = 1)
26 private TipoFisicaJuridicaEnum 
27 tpFisicaJuridica = TipoFisicaJuridicaEnum.F;
28 @Temporal(TemporalType.DATE)
29 private Date dataCadastro;
30 @Transient
31 private String endereco;
32 
33 public Pessoa() {
34 }
35 
36 public long getId() {
37 return id;
38 }
39 
40 public void setId(long id) {
41 this.id = id;
42 }
43 
171
O Jpa – Java Persistence Api
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Quadro 67: Exemplo de uma EntityClass
44 public String getNomePessoa() {
45 return nomePessoa;
46 }
47 
48 public void setNomePessoa(String nomePessoa) {
49 this.nomePessoa = nomePessoa;
50 }
51 
52 public TipoFisicaJuridicaEnum getTpFisicaJuridica() {
53 return tpFisicaJuridica;
54 }
55 
56 public void setTpFisicaJuridica(
57 TipoFisicaJuridicaEnum tpFisicaJuridica) {
58 this.tpFisicaJuridica = tpFisicaJuridica;
59 }
60 
61 public Date getDataCadastro() {
62 return dataCadastro;
63 }
64 
65 public void setDataCadastro(Date dataCadastro) {
66this.dataCadastro = dataCadastro;
67 }
68 
69 public String getEndereco() {
70 return endereco;
71 }
72 
73 public void setEndereco(String endereco) {
74 this.endereco = endereco;
75 }
76 }
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
RELACIONAMENTOS JPA
Bem, caro(a) aluno(a), até agora você aprendeu como “dizer” para uma classe que 
ela é uma entidade e como definir os atributos desta entidade como atributos de 
persistência. Mas, como criamos relacionamentos entre estas entidades, assim 
como é feito em um banco relacional? Ora, é simples. Para isso também existem 
anotações que definem que uma determinada entidade se relaciona com outra 
e vice-versa. Para ser mais preciso as anotações que definem relações ou asso-
ciações entre as entidades são quatro de acordo com a sua cardinalidade. Estas 
associações mantêm uma forma de relação entre os objetos associados permi-
tindo que eles se comuniquem mantendo uma relação estática. As anotações de 
que estamos falando são as seguintes:
@OneToOne (Um para Um) – define uma associação de um único valor 
para outra entidade que possui multiplicidade de um para um. Por exemplo, 
uma Cidade é governada por apenas um Prefeito e um Prefeito governa ape-
nas uma cidade.
Figura 76: Relacionamento @OneToOne
@OneToMany (Um para Muitos) – define uma associação polivalente (muitos 
valores) com multiplicidade de um para muitos. Por exemplo, um veículo é diri-
gido por muitos motoristas e um motorista dirige apenas um veículo.
Figura 77: Relacionamento @OneToMany
@ManyToOne (Muitos para Um) – define uma associação com valor único 
para outra entidade com multiplicidade de muitos para um. Por exemplo, um 
título a pagar pertence a uma pessoa e uma pessoa possui muitos títulos a pagar.
173
O Jpa – Java Persistence Api
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
Figura 78: Relacionamento @ManyToOne
@ManyToMany (Muitos para Muitos) – define uma associação com multiplici-
dade de muitos para muitos. Por exemplo, uma venda possui muitos vendedores 
e um vendedor realiza muitas vendas.
Figura 79: Relacionamento @ManyToMany
Unidades de persistência (persistence unit)
A partir deste tópico você vai aprender a configurar Unidades de 
Persistência em JPA. Uma unidade de persistência é um agrupamento 
lógico na qual são definidas as classes de persistência como classes de entidade, 
classes incorporáveis e superclasses mapeadas, assim como as configurações per-
tinentes de cada classe. 
Em geral, as unidades de persistência são definidas em um arquivo .XML de 
persistência chamado de persistence.xml, no qual podem ser definidas 
uma ou mais unidades de persistência. Este arquivo deve ser salvo em uma pasta 
chamada META-INF. Este diretório é chamado de raiz da unidade de 
persistência. Veja abaixo um exemplo de configuração do persistence.xml.
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
Quadro 68: Exemplo de um arquivo persistence.xml
Note que no exemplo acima foram adicionadas algumas informações como con-
figurações para conexão com o banco de dados. Perceba que estas configurações 
definidas dentro da tag <properties></properties> pedem as mesmas infor-
mações que utilizamos quando configuramos uma conexão utilizando JDBC. 
Outro ponto que você já deve ter notado é o mapeamento das classes de per-
sistência utilizando a tag <class></class>. Sempre que você anotar uma classe 
com @Entity não se esqueça de mapear esta classe neste arquivo, caso contrário 
ela não fará parte do contexto de persistência e não será possível realizar ope-
rações com esta entidade.
<?xml version=”1.0” encoding=”UTF-8”?>
<persistence version=”2.0” xmlns=”http://java.sun.com/xml/
ns/persistence” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-
instance” xsi:schemaLocation=”http://java.sun.com/xml/
ns/persistence http://java.sun.com/xml/ns/persistence/
persistence_2_0.xsd”>
 <persistence-unit name=”UEM-EADPU” transaction-type=”RESOURCE_
LOCAL”>
 <provider>org.eclipse.persistence.jpa.PersistenceProvider</
provider>
 <class>br.uem.ead.exemplos.jpa.entidades.Produto</class>
 <class>br.uem.ead.exemplos.jpa.entidades.Pessoa</class>
 <properties>
 <property name=”javax.persistence.jdbc.url” 
value=”jdbc:derby://localhost:1527/ead-bd”/>
 <property name=”javax.persistence.jdbc.password” 
value=”ead”/>
 <property name=”javax.persistence.jdbc.driver” value=”org.
apache.derby.jdbc.ClientDriver”/>
 <property name=”javax.persistence.jdbc.user” value=”ead”/>
 <property name=”eclipselink.ddl-generation” value=”drop-
and-create-tables”/>
 </properties>
 </persistence-unit>
</persistence>
175
O Jpa – Java Persistence Api
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
GESTOR DE ENTIDADE (ENTITY MANAGER)
Pertencente ao pacote javax.persistence, a instância de um 
EntityManager é responsável por praticamente todas as operações de persis-
tência de objetos. Esta instância está associada a um contexto de persistência que se 
refere a um conjunto de instâncias de entidades administradas pelo EntityManager. 
A interface EntityManager define operações que permitem interagir com o contexto 
de persistência como, incluir, alterar, excluir e consultar instâncias de entidades 
dentro deste contexto. Ficou confuso? Veja o exemplo a seguir.
 1
 2 
 3 import br.uem.ead.exemplos.jpa.entidades.Pessoa;
 4 import br.uem.ead.exemplos.jpa.entidades.
TipoFisicaJuridicaEnum;
 5 import java.util.Date;
 6 import javax.persistence.EntityManager;
 7 import javax.persistence.EntityManagerFactory;
 8 import javax.persistence.Persistence;
 9 import javax.swing.JOptionPane;
10 
11 public class ExemploEntityManager {
12 
13 public static void main(String[] args) {
14 EntityManagerFactory factory =
15 Persistence.createEntityManagerFactory(“UEM-
EADPU”);
16 EntityManager manager = factory.createEntityManager();
17 
18 Pessoa pessoa = new Pessoa();
19 pessoa.setNomePessoa(“Joao da Silva”);
20 pessoa.setDataCadastro(new Date());
21 pessoa.setTpFisicaJuridica(TipoFisicaJuridicaEnum.J);
22 pessoa.setEndereco(“Rua das Pedras, 101”);
23 
24 manager.getTransaction().begin();
25 manager.persist(pessoa);
26 manager.getTransaction().commit();
27 
28 String textoSaida = “Código Pessoa: “ + pessoa.
getId();
PERSISTÊNCIA DE DADOS COM JPA
Reprodução proibida. A
rt. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
V
Quadro 69: Criando um EntityManager
No exemplo anterior criamos um objeto do tipo Pessoa. Se você recordar nos 
nossos exemplos anteriores, você vai lembrar que criamos uma classe Pessoa e 
a anotamos com a anotação @Entity. Pois bem, utilizamos uma instância dessa 
entidade e a partir de uma instância de um EntityManager nós persistimos o 
objeto no banco de dados. Mas como criamos uma instância de EntityManager? 
Para isso, antes precisamos criar um EntityManagerFactory relacionado 
a uma Persistence Unit. Perceba na linha 14 do nosso exemplo que criamos uma 
variável factory do tipo EntityManagerFactory e a ela atribuímos uma referên-
cia de EntityManagerFactory obtida por meio da expressão Pesistence.
createEntityManagerFactory(“UEM-EADPU”). Note que passamos 
como referência o nome da unidade de persistência criada na sessão Unidades 
de Persistência(Persistence Unit) mediante uma String com 
o texto UEM-EADPU. Bem, caro(a) aluno(a), agora nós já temos um fábrica 
de EntityManager associado à unidade de persistência UEM-EADPU, portanto 
já podemos obter um EntityManager como mostra a linha 16 do nosso exem-
plo. Perceba que utilizamos factory para criar um EntityManager por meio da 
expressão factory.createEntityManager() e atribuímos o objeto 
criado à variável manager do tipo EntityManager. A persistência do objeto 
pessoa do tipo Pessoa ocorre na linha 25 mediante a expressão manager.
persiste(pessoa).
29 
30 manager.close();
31 factory.close();
32 
33 JOptionPane.showMessageDialog(null, textoSaida,
34 “Persistindo uma Pessoa com EntityManager”,
35 JOptionPane.INFORMATION_MESSAGE);
36 }
37 }
177
Considerações Finais
Re
pr
od
uç
ão
 p
ro
ib
id
a.
 A
rt
. 1
84
 d
o 
Có
di
go
 P
en
al
 e
 L
ei
 9
.6
10
 d
e 
19
 d
e 
fe
ve
re
iro
 d
e 
19
98
.
CONSIDERAÇÕES FINAIS
Caro(a) aluno(a), nesta unidade você aprendeu como realizar persistência de 
informações em um banco de dados relacional utilizando instruções SQL com 
a API JDBC e também viu que podemos realizar de maneira diferente a persis-
tência destas mesmas informações utilizando o JPA.
Você aprendeu que nas duas situações, para se conectar a um banco de 
dados, é necessário utilizar um driver JDBC de acordo com o banco utilizado 
na sua aplicação e que normalmente estes drivers são fornecidos pelo próprio 
fabricante do banco de dados.
Entre outros, os pontos mais importantes a serem considerados neste estudo 
são a forma como a comunicação com o banco de dados é feita, assim como a per-
sistência das informações são realizadas utilizando JDBC e JPA. Para se conectar 
a um banco de dados utilizando JDBC nós utilizamos um objeto Connection para 
o qual fornecemos a URL de conexão com o banco de dados, usuário e senha 
para a conexão. Já com JPA, nós podemos criar uma ou mais unidades de per-
sistências que nos possibilita configurar diversas conexões com banco de dados 
distintos, também fornecendo a URL de conexão, usuário e senha, por meio de 
um arquivo chamado persistence.xml. A grande diferença é que neste arquivo 
também podemos definir quais são as classes de persistência para o JPA e utili-
zar os objetos destas classes para a persistência por meio de um EntityManager. 
1. Como atividade de autoestudo, vamos criar um pequeno projeto e aplicar os 
conceitos estudados em exemplos simples e práticos. Como IDE de desenvolvi-
mento para este projeto vamos utilizar o Netbeans. Você pode realizar o down-
load do Netbeans no seguinte endereço:
<http://netbeans.org/downloads/7.0.1/start.html?platform=windows&lang=pt_
BR&option=all>.
Agora que você realizou o download da IDE, vamos ao projeto. Abra o Netbeans e 
crie um novo projeto em Arquivo => Novo Projeto. Na tela que se abre, escolha Java 
na guia Categorias e Aplicação Java na guia Projetos como mostra a imagem abaixo.
Figura 80: Criando Aplicação Java
Clique em Próximo e na tela, a seguir, defina o nome do projeto como EstudoJPA e 
clique em Finalizar. Ao realizar estas etapas, você deverá ter uma estrutura de proje-
to semelhante à imagem a seguir.
Figura 81: Projeto EstudoJPA criado
179 
Agora que já temos um projeto criado precisamos definir um banco de dados para 
nossos estudos e para isso vamos utilizar o já conhedico Derby. No Netbeans sele-
cione a aba Serviços e na estrutura de árvores selecione Banco de Dados => Java DB 
e com o botão contrário do mouse clique em Iniciar Servidor. Após iniciar o servidor, 
clique novamente com o botão contrário do mouse em JavaDB clique em Criar Ban-
co de Dados.
Figura 82: Iniciando servidor de banco de dados
Na tela que se abre, você irá definir o nome do banco de dados como exemplo-jpa e 
o usuário e senha como jpa e clique em OK como mostra a imagem a seguir.
Figura 83: Acessando banco de dados
Neste momento seu projeto de banco de dados deve ter uma estrutura parecida 
com a seguinte.
Figura 84: Estrutura do banco de dados
Agora que temos o banco de dados criado, será necessário adicionar no projeto o 
Driver JDBC para o Derby. Você pode realizar o download do Driver JDBC Derby-
Client no link a seguir:
<http://repo1.maven.org/maven2/org/apache/derby/derbyclient/10.9.1.0/derby-
client-10.9.1.0.jar>.
Com o download do Driver efetuado, vamos adicioná-lo ao nosso projeto. Para isso, 
selecione a aba Projetos e na pasta Bibliotecas clique com o botão contrário do mou-
se e, em seguina, na opção Adicionar JAR/Pasta... como mostra a imagem a seguir.
181 
Figura 85: Adicionando arquivo JAR ao projeto
Ainda na pasta biblioteca devemos adicionar a biblioteca do JPA, para isso clique 
com o botão contrário do mouse em Bibliotecas e vá em Adicionar Biblioteca... 
como na imagem abaixo.
Figura 86: Adicionando bibliotecas ao projeto
Na tela que se abre, navegue pela listagem Bibliotecas Disponíveis e selecione a 
biblioteca Persistência (JPA 2.0) e clique em Adicionar Biblioteca.
Após adicionar o jar do Driver JDBC Derby e a biblioteca do JPA, seu projeto deve 
possuir a seguinte estrutura.
Figura 87: Adicionando driver de conexão ao Derby
Agora que já temos nosso projeto devidamente configurado, vamos criar algumas 
classes de entidade? Bem, para isso precisamos definir o que nossa aplicação vai 
fazer. Para nosso estudo vamos realizar o cadastro de um Estado, das Cidades deste 
Estado e do Governador do Estado. Ora, então você já deve imaginar que teremos 
que criar três Entity Class onde uma delas – neste caso, Estado – possuirá um mape-
amento @OneToMany para uma lista de Cidades e outro mapeamento @OneToOne 
para o Governador do Estado como mostra o diagrama de classes a seguir.
Figura 88: Entidades do estudo de JPA 
183 
A primeira entidade que vamos criar é a Entity Class Governador. No Netbens, clique 
com o botão direito do mouse e crie um pacote chamado entidades.
Figura 89: Criando Pacote Java
Agora clique com o botão contrário do mouse no pacote entidades e crie uma clas-
se Governador de acordo com a classe vista anteriormente no diagrama de classes.
Figura 90: Criando Classe Java
Veja agora como ficou a classe Governador já mapeada.
Quadro 70: A classe Governador
 1 package estudojpa.entidades;
 2 
 3 import javax.persistence.Column;
 4 import javax.persistence.Entity;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.GenerationType;
 7 import javax.persistence.Id;
 8 import javax.persistence.Table;
 9 
10 @Entity
11 @Table(name = “governador”)
12 public class Governador implements Serializable {
13 
14 @Id
15 @GeneratedValue(strategy= GenerationType.AUTO)
16 private long id;
17 @Column(name=”nome”, nullable=false, length=60)
18 private String nome;
19 
20 public Governador() {
21 }
22 
23 public long getId() {
24 return id;
25 }
26 
27 public void setId(long id) {
28 this.id = id;
29 }
30 
31 public String getNome() {
32 return nome;
33 }
34 
35 public void setNome(String nome) {
36 this.nome = nome;
37 }
38 }
185 
Repita o mesmo processo para a classe Cidades.
Quadro 71: A classe Cidades
1 package estudojpa.entidades;
 2 
 3 import java.io.Serializable;
 4 import javax.persistence.Column;
 5 import javax.persistence.Entity;
 6 import javax.persistence.GeneratedValue;
 7 import javax.persistence.GenerationType;
 8 import javax.persistence.Id;
 9 import javax.persistence.Table;
10 
11 @Entity
12 @Table(name = “cidades”)
13 public class Cidades implements Serializable {
14 
15 @Id
16 @GeneratedValue(strategy= GenerationType.AUTO)
17 privatelong id;
18 @Column(name=”nome”, nullable=false, length=60)
19 private String nome;
20 
21 public Cidades() {
22 }
23 
24 public long getId() {
25 return id;
26 }
27 
28 public void setId(long id) {
29 this.id = id;
30 }
31 
32 public String getNome() {
33 return nome;
34 }
35 
36 public void setNome(String nome) {
37 this.nome = nome;
38 }
39 }
Por último, vamos criar a classe Estados.
Quadro 72: A classe Estados
 1 package estudojpa.entidades;
 2 
 3 import java.io.Serializable;
 4 import java.util.List;
 5 import javax.persistence.CascadeType;
 6 import javax.persistence.Column;
 7 import javax.persistence.Entity;
 8 import javax.persistence.GeneratedValue;
 9 import javax.persistence.GenerationType;
10 import javax.persistence.Id;
11 import javax.persistence.OneToMany;
12 import javax.persistence.OneToOne;
13 import javax.persistence.Table;
14 
15 @Entity
16 @Table(name = “estados”)
17 public class Estados implements Serializable {
18 
19 @Id
20 @GeneratedValue(strategy = GenerationType.AUTO)
21 private long id;
22 @Column(name = “uf”, nullable = false, length = 2)
23 private String unidade_federativa;
24 @Column(name = “nome”, nullable = false, length = 60)
25 private String nome;
26 @OneToMany(cascade= CascadeType.ALL)
27 private List<Cidades> cidades = new ArrayList<Cidades>();
28 @OneToOne(cascade= CascadeType.ALL)
29 private Governador governador;
30 
31 public Estados() {
32 }
33 
34 public long getId() {
35 return id;
36 }
37 
38 public void setId(long id) {
39 this.id = id;
187 
Neste momento seu projeto deve possuir uma estrutura parecida com a seguir.
Figura 91: Classes Java criadas
Depois de todas as classes de persistência criadas, precisamos definir a unidade de 
persistência ou Persistence Unit para nossas entidades. Para isso, no Netbeans sele-
cione o projeto, clique com o botão contrário do mouse e vá em Novo => Outros. 
Na tela que se abre selecione Persistência em Categorias e, em seguida, Unidade de 
Persistência em Tipos de Arquivos.
Figura 92: Criando uma Unidade de Persistência
Na próxima tela, defina o nome da unidade de persistência, a biblioteca de persis-
tência e selecione o banco de dados que nós criamos no início da configuração do 
nosso projeto e clique em Finalizar. Veja a imagem a seguir.
Figura 93: Nomeando a Unidade de Persistência
Após clicar em Finalizar, seu projeto deve possuir a seguinte estrutura.
Figura 94: Unidade de Persistência criada
Perceba que seu projeto agora possui uma pasta META-INF e dentro dela está o 
arquivo de persistência persistence.xml. Em cima deste arquivo dê um duplo clique 
para abri-lo a fim de adicionarmos nele as classes de perisitência que criamos ante-
riormente. Perceba que será aberta uma aba com o nome do arquivo como mostra-
189 
do a seguir. Clique em Adicionar Classe.
Figura 95: Adicionando classes para mapeamento
Na tela que se abre, selecione as três classes e cliente em OK. Agora, você deverá ter 
algo semelhante a isto.
Figura 96: Selecionando classes para mapeamento
Veja, a seguir, como ficou o XML gerado para o arquivo persistence.xml.
Quadro 73: Criando uma Persistence Unit
Perceba que no arquivo gerado estão mapeadas as três classes que criamos por 
meio da tag <class>. E em <properties> foi configurado o banco que criamos ante-
riormente.
Agora, vamos colocar o JPA para trabalhar por nós. Para isso, vamos programar na 
classe principal do projeto as regras para inserir um Estado, duas cidades e um go-
vernador para o Estado. A classe principal do nosso projeto é aquela que definimos 
no início da configuração do nosso projeto, no nosso caso ela se chama EstudoJPA. 
<?xml version=”1.0” encoding=”UTF-8”?>
<persistence version=”2.0” xmlns=”http://java.sun.com/
xml/ns/persistence” xmlns:xsi=”http://www.w3.org/2001/
XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/
xml/ns/persistence http://java.sun.com/xml/ns/persistence/
persistence_2_0.xsd”>
 <persistence-unit name=”EstudoJPAPU” transaction-
type=”RESOURCE_LOCAL”>
 <provider>org.eclipse.persistence.jpa.PersistenceProvider</
provider>
 <class>estudojpa.entidades.Cidades</class>
 <class>estudojpa.entidades.Estados</class>
 <class>estudojpa.entidades.Governador</class>
 <properties>
 <property name=”javax.persistence.jdbc.url” 
value=”jdbc:derby://localhost:1527/exemplo-jpa”/>
 <property name=”javax.persistence.jdbc.password” 
value=”jpa”/>
 <property name=”javax.persistence.jdbc.driver” value=”org.
apache.
derby.jdbc.ClientDriver”/>
 <property name=”javax.persistence.jdbc.user” value=”jpa”/>
 <property name=”eclipselink.ddl-generation” value=”create-
tables”/>
 </properties>
 </persistence-unit>
</persistence>
191 
 1 package estudojpa;
 2 
 3 import estudojpa.entidades.Cidades;
 4 import estudojpa.entidades.Estados;
 5 import estudojpa.entidades.Governador;
 6 import java.util.List;
 7 import javax.persistence.EntityManager;
 8 import javax.persistence.EntityManagerFactory;
 9 import javax.persistence.Persistence;
10 import javax.swing.JOptionPane;
11 
12 public class EstudoJPA {
13 
14 private static final String 
15 NOME_UNIDADE_PERSISTENCIA = “EstudoJPAPU”;
16 
17 public static void main(String[] args) {
18 String saida = “”;
19 EntityManagerFactory factory =
20 Persistence.
21 createEntityManagerFactory(NOME_UNIDADE_
PERSISTENCIA);
22 EntityManager manager =
23 factory.createEntityManager();
24 
25 Cidades cidLondrina = new Cidades();
26 cidLondrina.setNome(“São Paulo”);
27 
28 Cidades cidMaringa = new Cidades();
29 cidMaringa.setNome(“Maringá”);
30 
31 Governador gov = new Governador();
32 gov.setNome(“Beto Richa”);
33 
34 Estados ufPR = new Estados();
35 ufPR.setUnidade_federativa(“PR”);
36 ufPR.setGovernador(gov);
37 ufPR.setNome(“Paraná”);
38 ufPR.getCidades().add(cidMaringa);
39 ufPR.getCidades().add(cidLondrina);
Quadro 74: A classe EstudoJPA
Na classe acima nós obtemos na linha 22 um EntityManager a partir de uma factory 
obtida por um EntityManagerFactory. Em seguida, criamos duas cidades nas linhas 
25 a 29 e na linha 31 a 32 definimos um governador. A criação do estado está sendo 
realizada entre as linhas 34 e 39. Perceba que na linha 36 vinculamos o governador 
ao estado e nas linhas 38 a 39 as cidades. Note que na linha 42 realizamos a persis-
tência apenas do objeto ufPR e não realizamos a persistência dos demais objetos. 
Bem, na verdade realizamos sim. Quando realizamos o mapeamento da classe Es-
40 
41 manager.getTransaction().begin();
42 manager.persist(ufPR);
43 manager.getTransaction().commit();
44 
45 saida += “Dados do Estado:”;
46 saida += “ \nId: “ + ufPR.getId();
47 saida += “ \nNome: “ + ufPR.getNome();
48 saida += “ \nUF: “ + ufPR.getUnidade_federativa();
49 saida += “ \nId Governador: “ + ufPR.getGovernador().
getId();
50 saida += “ \nNome Governador: “ + 
51 ufPR.getGovernador().getNome();
52 saida += “ \n\nCidades do Estado : “ + ufPR.getNome();
53 
54 List<Cidades> listaCidades = ufPR.getCidades();
55 
56 for (int i = 0; i < listaCidades.size(); i++) {
57 Cidades cidades = listaCidades.get(i);
58 
59 saida += “ \nId: “ + cidades.getId()
60 + “ - Nome: “ + cidades.getNome();
61 
62 }
63 
64 manager.close();
65 factory.close();
66 
67 JOptionPane.showMessageDialog(null,saida,
68 “Estudo JPA”, JOptionPane.INFORMATION_
MESSAGE);
69 }
70 }
193 
tados foi definido a expressão cascade= CascadeType.ALL nas associações @OneTo-
Many e @OneToOne e então a mágica foi feita. O que aconteceu foi que ao persistir 
o objeto ufPR, está ação também foi realizada em cascata para todos os objetos 
relacionados com estado, no nosso foi realizada a persistência das duas cidades e a 
do governador. Veja, a seguir, a execução da nossa aplicação.
Figura 97: Saída do exemplo de Estudo JPA
Agora veja como ficou a estrutura do banco de dados depois que o JPA entrou em 
ação. Você se lembra de ter criado alguma instrução SQL para criar as tabelas? Eu 
também não lembro e mesmo assim elas estão lá.
Figura 98: Estrutura do banco de dados do Estudo JPA
Material Complementar
MATERIAL COMPLEMENTAR
Introdução ao JPA – Parte 1
Fonte: <http://www.youtube.com/watch?v=1amGLhkd_FE>. 
Introdução ao JPA – Parte 2
Fonte: <http://www.youtube.com/watch?v=JyNEf2t3sY4>. 
Introdução ao JPA – Parte 3
Fonte: <http://www.youtube.com/watch?v=GQwC1zjSi34>. 
Introdução ao JPA – Parte 4
Fonte: <http://www.youtube.com/watch?v=OSDfD0IVjSw>.
Introdução ao JPA – Parte 5
Fonte: <http://www.youtube.com/watch?v=l6zzfB9_tWk>. 
Quando necessitar de agilidade no desenvolvimento de aplicações com 
acesso a banco de dados, não tenha dúvidas em escolher JPA ao invés de 
JDBC. Com JPA não há necessidade de criar instruções SQL, seja para consul-
ta ou persistência de informações em um banco de dados.
Introdução à Java Persistence API (JPA)
Por Wendell M. Sacramento
O JPA é um framework utilizado na camada de persistência (ver Figura 01) para o desenvolvedor 
ter uma maior produtividade, com impacto principal em um modo para controlarmos a 
persistência dentro de Java. Pela primeira vez, nós, desenvolvedores temos um modo “padrão” 
para mapear nossos objetos para os do Banco de Dados. Persistência é uma abstração de alto-
nível sobre JDBC.
Saiba mais sobre o assunto no artigo completo.
Fonte: <http://www.devmedia.com.br/introducao-a-java-persistence-api-jpa/4590>. Acesso em: 
03 abr. 2013
197
Neste livro busquei mostrar a você conceitos mais avançados em programação com 
a linguagem Java. A fim de possibilitar o seu entendimento, a unidade I apresentou 
os conceitos de sobreposição e sobrecarga, muito úteis na estruturação do projeto 
OO Java e futuras manutenções.
Na unidade II, trabalhamos classes abstratas e interfaces por meio do conceito de 
programação por interfaces e contratos. Esses conceitos são muito poderosos para 
resolver um grande número de padrões de projeto existentes.
A unidade III foi dedicada exclusivamente a arrays e coleções Java. Várias coleções 
como List, Set e Map foram tratadas, bem como os conceitos essenciais sobre arrays 
Java.
Na unidade IV apresentei os principais conceitos sobre a criação de interfaces gráfi-
cas com o cliente e tratamento de exceções. Interfaces gráficas foram implementa-
das por meio da biblioteca Swing e respectivos eventos. 
E, para finalizar, vimos na unidade V os conceitos sobre persistência de objetos Java 
por meio das APIs JDBC e JPA. JPA é uma poderosa biblioteca que permite o mape-
amento objeto-relacional entre objetos Java e um sistema gerenciador de banco 
de dados relacional ou objeto-relacional, a fim de facilitar o desenvolvimento do 
modelo de dados de uma aplicação.
Espero ter alcançado o objetivo inicial deste livro, que era apresentar conceitos mais 
avançados em programação Java. Desejo que você seja muito feliz profissionalmen-
te utilizando os conceitos apresentados aqui e se puder ajudar de alguma forma, 
estou a sua disposição.
Prof. Dr. Edson A. Oliveira Junior 
CONCLUSÃO
199
BAUER, Christian; KING, Gavin. Java Persistence com Hibernate. Ciência Moderna, 
2007.
CORNELL, Gary; HORSTMANN, Cay S. Core Java. V. 2 – Advanced Features. Prentice 
Hall, 2008.
DEITEL, Harvey M. Java – Como Programar. 8. ed. Prentice Hall Brasil, 2010.
GAMMA, Erich; JOHNSON, Ralph; VLISSIDES, John. Padrões de Projeto. Bookman, 
2005.
HORSTMANN, Cay S; CORNELL, Gary. Core Java. V. 1 – Fundamentos. 8. ed. Pearson, 
2010.
SIERRA, Kathy; BATES, Bert. Use A Cabeça! – Java. 2. ed. Alta Books, 2008.
REFERÊNCIAS

Mais conteúdos dessa disciplina