Java 中参数传递的问题
来源:互联网 发布:淘宝给了好评能删除吗 编辑:程序博客网 时间:2024/06/05 16:45
java初学者经常碰到的一个问题,写一个函数处理传进来的形参,可是完成后再把参数拿出来的时候,变量接收的参数值并没有发生改变,很是疑惑!
例如:
class Test1 {static void change(int b){ b=100;}public static void main(String[] args) { int a = 1; change(a); System.out.println(a);}}
运行结果自然是1。
Java 应用程序有且仅有的一种参数传递机制,即按值传递。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。
也就是说形参b是变量a的一个副本,可以理解为b=a赋值的过程,此时你对b再怎么操作终究和a没什么关系,输出的a不会有任何改变,所以Test1和Test2是等价的
class Test2 {public static void main(String[] args) { int a = 1; int b=a; b=100; System.out.println(a);}}
Test2的输出结果为1,大家应该很容易理解。
此时有人提出,我怎么看见有的时候变量可以通过形参改变值呢?
那是因为很多时候形参传递的都是一个对象引用地址的值,而并非Test1中的基本数据类型的值
例如
class Test3 {static void change(StringBuffer b){ b.append("b");}public static void main(String[] args) { StringBuffer a = new StringBuffer("a"); change(a); System.out.println(a);}}
输出结果ab
同理Test3等价于Test4
class Test4 {public static void main(String[] args) { StringBuffer a = new StringBuffer("a"); StringBuffer b = a; b.append("b"); System.out.println(a);}}
输出结果ab
Test4中输出的结果为a,而改变b为什么会引起a的值发生改变呢?那是因为当对象a的引用地址的值赋值给a时,a,b指向内存中的引用地址指向同一个内存空间,b在该空间中增加字符‘b’的同时,a虽然引用地址没发生变化,但是该空间地址的值却被b改变了,输出的结果自然是ab
class Test5 {static void change(StringBuffer b){ b= new StringBuffer();//改变b的引用地址 b.append("b");}public static void main(String[] args) { StringBuffera = new StringBuffer("a"); change(a); System.out.println(a);}}
输出结果a
Test5中b的引用地址指向了一个新的空间,所以此时与没有任何关系,故输出结果为a
JVM的解释:JVM在执行方法main时,会创建java栈(属于某一个线程,不共享),并将变量 a存储到局部变量区,在调用方法change时,根据(invoke**)指令,为change创建一个新的栈帧,并将参数保存在新栈帧的局部变量区,在执行ireturn指令后,将栈顶元素返回到调用方法的栈中,创建的栈帧也被撤销。PC寄存器指令恢复调用栈的下一条命令地址。
总结:
参数传递的只是引用地址,只有当参数指向的地址与变量指向地址相同,参数所修改的该地址空间中的值才会引起变量的值发生改变。- Java中参数传递的问题
- Java中参数传递的问题
- java中参数传递的问题
- java中有关参数传递的问题
- 关于java中参数传递的问题
- Java 中参数传递的问题
- java中参数的传递问题
- Java中参数传递问题
- Java中参数传递问题
- java中参数传递问题
- java的参数传递问题。
- Java参数传递的问题
- JAVA的参数传递问题
- Java传递参数的问题
- Java中String类型的参数传递问题的解析
- Java中String类型的参数传递问题的解析
- Java中String类型的参数传递问题的解析
- Java中String类型的参数传递问题的解析
- Chapter 1 构造过程抽象
- (一) 从Angular1到Angular2的杂谈
- HDU
- 叠框
- Eclipse在导入项目时显示 “Invalid Project Description”时的处理方法
- Java 中参数传递的问题
- PuTsangTo
- Linux:C/C++接受可变参数的宏
- JNI字段描述符对照 “([Ljava/lang/String;)V”
- nmcli 工具---待整理
- JAVA基础(五)·Properties类读取文件属性信息
- fseek与ftell做c文件的移动
- C# 入门(8) using语句,using命名空间指令,using别名指令,嵌套命名空间
- Angular2开发拙见