32 Admita que as classes e a interface Java a seguir ocupem...

Próximas questões
Com base no mesmo assunto
Q2383109 Programação
32 Admita que as classes e a interface Java a seguir ocupem arquivos distintos.

Imagem associada para resolução da questão


Qual comando pertencente ao método main() NÃO produzirá erro de compilação?
Alternativas

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