【问题标题】:Java: Creating new custom object in main function?Java:在主函数中创建新的自定义对象?
【发布时间】:2013-09-19 09:57:22
【问题描述】:

我在一个类中创建了一个对象:

private class Viscosity{
    float magnitude;
    private Viscosity(float Magnitude){
        magnitude = Magnitude;
    }
}

在我的 main 函数中,我尝试从文本文件中提取数据并创建一个新的 Viscosity 对象,但似乎我无法访问这个私有对象。

例如,我想将它添加到对象列表中:

listofObjects.add(new Viscosity(50.0f));

但我收到错误:

没有封闭的类型实例是可访问的。必须使用 ClassName 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 ClassName 的实例)。

我怎样才能做到这一点?

【问题讨论】:

  • 为什么构造函数是私有的?为什么要使用内部类?
  • 你想在哪里调用listofObjects.add(new Viscosity(50.0f));?它是在包含Viscosity 内部类的类之外吗?
  • 为什么不发布整个班级,而不仅仅是内部班级?这样你可能会从人们那里得到更好的建议。

标签: java object private


【解决方案1】:

你应该:

  • 将 Viscocity 设为非内部类。在它自己的文件中声明它,除非你有一个非常令人信服的理由让它成为一个内部类(你还没有给我们做)。
  • 将其构造函数公开。

【讨论】:

  • +1。从设计的角度来看,这是最好的建议。不一定是公开的,但可能是包私有的(默认可见性)。
【解决方案2】:

如果该类不依赖于封闭实例,则要声明该类static

 private static class Viscosity

或者,不要从静态 main 方法调用它,而是创建外部类的实例并将代码移动到实例方法中。

但是,真的,为什么这必须是一个内部类?为什么不是常规(包私有)类。如果你真的想要,你甚至可以在同一个文件中声明它(但这也是不可取的)。

【讨论】:

  • 你能解释一下封闭实例是什么意思吗?我不确定这是否有帮助,但我正在尝试创建多个 Viscosity 对象并将它们添加到我的对象列表中。
  • 在您的 static 主方法中,您没有 this (外部类的实例)。所以你不能访问不是静态的方法、字段或构造函数。
【解决方案3】:

您的内部类是否需要访问封闭类的任何成员?如果没有,您可以将其设为静态类。

private static class Viscosity {
...

【讨论】:

    【解决方案4】:

    您可以将非静态嵌套类视为其外部类的member,因此您只能通过外部类的实例(封闭)使用它。通常,您首先需要创建一些外部类实例,例如 `

    Outer out = new Outer() 
    

    然后使用这个对象来创建它的内部类的实例

    Outer.Inner inner = out.new Inner(). 
    

    但为了能够做到这一点,您的内部类及其构造函数必须在您尝试调用此代码的地方可访问。

    Outer 类的非静态方法中仅使用new Inner() 没有问题,因为它将转换为this.new Inner()this 引用包含Outer 类的当前实例。
    但是静态方法存在问题,因为它们内部没有this,或者this 可能包含错误的实例,例如在不扩展Outer 的类中调用new Inner()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 2020-06-28
      • 2015-08-17
      相关资源
      最近更新 更多