`
unique5945
  • 浏览: 136797 次
  • 来自: 杭州
社区版块
存档分类
最新评论

java的值传递

    博客分类:
  • JAVA
阅读更多
先看以下代码:
class Person {
	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public static void main(String[] args) {

		Person person = new Person();//---1
		Person p2 = new Person();
		person.setAge(12);
		person.setName("lj");
		test.changePerson(person,p2);//---2 该处person不同于1处的person,而是前者的一个拷贝,他们指向堆中同一个对象
		System.out.println("in main...");
		System.out.println("person.age:" + person.getAge());
		System.out.println("person.name:" + person.getName());
	}
	void changePerson(Person p1,Person p2){
		p2.setAge(13);
		p2.setName("yb");
		p1 = p2;
		System.out.println("in changePerson...");
		System.out.println("person.age:" + p1.getAge());
		System.out.println("person.name:" + p1.getName());
	}
}

运行结果:
in changePerson...
person.age:13
person.name:yb
in main...
person.age:12
person.name:lj
也许会很奇怪,java对象在方法里传递时不是引用传递么?为什么传过去的person在changePerson()方法体内把引用指向了p2,但回到主方法后又把引用指向了原来的对象
原因如下:
                              
主函数中: person--> [age:12 name:lj] <--person’
                      
person'即为test.changePerson(person,p2); 中的person,它与前面的person具有相同的引用地址,因此java中的“对象变量”的传递叫做“引用传递”。但就其实质而言,还是值传递,只不过这个值是引用(或者说地址)而已。

changePerson函数中:person对象的拷贝p1又把引用指向了另一个对象p2,所以会打印出新对象的信息,而当这个函数结束,p1的生命周期也就结束了。
再次回到主函数时,person对象指向原来的对象的事实没有改变,所以还是打印出原来对象的信息

如果还有一个函数changePerson2如下:
void changePerson2(Person p){
	p.setAge(100);
	p.setName("ljyb");
}

则在主函数增加如下代码:
test.changePerson2(person);
System.out.println("in changePerson...");
System.out.println("person.age:" + person.getAge());
System.out.println("person.name:" + person.getName());
结果为:
after invoking changePerson2...
person.age:100
person.name:ljyb

此时的传递方式与上面相同,changePerson2中的p变量也是主函数中person变量的一份拷贝,他们指向同一个对象。p改变了这个对象的值,也就改变了person指向对象的值。
当changePerson2函数结束时,p的生命周期也结束了,但它在changePerson2内做的操作却被保存下来了。
此时打印person的信息就变成修改后的信息了。

我还找到一些相关资料,附下
下面的文字来自一个哥们的文章中的评论,他写的这篇文章也是关于java值传递的
网址:http://zangweiren.iteye.com/blog/214369

有些争论没有意义,其实你知道传值和传引用由什么区别就可以了,但不要自以为是的认为就是别人混淆了。
“有一种说法是当一个对象或引用类型变量被当作参数传递时,也是值传递,这个值就是对象的引用,因此JAVA中只有值传递,没有引用传递。这种说法显然是混淆了值和引用的概念。”
我看到的很多书中都是只有pass by value的概念。
James Gosling,我想他对Java语言里的一些概念还是有话语权的,《The Java Programming Language》2.6.5. Parameter Values一节中,他的说法是 :
引用
All parameters to methods are passed "by value." In other words, values of parameter variables in a method are copies of the values the invoker specified as arguments.。。。。。You should note that when the parameter is an object reference, it is the object reference not the object itself that is passed "by value." Thus, you can change which object a parameter refers to inside the method without affecting the reference that was passed. But if you change any fields of the object or invoke methods that change the object's state, the object is changed for every part of the program that holds a reference to it.
这里说的很清楚了,方法的所有参数都是值传递。

别的书里也有提及 ,Core Java 卷一中也有类似的说法,举了一些例子。
Thinking In Java中也提到过,具体什么地方记不清楚了。
从编译原理的概念来说,有传值,传地址,传名,传结果等。这里的传地址明显和java的传引用不一样。C++中引入了传引用,但是C++的传引用有个明显的特点,引用一旦创建不能修改,所以引用不能指向新的对象。所以不会出现java这种令人混淆的概念。所以还是多用Java中的术语,区分pass by value中不同的情况,而不是自己引入pass by reference 的概念让人们更加混淆。
分享到:
评论

相关推荐

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

    Java 值传递Visio资源

    在Java中,参数传递有两种方式:值传递和引用传递。这个“Java 值传递Visio资源”包含了几个Visio图形文件,帮助我们直观地理解这两种传递方式。 1. **值传递**: 当方法调用时,对于基本类型(如int, double, char...

    Java:按值传递还是按引用传递详细解说

    ### Java中的按值传递与按引用传递详解 #### 一、引言 在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点...

    java值传递与引用传递

    在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...

    java值传递和引用传递详解

    Java中的参数传递方式主要有两种:值传递和引用传递。理解这两种机制是编程中至关重要的,因为它们直接影响到函数内部如何改变或操作传入的数据。 **值传递**在Java中是基本数据类型(如int, double, char等)的...

    Java值传递的一些理解 1

    对于值传递的理解,是深入Java语言机制的关键一环。 首先,让我们明确Java的内存分配。在Java中,内存主要分为三个部分:栈内存、堆内存以及方法区内存。栈内存是存储基本类型变量和对象引用的地方,其特点是在方法...

    java中只有值传递

    Java中传递对象时传递的并不是对象中的内容, 而是对象的地址。

    为什么Java只有值传递

    我们先看一下值传递和引用传递的概念和区别 值传递:是指在调用函数时将实际参数复制一份传递到函数中,...我们通过例子理解一下Java的值传递: public static void main(String[] args) { int a = 10; int b = 20;

    Java 值传递和引用传递详解及实例代码

    Java中的值传递和引用传递是编程中非常重要的概念,它们涉及到函数或方法调用时参数的传递方式。值传递指的是函数或方法接收到的是变量的一个副本,而引用传递则是函数或方法接收到的是变量内存地址的副本。这两种...

    Java中的值传递和引用传递

    当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。  值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值  引用传递的特点:方法内部对传...

    Java面向对象值传递和引用传递

    Java 面向对象值传递和引用传递 Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值...

    Java是值传递,传对象引用也是通过值

    标题“Java是值传递,传对象引用也是通过值”揭示了Java中参数传递的核心概念。Java总是以值传递方式进行,这意味着当你将一个变量作为参数传递给方法时,传递的是该变量所存储值的一个副本。然而,对于对象类型的...

    深入了解为什么Java中只有值传递?

    "Java 值传递" Java 中只有按值传递的原因是因为 Java 程序设计语言的设计理念。在 Java 中,方法参数的传递方式是按值传递的,而不是按引用传递的。这意味着,当方法接收到参数时,实际上是接收到参数的副本,而...

    Java值传递和引用传递详解

    Java中的参数传递方式有两种,即值传递和引用传递,但需要注意的是,Java只支持值传递。下面我们将详细探讨这两种传递方式及其在实际编程中的表现。 1. 值传递(Value Passing) 值传递指的是在调用方法时,将变量...

    Java中的按值传递和按引用传递的代码详解

    Java中的按值传递和按引用传递的代码详解 本文通过实例代码详细解释了Java中的按值传递和按引用传递的相关知识。通过实验,我们可以了解Java中基本类型和引用类型的传递机制。 按值传递 在Java中,基本类型的变量...

    java html 值传递

    在本教程中,我们将探讨如何在Java和HTML的结合中实现值传递,以便在网页上绘制圆圈,这对于初学者来说是一个很好的实践项目。 首先,我们要理解Java和HTML之间的交互。通常,这种交互是通过Servlet或JSP(Java...

    Java中的值传递和引用传递实例介绍

    Java总是采用值传递的方式来传递参数,但这并不意味着不能通过参数来改变对象的状态。我们将详细探讨Java中的值传递和引用传递的概念,以及它们之间的区别。 首先,值传递是Java中最基本的参数传递方式。当一个变量...

    Java按值传递和按址传递(面试常见)

    Java编程语言中的参数传递主要有两种方式:按值传递(pass by value)和按引用传递(pass by reference),尽管Java官方并不支持真正的按引用传递,但其行为类似于按引用传递。这两种传递方式在面试和笔试中经常出现...

Global site tag (gtag.js) - Google Analytics