A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xt654005440 中级黑马   /  2013-7-28 08:40  /  2044 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xt654005440 于 2013-8-1 23:30 编辑

RT:面向对象中,静态方法和非静态方法声明有什么不同,为什么要分静态方法和非静态方法,他们在使用上有什么局限或者不同的地方?请教教我。

9 个回复

倒序浏览
定义的时候的区别
1静态方法定义时需要加关键static,不加就是实例方法


用的时候的区别
1.static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用!也就是 类名.静态方法名  就可以直接用
2实例方法,必须 new出类的实例,通过  实例名.方法名   才能使用

至于为什么要有静态成员??个人理解就是节约内存,可以重用了
解释:
静态方法在内存中有一块单独的存储区,等整个应用程序结束时才被释放
C#静态成员:
①静态成员属于类所有,非静态成员属于类的实例所有。
②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;

回复 使用道具 举报
1静态方法与非静态方法异同点:
              a静态方法和实例方法都在JIT加载类时分配内存,所有对象共享实例方法。
              b静态方法只能由类访问,执行非虚调度;实例方法只能由对象访问,虚方法执行虚调度。未实例化对象便可使用
              c静态方法 不能标记为virtual,abstract,override,静态方法可以被派生类访问,但是不能被派生类覆写。
              d静态方法中不能访问非静态的内容(逻辑上类型对象所有,实例不存在时就可以使用,自然不能访问非静态内容),如静态方法中不能使用this关键字。实例方法却可以访问静态成员(原因静态成员全局共享 先于实例存在,实例自然可以访问)
  2为什么要分静态方法和非静态方法?
             从面向角度而言,静态方法适合实现系统总边缘性的非业务需求,如通用工具类实现,仅仅是提供功能,不需要改变实例的状态,当然静态方法若会改变静态字段 那执行静态方法还需考虑线程安全问题。个人理解为 为类型提供通用的功能,这种
功能并不需要通过对象来完成,减少new对象造成的开销,从这个角度而言 性能应该更高些。(其实不管静态方法或非静态方法
内存上只存在一份,方法执行角度而言性能差别不大),至于区分, 应该从OO角度而言来说吧,比如说为什么要有静态类。
回复 使用道具 举报
C#中的方法有两种:实例方法(通过实例化关键字new才是调用),静态方法(可以直接在程序中.出来).
1静态成员属于类所有,非静态成员属于类的实例所有。
2每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;
静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。
3、C#静态方法属于类所有,类实例化前即可使用。
4、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。
5、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,
这样,C#静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。
C#静态方法是一种特殊的成员方法 它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。
6.static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用!
static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类!
7.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
8.静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存.
回复 使用道具 举报
简单的说,静态方法在程序中你可以直接去调用,不需要new个实例;
回复 使用道具 举报
静态方法和非静态方法
静态方法不用实例化即可通过类名.方法名()来调用
非静态方法要通过实例化一个该类的对象,通过对象.方法名()来调用
比如下面两个类
class C1
{
public static void M1(){}
}
class C2
{
public void M1(){}
}
class Program
{
        static void Main(string[] agrs)
        {
                //当想调用C1中的M1时
                 C1.M1();
                //当想调用C2中的M1时
                 C2 c = new C2();
                 c.M1();
        }
}

回复 使用道具 举报
非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。
回复 使用道具 举报
  • 静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问;
  • 不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问;
  • 一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值;
  • 静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等.
示例:
  1. private class Person
  2. {
  3. /// <summary>
  4. /// 静态方法
  5. /// </summary>
  6. public const String Name = "小李";
  7. /// <summary>
  8. /// 非静态方法
  9. /// </summary>
  10. public String Gender = "男";
  11. }

  12. private static void Main(string[] args)
  13. {
  14. //静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值
  15. Console.WriteLine("Person的静态变量: {0}", Person.Name);

  16. var tmpObj1 = new Person { Gender = "女" };
  17. var tmpObj2 = new Person { Gender = "其他" };
  18. //非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值
  19. Console.WriteLine("Person实体1的非静态变量: {0}", tmpObj1.Gender);
  20. Console.WriteLine("Person实体2的非静态变量: {0}", tmpObj2.Gender);
  21. Console.ReadLine();
  22. }
复制代码
结果:
Person的静态变量: 小李
Person实体1的非静态变量: 女
Person实体2的非静态变量: 其他


回复 使用道具 举报
静态方法与非静态方法的区别:
静态方法可以调用静态方法和非静态方法。
非静态方法只能调用非静态方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马