Buscar

Algoritmos Programacao

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 293 páginas

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 293 páginas

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 293 páginas

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Algoritmos e Programação 
 
por 
 
Prof. Dr. Paulo Roberto Gomes Luzzardi 
 
 
 
facebook: Paulo Roberto Gomes Luzzardi 
WhatsApp: 91648037 
e-mail: pluzzardi@gmail.com e pluzzardi@yahoo.com.br 
e-mail (Senac): prgomesluzzardi@senacrs.edu.br 
DropBox: https://www.dropbox.com/sh/kea9kr4j2qttnjg/4xXvw0pvxX?m 
Hostinger: http://pluzzardi.w.pw e http://pluzzardi.zz.mu (Home Page) 
OS X Server (Apple): http://pluzzardi.no-ip.info:8080 (Home Page) 
 
Versão 2.03 
19-11-2014 
 
 
Bibliografia recomendada 
 
DEITEL, H. M. and DEITEL, P. J. Java: como programar, 8. ed.: São Paulo: Pearson, 2010 (ISBN 
85-363-0123-6). 
 
 
 
Pelotas, quarta-feira, 19 de novembro de 2014 (09:46 am) 
 2 
Sumário 
 
1. Projeto de Classes ..................................................................................................................................... 7	
  
1.1 Escrevendo uma classe em Java (Conceitos básicos) .................................................................... 7	
  
1.2 Sobrecarga de métodos ..................................................................................................................... 13	
  
1.3 Referência this ...................................................................................................................................... 13	
  
1.4 Lista de exercícios: Classes ................................................................................................................ 17	
  
2. Interface e Polimorfismo ....................................................................................................................... 32	
  
2.1 Interface ................................................................................................................................................. 32	
  
2.2 Polimorfismo ......................................................................................................................................... 35	
  
2.3 Lista de Exercícios: Interface e Polimorfismo ................................................................................. 38	
  
3. Herança em Java ...................................................................................................................................... 40	
  
3.1 Herança simples ................................................................................................................................... 40	
  
3.2 Controle de acesso na definição de uma classe derivada .......................................................... 41	
  
3.3 Tipos de acessos (especificadores de acesso) ............................................................................... 43	
  
3.4 Lista de exercícios: Herança .............................................................................................................. 46	
  
4. Métodos de entrada e saída de dados .............................................................................................. 51	
  
4.1 Entrada de dados via teclado ............................................................................................................ 51	
  
4.2 Saída de dados via tela ....................................................................................................................... 54	
  
4.3 Saída formatada (System.out.printf) ................................................................................................. 56	
  
4.4 Lista de Exercícios: Métodos de Entrada e Saída .......................................................................... 57	
  
5. Interfaces e Containers (Classes existentes em Java) ................................................................... 58	
  
5.1 Coleções (Collection FrameWork) ................................................................................................... 58	
  
5.2 Interfaces ............................................................................................................................................... 58	
  
5.3 Vector (Vetor) (Classe Obsoleta) ....................................................................................................... 59	
  
5.4 LinkedList (Lista Encadeada Simples) .............................................................................................. 64	
  
5.5 Arrays (array) ......................................................................................................................................... 69	
  
5.6 ArrayList (lista de array) ....................................................................................................................... 74	
  
5.6.1 Lista de exercícios: Vector, ArrayList e LinkedList ...................................................................... 76	
  
5.7 ArrayList bidimensional ...................................................................................................................... 84	
  
5.8 Strings (Cadeia de Caracteres) .......................................................................................................... 90	
  
5.8.1 Métodos para manipular Strings ................................................................................................... 91	
  
5.8.2 Lista de exercícios: Strings .............................................................................................................. 95	
  
5.9 Classe Object ........................................................................................................................................ 97	
  
5.10 Classe Iterator ................................................................................................................................... 100	
  
5.11 Classe LinkedHashSet ..................................................................................................................... 100	
  
5.12 Classe Genérica em Java ............................................................................................................... 102	
  
5.13 Fila Prioritária (PriorityQueue) ....................................................................................................... 104	
  
6. Listas Lineares: Pilhas, Filas e Deques ............................................................................................. 108	
  
6.1 Implementação de uma Pilha (Stack) ............................................................................................. 109	
  
6.2 Implementação de uma Fila (Queue) ............................................................................................ 114	
  
6.3 Implementação de um Deque (ArrayDeque) ............................................................................... 118	
  
6.4 Lista de Exercícios: Listas Lineares (Pilhas, Filas e Deques) ....................................................... 126	
  
7. Mapas (Maps) .......................................................................................................................................... 131	
  
7.1 Conceitos básicos sobre Mapas ..................................................................................................... 131	
  
7.2 Lista de Exercícios: Mapas ............................................................................................................... 136	
  
8. Processamento de fluxos de dados, caracteres e objetos (Arquivos) ................................... 138	
  
 3 
8.1 Métodos para manipular arquivos em Java ................................................................................. 140	
  
8.2 Abertura de um arquivo texto ......................................................................................................... 143	
  
8.3 Listar um diretório .............................................................................................................................. 144	
  
8.4 Manipulação de um arquivo de palavras ......................................................................................146	
  
8.5 Arquivo Texto ..................................................................................................................................... 149	
  
8.6 Lista de exercícios: Arquivos (Files) ................................................................................................ 157	
  
8.7 Acesso randômico em arquivos texto ........................................................................................... 160	
  
8.8 Arquivo binário de objetos em Java .............................................................................................. 161	
  
8.9 Leitura e gravação de objetos (registro) em Arquivos ............................................................... 163	
  
8.9.1 Gravação de objetos em um arquivo binário de objetos ....................................................... 164	
  
8.9.2 Leitura objetos em um arquivo binário de objetos ................................................................. 168	
  
9. Noções de desenvolvimento de aplicações em camadas (MVC) ............................................ 171	
  
9.1 Conceitos ............................................................................................................................................. 171	
  
9.2 Primeiro exemplo da utilização do MVC (ProgMVCPessoa) ..................................................... 172	
  
9.3 Segundo exemplo da utilização do MVC (ProgMVCPessoa2) .................................................. 175	
  
10. Conceitos gerais .................................................................................................................................. 181	
  
10.1 Como é calculado o hashcode no Java ...................................................................................... 181	
  
11. Lista Encadeada Simples em Java .................................................................................................. 182	
  
11.1 Lista Encadeada de Inteiros ........................................................................................................... 182	
  
11.2 Lista Encadeada Genérica (String, Integer ou Double) ............................................................ 188	
  
12. Lista Duplamente Encadeada em Java ......................................................................................... 192	
  
13. Classe entrada de inteiros e reais em Java sem erro na digitação ....................................... 202	
  
14. Alguns programas exemplos em Java .......................................................................................... 208	
  
14.1 Torre de Hanoi (Pilha - Stack) ........................................................................................................ 208	
  
14.2 Analisador de Expressões usando Stack .................................................................................... 214	
  
14.3 Calculadora Polonesa Reversa ...................................................................................................... 217	
  
14.4 Jogo Quebra-Cabeças ................................................................................................................... 220	
  
Anexos: Solução dos problemas propostos no Livro ...................................................................... 223	
  
Anexo 1.3 Solução da Lista: Classes ................................................................................................. 223	
  
1.3.1 ProgCirculo .................................................................................................................................. 223	
  
1.3.2 ProgPeso ...................................................................................................................................... 223	
  
1.3.3 ProgValidaCPF ............................................................................................................................ 224	
  
1.3.4 ProgDiaSemana .......................................................................................................................... 226	
  
1.3.5 ProgTestData ............................................................................................................................... 227	
  
1.3.6 ProgVetorSort .............................................................................................................................. 228	
  
1.3.7 ProgPessoa .................................................................................................................................. 231	
  
1.3.8 ProgPessoa2 ................................................................................................................................ 232	
  
1.3.9 ProgPessoas ................................................................................................................................ 234	
  
1.3.10 ProgAgenda .............................................................................................................................. 235	
  
Anexo 2.3 Solução da Lista: Interface e Polimorfismo ............................................................... 237	
  
2.3.1 ProgInterface_1 ........................................................................................................................... 237	
  
2.3.2 ProgInterface_2 ........................................................................................................................... 238	
  
2.3.2 ProgInterface_3 ........................................................................................................................... 240	
  
Anexo 3.4 Solução da Lista: Herança ............................................................................................... 241	
  
3.4.1 Herança (Primeiro) ...................................................................................................................... 241	
  
