黑马程序员技术交流社区

标题: Java值传递的一些思考。 [打印本页]

作者: 胡建彪    时间: 2012-10-25 20:27
标题: Java值传递的一些思考。
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 ;
        }
}
上述解释有不妥的地方,求大神们指导。


作者: 刘丽娜    时间: 2012-10-25 20:42
传递的是引用吧
作者: 李靖    时间: 2012-10-25 22:13
Apple对象在堆内存中存放它的数据,而在栈内存中存放了一个地址,形参有一个临时的栈地址,指向开始创建的对象数据,最终修改的是堆内存的数据,因为该数据是共享的数据,所以发生了变化。不知道这样说对不对
作者: 胡建彪    时间: 2012-10-26 09:43
bhxiaobo 发表于 2012-10-25 22:13
Apple对象在堆内存中存放它的数据,而在栈内存中存放了一个地址,形参有一个临时的栈地址,指向开始创建的 ...

是的,传递给形参的是是对象引用的拷贝,也就是形参有一个临时的栈地址,指向原来对象的内容。当然可以改变堆内存中对象的内容,但是原来对象的引用是无论如何也没有发生变化。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2