代码之家  ›  专栏  ›  技术社区  ›  VoodooChild

为什么不能从静态方法调用非静态方法?

  •  5
  • VoodooChild  · 技术社区  · 14 年前

    我的类中有一个静态方法[method1],它调用同一类中的另一个方法[method2],而不是静态方法。但这是一个编号。我得到这个错误:

    需要对象引用 非静态字段、方法或 属性“classname.methodname()”

    有人能简要描述一下原因吗?包括其他可能与此相关的事情。

    编辑: 谢谢你们的回复,伙计们!

    这是我的一个小错误,让我试着解释一下。类是工厂的一部分,工厂具有所有类的实例。但是这个方法找不到,因为它不是由类实现的接口的一部分,而是作为一个助手函数添加的。

    答案也很有帮助!

    8 回复  |  直到 6 年前
        1
  •  22
  •   Yann Ramin    14 年前

    非静态方法需要 实例 班里的除非您传入了一个实例,或者在方法中创建了一个实例,否则您不能调用非静态方法,因为您不知道该方法应该在类的哪个实例上操作。

        2
  •  2
  •   Wallace Breza    14 年前

    在静态方法中,没有类的实例。因此,在不存在实例的情况下,无法对实例调用实例方法。

        3
  •  1
  •   Juha Syrjälä    14 年前

    要调用非静态方法(即实例方法),必须先拥有该方法对象的实例,然后才能调用该方法。

    你真正想做的就是这个。注意 this 方法1中的对象。你没有 在静态方法中可用。

    static void Method1() {
       this.Method2()
    }
    
    void Method2() { }
    
        4
  •  1
  •   Tim Coker    14 年前

    需要类的实例来调用非静态方法。您可以创建一个类名实例,然后这样调用method2:

    public class ClassName
    {
        public static void Method1()
        {
            ClassName c = new ClassName();
            c.Method2();
        }
    
        public void Method2()
        {
            //dostuff
        }
    }
    

    静态关键字基本上将方法标记为可以通过仅引用其类型[类名]来调用。所有非静态方法都必须通过对象的实例引用。

        5
  •  0
  •   jer    14 年前

    因为“静态”方法就是所谓的“类方法”。也就是说,您可以通过类或实例在基于类的语言(如C)中的两种方法之一对对象进行分派。非静态成员可以由其他非静态成员调度到,相反,静态成员只能被其他静态成员调用。

    记住,你可以通过“新”机制从一个到另一个,或者反之亦然。

        6
  •  0
  •   xtofl Adam Rosenfield    14 年前

    定义的静态方法未提供对 this . 因此,它不能调用成员方法。

    如果试图从静态方法调用的成员方法 需要 ,可以将其更改为静态方法。

        7
  •  0
  •   A Ghazal    10 年前

    首先,您需要创建类的实例,以便调用非静态方法或函数。

    public class ClassHelper()
    {
       public static ClassHelper GetInstance()
        {
            ClassHelper instance = null;
    
            if (System.Web.HttpContext.Current == null)
            {
                instance = new ClassHelper();
                return instance;
            }
    
            if (System.Web.HttpContext.Current.Application["CLASSHELPER_INSTANCE"] == null)
            {
                instance = new ClassHelper();
                System.Web.HttpContext.Current.Application["CLASSHELPER_INSTANCE"] = instance;
            }
    
            instance = (ClassHelper)System.Web.HttpContext.Current.Application["CLASSHELPER_INSTANCE"];
    
            return instance;
        }
    
    
       public string Test()
       {
           return "test123";
       }
    
    }
    

    然后您可以如下调用函数:

    textBox1.Text = ClassHelper.GetInstance().Test();
    
        8
  •  0
  •   Neri Barakat    6 年前

    静态成员只能直接访问类的其他静态成员,静态方法不能直接访问同一类的非静态成员。

    静态方法或属性只能直接调用同一类的其他静态方法或属性(即,单独使用方法名),并且只能直接操作同一类中的静态变量。

    要访问类的非静态成员,静态方法或属性必须使用对该类对象的引用。回想一下,静态方法与整个类相关,而非静态方法与类的特定对象(实例)相关,并且可以操作该对象的实例变量(以及类的静态成员)。

    一个类的许多对象,每个对象都有自己的实例变量副本,可能同时存在。假设一个静态方法直接调用一个非静态方法。该方法如何知道要操作哪个对象的实例变量?如果在调用非静态方法时不存在该类的对象,会发生什么? Source