3.4.2 Herança (Segundo) .................................................................................................................... 242	
  
3.4.3 Herança (Terceiro) ...................................................................................................................... 243	
  
 4 
Anexo 4.4 Solução da Lista: Entrada e Saída Bufferizada .......................................................... 245	
  
4.4.1 ProgBuffer_1 ................................................................................................................................ 245	
  
4.4.2 ProgBuffer_2 ................................................................................................................................ 246	
  
Anexo 5.6.1 Solução da Lista: Vector, ArrayList e LinkedList .................................................... 247	
  
5.6.1.1 ProgVector_1 ........................................................................................................................... 247	
  
5.6.1.2 ProgVector_2 ........................................................................................................................... 247	
  
5.6.1.3 ProgVector_3 ........................................................................................................................... 248	
  
5.6.1.4 ProgVector_4 ........................................................................................................................... 249	
  
5.6.1.5 ProgVector_5 ........................................................................................................................... 250	
  
5.6.1.6 ProgVector_6 ........................................................................................................................... 251	
  
5.6.1.7 ProgVector_7 ........................................................................................................................... 252	
  
5.6.1.8 ProgVector_8 ...........................................................................................................................252	
  
5.6.1.9 ProgVector_9 ........................................................................................................................... 253	
  
5.6.1.10 ProgVector_10 ....................................................................................................................... 254	
  
5.6.1.11 ProgVector_11 ....................................................................................................................... 255	
  
5.6.1.12 ProgVector_12 ....................................................................................................................... 257	
  
5.6.1.13 ProgVector_13 ....................................................................................................................... 259	
  
5.6.1.14 ProgVector_14 ....................................................................................................................... 261	
  
5.6.1.15 ProgVector_15 ....................................................................................................................... 263	
  
5.6.1.16 ProgVector_16 ....................................................................................................................... 264	
  
Anexo 5.8.2 Solução da Lista: Strings .............................................................................................. 266	
  
5.8.2.1 ProgString_1 ............................................................................................................................ 266	
  
5.8.2.2 ProgString_2 ............................................................................................................................ 266	
  
5.8.2.3 ProgString_3 ............................................................................................................................ 267	
  
5.8.2.4 ProgString_4 ............................................................................................................................ 268	
  
5.8.2.5 ProgString_5 ............................................................................................................................ 268	
  
5.8.2.6 ProgString_6 ............................................................................................................................ 268	
  
5.8.2.7 ProgString_7 ............................................................................................................................ 269	
  
5.8.2.8 ProgString_8 ............................................................................................................................ 270	
  
Anexo 6.4 Solução da Lista: Listas Lineares ................................................................................... 271	
  
6.4.1 ProgLista_1 .................................................................................................................................. 271	
  
6.4.2 ProgLista_2 .................................................................................................................................. 271	
  
6.4.3 ProgLista_3 .................................................................................................................................. 272	
  
6.4.4 ProgLista_4 .................................................................................................................................. 273	
  
6.4.5 ProgLista_5 .................................................................................................................................. 273	
  
6.4.6 ProgLista_6 .................................................................................................................................. 274	
  
6.4.7 ProgLista_7 .................................................................................................................................. 275	
  
6.4.8 ProgLista_8 .................................................................................................................................. 276	
  
6.4.9 ProgLista_9 .................................................................................................................................. 276	
  
6.4.10 ProgLista_10 .............................................................................................................................. 277	
  
6.4.11 ProgLista_11 .............................................................................................................................. 278	
  
6.4.12 ProgLista_12 .............................................................................................................................. 278	
  
6.4.13 ProgLista_13 .............................................................................................................................. 279	
  
6.4.14 ProgLista_14 .............................................................................................................................. 280	
  
6.4.15 ProgLista_15 .............................................................................................................................. 281	
  
Anexo 7.2 Solução da Lista: Mapas .................................................................................................. 281	
  
7.2.1 ProgMap_1 .................................................................................................................................. 281	
  
 5 
7.2.2 ProgMap_2 .................................................................................................................................. 282	
  
7.2.3 ProgMap_3 .................................................................................................................................. 282	
  
7.2.4 ProgMap_4 .................................................................................................................................. 283	
  
7.2.5 ProgMap_5 .................................................................................................................................. 283	
  
Anexo 8.6 Solução da Lista: Arquivos (File) ................................................................................... 284	
  
8.6.1 ProgFile_1 .................................................................................................................................... 284	
  
8.6.2 ProgFile_2 .................................................................................................................................... 285	
  
8.6.3 ProgFile_3 .................................................................................................................................... 285	
  
8.6.4 ProgFile_4 .................................................................................................................................... 286	
  
8.6.5 ProgFile_5 .................................................................................................................................... 287	
  
8.6.6 ProgFile_6 .................................................................................................................................... 288	
  
8.6.7 ProgFile_7 .................................................................................................................................... 289	
  
8.6.8 ProgFile_8 .................................................................................................................................... 289	
  
8.6.9 ProgFile_9 .................................................................................................................................... 290	
  
8.6.10 ProgFile_10 ............................................................................................................................... 291	
  
8.6.11 ProgFile_11 ............................................................................................................................... 292	
  
8.6.12 ProgFile_12 ...............................................................................................................................293	
  
 
Lista de Figuras 
 
Figura 1: Estrutura de dados da classe Vetor .................................................................................... 8 
Figura 2: Exemplo de Herança em java .............................................................................................. 40 
Figura 3: Objetos gráficos: Linha e Retângulo ................................................................................. 50 
Figura 4: LinkedList - Lista Encadeada Simples ................................................................................. 65 
Figura 5: Representação gráfica de uma String ................................................................................ 90 
Figura 6: Representação de uma Fila e uma Pilha .......................................................................... 108 
Figura 7: Representação visual de um Deque ................................................................................. 118 
Figura 8: Representação gráfica de uma Tabela Hash (Hashtable) .............................................. 131 
Figura 9: Exemplo de um arquivo texto ........................................................................................... 138 
Figura 10: Editor hexadecimal mostrando o arquivo texto ........................................................... 139 
Figura 11: Editor hexadecimal mostrando o arquivo binário ........................................................ 139 
Figura 12: Exemplo de MVC .............................................................................................................. 172 
Figura 13: Exemplo de MVC .............................................................................................................. 176 
Figura 14: Lista Encadeada Simples ................................................................................................. 182 
Figura 15: Alocação de elementos na Memória RAM .................................................................... 183 
Figura 16: Lista Duplamente Encadeada ......................................................................................... 193 
Figura 17: Jogo Torre de Hanoi ....................................................................................................... 208 
Figura 18: Jogo Quebra-Cabeças ..................................................................................................... 220 
 
Lista de Tabelas 
 
Tabela 1: Tipos de Ícones .................................................................................................................... 53 
Tabela 2: Comandos de formatação .................................................................................................. 53 
Tabela 3: Especificadores de largura do campo .............................................................................. 54 
Tabela 4: Lista de Container ................................................................................................................ 55 
Tabela 5: Tipos de dados do Java ..................................................................................................... 172 
 
Legenda de Cores 
 
Vermelho <enter>: Entrada de dados do programa 
Azul: Saída do programa (Resultado do teste do Programa) 
Verde: Texto em destaque 
Marinho: Código em Java 
Preto: Texto normal 
Preto: Método em destaque 
Itálico: Palavra em Inglês 
Negrito: Texto em destaque 
Sublinado: Observações 
 
 
 7 
1. Projeto de Classes 
 
 A seguir são descritas algumas características da orientação a objetos em Java. 
1.1 Escrevendo uma classe em Java (Conceitos básicos) 
 
 O paradigma orientado à objetos possui cinco componentes básicos: objetos (possuem 
atributos e métodos), mensagens (chamadas aos métodos), classes (tipo de dado), instâncias 
(criação de objetos de uma classe específica – new – alocação de memória) e métodos (funções 
definidas pelo programador que manipulam os atributos). 
 
Objetos, mensagens, classes, instâncias e métodos 
 
Objetos são entidades lógicas que contém atributos (dados armazenados em variáveis) 
e métodos (funções) que manipulam estes dados. Um objeto pode ser definido através de um 
tipo de dado chamado classe (class). 
 
Resumo: 
 
a) Atributos: São as variáveis definidas/declaradas para cada objeto. 
b) Métodos: São as funções definidas pelo programador que servirão para manipular os 
atributos. 
c) Mensagens: São as chamadas dos métodos. 
d) Classe: É um tipo de dado definido por class. Uma classe não é um objeto, é sim uma 
descrição do objeto. 
e) Instância: Os objetos são instâncias de uma classe, ou seja, é criado um objeto 
pertencente a uma classe específica. O objeto pode responder chamadas dos métodos 
e armazenar informações nos atributos. 
 
