Static内存图解:

解析:

如代码:

①:当程序运行,class进行加载这时在方法区则会有class文件区

而class文件区内又有两个区(代码中有两个类一个person一个personDemo)这时class文件区的第一个区产生:

然后产生第二个区

class区域内有成员属性与成员方法.而为什么没有静态的属性与方法呢,是因为当程序加载该class文件时,系统会自动的把他所有静态的属性与方法分配到静态区 (方法区内有一个静态区);静态区内也有两块区域一个是personDemo类标记的main(String[]args)方法,一个是person标记的变量country=null(String类型初始默认值为null)

截止到现在他的初始化才完毕,则得出结论:静态的内容随着class的文件加载而加载

②:接着走的main方法进栈,main是静态修饰.静态可以通过类名调用,所以 根本不需要创建对象main方法就进栈内存,那么main方法一进栈系统则为它开辟空间;


开辟空间之后接着它创建了第一个对象Person p1 = new Person("邓丽君",16,"中国");

然后new Person在堆内存进堆之后系统会分配一个空间与内存地址假如是:0X0001,其实他也代表this,

同时这块内存区域内有name=null;age=0;与静态标记和方法标记:

;

静态标记是:静态区域有一个变量country他也有一个内存地址假如是0X01;这时他其实 是跟静态标记是有关联的,这个时候静态标记是指向静态区的country的


方法标记:系统在创建对象的时候,会自动生成一个方法区,这个方法区是属于当前对象的则Person,而这个方法区也有一个内存地址假如是:0X02;构造方法与show方法等带参不带参的方法都存储在方法区内它是由Person标记的内存地址是0X02;这是堆内存中的方法标记则与方法区产生关联,直到这时它所有的初始化才完成


③:当进行完以上步骤它的值又被改变了:Person p1 = new Person("邓丽君",16,"中国");这是给name; age;country进行赋第一个值:"邓丽君"通过走构造方法进内存,将"邓丽君给了"构造方法public Person(String name,int age,String country);中的neme;16给了age

这时找静态变量country"中国",但此时在堆内存中并没有这个静态变量.则找静态标记,0X01;通过内存地址0X01找到静态区 0X01标记的country,这时null则被"中国替代"


截止此时Person p1 = new Person("邓丽君",16,"中国")的值才会赋完.


④:运行到P1.show()方法,此时p1.show()方法调方法

public void show() {

System.out.println("姓名:"+name+",年龄:"+age+",国籍:"+country);

};

在方法区找有没有show方法.有show方法则show方法进栈为show方法开辟一个空间;那么show()方法在里面输出的时候首先找name,因为是p1调用,所以通过Person p1找name值在找age值在通过静态标记进入静态区找country值,所以第一次输出结果是:

当这些值在控制台显示之后.然后这个方法调用完毕就从内存中消失

接着运行:Person p2 = new Person("杨幂",22);步骤:Person p2则在栈内存开辟第二个空并给出内存地址:0X0002;

然后new Person()在堆内存开辟空间.然后:Person p2 = new Person("杨幂",22)将"杨幂",22赋值给name,age;此时并没有给country值,但是它 是有值的,因为他是静态值.它的静态标记0x01指向静态区域0x01;它的值还是以前的,但是由它们两个共享一个静态区域所以不需要再次进行赋值.然后找到p2.show()方法.使show()进栈,然后show()方法通过 Person p2-0x0002进堆内存通过name age找值,在通过静态标记找country的值.然后进行输出销毁内存,P3同理:

在当运行到p3.country = "美国";时,"美国"通过Person p3进堆,通过静态标记对country的值进行更改.因为所以方法共享一个静态区所以p3.show();
                p1.show();
p2.show();

输出的country值都是美国


static关键字(理解)

(1)静态的意思:可以修饰成员变量和成员方法。
(2)静态的特点:
A:随着类的加载而加载
B:优先与对象存在
C:被类的所有对象共享
这其实也是我们判断该不该使用静态的依据。
举例:饮水机和水杯的问题思考
D:可以通过类名调用
既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
(3)静态的内存图
静态的内容在方法区的静态区
static关键字注意事项
A:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
B:静态方法只能访问静态的成员变量和静态的成员方法
静态方法:
成员变量:只能访问静态变量
成员方法:只能访问静态成员方法
非静态方法:
成员变量:可以是静态的,也可以是非静态的
成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
简单记:
静态只能访问静态。
(5)静态变量和成员变量的区别
A:所属不同
静态变量:属于类,类变量
成员变量:属于对象,对象变量,实例变量
B:内存位置不同
静态变量:方法区的静态区
成员变量:堆内存
C:生命周期不同
静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
D:调用不同
静态变量:可以通过对象名调用,也可以通过类名调用
成员变量:只能通过对象名调用

