Programação com Objectos/Teste 1 de 2013/02/04
From Wiki**3
< Programação com Objectos
Parte 1
1.1. (3.0 val.) Transportadora
1.2. (1.0 val.) Escreva em Java a classe Stack que usa vectores de dimensão fixa (definida no momento da criação) para guardar inteiros e tem 3 métodos: insert(Integer e) (insere o elemento e na pilha), remove() (remove o último elemento inserido na pilha) e exists(Integer e) (devolve true se o elemento e existe na pilha e false em caso contrário). Também deve ser definida outra classe que difere da anterior por não permitir a existência de elementos duplicados na pilha, ou seja, o método insert(Integer e) não insere o elemento e se já existir na pilha. Quando a pilha está vazia e se tenta remover um elemento e quando está cheia e se insere um novo elemento, devem ser lançadas excepções.
A solução contém quatro classes (2 stacks e 2 excepções). Note-se que a solução é mínima e que algumas opções não são ideais em casos gerais (o uso de vectores fixos, por exemplo).
Ficheiro Stack.java: <java5> public class Stack {
private int[] _contents; private int _last = 0;
public Stack(int size) { _contents = new int[size]; }
public void insert(Integer e) throws StackOverflowException { if (_last == _contents.length) throw new StackOverflowException(); _contents[_last++] = e; }
public void remove() throws StackUnderflowException { if (_last == 0) throw new StackUnderflowException(); _last--; // in fact, it does not change the stack }
public boolean exists(Integer e) { for (int i: _contents) if (i == (int)e) return true; return false; }
} </java5>
Ficheiro UStack.java (stack sem repetições): <java5> public class UStack extends Stack {
public UStack(int size) { super(size); }
@Override public void insert(Integer e) throws StackOverflowException { if (!exists(e)) super.insert(e); }
} </java5>
Ficheiros StackOverflowException.java e StackUnderflowException.java (excepções):
<java5> public class StackOverflowException extends Exception {} </java5>
<java5> public class StackUnderflowException extends Exception {} </java5>
1.3. (1.5 val.) Qual a distinção entre sobrecarregar (overloading) e redefinir (overriding). Ilustre as diferenças através de um exemplo.
- Overloading: definição de métodos com o mesmo nome, mas com diferenças nos argumentos (tipo, número ou ambos) na mesma ou em classes relacionadas;
- Overriding: redefinição de um método definido anteriormente por uma das superclasses da hierarquia de uma classe.
- Overloading: Gato(int age) {...} e Gato(String name) {...}
- Overriding: redefinição por parte de Gato.respirar() de Animal.respirar() (sendo Gato uma subclasse de Animal)
1.4. (1.5 val.) Dê um exemplo prático de polimorfismo. Quais são as vantagens e inconvenientes do polimorfismo?
- Polimorfismo: possibilidade de referenciar um objecto através de um tipo genérico ou de um tipo mais abstracto que o seu (numa hierarquia de classes, por exemplo)
- Consequências: possibilidade de utilizar tipos concretos (ou mais específicos) em código escrito para tipos menos específicos; redução e reutilização de código; desenvolvimento incremental.
- Exemplo: Animal <-- Gato
Parte 2 (resposta múltipla)
2.1. Os objectos partilham duas características: estado e comportamento. Como é definido o estado?
o estado é o identificador do objectoo estado corresponde ao que um objecto pode fazer- o estado é representado pelos atributos
o estado depende fundamentalmente do número de subclasseso estado pode ser consultado acedendo à classe Object (no caso do Java)
2.2. Que nome se dá ao processo de esconder informação respeitante a alguns objectos
polimorfismoherança- encapsulamento
inclusãoinstanciação
2.3. Qual destas frases é uma possível definição de “objecto”?
Um objecto é uma realização de uma classeUm objecto é uma template de uma classe- Um objecto é uma instância de uma classe
Um objecto pode estender uma classeUm objecto pode ser estendido por uma classe
2.4. Que característica das linguagens OO permite que objectos de diferentes tipos sejam tratados de forma indiferenciada?
abstracçãoherança- polimorfismo
instanciaçãonenhum dos anteriores
2.5. Qual e o resultado da execução do seguinte programa em Java?
<java5> public class Hello {
public static void main(String[] args) { Integer a = new Integer(2); Integer b = new Integer(2); System.out.println(b == a); }
} </java5>
o programa lança de uma excepçãoo programa escreve true- o programa escreve false
o programa termina sem produzir erros/excepções e sem escrever nadanenhum dos anteriores