Java实践OCAJP令人困惑的答案

时间:2018-05-29 14:16:50

标签: java

我正在https://www.myexamcloud.com做一些自由练习考试,我在这里得到了一些奇怪的答案。

  
      
  1. 当对象等于equals(Object)方法时,其哈希码也必须相等
  2.   

我回答false,因为有可能不是真的,但这是错误的答案。现在我不确定他们在这里问我的问题:如果这是一个很好的做法,如果根据equals-hashCode合约这是必须的,或者每个代码组合根本没有可能。

  
      
  1. 以下哪些句子对于Java源文件是正确的?

         

    一个。 package语句必须是第一行

         

    湾注释可以放在包语句之前

  2.   

这是两个正确的答案(我只检查b),对我来说它看起来像是一个矛盾。如果package语句必须是第一行,那么在允许之前如何进行注释?

  
      
  1. 以下哪项陈述为真?

         

    一个。在各种转换中都不允许隐式转换

  2.   

这是什么意思,什么转变?对我而言,转型是一个基本上可以代表任何事物(铸造,克隆,制图等)的词,但事实并非如此 Java中的一个特殊词。

  
      
  1. 以下哪项陈述为真?

         

    一个。有效的覆盖具有相同的参数类型和顺序,相同的返回类型,并且不比原始方法

    更易于访问      

    湾有效的覆盖具有相同的参数类型和顺序。返回类型可以不同

  2.   

我检查了b,但a是正确的。如果有可能覆盖协变返回类型,b如何不正确?

我知道这个网站不是官方的,这就是我问这个问题的原因。官方考试中我可以期待这样的问题吗?我注意到那些考试试图愚弄并诱骗我很多,但在这里我觉得我觉得不对,就像问题没有足够的信息/背景来回答它。

2 个答案:

答案 0 :(得分:3)

1-很可能这个问题已经提到了最佳实践实施equals / hashCode的预期合同。尽管如此,编译器并没有禁止它们返回不同的结果 - 但是我还没有看到这种行为的有效用例,因此,只要我看到它就会质疑它。据推测,考试试图强制执行这个最佳实践预期合同

2-这里他们最有可能的意思是package语句必须是第一个处理行(因为编译器忽略了注释) - 即,你不能在之前放置import语句例如,package语句。所以这里没有矛盾,只是一个不明确的措辞。是的,你可以期待考试中同样缺乏清晰度,所以请留意。

3-如果没有上下文,很难弄清楚他们的意思。也许还包括其他答案选择?转换确实可以引用Java中的各种动作

4-这里的问题不是所提出的选择是否是唯一有效的选择。答案a表示比可能的有效覆盖更窄的集合(是的,返回类型可以是不同的,只要它是共变体);但是,这个措辞也明确地切断了任何无效的覆盖实现,而b则没有(注意缺少not less accessible子句)。所以a总是正确的,即使它没有涵盖所有有效案件;另一方面,b涵盖有效和无效的案例,因此可能有时可能不正确。再一次,在实际考试中一定要考虑这些问题,你必须非常认真地阅读

答案 1 :(得分:3)

  
      
  1. 当对象等于equals(Object)方法时,其哈希码也必须相等
  2.   

答案是对的。当尝试实现hashcode()方法时,这是对象的一般契约。取自api doc: If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

尝试想象当HashMap处理碰撞时,当equal方法返回true但是hashcode为两个对象返回不同的值。

  
      
  1. 以下哪些句子对于Java源文件是正确的?      
        
    • 一个。 package语句必须是第一行
    •   
    • 湾评论可以放在包陈述之前
    •   
  2.   

两者都是正确的,因为注释部分不是编译单元的一部分。取自JLS

  

CompilationUnit:

OrdinaryCompilationUnit
ModularCompilationUnit
     

OrdinaryCompilationUnit:

[PackageDeclaration] {ImportDeclaration} {TypeDeclaration}
     

ModularCompilationUnit:

{ImportDeclaration} ModuleDeclaration

  
      
  1. 以下哪项陈述是正确的?   一个。在各种转换中都不允许隐式转换
  2.   

这有点模糊。但是,我认为这是真的。因为,如果允许,那么这个表达式也应该运行(它不应该运行)

long a = 123L;
int b = a;
  
      
  1. 以下哪项陈述是正确的?   一个。有效的覆盖具有相同的参数类型和顺序,相同的返回类型,并且不会比原始方法更难访问   湾有效的覆盖具有相同的参数类型和顺序。返回类型可以不同
  2.   

虽然b做出了有效的选择。选项a比其他选项更具体。因此,b也可能意味着,被覆盖的方法可能比原始方法更容易获得。

通过我参加考试的经验。问题应该非常明确(意味着不应该涉及技巧问题)。所以,我想你可以尝试从他们那里参加模拟考试。但是,尝试也使用其他模拟考试。另外,请阅读其他一些书。

祝你好运。