2

我已经阅读了有关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

4 回答 4

3

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

public static abstract class CommandParser {

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

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

于 2012-08-14T16:42:24.247 回答
1

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

于 2012-08-14T16:42:08.287 回答
0

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

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

2.当你试图访问CommandParser1(command)哪个是哪个是它的inner class, 你现在可以直接访问它 但是假设,当你试图从外部访问它时,你需要创建一个外部类实例来访问这个内部类方法。class ProtocolUtility outer classProtocolUtility class

于 2012-08-14T16:43:14.707 回答
0

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

于 2012-08-14T16:43:12.533 回答