注意:变量指基本数据类型非对象,局部变量不能被静态修饰

1、(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区

2、非静态变量,new出来的对象存放在堆内存,所有局部变量和引用地址存放在栈内存

3、方法(包括静态方法)存放在code segment(方法块),存放代码片段,且只存放一次

public class Cat {

//private static int sid = 0;

private int sid = 0;

private String name;

int id;

Cat(String name) {

this.name = name;

id = sid++;

}

public void info(){

System.out.println

("My name is "+name+" No."+id);

}

public static void main(String arg[]){

//Cat.sid = 100;

Cat mimi = new Cat("mimi");

mimi.sid = 2000;

Cat pipi = new Cat("pipi");

mimi.info();

pipi.info();

}

静态方法和实例方法区别及使用场景

从实际项目开发说起,这里有开发项目的三种方式:

开发项目中把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#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。

拿别人一个例子说事:

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

java 内存 静态_Java内存的 静态方法和实例方法的区别及使用场景相关推荐

  1. Java内存的一点理解, 静态方法和实例方法的区别及使用场景

    注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1.(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2.非静态变量,new出来的对象存放在堆内存,所有局部变 ...

  2. java 静态方法 实例方法的区别_java 静态方法和实例方法的区别

    静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方 ...

  3. java 静态方法与实例方法的区别_静态方法与实例方法的区分

    Java系列之:看似简单的问题 静态方法和实例化方法的区别 Java程序启动class文件被读取时类被加载,如果有static方法,此时会分配内存,非static方法实例化类时才在内存中分配控件存储, ...

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

    静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方 ...

  5. 深入浅出剖析静态方法和实例方法的区别

    这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简 ...

  6. 转:静态方法是实例方法的区别

    这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简 ...

  7. java 内存 静态_java中内存分配以及static的用法(转)

    JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...

  8. JAVA 继承内存模型_Java内存模型

    JVM的组成 类加载器(classloader) 执行引擎(execution engine) 运行时数据区域(runtime data area) 对于Java程序员来说,在虚拟机自动内存管理机制下 ...

  9. java gc原理_Java内存管理以及GC工作原理

    1.内存管理简介 内存管理的职责为分配内存,回收内存. 没有自动内存管理的语言/平台容易发生错误. 典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知. 另一 ...

最新文章

  1. 图解VC#版DirectX开发教程二 - 摄像机
  2. 指针:自定义函数sumDiff(),调用它来求两个数的和、差
  3. cudnn下载_Windows10安装 cuDNN 方法
  4. java继承类型的用法_详解Java中使用externds关键字继承类的用法
  5. 配置Tomcat使用HTTP/2
  6. c#象棋程序_C ++程序确定象棋方块的颜色
  7. 三大开源生信基础教程(bookdown编写,源码可作为模板)和视频课程
  8. python新特性_Python3.6正式版新特性预览
  9. 再记AE与AO的区别与联系
  10. fastreport按条件查询_查询代价的
  11. 微信小程序下载文件,保存文件功能总结
  12. 通过vb代码将多个excel合并成一个
  13. android项目查看sdk版本号,怎查看Android项目的Android版本
  14. 路由器设置虚拟服务器王者人生,王者人生位置修改 | 手游网游页游攻略大全
  15. 岁月温柔-23 妈妈转到省医院第3天 突然icu有床位了
  16. php网站系统说明,PHP电影网站系统光线CMS(GXCMS)模板制作标签说明
  17. Windows/Ubuntu双系统磁盘管理中删除Ubuntu分区后Ubuntu EFI分区无法删除卷解决办法
  18. 机器学习数据的预处理
  19. 浅谈Ble-Mesh的LPN模式
  20. 湖北大学计算机考入清华,当年以749分考入清华大学的高考状元王端鹏,现状如何呢?...

热门文章

  1. python 求素数
  2. Shrio异常The security manager does not implement the WebSecurityManager interface.
  3. 开源数据交换(client)
  4. 什么是Sensor,Sensor的分类?
  5. AD627和OP295GS学习记录
  6. 破解 bytescout Barcode SDK (2.2.0.343)
  7. window及谷歌浏览器常用快捷键
  8. 三维激光扫描后处理软件_三维激光扫描技术在异形建筑幕墙安装中的应用
  9. 艾默生lng流量计安装注意事项
  10. Mac OS 如何在终端下打开 APP 应用程序?