java中只有值传递没有引用传递

本文通过两个Java示例探讨了对象传递的方式,对比了值传递、指针传递与引用传递的区别,并深入讨论了Java中对象传递的特性,更倾向于C++中的指针传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<span style="font-size:14px;">回顾下什么是指针、引用的初始化
int a = 0;
int *p = &a;//指针
int &b = a;//引用(别名)</span>


了解了指针和引用,看下面这个例子:

<span style="font-size:14px;">/**
 * @author andaren
 * @date 2016-1-21
 */
public class Test {
	public static void main(String args[]) {
		TT ta = new TT();
		System.out.println("ta:" + ta);//ta:TT@5d888759
		TT tb = ta;
		System.out.println(ta == tb);//true
		change(ta);
		System.out.println("ta:" + ta);//ta:TT@5d888759
	}
	
	public static void change(TT a) {
		a = new TT(1);
		System.out.println("a:" + a);//a:TT@2e6e1408
	}
}
class TT {
	int tInt = 0;
	TT(){}
	TT(int tInt){
		this.tInt = tInt;
	}
}</span>
传进change方法中的参数TT a 是什么呢?

在C++中有三种传递参数的方法:值传递、指针传递、引用传递;而对于对象的传递,传递的都是对象内存单元的首地址:指针变量传递指针变量指向对象的内存地址,引用变量传递同名对象的内存地址;

如果是指针传递,那么,传递的就是ta内存地址的拷贝,改变a的内容不会改变ta的值。

虽然指针传递不会改变原来的值,但是按照传递过来的地址,还是可以改变该地址对应的对象的相关成员。

如果是引用传递,那么,传递的就是ta对象内存地址,而不是拷贝。该地址也应该是不可改变的。(C++中别名的唯一绑定)

但是从例子中,我们看到:给a重新分配一个内存空间后,ta的值,并没有改变,这只能说明,我们最好以指针传值的方式理解Java中的“引用传值”。由于指针是可变的,所以当分配了一个新的对象后,指针指向就变了。而我们知道,所有的指针传递的实质都是值传递(地址值传递),所以观点就这么出来了。(虽然有点牵强)

<span style="font-size:14px;">a:TT@2e6e1408当然,这个</span><span style="font-size:14px;"></span><pre name="code" class="java"><span style="font-size:14px;">2e6e1408不一定就是地址值,但至少表示了同一个对象(强行同一个)。</span>


//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

希望以后研究了汇编那一块儿,对这里有新的认识,那时再补充!

//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

补充一个梨子

/**
 * @author andaren
 * @date 2016-1-21
 */
public class Test {
	public static void main(String args[]) {
		TT a = new TT();
		System.out.println("第一次初始化之后a:" + a);
		change(a);
		System.out.println("置换调用之后a:" + a);
	}
	
	public static void change(TT a) {
		TT b = new TT(1);
		a = b;
		System.out.println("置换方法内部a:" + a);//a:TT@2e6e1408
	}
}
class TT {
	int tInt = 0;
	TT(){}
	TT(int tInt){
		this.tInt = tInt;
	}
}
//****************************//
第一次初始化之后a:TT@6af62373
置换方法内部a:TT@459189e1
置换调用之后a:TT@6af62373
如果是引用传递(一开始存a的地址的变量作为形参),那么a = b 之后,a所指向的对象应该变了。但是没变。

如果是指针传递(一开始存a的地址的变量的复制品作为形参),那么 a = b 之后,的确是a不变。所以我觉得,Java里的引用传递,更像是c中的指针传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值