为什么我们不需要通过对象调用静态方法
本文关键字:对象 调用 静态方法 我们 不需要 为什么 | 更新日期: 2023-09-27 17:57:49
public static void callit(ref int var)
{
var++;
}
public static void main(Object sender, EventArgs e)
{
int num=6;
callit(ref num);
Console.WriteLine(num);
}
但如果here方法callit((不是静态的,那么我必须创建类的对象,然后调用它。
正是因为这就是静态方法的全部意义。
实例方法需要知道调用该方法的类的哪个实例。
instance.Method();
然后它们可以引用类中的实例变量。
另一方面,静态方法不需要实例,但不能访问实例变量。
class.StaticMethod();
例如:
public class ExampleClass
{
public int InstanceNumber { get; set; }
public static void HelpMe()
{
Console.WriteLine("I'm helping you.");
// can't access InstanceNumber, which is an instance member, from a static method.
}
public int Work()
{
return InstanceNumber * 10;
}
}
您可以创建此类的实例来调用该特定实例上的Work()
方法
var example = new ExampleClass();
example.InstanceNumber = 100;
example.Work();
不过,static
关键字意味着您不需要实例引用来调用HelpMe()
方法,因为它绑定到类,而不是类的特定实例
ExampleClass.HelpMe();
我认为MSDN很好地解释了
Static classes and class members are used to create data and functions that can be accessed without creating an instance of the class. Static class members can be used to separate data and behavior that is independent of any object identity: the data and functions do not change regardless of what happens to the object. Static classes can be used when there is no data or behavior in the class that depends on object identity.
您可以在此处找到有关此主题的更多详细信息
如果我正确理解你的问题,这只是C#语法的问题。在您的示例中使用callit(ref num);
没有歧义。我们知道该调用什么方法,因为它是一个静态方法,并且没有附加对象。另一方面,如果callit
不是静态的,编译器将不知道要在其上调用该方法的对象,因为您从调用它是一个静态方法(它没有对象(。因此,您需要创建一个新对象并调用该对象上的方法。
当然,如果两个方法都不是静态的,那么方法调用将对自己进行操作,并且对象也是已知的,所以没有问题。
因为静态方法与类本身相关联,而不是与特定的对象实例相关联。
静态函数在类上工作。成员函数处理实例。
是的,您只能调用对象(实例(的成员函数。没有实例,就没有成员。
静态方法在类型(或类(上调用,而非静态方法在一个类型的实例(即类的对象(上调用。
不能在静态方法中调用非静态方法或非静态变量,因为可能有多个对象(即同一类型的实例(。
静态函数访问任何其他静态函数和实例函数都可以访问的类变量。这意味着,如果您有一个名为static int count
的类变量,则在静态方法中,static increaseCount() { count++; }
将变量count
增加1,而在静态方法static decreaseCount() { count--; }
中将变量count
减少1。
因此,静态函数和实例函数都可以访问静态变量,但静态函数不能访问实例变量。
静态函数也称为类函数。非静态函数也称为实例函数。
静态方法与实例无关,假设有一个man类,其中有非静态的eat方法,还有静态的sleep方法,那么当你创建不同的man实例时,比如man m1,m2。m1和m2的睡眠方式相同,但饮食方式不同。在java中,所有静态变量都存储在堆内存中,堆内存共享所有对象实例。假设在运行时静态变量发生变化,那么它将在我们的情况下共享对象的所有实例。m1和m2。但是,如果您更改非静态变量,它将仅用于对象实例
m1.anSticvariable=1;//更改m2.anSticvariable的值但是m1.nonStaticvariable=1//不会更改m2.nonStaticvariable
希望这能帮助您