关于java中参数传递的总结

1. 引用和对象的区分

   java 中,一切皆对象,而我们就是通过引用来操作对象。换句话说,java 的存储中,new 出来的对象存储在堆中,创建的引用则一般存储在栈中,像C 中的指针一样指到某一对象(或者null )。

 

 

    我认为这里有个误解,大多数的教材都在这个地方对引用长篇大论,搞得这里貌似很神秘,其实,如果看过计算机体系方面的书,就会对关于引用有个正确的理解。

   一般来说,参数的传递实际就是将实际参数复制栈中的。参数为基本类型传递的是具体的数值,参数为对象传递的是对象引用(指向该对象的“指针”)。这是因为在栈中,基本类型存储的是数值,对象存储的是对象的引用。

   先看一个程序

 

package test;

public class Test {
	public static void main(String args[]) {
		Value v = new Value(10);
		Reference.referenceValue(v.value);
		System.out.println(v.value);

		System.out.println();

		Value v1 = new Value(10);
		Reference.referenceObject(v1);
		System.out.println(v1.value);
		
		System.out.println();
		Value v2 = new Value(10);
		Reference.test(v2);
		System.out.println(v2);
	}
}

class Value {
	int value;

	Value(int value) {
		this.value = value;
	}
}

class Reference {
	static void referenceValue(int i) {
		System.out.println("基本类型");
		i++;
		System.out.println(i);
	}

	static void referenceObject(Value v) {
		System.out.println("对象");
		v.value++;
		System.out.println(v.value);
	}
	static void test(Value v) {
		System.out.println("测试");
		v = null;
		System.out.println(v);
	}
}
 

   执行结果如下:

 

基本类型
11
10

对象
11
11

测试
null
test.Value@1fb8ee3
 

 

 

   Reference 类中的referenceValue 方法接受的参数为int 型,传递的是数值,如下图

 

 

referenceValue 方法中所操作的i ,实际上已经是内存中的另一部分,原来的Value 对象中的value 值根本没有变。

 

 

   referenceValue 方法接受的参数为Value 对象,实际传递过来的是Value 对象的引用,如下图

 

 

   referenceValue 方法接收的参数对象Value, 实际是对象的引用,及把v1 复制给v ,使两个引用都指向堆中的同一个对象内存new Value(10) ,可以通过显示vv1hashCode ,可以发现相同。

 

   Test 方法也是接收Value 对象的引用,如下图

   

 

   虽然在test 方法中把Value 对象的引用v 指向null ,但是原来的引用v2 还是指到堆中的new Value(10)

 

 

3. 总结

   所有的参数传递不过是在程序运行栈上新分配一个值的复制品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值