Resumidamente, objetos são instâncias de classes que respondem as mensagens 
através dos métodos escritos pelo programador. 
 
 Uma linguagem de programação orientada à objetos pode suportar ou implementar seis 
propriedades: abstração, encapsulamento, polimorfismo, herança, associação (quando uma 
 8 
classe possui atributos do tipo de outra classe - agregação e composição) e classes abstratas e 
concretas. 
 
 Considere a seguinte estrutura de dados da Figura 1, onde há um vetor de “max” 
elementos e um atributo “n” que controla a quantidade de elementos presentes no vetor num 
dado momento. Esta estrutura é utilizada na classe Vetor definida a seguir. 
 
Figura 1: Estrutura de dados da classe Vetor 
 
Programa Exemplo: Classe “Vetor”, que possui a estrutura de dados exibida na Figura 1, e que 
possui os seguintes atributos: 
 
private int n; // número de elementos no vetor 
private final int[] vetor; // vetor que armazena os elementos 
private final int max; // máximo número de elementos no vetor 
 
// -------------------------------------------------------------------------------------------------------------------------------------------- Classe: Vetor.java 
 
package progvetor; 
 
public class Vetor { 
 // ------------------------------------- atributos da classe 
 private int n; 
 private final int[] vetor; 
 private final int max; 
 
 // ----------------------------------------- construtor 
 Vetor(int numeroElementos) { 
 max = numeroElementos; 
 vetor = new int[max]; // alocação de max número de elementos 
 n = 0; 
 } 
 
 // ----------------------------------------- add 
 public void add(int valor) { 
 if (n < max) { 
 vetor[n] = valor; 
 n++; 
 9 
 } else { 
 System.out.println("Erro: Excedeu Limite do Vetor"); 
 } 
 } 
 
 // --------------------------------------- exibe 
 public void exibe() { 
 System.out.print("Vetor: ["); 
 for (int i = 0; i < n; i++) { 
 System.out.print(vetor[i] + ", "); 
 } 
 System.out.println("\b\b]"); // apaga o último espaço em branco e a última vírgula 
 } // ‘\b’ retrocesso ou BackSpace 
 
 // ---------------------------------------------------- numeroElementosVetor 
 public int numeroElementosVetor() { 
 return(n); 
 } 
} 
 
// ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgVetor.java 
 
package progvetor; 
 
public class ProgVetor { 
 
 public static void main(String[] args) { 
 Vetor vetor = new Vetor(5); // 5 é o número de elementos no vetor estático da classe 
 
 vetor.add(10); 
 vetor.add(20); 
 vetor.add(30); 
 vetor.add(40); 
 vetor.add(50); 
 vetor.exibe(); 
 vetor.add(60); 
 vetor.exibe(); 
 System.out.println("Total de Elementos: " + vetor.numeroElementosVetor()); 
 } 
} 
 
Resultado do Programa: 
 
Vetor: [10,20, 30, 40, 50] 
Erro: Excedeu Limite do Vetor 
Vetor: [10, 20, 30, 40, 50] 
Total de Elementos: 5 
 
Tente implementar os seguintes métodos para a classe “Vetor”: 
 
 int valor = vetor.del(); 
 if (valor != -999) { 
 System.out.println("Valor Excluído: " + valor); 
 } else { 
 System.out.println("ERRO: Vetor Vazio"); 
 } 
 vetor.exibe(); 
 System.out.println("Total de Elementos: " + vetor.length()); 
 10 
 int pri = vetor.primeiro(); 
 System.out.println("Primeiro: " + pri); 
 int ult = vetor.ultimo(); 
 System.out.println("Último: " + ult); 
 int elemento = 20; 
 boolean flag = vetor.existe(elemento); 
 if (flag) { 
 System.out.println("Existe elemento: " + elemento); 
 } else { 
 System.out.println("Não Existe elemento 20"); 
 } 
 
Resultado do Programa: 
 
Vetor: [10, 20, 30, 40, 50] 
Erro: Excedeu Limite do Vetor 
Vetor: [10, 20, 30, 40, 50] 
Total de Elementos: 5 
Valor Excluído: 50 
Vetor: [10, 20, 30, 40] 
Total de Elementos: 4 
Primeiro: 10 
Último: 40 
Existe elemento: 20 
 
 Uma linguagem de programação orientada à objetos pode suportar e/ou implementar 
seis (6) propriedades: abstração, encapsulamento, polimorfismo, herança, associação 
(agregação e composição) e classes abstratas e concretas. 
 
Abstração 
 
 Objetos devem representar dados do mundo real. 
 
Encapsulamento (“encapsulação”) 
 
 Os objetos possuem internamente atributos e métodos agrupados no mesmo local, 
onde os métodos manipulam os atributos. Esta característica protege os dados (atributos) de 
alterações indevidas, somente os membros da classe podem acessar os atributos, desde que 
eles sejam privados (private) ou protegidos (protected) (caso das classes derivadas, que 
herdam o direito de acesso aos atributos). 
 
Polimorfismo (grego: “muitas formas”) 
 
É a capacidade de objetos diferentes reagirem segundo a sua função a uma ordem 
padrão. Significa que o nome de um objeto pode ser utilizado para vários propósitos 
ligeiramente diferentes, ou seja, “ ... uma interface, vários métodos ... ”. A característica de 
 11 
polimorfismo é utilizada principalmente em sobrecarga de métodos e operadores e classes 
abstratas, onde os métodos são declarados mas não definidos. Como tipos de polimorfismo 
tem-se: (a) Universal (inclusão [como em Java, por exemplo, List lista = new LinkedList();] e 
paramétrico [templates como em C++]) e (b) ad-hoc (sobrecarga de métodos e operadores). 
Java não possui sobrecarga de operadores. 
 
• Sobrecarga de Operador: Permite sobrecarregar operadores para realizar diferentes 
tipos de operações; 
 
• Sobrecarga de Método: Permite que um método retorne diferentes tipos de 
informações e aceite argumentos de vários tipos, inclusive com quantidade diferentes 
de argumentos; 
 
• Classes abstratas e concretas: Permite representar entidades e conceitos abstratos, 
sendo sempre uma superclasse (ou classe Base) e não permite ser instanciada, a classe 
abstrata apenas define um modelo (template) para uma funcionalidade e fornece uma 
implementação incompleta que é herdada pelas classes derivadas. Cada classe derivada 
implementa as funcionalidades da classe abstrata. Uma classe abstrata pode possuir 
métodos abstratos, mas os métodos são escritos nas classes derivadas concretas. 
Métodos abstratos definem apenas a forma do método não contendo nenhum tipo de 
código. Classes concretas implementam todos os métodos e podem ser instanciadas. 
 
Herança 
 
É o processo pelo qual uma classe de objetos pode adquirir as propriedades de outra 
classe de objetos, em outras palavras, um objeto herda as características de outro (herança 
simples) ou vários objetos (herança múltipla). A classe base é chamada de superclasse, 
enquanto a classe derivada pode ser chamada de subclasse. 
 
Associação 
 
É um vínculo que permite que objetos de uma ou mais classes se relacionem entre si. 
Esta associação pode ser: unária (o vínculo é entre objetos da mesma classe), binária (vínculo 
ocorre entre dois objetos de classes diferentes) ou múltipla (vínculo ocorre entre mais de 2 
 12 
objetos de classes diferentes). Cada associação pode possuir características de (a) 
cardinalidade ou multiplicidade (indica quantos objetos são possíveis em cada associação) e 
(b) navegação (existe a possibilidade dos objetos acessarem outros objetos da mesma 
associação). 
Uma associação pode ser de duas formas: agregação (relacionamento com 
características onde existe um grau menos intenso de coesão entre os elementos, pode haver 
um certo grau de independência) ou composição (relacionamento com características onde 
existe um alto grau de coesão e total grau de dependência entre os elementos). 
 
Classes Abstratas e Concretas 
 
