谁能解释一下为什么静态方法调用非静态方法是非法的?
7 回答
非静态方法是作用于特定实例(对象)的实例方法,并且可以访问该对象的成员。静态方法与特定实例无关。
如果您提供实例,则调用非静态方法是合法的:
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() {}
}
因为调用静态方法不需要类的对象,在哪里调用你需要的非静态方法,
静态方法与非静态方法与状态(对象)相关联的类相关联
非静态方法是在实例的上下文中执行的方法。如果没有实例,调用一个实例是没有意义的,因此编译器会阻止您这样做——即它是非法的。
如果一个方法不访问任何实例字段(也就是实例变量),那么它可能应该被更改为一个静态方法。
非静态方法具有静态方法没有的隐式参数this
(因为没有this
)单独因为这个事实,不可能从静态方法调用非静态方法。
静态方法属于类。非静态方法属于一个实例。
非静态方法需要在this
其上执行实例 ()。静态方法不需要任何实例,因为类本身就是它所属的实例。
如果我有 100 个对象实例,则每个 nonStatic() 方法调用都会影响不同对象的状态。因此,每个非静态方法都是“不同的”,因为它作用于不同的实体。同时,即使我有 100 个对象实例,调用 staticMethod() 也不会影响任何这些实例,因为它只会影响类的静态成员。
每个静态方法或静态成员变量都有 1 个类和 1 个实例。
对于非静态成员,我们将每个方法都关联到类实例。
因此,如果您能够从静态方法调用非静态方法,那么 100 个实例中的哪一个会受到影响?你看:这没有意义。
静态方法与类相连。常规方法连接到对象。
在静态方法中,没有可以在其上运行非静态方法的对象。
从静态方法调用非静态方法并不违法。每当您调用静态方法时,都不需要类的实例,而在非静态情况下则需要。