`
zgqynx
  • 浏览: 1342222 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java参数的值传递

    博客分类:
  • java
阅读更多
java参数的值传递
http://www.an-ping.com/forum/blog/detail.asp?blog_id=2&content_id=127
在java中,只有“值传递“一种参数传递方式。
1. 按值传递和按引用传递
          定义按值传递和按引用传递
这两个术语是重要的。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
2. 对象(object)与引用(reference)
       我们知道:
       A a = new A();
       产生一个A类型的对象,a是这个对象的的一个引用,即a指向heap中真正的对象,而a和其他基本数据类型 一起存放在stack中.也就是object通过reference操控,在底层的话,a更象一个指针.
3.一个帮助理解的例子:

public class PassTest {
	float ptValue;

	public void changeInt(int value) {
		value = 55;
	}

	public void changeStr(String value) {
		value = new String("different");
	}

	public void changeObjValue(PassTest ref) {
		ref.ptValue = 99f;
	}

	public static void main(String args[]) {
		String str;
		int val;
		PassTest pt = new PassTest();
		val = 11;
		pt.changeInt(val);
		System.out.println("Int value is: " + val);
		str = new String("Hello");
		pt.changeStr(str);
		System.out.println("Str value is: " + str);
		pt.ptValue = 101f;
		pt.changeObjValue(pt);
		System.out.println("Current ptValue is: " + pt.ptValue);
	}
}

这个程序最后输出的结果将是:

11

Hello

99f

对于int类型的参数11, 虽然改变了形参的值,但是实参却不改变,这同C语言中是一样的。
对于String 类型的变量 str,因为在java中String作为对象来处理,参考上面的分析,str是"hello"的一个引用(指针),按照值传递的说法value是str 的一个副件,因此也是一个引用。但是他经过value = new String ("different");被修改后value指向了一个新的对象。所以str所指的内容没有被改变。
        pt 是主函数中创建的PassTest的对象,通过传递它,就可以完成地址的传递,子函数中,ref与主函数的pt指向的其实是一个内存单元,那么修改 ref中的ptValue的值,也就是修改pt中的ptValue的值,即使没有最后的数据返回,这个数据也是会改变的。
        我们要记住,a只不过是对象的reference,而reference的复件与原来的reference指向的是同一个对象 我们对复件的操作,与对a的操作一样,最终还是对指向对象的操作,因此,java的参数,只有值传递.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics