1

谁能解释一下为什么静态方法调用非静态方法是非法的?

4

7 回答 7

13

非静态方法是作用于特定实例(对象)的实例方法,并且可以访问该对象的成员。静态方法与特定实例无关。

如果您提供实例,则调用非静态方法是合法的:

class Foo
{
    public static void f()
    {
        instanceMethod(); // Not OK - no instance provided.
        this.instanceMethod(); // Not OK -  no "this" in static methods.
        new Foo().instanceMethod();  // OK because you provide an instance
    }

    public void instanceMethod() {}
}
于 2012-12-23T21:58:04.027 回答
4

因为调用静态方法不需要类的对象,在哪里调用你需要的非静态方法,

静态方法与非静态方法与状态(对象)相关联的类相关联

于 2012-12-23T21:57:55.257 回答
1

非静态方法是在实例的上下文中执行的方法。如果没有实例,调用一个实例是没有意义的,因此编译器会阻止您这样做——即它是非法的。

如果一个方法不访问任何实例字段(也就是实例变量),那么它可能应该被更改为一个静态方法。

于 2012-12-23T22:03:43.867 回答
0

非静态方法具有静态方法没有的隐式参数this(因为没有this)单独因为这个事实,不可能从静态方法调用非静态方法。

于 2012-12-23T22:06:12.640 回答
0

静态方法属于类。非静态方法属于一个实例。

非静态方法需要在this其上执行实例 ()。静态方法不需要任何实例,因为类本身就是它所属的实例。

如果我有 100 个对象实例,则每个 nonStatic() 方法调用都会影响不同对象的状态。因此,每个非静态方法都是“不同的”,因为它作用于不同的实体。同时,即使我有 100 个对象实例,调用 staticMethod() 也不会影响任何这些实例,因为它只会影响类的静态成员。

每个静态方法或静态成员变量都有 1 个类和 1 个实例。

对于非静态成员,我们将每个方法都关联到类实例。

因此,如果您能够从静态方法调用非静态方法,那么 100 个实例中的哪一个会受到影响?你看:这没有意义。

于 2012-12-23T22:09:47.117 回答
0

静态方法与类相连。常规方法连接到对象。

在静态方法中,没有可以在其上运行非静态方法的对象。

于 2012-12-24T01:45:07.700 回答
0

从静态方法调用非静态方法并不违法。每当您调用静态方法时,都不需要类的实例,而在非静态情况下则需要。

于 2017-06-13T19:25:23.943 回答