从静态方法调用非静态方法

时间:2012-12-23 21:57:03

标签: java

有人可以解释一下为什么静态方法调用非静态方法是非法的吗?

7 个答案:

答案 0 :(得分: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() {}
}

答案 1 :(得分:4)

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

静态方法与非静态方法与state(Object)

相关联的类相关联

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

静态方法属于该类。非静态方法属于实例。

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

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

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

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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