语言中,静态方法和非静态方法你懂多少?
2012-02-25 20:41
239 查看
来源本人CSDN博客:/article/2762828.html
欢迎您莅临指导,共同交流,共同进步。
问题来源:昨天给八期的师弟辅导机房收费系统的时候,发现一个有意思的问题。就是Bll和Dal层,D层是静态方法,B层调用D层的方法的时候,直接调用。
当时我看到这个问题,感觉按照常规的思维来想这个问题,肯定是先new一下D层,然后再调用。这个问题仔细想想还真有点不知所措。
经过一番了解:
一、方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要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 我想不能兼容多种问题情况。而且也有线程安全的问题。
开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。
从内存分析
因为上面的问题一起下面的问题,当程序运行了一会,报Connection超过了最大连接数。这个问题是怎么回事?
原因:最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。
静态方法和非静态方法对比总结:
①静态成员属于类所有,非静态成员属于类的实例所有。
②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;
非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。
总括:实例化方法使用和稳妥,静态方法少使用
欢迎您莅临指导,共同交流,共同进步。
问题来源:昨天给八期的师弟辅导机房收费系统的时候,发现一个有意思的问题。就是Bll和Dal层,D层是静态方法,B层调用D层的方法的时候,直接调用。
当时我看到这个问题,感觉按照常规的思维来想这个问题,肯定是先new一下D层,然后再调用。这个问题仔细想想还真有点不知所措。
经过一番了解:
一、方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要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 我想不能兼容多种问题情况。而且也有线程安全的问题。
开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。
从内存分析
因为上面的问题一起下面的问题,当程序运行了一会,报Connection超过了最大连接数。这个问题是怎么回事?
原因:最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。
静态方法和非静态方法对比总结:
①静态成员属于类所有,非静态成员属于类的实例所有。
②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;
非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。
总括:实例化方法使用和稳妥,静态方法少使用
相关文章推荐
- 语言中,静态方法和非静态方法你懂多少?
- [转]语言中,静态方法和非静态方法你懂多少?
- C++通过jni调用java静态方法和非静态方法
- C#中静态方法和非静态方法的区别(二)
- java中静态方法和非静态方法覆盖的区别
- java中静态方法和非静态方法的区别
- PHP静态方法和非静态方法的区别
- python语言是动态语言、给类添加属性、方法、静态方法和类方法、__slots__()、python中的生成器、yield的用法
- Java实例说明 静态方法和非静态方法的区别
- 静态方法和非静态方法
- python语言是动态语言、给类添加属性、方法、静态方法和类方法、__slots__()、python中的生成器、yield的用法
- 静态方法使用类的非静态成员的方法
- C#中静态方法和非静态方法的区别
- java中静态方法和非静态方法调用的一点小困扰,已解决。
- 静态方法和非静态方法的区别是什么
- 关于静态方法和非静态方法的心得
- (4.1.27.10)Jni回调java静态方法和非静态方法
- 浅谈PHP中静态方法和非静态方法的相互调用
- java中静态方法和非静态方法的存储
- java调用静态方法和非静态的方法