java值传递与引用传递

来源:互联网 发布:淘宝砖石展位 编辑:程序博客网 时间:2024/05/16 05:22

欢迎访问北大青鸟大连鑫鼎中心 www.0411bdqn.com

 

1、对象是按引用传递的---带"="号的赋值操作

2、Java 应用程序有且仅有的一种参数传递机制,即按值传递---由"函数调用"引起的

3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本

4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值 的副本

5、注意:String虽是对象,但永远是传值

 

    首先我们来看看第一点:对象是按引用传递的确实,这一点我想大家没有任何疑问,例如:

    class Test01
    {
    public static void main(String[] args)
    {
    StringBuffer s= new StringBuffer("good");
    StringBuffer s2=s;
    s2.append(" afternoon.");
    System.out.println(s);
    }
    }

    对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。
    如何解释“对象是按引用传递的”的呢?
    这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的,有问题吗?
    程序运行的输出是:
    good afternoon.

    这说明s2和s是同一个对象。

    这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值

    再看看下面的例子:


    class Test02
    {
    public static void main(String[] args)
    {
    int i=5;
    int i2=i;
    i2=6;
    System.out.println(i);
    }
    }

    程序的结果是什么?5!!!
    这说明什么,原始数据类型是按值传递的,这个按值传递也是指的是进行赋值时的行为。


    下一个问题:Java 应用程序有且仅有的一种参数传递机制,即按值传递


    class Test03
    {
    public static void main(String[] args)
    {
    StringBuffer s= new StringBuffer("good");
    StringBuffer s2=new StringBuffer("bad");
    test(s,s2);
    System.out.println(s);//9
    System.out.println(s2);//10
    }

    static void test(StringBuffer s,StringBuffer s2) { //此时会在方法栈中新建引用,但指向同一内存地址
    System.out.println(s);//1
    System.out.println(s2);//2
    s2=s;//3
    s=new StringBuffer("new");//4
    System.out.println(s);//5
    System.out.println(s2);//6
    s.append("hah");
    s2.append("hah");

    System.out.println(s);//7
    System.out.println(s2);//8
    }
    }

    程序的输出是:
    good
    bad


    new
    good


    newhah
    goodhah

    goodhah
    bad

    为什么输出是这样的?

    这里需要强调的是“参数传递机制”,它是与赋值语句时的传递机制的不同。

    我们看到1,2处的输出与我们的预计是完全匹配的

    3将s2指向s,4将s指向一个新的对象

    因此5的输出打印的是新创建的对象的内容,而6打印的原来的s的内容

    7和8两个地方修改对象内容,但是9和10的输出为什么是那样的呢?

    Java 应用程序有且仅有的一种参数传递机制,即按值传递

原创粉丝点击