【问题标题】:Who is right and who is wrong? Oracle certification OCP. Inconsistency in the choice of answers谁对谁错? Oracle认证OCP。答案选择不一致
【发布时间】:2021-11-07 21:10:32
【问题描述】:

以下程序打印了什么?
`

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");
      }
   }
}

`

答案图片来自 OCP 测试库,我在其中准备 Oracle 认证考试

我的问题是我不能同意甲骨文公司认为正确的答案

我认为最正确和准确的选项是D

我的论点: main 方法对于 Diet 类的不当声明是无罪的。当我们在 switch 语句中错误地键入此类时会发生错误,在声明类的时刻

图片中的完整答案也解释了这一点

我创建这个问题是因为付费考试的每一个分数都受到威胁

我认为专业的商务公司会认真对待问题的起草

应试者如何应对这种情况?

请您告诉我,在 IT 认证考试中出现这种模棱两可的答案很常见吗?

提前致谢!

【问题讨论】:

  • "main 方法不因不当的 Diet 类声明 而有罪。"但是内部 Diet 类已正确声明(如果您删除 main 方法,您将看到其余代码将正常编译)。问题是它是如何在main 方法中使用 - 因为内部类需要外部类的实例来实例化(这里是Deer)。您在阅读解释时是否混淆了DearDiet?或者也许是通过创建实例来声明类?
  • 不如你试试看编译错误是什么?

标签: java oracle enums switch-statement main


【解决方案1】:

Diet 类的声明没有错。导致问题的是Diet 类的用法,而不是它的声明或定义,并且该用法在main() 中。正如问题所指出的,做new Deer().new Diet().getFavorite() 就可以了——所以Diet 类编译正确。

我认为您在这里弄错的是“声明”一词。这没有歧义 - 它在 C 和 Java 等编译语言中具有非常具体的技术含义。

  • 一个对象的声明是当它被代码声明为存在时。这通常与
  • 对象的definition描述什么(在Java中几乎总是与声明结合在一起;在C/C++中,声明和定义通常在@987654326 @ 和 .c 文件)。
  • 对象的实例化是在调用定义以在内存中创建对象/变量的实例时。每个实例(可能有多个)都将符合相同的定义。

Diet 的声明和定义都可以,只是实例化是错误的。因此,答案(D)不正确。


另外,正如另一个答案中所指出的,如果您尝试使用 javac 编译此代码,则唯一的编译错误出现在 main 方法中 - 再次,因为它是 usage导致问题的Diet 类,而不是定义

【讨论】:

    【解决方案2】:

    答案 E 是正确的。不管你认为答案应该是什么,当我使用javac(Java 8 和Java 16)编译代码时,唯一的编译错误是在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
    $
    

    编译错误消息有点奇怪……但显然在main方法中。你可以自己重复这个实验。


    你说你认为Diet 的声明是不恰当的,但我看不出有什么不恰当的地方。它看起来像一个普通的内部类声明。

    代码中的问题不在于Diet 的声明,而在于main 方法试图创建Diet 实例的方式。 (语法上)正确的方法是写这样的东西(在main):

    switch(new Deer().new Diet().getFavorite()) {
    

    这说:

    • 创建外部类Deer的实例
    • Deer 实例中创建Diet 的实例
    • Diet 实例上调用getFavorite() 方法。

    所以...显然...main 做错了,这就是错误所在。并且编译器同意。

    Java 语言规范 (JLS 15.9.2) 证实了这一点:

    如果C是一个内部成员类,那么:

    • 如果类实例创建表达式不合格,则:

      • 如果类实例创建表达式出现在静态上下文中,则会发生编译时错误。

    (你不会在 JLS 中找到任何东西来支持你的断言,即 Diet 的声明是错误的......因为它没有错。但是如果你愿意,请随时研究这个.)


    元建议:在对 IT 认证考试的(假定的)问题以及管理考试的公司进行抨击之前……建议确保您掌握了正确的事实。

    Java 语言有各种晦涩难懂的角落,即使在使用它 20 多年后,我仍然不断发现我没有意识到(或已经忘记)的语言。假设你是对的是一个坏主意……面对可能的相反证据。

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 2012-05-23
      • 2017-06-11
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多