Prévia do material em texto
<p>PROGRAMAÇÃO ORIENTADA A OBJETOS (POO) - parte 2</p><p>Construtor</p><p>Construtores são métodos especiais destinados à inicialização e ao preparo de novos</p><p>objetos durante sua instanciação. (Alguns autores dizem que construtores não podem ser</p><p>considerados métodos, já que não são usados como os demais e, por isso, outros autores</p><p>dizem que os construtores são métodos especiais).</p><p>Os construtores somente podem rodar durante a construção de uma classe, isto é, nunca</p><p>serão chamados para um objeto já construído.</p><p>Quando criamos uma classe com todos os atributos privados, seus getters e setters e um</p><p>construtor vazio (padrão), estamos criando um Java Bean.</p><p>Assim como os métodos comuns, os construtores podem receber parâmetros, o que permite</p><p>caracterizar um objeto já na sua criação. Entretanto, os construtores só podem ser acionados</p><p>por meio do operador new, responsável pela criação de novos objetos. Obrigatoriamente,</p><p>os construtores devem ter o mesmo nome que suas classes, e não possuem tipo de</p><p>retorno, pois o resultado de sua chamada é sempre uma nova instância (isto é, um novo</p><p>objeto de sua classe.</p><p>Usos comuns:</p><p>• Iniciar valores dos atributos;</p><p>• Permitir ou obrigar que o objeto receba dados no momento de sua instanciação.</p><p>É possível especificar mais de um construtor na mesma classe e isso é chamado de</p><p>sobrecarga, sobreposição ou overloading.</p><p>Se um construtor customizado não for especificado, a classe disponibiliza o construtor</p><p>padrão:</p><p>O construtor padrão para a classe Pessoa é assim construído:</p><p>public class Pessoa {</p><p>public String nome = new String();</p><p>public int idade;</p><p>public Pessoa() {</p><p>}</p><p>Vamos retornar ao exemplo que já trabalhamos com a classe Produto e vamos melhorar a</p><p>sua construção.</p><p>Produto</p><p>nome preço qtd</p><p>Quando instanciamos o objeto produto com o construtor padrão, teremos campos vazios,</p><p>com os valores padrão do tipo de dado, como mostrado acima:</p><p>Produto produto = new Produto();</p><p>Para obrigar que os dados sejam informados, podemos alterar o programa que já criamos</p><p>antes, incluindo então um construtor para a classe Produto.</p><p>Classe Produto Original Classe modificada, incluindo o construtor</p><p>package entidades;</p><p>public class Produto {</p><p>public String nome;</p><p>public double preco;</p><p>public int qtd;</p><p>public double valorEstoque() {</p><p>double estoque = preco*qtd;</p><p>return estoque;</p><p>}</p><p>public void acrescentarProdutos(int qtd) {</p><p>this.qtd += qtd;</p><p>}</p><p>public void retirarProdutos(int qtd) {</p><p>if (qtd</p><p>}</p><p>}</p><p>Sobrecarga</p><p>É um recurso que uma classe possui de oferecer mais de uma operação ou método com</p><p>o mesmo nome, porém com diferentes assinaturas (nome do método + lista de</p><p>parâmetros).</p><p>A assinatura é composta pelo nome do método mais a lista de parâmetros.</p><p>A sobrecarga de métodos é uma interessante e útil característica da orientação a objetos</p><p>pois permite a existência de dois ou mais métodos com o mesmo nome (polimorfismo),</p><p>desde que suas assinaturas sejam diferentes.</p><p>Usando sobrecarga, podemos também ter mais de um construtor na mesma classe,</p><p>sendo que cada um pode ter uma quantidade diferente de parâmetros, possibilitando assim</p><p>que novas instâncias de uma classe sejam obtidas de maneiras diferentes.</p><p>Abaixo são mostrados três construtores para Produto:</p><p>- o primeiro é o construtor padrão, sem parâmetros</p><p>- o segundo é um construtor com 2 parâmetros (caso só se queira cadastrar o produto e</p><p>não tenha quantidade para informar)</p><p>- e o terceiro é o construtor completo, como todos os três parâmetros.</p><p>public Produto() { // padrão, sem parâmetros</p><p>}</p><p>public Produto(String nome, double preco) { // com 2 parâmetros</p><p>this.nome = nome;</p><p>this.preco = preco;</p><p>qtd = 0;</p><p>// qtd pode referenciar assim, já que não tem o parâmetro do método</p><p>}</p><p>public Produto(String nome, double preco, int qtd) { // com 3 parâmetros</p><p>this.nome = nome;</p><p>this.preco = preco;</p><p>this.qtd = qtd;</p><p>}</p><p>Quando um método sobrecarregado é chamado, o Java usa o tipo e/ou o número de</p><p>argumentos como guia para determinar qual versão do método deve ser chamada. Então,</p><p>os métodos sobrecarregados devem diferir no tipo e/ou no número de parâmetros.</p><p>O programa ficará assim:</p><p>Classe Produto:</p><p>package entidades;</p><p>public class Produto {</p><p>public String nome;</p><p>public double preco;</p><p>public int qtd;</p><p>public Produto() {</p><p>}</p><p>public Produto(String nome, double preco) {</p><p>this.nome = nome;</p><p>this.preco = preco;</p><p>}</p><p>public Produto(String nome, double preco, int qtd) {</p><p>this.nome = nome;</p><p>this.preco = preco;</p><p>this.qtd = qtd;</p><p>}</p><p>public double valorEstoque() {</p><p>double estoque = preco*qtd;</p><p>return estoque;</p><p>}</p><p>public void acrescentarProdutos(int qtd) {</p><p>this.qtd += qtd;</p><p>}</p><p>public void retirarProdutos(int qtd) {</p><p>if (qtd</p><p>atributo, deve-se usar this</p><p>5 – deve ser feita uma atribuição, com o atributo recebendo o valor do parâmetro</p><p>No exemplo, temos os métodos get e set para o atributo nome:</p><p>private String nome;</p><p>public String getNome() {</p><p>return nome;</p><p>}</p><p>public void setNome(String nome){</p><p>this.nome = nome;</p><p>}</p><p>Vamos agora modificar o programa que estamos construindo, de maneira a aplicar as</p><p>técnicas de encapsulamento já discutidas.</p><p>Começamos modificando os atributos nome, preco e quantidade, deixando de ser públicos</p><p>(public) e se tornando privados (private):</p><p>private String nome;</p><p>private double preco;</p><p>private int qtd;</p><p>Lembrar que assim não será mais possível acessar esses atributos em outras classes.</p><p>Dessa forma vamos precisar construir métodos para acessar os atributos, geralmente esses</p><p>métodos ficam localizados logo após os construtores.</p><p>Vamos construir os métodos get e set para os atributos que vamos permitir que sejam</p><p>consultados e alterados pelo main da forma que já foi construído para nome. Vamos permitir</p><p>que o nome e o preço sejam alterados, mas não a quantidade (que será feita somente</p><p>através do método já construído). Teremos então:</p><p>// métodos get e set para nome</p><p>public String getNome() {</p><p>return nome;</p><p>}</p><p>public void setNome(String nome) {</p><p>this.nome = nome;</p><p>}</p><p>// métodos get e set para preco</p><p>public double getPreco() {</p><p>return preco;</p><p>}</p><p>public void setPreco(double preco) {</p><p>this.preco = preco;</p><p>}</p><p>// método get para qtd</p><p>public int getQtd() {</p><p>return qtd;</p><p>}</p><p>Agora, para modificar o nome do produto em main precisamos usar setNome</p><p>produto.setNome("Bicicleta Caloi");</p><p>Para mostrar o nome do produto modificado, podemos usar getNome:</p><p>System.out.println("Nome modificado = "+ produto.getNome());</p><p>Para modificar o preço, podemos fazer da mesma forma:</p><p>// modificando o preço</p><p>produto.setPreco(5000.00);</p><p>//mostrando o preço modificado</p><p>System.out.println("Preço modificado = "+produto.getPreco());</p><p>A classe Produto ficará assim, então:</p><p>package entidades;</p><p>public class Produto {</p><p>private String nome;</p><p>private double preco;</p><p>private int qtd;</p><p>public Produto() {</p><p>}</p><p>public Produto(String nome, double preco) {</p><p>this.nome = nome;</p><p>this.preco = preco;</p><p>}</p><p>public Produto(String nome, double preco, int qtd) {</p><p>this.nome = nome;</p><p>this.preco = preco;</p><p>this.qtd = qtd;</p><p>}</p><p>// métodos get e set para nome</p><p>public String getNome() {</p><p>return nome;</p><p>}</p><p>public void setNome(String nome) {</p><p>this.nome = nome;</p><p>}</p><p>// métodos get e set para preco</p><p>public double getPreco() {</p><p>return preco;</p><p>}</p><p>public void setPreco(double preco) {</p><p>this.preco = preco;</p><p>}</p><p>// método get para qtd</p><p>public int getQtd() {</p><p>return qtd;</p><p>}</p><p>public double valorEstoque() {</p><p>double estoque = preco*qtd;</p><p>return estoque;</p><p>}</p><p>public void acrescentarProdutos(int qtd) {</p><p>this.qtd += qtd;</p><p>}</p><p>public void retirarProdutos(int qtd) {</p><p>if (qtd</p><p>zerarCont() {</p><p>cont=0;</p><p>}</p><p>public void incrementarCont() {</p><p>cont++;</p><p>}</p><p>public static int getCont() {</p><p>return cont;</p><p>}</p><p>}</p><p>package aplica;</p><p>import entidades.Contador;</p><p>import entidades.Contador;</p><p>public class TestarContador {</p><p>public static void main(String[] args) {</p><p>Contador c1 = new Contador();</p><p>System.out.println(c1.getCont());</p><p>Contador c2 = new Contador();</p><p>System.out.println(c2.getCont());</p><p>Contador c3 = new Contador();</p><p>System.out.println(c3.getCont());</p><p>System.out.println(Contador.getCont());</p><p>}</p><p>}</p><p>Geração automática de Construtores, Setters e Getters</p><p>Além de construirmos os métodos construtores e os métodos get e set manualmente,</p><p>podemos também utilizar o Eclipse para fazer sua geração de modo automático.</p><p>Partindo apenas dos atributos que já criamos (e apagando os métodos que já foram</p><p>construídos), podemos fazer o seguinte processo para gerar o Construtor:</p><p>Source → Generate Constructor using Fields</p><p>Será gerado um Construtor a partir dos atributos que escolhermos. Podemos personalizar</p><p>o construtor e fazer a sobrecarga de mais de um construtor a partir desse primeiro.</p><p>Para os getters e setters escolhemos:</p><p>Source → Generate Getters and Setters</p><p>Da mesma forma, podemos escolher quais getters e setters queremos gerar a partir dos</p><p>atributos da classe.</p><p>Também podemos excluir o setQtd, para seguir a mesma ideia da construção original, em</p><p>que a quantidade somente pode ser modificada pela inclusão ou exclusão de produtos.</p><p>Modificadores de acesso</p><p>Os atributos poderão ter os seguintes modificadores de acesso que resumidamente podem</p><p>ser descritos como:</p><p>• private: o membro só pode ser acessado na própria classe</p><p>• (nada): o membro só pode ser acessado nas classes do mesmo pacote</p><p>• protected: o membro só pode ser acessado no mesmo pacote, bem como em subclasses</p><p>de pacotes diferentes</p><p>• public: o membro é acessado por todas classes (a menos que ele esteja em um módulo</p><p>diferente de onde ele está e não seja exportado)</p><p>O Eclipse utiliza símbolos diferentes para indicar cada um dos modificadores de acesso em</p><p>atributos e métodos, como pode ser observado na imagem com o Outline de uma classe:</p><p>Também pode-se observar essa simbologia como nos hints ao digitar o código:</p><p>Exercício comentado:</p><p>Você trabalha em uma empresa especialista em máquinas de fazer café e sua equipe é a</p><p>responsável por desenvolver uma classe para o novo modelo de cafeteiras que irão fabricar.</p><p>No novo modelo em construção, o usuário pode escolher a quantidade de pó que deve ser</p><p>utilizada para fazer seu café. Se o usuário não quiser fazer o café com a quantidade</p><p>personalizada, poderá utilizar a quantidade padrão que é de 10 gramas.</p><p>1. Para começar, crie a classe "MaquinaDeCafe" com um atributo chamado</p><p>quantidadePoDisponivel", que será útil para saber a quantidade de pó disponível na</p><p>máquina. Se o pó acabar não será possível fazer nenhum café.</p><p>public class MaquinaDeCafe {</p><p>private static int quantidadePoDisponivel = 0;</p><p>}</p><p>2. Precisaremos de um método fazerCafe que deve verificar se a quantidade de pó é</p><p>suficiente para fazer o café solicitado pelo usuário.</p><p>public void fazerCafe(int quantidadePo) {</p><p>if (quantidadePoDisponivel</p><p>ao objeto para que ele se comporte de uma</p><p>determinada maneira. Um programa orientado a objetos em execução consiste em</p><p>envios, interpretações e respostas às mensagens. São os métodos, os procedimentos</p><p>residentes nos objetos, que determinam como eles irão atuar ao receber as mensagens.</p><p>III. O encapsulamento é um mecanismo que permite o acesso aos dados de um objeto</p><p>somente através dos métodos desse. Nenhuma outra parte do programa pode operar</p><p>sobre os dados do objeto. A comunicação entre os objetos é feita apenas através de</p><p>troca de mensagens.</p><p>É correto apenas o que afirma em</p><p>a) I, II e III</p><p>b) I e II</p><p>c) II e III</p><p>d) I e III</p><p>e) Nenhuma das afirmações está correta</p><p>2. Orientação a objetos é um paradigma de análise, projeto e programação de sistemas de</p><p>software baseado na composição e interação entre diversas unidades de software</p><p>chamadas objetos. Marque a alternativa INCORRETA com relação a programação de</p><p>orientação a objetos.</p><p>a) Os pacotes são pastas as quais podemos guardar arquivos (classes).</p><p>b) Declarar um objeto é o mesmo que instanciar um objeto.</p><p>c) Cada objeto possui um endereço de memória.</p><p>d) O comportamento de um objeto é definido pelos métodos de sua classe.</p><p>e) Atributos estáticos são conhecidos como atributos de classes.</p><p>3. Analise as seguintes afirmações indicando se são verdadeiras ou falsas:</p><p>a) ( ) Um termo muito usado na POO é classe, que tem a função de definir os</p><p>atributos e os comportamentos expostos pelo objeto.</p><p>b) ( ) Quanto ao relacionamento entre os objetos, existe uma premissa básica que</p><p>diz que os objetos são dependentes uns dos outros, ou seja, um objeto só pode</p><p>existir se houver outro objeto relacionado a ele.</p><p>c) ( ) Um objeto é uma construção de software que encapsula o estado, e não o</p><p>comportamento.</p><p>4. Qual do conceito de programação orientada a objetos que permite a criação de métodos</p><p>com a mesma assinatura, porém com implementações diferentes?</p><p>a) Encapsulamento</p><p>b) Herança</p><p>c) Polimorfismo</p><p>d) Interface</p><p>5. Na programação orientada à objeto, como se denomina a capacidade de ocultar dados</p><p>dentro de modelos, permitindo que somente operações especializadas ou dedicadas</p><p>manipulem dados ocultos?</p><p>a) Modularização.</p><p>b) Implementação.</p><p>c) Modificação.</p><p>d) Classes.</p><p>e) Encapsulamento.</p><p>6. No paradigma de programação orientada a objetos, uma série de conceitos foram</p><p>trazidos para definir comportamentos que até então não podiam ser realizados através</p><p>da programação estruturada. A respeito do tema, assinale a alternativa que indica</p><p>corretamente o nome do conceito voltado a definir o comportamento que se espera de</p><p>uma classe.</p><p>a) polimorfismo</p><p>b) herança</p><p>c) coesão</p><p>d) interface da classe</p><p>7. Em termos de conceitos a Programação Estruturada difere da Programação Orientada a</p><p>Objetos. Portanto, considere a tabela abaixo com os seguintes conceitos e dois</p><p>paradigmas de programação.</p><p>I. Sequência de funções executadas</p><p>de modo empilhado.</p><p>II. Herança</p><p>III. Instância</p><p>IV. Desvios</p><p>V. Encapsulamento</p><p>A. Programação Orientada a Objeto</p><p>B. Programação Estruturada</p><p>Assinale a opção CORRETA que representa a ordem de associação entre a coluna da</p><p>esquerda com a da direita.</p><p>a) I – A, II – A, III – B, IV – B, V – B.</p><p>b) I – B, II – B, III – A, IV – B, V – B.</p><p>c) I – A, II – B, III – A, IV – B, V – A.</p><p>d) I – B, II – A, III – A, IV – B, V – A.</p><p>e) I – B, II – A, III – B, IV – B, V – B</p><p>8. Sobre programação estruturada e programação orientada a objetos, é INCORRETO</p><p>afirmar que:</p><p>a) Existem vários paradigmas de programação, dentre eles o estruturado e o</p><p>orientado a objetos.</p><p>b) No paradigma de programação estruturado, qualquer problema pode ser dividido</p><p>em problemas menores, chamados de funções.</p><p>c) A linguagem de programação C é um exemplo de linguagem de programação</p><p>estruturada, compilada e procedural.</p><p>d) O paradigma orientado a objetos entende o problema como um conjunto de objetos</p><p>interagindo por meio de troca de mensagens.</p><p>e) A linguagem de programação Java é um exemplo de linguagem orientada a</p><p>objetos, que não permite o uso de estruturas recursivas para a resolução de</p><p>problemas.</p><p>9. Avalie e identifique os problemas nos construtores das classes apresentadas abaixo:</p><p>public class Data {</p><p>private byte dia, mês;</p><p>private short ano;</p><p>private Data(byte d, byte m, short a) {</p><p>dia = d;</p><p>mês = m;</p><p>ano = a;</p><p>}</p><p>}</p><p>public class Media {</p><p>public int media(int a, int b) {</p><p>return (a + b) / 2;</p><p>}</p><p>public double media(int a, int b) {</p><p>return (a + b) / 2;</p><p>}</p><p>}</p><p>10. Escreva a classe ConversaoDeUnidadesDeArea com métodos estáticos para</p><p>conversão das unidades de área segundo a lista abaixo.</p><p>• 1 metro quadrado = 10.76 pés quadrados</p><p>• 1 pé quadrado = 929 centímetros quadrados</p><p>• 1 milha quadrada = 640 acres</p><p>• 1 acre = 43.560 pés quadrados</p>