1. Defina os sequintes termos: (a) (1 Ponto) Polimorfismo Computação II - Java - Teste 1.2 Prof. Adriano Joaquim de Oliveira Cruz 2015/04/27 (b) (1 Ponto) Sobrescrita de funções (c) (1 Ponto) Sobrecarga de funções (a) Polimorfismo é a capacidade de linguagens de programação apresentar a mesma interface para diferentes tipos de dado. Um tipo polimórfico é aquele cujas operações podem ser aplicados para valores de outro tipo. (b) Sobreescrita de métodos é ocorre quando uma classe filha redefine o mesmo método herdado de uma classe pai. Métodos sobreescritos devem ter o mesmo nome, lista de argumentos e tipo de retorno. O método que foi sobreescrito não pode restringir o acesso do método que ele sobreescreve. (c) Sobrecarga de métodos em Java ocorre quando dois ou mais métodos na mesma classe têm exatamente o mesmo nome, mas diferente parâmetros. Métodos sobrecarregados podem mudar o tipo de retorno e o modificador de acesso. 2. (2 Pontos) Suponha que você queira que subclasses em qualquer pacote tenham acesso aos membros de uma superclasse. Qual é o mais restritivo acesso que alcança este objetivo? Justifique sua resposta. A. public B. private C. protected D. default Answer: Option C Justificativa: Modificadores de acesso dizem que classes, não quais instâncias, podem acessar determinados membros. Métodos e variáveis são conhecidos coletivamente como membros. Membros têm controle de acesso, exatamente da mesma maneira. privado torna um membro acessível apenas a partir de dentro de sua própria classe
protected torna um membro acessível às classes no mesmo pacote ou às subclasses da classe. default acesso default é muito semelhante ao protected (certifique-se de detectar a diferença). Acesso default torna um membro acessível apenas às classes no mesmo pacote. public significa que todas as outras classes, independentemente do pacote que eles pertencem, pode acessar o membro (assumindo que a própria classe é visível) Depois de examinar estas definições, o modificador de acesso que oferece o maior número de restrições para os métodos para ser acessado a partir das subclasses da classe de outro pacote é C - protected. 3. (2 Pontos) Considere o definição de classe na listagem 1. Quais das opções é válida em uma classe que estende class A? Justifique sua resposta. Listagem 1: Listagem da classe A class A { protected int method1(int a, int b) { return 0; A. public int method1 (int a, int b){return 0; B. private int method1 (int a, int b){ return 0; C. public short method1 (int a, int b){ return 0; Resposta: Opção A Explicação: Opção A é correta - porque a classe que estende A está simplesmente sobrescrevendo o method1. Opção B é errada - porque ela não pode sobrescrever deste modo já que há menos privilégios no método method1 na subclasse. Opção C é errada - porque para sobrescreve-lo, o tipo de retorno precisa ser um inteiro. O retorno de tipo diferente significa que o método não está sobrescrevendo mas, ao mesmo tempo, a mesma lista de argumentos significa que o método não está sobrecarregando. Portanto, temos um conflito - compile time error. Page 2
4. (3 Pontos) Implemente as classes mostradas na Figura 1. Escreva um programa que execute as seguintes tarefas: (a) Crie dois cachorros e dois gatos e os insira em um ArrayList. (b) Após a inserção, imprima todos os elementos da lista. (c) Imprima a soma dos pesos dos cachorros e a soma dos pesos dos gatos. Abaixo está uma amostra do que um possível programa imprimiria. Animal [peso=15.0, idade=10] Cachorro latindo. Animal [peso=12.0, idade=4] Cachorro latindo. Animal [peso=9.0, idade=6] Gato miando. Animal [peso=10.0, idade=5] Gato miando. Peso gatos = 19.0 Peso cachorros = 27.0 -peso: double -idade: int Animal +setpeso(peso:double): void +setidade(idade:int): void +getpeso(): double +getidade(): int +comer(): void +Animal(peso:double,idade:int) +tostring(): String Cachorro +latir() Gato +miar() Figura 1: Classes Animal, Cachorro e Gato public class Animal { private double peso; Page 3
private int idade; public Animal(double peso, int idade) { super(); this.peso = peso; this.idade = idade; public String tostring() { return "Animal [peso=" + peso + ", idade=" + idade + "]"; * @return the peso public double getpeso() { return peso; * @param peso the peso to set public void setpeso(double peso) { this.peso = peso; * @return the idade public int getidade() { return idade; * @param idade the idade to set public void setidade(int idade) { this.idade = idade; public void comer() { System.out.println("Animal comendo."); public class Cachorro extends Animal { public Cachorro(double peso, int idade) { super(peso, idade); // TODO Auto-generated constructor stub public void comer() { Page 4
System.out.println("Cachorro comendo."); public void latir() { System.out.println("Cachorro latindo."); public class Gato extends Animal { public Gato(double peso, int idade) { super(peso, idade); // TODO Auto-generated constructor stub public void comer() { System.out.println("Gato comendo."); public void miar() { System.out.println("Gato miando."); import java.util.arraylist; public class Testa { public static void main(string[] args) { ArrayList<Animal> lista = new ArrayList<Animal>(); double pesogato = 0; double pesocachorro = 0; Gato g1 = new Gato(10, 5); Gato g2 = new Gato(9, 6); Cachorro c1 = new Cachorro(12, 4); Cachorro c2 = new Cachorro(15, 10); lista.add(c2); lista.add(c1); lista.add(g2); lista.add(g1); for (Animal a: lista) { System.out.println(a.toString()); i f (a instanceof Gato) { ((Gato) a).miar(); pesogato += a.getpeso(); else { Page 5
((Cachorro) a).latir(); pesocachorro += a.getpeso(); System.out.println("Peso gatos = " + pesogato); System.out.println("Peso cachorros = " + pesocachorro); Page 6