静态方法与实例方法的区分

Java系列之:看似简单的问题 静态方法和实例化方法的区别

Java程序启动class文件被读取时类被加载,如果有static方法,此时会分配内存,非static方法实例化类时才在内存中分配控件存储,引用存储在堆栈中,实体存储在堆中

最大的区别在于内存。

静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,

所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。

任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。

静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,

而且静态内存是有限制的,太多了程序会启动不了。

方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要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
我想不能兼容多种问题情况。而且也有线程安全的问题。

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

我特意以“你怎么理解并使用静态方法和实例化方法的?”这样的问题询问了多位程序员,他们开发的语言也不尽相同(c
、c++、java、c#)

以下是他们的回答:

张伟说:

几乎没有区别,如果不需要实例化,就用静态方法;如果为了稳妥,就用实例方法,这样才可调用其他实例方法和变量。

萧远山说:

静态方法比较少用,因为他在一启动就实例化了,比较占资源,当然,,配合单例模式还是比较好用的

比较多的用在数据连接上,我避免使用的原则就是减少资源消耗。

张新波说:

静态方法意味着我在调用前不需要进行对其所属的类进行new操作,我主要会在工具类里面用到静态方法。

向详说:

静态就是类的,实例就是对象的。

静态方法和实例方法的区别之处还有一个地方:静态方法不需要依赖类当中的属性,能在这个方法中封闭的完成一个功能。实例方法更多的会使用到类当中的属性。

winson_张林说:

最大的区别在于内存

静态方法在程序开始时生成内存,实例方法在程序运行中生成内存

 showlover说:

静态方法与实例方法各有自己的用处...

是定义成静态方法,还是定义成实例方法,还要看具体情况,比如方法本身与类型没有太大的关系,可以定义成静态方法..

用实例方法,当然需要你先创建实例,才能调用实例方法,而静态方法则不需要..

从性能上说,静态方法效率要稍微高一些,但是它会常驻内存...

一些情况下使用静态方法是有好处的,因为对于静态方法无论你有多少个实例,

内存中要维护的一份拷贝。同时,某些方法,确实使用静态是比较恰当的..

Q.yuhen说:

这个问题牵扯到的东西比较多,诸如设计模式等等。简单点说,静态方法用来执行无状态的一个完整操作,实例方法则相反,它通常是一个完整逻辑的一部分,并且需要维护一定的状态值。

如果用内存和效率来区分使用Static Method、Instance Method
就回到过去结构化编程了。使用那种方法的根本出发点还是围绕面向对象来进行的。

陈亮说:

静态方法和全局函数差不多的,实例方法是一个类里面的方法。

如果从线程安全、性能、兼容性上来看也是选用实例化方法为宜。

我们为什么要把方法区分为:静态方法和实例化方法?

如果我们继续深入研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。

拿别人一个例子说事:

比如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的。

Java静态初始化,实例初始化以及构造方法

首先有三个概念需要了解:

一.静态初始化:是指执行静态初始化块里面的内容。

二.实例初始化:是指执行实例初始化块里面的内容。

三.构造方法:一个名称跟类的名称一样的方法,特殊在于不带返回值。

我们先来看一段程序结果:

执行结果:

this is static method~

this is static block

如果把

的注释去掉的话,运行结果为:

this is static method~

this is static block

初始化块:0

this is Book‘s constructor~

执行顺序:(优先级从高到低。)静态代码块>main方法>实例初始化块>构造代码块>构造方法。”

总结:

仅从代码执行的角度来探讨Java加载类、创建对象的过程,并没有深入到JVM的机制中去。

1.一个对象第一次被创建时,先要加载该对象所属的类,即对应的.class文件,当然如果类已经加载,再次创建该类的对象时,就不再需要重新加载类了。而一个类加载的时候,有三个部分需要加载,一个是静态变量,再然后是静态方法,然后是静态初始化块。(见到第一次执行结果就知道了,由于没有创建实例所以初始化块不执行)

2.然后开始创建该类的实例了,当然如果静态方法跟静态初始化对象中有对象的创建时,就继续加载该对象的类,当然已经加载了该对象的类的话就不需要再次加载了。那么对象实例的创建过程是什么呢?首先是成员变量的引入,然后是实例初始化块,之后才是构造方法,构造方法执行完成之后才算把这个对象给创建出来了。

在这个过程中,真正可以编写执行代码的地方有三个,静态初始化、实例初始化以及构造方法。从以上的分析中我们可以看到,这三个代码块的执行顺序是先类的静态初始化,再实例初始化,最后执行构造方法。也就是说,静态初始化是属于类加载的过程,所以它只执行一次,而实例初始化是每个对象创建时都会执行一次,而构造方法跟实例初始化其实也差不多,不过它在实例初始化之后执行,而且构造方法可以重载多个,执行哪个构造方法是根据你的选择来的。

可以把main () 函数加一条语句看看:

此时执行结果为:

this is static method~

this is static block

初始化块:0

this is Book‘s constructor~

初始化块:1

this is Book‘s constructor~

这说明实例初始化是每个对象创建时都会执行的。

时间: 2024-10-21 00:08:37

静态方法与实例方法的区分的相关文章

Js类的静态方法与实例方法区分以及jQuery如何拓展两种方法

上学时C#老师讲到对象有两类方法,静态方法(Static)和实例方法(非Static),当时不理解静态是为何意,只是强记. 后来从事了前端的工作,一直在对类(即对象,Js中严格来说没有类的定义,虽众所周知,这里还是赘述一番,以免产生歧义)的操作上,严重缺乏整体概念,最近看extetnd中再次提到拓展静态方法与实例方法,故而再次百度,才幡然领悟,其实一直有用,只是不知其专业术语呀,哈哈~ 静态方法,属于类的方法,即类可以直接调用的方法.为类所有实例化对象所共用(但不能用实例对象之间调用),所以静态

Python的类方法,静态方法,实例方法的区别

Python的方法并不想C#,Java这些编译性语言那样严格的区分静态方法和实例方法.也就是说Python的静态方法,类方法和实例方法只是在调用上有区别,类型和实例都可以调用.一般规则如下:A:实例方法:没有@classmethod和@staticmethod标记的方法是实例方法.假设这个有n个比传参数,类型调用的时候需要给n个参数传参.而实例调用时则只能传n-1个参数,因为第一个参数被系统默认传递了实例本身:因为有这个规定,所以实例方法如果没有参数,则实例是无法调用的,但类型可以调用.B:类方

程序员过关斩将--来自于静态方法和实例方法的联想翩翩

这两周没有妹子来找我问问题,有点小伤感,所以耽误更新了.哈哈,别当真,因为菜菜这两周周末都有事(你可以认为去公司加班了),实在是没有精力,忘各位见谅!! 以下为菜菜自己观点,不代表任何妹子的观点,请轻喷 ◆◆ 面向对象 ◆◆ 作为一个久经考验并得到业界肯定的编程思想莫过于面向对象编程思想了. 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构.CAD技术.人工

iOS开发——语法篇OC篇&静态方法与实例方法

静态方法与实例方法 方法是类的行为,写在接口和实现两个文件中.在接口部分声明方法,在实现部分实现方法. 1.类方法与实例方法 Objective-C中的类可以声明两种类型的方法:实例方法和类方法.实例方法就是一个方法,它在类的一个具体实例的范围内执行.也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例.而类方法,比较起来,也就是说,不需要你创建一个实例. +表示类方法,就是类调用方法,不依赖与任何对象的方法,类似于c语言的static关键字 static函数.-表示是实例(对象)方法,

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

静态方法和实例方法的区别主要体现在两个方面:   在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就是说,调用静态方法可以无需创建对象.   静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制.   下面几个例子展示了这一区别.   1.调用静态方法示例. //-----------hasStaticMethod.j

静态方法和实例方法(mark)

借花献佛[转自 ivony's blog] 关于静态方法和实例方法的一些误区. 一.    静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存.     事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载.调用的速度基本上没有差别.  二.    静态方法在堆上分配内存,实例方法在堆栈上.     事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的.  三.    实例方法需要

静态方法和实例方法的区别(转)

静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就是说,调用静态方法可以无需创建对象. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制. 下面几个例子展示了这一区别. 1.调用静态方法示例. //-----------hasStaticMethod.java-----

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

基础知识 对于面向对象的语言来说,所有类型都是从System.Object类型派生,正是由于这个原因,保证了每个类型都有一组最基本的方法,也就是从他们的父类System.Object继承古来的方法,Object的定义如下面的代码所示,System.Object所定义的基本方法中基本包含了CLR所有的方法类型,静态方法(Static修饰,属于类成员).虚方法(Virtural修饰,属于实例成员).实例方法(普通的方法,属于实例成员).可能会有人说还有抽象方法,其实抽象方法最后的编译也是一个虚方法.

编写高质量代码改善C#程序的157个建议——建议100:静态方法和实例方法没有区别

建议100:静态方法和实例方法没有区别 静态方法在加载时机和内存使用上和实例方法完全一致.在这里,我们先引出一个概念“类型对象”.比如类型Person,我们都知道new Person() 会产生一个对象,这个对象叫做“实例对象”,它在运行时会加载到GC Heap上.而“类型对象”是指代表Person类型本身的那个对象,这个对象在第一次使用类型时被加载到Loader Heap上.类型对象包括其自身的指针.自身的同步索引快.静态字段,以及一个方法表.在这个方法表中,无论是静态方法还是实例方法都会被存