Java的值传递
来源:互联网 发布:彻底清除软件安装痕迹 编辑:程序博客网 时间:2024/05/21 08:35
1.问题
一直在使用线程,但是突然发现一个问题,原始类型的数据不会改变,引用类型的数据会发生改变
代码如下:
public class thread { public static void main(String args[]) { JSONObject mobileInfo = new JSONObject(); String phone = "111"; MobileThread mobileThread = new MobileThread(); mobileThread.setPhone(phone); mobileThread.setMobileInfo(mobileInfo); Thread thread = new Thread(mobileThread); thread.start(); try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("mobileInfo:" + mobileInfo.toString()); System.out.println("phone:" + phone); System.out.println("phone:" + mobileThread.getPhone()); }}class MobileThread implements Runnable { private String phone; private JSONObject mobileInfo; public void setMobileInfo(JSONObject mobileInfo) { this.mobileInfo = mobileInfo; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public void run() { try { Thread.sleep(8000); System.out.println("===="); mobileInfo.put("key", "11"); phone = "333"; } catch (InterruptedException e) { e.printStackTrace(); } }}
结果:
可以看出JSONOBJECT对象里面的值是改变了的,但是phone的值是没有改变的,必须要使用get方法才可以获取发生改变的那个值。
2.想法
难道是java里面的值传递和引用传递?
3.结果
查阅了很多文档和博客,原来java只有值传递没有引用传递。
Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的,如果在函数中改变了副本的值不会改变原始的值。所以phone的值是没有发生改变的。
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。
package com.xu.test;import net.sf.json.JSONObject;public class ParamTest { public static void main(String[] args) { /** * Test 1: 原始类型数据 */ int percent = 10; System.out.println("Before: percent=" + percent); t1(percent); System.out.println("After: percent=" + percent); /** * Test 2: 引用类型数据 */ System.out.println("\nTesting t2:"); JSONObject jsonObject = new JSONObject(); jsonObject.put("key","123"); System.out.println("Before: jsonObject=" +jsonObject); t2(jsonObject); System.out.println("After: jsonObject=" + jsonObject.toString()); /** * Test 3: 地址改变 */ System.out.println("\nTesting t3:"); JSONObject a = new JSONObject(); a.put("key","123"); JSONObject b = new JSONObject(); b.put("key","456"); System.out.println("Before: a=" + a.toString()); System.out.println("Before: b=" + b.toString()); t3(a, b); System.out.println("After: a=" + a.toString()); System.out.println("After: b=" + b.toString()); } private static void t3(JSONObject x, JSONObject y) { JSONObject temp = x; x = y; y = temp; System.out.println("End of method: x=" + x.toString()); System.out.println("End of method: y=" + y.toString()); } private static void t2(JSONObject x) { x.put("key2","456"); System.out.println("End of method: x=" + x.toString()); } private static void t1(int x) { x = 3 * x; System.out.println("End of Method X= " + x); }}
0 0
- java的值传递
- Java的值传递
- Java的值传递
- Java的值传递
- JAVA的值传递
- 值传递的Java
- java的值传递还是引用传递
- Java的值传递与引用传递
- Java的值传递和引用传递
- java的值传递与引用传递
- java的引用传递和值传递
- java的引用传递和值传递
- java的值传递与引用传递
- java的值传递,没有引用传递
- Java的引用传递和值传递
- java的值传递和引用传递
- java的值传递和引用传递
- JAVA的值传递与参数传递
- mysql索引优化
- 【杭电】[1254]推箱子
- Processing 3 中手动添加系统库(processing.* )
- IntelliJ IDE运行Tomcat报错:Unable to ping server at localhost:1099
- Triplanar Projection
- Java的值传递
- Hadoop RPC分析 (二) -- Server
- 选夫婿1
- 我的博客
- Codeforces
- 由系统的内容提供器读取手机联系人信息
- VS2013下搭建SDL开发环境
- PHP阶段总结
- win7下安装wince6.0遇到问题的解决