初学者最常犯的错误是试图“静态”地使用类属性而不创建该类的实例。它会给你留下上面提到的错误信息:

您可以将非静态方法设置为静态,也可以创建该类的实例来使用它的属性。

背后的原因是什么?我关心的不是解决方法,而是原因。

private java.util.List<String> someMethod(){
    /* Some Code */
    return someList;            
}

public static void main(String[] strArgs){          
     // The following statement causes the error. 
    java.util.List<String> someList = someMethod();         
}

当前回答

非静态方法依赖于对象。一旦对象被创建,程序就会识别它。

静态方法甚至可以在创建对象之前调用。静态方法非常适合于执行不依赖于您计划使用的实际对象的比较或操作。

其他回答

静态方法将操作关联到对象类型,而非静态方法将操作关联到该类型对象的实例。通常,它是一个与实例相关的方法。

Ex:

Car类可能有一个wash方法,用于指示清洗特定的汽车,而静态方法应用于Car类型。

非静态方法依赖于对象。一旦对象被创建,程序就会识别它。

静态方法甚至可以在创建对象之前调用。静态方法非常适合于执行不依赖于您计划使用的实际对象的比较或操作。

如果一个方法不是静态的,这就“告诉”编译器该方法需要访问类中的实例级数据(就像一个非静态字段)。除非创建了类的实例,否则此数据将不可用。因此,如果你试图从静态方法调用该方法,编译器会抛出一个错误。如果实际上该方法没有引用类的任何非静态成员,则将该方法设置为静态。

例如,在Resharper中,只要创建一个不引用类的任何静态成员的非静态方法,就会生成一个警告消息“此方法可以被设置为静态”。

我刚刚意识到,我认为人们不应该过早地接触“静态”的概念。

静态方法应该是例外,而不是规范。尤其是在你想学习OOP的时候。(为什么要从规则的例外开始呢?)这与Java的教学方法截然相反,你应该学习的“第一件”事情是公共静态空的主要内容。(很少有真正的Java应用程序有自己的主方法。)

您正在尝试调用的方法是实例级方法;您没有实例。

静态方法属于类,非静态方法属于类的实例。