Java传值还是传引用

这是一个经典面试问题,它迷惑Java新手。在这篇文章中,我将用一个例子和一些图来证明:Java是按值传递的。



定义:

- 按值传递:在内存中做一个实际参数值拷贝进行传递。

- 传引用:传递实际参数的地址的副本。

Java是永远是值传递。原始数据类型和对象引用都只是值。

传递原始类型变量:

swap(Type arg1, Type arg2) {
    Type temp = arg1;
    arg1 = arg2;
    arg2 = temp;
}

传递对象:

Java通过引用操作对象,所有的对象变量都是引用。但是,Java不通过引用传递参数值,而是通过值传递。

问题是:为什么对象的成员值可以被修改?

代码:

class Apple {
    public String color="red";
}

public class Main {
    public static void main(String[] args) {
        Apple apple = new Apple();
        System.out.println(apple.color);

        changeApple(apple);
        System.out.println(apple.color);
    }

    public static void changeApple(Apple apple){
        apple.color = "green";
    }
}

因为原始和拷贝的引用指向同一个对象,成员变量的值可以被修改。

结果:

red
green

http://www.programcreek.com/2011/08/so-java-passes-object-by-reference-or-by-value/

时间: 2024-10-25 09:49:32

Java传值还是传引用的相关文章

Java传值与传引用

在Java中,变量分为以下两类, 1.对于基本类型变量,Java是传值的副本,即时自己的副本变了,自己也不会变化. 2.对于一切对象型变量,Java都是传引用的副本,也就是复制指向地址的指针,它传的引用副本指向自己的地址. eg:你要张三(张三相当于函数)打开仓库,并检查库里面的货物(仓库相当于地址),有必要新建一座仓库(并放入相同的货物)给张三吗? 没有必要,你只需要把钥匙(引用)复制一把给张三即可, 张三会拿复制的钥匙(引用副本,但是有时效性,函数结束,钥匙销毁)打开仓库. 注意:Strin

java 传值和传引用

关于传值和传引用看了不少帖子,谬误很多,甚至一些人都没测试过就直接猜结果写成博文,误人子弟,真是让人气愤! 之所以很多人在这个问题上出错,实际上是对形式参数的不理解造成的. 一个方法的形式参数,仅仅是在本方法内有效的,随着本方法在方法栈帧中被pop,所有的形式参数都要等着被垃圾回收了. 例如我们这样子的代码: public static void main(String[] args){ Test test =new Test(); String a = "11",b="22

Java中的传值与传引用

曾经对java中传值还是传引用的问题十分困惑,而且也被问到过许多次,无论是面试,还是平时我们平时的讨论中. 在stackoverflow上面浏览时,无意中发现了跟这个问题有关的论题,于是深入地查看了,感觉获益匪浅,于是结合自己过去的经验,写了这篇博客跟大家分享. 以前我觉得是这样的,java中的基本数据类型和String是传值的,而其它的类类型的数据则是传引用的.不过现在我觉得不是这样的. *****************************************************

Java经典问题:传值与传引用?

转自:http://developer.51cto.com/art/201104/254715.htm Java到底是传值还是传引用?相信很少有人能完全回答正确.通常的说法是:对于基本数据类型(整型.浮点型.字符型.布尔型等),传值;对于引用类型(对象.数组),传引用.基本类型传值,所有人都不会对此有疑义;问题出在引用类型上. 为引入正题,不妨先看看下面的例子,你能正确给出程序的运行结果嘛? /** * @(#)Swap.java * * *  @author *  @version  1.00

【转载】Java是传值还是传引用

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

由传值、传引用引发的问题 (Java)

最近在读<算法导论>,在尝试自己实现归并排序时,发现了一个很奇怪的问题. 为了能够专注于问题,下面使用一段重新编写的能够重现问题的代码.可以尝试运行一下. 1 public class Main 2 { 3  public static void main(String[] args) 4  { 5   int[] tmp = {4, 5, 6}; 6   Test.print(tmp); 7   Test.test(tmp); 8   Test.print(tmp); 9  } 10 } 1

Java学习笔记:具体解释传值和传引用

传值和传引用 When you're passing primitives into a method ,you get a distinct copy of the primitive. When you're passing a reference into a method , you get a copy of the reference. 以上引自<Thinging in Java>.总结一下就是无论Java參数的类型是什么.一律传递參数的副本. 在Java中,变量分为以下两类: 对

Java学习笔记:详解传值和传引用

传值和传引用 When you're passing primitives into a method ,you get a distinct copy of the primitive. When you're passing a reference into a method , you get a copy of the reference. 以上引自<Thinging in Java>,总结一下就是不管Java参数的类型是什么,一律传递参数的副本. 在Java中,变量分为以下两类: 对

Java中传值和传引用

今天看了Java中的传值和传引用,对于这一块开始的时候不太能理解,通过查阅其他几篇blog,将自己的理解记录下来: 比较好的几篇blog:http://blog.csdn.net/houpuhope/article/details/7449377; 首先对于传值和传引用需要有一个初步的理解就是,通过传值的方式传进来的参数修改了,对原变量并没有什么影响: 而,通过传引用的方式修改的,原变量值也跟着改变.下面进行详细的解析: 1.对于基本类型Java是按照传值传递的: public class Te