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