32 Admita que as classes e a interface Java a seguir ocupem...
Qual comando pertencente ao método main() NÃO produzirá erro de compilação?
Comentários
Veja os comentários dos nossos alunos
código bem indentado, graças a Deus.
certa E) pois Main implementa a classe que contem o metodo apresentado.
Gabarito: E
a) b.p="***";
Não tem um modificador de acesso explícito, ou seja, só pode ser acesado por outras classes dentro do mesmo pacote
b) op_c();
Mesma situação da opção "a"
c) op_k(5.2)
A alternativa tentou confundir colocando um método que não existe op_K (perceba que o "K" está maiúsculo e não existe esse método, só existe com o "k" minúsculo".
d) a.op_a(0.0,0.1);
A interface IntfX define um método op_a(Double a), mas não define um método op_a(Double a, Double b).
e) Correta
Meu amigo, uma questão em brainf*ck estaria menos bagunçada que essa. Mas as alternativas são óbvias:
A - Aqui ele tenta alterar o atributo p de b para "***". Esse atributo não tem modificador de acesso declarado, então implicitamente é PACKAGE (é tipo protected mas não pode ser acessado por subclasses de outros pacotes). O que significa que só pode ser acessado de dentro do seu pacote (pack_a).
B e C - Isso aqui é Java. Você não pode sair chamando métodos não-estáticos sem especificar os objetos que estão chamando os métodos. Além disso, op_k não existe, o método é op_K(maiúsculo).
Além disso, a visibilidade padrão do Java não permite o acesso fora da classe (diferente de protected)
Se op_c() fosse estático e protected, funcionaria.
D - "A" tenta criar um objeto Main() com tipo IntfX. É possível usar interfaces como tipos para instânciar objetos. Mas mesmo que o objeto seja um new Main(), op_a(com dois argumentos) simplesmente não existe em IntfX. O nome do objeto pode até ser o mesmo mas a assinatura é diferente. Diferentemente se op_a fosse uma simples sobrescrita do método da classe pai; nesse caso, o compilador priorizaria o método op_a da classe Main(), mesmo que o tipo do objeto fosse uma superclasse com outro método op_a.
E - Diferente da alternativa acima, esse método usa uma classe como tipo e instancia um New Main(). Como podemos ver abaixo, a classe Main() sobrescreve o método op_a usando 2 argumentos (double, double). Então o método op_A será chamado sem problemas.
edit: revendo essa questão percebi que meu comentário tinha alguns detalhes errados sobre modificadores de acesso e polimorfismo. Por isso recomendo não confiar em explicações e realmente abrir a IDE e jogar o código lá. Só assim você tem certeza do que aconteceu na questão.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo