Prévia do material em texto
7ºAula Interfaces e pacotes Objetivos de aprendizagem Ao término desta aula, vocês serão capazes de: conhecer o que são as Interfaces; entender os benefícios de uso das interfaces; saber como funcionam os pacotes. Prezados(as) alunos(as), tudo bem? Bem-vindos à nossa sétima aula sobre interfaces e pacotes. Nesta aula, vamos aprender como funcionam dois aspectos que são muito conhecidos na linguagem Java: As Interfaces e os Pacotes. Qualquer dúvida entre em contato via quadro de avisos. E lembre-se de fazer as atividades dessa aula. Estaremos sempre a sua disposição. Boa aula! Bons estudos! Bons estudos! 127 Programação Orientada a Objetos 70 1 - Usando as interfaces 2 - Pacotes em Java 3 - Exercícios resolvidos e propostos 1 - Usando as Interfaces Na última aula, mostramos como fazer um herança das classes na linguagem Java. A herança nos dá muitas possibilidades, mas tem um limitador muito importante: Uma classe só pode herdar de apenas uma classe-pai. Assim, a herança múltipla, que pode causar muitos problemas, é proibida. Mas existem situações em que precisamos de nir algum comportamento comum a algumas classes, mas sem a necessidade de herdar de alguma classe. Por exemplo, podemos criar um comportamento comum de algumas Seções de estudo classes para gerar um certo relatório em CSV. Isso funcionaria da seguinte forma: Teríamos um método chamado toCSV, que gera uma linha CSV com os dados do objeto. Uma classe abstrata chamada CSVGenerator com esse método abstrato seria uma boa ideia. Mas, temos um problema: todas as classes que herdam de CSVGenerator não herdariam de mais alguém. Assim, trocaríamos a possibilidade de uma classe herdar de outra classe mais completa para herdar de uma classe com apenas um método abstrato. Para contornar isso, a linguagem Java criou as interfaces. As interfaces são como classes abstratas, mas em que podemos declarar apenas métodos abstratos. As interfaces são como contratos, onde de nem uma série de métodos em que as classes devem implementar se querem “herdar” (o correto seria implementar) essa interface. Assim, vamos criar um projeto para exempli car como funcionam as interfaces. Crie um projeto no Netbeans. Vamos dar o nome de Aula07_Secao01 a este projeto e ao arquivo principal. Depois, clique com o botão direito do mouse em cima do nome do projeto criado no painel “Projects”. Depois clique em “New >”, e em “Interface”, como mostra essa imagem: 128 71 Depois, vamos dar um nome para esta interface. Dê o nome de CSVGenerator, e clique em Finish: A interface será criada e aberta na janela do programa. Ela terá a seguinte estrutura: /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package aula07_secao01; /** * * @author unigran */ public interface CSVGenerator { } Dentro das chaves, declaramos os métodos que devem ser implementados para essa interface. Em nosso caso, vamos escrever apenas um método, chamado de toCSV, que retorna uma String: public String toCSV(); Agora, crie uma classe chamada Pessoa. Crie três atributos privados: nome, endereço e telefone, seguidos por seus métodos getters e setters. Depois de criar a classe, procure a linha de declaração da classe: Public class Pessoa{ Antes do colchete, digite o texto extendsCSVGenerator. Assim, a declaração da classe ca da seguinte maneira: public class Pessoa implements CSVGenerator{ Agora que a classe Pessoa se comprometeu a implementar a interface CSVGenerator, devemos implementar o método toCSV. Segue abaixo o código da implementação desse método: @Override public String toCSV() { return this.nome+”;”+this.endereco+”;”+this. telefone; } Com isso, a classe Pessoa tem a seguinte estrutura nal: public class Pessoa implements CSVGenerator{ private String nome; private String endereco; private String telefone; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getEndereco() { 129 Programação Orientada a Objetos 72 return endereco; } public void setEndereco(String endereco) { this.endereco = endereco; } public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; } } Agora, vamos para a classe Aula07_Secao01. No método main, digite os seguintes comandos: Pessoa p = new Pessoa(); p.setNome(“Antonio”); p.setEndereco(“Rua B 657”); p.setTelefone(“44-3333”); //Criamos uma variável de referência csv //Ele recebe a instância de Pessoa //Isto é válido. CSVGenerator csv = p; System.out.println(csv.toCSV()); O que nós estamos fazendo é simples. Criamos uma nova instância da classe Pessoa e populamos os seus dados. Depois, criamos uma variável de referência para a interface CSVGenerator, que aceita qualquer instância de uma classe que o implementa. Assim, ele aceita a referência para a instância da classe p. Da mesma forma que acontece com variáveis de referência para classes pai, essa variável só vai conseguir acessar os métodos de nidos na interface, que no caso é a toCSV. Chamamos esse método e exibimos esse resultado na tela. Assim, compile o programa e execute. Veri que o resultado: As interfaces nos proporcionam mais exibilidade. Podemos criar métodos cujos argumentos são instâncias que implementam uma determinada interface. E só chamamos os métodos que precisamos, desde que estejam declarados nessa interface. Não nos preocuparemos em saber como o programador da classe X implementou ele, ou em quais atributos esse objeto possui. Desde que siga os conformes de nidos na interface, está ok. A seguir, vamos explicar como funcionam os pacotes na linguagem Java. 2 - Pacotes em Java Os pacotes são a forma que a linguagem Java tem para organizar as suas bibliotecas no sistema. Para mostrarmos como funciona, vamos criar um novo projeto no Netbeans. Siga as mesmas instruções, dando o nome do projeto de Aula07_Secao02. Observe que o Netbeans criou uma classe com um método main, do mesmo nome do projeto criado. Se você observar no painel “Projects”, localizado no canto superior esquerdo da janela, observará que essa classe está abaixo de uma caixinha, nomeado com o mesmo nome do projeto. Essa caixinha é um pacote. Seu nome indica o local onde devemos localizar a classe relacionada. Além disso, observe nas primeiras linhas do arquivo Aula07_Secao02.java: package aula07_secao02; Ele está de nindo que a classe Aula07_Secao02 pertence ao pacote Aula07_Secao02. Vamos criar uma classe simples, denominada de Pessoa. Clique em “File” > “New File”, clique em “Next >”, e na tela seguinte, dê o nome de Pessoa. Desta vez, observe o quarto campo da janela. Ela de ne em qual pacote queremos inserir a classe. Deixe como está (“aula07_secao02”), para indicarmos que queremos deixar no mesmo pacote. Clique em Finish para criar a classe. 130 73 Perceba que o painel Projects ganhou mais um item, subordinado ao pacote aula07_secao02. É a nova classe que foi adicionada ao nosso programa. Vamos adicionar alguns atributos a esta classe. Além dos seus métodos getters e setters. Observe como cou a classe: Agora, vamos criar um novo pacote. Clique com o botão esquerdo sobre o nome do projeto, no painel Projects. Clique em “New >” > “Package”. 131 Programação Orientada a Objetos 74 Na janela que aparecer, observe o campo “PackageName”. É nele que vamos inserir o nome do pacote a ser criado. Um pacote pode ser dividido em vários subpacotes por pontos. A convenção diz que devemos escrever o pacote da seguinte forma: A primeira e a segunda parte devem ser os identi cadores do autor deste pacote. Uma ideia é usar uma url invertida. Por exemplo, se o autor for a Unigran, que tem o site unigran.br, podemos iniciar o nomedo pacote da seguinte forma: br.unigran. A partir desse ponto, podemos de nir os subpacotes da maneira que quisermos. Para o pacote que vamos criar, vamos colocar o nome de br.unigran.entidades, indicando que esse pacote armazena as entidades do sistema. Dê o nome a esse pacote como especi camos e clique em Finish, como mostra a imagem: Agora, vamos transferir a classe Pessoa para esse novo pacote. Clique no arquivo Pessoa.java, segure nele e arraste em direção ao pacote br.unigran.entidades. Uma janela de con rmação vai aparecer. Clique em Refactor. A classe foi movida de pacote. Perceba que o Netbeans alterou o nome do pacote, presente no cabeçalho de Pessoa.java: Agora, vamos ver como usar essa nova classe. Não adianta criar no método main uma variável de referência para a classe Pessoa. Isso é porque a classe Pessoa, por si só, não é mais encontrada pela classe principal. O cenário que criamos é correspondente ao diagrama de pacotes, mostrado a seguir: 132 75 Para usarmos a classe Pessoa, devemos indicar onde está ela. Para fazer isso, devemos fazer um import da classe Pessoa. Esse import consiste em declarar o pacote a qual essa classe faz parte, seguido pelo nome da classe. Portanto, vá ao arquivo Aula07_Secao02.java. Procure a linha escrita “package aula07_secao02”. Imediatamente após essa linha, escreva o seguinte em uma nova linha: import br.unigran.entidades.Pessoa; A partir desse ponto, podemos usar a classe Pessoa normalmente. Sinta-se livre em modi car o método main, para manipular os atributos da pessoa. Mas, como os pacotes são organizados? Simples. Eles são organizados em pastas, sendo que cada palavra é uma pasta. Quando escrevemos a instrução: import br.unigran.entidades.Pessoa; Na verdade estamos pedindo para a linguagem Java encontrar a classe Pessoa, contida na pasta br, subpasta unigran, e depois na subpasta entidades. Para comprovar isso, vá ao painel do canto superior esquerdo, e clique na aba “Files”. Neste ponto, você está vendo a organização do projeto, da mesma forma que está salvo no disco rígido. Expanda a pasta do projeto. Depois, expanda a pasta src, onde o Netbeans salva os arquivos de código. Em seguida, expanda as subpastas. Perceba que as subpastas correspondem aos nomes dos pacotes que nós damos. A título de e plicação, você verá outras duas pastas, além de src. A pasta nbproject é uma pasta gerenciada pelo Netbeans, local este onde ele salva os metadadosdo projeto. Já a pasta build é onde o Netbeans salva os arquivos .class, que são os arquivos compilados para a linguagem de bytecode. Assim, podemos de nir os pacotes como a maneira da linguagem Java organizar os seus arquivos de código, sendo que cada pacote na verdade é uma pasta no disco rígido. A forma de declaração foi criada para facilitar a busca dos arquivos de código. A seguir, vamos para os exercícios resolvidos. 3 - E ercícios resolvidos e propostos Exercício - 1 Escreva uma interface denominada ObjetoGeometrico. Essa interface deve ter os métodos área, para calcular a área do objeto e perímetro, para calcular o perímetro do objeto. Em seguida, declare uma classe do tipo Retângulo que implemente essa interface. Primeiro criamos a interface ObjetoGeometrico. Essa interface só vai conter dois métodos, um para calcular a área e outro para calcular o perímetro. A seguir, vamos mostrar como escrevemos essa interface. public interface ObjetoGeometrico { public double area(); public double perimetro(); } Em seguida, criamos a classe Retangulo. Ele vai conter dois atributos. Um para armazenar o seu lado maior e outro para armazenar o seu lado menor. Além disso, implementamos os métodos da interface ObjetoGeometrico. Observe: public class Retangulo implements ObjetoGeometrico{ private double ladoMaior; private double ladoMenor; @Override public double area() { return this.ladoMaior * this.ladoMenor; 133 Programação Orientada a Objetos 76 } @Override public double perimetro() { return this.ladoMaior * 2 + this.ladoMenor * 2; } public double getLadoMaior() { return ladoMaior; } public void setLadoMaior(double ladoMaior) { this.ladoMaior = ladoMaior; } public double getLadoMenor() { return ladoMenor; } public void setLadoMenor(double ladoMenor) { this.ladoMenor = ladoMenor; } } Vamos para outro exemplo: Exercício - 2 Ainda com o código do E ercício 1, crie uma classe chamada Quadrado, que implemente a interface ObjetoGeometrico. Essa classe deve car no pacote denominado entidades. Para isso, vamos criar uma classe. No menu, clique em “New”, depois em “File”. Depois clique em “Next”. Em seguida, na janela que aparecer, indique um nome em “ClassName”. Em “Package”, apague o texto (se houver) e digite: entidades. Isso vai fazer que a classe seja criada no pacote entidades. Para terminar clique em Finish. 134 77 Depois disso, adicione o atributo lado, os métodos acessores e as implementações da interface ObjetoGeometrico. Veja como cou: package entidades; import aula07_exercicio01.ObjetoGeometrico; /** * * @author unigran */ public class Quadrado implements ObjetoGeometrico{ private double lado; public double getLado() { return lado; } public void setLado(double lado) { this.lado = lado; } @Override public double area() { return this.lado * this.lado; } @Override public double perimetro() { return this.lado*4; } } Vamos para os exercícios propostos: Exercício - 3 Com base no e emplo da seção 1, crie uma classe chamada GeradorDeRelatorios, com um método gerarCSV, que recebe um array de instâncias que implementam a classe CSVGenerator. Ele deve gerar um relatório CSV de todas as instâncias presentes nesse array. Exercício - 4 Com base no e ercício 1, crie as classes Círculo e Triângulo, que implementam a interface ObjetoGeometrico. Exercício - 5 Reorganize as interfaces e as classes do e ercício 4, com e ceção da classe principal, da seguinte forma: br.unigrannet.interfaces: Nesse pacote cam todas as interfaces. br.unigrannet.classes: Nesse pacote cam todas as classes. Na próxima aula, veremos o que são Design Patterns. Até logo! Retomando a aula Chegamos ao nal da nossa sétima aula. Espera-se que agora tenha mais claro o entendimento de vocês sobre Interface e pacotes. Vamos, então, relembrar? 1 - Usando as Interfaces Nessa seção, vimos como funcionam as interfaces, que são similares às classes abstratas, mas com a diferença de declarar apenas métodos abstratos e de que uma classe pode implementar quantas interfaces desejar. As interfaces nos proporcionam mais exibilidade. Uma possibilidade é a criação de métodos cujos argumentos são instâncias que implementam uma determinada interface. E só chamamos os métodos que precisamos, desde que esteja declarados nessa interface. 2 - Pacotes em Java Na segunda seção, estudamos o que são os pacotes, podemos de ni-los como a maneira da linguagem Java organizar os seus arquivos de código, sendo que cada pacote na verdade é uma pasta no disco rígido. Vimos também como usar as classes que estão fora do pacote, usando a palavra- chave import. 3 - Exercícios Resolvidos e Propostos Na terceira e última seção, apresentamos alguns exercícios resolvidos, acompanhados do seu código. Além disso, sugerimos alguns exercícios propostos, para a xação do conteúdo. CORNELL, Gary; HORSTMANN, Cay S.; FURMANKIEWICZ, Edson.et al. Core Java, volume I : fundamentos. 8. ed. São Paulo: Pearson Prentice Hall, 2010. CORNELL, Gary; HORSTMANN, Cay S.; TORTELLO, José Eduardo N. et al. CoreJava 2: fundamentos. São Paulo: Makron Books do Brasil, 2001. DEITEL, H.M. Java: como programar. 8. ed. São Paulo: Pearson Prentice Hall, 2012. SCHILDT, Herbert. Java Para Iniciantes - Crie, Compile e Execute Programas Java Rapidamente. 6. ed. Porto Alegre: Bookman,2015. Vale a pena ler Vale a pena 135 Programação Orientada a Objetos 78 GOMES, Robson Fernando. Entendendo interfaces em Java. DevMedia, 2012. Disponível em: <https://www. devmedia.com.br/entendendo-os-conceitos-dos-padroes- de-projetos-em-java/29083>. Acesso em: 19 out. 2018. Vale a pena acessar Minhas anotações 136