• Java中的传值与传引用


    曾经对java中传值还是传引用的问题十分困惑,而且也被问到过许多次,无论是面试,还是平时我们平时的讨论中。

    在stackoverflow上面浏览时,无意中发现了跟这个问题有关的论题,于是深入地查看了,感觉获益匪浅,于是结合自己过去的经验,写了这篇博客跟大家分享。

    以前我觉得是这样的,java中的基本数据类型和String是传值的,而其它的类类型的数据则是传引用的。不过现在我觉得不是这样的。

    *******************************************************************************

    我觉得人们对于传值还是传引用的困惑源于这样一个事实:不同的人对于“引用”的定义理解不同。具有C++背景的人认为“引用”跟C++里面的引用是同一个概念,而具体C语言背景的人则认为“引用”具有“指针”的含义,等等。java中传值还是传引用取决于“引用”的含义。

    Java中的传值是这样的:

     1 public void method1(int i){
     2     i++;
     3     System.out.println(i);  //5
     4 }
     5 public void method2(String s){
     6     s+="a";
     7     System.out.println(s);  //aa
     8 }
     9 
    10 int i=4;
    11 method1(i);
    12 System.out.println(i);  //4
    13 
    14 String a="a";
    15 method2(a);
    16 System.out.println(s);//a
    View Code

    但是,在java中,总是传值的。难以理解的事实是:Java把对象当引用来传递,而这些引用则是以值的形式来传递的。即对象实参的引用在初始化方法形参的时候复制了一份实参的引用,而这个拷贝的引用同实参的引用指向同一个对象。

    示例如下:

    1 public void foo(Dog d) {
    2   d.getName().equals("Max"); // true
    3   d = new Dog("Fifi");
    4   d.getName().equals("Fifi"); // true
    5 }
    6 
    7 Dog aDog = new Dog("Max");
    8 foo(aDog);
    9 aDog.getName().equals("Max"); // true
    View Code

    示例中aDog.getName()将返回“Max”。当对象引用以值的形式来传递的时候,d在方法中并没有被覆盖。

    否则的话,形如:

    1 public void foo(Dog d) {
    2   d.getName().equals("Max"); // true
    3   d.setName("Fifi");
    4 }
    5 
    6 Dog aDog = new Dog("Max");
    7 foo(aDog);
    8 aDog.getName().equals("Fifi"); // true
    View Code
  • 相关阅读:
    个人开发框架总结(六)
    使用Forms身份验证
    接口IStateManager的使用心得
    Remoting中向服务器传送新对象时应注意的问题
    具有反色文本的进度条绘制方法
    中文姓名的VbScript验证方法
    个人开发框架总结(七)
    Asp.net MVC 实例
    直接对List对象排序,提高系统性能
    Spring 简单实现邮件发送
  • 原文地址:https://www.cnblogs.com/littlepanpc/p/3842219.html
Copyright © 2020-2023  润新知