码迷,mamicode.com
首页 > 编程语言 > 详细

关于java中的“引用”概念

时间:2018-08-10 19:46:22      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:方式   java编程思想   按值传递   值传递   generated   test   void   因此   基本数据   

前言

最近在阅读《java编程思想》一书时,对作者关于java中的”引用(句柄)“的解释不太清楚,因此以实验的方式来讨论下java中一切皆”按值传递“这一说法,从而加深理解。

正文

情景一:当参数为基本数据类型(如:int)时

public class TestReference {
    public static void testOne(int i){
        i = 2;
        System.out.println("test函数中的变量值:" + i);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a = 1;
        TestReference.testOne(a);
        System.out.println("main函数中的变量值:" + a);
    }
}

运行结果:
test函数中的变量值:2
main函数中的变量值:1
由此可见:当参数为基本数据类型时,参数的传递为按值的拷贝传递

情景二:当参数为对象时,出现“按引用传递”的效果

package test;

public class TestReference {
    public static void testTwo(B c){
        c.data = 2;
        System.out.println("test函数中的变量值:" + c.data);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        B b = new B();
        b.data = 1;
        TestReference.testTwo(b);
        System.out.println("main函数中的变量值:" + b.data);
    }
}

运行结果:
test函数中的变量值:2
main函数中的变量值:2
由此可见:此例中函数的参数确实以拷贝地址的方式操作了实参变量。

情景三: 函数中对参数创建新的对象

public class TestReference {
    public static void testThree(String str){
        str = new String("new");
        System.out.println("test函数中的变量值:" + str);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str = new String("old");
        TestReference.testThree(str);
        System.out.println("main函数中的变量值:" + str);
    }
}

运行结果:
test函数中的变量值:new
main函数中的变量值:old
由此可见:实参变量以拷贝地址的方式将对象地址传递给了形参变量,但在函数运行过程中,形参变量被赋予的新的对象的地址,因此此后对形参变量的操作与实参变量便不再有关系。

总结

所谓“一切皆传值”对于基本数据类型,指的便是变量值得拷贝,而对于对象(或String、Integer等包装基本类型),指的是对象地址的拷贝,也就是说所传递的值是对象的地址。

关于java中的“引用”概念

标签:方式   java编程思想   按值传递   值传递   generated   test   void   因此   基本数据   

原文地址:https://www.cnblogs.com/wunsiang/p/9456484.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!