关于java中的“引用”概念

Posted wunsiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java中的“引用”概念相关的知识,希望对你有一定的参考价值。

前言

最近在阅读《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中的“引用”概念的主要内容,如果未能解决你的问题,请参考以下文章

动态SQL基础概念复习(Javaweb作业5)

关于java中的形参和实参的区别-----转载

关于webpack配置项的一些概念

java中的进程,线程,线程池总结

未解决的对“片段”部分中的符号“”的引用

关于CSS的个人理解