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

Java中参数传递类型只有值传递

    博客分类:
  • Java
阅读更多
java核心技术卷I里有一个结论我觉得挺有意思的:java中没有引用传递,只有值传递
首先看定义:
值传递,是指方法接收的是调用者提供的值
引用传递,是指方法接收的是调用者提供的变量地址

以前学习C++时把参数传递分为值传递和引用传递,国内的不少java教材愿意把对象的传递理解是引用传递,为什么它们会这么说呢?可以看下面一个例子:
import java.util.Calendar;
public class ChangeValue {
	public static void main(String[] args) {
		Calendar oc = Calendar.getInstance();
		System.out.println("origin:"+oc.getTime());
		changeDate(oc);
		System.out.println("after:"+oc.getTime());		
	}
	
	static void changeDate(Calendar pd){
		pd.set(1970, 1, 1);
	}
}

某时刻程序输出:
origin:Thu Jan 05 21:15:59 CST 2012
after:Sun Feb 01 21:15:59 CST 1970

oc对象的值改变了,很多人就认为java对象传递实际上是引用传递。
过程应该是这样的:
运行changeDate这个函数时,方法得到的是对象引用的拷贝,oc和pd同时引用同一个对象,所以函数运行结束后,pd已经消失了,但是对引用对象的更改却也影响了oc所引用的同一对象,结合对之前的定义理解,这应该是值传递的过程(传递的是对象引用的拷贝)。
以下附上另一个例子,两个对象的交换函数(C++中可以轻易实现):
public class Swap {
	public static void main(String[] args) {
		ObjectSample o1 = new ObjectSample("hello");
		ObjectSample o2 = new ObjectSample("你好");
		System.out.println("before swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());
		Swap.swapObject(o1, o2);
		System.out.println("after swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());
	}
	static void swapObject(ObjectSample o1, ObjectSample o2){
		ObjectSample temp = new ObjectSample("temp");
		temp = o1;
		o1 = o2;
		o2 = temp;
	}
}

class ObjectSample{
	private String title;
	
	ObjectSample(String title){
		this.title = title;
	}
	
	public String getTitle(){
		return title;
	}
}

输出结果:
before swap o1:hello o2:你好
after swap o1:hello o2:你好

java在交换程序中并没有交换两个对象的值,交换的是两个对象的拷贝,不能实现让对象参数引用一个新对象,究其原因还是因为java是采用了值传递而非引用传递。

还有不少和以前自己接触的观点不一样的地方,当然需要借鉴的吸收并且经过自己的实践来辨别。
9
3
分享到:
评论
10 楼 Guimashi 2015-07-21  
  其实把 swap 函数里面的 print出来,大家就更容易看懂了。。。swap里面的确交换了o1、o2的引用,但是跟main函数里面的没关系啊。。。
9 楼 kuangc2008 2012-02-16  
geniuswxk 写道
其实都是叫法不同,基本数据类型直接把数据复制一份,非基本数据类型把它的引用复制一份(其实就是内存地址),相当于多个引用指向同一个对像,调用其中任何一个引用改变这个对象,其他多个引用也随之改变,但当其中一个引用指向别的对象时,原来的引用不发生改变

呵呵,你这几句话就说明白了
8 楼 xyang81 2012-02-16  
chnhopescg 写道
看了LZ的写的文章,还是有点模糊,以前一直认为上述方式都是引用传递,在传递对象到一个方法里面时,其实传递的是对这个对象的一个引用,相当于是引用地址。

引用类型传递的是内存地址。进入swapObject方法时,会在堆内存中开辟一块内存空间,用于存储方法区中的数据,在该方法空间中新建了3个变量,分别为temp、o1和o2,保存main方法中o1和o2的内存地址值,和main方法中的o1,o2不是同一个变量。但它们指向都是同一个对象,所以改方法区中变量的地址不影响main方法中变量的地址,但是如果在swapObject方法中改变o1和o2对象的title属性时,main方法中的o1和o2对象也会随着改变.
7 楼 greatghoul 2012-02-15  
原来如此。
6 楼 Meteor_yun 2012-02-15  
大家其实可以分析一下程序在内存中的执行过程就明白了  CODESAGEMENT(代码区) DATASAGEMENT(数据区) STACK(局部变量) HEAP(所有new出来的东西)
5 楼 xfjt297857539 2012-02-15  
geniuswxk 写道
其实都是叫法不同,基本数据类型直接把数据复制一份,非基本数据类型把它的引用复制一份(其实就是内存地址),相当于多个引用指向同一个对像,调用其中任何一个引用改变这个对象,其他多个引用也随之改变,但当其中一个引用指向别的对象时,原来的引用不发生改变

不错,学习了...
4 楼 geniuswxk 2012-02-15  
其实都是叫法不同,基本数据类型直接把数据复制一份,非基本数据类型把它的引用复制一份(其实就是内存地址),相当于多个引用指向同一个对像,调用其中任何一个引用改变这个对象,其他多个引用也随之改变,但当其中一个引用指向别的对象时,原来的引用不发生改变
3 楼 yuwenchun 2012-02-14  
学习了,如果用图解会更清晰明了
2 楼 lyaqys 2012-02-14  
chnhopescg 写道
看了LZ的写的文章,还是有点模糊,以前一直认为上述方式都是引用传递,在传递对象到一个方法里面时,其实传递的是对这个对象的一个引用,相当于是引用地址。


引用传递的是传递对象的地址,值传递传递的是值的copy复制了一份。因为Java里面对象本身存放的是地址,所以有C++里面传递“引用”的效果。
1 楼 chnhopescg 2012-02-14  
看了LZ的写的文章,还是有点模糊,以前一直认为上述方式都是引用传递,在传递对象到一个方法里面时,其实传递的是对这个对象的一个引用,相当于是引用地址。

相关推荐

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

    综上所述,在Java中,对于基本数据类型的参数传递实际上是按值传递,而对于对象类型的参数传递则是按引用传递的一种特殊形式——传递的是对象引用的副本,但由于这些副本指向同一个对象,因此对对象的修改会影响到...

    62.java引用类型的参数传递.zip

    62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....

    59.java基本类型的参数传递.zip

    59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递....

    13.java参数传递之引用传递.zip

    13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....

    11.java参数传递.zip

    11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...

    Java参数传递PPT

    Java参数传递的规则是:**Java只使用值传递,但这种值传递对于对象参数表现为类似引用传递的行为。** 在值传递中,函数或方法接收的是原始数据类型(如int、double、boolean)参数的副本。例如,如果有一个方法...

    浅析Java引用类型和方法参数传递

    Java中,无论是值类型还是引用类型,在作为方法参数传递时,都遵循着一种被称为“按值传递”的机制。这意味着,当我们将一个变量作为参数传递给方法时,实际上传递的是该变量的一个副本。 ##### 1. 值传递 - **原理...

    java方法的参数传递其二.docx

    在本文中,我们将讨论 Java 方法参数传递中的引用类型传递。 在 Java 中,引用类型包括类、接口、数组等,都是对象的引用。这些引用类型在传递过程中,会将对象的引用传递给方法体内的变量,而不是对象的副本。因此...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    Java的参数传递方式实际上是一种特殊的"值传递",通常被称为"按引用传递对象的引用",这与C++等语言中的引用传递有所不同。以下是对这个主题的详细解释。 在Java中,所有的参数传递都是基于值的,但这涉及到一个...

    58.java参数传递机制.zip

    58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...

    java参数传递时到底是值传递还是引用传递分享.pdf

    Java参数传递机制是一个常见的面试问题,它涉及到Java语言的基础特性。Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 ...

    JAVA反射参数传递概略

    在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将变量的副本传递给方法,而引用传递则是传递变量指向的对象引用。对于基本类型,Java总是使用值传递;而对于对象,实际上是引用的复制,但仍然保持...

    java参数传递

    这里详细的说明了,java参数传递的过程,引用传递,值传递

    Java参数传递的经典示例

    Java参数传递机制是编程中非常重要的概念,它涉及到基本类型和引用类型的差异。在Java中,参数传递主要有两种方式:值传递(Value Passing)和引用传递(Reference Passing)。虽然Java官方文档并未明确提及引用传递...

    JAVA语言中参数传递的深入剖析.pdf

    Java语言中参数传递机制可以分为两种情况,即按值传递和引用传递。按值传递是指将实际参数的值传递给形式参数,而引用传递是指将实际参数的引用传递给形式参数。 Java中的变量可以分为基本数据类型和引用数据类型。...

    java值传递与引用传递

    总结来说,Java中的参数传递主要有以下特点: 1. 基本数据类型按值传递,函数内部无法改变实际参数的值。 2. 引用类型看似按引用传递,实际上传递的是对象引用的副本,因此函数可以影响实际对象的值。 3. `String`...

    Java语言中参数值传递和引用传递比较.pdf

    Java 语言中参数值传递和引用传递是两种不同的参数传递方式,它们在 Java 编程中扮演着重要的角色。参数值传递是指将实际参数的值复制给形式参数,形式参数的变化不影响实际参数的值。引用传递是指将实际参数的引用...

    浅议JAVA语言中的参数传递.pdf

    一些书中认为,在 Java 中参数传递都是按值传递的,但是这种说法存在一定的模糊性。本文将对 Java 语言中的参数传递进行详尽的说明。 参数传递是指在方法调用时,传递参数的方式。在 Java 中,参数传递可以分为按值...

Global site tag (gtag.js) - Google Analytics