marco a l barbosa malbarbo.pro · programação orientada a objetos em java marco a l barbosa...
TRANSCRIPT
![Page 1: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/1.jpg)
Programação orientada a objetos em Java
Marco A L Barbosamalbarbo.pro.br
Departamento de InformáticaUniversidade Estadual de Maringá
cbaEste trabalho está licenciado com uma Licença Creative Commons - Atribuição-CompartilhaIgual 4.0 Internacional.
![Page 2: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/2.jpg)
Conteúdo
Introdução
Uso de classes existentes
Criação de novas classes
Interfaces
Herança
Referências
![Page 3: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/3.jpg)
Introdução
3/69
![Page 4: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/4.jpg)
Introdução
• Programação baseada na composição e interação entre objetos
• POO surgiu com a linguagem Simula (1965), usada para criarsimulações
• Composição de objetos e suas interações também é uma boaabstração para muitos outros domínios além da simulação
4/69
![Page 5: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/5.jpg)
Introdução
• Os objetos podem representar coisas reais ou abstratas
• Os objetos têm
• Estado (atributos, assim como uma estrutura em C)
• Comportamento (métodos)
5/69
![Page 6: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/6.jpg)
Introdução
• Em geral, o estado de um objeto não pode ser manipuladodiretamente, apenas através dos métodos do objeto
• Este conceito é chamado de encapsulamento e é um dospilares da POO
6/69
![Page 7: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/7.jpg)
Introdução
• Objetos em Java são instanciados a partir de classes usando ooperador new
• O operador new invoca o construtor especificado
• O construtor é um método especial responsável por inicializaro objeto em um estado consistente
• Cada classe tem ao menos um construtor
7/69
![Page 8: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/8.jpg)
Uso de classes existentes
8/69
![Page 9: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/9.jpg)
Uso de classes existentes
• Java oferece uma biblioteca com milhares de classes, vamosver alguns exemplos
• Vamos criar um projeto no Netbeans e criar um classe deteste para cada exemplo
import org.junit.Test;import static org.junit.Assert.*;
public class NomeDaClasseTest {@Testpublic void testNomeDoMetodo() {
// código do teste}
}
9/69
![Page 10: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/10.jpg)
Uso de classes existentes
10/69
![Page 11: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/11.jpg)
Uso de classes existentes
11/69
![Page 12: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/12.jpg)
Uso de classes existentes
12/69
![Page 13: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/13.jpg)
StringBuilder
• As strings em Java são imutáveis
• Muitas operações de edição de string com o exemplo abaixopodem ser ineficiente
String s = "Total: " + 150 + " unidades";
• Para trabalhar de forma eficiente com edição de strings,usamos a classe StringBuilder
13/69
![Page 14: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/14.jpg)
StringBuilder
@Testpublic void testAppend() {
StringBuilder b = new StringBuilder();b.append("Total: ");
// append retorna o próprio StringBuilder,// então podemos fazer um encadeamento// de chamadasb.append(150).append(" unidades");
assertEquals("Total: 150 unidades", b.toString());}
14/69
![Page 15: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/15.jpg)
StringBuilder
@Testpublic void testConstrutor() {
// reserva uma capacidade inicial para// o buffer interno do StringBuilderStringBuilder b = new StringBuilder(2500);assertTrue(b.capacity() >= 2500);
}
15/69
![Page 16: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/16.jpg)
StringBuilder
@Testpublic void testDelete() {
StringBuilder b = new StringBuilder("Construtor que recebe uma string inicial"
);b.delete(10, 32);assertEquals("Construtor inicial", b.toString());
}
16/69
![Page 17: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/17.jpg)
StringBuilder
Outros métodos
Método Descrição
indexOf Retorna o índice da primeira ocorrência deuma string
insert Insere a representação em string de um objetoem uma determinada posição
deleteCharAt Remove um caractere de uma determinadaposição
substring Devolve uma string que contém os caracteresem um determinado intervalo
17/69
![Page 18: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/18.jpg)
ArrayList
• Uma lista implementada com um arranjo que aumenta ediminui de tamanho conforme a necessidade
• Usado como alternativa para um arranjo quando a quantidadede elementos do arranjo pode variar
18/69
![Page 19: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/19.jpg)
ArrayList
@Testpublic void testAdd() {
ArrayList<Integer> lista = new ArrayList<>();assertEquals(0, lista.size());lista.add(20);lista.add(10);lista.add(20);assertEquals(3, lista.size());// apenas assertEquals(20, lista.get(0)) não compila// devido a confusão entre o tipo primitivo int// e o tipo referência Integer...assertEquals(new Integer(20), lista.get(0));assertEquals(10, lista.get(1).intValue());assertEquals(20, lista.get(2).intValue());
} 19/69
![Page 20: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/20.jpg)
ArrayList
@Testpublic void testSort() {
ArrayList<Integer> lista = new ArrayList<>();lista.add(10);lista.add(2);lista.add(-4);lista.add(3);// ordena segundo a ordem natural dos inteiroslista.sort(null);assertArrayEquals(
new Integer[] {-4, 2, 3, 10},lista.toArray(new Integer[4])
);}
20/69
![Page 21: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/21.jpg)
ArrayList
Outros métodos
Método Descrição
contains Verifica se um determinado elemento está nalista
isEmpty Devolve verdadeiro se a lista está vazia, falsocaso contrário
set Substitui o elemento em uma determinadaposição
remove Remove a primeira ocorrência de um elementona lista, se ele estiver presente
21/69
![Page 22: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/22.jpg)
HashMap
• Um dicionário (mapeamento entre chave e valor)implementado com uma tabela hash
22/69
![Page 23: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/23.jpg)
HashMap
@Testpublic void testPut() {
HashMap<Integer, String> map = new HashMap();map.put(10, "verde");assertEquals("verde", map.get(10));map.put(2, "amarelo");assertEquals("verde", map.get(10));assertEquals("amarelo", map.get(2));// substitui o antigo valormap.put(10, "vermelho");assertEquals("vermelho", map.get(10));assertEquals("amarelo", map.get(2));
}
23/69
![Page 24: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/24.jpg)
HashMap
@Testpublic void testRemove() {
HashMap<Integer, String> map = new HashMap();
map.put(10, "verde");map.put(2, "amarelo");map.put(7, "vermelho");map.remove(2);
assertEquals("verde", map.get(10));assertEquals("vermelho", map.get(7));assertNull(map.get(2));
}
24/69
![Page 25: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/25.jpg)
HashMap
Outros métodos
Método Descrição
containsKey Devolve verdadeiro se o HashMap contém umadeterminada chave, falso caso contrário
clear Remove todos os itens do HashMap
25/69
![Page 26: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/26.jpg)
Outras classes
Classe Descrição
Arrays Contém um conjunto de métodos estáticos quetrabalham com arranjos
Collections Contém um conjunto de métodos estáticos quetrabalham com coleções
HashSet Um conjunto implementado com uma tabelahash
Scanner Um scanner que pode extrair tipos primitivos estrings de texto (incluindo arquivos)
FileReader Leitura de arquivos textoFileWriter Criação e escrita de arquivos texto
26/69
![Page 27: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/27.jpg)
Uso de classes existentes
• Podemos fazer algumas observações sobre o uso de classesexistentes
• Precisamos entender o propósito de cada classe
• Mas não precisamos entender os detalhes da implementação
• Uma ideia da implementação pode ser útil, ex: tempo deexecução de ArrayList.contains é linear ao passo queHashSet.contains é constante
• O estado de um objeto de uma classe é manipuladoindiretamente através dos métodos
27/69
![Page 28: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/28.jpg)
Criação de novas classes
28/69
![Page 29: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/29.jpg)
Criação de novas classes
Escreva um programa que leia um arquivo texto e imprima na telaas 𝑛 palavras mais frequentes no arquivo e o número deocorrências destas palavras. O nome do arquivo e o valor de 𝑛devem ser passados como argumento na linha de comando.
29/69
![Page 30: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/30.jpg)
Criando novas classes
• Entrada
• Classes FileReader e Scanner para leitura do arquivo eidentificação das palavras
• Saída
• Impressão simples usando System.out
• Processamento
• Vamos definir uma classe para fazer a contagem das palavras
30/69
![Page 31: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/31.jpg)
Criando novas classes
• Antes de definir uma classe, podemos pensar em comogostaríamos de usar a classe se ela já existisse
Contagem contagem = new Contagem();
for (String palavra: palavras) {contagem.adiciona(palavra)
}
String[] maisFrequentes = contagem.getMaisFrequentes(n);for (String palavra: maisFrequentes) {
int frequencia = contagem.getFrequencia(palavra)...
}
31/69
![Page 32: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/32.jpg)
Criando novas classes
• Esboço da classe
public class Contagem {public void adiciona(String palavra);public int getFrequencia(String palavra);public String[] getMaisFrequentes(int quantidade);
}
32/69
![Page 33: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/33.jpg)
Criando novas classes
• Vamos criar uma implementação simples que armazena aspalavras e as frequências em um ArrayList
• Vamos escrever os testes antes da implementação!
33/69
![Page 34: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/34.jpg)
Criando novas classes
34/69
![Page 35: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/35.jpg)
Criando novas classes
35/69
![Page 36: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/36.jpg)
Criando novas classes
@Testpublic void testAdicionaFreq() {
Contagem contagem = new Contagem();assertEquals(0, contagem.getFrequencia("casa"));assertEquals(0, contagem.getFrequencia("carro"));
contagem.adiciona("casa");assertEquals(1, contagem.getFrequencia("casa"));assertEquals(0, contagem.getFrequencia("carro"));
contagem.adiciona("casa");assertEquals(2, contagem.getFrequencia("casa"));assertEquals(0, contagem.getFrequencia("carro"));
contagem.adiciona("carro");assertEquals(2, contagem.getFrequencia("casa"));assertEquals(1, contagem.getFrequencia("carro"));
}
36/69
![Page 37: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/37.jpg)
Criando novas classes
import java.util.ArrayList;
public class Contagem {private final ArrayList<PalavraFreq> tabela;
// Construtor, método chamado pelo operador new// para inicializar o objetopublic Contagem() {
tabela = new ArrayList();}
}
class PalavraFreq {String palavra;int freq;
} 37/69
![Page 38: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/38.jpg)
Criando novas classes
public class Contagem {public void adiciona(String palavra) {
PalavraFreq entrada = null;for (PalavraFreq pf : tabela) {
if (pf.palavra.equals(palavra)) {entrada = pf;break;
}}if (entrada != null) {
entrada.freq++;} else {
tabela.add(new PalavraFreq(palavra));}
}} 38/69
![Page 39: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/39.jpg)
Criando novas classes
public class Contagem {public int getFrequencia(String palavra) {
PalavraFreq entrada = null;for (PalavraFreq pf : tabela) {
if (pf.palavra.equals(palavra)) {entrada = pf;break;
}}if (entrada != null) {
return entrada.freq;} else {
return 0;}
}} 39/69
![Page 40: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/40.jpg)
Criando novas classes
• Os testes funcionam, hora de refatorar!
• Vamos extrair o código comum entre adiciona egetFrequencia
40/69
![Page 41: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/41.jpg)
Criando novas classes
public class Contagem {public void adiciona(String palavra) {
PalavraFreq entrada = getEntrada(palavra);if (entrada != null) {
entrada.freq++;} else {
tabela.add(new PalavraFreq(palavra));}
}public int getFrequencia(String palavra) {
PalavraFreq entrada = getEntrada(palavra);if (entrada == null) {
return 0;} else {
return entrada.freq;}
}private PalavraFreq getEntrada(String palavra) {
for (PalavraFreq entrada : tabela) {if (entrada.palavra.equals(palavra)) {
return entrada;}
}return null;
}}
41/69
![Page 42: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/42.jpg)
Criando novas classes
@Testpublic void testGetMaisFrequentes() {
Contagem contagem = new Contagem();contagem.adiciona("casa");contagem.adiciona("carro");contagem.adiciona("banana");contagem.adiciona("casa");contagem.adiciona("casa");contagem.adiciona("banana");assertArrayEquals(
new String[]{"casa"},contagem.getMaisFrequentes(1));
assertArrayEquals(new String[]{"casa", "banana"},contagem.getMaisFrequentes(2));
assertArrayEquals(new String[]{"casa", "banana", "carro"},contagem.getMaisFrequentes(3));
// E se quantidade > número de elementos ?}
42/69
![Page 43: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/43.jpg)
Criando novas classes
public class Contagem {public String[] getMaisFrequentes(int quantidade) {
tabela.sort((a, b) -> Integer.compare(b.freq, a.freq));String[] mais = new String[quantidade];for (int i = 0; i < quantidade; i++) {
mais[i] = tabela.get(i).palavra;}return mais;
}}
43/69
![Page 44: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/44.jpg)
Criando novas classes
• A classe Contagem está pronta, vamos escrever a classeprincipal
44/69
![Page 45: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/45.jpg)
Criando novas classes
import java.io.FileNotFoundException;import java.io.FileReader;import java.util.Scanner;
public class Main {public static void main(String[] args) throws FileNotFoundException {
String arquivo = args[0];int quantidade = Integer.parseInt(args[1]);Scanner scanner = new Scanner(new FileReader(arquivo));// use qualquer sequência de caracteres que não// sejam letras como delimitadorscanner.useDelimiter("[^\\p{IsLetter}]+");Contagem contagem = new Contagem();while (scanner.hasNext()) {
contagem.adiciona(scanner.next());}for (String palavra : contagem.getMaisFrequentes(quantidade)) {
System.out.println(palavra + " " + contagem.getFrequencia(palavra));}
}} 45/69
![Page 46: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/46.jpg)
Criando novas classes
• Executando o programa na linha de comando
$ ant jar # ou Crtl+F11 no Netbeans$ time java -cp dist/ContaPalavras.jar moby-dick.txt 5the 13885of 6648and 6095a 4631to 4617
real 0m5,712suser 0m6,441ssys 0m0,089s
46/69
![Page 47: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/47.jpg)
Criando novas classes
• Parece muito lento para um arquivo com 215136 palavras…
• O problema é que a implementação de Cotagem.adiciona élinear no número de palavras distintas
• No pior caso, uma sequência de adições de palavras équadrático
• Vamos criar uma implementação alternativa
• Queremos que o código funcione com as duas implementações,desta forma poderemos avaliar qual é mais eficiente
47/69
![Page 48: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/48.jpg)
Interfaces
48/69
![Page 49: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/49.jpg)
Interfaces
• Uma classe define uma coleção de métodos
• A coleção de métodos de uma classe é a interface que é usadapara se comunicar com objetos do tipo da classe
• Em Java é possível separar a interface da implementação,desta forma, várias classes podem implementar a mesmainterface
49/69
![Page 50: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/50.jpg)
Interfaces
• Java define muitas interfaces na biblioteca padrão que sãoimplementadas por diferentes classe, por exemplo
• Collection é uma interface que representa qualquer coleçãode valores
• Define métodos para adicionar e remover valores da coleção,criar arranjos com os itens da coleção, etc
• Muitas classes implementam a interface Collection
• ArrayList, LinkedList, TreeSet, HashSet, etc
50/69
![Page 51: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/51.jpg)
Interfaces
• A uma variável definida com um tipo que é uma interfacepode ser atribuída instâncias de qualquer classe queimplemente aquela interfaceCollection<Integer> c = null;
if (...) { c = new ArrayList<>(); } else { c = new TreeSet<>(); }
c.add(20);...
• Todos os métodos de c são vinculado dinamicamente, pois otipo concreto de c é determinado em tempo de execução
• Esta vinculação dinâmica de método é chamada depolimorfismo e é outro pilar da POO
51/69
![Page 52: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/52.jpg)
Interfaces
import java.util.ArrayList;import java.util.Collection;import java.util.TreeSet;
public class X {public static void main(String[] args) {
// instâncias de qualquer classe que// implemente a interface Collection// pode ser passada como parâmetro// para o método corescores(new ArrayList<>());cores(new TreeSet<>());
}
static void cores(Collection<String> c) {c.add("amarelo");c.add("verde");c.add("azul");System.out.println("= "
+ c.getClass().getCanonicalName()+ " =");
System.out.println("Total de cores: " + c.size());for (String cor : c) {
System.out.println(cor);}
}}
Resultado da execução:= java.util.ArrayList =Total de cores: 3amareloverdeazul= java.util.TreeSet =Total de cores: 3amareloazulverde
52/69
![Page 53: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/53.jpg)
Interfaces
• Vamos definir uma interface para Contagem
public interface Contagem {void adiciona(String palavra);int getFrequencia(String palavra);String[] getMaisFrequentes(int quantidade);
}
53/69
![Page 54: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/54.jpg)
Interfaces
• Vamos renomear a nossa antiga classe Contagem paraContagemArrayList e implementar a nova interfaceContagem
public class ContagemArrayList implements Contagem {...
}
54/69
![Page 55: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/55.jpg)
Interfaces
• Vamos criar uma nova implementação de Contagem usandoum HashMap
public class ContagemHashMap implements Contagem {private final HashMap<String, Integer> frequencia;
...}
55/69
![Page 56: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/56.jpg)
Interfaces
• Como ContagemArrayList e ContagemHashMapimplementam a interface Contagem, elas podem ser usadasem qualquer código que dependa de uma Contagem
56/69
![Page 57: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/57.jpg)
Interfaces
• Modificamos o método main para instanciar a classe queimplementa Contagem de acordo como um argumento para oprograma (o restante do código do método main permaneceinalterado)String impl = args[0];...Contagem contagem = null;switch (impl) {
case "array":contagem = new ContagemArrayList();break;
case "map":contagem = new ContagemHashMap();break;
default:System.out.println("Argumento impl inválido: " + impl);System.exit(1);
} 57/69
![Page 58: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/58.jpg)
Interfaces
Agora podemos executar o programa com cada uma das duasimplementações de Contagem e verificar qual é mais eficiente
$ time java -cp dist/ContaPalavras.jar\array moby-dick.txt 5
the 13885of 6648and 6095a 4631to 4617
real 0m5,712suser 0m6,441ssys 0m0,089s
$ time java -cp dist/ContaPalavras.jar\map moby-dick.txt 5
the 13885of 6648and 6095a 4631to 4617
real 0m0,690suser 0m1,459ssys 0m0,089s
58/69
![Page 59: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/59.jpg)
Herança
59/69
![Page 60: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/60.jpg)
Herança
• Como a classe ContagemHashMap é testada?
• Da mesma forma que a classe ContagemArrayList
60/69
![Page 61: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/61.jpg)
Herança
• Antes nós “extraímos” a interface de contagem para permitirmais de uma implementação
• Agora nós temos uma implementação de teste e queremosespecializar para duas situações
• Testar a classe ContagemArrayList
• Testar a classe ContagemHashMap
• A especialização através de herança é o terceiro pilar da POO
61/69
![Page 62: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/62.jpg)
Herança
• Considere a classe ContagemTest (versão quando a classeContagemArrayList chamava apenas Contagem)public class ContagemTest {
@Testpublic void testAdicionaFreq() {
Contagem contagem = new Contagem();...
}
@Testpublic void testGetMaisFrequentes() {
Contagem contagem = new Contagem();...
}}
• Enquanto o corpo dos métodos de teste não dependem daclasse que está sendo testada, a instanciação de contagemdepende. Precisamos “especializar” a instanciação para cadauma das classe que queremos testar.
62/69
![Page 63: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/63.jpg)
Herança
• Vamos criar um método abstrato (sem corpo) para instanciara classe contagem que será testada
• Uma classe com pelo menos um método abstrato éconsiderada abstrata
• Uma classe abstrata não pode ser instanciada
• Este método será especializado para cada caso usando herança
63/69
![Page 64: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/64.jpg)
Herança
public abstract class ContagemTest {abstract Contagem criaContagem();
@Testpublic void testAdicionaFreq() {
Contagem contagem = criaContagem();...
}
@Testpublic void testGetMaisFrequentes() {
Contagem contagem = criaContagem;...
}}
64/69
![Page 65: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/65.jpg)
Herança
• Para especializar o método criaContagem criamos umasubclasse
• A classe que está sendo especializada é chamada desuperclasse ou classe mãe
• Uma subclasse é como a classe que ela especializa, mas podedefinir novos campos e métodos e sobrescrever métodosexistentes
• Todos os métodos e campos existentes na superclasse tambémestão presentes na subclasse
65/69
![Page 66: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/66.jpg)
Herança
public class ContagemArrayListTest extends ContagemTest {@OverrideContagem criaContagem() {
return new ContagemArrayList();}
}
ContagemArrayListTest é como a classe ContagemTest, mas eladefine uma implementação específica para criaContagem. Quando otestador for executar os testes de ContagemArrayListTest ele vaiexecutar o corpo dos métodos testAdicionaFreq etestGetMaisFrequentes definidos em ContagemTest mas o corpo decriaContagem definido em ContagemArrayListTest.
66/69
![Page 67: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/67.jpg)
Herança
public class ContagemHashMapTest extends ContagemTest {@OverrideContagem createContagem() {
return new ContagemHashMap();}
}
ContagemHashMapTest é como a classe ContagemTest, mas ela defineuma implementação específica para criaContagem. Quando o testadorfor executar os testes de ContagemHashMapTest ele vai executar o corpodos métodos testAdicionaFreq e testGetMaisFrequentes definidosem ContagemTest mas o corpo de criaContagem definido emContagemHashMaptTest.
67/69
![Page 68: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/68.jpg)
Referências
68/69
![Page 69: Marco A L Barbosa malbarbo.pro · Programação orientada a objetos em Java Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá Este trabalho](https://reader036.vdocuments.pub/reader036/viewer/2022070111/605110b417eca27663551767/html5/thumbnails/69.jpg)
Referências
• Object-Oriented Programming Concepts
• Classes and Objects
• Interfaces and Inheritance
69/69