[英]Invoke a non static method from a static method
谁能解释一下为什么静态方法调用非静态方法是非法的?
非静态方法是一种作用于特定实例 (对象)并可以访问该对象成员的实例方法。 静态方法不与特定实例相关联。
如果提供实例,则调用非静态方法是合法的:
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个实例。
对于非静态成员,我们具有与类实例关联的每个方法。
因此,如果您能够从静态方法中调用nonStatic方法,那么将影响100个实例中的哪一个? 您会看到:这没有道理。
静态方法与该类连接。 常规方法连接到对象。
在静态方法中,没有可以运行非静态方法的对象。
从静态方法中调用非静态方法是非法的。 每当调用静态方法时,都不需要类的实例,而在非静态情况下则需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.