关于静态方法和实例方法的一些误区。

一、  
【错误】  静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。
 
【正确】   事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
 
 
二、
【错误】    静态方法在堆上分配内存,实例方法在堆栈上。
 
【正确】   事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。

三、
【错误】   实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单。

【正确】   事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。
    有些方法看似与所在的实例无关,如IComparer.Compare方法,但实际上每一个实现这个接口的类都只会负责自己类型实例的比较,这是C#1.x规范中没有泛型所带来的历史遗留问题。
    大部分静态方法是与类的实例有关的,如各种Parse方法,他做成静态的原因是他没有实例作为参数。其他的大多是出于语义或者其他目的的考虑。

静态方法和实例方法的区别

  观点1:
  这是一个经常被时时提出来的问题,很多时候我们以为理解了、懂了,但深究一下,我们却发现并不懂。
  方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要new就可以使用 实例化方法需要new了以后才可以使用。。。

  从实际项目开发说起,这里有开发项目的三种方式:
  开发项目中把BLL和DAL分开,在BLL调用DAL的代码。
  一、在DAL中使用静态方法,不创建实例直接调用(大概有很多人都使用这种方式开发 )
  class DAL
  {
  public static string GetUserName(...);
  }
  在BLL中调用:
  DAL.GetUserName();
  二、在DAL中使用实例方法,采用静态成员模式(或Singleton)通过实例来调用:
  class DAL
  {
  public static readonly DAL dal = new DAL();
  public string GetUserName(...);
  }
  在BLL中调用:
  DAL.dal.GetUserName();
  三、在DAL中使用实例方法,每次调用之前先创建DAL对象的实例:
  class DAL
  {
  public string GetUserName(...);
  }
  在BLL中调用:
  DAL dal = new DAL();
  dal.GetUserName();
  ---------------------------------------------------------------
  开发方式一:我以为在一些情况下(比如 调用多个数据库、GetUserName(...)内部处理操作部分)会出现线程安全的嫌疑。这种开发方式不用New出对象,所以很普遍。
  开发方式二:应该多是应用在cs模式下,DAL在整个项目只会有一个对象存在,如果出现在B/S 我想不能兼容多种问题情况。而且也有线程安全的问题。
  开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。
  特别说明一下:在MS的pet3.0以前的版本 都采用了方式二,而到pet3.0和以后的版本 都采用了方式三,而且特别在开发说明文档中明确的解释了一下。我想应该是从兼容性上考虑的,从性能上方式二并不比方式三真正的高多少。
  
  
  观点2:
  最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
  任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。
  
  总结:
  大家对这个问题都有一个共识:那就是实例化方法更多被使用和稳妥,静态方法少使用。如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。
  
  补充内容:
  静态成员与非静态成员比较:
  
    ①静态成员属于类所有,非静态成员属于类的实例所有。
    ②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;
    非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,
    类的静态成员在内存中只占同一块区域。
    静态方法与非静态方法:
    1、静态方法属于类所有,类实例化前即可使用。
    2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。
    3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,
    
    static内部只能出现static变量和其他static方法!而且static方法中还不能使用this.... 等关键字..因为它是属于整个类!
    2.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
    3.静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存.

转载于:https://www.cnblogs.com/dfyg-xiaoxiao/p/7213773.html

静态方和和实例方法的区别相关推荐

  1. java 内存 静态_Java内存的 静态方法和实例方法的区别及使用场景

    注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1.(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2.非静态变量,new出来的对象存放在堆内存,所有局部变 ...

  2. java 静态方法和实例方法的区别

    静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方 ...

  3. java 静态方法 实例方法的区别_java 静态方法和实例方法的区别

    静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方 ...

  4. java 静态方法与实例方法的区别_静态方法与实例方法的区分

    Java系列之:看似简单的问题 静态方法和实例化方法的区别 Java程序启动class文件被读取时类被加载,如果有static方法,此时会分配内存,非static方法实例化类时才在内存中分配控件存储, ...

  5. C++静态库与动态库的区别?

    C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  6. 类变量,实例变量的区别以及类方法和实例方法的区别

    一.类变量和实例变量的区别 1.类变量是属于是所有对象的,用static修饰,实例变量是属于某个对象的 2.类变量也叫静态变量,不需要通过创建实例就可以调用.而实例变量需要通过对象来访问,即需要创建对 ...

  7. Java内存的一点理解, 静态方法和实例方法的区别及使用场景

    注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1.(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2.非静态变量,new出来的对象存放在堆内存,所有局部变 ...

  8. 深入浅出剖析静态方法和实例方法的区别

    这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简 ...

  9. 转:静态方法是实例方法的区别

    这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简 ...

  10. 类方法与实例方法的区别

    类方法与实例方法的区别 1.类方法--用static修饰的方法. 由于类方法是属于整个类的,不属于类的某一个实例(对象) 即类方法体有如下限制: 1.类方法中不能引用实例变量: 2.类方法中不能调用类 ...

最新文章

  1. Flask-Email实现发送大量的电子邮件(可以限制发送的邮件数)
  2. BZOJ 1040 骑士
  3. 信息检索导论的课件——http://home.ustc.edu.cn/~zhufengx/ir/pdf/
  4. 没有安装hiredis
  5. 剑指offer之二叉树的下一个结点
  6. bzoj2683bzoj4066
  7. 增效工具_【危中寻机】降本增效生存之道 运用IE基础工具提升制造效率
  8. 4095: 韩信点兵
  9. oracle无效的存储过程怎么解决,oracle数据库 编译无效存储过程
  10. 转:POJ先做完这50题再说
  11. [杂]实用工具与链接
  12. 第九家面试(上海富勒信息科技有限公司 )
  13. 量子信息与量子计算_为什么2020年代属于量子计算
  14. 高等代数--双线性空间与辛空间
  15. MHA Failover测试-上
  16. 16.光照(平行光)
  17. 状态压缩:对动态规划进行降维打击
  18. 智能硬件的一些框架性内容
  19. 初遇QT——遇见QT遇见你,不负代码不负卿
  20. 如何在html的form提交时排除某些input field的内容

热门文章

  1. Shell 脚本 ssh免密码 登录 远程服务器 sshpass用法示例
  2. 多版本并发控制MVCC和乐观锁OCC 是什么 区别
  3. CMakeLists.txt是什么
  4. 基于SSM的NBA篮球球队运营系统
  5. java实现复原IP地址_LeetCode 力扣 93. 复原IP地址
  6. 设计模式GOF23之工厂模式01
  7. python加载动态库出错_浅析python 动态库m.so.1.0错误问题
  8. maven 编译出错解决
  9. LayaAir 屏幕适配-分辨率、对齐模式
  10. Java SE 随机数生成器 Random