Java,编译错误,构造函数

Java, compilation error, Constructors

我一直在尝试模拟 ocjp 6 测试。我问了一个问题,询问构造函数是否正确:

 1- public Test8(){}
 2- private void Test8(){}
 3- protected Test8(int k){}
 4- Test8(){}

正确答案是 1 和 3。我不明白为什么 4 不正确。当我测试以下代码时:

public class Test8 {
    Test8() {}

    public Test8() {}

}

我有编译错误,但是当我删除其中一个构造函数时,如果编译没有任何问题。

请有人帮我解决一下。

您不能使用相同的参数(在这种情况下没有参数)重新声明相同的构造函数

您首先定义了一个私有构造函数。 然后你正在定义一个 public 构造函数但具有相同数量的参数。

您需要选择是要私有构造函数还是 public 构造函数。

public class Test8 {
    Test8() {}// Or this one

    public Test8() {} // Or this one. but not both.

}

唯一明智的答案是模拟考试答案不正确。 1、3 和 4 是有效的构造函数。将 1 和 4 作为相同 class 的构造函数可能无效,但问题并未提出这个问题。

关于这个 Whosebug 问题的令人困惑的是它是关于另一个问题的。所以当人们回答提到 "question" 时,不清楚是哪个。


对于你的为什么不能编译的问题,这是因为它们都具有相同的签名(方法名称和参数)。 Return 类型和可见性(publicprivateprotected)对于制作唯一签名无关紧要。

public class Test8 {
    Test8() {}

    public Test8() {}
}

因为它们都具有相同的名称和参数类型,所以就编译器而言,它们是相同的方法,这就是为什么当您删除一个时它起作用的原因,因为它没有重复项。


至于试题

Q8: Which of the following are valid Constructors?

  1. public Test8(){}
  2. private void Test8(){}
  3. protected Test8(int k){}
  4. Test8(){}

唯一无效的是 2,因为它列出了 return 类型 (void)。构造函数没有 return 类型。尽管该网站将正确答案列为 13

Q8:

  • 1 is correct. public Test8(){}.
  • 3 is correct. protected Test8(int k){}.

为什么?

  • 可能他们将它们全部放在一个 java 文件中并尝试像您一样编译它并认为 4 无效。
  • 也许他们认为构造函数需要可见性修饰符?
  • 也许这是一个措辞糟糕的问题,他们的意思是 "which of these can be used together starting from the top, ones below the cause the compilation to fail are incorrect"

无论您如何划分,该网站上的 question/answer 都很差。