【问题标题】:Java - Using Instance Class from Static Method?Java - 使用静态方法中的实例类?
【发布时间】:2012-04-17 17:00:12
【问题描述】:

多年来,我一直在使用 .NET 进行编程,并且正在通过一些简单的入门程序投入到 Java 中。

我遇到了一些麻烦......

当我使用public void main 创建启动类时,编译器不允许我实例化我编写的任何类?

我得到的错误是“非静态变量 _processor 不能从静态上下文中引用”,其中 _processor 是我试图从我编写的 Processor 类中实例化的对象。

当我将处理器更改为静态类时,程序将编译并运行得很好,但我不想让我的所有类都是静态的。

有什么办法吗?

提前致谢!

这是我写的所有内容。它不会在当前状态下编译:

class Lab
{
    public static void main(String[] args)
    {
        Processor proc = new Processor();

        proc.Go();
    }

    private class Processor
    {
        private Random _rand = new Random();

        public void Processor() {}

        public void Go()
        {

        }
    }
}

【问题讨论】:

  • 如果您向我们展示您的代码会有所帮助。
  • 将代码放在这里有助于更好地理解问题。
  • 不是您编写的所有内容 - 错误消息指的是_processor,但这不会出现在您显示的代码中。

标签: java static instance inner-classes


【解决方案1】:

ProcessorLab 的内部类吗? (是的,既然您发布了您的代码,我的怀疑得到了证实)。

在 Java 中,nonstatic inner classes contain an implicit reference to the containing object of the outer class,因此无法从静态上下文(通过您的 main 方法)实例化它们。

所以

  • 要么创建Lab 的实例(例如myLab),然后调用myLab.new Processor(),要么
  • 声明 Processor 静态(如您所做的那样),或
  • Processor 转为顶级课程。

【讨论】:

    【解决方案2】:

    这是你的问题吗?

    public class DemoClass{
    
      String field;
    
      public static void main(String[] args){
        field = "Hey"; //forbidden - can't access instance field from static context
        DemoClass dc = new DemoClass();
        dc.field = "Hey"; //this is ok
      }
    
    }
    

    【讨论】:

      【解决方案3】:

      你应该从 main 调用构造函数:

      public static void main(String[] args){
      new MyClass();
      }
      

      并将您的实例化放入构造函数中。

      【讨论】:

        【解决方案4】:

        但我不想让我的所有类都变成静态的。

        根据我的经验,Java 中的大多数内部类都是静态的。如果您可以在单独的文件中编写内部类(它不直接使用包含类的成员),则应将其定义为静态。 Java 允许您在其他类中编写内部静态类确实只是为了方便。

        【讨论】:

          【解决方案5】:

          您的流程类是您的实验室类的内部类,在您实例化您的实验室类的实例之前,您无法创建流程类的实例,除非该内部类是静态的或其他什么。

          Main 将在您的实验室类中运行,因为它是静态的,但是当您尝试创建私有内部类的实例时,您不能,因为该类是 Lab 的“私有内部”类,而您没有'没有实验室实例,所以不能直接引用。

          您可以尝试将您的处理器类设为静态,或者至少公开,或者更好的是,您可以先实例化您的实验室类的实例,并通过您的实例化实验室类引用处理器类的创建。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-22
            • 1970-01-01
            • 2018-03-07
            • 1970-01-01
            相关资源
            最近更新 更多