注意:变量指基本数据类型非对象,局部变量不能被静态修饰
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#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。
拿别人一个例子说事:
比如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的。

原文转载自:https://blog.csdn.net/fancky58/article/details/76767744/

Java内存的一点理解, 静态方法和实例方法的区别及使用场景相关推荐

  1. java 内存 静态_Java内存的 静态方法和实例方法的区别及使用场景

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

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

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

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

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

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

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

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

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

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

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

  7. java 静态对象数组_Java静态方法和实例方法 java中的数组作为形参传入

    原标题:Java静态方法和实例方法 java中的数组作为形参传入 Java静态方法和实例方法 java中的数组作为形参传入 Java虚拟机 启动一个Java程序的时候,会诞生一个虚拟机实例,当程序关闭 ...

  8. Java内存泄露的理解与解决

    Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...

  9. java内存模型——JMM理解

    文章目录 前言 一.JMM模型 二.JAVA内存模型数据同步8大原子操作 三.模型解读 前言 JMM是一种java内存模型,是一种不存在的概念和约定. JMM有以下约定: 1.线程解锁前,必须把共享变 ...

最新文章

  1. win10 error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突
  2. 《数据结构与算法 C语言版》—— 2.5上机实验
  3. 身份证到期需更换 警方提醒市民提前办理
  4. 利用opencv添加mask
  5. 【codevs2287】火车站,第一个A掉的钻石题(迟来的解题报告)
  6. opencv 修改图像数值_【1】Introduction to OpenCV (2)使用VS生成OpenCV应用程序
  7. nginx的反向代理、负载均衡、页面缓存、URL重写及读写分离
  8. 深度学习(00)——GPU版本的TensorFlow
  9. SSH学习2_ssh登陆卡住(expecting SSH2_MSG_KEX_ECDH_REPLY)
  10. 基于python+Django+MYSQL实现的图书管理系统
  11. Java负数除法和求余运算
  12. Apache Log4j2详解
  13. 深度搜索—-深度搜索解决矩阵搜索问题(水洼数计算)
  14. minio对象存储单机部署并设置开机自启动及集成spring boot进行(创建删除桶)(上传下载删除文件)
  15. c3p0,DBCP,Druid(德鲁伊)数据库连接池
  16. 【FPGA学习笔记】VHDL语言(二):VHDL的数字表示,数据对象,数据类型
  17. 如何在nature上发表文章
  18. 两次参加中国大学生服务外包大赛的感悟
  19. git拉取分支中指定文件到本地
  20. 恢复服务器上的安装器信息已被破坏_Garmin(佳明)或已支付赎金,但可能惹上新的麻烦...

热门文章

  1. 关于HTML中的滚动条/去掉滚动条 设置颜色
  2. Camera sersor 数据传输--DVP、SPI及MIPI
  3. TPlinker解读
  4. 【✨十五天搞定电工基础】一阶电路的暂态分析
  5. 使用函数求Fibonacci数
  6. 在windows中ohmyzsh 的powerlevel10k主题及插件推荐
  7. 推荐:2014年中国政府投资项目工程建设代建单位管理中心工程项目管理信息化GOVPM解决方案
  8. 足球机器人守门员 类似梅西足球守门员机器人
  9. 注销服务器命令,远程注销服务器的使用命令
  10. 字符串跟列表的恩怨、set集合、数据转换、深浅拷贝