在方法调用时,需要根据方法声明传入适当的参数,通过每次调用方法时传参,极大的增强了方法的统一性,避免了方法内部功能代码的重复。但是在实际传递参数时,如果在方法内部修改了参数的值,则调用时使用的变量是否发生改变呢?
例如如下代码:
/**
* 参数传递代码示例
*/
public class TransferValueDemo {
public static void main(String[] args) {
int m = 10;
int[] a = {1,2,34};
test(m,a);
System.out.println(m);
System.out.println(a[0]);
}
public static void test(int n,int[] t){
n = 0;
t[0] = 123;
}
}
则执行该程序以后,程序的输出结果是:10 123。则在调用test方法时,同样都是传入参数,为什么变量m的值未改变,而a[0]的值发生了改变呢?下面就来说明该问题。
在参数传递时,一般存在两种参数传递的规则,在Java语言中也是这样,这两种方式依次是:
l 按值传递(by value)
按值传递指每次传递参数时,把参数的原始数值拷贝一份新的,把新拷贝出来的数值传递到方法内部,在方法内部修改时,则修改的时拷贝出来的值,而原始的值不发生改变。
说明:使用该方式传递的参数,参数原始的值不发生改变。
l 按址传递(by address)
按址传递指每次传递参数时,把参数在内存中的存储地址传递到方法内部,在方法内部通过存储地址改变对应存储区域的内容。由于在内存中固定地址的值只有一个,所以当方法内部修改了参数的值以后,参数原始的值发生改变。
说明:使用该方式传递的参数,在方法内部修改参数的值时,参数原始的值也发生改变。
在Java语言中,对于那些数据类型是按值传递,那些数据类型是按址传递都作出了硬性规定,如下所示:
l
按值传递的数据类型:八种基本数据类型和String(这样理解可以,但是事实上String也是传递的地址,只是string对象和其他对象是不同
的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存
地址。关于String的特殊性见本博客的String类深入解析)。
l 按址传递的数据类型:除String以外的所有复合数据类型,包括数组、类和接口
按照这里的语法规则,则上面的代码中变量m的类型是int,属于按值传递,所以在方法内部修改参数的值时m的值不发生改变,而a的类型是数组,属于按址传递,所以在方法内部修改参数的值时,原始的值发生了改变。
按值传递和按址传递在实际使用时,需要小心,特别是在方法内部需要修改参数的值时。有些时候,对于按值传递的参数需要修改参数的值,或者按址传递时,不想修改参数的值,下面是实现这两种方式时的示例代码。
按值传递时通过返回值修改参数的值:
/**
* 按值传递的类型通过返回值修改参数的值
*/
public class TransferValueDemo1 {
public static void main(String[] args) {
int m = 10;
m = test1(m); //手动赋值
System.out.println(m);
}
public static int test1(int n){
n = 15;
return n;
}
}
在该示例代码中,通过把修改以后的参数n的值返回,来为变量m赋值,强制修改按值传递参数的值,从而达到修正参数值的目的。
按址传递时通过重新生成变量避免修改参数的值:
/**
* 按址传递时通过重新生成变量避免修改参数的值
*/
public class TransferValueDemo2 {
public static void main(String[] args) {
int[] a = {1,2,3};
test2(a);
System.out.println(a[0]);
}
public static void test2(int[] m){
int[] n = new int[m.length];
for(int i = 0;i < m.length;i++){
n[i] = m[i];
}
n[0] = 10;
}
}
在该示例代码中,通过在方法内部创新创建一个数组,并且把传入数组中每个参数的值都赋值给新创建的数组,从而实现复制数组内容,然后再修改复制后数组中的值时,原来的参数内容就不发生改变了。
这里系统介绍了Java语言中参数传递的规则,深刻理解这些规则将可以更加灵活的进行程序设计。例如使用复合数据类型按址传递的特性可以很方便的实现多参数的返回,代码示例如下:
public int test3(int[] m,int[] n){……}
则该方法中,实际上返回了三种值,一个int的返回值,数组m的值,数组n的值,这只是参数传递的一种基本使用,在JDK提供的API文档中也大量的存在该方法。
当是对象时,方法取得的是引用的copy。swap(obj a,obj b)
调用是swap(c,d),就是对象a,b的引用进行了复制。引用a和c都指向同一对象,引用b和d都指向同一对象。如果Integer有
setValue方法没有问题,但可惜没有,用int
t=p.intValue能取得对象的值,但还是不能交换。如果创建新对象,影响的只是c和d,不会影响a,b。
注意JAVA和VC的区别,JAVA没有指针,因此在无论方法中的形参怎样变化,方法外的实参不受影响。(这句话也不完全对)
string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存地址。
分享到:
相关推荐
58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...
传值还是传引用 详细讲解JAVA参数传递机制 一目了然
主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
清晰的描述java参数传递机制,有效地帮助不管是java初学者还是高手解决参数传递疑惑。
方法的参数传递机制测试类,以供大家交流之用。
java基础面试题方法的参数传递机制本资源系百度网盘分享地址
主要介绍了Java方法的参数传递机制,结合实例形式详细分析了java方法参数传递机制原理、实现方法及操作注意事项,需要的朋友可以参考下
1. 对OGNL操作进行封装,完成OGNL表达式所表示的值到Java对象的值传递机制 2. 在参数传递的过程中,做恰当的类型转化,保证页面上的字符串能够转化成各 式各样的Java对象 接下来,通过四个不同的角度,来具体讲述...
参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用传递参数,以避免因依赖“按引用传递”这一行为而导致的...
invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法...
定义类、属性和方法 创建并使用对象、对象和引用 Java方法的参数传递机制 方法的重载 实现良好的封装 构造方法的作用和构造方法重载
Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、...
掌握在 Applet 容器中添加组件的方法,掌握使用布局管理器对组件进行管理的方法。 2. 理解 Java 的事件处理机制,掌握为不同组件编写事件处理程序的方法。 3. 掌握编写独立运行的窗口界面的...9. 向applet中传递参数。
1.数据库 2.Java与网络 3.数据流 下载 4.Java的多线程机制 5.多媒体 6.异常处理 7.窗口和对话框 8.参数传递 9.面版和布局 10.事件处理 11.AWT组件 12.抽象类和接口 13.类和对象 14.Java基础
完成项目所用技术: 1、Swing窗体设计 Frame类的使用 Graphics类的使用 2、面向对象程序设计 ...5、使用Java的异常处理机制处理异常 使用try/catch/finally处理异常 使用异常类输出异常信息 开发工具:Eclipse
参数传递.docx 第二周所学总结.docx 反射机制.docx 泛型.docx 封装和继承以及多态部分.docx 接口和抽象类以及实现类.docx 枚举enum.docx 设计模式.docx 数组.docx 网络编程.docx 线程和内部类.docx 循环和类对象....
一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为...
多态性 (重载overload,方法名相同、参数的个数不同、参数的类型不同、返回的类型不同和覆盖override) ;多态性就是“一种接口,多种方法”,可以为一组相关的动作设计一个通用的接口,其实类的函数的重载就是一种...
5.2.2 方法的参数传递机制 116 5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员...