java值传递以及引用传递

对于下面两个程序,相信学过java的朋友都很容易看得懂。

 

TestOne.java


package test;

public class TestOne {
	
	public static void name(int x){
		x++;
	}
	
	public static void main(String[] args) {
		int x = 0 ;
		name(x);
		System.out.println("------>x的值为: " + x);
	}
}

运行结果 : ------>x的值为: 0

TestTwo.java


package test;

class Cat{
	int x = 0;
}

public class TestTwo {
	public static void name(Cat cat){
		cat.x++;
	}
	
	public static void main(String[] args) {
		Cat c = new Cat();
		name(c);
		System.out.println("------>x的值为: " + c.x);
	}
}

运行结果 : ------>x的值为: 1 

运行一下,我们会发现,奇怪,怎么TestTwo中能改变x的值而TestOne不可以改变x的值呢?
接下来我们运行一下会发现其结果很神奇,对于已经深入学习java并且有一定经验的人来说并不奇怪,答案也不言而喻,就是引用传递和值传递的问题而已,但是对于刚开始学习java,对java还不是很熟悉的同学来说可能会觉得很奇怪,为什么结果会这样子呢?
下面就讲解一下他的原因吧。
正如前面所说,其实这就是引用传递和值传递的问题,首先讲一些这两个术语的概念吧:
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
也就说,java中在函数调用传递参数时,遵循着一个原则:基本类型传递的是该数据的值,引用类型传递的是对象的引用,而不是对象本身, 简单的说,在java中,如果函数中传递的参数是基本类型,那么就是值传递,如果传递的是对象,则是引用传递。
如果只是从概念上来说,我想大家会有点模糊,下面再从内存上讲解一下吧。
首先针对TestOne这个类我们来进行一下分析。
(1)首先程序在执行main方法时,会在栈内存中分配一个空间给main方法中的x变量,当执行name(int x)变量时,再给方法中的局部变量x分配一个空间(图中用椭圆表示),然后将main方法中的x的值传给name方法中的x(值传递)。如图:



(2)在执行name方法中的x++时候,其实改变的就是name方法中的局部变量的值,如图:


下面再对TestTwo这个类进行内存分析:
(1)首先程序在执行main方法时,在栈内存中会分配一个空间个c变量,这个变量会记录一个地址指向堆内存中cat对象,当执行name(Cat cat)方法时,同样在栈内存中分配空间给cat变量,然后将c变量中记录的地址传给cat变量(引用传递),最终他们指向的是同一个对象。


(2)当执行name方法中的c.++;时,因为他们指向的是同一个对象,所以改变的是同一个x的值,所以结果输出是1,如下图:

经过这样分析,我想大家应该更加清晰了解了吧,呵呵,如果还有不懂的可以留言咨询。当然各位路过的高手如果有什么建议或者指点的话也希望能够留言指出哦,谢谢。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值