É criada para representar entidades e conceitos abstratos. Uma classe abstrata é sempre 
uma superclasse ou classe base que não possui instâncias. Ela define apenas o modelo (como 
um template em C++) para uma funcionalidade e fornece uma implementação incompleta 
chamada de parte genérica sendo compartilhada por um conjunto de classes derivadas ou 
subclasses. Classes derivadas completam as funcionalida-des da classe abstrata anexando um 
comportamento específico. Classes abstratas possuem métodos abstratos. Esses métodos são 
implementados nas suas classes derivadas concretas com o objetivo de definir o 
comportamento específico. O método abstrato define apenas a assinatura do método não 
contendo nenhum código. Classes concretas implementam seus métodos e permitem 
instanciar objetos. Classes concretas não possuem métodos abstratos quando são classes 
derivadas de uma classe abstrata. 
 
Vantagens da Orientação à Objetos: (a) reutilização de código, (b) proteção aos dados; (c) 
organização ou estruturação dos dados em forma de classes e objetos; (d) sobrecarga de 
métodos e de operadores; (e) criação de pacotes de classes; (f) ter um conjunto de pacotes pré-
definidos (api’s: java2d, java3d, swing, awt, etc) e (g) permitir ao desenvolvedor criar seus 
próprios pacotes. 
API: Application Programming Interface ou Interface de Programação de Aplicativos. É um 
conjunto de padrões de programação que permitem a construção de aplicativos. 
 
 Em Java, o programador pode criar suas próprias classes. Uma classe possui duas partes 
distintas: atributos (variáveis) e métodos (funções ou procedimentos) que manipulam estes 
atributos. 
 13 
1.2 Sobrecarga de Métodos 
 
Java permite que métodos estáticos (e construtores) sejam sobrecarregados, desta 
forma, o retorno, número de argumentos ou mesmo o tipo de dados dos argumentos 
podem ser diferentes. Dependendo da chamada do método, o Java identifica qual método (ou 
construtor) sobrecarregado deve ser executado. Teoricamente, é uma especificação que pode 
ter várias implementações com características diferentes. 
 
// ---------------------------------------------------------------------------------------------------- Programa Principal: ProgSobreCarga.java 
 
package progsobrecarga; 
 
public class ProgSobreCarga { 
 
 public static void main(String[] args) { 
 imprime("Pelotas-RS"); 
 imprime(123.45); 
 imprime(123.45f); 
 imprime(123); 
 imprime('A'); 
 } 
 
 static void imprime(String s) { 
 System.out.println("String: " + s); 
 } 
 
 static void imprime(Double d) { 
 System.out.println("Double: " + d); 
 } 
 
 static void imprime(Float f) { 
 System.out.println("Float: " + f); 
 } 
 
 static void imprime(Integer i) { 
 System.out.println("Inteiro: " + i); 
 } 
 
 static void imprime(Character ch) { 
 System.out.println("Caracter:" + ch); 
 } 
} 
 
Resultado do Programa: 
 
String: Senac-RS 
Double: 123.45 
Float: 123.45 
Inteiro: 123 
Caracter: A 
 
// -------------------------------------------------------------------------------------------------- Programa Principal: ProgPolimorfismo.java 
 
package progpolimorfismo; 
 
 14 
public class ProgPolimorfismo { 
 
 public static void main(String[] args) { 
 pixel(1, 2); 
 pixel(1, 2, 3); 
 pixel(1.0, 2.0, 3.0); 
 pixel('A', 'B', 'C'); 
 } 
 
 public static void pixel(int x, int y) { 
 System.out.printf("x = %d | y = %d\n", x, y); 
 } 
 
 public static void pixel(int x, int y, int z) { 
 System.out.printf("x = %d | y = %d | z = %d\n", x, y, z); 
 } 
 
 public static void pixel(double x, double y, double z) { 
 System.out.printf("x = %.2f | y = %.2f | z = %.2f\n", x, y, z); 
 } 
 
 public static void pixel(char x, char y, char z) { 
 System.out.printf("x = %c | y = %c | z = %c\n", x, y, z); 
 } 
} 
 
Resultado do Programa: 
 
x = 1 | y = 2 
x = 1 | y = 2 | z = 3 
x = 1,00 | y = 2,00 | z = 3,00 
x = A | y = B | z = C 
 
1.3 Referência this 
 
 Em Java, quando um método de uma classe é chamado, é passado automaticamente 
um argumento que é uma referência para o objeto que gerou a chamada. Esta referência é 
chamada this, ou seja, a referência this referencia o objeto que chamou o método. 
 
 Cada objeto tem acesso a uma referência a ele próprio, chamada this. Esta referência faz 
referências aos atributos e métodos de um objeto. 
 
Programa exemplo: Utilização da referência this em uma classe. 
 
// ------------------------------------------------------------------------------------------------------------------------------------- Classe: Data.java 
 
package progdata; 
 
import java.text.DecimalFormat; 
 
public class Data { 
 // ------------------------------------- atributos da classe 
 private int dia, mes, ano; 
 15 
 
 // ------------------------------------------------ construtor 
 Data(int dia, int mes, int ano) { 
 this.dia = dia; 
 this.mes = mes; 
 this.ano = ano; 
 } 
 
 // ------------------------------------------- sobrecarga do método toString 
 public String toString() { 
 DecimalFormat form = new DecimalFormat("00"); 
 String data = "Data: " + form.format(dia) + "/" + form.format(mes) + "/" + ano; 
 return (data); 
 } 
} 
 
// ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgData.java 
 
package progdata; 
 
public class ProgData { 
 
 public static void main(String[] args) { 
 Data data = new Data(5, 8, 2014); 
 
 System.out.println(data); 
 } 
} 
 
Resultado do Programa: 
 
Data: 05/08/2014 
 
Solução do programa proposto acima: Classe “Vetor” e seus métodos. 
 
// -------------------------------------------------------------------------------------------------------------------------------------- Classe: Vetor.java 
 
package progvetor1; 
 
public class Vetor { 
 // --------------------------------------------- atributos da classe 
 private final int[] vetor; 
 private int n; 
 private final int max; 
 
 // ---------------------------------------------- construtor 
 Vetor(int numeroElementos) { 
 max = numeroElementos; 
 vetor = new int[max]; 
 n = 0; 
 } 
 
 // ----------------------------------------------- add 
 public void add(int valor) { 
 if (n < max) { 
 vetor[n] = valor; 
 n++; 
 } else { 
 16 
 System.out.println("Erro: Excedeu Limite do Vetor"); 
 } 
 } 
 
 // ------------------------------------------------ del 
 public int del() { 
 if (n != 0) { 
 int valor = vetor[n - 1]; 
 n--; 
 return (valor); 
 } else { 
 System.out.println("Erro: Vetor Vazio"); 
 return (-999); 
 } 
 } 
 
 // ------------------------------------------------- length 
 public int length() { 
 return (n); 
 } 
 
 // ------------------------------------------------- primeiro 
 public int primeiro() { 
 if (n != 0) { 
 return (vetor[0]); 
 } else { 
 return (-999); 
 } 
 } 
 
 // -------------------------------------------------- ultimo 
 public int ultimo() { 
 int ultimo = n - 1; 
 if (n != 0) { 
 return (vetor[ultimo]); 
 } else { 
 return (-999); 
 } 
 } 
 
 // ----------------------------------------------------- existe 
 public boolean existe(int elemento) { 
 for (int i = 0; i < n; i++) { 
 if (elemento == vetor[i]) { 
 return (true); 
 } 
 } 
 return (false); 
 } 
 
 // ----------------------------------------------------- exibe 
 public void exibe() { 
 System.out.print("Vetor: ["); 
 for (int i = 0; i < n; i++) { 
 System.out.print(vetor[i] + ", "); 
 } 
 System.out.println("\b\b]"); 
 } 
 
 17 
 // ------------------------------------------------------ numeroElementosVetor 
 public int numeroElementosVetor() { 
 return (n); 
 } 
} 
 
// -------------------------------------------------------------------------------------------------------- Programa Principal: ProgVetor1.java 
 
package progvetor1; 
 
public class ProgVetor1 { 
 
 public static void main(String[] args) { 
 Vetor vetor = new Vetor(5); // 5 é o número de elementos do vetor estático da classe 
 
 vetor.add(10); 
 vetor.add(20); 
 vetor.add(30); 
 vetor.add(40); 
 vetor.add(50); 
 vetor.exibe(); 
 vetor.add(60); 
 vetor.exibe(); 
 System.out.println("Total de Elementos: " + vetor.numeroElementosVetor()); 
 int valor = vetor.del(); 
 if (valor != -999) { 
 System.out.println("Valor Excluído: " + valor); 
 } else { 
 System.out.println("ERRO: Vetor Vazio"); 
 } 
 vetor.exibe(); 
 System.out.println("Total de Elementos: " + vetor.length()); 
 int primeiro = vetor.primeiro(); 
 System.out.println("Primeiro: " + primeiro); 
 int ultimo = vetor.ultimo(); 
 System.out.println("Último: " + ultimo); 
 int elemento = 20; 
 boolean flag = vetor.existe(elemento); 
 if (flag) { 
 System.out.println("Existe elemento: " + elemento); 
 } else { 
 System.out.println("Não Existe elemento 20"); 
 } 
 } 
} 
 
