有人可以解释一下为什么静态方法调用非静态方法是非法的吗?
答案 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)
从静态方法调用非静态方法并不违法。无论何时调用静态方法,都不需要类的实例,而在非静态情况下则需要。