Lista de Exercícios – POO em Java

Tópicos: Herança, Encapsulamento, Classe Abstrata e Sobrescrita de Métodos. 5 alternativas por questão (a–e); a e) é sempre NDA.

1) Herança
(Teórico)
Sobre herança em Java, assinale a correta.
(Prático – leitura de código)
Dado:
class A { int x = 1; }
class B extends A { int x = 2; int f(){ return super.x; } }

`new B().f()` retorna:  
(Teórico)
Qual afirmação é **verdadeira**?
(Prático – completar conceito)
Para impedir que uma classe seja estendida, use:
(Teórico)
Sobre construtores em herança:
(Prático – seleção de termo)
Complete:
class Animal { void som(){} }
class Cachorro ____ Animal { }
(Prático – sobrescrita x ocultação)
Dado:
class P { static void f(){} }
class C extends P { static void f(){} }

O que ocorre?  
(Teórico)
Se `B extends A`, então:
(Prático – seleção de termo)
Complete:
public class Veiculo {
  protected int velocidade;
}
public class Carro _____ Veiculo { }
2) Encapsulamento
(Teórico)
Encapsulamento busca:
Resposta correta: b
Por que correta: Esconde implementação, expõe contrato.
Por que as outras não: a/c/d) não definem encapsulamento.
(Prático – seleção de modificador)
Melhor modificador para campo sensível:
class Conta { ____ double saldo; }
Resposta correta: b
Por que correta: Restringe acesso, forçando métodos de acesso.
Por que as outras não: a/c/d) expõem demais.
(Prático – getters/setters)
Para manter invariantes, usamos:
Resposta correta: b
Por que correta: Permite validação.
Por que as outras não: a/c/d) não resolvem encapsulamento.
(Teórico)
`private` significa:
Resposta correta: c
Por que correta: Escopo restrito à classe.
Por que as outras não: a/b/d) incorretas.
(Prático – completar assinatura)
Complete um getter padrão:
class Pessoa { private String nome; public String ____(){ return nome; } }
Resposta correta: a
Por que correta: Convenção JavaBeans.
Por que as outras não: b) setter; c/d) nomes incorretos.
(Prático – seleção de termo)
Para restringir escrita externa no campo `saldo`:
Resposta correta: b
Por que correta: Controla via métodos.
Por que as outras não: a/c/d) permitem acesso indevido.
(Teórico)
`protected` garante:
Resposta correta: b
Por que correta: Regra de visibilidade do `protected`.
Por que as outras não: a/c/d) incorretas.
3) Classe Abstrata
(Teórico)
Uma classe abstrata:
Resposta correta: b
Por que correta: Pode misturar concretos e abstratos.
Por que as outras não: a) não pode instanciar; c) não é obrigatório; d) não é igual.
(Prático – assinatura)
Escolha a definição correta:
Resposta correta: b
Por que correta: Método abstrato sem corpo.
Por que as outras não: a/d) corpo não permitido; c) classe não abstrata com método abstrato.
(Teórico)
Sobre construtores em classes abstratas:
Resposta correta: b
Por que correta: Construtor existe para inicialização ao estender.
Por que as outras não: a/c/d) incorretas.
(Prático – modelagem)
Quando escolher classe abstrata em vez de interface?
Resposta correta: a
Por que correta: Abstrata permite estado/implementação parcial.
Por que as outras não: b) é caso de interface; c) Java não tem; d) irrelevante.
(Prático – completar código)
Complete:
abstract class Forma {
  abstract double area();
}
class Circulo extends Forma {
  ____ double area(){ return Math.PI * r * r; }
  double r;
}
Resposta correta: c
Por que correta: Implementa método abstrato com visibilidade compatível; `public` é comum para API.
Por que as outras não: a) não pode manter abstrato; b/d) sem sentido aqui.
(Teórico)
Declarações válidas:
Resposta correta: b
Por que correta: Classe abstrata simples é válida.
Por que as outras não: `abstract` e `final` são incompatíveis; não se pode estender classe `final`.
(Teórico)
Em classes abstratas:
Resposta correta: b
Por que correta: `private` impediria implementação na subclasse.
Por que as outras não: a/c/d) falsas.
(Prático – leitura de código)
abstract class A { abstract int x(); }
class B extends A { int x(){ return 42; } }

`new B().x()` retorna:  
4) Sobrescrita de Métodos (Override)
(Teórico)
Override correto requer:
(Prático – @Override)
O uso de `@Override` ajuda a:
(Prático – selecionar termo)
Complete o override:
class A { Number f(){ return 1; } }
class B extends A {
  ____ Integer f(){ return 2; }
}
(Teórico)
Não é possível sobrescrever:
(Prático – leitura de código)
class P { String m(){ return "P"; } }
class C extends P { @Override String m(){ return "C"; } }
System.out.println(new P().m() + new C().m());

Saída:  
(Teórico)
Sobre anotações:
(Prático – seleção de termo)
Para chamar a versão da superclasse dentro do override:
@Override
void m(){ /* … */ }