Teste Individual (Livro Kathy Sierra, Capítulo I, Questão 1)

Pessoal,

Estou fazendo o Teste Individual do capítulo I do livro da Kathy Sierra. Trata-se da questão 1, que está descrita abaixo:

  1. Dado o seguinte código:

interface Base { boolean m1 (); byte m2 (short s); }

Qual fragmento de código irá compilar? (Marque todas as corretas.)

A. interface Base2 implements Base { }

B. abstract class Class2 extends Base { public boolean m1 () { return true; } }

C. abstract class Class2 implements Base { }

D. abstract class Class2 implements Base { public boolean m1 () { return (true); } }

E. class Class2 implements Base { boolean m1 () { return false; } byte m2 (short s) { return 42; } }

De acordo com a resposta ao final do livro, as afirmativas corretas são C e D. A afirmativa E, ele diz que está errada porque os métodos de interfaces são implicitamente public, então os métodos sendo implementados precisam ser public. (Objetivo 1.1). Minha dúvida é: Os modificadores no caso da letra E não são opcionais??

Desde já obrigada!! :slight_smile:

Ola

Os modificadores na sobrescrita de um método de uma interface NÃO são opcionais.

Quando uma classe implementa uma interface ela é OBRIGADA a sobrescrever os métodos da interface.

A regra de sobrescrita é a seguinte:
-O método sobrescrito NÃO pode ter modificador de acesso mais restrito do que o método pai, somente mais abrangente.

Seguindo a ordem de modificadores dos mais restritos para os mais abrangente:
private
default
protected
public

Sendo que os métodos de uma interface são implicidamente public eles SÓ podem ser sobrescritos como public, porque os outros modificadores são de acesso mais restrito do que o dele.

falou!

Então realmente na letra E faltou o modificador public frente aos dois métodos declarados.

Obrigada pelo esclarecimento!

:slight_smile:

mesmo se não tiver declarado explicitamente, métodos de uma interfacer (100% abstract), são implicitamente public e abstract.

interface Base { public abstract boolean m1 (); public abstract byte m2 (short s); }

Na resposta da pergunta E, se você não escrever um modificador no método ele vai assumir que aquele método tem um modificador default.

class Class2 implements Base { boolean m1 () { return false; } byte m2 (short s) { return 42; } }

Sendo que o modificador de acesso default se aplica em nível da pacote. :wink: