zoukankan      html  css  js  c++  java
  • 【转】 Java中的变量赋值和参数传递

    原文地址:http://blog.csdn.net/whmii/article/details/3363667

    变量赋值和参数传递是java中两个容易让人迷惑的问题。
    对于原始类型(primitives type),java采用值传递,这很明显。然而,当传递的参数类型是对象时,或者两个对象的变量进行赋值时,问题就有些复杂,很多初学者对此感到迷惑。
    实际上,当赋值或者传递参数的时候,Java采取的都是一种值传递。
    在下面的代码中,

    1. class A{
    2.     int i=2;
    3. }
    4. class B{
    5.     static void change(A a){
    6.         a.i=31;
    7.     }
    8.     public static void main(String[] arguments){
    9.         A a1=new A();
    10.         A a2=new A();
    11.         change(a1);
    12.         System.out.println("a1: "+a1.i+"/na2: "+a2.i); // a1=31,a2=2;
    13.         a1=a2;
    14.         System.out.println("a1: "+a1.i+"/na2: "+a2.i); // a1=2,a2=2;
    15.     }
    16. }


    当执行change(a1)时,JVM将a1复制一份传递给A的静态函数change(A a)中的参数a,注意这里a1和a都是对象的引用,而不是对象本身。所以,传递的是对象引用的复制品。从而a1和a变成同一个对象的两个不同引用。因此,通过a1对对象的改变,和通过a对对象的改变,具有同样的效果。打个比方,有一道带有复杂无比的锁的门(对象),这扇门有一把钥匙(a1)。现在,另外一个人会开此门(方法change()的定义),他有一把想象中的钥匙(形参),但他没有事实上的钥匙。当此人需要开此门时,怎么办?他需要一把钥匙,而主人传给他的确实是一把钥匙,只不过这把钥匙是主人原先的钥匙的复制品!而这个复制品显然也能打开这扇复杂的门。

    同样,对于第13行的
    a1=a2;
    是这样进行的:复制前,a1和a2分别是两个不同对象的引用,当赋值时,a2的值赋给a1,结果a1的值和a2的值相等,a1变成a2所引用的对象的另一个引用,即a1和a2变成同一个对象的引用,而这个对象是原先a2引用的对象。原先a1引用的对象则因为失去了所有的引用而被垃圾收集器处理掉!

  • 相关阅读:
    ansible 通过跳板机发布服务
    etcd API 神坑
    golang 条件编译
    服务治理
    golang web服务器处理前端HTTP请求跨域的方法
    rebar使用
    Apache/Tomcat/JBOSS/Jetty/Nginx/WebLogic/WebSphere之间的区别区别
    运维专家写给年轻运维的6条人生忠告
    谷歌浏览器书签索引—知识的海洋都在里面
    关于认识、格局、多维度发展的感触
  • 原文地址:https://www.cnblogs.com/dirgo/p/6955379.html
Copyright © 2011-2022 走看看