我已经阅读了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) {
//...
}
}
}
答案 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
时,您需要创建一个外部类实例来访问此内部类方法。强>