`
ccn1010
  • 浏览: 15002 次
  • 性别: Icon_minigender_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和以后的版本 都采用了方式三,而且特别在开发说明文档中明确的解释了一下。我想应该是从兼容性上考虑的,从性能上方式二并不比方式三真正的高多少。 
------------------------------------------------------------------------- 
我特意以“你怎么理解并使用静态方法和实例化方法的?”这样的问题询问了多位程序员,他们开发的语言也不尽相同(c 、c++、java、c#) 
以下是他们的回答: 
海龙说: 
公用的方法,而且是一些零散的 一般用静态方法 
张伟说:
几乎没有区别,如果不需要实例化,就用静态方法;如果为了稳妥,就用实例方法,这样才可调用其他实例方法和变量 。 
萧远山说:
静态方法比较少用,因为他在一启动就实例化了,比较占资源,当然,,配合单例模式还是比较好用的
比较多的用在数据连接上,我避免使用的原则就是减少资源消耗。 
张新波说:
静态方法意味着我在调用前不需要进行对其所属的类进行new操作,我主要会在工具类里面用到静态方法。 

向详说:
静态就是类的,实例就是对象的。
静态方法和实例方法的区别之处还有一个地方:静态方法不需要依赖类当中的属性,能在这个方法中封闭的完成一个功能。实例方法更多的会使用到类当中的属性。 
winson_张林说:
最大的区别在于内存。
静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,
所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。
静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,
而且静态内存是有限制的,太多了程序会启动不了。 
showlover说:
静态方法与实例方法各有自己的用处... 
是定义成静态方法,还是定义成实例方法,还要看具体情况,比如方法本身与类型没有太大的关系,可以定义成静态方法.. 
用实例方法,当然需要你先创建实例,才能调用实例方法,而静态方法则不需要.. 
从性能上说,静态方法效率要稍微高一些,但是它会常驻内存...
一些情况下使用静态方法是有好处的,因为对于静态方法无论你有多少个实例,
内存中要维护的一份拷贝。同时,某些方法,确实使用静态是比较恰当的.. 
Q.yuhen说:
这个问题牵扯到的东西比较多,诸如设计模式等等。简单点说,静态方法用来执行无状态的一个完整操作,实例方法则相反,它通常是一个完整逻辑的一部分,并且需要维护一定的状态值。
如果用内存和效率来区分使用Static Method、Instance Method 就回到过去结构化编程了。使用那种方法的根本出发点还是围绕面向对象来进行的。 
  
陈亮说: 
静态方法和全局函数差不多的,实例方法是一个类里面的方法。 
  
总结:大家对这个问题都有一个共识:那就是实例化方法更多被使用和稳妥,静态方法少使用。 
有时候我们对静态方法和实例化方法会有一些误解。 
1、大家都以为“ 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。 
事实上,他们都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。 
2、大家都以为“ 静态方法在堆上分配内存,实例方法在堆栈上 
事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。 
方法占不占用更多内存,和它是不是static没什么关系。   
  因为字段是用来存储每个实例对象的信息的,所以字段会占有内存,并且因为每个实例对象的状态都不一致(至少不能认为它们是一致的),所以每个实例对象的所以字段都会在内存中有一分拷贝,也因为这样你才能用它们来区分你现在操作的是哪个对象。   
  但方法不一样,不论有多少个实例对象,它的方法的代码都是一样的,所以只要有一份代码就够了。因此无论是static还是non-static的方法,都只存在一份代码,也就是只占用一份内存空间。   
  同样的代码,为什么运行起来表现却不一样?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是通过方法的参数传进来,另一种就是使用class的成员变量的值……
 
3、大家都以为“实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单 
事实上如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。 
当然你完全可以把所有的实例方法都写成静态的,将实例作为参数传入即可,一般情况下可能不会出什么问题。 
从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象  反之使用静态方法。这只是从面向对象角度上来说的。 
如果从线程安全、性能、兼容性上来看  也是选用实例化方法为宜。 
我们为什么要把方法区分为:静态方法和实例化方法 ? 
如果我们继续深入研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。 
拿别人一个例子说事: 
 比如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的。

 

 

 

 

看完这篇文章忽然让我想起了单例模式   马上Google"单例模式优点"

为什么要使用模式  健壮  降低耦合???  代码的实现

 

 

 

 

 

分享到:
评论

相关推荐

    C#中静态方法和实例化方法的区别、使用

    在C#编程语言中,静态方法和实例化方法是两种不同的方法类型,它们在使用场景和功能上有所区别。理解这些差异对于编写高效且结构良好的代码至关重要。 首先,让我们来看看定义方法的一般格式: ```csharp 访问修饰...

    JAVA静态方法和非静态方法的区别和实例.doc

    静态方法可以访问静态变量和其他静态方法,但不能访问非静态变量和方法。 例如,在以下代码中,我们定义了一个名为 `Test` 的类,其中包含一个静态方法 `test1()`: ```java public class Test { public static ...

    C#静态方法与非静态方法的比较

    - **访问权限**:静态方法可以直接通过类名访问,无需实例化对象;实例方法则需要通过对象实例进行访问。 - **生命周期**:静态方法的生命周期与应用程序相同,只要程序运行,静态方法就存在;而实例方法的生命周期...

    (js)静态与非静态方法

    在JavaScript中,静态方法与非静态方法是面向对象编程中的两个基本概念,它们在类的定义和实例化过程中扮演着重要角色。理解这两者之间的区别对于编写高效、可维护的代码至关重要。 ### 静态方法 #### 定义 静态...

    LINUX C调用JAVA的静态方法和非静态方法(实例方法)小实例

    - `Java源码文件`(如`JavaClass.java`):定义了被C语言调用的Java类和方法。 - 可能还有`Makefile`:用于自动化编译过程。 要理解这个例子,你需要熟悉JNI的API,包括`JNIEnv`指针的使用,以及如何处理Java和C...

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    spring 静态实例化

    ### Spring静态实例化详解 ...无论是通过XML配置还是Java配置,Spring都提供了丰富的工具和技术来支持静态实例化的实现。对于希望深入了解Spring框架的开发者来说,掌握静态实例化的概念和用法是非常有帮助的。

    c++静态成员使用实例

    在C++编程语言中,静态成员是一个非常重要的概念,它为类提供了一种共享数据和功能的方法。静态成员不依赖于任何对象实例,而是属于类本身。本篇将通过两个实例——静态成员函数和静态数据成员,深入探讨它们在C++中...

    实例化Spring bean的两种工厂方法

    这里,`MyStaticFactory`类需要有一个静态的`createBean`方法,Spring容器会调用这个静态方法来实例化`exampleBean`。 3. **工厂方法的优点与注意事项** - **优点:**工厂方法提供了更大的灵活性,可以返回任何...

    Spring的实例工厂方法和静态工厂方法实例代码

    Spring 框架中提供了两种方式来实例化 bean,分别是静态工厂方法和实例工厂方法。下面我们将详细介绍这两种方法的实现和使用。 一、静态工厂方法 静态工厂方法是通过调用静态方法来返回 bean 实例的方式。这种方式...

    Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析

    在Python编程语言中,类方法、实例方法和静态方法是面向对象编程的重要组成部分。它们各自有不同的用途和调用方式,帮助我们更好地组织和管理代码。接下来我们将深入探讨这些概念及其用法。 首先,实例方法是类中最...

    asp.net 页面静态化、生成静态页面实例

    ASP.NET页面静态化主要通过两种方式实现:预编译静态化和运行时动态静态化。 1. 预编译静态化:在网站部署前,开发者可以使用aspnet_compiler工具对整个网站进行预编译,生成一系列的HTML文件。这种方式适用于内容...

    Java中的Static块与静态方法

    1. **类加载时执行**:静态块在类首次被加载到JVM时执行,这是在任何对象实例化之前发生的。 2. **只执行一次**:每个类的静态块在整个程序运行期间只执行一次。 3. **按出现顺序执行**:如果一个类中有多个静态块,...

    c#面向对象静态类、构造方法、静态方法介绍.zip

    它们不能访问类的实例成员(非静态字段和方法),但可以访问静态成员。静态方法通常用于执行不依赖于特定对象状态的操作,例如计算、工具方法等。 在C#中使用静态方法的注意事项: 1. 静态方法不能访问实例成员。 2...

    Java中的静态变量静态方法静态块与静态类.docx

    在一个静态方法中,除了局部变量外,能够访问的外部变量也必须是静态的,能够访问的外部方法也必须是静态的,实例变量和实例方法均不能访问。 静态方法通常是 public 的,作为工具类的工具方法出现。 例如: ```...

    java的静态域实例域

    在Java编程中,类的域...总之,理解和熟练运用Java的静态域和实例域以及它们与构造方法的关系是Java程序员的基本技能。通过合理的设计和使用,可以有效地组织和管理类的状态,为代码的健壮性和可维护性打下坚实基础。

    生成静态的方法

    此外,它们还可以提供更有意义的名称,以及在不暴露构造函数的情况下控制类的实例化。 7. 静态上下文的限制 由于静态成员不依赖于类的实例,因此它们无法访问非静态成员,也不能在多线程环境中保证线程安全。如果...

    Python实例方法、类方法、静态方法区别详解

    d.sleep("XiaoLan") # 通过实例化对象调用静态方法 Dog.sleep("XiaoLan") # 通过类名称调用静态方法 ``` 总结来说,实例方法、类方法和静态方法在Python中都有其独特的用途。了解它们之间的区别有助于更好地组织...

    JavaEE spring静态工厂创建实例

    在JavaEE开发中,Spring框架是广泛使用的轻量级应用框架,它提供了强大的依赖注入(Dependency Injection,简称DI)功能,使得我们能够更好地管理对象的生命...在实际项目中,应根据需求和场景选择最合适的实例化策略。

Global site tag (gtag.js) - Google Analytics