【问题标题】:"The constructor is not visible" error“构造函数不可见”错误
【发布时间】:2014-10-21 05:29:16
【问题描述】:

我有两门课:

首先,使用一个构造函数:

public class First {

    First (ObjectA myObjectA) {
        //do stuff
    }
}

其次,有两个构造函数:

public class Second {

    Second (ObjectB myObjectB) {
        //do something...
    }

    Second (ObjectC myObjectC) {
        //do something else...
    }
}

当我想实例化我的First 类时,Eclipse 给我一个错误(“构造函数不可见”),我必须将public 添加到First 的构造函数中:

First first = new First(myObject); //Error : "The constructor is not visble"

但是当我实例化我的Second 类时,我没有错误:

Second second = new Second(myObjectC); //No error...

注意:我在另一个类中实例化了First,但我在First 中实例化了Second。 First 和 Second 在同一个包中。

你能解释一下为什么吗?

【问题讨论】:

  • 肯定“第二”与“第一”在同一个包中。请记住:默认访问(即无修饰符)对同一包中的类可见。而且,Other 类位于与第一个不同的其他包中。
  • First、Second 以及您尝试实例化它们的类在哪些包中?
  • Java 中的“访问修饰符”有点令人困惑,并不是特别“常规”。有public、private、protected 和“无修饰符”。 public 可以从任何地方访问,private 只能从同一个类中访问,protected 从一个子类中访问,并且从同一个“包”中的任何类中“无修饰符”。

标签: java constructor public


【解决方案1】:

构造函数没有访问修饰符使其包私有。 假设 First 和 Second 在同一个包中,您可以从 first 调用 Second 的构造函数。 但是,另一个包中的另一个类不能访问任何构造函数。

【讨论】:

  • 子类也不能调用没有修饰符的超类构造函数
【解决方案2】:

您的课程必须在 2 个包中。如果您没有提及任何显式访问修饰符,Java 会将它们视为默认访问修饰符。那么您只能通过同一个包访问它们。

访问修饰符(从最低访问到最高访问)

  1. private - 仅在同一个班级内
  2. 默认 - 仅在同一个包中
  3. 受保护 - 相同的包 + 其他包中的子类
  4. 公开 - 从任何地方

【讨论】:

    【解决方案3】:

    由于您没有提及任何修饰符,因此访问修饰符现在是默认,这意味着它仅在其自己的包中可见

    如果您尝试在包装外使用它,您将面临当前错误。

    尝试阅读:What is the default access modifier in Java?

    如果您不明白 @BackSlash 的评论内容,请查看以下链接

    问题:Calling a method from a superclass

    【讨论】:

    • 子类也不能调用没有修饰符的超类构造函数
    【解决方案4】:

    只要让你的构造函数public

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多