static这个妹子,如果你想泡上她,真的得需要动脑力,而不是动每个男人都会的体力……
(2014-2-4声明:我在分析static时写到“当然也可以先创建对象,再通过对象来调用”,这是极其错误的!实验证明:对于静态成员,只能通过类名.静态成员名来调用,而无法通过一个具体的对象引用来调用,因为静态成员是不属于某一个对象的,而是属于某一个类的,对我的失误特此道歉!我又更深入地分析了静态变量,在我的另一篇文章中,敬请阅读……)
一:这个妹子的个性……
从内存分析上看,静态变量会被存放在静态存储区中(注意区分java中存放静态变量和字符串常量的data segment,c#中所有的静态成员都存放在静态存储区中,不要搞混了)。静态方法和静态变量呢都不属于任何一个对象,而是属于一个整个的类。像非静态的成员变量会单独属于一个对象,创建几个对象,在每个对象中都会包含这个成员变量,但静态变量就在静态存储区中,它在整个程序运行过程中,独一份!
从一段程序理解静态变量不属于任何一个对象:
如上图所示,静态变量sid存在于静态存储区中(图片中所写的data segment系我的失误,应该就是静态存储区),每次new Person时,因为构造方法中有sid ++;所以每new出一个人,其sid的值都会加1。
二:怎么同static妹子搭讪呢……
1)对于静态变量和静态方法,只能用类名.变量名/类名.方法名来调用。如果调用静态变量名和静态方法时,在同一个类中,则可以省去类名,即直接写其变量名或方法名,即可实现调用。(补充……静态变量属于类变量,不属于任何一个方法,在C#中,一个方法内定义一个静态变量是编译报错的!如何理解这一点呢?这样想……方法内的局部变量在方法执行完后会自动销毁,但静态变量在程序运行中就独一份,销毁不了也不能销毁,所以编译器就不让它被定义在方法内……)
2)为何非静态变量或静态方法必须要创建对象后才能调用呢……
之前我们说过静态变量和静态方法不属于任何一个对象,是个公用的,所以不创建对象就能使用呀。但非静态的可就不行了……非静态的都存在于自己的单独的对象中才能被使用,所以你不创建对象,怎么能使用这些非静态的变量和方法呀……
3)为何静态的方法中不能直接调用非静态的变量,必须创建对象后才能调用……
静态的方法就是不针对于任何一个对象,没有任何一个对象可以托付终身,但非静态的变量必须存在于一个对象中,所以,你在这样一个没有任何对象的方法中想要直接调用非静态的变量,那非静态的变量肯定不会听你的话,因为人家连个调用它的对象也没有呀,所以此时必须要在非静态的方法中new出一个对象,然后用这个对象去调用非静态的方法才行……比如我们大家最熟悉的static void main(string[] args)
最后,泡妹子,真的需要头脑,泡上之后,才再去考虑自己的体力如何呢……