zoukankan      html  css  js  c++  java
  • Java是“值传递”还是“引用传递”?

    本文是根据stackoverflow网站上的一道题目整理出来的。

    Java一直是“值传递”而不是引用传递。看一个例子:

    public class Main{
      public static void main(String[] args){
        Foo f = new Foo("f");
        changeReference(f);  //不改变引用
        modifyReference(f);  //会修改变量f指向的对象
      }
      public static void changeReference(Foo a){
        Foo b = new Foo("b");
        a = b;
      }
      public static void modifyReference(Foo c){
        c.setAttribute("c");
      }
    }

    我们来一步步分析这个例子:

    1、 声明一个类型Foo的引用f,并将其指向一个带有属性`“f”`的类型Foo的新对象。

     Foo f = new Foo("f"); 

    2、方法方面,声明了一个名为a的Foo类型的引用,初始化的值为null。

     public static void changeReference(Foo a) 

    3、 当你调用方法changeReference时,引用a将指向作为参数传递过来的对象。

     changeReference(f); 

    4、声明一个名为b的Foo类型的引用,指向一个包含属性“b”的新Foo对象。

     Foo b = new Foo("b"); 

    5、 a=b 是将引用a重新指向了含有属性“b”的对象,而不会影响引用f。

    6、当你调用方法modifyReference(Foo c)时,创建引用c并将其指向含有属性“f”的对象。

    7、 c.setAttribute("c") 会改变引用c所指向的对象的属性,而它与f指向的是同一个对象。

    总结如下:

    1. 对象是引用就是一个变量,其中包含的数据可以告知JVM如何在内存(堆)中获得被引用的对象。
    2. 当给一个方法传递参数的时候,你传递的并不是引用变量,而且该变量的数据的拷贝,即该引用变量的值。
    3. 传递的是引用的值,而不是引用本身,更不是对象。
    4. 可以根据传递的值访问并修改对象的内容,但是不能改变原本的引用变量的指向。
  • 相关阅读:
    【漏洞挖掘】攻击对外开放的Docker API接口
    使用密钥认证机制远程登录Linux
    极客时间-左耳听风-程序员攻略开篇-零基础启蒙
    WEBSHELL恶意代码批量提取清除工具
    string替换字符串,路径的斜杠替换为下划线
    Linux下文件的三个时间意义及用法
    记录一次lnmp故障报告
    Centos 7.2编译安装MariaDB-10.0.xx
    win 7 浏览器被篡改小插曲
    【 sysbench 性能基准测试 】
  • 原文地址:https://www.cnblogs.com/GuoYaxiang/p/6703239.html
Copyright © 2011-2022 走看看