1.4 Lista de exercícios: Classes 
 
1.4.1 Dado o seguinte programa principal, implemente a classe “Circulo” e seus métodos: 
 
// ------------------------------------------------------------------------------------------------------- Programa Principal: ProgCirculo.java 
 
package progcirculo; 
 
public class ProgCirculo { 
 
 public static void main(String[] args) { 
 Circulo circ = new Circulo(); 
 18 
 
 circ.setRaio(3); 
 circ.calculaArea(); 
 double area = circ.getArea(); 
 System.out.printf("Área: %.2f\n", area); 
 } 
} 
 
Observação: area = pi . raio2 onde pi é 3.1416 
 
Círculo 
double area, raio 
setRaio 
calculaArea 
getArea 
 Diagrama de classe 
 
Resultado do Programa: 
 
Área: 28,27 
 
1.4.2 Dado o seguinte programa principal, implemente a classe “PesoIdeal” e seus métodos: 
 
// ----------------------------------------------------------------------------------------------------------Programa Principal: ProgPeso.java 
 
package progpeso; 
 
public class ProgPeso { 
 
 public static void main(String[] args) { 
 PesoIdeal piHomem = new PesoIdeal('H', 1.67); 
 PesoIdeal piMulher = new PesoIdeal('m', 1.65); 
 
 piHomem.calculaPesoIdeal(); 
 System.out.printf("Peso Ideal Homem: %.2f\n", piHomem.getPesoIdeal()); 
 
 piMulher.calculaPesoIdeal(); 
 System.out.printf("Peso Ideal Mulher: %.2f\n", piMulher.getPesoIdeal()); 
 } 
} 
 
Resultado do Programa: Peso Ideal Homem: 63,41 
 Peso Ideal Mulher: 57,77 
 
Cálculo do Peso Ideal: PIH = 72,7 x altura – 58 
 PIM = 62,1 x altura – 44,7 
 
PesoIdeal 
double altura, pesoIdeal 
char sexo 
calculaPesoIdeal 
getPesoIdeal 
 Diagrama de classe 
 
1.4.3 Dado o seguinte programa principal, implemente a classe “CPF” e seus métodos: 
 
// ----------------------------------------------------------------------------------------------------- Programa Principal: ProgValidaCPF.java 
 19 
 
package progvalidacpf; 
 
public class ProgValidaCPF { 
 
 public static void main(String[] args) { 
 String s = "123456789"; 
 CPF cpf = new CPF(s); 
 
 int digitoVerificador = cpf.verificaCPF(); 
 System.out.printf("Digito verificador: %02d\n", digitoVerificador); 
 System.out.printf("CPF: %s-%02d\n", s , digitoVerificador); 
 } 
} 
 
Resultado do Programa: 
 
Digito verificador: 09 
CPF: 123456789-09 
 
CPF 
String cpf 
int digito 
verificaCPF 
 Diagrama de classe 
 
Como calcular os Dígitos do CPF: 
 
Entrada: CPF: 123456789 
 
1) Primeiramente pega-se os dígitos da base do CPF e se faz a soma da multiplicação individual dos dígitos, iniciando 
por 10 e indo até 2 como exemplificado abaixo: 
 
 1 2 3 4 5 6 7 8 9 
 x x x x x x x x x 
 10 9 8 7 6 5 4 3 2 
 -- -- -- -- -- -- -- -- -- 
 10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 = 210 
2) O valor do primeiro dígito é o resultado da subtração de 11 pelo resto da divisão da soma acima por 11. Se este valor 
for 10 ou 11, o dígito é 0 (zero), do contrário é o próprio valor. No exemplo em questão o dígito encontrado é calculado 
conforme vê-se a seguir: 
 
11 - (210 % 11) = 10 
 
3) O cálculo do segundo dígito é feito da mesma forma que o primeiro, porém com os 9 dígitos da base do CPF e o 
primeiro dígito verificador encontrado, iniciando por 11 e indo até 2. 
 
 1 2 3 4 5 6 7 8 9 0 
 x x x x x x x x x x 
11 10 9 8 7 6 5 4 3 2 
-- -- -- -- -- -- -- -- -- -- 
11 + 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 = 255 
 
4) O valor do segundo dígito é o resultado da subtração de 11 pelo resto da divisão da soma acima por 11. Se este valor 
for 10 ou 11, o dígito é 0 (zero), do contrário é o próprio valor. No exemplo em questão o dígito encontrado é calculado 
conforme vê-se a seguir: 
 
11 - (255 % 11) = 9 
 
 20 
Saída: CPF válido é 123.456.789-09 ou 123456789-09 
 
1.4.4 Dado o seguinte programa, implemente a classe “DiaSemana” e seus métodos: 
 
// ----------------------------------------------------------------------------------------------------- Programa Principal: ProgDiaSemana.java 
 
package progdiasemana; 
 
public class ProgDiaSemana { 
 
 public static void main(String[] args) { 
 DiaSemana dia = new DiaSemana(10, 2, 1962); 
 
 dia.verificaDiaSemana(); 
 dia.exibeDiaSemana(); 
 } 
} 
 
Resultado do Programa: 
 
Dia da Semana: Sábado 
 
DiaSemana 
int dia, mes, ano 
String semama 
verificaDiaSemana 
exibeDiaSemana 
 Diagrama de classe 
 
 21 
Como calcular o Dia da Semana: 
 
Deve-se calcular o Dia do Século: 
 
Para qualquer cálculo com datas é essencial que se disponha do Dia do Século para a(s) data(s) em questão. O Dia do 
Século é o número de dias decorridos desde o início do século (1º de janeiro de 1901) até a data em questão. Se usa 
como referência 1901 porque a maioria das datas com as quais se trabalha ainda são do século passado. Lá por 2040 ou 
mais poderá se mudar para 2001. 
 
A fórmula (válida para datas entre 1901 e 2099) é a seguinte: 
 
numeroDias = (ano - 1901) * 365 + (ano - 1901) DIV 4 + dia + (mês - 1) * 31 - [(mês * 4 + 23) DIV 10] * [(mês + 12) DIV 15] 
+ [(4 - ano MOD 4) DIV 4] * [(mês + 12) DIV 15] 
 
Dados de Teste: Dia: 10 
 Mês: 2 
 Ano: 1962 
 
numeroDias = 22321 (para a data acima) 
 
Onde: DIV é a divisão inteira e MOD é o resto inteiro da divisão 
Verificação do Dia da Semana: Para saber o diaSemana basta dividir o numeroDias por 7 e entrar com o resto inteiro 
da divisão na tabela abaixo: 
0 Segunda 
1 Terça 
2 Quarta 
3 Quinta 
4 Sexta 
5 Sábado 
6 Domingo 
 
Resultado do Programa: (Saída) 
 
10/02/1962 é um(a) Sábado 
 
Observação: DIV é divisão inteira de dois números e MOD é o resto inteiro da divisão de dois números. 
 
1.4.5 Dado o seguinte programa principal, implemente a classe Data e seus métodos: 
 
// ------------------------------------------------------------------------------------------------------ Programa Principal: ProgTestData.java 
 
package progtestdata; 
 
public class ProgTestData { 
 
 public static void main(String[] args) { 
 Data data = new Data(); 
 
 data.setData(25, 8, 2014); 
 data.extenso(); 
 } 
} 
 
Resultado do Programa: 
 
Data: 25 de agosto de 2014 
 
 22 
Data 
int dia, mes, ano 
setData 
extenso 
 Diagrama de classe 
 
1.4.6 Implemente os métodos forcaBruta e bubleSort na classe “Vetor” vista anteriormente 
(Fonte: ProgVetor). 
 
// ------------------------------------------------------------------------------------------------------ Programa Principal: ProgVetorSort.java 
 
package progvetorsort; 
 
public class ProgVetorSort { 
 
 public static void main(String[] args) { 
 Vetor vetor = new Vetor(5); 
 
 vetor.add(40); 
 vetor.add(20); 
 vetor.add(30); 
 vetor.add(50); 
 vetor.add(10); 
 vetor.exibe(); 
 vetor.add(60); 
 vetor.exibe(); 
 vetor.forcaBruta(); 
 vetor.exibe(); 
 vetor.bubbleSort(); 
 vetor.exibe(); 
 } 
} 
 
Resultado do Programa: 
 
Vetor: [40 20 30 50 10] 
ERRO: Excedeu o Limite do Vetor 
Vetor: [40 20 30 50 10] 
Vetor: [10 20 30 40 50] 
Vetor: [10 20 30 40 50] 
 
1.4.7 Dado o seguinte programa principal, implemente a classe “Pessoa” e seus métodos. 
 
// -------------------------------------------------------------------------------------------------------- Programa Principal: ProgPessoa.java 
 
package progpessoa; 
 
public class ProgPessoa { 
 
 public static void main(String[] args) { 
 Pessoa p1 = new Pessoa(); 
 Pessoa p2 = new Pessoa(); 
 Pessoa p3 = new Pessoa(); 
 
 p1.setDados("Paulo Roberto", 1962, 'm'); 
 p2.setDados("Renato Luis", 1965, 'm'); 
 p3.setDados("Francisco Carlos", 1959, 'm'); 
 p1.calculaIdade(); 
 23 
 p2.calculaIdade(); 
 p3.calculaIdade(); 
 p1.exibePessoa(); 
 p2.exibePessoa(); 
 p3.exibePessoa(); 
 } 
} 
 
Resultado do Programa: 
 
Nome: Paulo Roberto 
Idade: 52 ano(s) 
Sexo: Masculino 
Nome: Renato Luis 
Idade: 49 ano(s) 
Sexo: Masculino 
Nome: Francisco Carlos 
Idade: 55 ano(s) 
Sexo: Masculino 
 
Pessoa 
String nome 
int ano 
int idade 
char sexo 
setDados 
calculaIdade 
exibePessoa 
 Diagrama de classe 
 
1.4.8 Dado o seguinte programa principal, implemente a classe “Pessoa” e seus métodos. 
 
// -------------------------------------------------------------------------------------------------------Programa Principal: ProgPessoa2.java 
 
package progpessoa2; 
 
public class ProgPessoa2 { 
 
 public static void main(String[] args) { 
 Pessoa [] pessoa = new Pessoa[3]; 
 
 pessoa[0] = new Pessoa(); 
 pessoa[0].setDados("Paulo Roberto", 1962, 'm'); 
 pessoa[0].calculaIdade(); 
 pessoa[0].exibePessoa(); 
 
 pessoa[1] = new Pessoa(); 
 pessoa[1].setDados("Renato Luis", 1965, 'm'); 
 pessoa[1].calculaIdade(); 
 pessoa[1].exibePessoa(); 
 
 pessoa[2] = new Pessoa(); 
 pessoa[2].setDados("Francisco Carlos", 1959, 'm'); 
 pessoa[2].calculaIdade(); 
 pessoa[2].exibePessoa(); 
 } 
} 
 
 24 
Resultado do Programa: 
 
Nome: Paulo Roberto 
Idade: 52 ano(s) 
Sexo: Masculino 
Nome: Renato Luis 
Idade: 49 ano(s) 
Sexo: Masculino 
Nome: Francisco Carlos 
Idade: 55 ano(s) 
Sexo: Masculino 
 
Pessoa 
String nome 
int ano 
int idade 
char sexo 
setDados 
calculaIdade 
exibePessoa 
 Diagrama de classe 
 
1.4.9 Dado o seguinte programa principal, implemente a classe “Pessoa” e seus métodos. 
 
// ------------------------------------------------------------------------------------------------------- Programa Principal: ProgPessoas.java 
 
package progpessoas; 
 
public class ProgPessoas { 
 
 public static void main(String[] args) { 
 Pessoa pessoa = new Pessoa(7); 
 
 pessoa.insereDados("Beatriz", 11); 
 pessoa.insereDados("Debora", 13); 
 pessoa.insereDados("Fátima", 15); 
 pessoa.insereDados("Geni", 16); 
 pessoa.insereDados("Carla", 12); 
 pessoa.insereDados("Eva", 14); 
 pessoa.insereDados("Ana", 10); 
 pessoa.exibeDados(); 
 pessoa.sort(); 
 pessoa.exibeDados(); 
 } 
} 
 
Resultado do Programa: 
 
Lista de Pessoas 
Nome: Beatriz Idade: 11 
Nome: Debora Idade: 13 
Nome: Fátima Idade: 15 
Nome: Geni Idade: 16 
Nome: Carla Idade: 12 
Nome: Eva Idade: 14 
Nome: Ana Idade: 10 
Lista de Pessoas 
Nome: Ana Idade: 10 
Nome: Beatriz Idade: 11 
 25 
Nome: Carla Idade: 12 
Nome: Debora Idade: 13 
Nome: Eva Idade: 14 
Nome: Fátima Idade: 15 
Nome: Geni Idade: 16 
 
Pessoa 
String [] nome 
int [] idade 
int n 
int max 
insereDados 
exibeDados 
sort 
 Diagrama de classe 
 
1.4.10 Dado o seguinte programa principal, implemente a classe “Agenda” e seus métodos. 
 
// -------------------------------------------------------------------------------------------------------- Programa Principal: ProgAgenda.java 
 
package progagenda; 
 
public class ProgAgenda { 
 
 public static void main(String[] args) { 
 Agenda agenda = new Agenda(5); 
 
 agenda.insereTelefone("Ana", "99811234"); 
 agenda.insereTelefone("Beatriz", "99812345"); 
 agenda.insereTelefone("Carla", "99813456"); 
 agenda.insereTelefone("Debora", "99814567"); 
 agenda.insereTelefone("Eva", "99815678"); 
 agenda.insereTelefone("Fátima", "99816789"); 
 String fone = "99815678"; 
 String nome = agenda.consultaNome(fone); 
 if (nome.compareTo("") != 0) { 
 System.out.println("Nome: " + nome + " - Telefone: " + fone); 
 } else { 
 System.out.println("ERRO: Usuário não Encontrado"); 
 } 
 fone = "99810123"; 
 nome = agenda.consultaNome(fone); 
 if (nome.compareTo("") != 0) { 
 System.out.println("Nome: " + nome + " - Telefone: " + fone); 
 } else { 
 System.out.println("ERRO: Usuário não Encontrado"); 
 } 
 } 
} 
 
Resultado do Programa: 
 
ERRO: Excedeu limite da Agenda 
Nome: Eva - Telefone: 99815678 
ERRO: Usuário não Encontrado 
 
Agenda 
String [] nome 
 26 
String [] fone 
int n 
int max 
insereTelefone 
consultaNome 
 Diagrama de classe 
 
1.4.11 Dado o seguinte programa principal, implemente a classe “Calculadora” e seus 
métodos. 
 
// -------------------------------------------------------------------------------------------------- Programa Principal: ProgCalculadora.java 
 
package progcalculadora; 
 
public class ProgCalculadora { 
 
 public static void main(String[] args) { 
 Calculadora calc = new Calculadora(); 
 
 calc.entradaDados(); 
 calc.operaCalculadora(); 
 calc.exibeResultadoCalculadora(); 
 } 
} 
 
Observação: A calculadora deve ter as seguintes operações: 
 
• [+] adição 
• [-] subtração 
• [*] multiplicação 
• [/] divisão 
• [R] Raiz Quadrada 
• [P] Potência 
• [S] Seno 
• [C] Cosseno 
• [T] Tangente 
 
Calculadora 
double x 
double y 
char operador 
double resposta 
entradaDados 
operaCalculadora 
exibeResultadoCalculadora 
 Diagrama de classe 
 
Exemplo para testar o programa: 
 
Digite um Valor: 3 <enter> 
Operação [+-*/RrPpSsCcTt]: + <enter> 
Digite outro Valor: 4 <enter> 
Primeiro Valor: 3.0 
Operador: [Adição] 
Segundo Valor : 4.0 
Resultado da Operação: 7.0 
 
 27 
Exemplo da definição de uma classe “Data”: 
 
// -------------------------------------------------------------------------------------------------------------------------------------------- Classe: Data.java 
 
package progtestadata; 
 
public class Data { 
 // ------------------------------ atributos da classe 
 private final int dia; 
 private final int mes; 
 private final int ano; 
 
 // ----------------------------------------------------- construtor da classe 
 public Data(int dia, int mes, int ano) { 
 this.dia = dia; 
 this.mes = mes; 
 this.ano = ano; 
 } 
 
 // ------------------------------------------------------------------------------------------ sobrecarga do método toString 
 @Override // método “toString” sobrecarregado 
 public String toString() { 
 return("Data: " + this.dia + "/" + this.mes + "/" + this.ano); 
 } 
} 
 
Programa exemplo: Programa que utiliza a classe “Data” definida anteriormente: 
 
// ----------------------------------------------------------------------------------------------------- Programa Principal: ProgTestaData.java 
 
package progtestadata; 
 
public class ProgTestaData { 
 
 public static void main(String[] args) { 
 Data data = new Data(16, 3, 2010); // construtor irá receber 3 argumentos 
 
 System.out.println(data); 
 } 
} 
 
Resultado do Programa: 
 
Data: 16/3/2010 
 
Exemplo da definição de uma classe “Calculadora”: 
 
// -------------------------------------------------------------------------------------------------------------------- Classe: Calculadora.java 
 
package progcalculadora; 
 
import java.util.Scanner; 
 
public class Calculadora { 
 // ------------------------ atributos da classe 
 private double x; 
 private double y; 
 private double resultado; 
 28 
 private char operador; 
 
 // ------------------------ construtor 
 
 // --------------------------------------- métodos públicos da classe 
 public void entradaDados() { 
 Scanner input = new Scanner(System.in); 
 System.out.print("Digite um Valor: "); 
 String s = input.nextLine(); 
 s = s.replaceAll("[^0-9\\-.]", ""); // eliminação de letras digitadas de forma indevida 
 x = Double.parseDouble(s); // que não podem ser convertidas para double 
 do { 
 System.out.print("Operação [+-*/RrPpSsCcTt]: "); 
 s = input.nextLine(); 
 operador = s.charAt(0); 
 } while (!strChr("+-*/RrPpSsCcTt", operador)); 
 if (strChr("+-*/Pp", operador)) { 
 System.out.print("Digite outro Valor: "); 
 s = input.nextLine(); 
 s = s.replaceAll("[^0-9\\-.]",""); // eliminação de letras digitadas de forma indevida 
 y = Double.parseDouble(s); // que não podem ser convertidas para double 
 } 
 } 
 
 public void operaCalculadora() { 
 switch (operador) { 
 case '+': 
 resultado = add(); 
 break; 
 case '-': 
 resultado = sub(); 
 break; 
 case '*': 
 resultado = mul(); 
 break; 
 case '/': 
 resultado = div(); 
 break; 
 case 'P': 
 case 'p': 
 resultado = pot(); 
 break; 
 case 'R': 
 case 'r': 
 resultado = raiz(); 
 break; 
 case 'S': 
 case 's': 
 resultado = sen(); 
 break; 
 case 'C': 
 case 'c': 
 resultado = cos(); 
 break; 
 case 'T': 
 case 't': 
 resultado = tan(); 
 break; 
 } 
 29 
 } 
 
 public void exibeResultadoCalculadora() { 
 String nomeOperador; 
 
 System.out.println("Primeiro Valor: " + x); 
 switch (operador) { 
 case '+': nomeOperador = "Adição"; 
 break; 
 case '-': nomeOperador = "Subtração"; 
 break; 
 case '*': nomeOperador = "Multiplicação"; 
 break; 
 case '/': nomeOperador = ("Divisão"); 
 break; 
 case 'R': 
 case 'r': nomeOperador = "Raiz Quadrada"; 
 break; 
 case 'P': 
 case 'p': nomeOperador = "Potência"; 
 break; 
 case 'S': 
 case 's': nomeOperador = "Seno"; 
 break; 
 case 'C': 
 case 'c': nomeOperador = "Cosseno"; 
 break; 
 case 'T': 
 case 't': nomeOperador = "Tangente"; 
 break; 
 default: nomeOperador = "Operador Inválido"; 
 } 
 System.out.printf("Operação realizada: [%s]\n", nomeOperador); 
 System.out.println("Segundo Valor : " + y); 
 System.out.println("Resultado da Operação: " + resultado); 
 } 
 
 // ------------------------------- métodos privados da classe 
 private double add() { 
 return (x + y); 
 } 
 
 private double sub() { 
 return (x - y); 
 } 
 
 private double mul() { 
 return (x * y); 
 } 
 
 private double div() { 
 return (x / y); 
 } 
 
 private double pot() { 
 return (Math.pow(x, y)); 
 } 
 
 private double raiz() { 
 30 
 return (Math.sqrt(x)); 
 } 
 
 private double sen() { 
 double rads = converteRadianos(x); 
 return (Math.sin(rads)); 
 } 
 
 private double cos() { 
 double rads = converteRadianos(x); 
 return (Math.cos(rads)); 
 } 
 
 private double tan() { 
 double rads = converteRadianos(x); 
 return (Math.tan(rads)); 
 } 
 
 // ----------------------------------------------------------------------- métodos estáticos da classe 
 private static boolean strChr(String s, char ch) { 
 int n = s.length(); 
 for (int i = 0; i < n; i++) { 
 if (s.charAt(i) == ch) { 
 return (true); 
 } 
 } 
 return (false); 
 } 
 
 private static double converteRadianos(double graus) { 
 double rads = Math.PI * graus / 180.0; 
 return (rads); 
 } 
} 
 
Programa exemplo: Utiliza a classe “Calculadora” e seus métodos definidos acima: 
 
// -------------------------------------------------------------------------------------------------- Programa Principal: ProgCalculadora.java 
 
package progcalculadora; 
 
public class ProgCalculadora { 
 
 public static void main(String[] args) { 
 Calculadora calc = new Calculadora(); // classe não recebe argumentos, não é necessário ela ter construtor 
 
 calc.entradaDados(); 
 calc.operaCalculadora(); 
 calc.exibeCalculadora(); 
 } 
} 
 
Programa exemplo: Mostra outra forma de utilizar a função “strChr” oriunda da linguagem de 
programação C e C++ utilizando o método “indexOf” do Java. 
 
// -------------------------------------------------------------------------------------------------------- Programa Principal: ProgstrChr.java 
 
 31 
package progstrchr; 
 
import java.util.Scanner; 
 
public class ProgstrChr { 
 
 public static void main(String[] args) { 
 Scanner entrada = new Scanner(System.in); 
 String nome, s; 
 
 do { 
 System.out.print("Nome: "); 
 nome = entrada.nextLine(); 
 int n = nome.length(); 
 System.out.println(nome + " seu nome tem " + n + " caracteres"); 
 do { 
 System.out.print("Continua [S/N]? " ); 
 s = entrada.nextLine(); 
 } while ("SsNn".indexOf(s) == -1); 
 } while ("Nn".indexOf(s) == -1); // ou ... } while ("S".equalsIgnoreCase(s)); 
 } 
} 
 
Exemplo para testar o programa: 
 
Nome: Paulo Roberto Gomes Luzzardi <enter> 
Paulo Roberto Gomes Luzzardi seu nome tem 28 caracteres 
Continua [S/N]? N <enter> 
 
Modificadores de Acesso: 
 
• public: Os atributos e métodos tornam-se públicos, ou seja, qualquer outro método 
pode chamar ou utilizar estes atributos e/ou métodos. 
• private: Somente os métodos da classe (membros) da classe podem chamar ou utilizar 
atributos ou métodos privados. 
• protected: Utilizado em herança simples de classe (construção de subclasses), ou seja, 
uma subclasse herda todos os atributos e métodos da classe base (superclasse). Deixa 
acessível os atributos e/ou métodos para todas as outras classes (classe base) e 
subclasses (classe derivada). 
 
 32 
2. Interface e Polimorfismo 
 
2.1 Interface 
 
Uma interface é uma especificação que define um determinado conjunto de métodos 
que serão implementados nas classes desta interface. Para uma interface ser integralmente 
abstrata, seus métodos devem ser definidos como abstract e as variáveis por padrão são 
sempre constantes (static final). 
Uma interface é definida através da palavra reservada interface e uma classe para 
implementar uma interface usa a palavra reservada implements. 
Como Java não possui herança múltipla, a implementação de interfaces supram esta 
carência, como uma classe só pode herdar apenas uma vez, pode-se implementar inúmeras 
interfaces. As classes que implementam uma interface terão obrigatoriamente que ter todos os 
métodos da interface ou se transformar em uma classe abstrata. 
// ------------------------------------------------------------------------------------------------------------- Programa Principal: ProgInterface.java 
 
package proginterface; 
 
public class ProgInterface { 
 
