java 传值和传引用

关于传值和传引用看了不少帖子,谬误很多,甚至一些人都没测试过就直接猜结果写成博文,误人子弟,真是让人气愤!

之所以很多人在这个问题上出错,实际上是对形式参数的不理解造成的。

一个方法的形式参数,仅仅是在本方法内有效的,随着本方法在方法栈帧中被pop,所有的形式参数都要等着被垃圾回收了。

例如我们这样子的代码:

    public static void main(String[] args){
        Test test  =new Test();
        String a = "11",b="22";
        test.swapPosition(a,b);
        System.out.println(a);
        System.out.println(b);
    }
    private void swapPosition(String a, String b){
        String t  = null;
        t =a;
        a = b;
        b = t;
    }

输出结果是11,22;

然后把String类型换成Integer类型:

public static void main(String[] args){
        Test test  =new Test();
        Integer a = 11,b=22;
        test.swapPosition(a,b);
        System.out.println(a);
        System.out.println(b);
    }
    private void swapPosition(Integer a, Integer b){
        Integer t = 0;
        t =a;
        a = b;
        b = t;
    }

结果依然输出结果是11,22;

有人说你把对象换成基本类型,结果会传引用就变成了传值,

那么笔者亲测:

public static void main(String[] args){
        Test test  =new Test();
        int a = 11,b=22;
        test.swapPosition(a,b);
        System.out.println(a);
        System.out.println(b);
    }
    private void swapPosition(int a, int b){
        int t = 0;
        t =a;
        a = b;
        b = t;
    }

结果依然输出结果是11,22  根本就不会变的;

其实你换一种写法就明白了:

public static void main(String[] args){
        Test test  =new Test();
        int a = 11,b=22;
        test.swapPosition(a,b);
        System.out.println(a);
        System.out.println(b);
    }
    private void swapPosition(int x, int y){
        int t = 0;
        t =x;
        x = y;
        y = t;
    }

其实无论你怎么操作,操作的都是形式参数x,y,那么怎么实现交换位置呢?答案只有一种:绕开形式参数,不要用额外的方法:

public static void main(String[] args){int a = 11,b=22;        int t = 0;        t =a;        a = b;        b = t;
        System.out.println(a);
        System.out.println(b);
    }

然后输出值为22,11

时间: 2024-08-10 23:29:16

java 传值和传引用的相关文章

Java传值与传引用

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

Java传值还是传引用

这是一个经典面试问题,它迷惑Java新手.在这篇文章中,我将用一个例子和一些图来证明:Java是按值传递的. 定义: - 按值传递:在内存中做一个实际参数值拷贝进行传递. - 传引用:传递实际参数的地址的副本. Java是永远是值传递.原始数据类型和对象引用都只是值. 传递原始类型变量: swap(Type arg1, Type arg2) { Type temp = arg1; arg1 = arg2; arg2 = temp; } 传递对象: Java通过引用操作对象,所有的对象变量都是引用

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