Java中方法调用时值传递问题的理解

Java中方法调用时,没有按引用传递这个说法,只有按值传递。基本类型数据的传递和引用类型数据的传递,根本上都是按值传递。

案例一:基本类型数据传递

package testExample;

/**
 * 基本类型值传递测试
 * Title    ByValueTest01
 * @author	cook
 * @date	2018年3月10日下午4:57:36
 * @version 1.0
 */
public class ByValueTest01 {
	public static void main(String[] args) {
		int a = 5;
		int b = 6;
		
		pass(a,b);
		
		System.out.println(a);
		System.out.println(b);
	}
	
	public static void pass(int x,int y){
		//调用方法,其实就是做了如下注释的操作.记住调用方法时候的隐含操作会方便理解
		//x=a;
		//y=b;
		x = 7;
		y = 8;
	}

}

案例二:引用类型数据传递

package testExample;
/**
 * 引用类型值传递
 * Title    ByValueTest02
 * @author	cook
 * @date	2018年3月10日下午5:45:43
 * @version 1.0
 */
public class ByValueTest02 {
	public static void main(String[] args) {
		Tree tree = new Tree(10);
		System.out.println("调用方法前,树tree高"+tree);
		
		pass1(tree);
		System.out.println("调用pass1方法后,树tree高"+tree);
		
		pass2(tree);
		System.out.println("调用pass2方法后,树tree高"+tree);
		
	
	}
	
	//方法一
	public static void pass1(Tree t){
		/*
		step01:
		pass方法被调用时,值得传递是指隐含执行了如下代码:
		t=tree;
		假设Tree的实例变量tree在内存中的地址是zx001,这里会有一个赋值t=zx10;
		*/
		
		/**
		step02:
		t本来被赋值t=zx10,到了t = new Tree(20)这一步,是t被重新赋值t=zx20,而没有对内存中tree=zx10这个对象做任何操作。
		所以此时t的操作权限是zx20这个内存空间中的内容。
		所以调用pass1方法输出tree的值,仍是10
		 */
		t = new Tree(20);
		
		System.out.println("调用pass1方法时,树t高"+t);
	}
	
	//方法二
	public static void pass2(Tree t){
		/*
		step01:
		pass方法被调用时,值得传递是指隐含执行了如下代码:
		t=tree;
		假设Tree的实例变量tree在内存中的地址是zx10,这里会有一个赋值t=zx10;
		*/
		/**
		step02:
		t被赋值t=zx10,t被赋值后,没有再被赋其他值
		所以t的操作权限是zx10这个内容空间
		所以调用pass2方法,是操作zx10空间,空间内的树被拔高到了20,再输出tree的时候,树变成了20米
		 */
		t.setHeight(20);
		System.out.println("调用pass2方法时,树t高"+t);
	}
	
}

class Tree{
	private int height;
	
	public Tree(int h){
		height = h;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}
	
	public String toString(){
		
		return "树高 " + height + " 米" ;
	}
}

理解的过程中,注意所说的“方法调用时,隐含执行了xxx代码”,这样会更容易理解

有一位漂亮小姐姐有更深入的解释,只是深入之后新手理解未必友好,附上链接,有兴趣的看一下。第24条是关于方法调用值传递的。

https://www.cnblogs.com/lanxuezaipiao/p/3371224.html

顺便给新手推荐一个无意中发现的Java网站,感觉超级适合入门级的Java开发,

基础知识写的挺好,练手项目也很丰富很,基本都是文档形式指导,简明易懂,不像视频一样费时间

地址是http://how2j.cn?p=24192



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值