为什么静态方法只能调用静态方法而不能调用非静态方法

3
可能重复:为什么我只能从静态函数访问静态成员? 当我试图从静态方法中调用普通方法时,我遇到了错误:
需要对象引用才能访问非静态字段、方法或属性
这意味着我需要创建该类的对象,然后调用非静态方法。如果要直接调用该方法,则必须将该方法声明为静态。
但是,在这种情况下,调用方法和被调用方法属于同一类。那么为什么我需要在从静态方法调用时创建一个对象,而我可以从非静态方法调用非静态方法。
例如:
class Program
    {
        //public void outTestMethod(int x,out int y)
        //{
        //    y = x;
        //}
        static void Main(string[] args)
        {
            int a = 10;
            int b = 100;

            outTestMethod(a,out b); 
        }

        private  void outTestMethod(int x, out int y)
        {
            y = x;
        }
    }

错误:非静态字段、方法或属性需要对象引用


在你的例子中,你只需要写private static void outTestMethod就可以了,它会正常工作。你不需要像你说的那样“创建一个对象”。 - Icarus
错误的意思就是它所说的那样;非静态(实例)方法可以访问 Program 实例的成员(这个特定的示例没有任何),而静态方法只能访问静态成员(因为它没有实例引用)。这是因为类的多个实例可能存在。 - Dan Bryant
5个回答

7

静态方法可以调用实例方法,但需要一个实例来调用它们。特别注意的是,这个实例可以来自任何地方,例如:

int a = 10;
int b = 100;
Program program = new Program();
program.outTestMethod(a,out b);

实例方法与类型的特定实例相关联,而静态方法与整个类型相关联 - 对于其他类型的成员也是如此。因此,要调用实例方法,您需要知道您感兴趣的哪个实例。例如,拥有以下代码将毫无意义:

string name = Person.Name;

因为你需要知道你正在谈论的是哪个人:

Person person = FetchPersonFromSomewhere();
string name = person.Name;

通常实例方法会使用或修改实例的状态

这使得更加有意义。


5
考虑一下这个比喻。
一个静态方法就像电梯门外的按钮。任何人都可以看到它并按下它,从而使某些事情发生(例如,其中一个电梯将会到达该楼层)。
非静态方法就像特定电梯内部的按钮。它们仅控制该电梯,而不是其他电梯。

这太棒了!我实际上会在需要解释静态方法时使用它。 - Prithvish Baidya

1
一个非静态方法也被称为实例方法。这意味着通常有一块数据,特定于方法所操作的实例(对象)。
你不能从静态方法调用非静态或实例方法,因为它不知道要操作哪个实例或对象。

0

因为没有实例可以调用该方法。您应该创建另一个类并在其上进行测试:

class Program
{
    static void Main(string[] args)
    {
        int a = 10;
        int b = 100;
        Test testclass = new Test();
        testclass.outTestMethod(a,out b); 
    }
}

class Test
{

    public void outTestMethod(int x, out int y)
    {
        y = x;
    }
}

0

你了解实例方法和静态方法之间的区别吗?

实例方法即使没有作为参数传递,也可以访问this对象,实际上就像是框架为你传递了一个与类相同类型的不可见参数。

静态方法没有this对象,不能调用实例方法,因为它没有任何东西可以以不可见的方式传递给this...

听起来像个笑话,但这就是我看待它的方式 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接