个人对于java引用的理解

引用这个东西对于很多程序语言都有,C++也有,不仅仅是java。

我一直认为java中的引用,就是一个别名,例如

int a = 3;
int b = 3;
int c = 3;

实际上,abc三个值都指向了内存的同一个块地方,且这个地址上的值为3,这样就可以理解为b,c都是a的别名,因为指向同一个地址。

这仅仅是最浅的理解,我们拿程序中说一下

public class text 
{
	public static void foo(int a,String b)
	{
		a = 3;
		b = "asdasd";
	}
	public static void main()
	{ 
		int a = 0;
		String b = "dsfs";
		foo(a,b);
		System.out.print(a+b);
	} 
}

输出结果是0dsfs

看似是值传递,但是如果把String换成数组呢?

public class text 
{
	public static void foo(int a,int[] b)
	{
		a = 3;
		b[0] = 3;
	}
	public static void main()
	{ 
		int a = 0;
		int[] b = new int[1];
		b[0] = 1;
		foo(a,b);
		System.out.print(a); 
		System.out.print(b); 
	} 
	
}

这样输出的结果是03,用了数组,值就会发生相应的改变,和C语言中的是一样,但是在C语言中,实际传递的是指针,所以会直接对某一块内存进行直接操作,但是java中不存在指针这一说法。

而当我传递的是2个对象,调用同样的功能函数,也会改变对象的值,所以我的个人理解是数组,类等对于java来说可能是一种相对复杂类型的变量,而不是像int,String这种类型。

我概括为两句话:java的参数传递中,如果传递的参数简单——采用值传递;如果传递参数复杂——传递地址。这就是我所理解的java中的引用,但是所谓值传递,地址传递,个人理解就是实际上有没有对原来的对象进行拷贝。

因为对象简单,所以就拷贝了(值传递),但是对象复杂,拷贝可能需要更大的内存空间,所以不拷贝(传递地址)。综上所述, 个人认为是语言或者是编译器对于整个内存环境的一个优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值