java中Static内存图解相关推荐

  1. ​Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子​

    作者 l 会点代码的大叔(CodeDaShu) JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1. 内存泄漏(memory lea ...

  2. 深入理解Java中的内存泄漏

    理解Java中的内存泄漏,我们首先要清楚Java中的内存区域分配问题和内存回收的问题本文将分为三大部分介绍这些内容. Java中的内存分配 Java中的内存区域主要分为线程共享的和线程私有的两大区域: ...

  3. Java中static的含义和用法

    Java中static的含义和用法 static:静态的,用于修饰成员(成员变量,成员方法); 1.被static所修饰的变量或者方法会储存在数据共享区; 2.被static修饰后的成员变量只有一份! ...

  4. java中的内存分配原则

    问题:Java中这些类.变量.字符串.方法,在内存中是怎样分配的? 首先,Java中的内存区域如下: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是 ...

  5. 介绍Java中的内存泄漏

    转载自  介绍Java中的内存泄漏 Java语言的一个关键的优势就是它的内存管理机制.你只管创建对象,Java的垃圾回收器帮你分配以及回收内存.然而,实际的情况并没有那么简单,因为内存泄漏在Java应 ...

  6. Java中关于内存泄漏分析和解决方案,都在这里了!

    作者:李序锴 www.jianshu.com/p/54b5da7c6816 最近正在熟悉Java内存泄漏的相关知识,上网查阅了一些资料,在此做个整理算是对收获的一些总结,希望能对各位有所帮助,有问题可 ...

  7. java中堆栈内存_Java堆空间与堆栈– Java中的内存分配

    java中堆栈内存 Sometime back I wrote a couple of posts about Java Garbage Collection and Java is Pass by ...

  8. java jvm内存模型_Java(JVM)内存模型– Java中的内存管理

    java jvm内存模型 Understanding JVM Memory Model, Java Memory Management are very important if you want t ...

  9. Java 中的内存映射(Mmap)

    day2:将原来普通读取文件的方式改为内存映射文件的方式. mmap 是一种内存映射文件的方法,即将一个文件映射到进程的地址空间,实现文件磁盘地址和一段进程虚拟地址的映射 Java 中的 mmap J ...

最新文章

  1. datatable 汇总_【2019 版】中国石油大学(北京)计算机考研信息、资料汇总
  2. python携程酒店评论_携程酒店评论爬虫心得
  3. 【转】JS windows.open()详解
  4. 用SSH登录远程的机器,在远程机器上执行本地机器上的脚本
  5. OpenCV计算机视觉实战(Python版)_004图像形态学处理
  6. 给你出道题:依次去掉离中心最远的M个点
  7. 《数据结构与抽象:Java语言描述(原书第4版)》一Java插曲1
  8. 如何JOPtionPane的showConfirmDialog对话框button设置监视器
  9. 管理感悟:没有活跃用户量,谈广告都是开玩笑
  10. 渗透测试基础-XSS漏洞简析
  11. mysql 生成一张全年日期表:工作日、周末、节假日
  12. python抽奖程序_抽奖程序python
  13. Android studio引入XUI
  14. Java基础——时间和日期
  15. 怎样剪立体灯笼_懒人版立体镂空星星折纸灯笼教程
  16. 物联网芯片型号处理器集锦资料介绍
  17. vue中引用echarts设置渐变色new echarts不能用
  18. 每天一练——输入一行字符串,按如下规则加密:如果是英文字母则大写变小写、小写变大写,对非英文字符则保持不变。试写加密程序。
  19. [电脑]电脑面前的自我保护
  20. 天锋w2019_天锋W2019竟然仿的这么像,这是要让三星气吐血吗?

热门文章

  1. 【jQuery】网页文本格式编辑器xheditor
  2. LMS自适应滤波算法的 matlab实现
  3. 闲置物品交易转让求购发布信息​小程序开发
  4. NOIP模拟试题详讲2021/11/9
  5. python keras安装_环境安装 安装TensorFlow与Keras
  6. DBDataSource platformDataSource has not registed!的问题
  7. jquery 向html body 元素内添加子元素并设置样式知识点.txt
  8. 第十四届蓝桥杯三月真题刷题训练——第 23 天
  9. java接收邮件_Java实现邮件收发
  10. 7行代码实现一个Tvoc/eCO2有害气体检测仪