`

java值传递内存分析

阅读更多
class BirthDate { 
    private int day; 
    private int month; 
    private int year; 
    
    public BirthDate(int d, int m, int y) { 
        day = d; 
        month = m; 
        year = y; 
    } 
    
    public void setDay(int d) { 
     day = d; 
    } 
  
    public void setMonth(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 class Test{ 
    public static void main(String args[]){ 
        Test test = new Test(); //1
        int date = 9; //2
        BirthDate d1= new BirthDate(7,7,1970); //3
        BirthDate d2= new BirthDate(1,1,2000);    //4
        test.change1(date); //5
        test.change2(d1); //6
        test.change3(d2); //7
    } 
    
    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); 
    } 
}

根据上面代码,从main方法开始执行,分析代码,序号是代码后面注释的数字:
第一、Test test = new Test();在栈内存空间分配一个局部变量“test”,“test”的值是是一个可以找到new出来的Test的值;在堆内存new出了一个新的Test对象,“test”指向Test对象。
第二、int date = 9;在栈内存里分配一个date变量,它的值是9;
根据以上两行代码,总结:基础类型一块内存,引用类型两块内存
第三、 BirthDate d1= new BirthDate(7,7,1970); 在栈内存分配一个名字叫d1的变量;new对象在堆中分配,调用构造方法的时候,有三个形参,在栈空间里分配3个变量:d,m,y,然后将实参分配给这三个变量:d = 7,m=7,y=1970;最后将d,m,y传给构造方法;方法调用完毕后,所有的局部变量自动消失,所以在栈里d,m,y三个局部变量消失。局部变量d1指向new出来的对象。
第四、 BirthDate d2= new BirthDate(1,1,2000); 同三,不再分析;
第五、test.change1(date); 调用change1()方法,该方法有一个形参,在栈内存分配一个名字叫i的局部变量,将date的值传给i,i=9;最后将i的值变成1234;执行完毕后,局部变量消失,i消失了。内存布局没有任何变化。
第六、test.change2(d1);在栈内存分配一个局部变量b,然后将d1的值将给b(通过d1的值可以找到对应的对象),这样,通过b指向了对应的对象,也可以找到对应的对象;执行完毕,开始执行chage2方法,在change2方法中,又在堆内存中new出一个对象,b指向新new出来的对象。方法调用完毕,局部变量b消失,新new出来的对象等待垃圾收集器回收。
第七、test.change3(d2);在栈中分配一个局部变量b,将d2的值传递给b,b指向d2对应的对象;执行方法,通过b调用setDay()方法,在调用方法的时候,在栈中分配一个局部变量d,然后将22传给d,setDay()调用完成之后d消失,同时change3()也调用完了,b消失;此时d2的值被改变。
关于内存分配的大致图可以链接到这个地址:
http://dl.iteye.com/upload/picture/pic/64638/ac2a02f9-2144-3594-8743-04bcebeea76c.png
0
0
分享到:
评论
1 楼 飞雪无情 2010-07-12  
嗯。。就是方法调用不能改变传递给它的对象引用。

相关推荐

    java核心面试技术点

    每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些对象成员变量的拷贝,线程对所有对象成员变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。...

    Java开发技术大全(500个源代码).

    invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法...

    java核心面试

    每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些对象成员变量的拷贝,线程对所有对象成员变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。...

    java的传值与传引用详解

     Java 方法的参数是简单类型的时候,是按值传递的 (pass by value)。这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Test.java * @author fancy */ public class Test { public static void...

    疯狂JAVA讲义

    学生提问:能不能只分配内存空间,不赋初始值呢?89 4.5.4 使用数组 90 学生提问:为什么要我记住这些异常信息? 91 4.5.5 JDK1.5提供了foreach循环 91 4.6 深入数组 93 4.6.1 内存中的数组 93 学生提问:为...

    函数、内存、一维数组、二维数组

    Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因 为每一片区域都有特定的处理数据方式和内存管理方式。 栈内存  用于存储局部变量,当数据使用完,所占空间会...

    值类型和引用类型的区别

    既然一个是直接操作内存,另一个则多一步先解析引用地址,那么显然很多时候值类型会减小 系统性能开销。但“很多时候”不代表“所有时候”,有些时候还得量力而为,例如需要大量进行函数参数传递或返回的时候,老是...

    java 面试题 总结

    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...

    java面试800题

    Java基本类型的都是值传递,对象使用的都是引用传递 Q0043 java相关概念 "static:静态,无需实例化,可直接引用,全局只有一份copy,修饰变量和方法 final:最终的,不可继承、不可修改,修饰变量、方法、类 ...

    [java]读书笔记整理:一切都是对象

    如果java让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞你的程序呢?这正是C++里可能发生的问题。这也是java神奇之处所在。Java有个“垃圾回收器”,用来监视用new创建的所有对象,并辨别哪些...

    Java核心技术II(第8版)

    7.13.5 通过系统剪贴板传递Java对象 7.13.6 使用本地剪贴板来传递对象引用 7.14 拖放操作 7.14.1 Swing对数据传递的支持 7.14.2 拖曳源 7.14.3 放置目标 7.15 平台集成 7.15.1 闪屏 7.15.2 启动桌面应用程序 7.15.3 ...

    java8集合源码分析-Project:工程目录

    值传递 封装、继承、多态 Java基础知识 基本数据类型 自动拆装箱 String类 熟悉Java中各种关键字 集合类 枚举 IO Java反射 动态代理 序列化 注解 元注解、自定义注解、Java中常用注解使用、注解与反射的结合 Spring...

    Java面试宝典-经典

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    Java面试宝典2010版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    java面试题

    35. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 18 36. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?...

    java面试宝典

    21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 10 22、我们在web 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,...

    java面试题大全(2012版)

    4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 ...

    java基础题 很全面

    36. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 11 37. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此...

    超级有影响力霸气的Java面试题大全文档

    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...

Global site tag (gtag.js) - Google Analytics