ass BirthDate{

  private int day;

  private int month;

  private int year;

  public BirthDate(int d;int m,int y){

    day = d;

  }

  public void setDay( int d){

    day = d;

  }

  public void setMoth(int m){

    month = m;

  }

  public void setYear(int y){

    year = y;

  }

  public int getDay(){

    return day;

  }

  public int getMonth(){

    return month;

  }

  public int getYear(){

    return year;

  }

  public void display(){

    System.out.println(day+"-"+month+"-"+year);

  }

}

public class Test{

  public static void main(String args[]){

    Test test = new Test();

    int date=9;

    BirthDate d1 = new BirthDate(7,7,1970);

    BirthDate d1 = new BirthDate(1,1,2000);

    test.change1(d1);

    test.change2(d2);

    System.out.println("adte="+date);

    d1.display();

    d2.display();

  }

  public void change1(int i){

    i = 1234;

  }

  public void change2(BirthDate b){

    b =  new BirthDate(22,2,2004);

  }

  public void change3(BirthDate b){

    b.setDay(22);

  }

}

执行Test test = new Test();的时候调用Test的构造方法,int date = 9;在占内存里分配一个变量date等于9, 执行这句话的时候BirthDate d1= new BirthDate(7,7,1970);在占内存里分配一个变量叫d1:xxx指向堆内存里new出来的的一块内存,内存如图:

当执行完BirthDate d1= new BirthDate(7,7,1970);之后,方法完成之后为这个方法分配的局部变量消失所以内存图变成如下图所示:

BirthDate d2= new BirthDate(1,1,2000);   同上述一样;

当执行test.change1(date);这句话时,在调用change1这个方法,这时的i=9;之后,i变成 了1234,当方法执行完毕之后,分配给这个方法的局部变量消失,所以这个方法相当于白调用,栈内存变化如图:

      

当执行这句话时,test.change2(d1);在堆内存里分配new 出来的一块内存 b这个BirthDay的类型指向new 出来的对象之后,执行完方法之后,为这个方法分配的局部变量消失,没有一个变量指向new出来的新的对象,最后由java的垃圾回收机制回收掉;

当执行test.change3(d2);这段代码时,调用change3这个方法,BirthDay的变量b指向的是d2的setDay这个方法,并且在占内存里有一个变量d ,d的值为22,将22赋值给day,方法完成之后,堆内存里的day由1变成了22,最后方法执行完成之后,d这个变量消失最终的内存图为

java内存解析的更多相关文章

  1. Java内存解析 程序的执行过程

    Java内存解析 栈.堆.常量池等虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,简单讲解Java内存分配方面的知识. 首先我们先来讲解一下内存中的各个区域. ...

  2. Java进阶(一)Java内存解析

    栈.堆.常量池等虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,简单讲解Java内存分配方面的知识. 首先我们先来讲解一下内存中的各个区域. stack(栈) ...

  3. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  4. Java当中的内存分配以及值传递问题内存解析

    首先必须说明作为Java程序员对于内存只要有大致的了解就可以了,如果你对Java当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把 ...

  5. 【转】java内存分配和String类型的深度解析

    一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本 ...

  6. 【搞定Jvm面试】 Java 内存区域揭秘附常见面试题解析

    本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...

  7. JAVA内存溢出解析(转)

    JAVA内存溢出解析(转) 核心提示:原因有很多种,比如: 1.数据量过于庞大:死循环 :静态变量和静态方法过多:递归:无法确定是否被引用的对象: 2.虚拟机不回收内存(内存泄漏): 说白了就是程序运 ...

  8. 议题解析与复现--《Java内存攻击技术漫谈》(一)

    解析与复现议题 Java内存攻击技术漫谈 https://mp.weixin.qq.com/s/JIjBjULjFnKDjEhzVAtxhw allowAttachSelf绕过 在Java9及以后的版 ...

  9. Java内存模型深度解析:final--转

    原文地址:http://www.codeceo.com/article/java-memory-6.html 与前面介绍的锁和Volatile相比较,对final域的读和写更像是普通的变量访问.对于f ...

随机推荐

  1. 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory

    [已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 结论是: 当前有个bug: 默认是通过 hw.ramSize=1024 ...

  2. js 空正则匹配任意一个位置

    看一个正则 这里明显,起到匹配作用的是 | 后的,可 | 后什么都没有,原理不知道,也没有搜到文献,只有在 Reg101 上是这样解释的, 所以得出结论: js 中,空正则匹配任意一个位置. 不过,这 ...

  3. Struts2中的拦截器详解

    exception:异常拦截器,拦截异常aliasservletConfig18nprepare:预备拦截器,这个拦截器就是为了ModelDriven准备对象的,若Action类实现了preparab ...

  4. poj1742 Coins【多重背包】【贪心】

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions:43969   Accepted: 14873 Descriptio ...

  5. Service Mesh服务网格:是什么和为什么

    Service Mesh服务网格:是什么和为什么 - 好雨云帮 CSDN 博客 - CSDN博客 https://blog.csdn.net/zyqduron/article/details/8043 ...

  6. 关于VFS文件系统中的superblock、inode、d_entry和file数据结构

  7. mysql 复合查询语句

    INSERT INTO runwa(rshottime,rmoney,renamecount) VALUES (CURDATE(),(select SUM(MONEY) from income whe ...

  8. doxygen的简单使用(快速上手)

    在网上找了很久一个简单的doxygen教程,这个是最简单的,让你看完之后马上就能写doxygen格式的代码 doxygen是一种从源代码生成文档的工具,支持多种语言.当然,源代码中需按一定的格式写注释 ...

  9. flask请求和应用上下文

    关于WSGI WSGI(全称Web Server Gateway Interface),是为 Python 语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口,它封装了接受HTTP请求. ...

  10. HTML容易遗忘内容(三)