`
JackyCheng2007
  • 浏览: 253588 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中函数参数的传递

    博客分类:
  • Java
阅读更多
一般谈到函数的参数传递的时候都会想到值传递和引用传递。看看本文的例子就会很清楚了。

public class MethodParameter {
	public static void main(String[] args) {
		String str = "Hello";
		char[] c = new char[] { 'W', 'o', 'r', 'l', 'd' };
		StringBuffer sb = new StringBuffer("Jacky");

		changeAddr(str, c, sb);
		System.out.println(str);
		System.out.println(c);
		System.out.println(sb.toString());

		changeValue(str, c, sb);
		System.out.println(str);
		System.out.println(c);
		System.out.println(sb.toString());
	}

	private static void changeAddr(String str, char[] c, StringBuffer sb) {
		str = "Hi";
		c = new char[] { 'C', 'h', 'i', 'n', 'a' };
		sb = new StringBuffer(" Cheng");
	}

	private static void changeValue(String str, char[] c, StringBuffer sb) {
		str.toUpperCase();
		c[0] = 'C';
		sb.append(" Cheng");
	}
}


你认为会得到什么结果呢?不如先别看结果看看你是不是能做对。

引用

Hello
World
Jacky
Hello
Corld
Jacky Cheng

因为值传递很简单,比如传int值,你肯定知道在函数里无论你怎么修改这个int值都不会改变它传进来之前的变量的值。所以,我的这个例子中都是引用传递。
我觉得得说明一下什么是值,什么时候引用。其实值通常是只原始数据类型比如int,char等,但不包括String哦。所谓引用就是只指向对象或者数组的地址的值。

知道了这个,就应该知道上面sb的变化原因了。至于str,你可知道String是immutable类,所以你是没有办法修改它的值的,只能改变它的引用。对于c,是一个数组,数组引用和对象引用遵循同样的规制。

另外其实数组也是一种对象,而且还是一级对象,还记的你对数组的构建也是new出来的吗?无论是原始值数组还是对象数组基本没有什么区别,只是前者存原始类型的值,后者存贮对象的引用值。数组只有一个只读成员length,它告诉你数组的长度。另外还有唯一一个访问方法就是'[]',通过这个你可以读取或者赋值某一个数组元素。如果你用过java.lang.System提供的数组copy方法:
public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)

int[] dataFrom = new int[]{1,2,3};
int[] dataTo = new int[10];
//把dataFrom 所有元素copy到dataTo里从3开始的后面。
System.arraycopy(dataFrom , 0, dataTo, 3, 3);


你看,数组是可以作为Object传入这个方法的,利用这一点,你也可以自己写通用的数组函数了。只要把Object作为形参类型就好。

进一步的思考
可以看出Java中参数的传递是传递的值,不过这个值有两种,一种是我们看得到的值,也就是primitive类型,比如int,double,char类型的值。另一种就是我们看不到的值,也就是地址值,也可以说是引用值,就是你传递对象或数组类型的参数时传递的值。
其实我们也可以这么理解,当传参数的时候,会把参数的primitive值或者引用值copy给形式参数。因此,任你在方法里面怎么修改这些值都不会对原来的变量有影响。
但是对于引用值,如果你在方法里面利用这个引用值访问对象或者数组里面的数据或方法的时候,这和在方法外面直接做事一样的。因为他们持有的是同一个地址。

理解了这些,试想一下,如果在参数前加上final有什么好处吗?
如果是primitive的参数,有什么用?只能是说你在方法里面不能修改这个变量的值。其实你就算修改了,也只是对方法自己有影响,不会对调用者有影响。
如果是引用类型的参数呢?又有什么用?不可能说不让你修改对象的值,只能不让你修改这个形式参数变量的引用值。到底有什么好处呢?
从设计API的角度来说,如果你在primitive参数上加上final,就是告诉自己,这些值对于我的方法来说就是常量,是我需要参考的东西。他们的值在我的整个方法的所有的地方都是一样的。试想,如果不加final,有可能你在方法里面前后两次访问这个变量的值不同,因为你在这之间无意中修改了它。这样就达不到你的意图。
那么如果是引用类型的参数呢?这里面的意图,就是告诉你在方法里面访问(不论是读还是修改)的这个对象就是传进来的对象,而不是别的。同样保证你在方法里面不同地方的操作都是对这一个对象的操作。

再进一步的思考
有了前面的思考,我们就可以知道,在设计方法的时候,尽量在参数前面加上final,不管是primitive类型的还是在引用类型的前面。因为这样意图非常简单清楚,在方法里面也可以大胆的引用。回顾你需要修改它们的时候,是不是无意中把他们当成自己定义的临时变量了,这样很危险,容易出乱子。这样是为什么当你用sun的规范做check style的时候他让你改的原因。

还要再来一点思考
为什么当你调用回调函数的时候必须得加final呢?看了一篇文章说是多线程以及垃圾回收的原因迫使的,我得研究以后再来补充。


2
0
分享到:
评论
1 楼 swincle 2011-10-19  
讲的很好~

相关推荐

    java 中函数的参数传递详细介绍

    在Java编程语言中,函数参数传递机制是一个关键概念,它涉及到如何在方法内部操作传入的参数。根据Java的特性,参数传递分为两种主要类型:值传递和引用传递。下面我们将详细探讨这两种传递方式以及它们在不同数据...

    Java的引用和函数参数传递

    通过上述分析,我们可以清楚地了解到Java中引用和函数参数传递的基本概念以及它们的具体应用。了解这些概念对于正确使用Java进行编程非常重要,尤其是在处理复杂的数据结构和对象交互时。希望本文能帮助读者更好地...

    函数调用参数传递类型(java)的用法介绍..ppt

    本文档主要介绍 Java 中函数调用参数传递类型的用法,通过对 Applet 概述、Applet 应用程序接口、绘图、Swing 基础、Swing 的特点和概念、Swing 组件、其它 Swing 特性等方面的讲解,展示了 Java 语言程序设计的主要...

    C、C++函数参数传递方式.pdf

    C和C++中的函数参数传递方式主要分为值传递、指针传递和引用传递。这些方式决定了参数在函数调用时的传值行为,以及它们在函数执行后是否能够影响原始数据。下面详细解释这些传递方式的知识点。 1. 值传递(Call by...

    java中传值与传引用

    总结来说,Java中函数参数传递的基本规则是: 1. 对于基本数据类型,参数是值的副本,函数内部对参数的修改不会影响原变量。 2. 对于引用类型,参数是引用的副本,函数可以修改对象的属性,但不能改变引用本身。...

    探讨Java中函数是值传递还是引用传递问题

    在Java中,函数参数传递的问题一直是一个常见的讨论话题。根据标题和描述,本文将深入探讨Java中函数参数传递的机制,究竟是值传递还是引用传递。实际上,Java只支持值传递,但这种值传递对于引用类型(对象)的数据...

    C与C++中的函数参数传递机制

    ### C与C++中的函数参数传递机制 #### 引言 在C与C++编程语言中,函数参数的传递方式是程序设计中的一个重要概念。它不仅直接影响到函数内部如何处理这些参数,还决定了函数调用时对原始数据的影响。本文将深入...

    java8函数式编程(csdn)————程序.pdf

    * 高阶函数:函数式编程可以将函数作为参数传递给其他函数,或者将函数作为返回值返回。 Lambda 表达式: Lambda 表达式是函数式编程的核心,它由箭头 -> 分隔开参数和函数体,箭头左边是参数,右边是 lambda 返回...

    Java参数传递PPT

    在值传递中,函数或方法接收的是原始数据类型(如int、double、boolean)参数的副本。例如,如果有一个方法tripleValue,它接受一个double类型的percent并尝试将它乘以3,实际上这个操作不会影响到原始的percent变量...

    java函数速查手册常用函数

    Java函数速查手册是编程学习过程中非常实用的参考资料,它主要涵盖了Java语言中常见的函数,对初学者来说尤其有价值。这个CHM文件很可能是由一系列的函数解释、示例代码和使用指南组成的电子手册,方便用户快速查找...

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

    在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点并非完全对立,而是根据不同的角度来描述Java中的参数传递...

    java传递参数的方法

    java传递参数的方法 很的东西 大家下载学习一下

    Jni中C++和Java的参数传递

    在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java对象和C++数据类型的映射关系。在JNI中,Java的基本数据类型如`boolean`, `byte`, `char`, `short`, `int`, `float`, `...

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

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

    完整版 Java基础入门教程 Java程序语言设计 03 java对象 类与对象2(共23页).ppt

    - Java中函数参数传递默认采用值传递,基本类型传递的是值的拷贝,对象传递的是对象引用的拷贝。 6. **对象的使用**: - 通过`objectName.variableName`访问对象的属性,`objectName.methodName()`调用对象的方法...

    参数传递的总结——构造函数

    本文将对"参数传递的总结——构造函数"这一主题进行详细阐述,主要关注如何在构造函数中有效地管理和传递参数。 首先,让我们理解什么是参数传递。在编程中,当我们调用一个函数或方法时,我们可以向其提供一些值,...

    java中参数传递方式详解

    Java中参数传递方式详解 Java 中参数传递方式详解是 Java 新手入门面临的一个经典的话题。本文意在终结这个话题,Java 中有说法:Java 里面参数传递都是按值传递,怎么理解这句话? 按值传递和按引用传递是来自 ...

    Jni中C和Java的参数传递.doc

    总结一下,JNI 参数传递的关键点包括: 1. **类型映射**:Java 和 C++ 的数据类型不同,需要使用 JNI 提供的类型映射,如 `jint`、`jstring` 等。 2. **字段访问**:使用 JNI 的 `GetFieldID` 和 `GetObjectField`...

    java函数使用查询包

    总之,理解和熟练运用Java函数是成为Java开发者的必备技能,它涵盖了广泛的概念和技术,包括但不限于参数传递、返回值、重载、异常处理、异步操作等。不断学习和实践这些知识点将有助于提升你的编程能力。

Global site tag (gtag.js) - Google Analytics