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

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

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

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();         
}

当前回答

到目前为止,答案描述了原因,但还有一件事你可能需要考虑:

你可以通过将方法调用附加到可实例化类的构造函数来调用方法,

Object instance = new Constuctor().methodCall();

or

primitive name = new Constuctor().methodCall();

如果您只希望在单个作用域内使用一次可实例化类的方法,这是非常有用的。如果在一个作用域中从一个可实例化类调用多个方法,一定要创建一个可引用的实例。

其他回答

编译器实际上为非静态方法添加了一个参数。它添加了一个this指针/引用。这也是为什么静态方法不能使用这个的原因,因为没有对象。

面向对象编程的本质是将逻辑与它所操作的数据封装在一起。

实例方法是逻辑,实例字段是数据。它们一起构成了一个物体。

public class Foo
{
    private String foo;
    public Foo(String foo){ this.foo = foo; }
    public getFoo(){ return this.foo; }

    public static void main(String[] args){
        System.out.println( getFoo() );
    }
}

运行上述程序可能会得到什么结果?

没有对象,就没有实例数据,虽然实例方法作为类定义的一部分存在,但它们需要对象实例为它们提供数据。

理论上,不访问任何实例数据的实例方法可以在静态上下文中工作,但实际上没有任何理由将其作为实例方法。这是一种语言设计决定,无论如何都要允许它,而不是制定一个额外的规则来禁止它。

如果我们试图从静态上下文访问一个实例方法,编译器无法猜测你引用的是哪个实例方法(变量对应哪个对象)。不过,您总是可以使用对象引用访问它。

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

Ex:

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

你不能给不存在的东西打电话。因为还没有创建对象,所以非静态方法还不存在。静态方法(根据定义)总是存在的。