A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡建彪 黑马帝   /  2012-10-25 20:27  /  1366 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java的参数传递是值传递还是引用传递?其实这题是问那些从C++转向Java的程序员的,因为在C++中,有一种叫指针的东西,而在Java的世界中,屏蔽了容易让程序员犯错的指针(其实内部只是封装了指针,很多功能的实现其实还是通过指针的),也因此让问题变得更加简单,在java核心技术卷I里有一个结论:java中没有引用传递,只有值传递

public class PramaTest {
     public static void main(String[] args) {
            Apple apple = new Apple();
            apple.setColor("red");
            apple.setSize("10");
            PramaTest test = new PramaTest();
            test.change(apple);
            System.out.println(apple);
        }
        public void change(Apple apple) { // 传递的是对象引用的拷贝。
            Apple apple2 = new Apple() ;
            apple2.setColor("green") ;
            apple2.setSize("20") ;
            apple = apple2 ;    //  是把apple2的地址,给了形参这个对象引用的拷贝,所以不会影响到原对象。
            System.out.println(apple);
        }
       /*
public void change(Apple apple) {  //运行change这个方法时,方法得到的是对象引用的拷贝,原引用apple和形参apple同时引用同一个对象,所以函数运行结束后,形参apple已经消失了,但是对引用对象的更改却影响了主函数原引用apple所引用的同一对象指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变。
apple.setColor(“green”) ;
apple.setSize(“20″) ;
System.out.println(apple);
}*/

}
class Apple {

        private String color ;
        private String size ;
        public void setColor(String color) {
        this.color = color ;
        }
        public void setSize(String size) {
            this.size = size ;
        }
        public String toString() {
            return "color = "+ this.color + ", size = "+ this.size ;
        }
}
上述解释有不妥的地方,求大神们指导。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

3 个回复

正序浏览
bhxiaobo 发表于 2012-10-25 22:13
Apple对象在堆内存中存放它的数据,而在栈内存中存放了一个地址,形参有一个临时的栈地址,指向开始创建的 ...

是的,传递给形参的是是对象引用的拷贝,也就是形参有一个临时的栈地址,指向原来对象的内容。当然可以改变堆内存中对象的内容,但是原来对象的引用是无论如何也没有发生变化。
回复 使用道具 举报
Apple对象在堆内存中存放它的数据,而在栈内存中存放了一个地址,形参有一个临时的栈地址,指向开始创建的对象数据,最终修改的是堆内存的数据,因为该数据是共享的数据,所以发生了变化。不知道这样说对不对
回复 使用道具 举报
传递的是引用吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马