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

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

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

【正确】   事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。
    有些方法看似与所在的实例无关,如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. 20160203.CCPP体系详解(0013天)
  2. 如何使用MSTSC命令远程连接服务器或客户端
  3. navicat保存查询语句_还在用 Navicat 的,可以试试这几款免费且好用的 MySQL 客户端...
  4. Hibernate的延迟加载
  5. Nginx配置X-Forwarded-Proto
  6. python字符串类型_Python3的字符串类型(疯狂Python)
  7. Windows server 2008 R2实现多用户远程连接
  8. 手把手教你搭建机器学习+深度学习AI模型
  9. Nginx 安装 启动 停止 重启
  10. SM4算法详解(2021-12-8)
  11. 系统迁移到ssd 开启哪些服务器,如何使用分区助手完美迁移系统到SSD固态硬盘...
  12. Power BI——数据建模案例分析
  13. win10开启cpu虚拟化
  14. 第十章 项目沟通管理和干系人管理
  15. 参考平面及其高度_海图基准面、深度基准、标高等常用参考标准
  16. 一款简易低成本智能割草机的制作——硬件篇
  17. PIC反汇编 MPLAB HEX
  18. python 基础知识点 (一)
  19. 【1错笔记】psd面试——最长回文子序列 动态规划(2000字超详细解题)
  20. linux虚拟机管理面板,linux 虚拟主机面板(免费虚拟主机控制面板)

热门文章

  1. Hyperledger Fabric 节点类型Commiter、Endorser、Leader、Anchor
  2. php发送sql,php学习笔记(二)php与mysql连接与用php发送SQL查询
  3. 实战开发,使用 Spring Session 与 Spring security 完成网站登录改造!!
  4. Spring BeanFactory、ApplicationContext IOC 容器获取与使用
  5. LayaAir 屏幕适配-分辨率、对齐模式
  6. JQuery 制作消息弹出框、按钮点击音效
  7. 阶段3 1.Mybatis_03.自定义Mybatis框架_4.自定义mybatis的编码-解析XML的工具类介绍
  8. JAVA语法——选择排序
  9. 数据结构---最小生成树
  10. 【bzoj1699/USACO2007】Balanced Lineup排队——RMQ问题