码迷,mamicode.com
首页 > 编程语言 > 详细

java的参数传递与内存分配问题

时间:2015-03-04 22:46:24      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

本文可作为北京尚学堂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;
    }
    
   //省略get set
    
    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 d2= new BirthDate(1,1,2000);    
        test.change1(date);
        test.change2(d1);
        test.change3(d2);
        System.out.println("date=" + 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);
    }
}

结果如下:
date=9
7 - 7 - 1970
22 - 1 - 2000
我自己不明白的是change2这个方法,它竟然没有改变d1的值!

其实我们想想也就明白了,在change2运行的时候,栈内存中又多了一块区域,存放局部变量b。在change2运行时,b首先指向实参d1的位置。也就是7-7-1970 而后new 了一个新的birthday,假定它在堆内存的地址为5421 那么b的值改成了5421 等change2这个方法结束的时候,b这块内存也就消失了。d1自然什么都不变喽。

再看change3
运行这个方法的时候,b首先指向的也是实参d2的位置。我们直接通过b修改了那块内存的数据,那么d2这个变量的值自然也就改变了。

java的参数传递与内存分配问题

标签:

原文地址:http://blog.csdn.net/dlf123321/article/details/44066005

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!