【问题标题】:Inner classes in Java - Non static variable errorJava中的内部类 - 非静态变量错误
【发布时间】:2012-10-16 20:29:57
【问题描述】:

我还是 java 新手,我尝试创建一个内部类并调用 main 中的方法。 但是有一个编译错误说“非静态变量 - 这不能从静态上下文中引用”

请帮忙

class Class1{

    public static void main(String args []){
        Class2 myObject = new Class2();
        myObject.newMethod();
    }

    public class Class2{
        public void newMethod(){
            System.out.println("Second class");
        }
    }
}

【问题讨论】:

    标签: java class inner-classes


    【解决方案1】:

    inner 类需要引用 outer 类的实例才能被构造。如果您的类在逻辑上不需要它,那么使用 static 修饰符使其“只是一个嵌套类”:

    public static class Class2 {
        public void newMethod(){
            System.out.println("Second class");
        }
    }
    

    编辑:要创建 Class2 的实例作为 inner 类,您可以使用类似:

    Class1 outer = new Class1();
    Class2 myObject = outer.new Class2();
    

    或更简单地说:

    Class2 myObject = new Class1().new Class2();
    

    ...但除非你真的想要引用一个封闭的实例,否则让这个类只是一个嵌套类要简单得多。

    【讨论】:

    • 谢谢伙计 :) 真的很感激……你能解释一下吗?“内部类需要引用外部类的实例才能被构造。”
    • +1 一个非静态嵌套类有一个对其外部类的隐式引用,没有它就无法创建。
    【解决方案2】:

    通过添加静态关键字使内部类成为静态的

    public static class  Class2
    

    那么它应该可以工作。在非静态上下文中,你不能问任何静态的东西。或者,您可以通过创建对象而不将 class2 设为静态来访问它。

    【讨论】:

      【解决方案3】:

      访问内部类就像访问类的任何其他常规方法一样。

      所以,就像您需要引用您的类的 instance 来访问其方法一样,您也需要引用外部类的实例来实例化您的内部类:-

      Class1.Class2 myObject = new Class1().new Class2();
      

      或者,另一种选择是,你可以让你的内部类static,在这种情况下它被称为nested class,那么你可以使用你原来的方式:-

      public static class Class2{
          public void newMethod(){
              System.out.println("Second class");
          }
      }
      

      【讨论】:

        【解决方案4】:

        如果你是 Java 新手,下一个例子可能对你有额外的帮助。

        1. “main()”不适用于任何复杂的逻辑。你不能从它调用任何 类中非静态的方法。 "main()" 仅用于启动应用程序,

        2. 在许多情况下,首先您需要创建类的实例,即 包含方法“main”。例如,它是“OuterClass”。

        3. 当“OuterClass”实例存在时,调用它没有问题 任何动态的,例如 InnerClass 对象的 InnerClass 方法。

        这是一个例子:

        public class OuterClass {
            public static void main(String args []){
                new OuterClass();   // Instance of First class
            }
        
            public OuterClass () { // constuctor
                InnerClass myObject = new InnerClass();
                myObject.newMethod();
            }
        
            public class InnerClass{
                public void newMethod(){
                    System.out.println("Second class");
                }
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          • 2013-11-18
          • 2013-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-02
          相关资源
          最近更新 更多