为什么我得到错误“非静态变量,这不能从静态上下文引用”?

时间:2012-08-14 16:38:36

标签: java static inner-classes

我已经阅读了non-static variable this cannot be referenced from a static context错误,但我不明白为什么我会在我的情况下得到它(行return new CommandParser1(command);)?我只是创建类的实例。就这样。有什么问题?

public class ProtocolUtility {

    public static CommandParser createParser(String command) throws Exception {           
        switch (command) {
            case COMMAND_1:
                return new CommandParser1(command);                  
            case COMMAND_2:
               return new CommandParser2(command);
            default:
                return null;
        }
    }

   public abstract class CommandParser {

       protected String command;

       public String getCommand() {
          return command;
       }       
   }

   public  class CommandParser1 extends CommandParser {       
       public CommandParser1 (String command){
           //...
       }       
   }

   public  class CommandParser2 extends CommandParser {      
       public CommandParser2 (String command)  {
           //...
       }      
   }

}

4 个答案:

答案 0 :(得分:3)

CommandParser内部类,这意味着它需要创建外部类(ProtocolUtility)的实例。将其声明更改为:

public static abstract class CommandParser {

或者在单独的CommandParser文件中声明.java

如果createParser()不是static,您的代码也会有效,因为在这种情况下,您当前所在的ProtocolUtility实例将用作外部实例。

答案 1 :(得分:1)

以静态方式调用createParser时(即ProtocolUtility.createParser(...)),您无法实例化ProtocolUtility内定义的类中的对象,因为这需要您拥有一个实例该课程(你没有)。这可以通过制作内部类static来解决。

答案 2 :(得分:0)

因为CommandParser1()不是静态的。您需要一个CommandParser1实例来调用CommandParser1()或将其定义为静态。

答案 3 :(得分:0)

1。 Static method 无法访问 Non-static method or variable.

内部静态方法 return new CommandParser1(command); public static中的代码CommandParser createParser(String command),因此导致错误。

2。当您尝试访问来自CommandParser1(command) inner class的{​​{1}}时, {{ 1}},您可以直接访问它,因为您现在正在做的事 但是假设,当您尝试从外部访问 class ProtocolUtility时,您需要创建一个外部类实例来访问此内部类方法。