这个问题一直以来都有误区。本质原因是那些写书的人,喜欢用“传引用”的这个概念,从而混淆Java传值的本质。
Java中参数的传递只有传值方式。
首先必须搞清楚,普通变量和引用变量。
普通变量:其内存单元即存的是值本身。如int值,其内存值只是自己的值。
引用变量:其内存单元存储的是一块内存的地址。其概念与指针是一样的。
在Java调用函数传递值的时候,函数外变量总是把自己的值赋给函数的参数变量。注意参数变量和函数外变量其内存单元的地址是不一样的,两个是不同的东西。
函数外变量传值给函数参数,函数参数的值发生改变,不影响到函数外部变量的值。
public class StringArg { //Java中总是使用传值调用。 public static String cao ="cao!"; public static MyFinal final1 = new MyFinal(); public static MyUnFinal final2 = new MyUnFinal(); public static int int1 = 1; public static void m1(String arg){ System.out.println("m1方法执行,输入参数为:"+arg); arg = "123"; System.out.println("m1方法结束,输出参数为:"+arg); } public static void m2(MyFinal arg){ System.out.println("m2方法执行,输入参数为:"+arg.toString()); arg = new MyFinal(); System.out.println("m2方法结束,输出参数为:"+arg.toString()); } public static void m3(MyUnFinal arg){ System.out.println("m3方法执行,输入参数为:"+arg.toString()); arg = new MyUnFinal(); System.out.println("m3方法结束,输出参数为:"+arg.toString()); } public static void m4(int arg){ System.out.println("m4方法执行,输入参数为:"+arg); arg = 2; System.out.println("m4方法结束,输出参数为:"+arg); } public static void main(String[] args) { m1(cao); System.out.println("main方法中调用m1方法之后的参数值:"+cao); System.out.println(); m2(final1); System.out.println("main方法中调用m2方法之后的参数值:"+final1); System.out.println(); m3(final2); System.out.println("main方法中调用m3方法之后的参数值:"+final2); System.out.println(); m4(int1); System.out.println("main方法中调用m4方法之后的参数值:"+int1); System.out.println(); } } final class MyFinal{} class MyUnFinal{}
以上代码输出的结果为:
m1方法执行,输入参数为:cao! m1方法结束,输出参数为:123 main方法中调用m1方法之后的参数值:cao! m2方法执行,输入参数为:MyFinal@61de33 m2方法结束,输出参数为:MyFinal@14318bb main方法中调用m2方法之后的参数值:MyFinal@61de33 m3方法执行,输入参数为:MyUnFinal@ca0b6 m3方法结束,输出参数为:MyUnFinal@10b30a7 main方法中调用m3方法之后的参数值:MyUnFinal@ca0b6 m4方法执行,输入参数为:1 m4方法结束,输出参数为:2 main方法中调用m4方法之后的参数值:1
可以看出函数方法无法影响到函数外部变量的值。
说明:
1、对于m1(String arg)字符串参数传递的问题,该问题非常经典。经常出现在面试中。
2、对于m2()和m3()方法,参数在函数内部重新分配了新的内存地址,即函数的参数有了新的值。但是外部变量的值没有变化。
之前一直会把以上问题与下面这个例子搞混掉
public class StringArg { public static MyObject myObject = new MyObject("cao!"); public static void m5(MyObject arg){ System.out.println("m5方法执行,输入参数为:"+arg.name); arg.name = "123"; System.out.println("m5方法结束,输出参数为:"+arg.name); } public static void main(String[] args) { m5(myObject); System.out.println("main方法中调用m5方法之后的参数值:"+myObject.name); System.out.println(); } } class MyObject{ public String name = ""; public MyObject(String name){ this.name = name; } }
输出当然是:
m5方法执行,输入参数为:cao! m5方法结束,输出参数为:123 main方法中调用m5方法之后的参数值:123
该例中,参数变量并没有重新与新对象绑定,即没有获得新值。在原值所指向的内存区域将对象进行修改。
相关推荐
java传值中的乱码,最简易的解决方法。 兄弟姐妹们,快来下载吧
JAVA传值与传引用[整理].pdf
lotus domnio java代理传值
java传值所用的基本方法与java传值时是传引用还是传值
很多初学者比较疑惑的地方,看看绝对有帮助的。帮你打好Java的基础知识
java及C++中传值传递、引用传递和指针方式的理解.docx
Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE...
java文件路径获取方法应用总结,非常好
关于Java参数传递的PPT,详细介绍参数传递的类型。彻底理解Java只有唯一传递方式——值传递。
第一次使用int实验: public class TTEST { private static List<UserEntity> mList = new LinkedList(); public static void main(String[] args) { int a = 0; changeA(a); System.out.println("a = "+a);...
Java是传值还是传址引用
Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。既然争论中提到了引用这个东西,为了搞清楚这个问题,我们必须要知道引用是什么。 简单的说,引用其实就像是一个对象的名字...
Java页面form表单值的简单获取方法
java中传值与传引用,详细讲解java中的传值与传引用
Flex与Java通过实体传递数据
传值和传引用的问题一直是Java里争论的话题。与C++不同的,Java里面没有指针的概念,Java的设 计者巧妙的对指针的操作进行了管理。事实上,在懂C++的Java程序员眼中,Java到处都是精美绝伦的指 针。
invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法示例 localVariable.java 演示局部变量 ...
java传参问题,通过对原始类型的传参和对应用类型的传参分析java的传值问题
Ajax传值到Jsp中 传值到Servlet中 传值到Java方法中