`

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:按值传递还是按引用传递详细解说

    本文将深入探讨Java中的参数传递机制,并通过具体的代码示例和内存分配图解来帮助读者理解按值传递和按引用传递的概念。 #### 二、按值传递的概念与特点 按值传递是指在函数或方法调用过程中,传递给函数或方法的...

    java值传递与引用传递

    在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...

    值传递与引用传递-内存解析

    在编程语言中,值传递和引用传递是函数参数传递的两种基本方式,它们涉及到内存管理、数据安全以及程序效率等多个重要方面。这篇文章将深入探讨这两种传递方式,并通过内存解析来帮助理解它们的工作原理。 首先,...

    Java内存分配全面解析

    Java内存分配全面解析 Java程序在执行过程中,其内存分配主要涉及到JVM(Java Virtual Machine,Java虚拟机)的不同区域。这些区域包括寄存器、栈、堆、常量池、代码段和数据段。理解这些内存区域的工作原理对于...

    java中方法重载内存分析

    在分析内存分配时,我们需要关注以下几点: 1. **局部变量**:每个方法内部声明的变量都存储在当前方法的栈帧的局部变量表中。不同重载方法的局部变量表是相互独立的,即使它们有相同名称的变量,也不会相互影响。 ...

    Java的按值传递和按引用传递分析.rar

    Java编程语言中有两种参数传递方式:按值传递和按引用传递。理解这两种方式对于编写高效、无误的代码至关重要。 1. **按值传递(Pass by Value)** - Java中的基本类型(如int, double, char等)是按值传递的。这...

    java 之方法调用 方法传参 值传递还是引用传递字节码

    本文将深入探讨Java中的方法调用、值传递与引用传递,并通过字节码分析来进一步理解这些概念。 首先,我们来看方法调用。在Java中,方法是一组完成特定任务的代码块,可以通过方法名来调用执行。方法调用的基本语法...

    java按值传递还是按引用传递详细解说[收集].pdf

    通过上述分析,我们可以得出结论,尽管Java的参数传递方式被描述为“按值传递”,但对于对象来说,实际上传递的是对象引用的副本,从而实现了类似按引用传递的效果。理解这一机制对于编写Java程序至关重要,尤其是在...

    java中带有不同构造方法的程序内存分析

    本文件主要探讨了Java中带有不同构造方法的程序如何影响内存分析,这包括无参构造方法、带参数的构造方法以及它们在内存分配中的应用。 首先,让我们了解一下构造方法。构造方法是一种特殊的方法,它的名字与类名...

    Java按值传递和按址传递(面试常见)

    Java编程语言中的参数传递主要有两种方式:按值传递(pass by value)和按引用传递(pass by reference),尽管Java官方并不支持真正的按引用传递,但其行为类似于按引用传递。这两种传递方式在面试和笔试中经常出现...

    java参数传递 java 参数.doc

    Java 参数传递机制是编程中的重要概念,尤其是在Java中,它涉及到“值传递”和“引用传递”的理解。这里我们将深入探讨这两个概念,并结合给定的示例代码进行解析。 首先,我们看“值传递”。在Java中,基本类型...

    JAVA程序执行内存分析PPT教案学习.pptx

    Java程序在执行过程中涉及到内存管理,这是编程时必须理解的关键概念。在这个PPT教案中,主要探讨了Java程序中内存的分配与使用,通过具体的代码示例解释...因此,深入理解Java内存分析对于任何Java开发者都是必要的。

    java内存空间详解

    ### Java内存空间详解 #### 一、Java内存机制概述 Java程序在运行过程中涉及的内存主要分为两大类:栈内存和堆内存。 1. **栈内存**:主要用于存储局部变量和对象的引用变量。栈内存的特点是先进后出,即先压入的...

    Java中值传递和引用传递的区别

    本文将通过示例代码详细介绍Java中值传递和引用传递的区别,并对其进行深入分析。 一、值传递 值传递是一种常见的参数传递机制,在这种机制中,实参传递给形参的是值。形参和实参在内存上是两个独立的变量,对形参...

    Java当中的内存分配.pdf

    理解Java的内存分配和值传递机制对于编写高效、无内存泄漏的代码至关重要。程序员应该专注于业务逻辑和设计,而非过分关注底层内存细节,除非在解决特定性能或内存问题时需要深入探讨。通过理解这些基本概念,开发者...

    java 参数传递

    Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论...Java 参数传递机制详解,揭开了 Java 中的参数传递机制的奥秘,详细分析了基本类型和对象作为参数传递的机制,并揭开了对象作为参数传递的迷惑。

    JAVA语言中参数传递的深入剖析.pdf

    本文对Java语言中参数传递机制进行了深入的剖析,首先从Java的变量内存分配机制开始,对不同的参数传递机制进行了分析,并得出了最合理的结论。 Java语言中参数传递机制可以分为两种情况,即按值传递和引用传递。按...

    解析Java按值传递还是按引用传递

    "Java按值传递还是按引用传递" Java是一种面向对象的编程语言,在Java中,对于方法的参数传递有两种方式:按值传递和按引用传递。这两种方式都有其特点和应用场景,本文将对这两种方式进行详细的介绍和分析。 一、...

    java中带有this关键字的程序内存分析

    例如,当我们在`display`方法中调用`this.firstName`时,JVM会在当前对象的堆内存中查找`firstName`实例变量,并返回其值。 此外,`this`还可以在匿名内部类和lambda表达式中使用,用来引用外部类的实例变量。这...

Global site tag (gtag.js) - Google Analytics