¿Qué imprime el siguiente programa?
`
public class Deer { enum Food {APPLES, BERRIES, GRASS} protected class Diet { private Food getFavorite() { return Food.BERRIES; } } public static void main(String[] seasons) { switch(new Diet().getFavorite()) { case APPLES: System.out.print("a"); case BERRIES: System.out.print("b"); default: System.out.print("c"); } } }La imagen de respuesta es del banco de pruebas OCP, en el que preparo mi examen de certificación de Oracle
Mi problema es que no puedo estar de acuerdo con la respuesta, que la empresa Oracle considera correcta
Creo que la opción más correcta y precisa es D .
Mi argumento : el método principal no es culpable de la declaración incorrecta de la clase Diet. Se produce un error cuando escribimos esta clase en la declaración de cambio incorrectamente, en el momento de la declaración de la clase
Incluso la respuesta completa en la imagen explicó que
Creé esta pregunta porque cada puntaje en un examen pagado está en juego
Pensé que la empresa de comercio profesional trata la redacción de preguntas con cuidado.
¿Cómo un participante del examen puede hacer frente a esta situación?
Por favor, dígame, ¿es común tener respuestas tan ambiguas en los exámenes de certificación de TI?
¡Gracias por adelantado!
La respuesta E es la correcta. No importa cuál crea que debería ser la respuesta, cuando compilo el código usando javac (Java 8 y Java 16), el único error de compilación está en el método main .
$ javac Deer.java Deer.java:9: error: non-static variable this cannot be referenced from a static context switch(new Diet().getFavorite()) { ^ 1 error $ El mensaje de error de compilación es un poco extraño... pero está claramente en el método main . Puedes repetir este experimento por ti mismo.
Usted afirma que piensa que la declaración de la Diet es inapropiada, pero no veo nada inapropiado al respecto. Parece una declaración de clase interna normal.
El problema en el código NO está en la declaración de Diet , sino en la forma en que el método main intenta crear la instancia de Diet . La forma correcta (sintácticamente) sería escribir algo como esto (en main ):
switch(new Deer().new Diet().getFavorite()) {Esto dice:
DeerDiet en la instancia DeergetFavorite() en la instancia de Diet . Así que... claramente... main lo está haciendo mal, y ahí es donde está el error. Y el compilador está de acuerdo.
Y la especificación del lenguaje Java ( JLS 15.9.2 ) lo confirma:
Si C es una clase de miembro interno, entonces:
Si la expresión de creación de instancia de clase no está calificada, entonces:
- Si la expresión de creación de instancia de clase se produce en un contexto estático, se produce un error en tiempo de compilación.
(No encontrará nada en el JLS que respalde su afirmación de que la declaración de Diet es incorrecta... porque no es incorrecta. Pero siéntase libre de investigar esto, si lo desea).
Metaconsejo: antes de despotricar sobre los (supuestos) problemas con los exámenes de certificación de TI y las empresas que los administran... es recomendable asegurarse de que tiene los datos correctos.
El lenguaje Java tiene todo tipo de rincones oscuros, e incluso después de más de 20 años de usarlo, sigo encontrando cosas sobre el lenguaje que no me di cuenta (o que he olvidado). Es una mala idea asumir que tiene razón... frente a la posible evidencia de lo contrario.
No hay nada malo con la declaración de la clase Diet . Es el uso de la clase Diet , no su declaración o definición, lo que causa el problema, y ese uso está en main() . Como señala la pregunta, hacer new Deer().new Diet().getFavorite() estaría bien, por lo que la clase Diet se compiló correctamente.
Creo que lo que te estás equivocando aquí es la palabra "declaración". Esto no es ambiguo : tiene un significado muy específico y técnico en lenguajes compilados como C y Java.
.h y .c ). La declaración y definición de Diet están bien, solo la instanciación es incorrecta. Por lo tanto, la respuesta (D) es incorrecta.
Además, como se señaló en la otra respuesta, si intenta compilar este código con javac , el único error de compilación está en el método main , nuevamente, porque es el uso de la clase Diet lo que causa el problema, no la definición .