繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM