• Java值传递和引用传递


    在Java中,如果参数是简单类型,那么传递的就是值,比如int、char等等;如果参数是对象类型(引用类型),那么传递的就是地址(引用)。看下面的例子。
    
    
    
    package hello1;
    /**
     * Created by hyuan on 9/28/15.
     */
    public class hello1 {
        public static void main(String[] args) {
            
            StringBuffer a=new StringBuffer("A");
            StringBuffer b=new StringBuffer("B");
            m(a,b);
            System.out.println(a+","+b);
    
            String aa="A";
            String bb="B";
            m(aa,bb);
            System.out.println(aa+",,,"+bb);
        }
    
    
        public static void m(StringBuffer x,StringBuffer y){
            x.append(y);
            y=x;
            System.out.println(x + ",," + y);
        }
        public static void m(String x,String y){
            x="aa";
            y=x;
            System.out.println(x+",,"+y);
        }
    
    }
    结果为:
    AB,,AB
    AB,B
    aa,,aa
    A,,,B
    由于这里函数的参数是2个StringBuffer对象,是对象类型,因此应该传递的是地址(引用)。但是应该注意x指向a所指向的内存(可以理解为都指向A),y指向b所指向的内存(可以理解为都指向B),x.append(y);把 y 指向的值追加给x指向的值,这个时候x和a所指向内存的内容都是AB,y指向的内存仍然是B。y=x;把 x 的值赋值给y,赋的是地址,从而导致y、x和a所指向内存的内容都是AB(y原来指向的,也就是b指向内存中的内容并没有发生变化)。因此,a、y、x同时指向AB,而b仍然指向B。
    System.out.println(x+","+y);这里所以打印AB,AB,打印的实际上都是a指向内存的内容。
    System.out.println(a+","+b);这里所以打印AB,B,由于是引用传递,所以a指向内存的内容在函数中被修改,而b指向内存中的内容没有发生变化。

    引用传递是把原来的地址(实参)传递给新的变量(形参),原来引用的仍然在那里。

  • 相关阅读:
    协方差的意义
    ios7新特性实践
    微信支付大盗--黑色产业链
    UVA 297 Quadtrees(四叉树建树、合并与遍历)
    HDU 2876 Ellipse, again and again
    java中接口的定义与实现
    Oracle Linux 6.3下安装Oracle 11g R2(11.2.0.3)
    Fortran使用隐形DO循环和reshape给一维和多维数组赋初值
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
  • 原文地址:https://www.cnblogs.com/robbinluobo/p/7879540.html
Copyright © 2020-2023  润新知