• Java值传递和引用传递之我见


    对于java中的值传递和引用传递一直颇受争论,《Core Java》的作者,以及JAVA的创造者James Gosling都认为当一个对象或引用类型变量被当作参数传递时,也是值传递,这个值就是对象的引用,因此JAVA中只有值传递,没有引用传递。还有一种说法是引用可以看作是对象的别名,当对象被当作参数传递给方法时,传递的是对象的引用,因此是引用传递。而《Thinking in Java》一书的作者Bruce Eckel则站在了中立的立场上。

    大都数人其实都倾向于第一种说法,java中没有引用传递,本人也更倾向于第一种解释,下面讲讲个人的见解。

    首先明白几个概念,什么是值传递,引用传递和指针传递?特别注意一下引用传递的概念,这个最早应该是出现在c++中,c中没有这个概念,c只有值传递和指针传递。

    值传递:传递实参的一个复本给形参,在被调函数内对形参的修改不会影响到原来的实参

    引用传递(c++中的定义):形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形参虽然也作为局部变量在栈中开辟了内存空间,但是这时存    放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的    任何操作都影响了主调函数中的实参变量。

    指针传递:本质还值传递,把指针的值复制一份传递给形参,都指向实参指针指向的值,当对形参指向的内容操作时,就相当于对实参本身进行的操作。

    其实引用传递和指针传递的实质是一样的,从汇编层面是无法区别两者的,引用是C++对指针的一种封装,方便使用,其实质和指针引用一样。纠正一下C++程序设计(谭浩强)中的一个问题,书上介绍引用的地方第198页说引用不是一个独立的变量,不单独占内存单元,这个说法不严谨,引用类型的参数也要占用内存空间的,保存的数据是一个地址。

    再来看看Java中所谓的引用传递,其实和c++中的指针传递是一样的,指针传递的本质是值传递,所以可以说java中没有引用传递。

    附一道面试题,来测试下对上面的理解,写出程序运行结果!

    public class TestMain {
    
        /**
         * @author lcq
         * @date 2013-4-8
         * @param args
         */
        public static void main(String[] args) {
            String a = "a";
            String b = "b";
            operator(a, b);
            StringBuilder x = new StringBuilder("x"); 
            StringBuilder y = new StringBuilder("y");
            operator(x, y);
            System.out.println(a + "," + b);
            System.out.println(x + "," + y);
        }
    
        public static void operator(String a, String b) {
            a += b;
            b = a;
        }
    
        public static void operator(StringBuilder a, StringBuilder b) {
            a.append(b);
            b = a;
        }
    }

     正确的答案是

    a,b
    xy,y

    你,答对了嘛?

  • 相关阅读:
    gffread: 从基因组提取fa
    linux: echo 保留变量的换行符
    R语言:按分隔符分割字符串并提取倒数三列
    linux:某列转为多行
    碎碎念六一
    抵达一颗安静的心
    zabbix 如何监控 tomcat中堆内存??
    JVM垃圾回收器
    Kubernetes 1.22.8高可用集群部署
    Redmine 5 安装(windows)
  • 原文地址:https://www.cnblogs.com/xiaoQLu/p/3011561.html
Copyright © 2020-2023  润新知