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

 一、方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要new就可以使用 实例化方法需要new了以后才可以使用。。。。我们真的理解了吗?

          二、从实际的项目开发说起,这个问题的答案是这样的:

                  开发项目中把BLL和DAL分开,在BLL调用DAL的代码。        

[csharp]  view plain  copy
  1. <span style="white-space:pre">  </span>一、在DAL中使用静态方法,不创建实例直接调用(大概有很多人都使用这种方式开发 )            

[csharp]  view plain  copy
  1. class DAL  
  2. {  
  3. public static string GetUserName(...);  
  4. }  
  5. 在BLL中调用:  
  6. DAL.GetUserName();  
二、在DAL中使用实例方法,采用静态成员模式(或Singleton)通过实例来调用:

[csharp]  view plain  copy
  1. class DAL  
  2. {  
  3. public static readonly DAL dal = new DAL();  
  4. public string GetUserName(...);  
  5. }  
  6. 在BLL中调用:  
  7. DAL.dal.GetUserName();  
三、在DAL中使用实例方法,每次调用之前先创建DAL对象的实例:

[csharp]  view plain  copy
  1. class DAL  
  2. {  
  3. public string GetUserName(...);  
  4. }  
  5. 在BLL中调用:  
  6. DAL dal = new DAL();  
  7. dal.GetUserName();  
           上述实例分析:

                  开发方式一:我以为在一些情况下(比如调用多个数据库、GetUserName(...)内部处理操作部分)会出现线程安全的嫌疑。这种开发方式不用New出对象,所以很普遍。

                  开发方式二:应该多是应用在cs模式下,DAL在整个项目只会有一个对象存在,如果出现在B/S 我想不能兼容多种问题情况。而且也有线程安全的问题。

                  开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。

从内存分析

        因为上面的问题一起下面的问题,当程序运行了一会,报Connection超过了最大连接数。这个问题是怎么回事?

        原因:最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。

        任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。  

        静态方法和非静态方法对比总结:

       ①静态成员属于类所有,非静态成员属于类的实例所有。

  每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;

  非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。 

        总括:大家对这个问题都有一个共识:那就是实例化方法更多被使用和稳妥,静态方法少使用。如果从线程安全、性能、兼容性上来看也是选用实例化方法为宜。

### 静态方法实例方法的主要区别及用法 #### 方法定义位置 静态方法(Static Methods)属于类本身,而非某个具体的对象实例。因此,它可以通过类名直接调用,无需创建该类的任何实例[^2]。相反,实例方法(Instance Methods)则依赖于具体对象的存在,只有在创建了类的一个实例之后才能被调用。 #### 关键字修饰 静态方法需要用 `static` 关键字进行声明,表明其独立于任何一个特定的对象之外运行;而实例方法不需额外的关键字标记,因为它们默认绑定到每一个单独的对象上[^1]。 #### 调用方式差异 由于上述特性决定着两者不同的调用形式——对于静态方法来说可以直接经由“类名.方法名()”的形式完成调用过程;而对于实例方法而言,则必须先构建出对应类型的实体后再利用“对象引用变量.方法名()”这样的句式来进行访问[^4]。 #### 可访问成员范围的不同 - **静态方法**: 它们仅能操作同样标注有 `static` 的字段或者其它同类别的函数资源(即所谓的类级元素),无法触及那些隶属于各个个体独有的非共享数据项比如普通的实例属性等等。 - **实例方法**: 这些常规意义上的行为单元能够自由地获取当前所属结构内部的一切组成部分,无论是共有的还是私密性的状态信息均在其掌控之中[^3]。 以下是基于 Java 编程语言展示两者的简单例子: ```java public class MethodExample { private int instanceVariable; private static String staticVariable; public void setInstanceVariable(int value){ this.instanceVariable = value; // 正常设置实例变量 } public int getInstanceVariable(){ return this.instanceVariable; // 返回实例变量值 } public static void setStaticVariable(String newValue){ staticVariable=newValue;// 修改静态变量的内容 } public static String getStaticVariable(){ return staticVariable; // 获取静态变量内容 } public static void main(String[] args) { System.out.println(MethodExample.getStaticVariable()); // 输出 null MethodExample.setStaticVariable("Hello Static"); System.out.println(MethodExample.getStaticVariable()); // 输出 Hello Static /* 下面尝试错误示范 */ //System.out.println(new MethodExample().getInstanceVariable()); /* * 上述语句会报错,因为在main中我们还没有初始化instanceVariable, * 所以如果要打印这个值的话应该先给它赋初值才行。 */ MethodExample exampleObject = new MethodExample(); exampleObject.setInstanceVariable(987); System.out.println(exampleObject.getInstanceVariable());// 输出 987 } } ``` 以上代码片段清晰展现了如何分别处理静态非静态成分之间的交互逻辑关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值