 public static void main(String[] args) { 
 Homem homem = new Homem("Paulo Roberto"); 
 Mulher mulher = new Mulher("Adriane Maria"); 
 
 homem.exibeNome(); 
 homem.exibeSexo(); 
 mulher.exibeNome(); 
 mulher.exibeSexo(); 
 } 
} 
 
// ------------------------------------------------------------------------------------------------------------------------------- Classe: Pessoa.java 
 
package proginterface; 
 
public interface Pessoa { 
 public abstract void exibeNome(); 
 public abstract void exibeSexo(); 
} 
 
// ------------------------------------------------------------------------------------------------------------------------------ Classe: Homem.java 
 
package proginterface; 
 
publicclass Homem implements Pessoa { 
 33 
 // --------------------------------------------- atributos da classe 
 private final String nome; 
 private static final char sexo = 'm'; 
 
 Homem(String nome) { 
 this.nome = nome; 
 } 
 
 @Override // método “exibeNome” sobrecarregado 
 public void exibeNome() { 
 System.out.println("Homem: " + nome); 
 } 
 
 @Override // método “exibeSexo” sobrecarregado 
 public void exibeSexo() { 
 System.out.println("Sexo: Masculino -> " + sexo); 
 } 
} 
 
// --------------------------------------------------------------------------------------------------------------------------------------- Classe: Mulher.java 
 
package proginterface; 
 
public class Mulher implements Pessoa{ 
 // ------------------------------------------------- atributos da classe 
 private final String nome; 
 private static final char sexo = 'f'; 
 
 Mulher(String nome) { 
 this.nome = nome; 
 } 
 
 @Override // método “exibeNome” sobrecarregado 
 public void exibeNome() { 
 System.out.println("Mulher: " + nome); 
 } 
 
 @Override // método “exibeSexo” sobrecarregado 
 public void exibeSexo() { 
 System.out.println("Sexo: Feminino -> " + sexo); 
 } 
} 
 
Resultado do Programa: 
 
Homem: Paulo Roberto 
Sexo: Masculino -> f 
Mulher: Adriane Maria 
Sexo: Feminino -> m 
 
// --------------------------------------------------------------------------------------------------------------- Programa Principal: ProgPixel.java 
 
package progpixel; 
 
public class ProgPixel { 
 
 public static void main(String[] args) { 
 Pixel2D pixel2D = new Pixel2D(3, 4); 
 Pixel3D pixel3D = new Pixel3D(5, 6, 7); 
 34 
 
 pixel2D.exibe(); 
 pixel2D.setX(7); 
 pixel2D.setY(8); 
 pixel2D.exibe(); 
 
 pixel3D.exibe(); 
 pixel3D.setX(1); 
 pixel3D.setY(2); 
 pixel3D.setZ(3); 
 pixel3D.exibe(); 
 } 
} 
 
// ---------------------------------------------------------------------------------------------------------------------------------------- Interface: Pixel.java 
 
package progpixel; 
 
public interface Pixel { 
 public abstract void setX(int x); 
 public abstract void setY(int y); 
 public abstract void setZ(int z); 
 public abstract void exibe(); 
} 
 
// ---------------------------------------------------------------------------------------------------------------------------------------- Classe: Pixel2D.java 
 
package progpixel; 
 
public class Pixel2D implements Pixel { 
 private int x; 
 private int y; 
 
 Pixel2D(int x, int y) { 
 this.x = x; 
 this.y = y; 
 } 
 
 @Override 
 public void setX(int x) { 
 this.x = x; 
 } 
 
 @Override 
 public void setY(int y) { 
 this.y = y; 
 } 
 
 @Override 
 public void setZ(int z) { 
 } 
 
 @Override 
 public void exibe() { 
 System.out.printf("x = %d | y = %d\n", x, y); 
 } 
} 
 
// ---------------------------------------------------------------------------------------------------------------------------------------- Classe: Pixel3D.java 
 35 
package progpixel; 
 
public class Pixel3D implements Pixel { 
 private int x; 
 private int y; 
 private int z; 
 
 Pixel3D(int x, int y, int z) { 
 this.x = x; 
 this.y = y; 
 this.z = z; 
 } 
 
 @Override 
 public void setX(int x) { 
 this.x = x; 
 } 
 
 @Override 
 public void setY(int y) { 
 this.y = y; 
 } 
 
 @Override 
 public void setZ(int z) { 
 this.z = z; 
 } 
 
 @Override 
 public void exibe() { 
 System.out.printf("x = %d | y = %d | z = %d\n", x, y, z); 
 } 
} 
 
Resultado do Programa: 
 
x = 3 | y = 4 
x = 7 | y = 8 
x = 5 | y = 6 | z = 7 
x = 1 | y = 2 | z = 3 
 
2.2 Polimorfismo 
 
Conforme dito anteriormente, Polimorfismo, do grego: “muitas formas”, é a capacidade 
de objetos diferentes reagirem segundo a sua função a uma ordem padrão. Significa que o 
nome de um objeto pode ser utilizado para vários propósitos ligeiramente diferentes, ou seja, “ 
... uma interface, vários métodos ... ”. A característica de polimorfismo é utilizada principalmente 
em sobrecarga de métodos e operadores e classes abstratas, onde os métodos são 
declarados abstratos mas não definidos. Como tipos de polimorfismo tem-se: (a) Universal 
(inclusão [como em Java, por exemplo, List lista = new LinkedList();] e paramétrico [templates 
 36 
como em C++]) e (b) ad-hoc (sobrecarga de métodos e operadores). Java não possui 
sobrecarga de operadores. 
 
• Sobrecarga de Operador: Permite sobrecarregar operadores para realizar diferentes 
tipos de operações; 
 
• Sobrecarga de Método: Permite que um método retorne diferentes tipos de 
informações e aceite argumentos de vários tipos, inclusive com quantidade diferentes 
de argumentos; 
 
• Classes abstratas e concretas: Permite representar entidades e conceitos abstratos, 
sendo sempre uma superclasse (ou classe Base) e não permite ser instanciada, a classe 
abstrata apenas define um modelo (template) para uma funcionalidade e fornece uma 
implementação incompleta que é herdada pelas classes derivadas. Cada classe derivada 
implementa as funcionalidades da classe abstrata. Uma classe abstrata pode possuir 
métodos abstratos, mas os métodos são escritos nas classes derivadas concretas. 
Métodos abstratos definem apenas a forma do método não contendo nenhum tipo de 
código. Classes concretas implementam todos os métodos e podem ser instanciadas. 
 
Polimorfismo é o princípio no qual duas ou mais classes derivadas de uma mesma classe 
base podem implementar métodos que têm a mesma especificação, mas tem comportamentos 
diferentes, especializadas para cada uma das classes derivadas, utilizando uma referência a cada 
um dos objetos da classe base. 
Polimorfismo significa várias formas, onde um objeto pode se comportar de formas 
ligeiramente diferentes ao receber uma mensagem. Através do mecanismo de sobrecarga, dois 
métodos de uma classe podem ter o mesmo nome, desde que suas implementações sejam 
diferentes, entretanto isso não é considerado polimorfismo em Java. 
No polimorfismo é necessário que os métodos tenham exatamente a mesma especificação, 
sendo utilizado um mecanismo de redefinição de métodos nas classes derivadas. 
// ------------------------------------------------------------------------------------------------------- Programa Principal: ProgPolimorfismo.java 
 
package progpolimorfismo; 
 
 37 
public class ProgPolimorfismo { 
 
 public static void main(String[] args) { 
 Pessoa homem = new Homem(1.64, 'm'); 
 System.out.printf("Peso Ideal: %.2f (%s)\n", homem.calculaPesoIdeal(), homem.getSexo()); 
 Pessoa mulher = new Mulher(1.64, 'f'); 
 System.out.printf("Peso Ideal: %.2f (%s)\n", mulher.calculaPesoIdeal(), mulher.getSexo()); 
 } 
} 
 
// ------------------------------------------------------------------------------------------------------- Classe Base: Pessoa.java 
 
package progpolimorfismo; 
 
abstract class Pessoa { 
 
 protected Double altura; 
 protected Character sexo; 
 
 public abstract Double calculaPesoIdeal(); 
 public abstract String getSexo(); 
} 
 
// ------------------------------------------------------------------------------------------------------- Classe Derivada: Homem.java 
 
package progpolimorfismo; 
 
class Homem extends Pessoa { 
 Homem(Double altura, Character sexo) { 
 this.altura = altura;

Outros materiais