Java中按值传递问题
来源:互联网 发布:无尽的传说2 mac 破解 编辑:程序博客网 时间:2024/06/10 23:59
一直对Java中到底是值传递还是引用传递有疑惑,今天下午花时间学习了一下,写一个总结。由于作者水平有限,文章中有错误或不当的地方请读者指出。
1. 概述
首先要明确的是Java中方法参数传递只有值传递,不存在引用传递。虽然我们平时调用一个方法时,把对象(数组,类或接口)当作参数传入,在方法中可以改变对象中某个属性的值,这个假象使我们认为对于对象(数组,类或接口)的传递似乎有点像引用传递,但是实际上这个传入方法的值是对象引用的拷贝,即传递的是引用的地址值,所以Java中只存在按值传递。
- 若参数是基本类型,传递的是基本类型的字面量值的拷贝。
- 若参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。
2. 案例
下面通过几个小案例来说明
2.1 参数为基本数据类型
public class Demo1 { public static void main(String[] args) { int num1=10; change(num1); System.out.println(num1); } static void change(int num2){ num2=20; }}//结果://num1=10
分析:
2.2 参数为引用数据类型
2.2.1 没有提供改变自身方法的引用数据类型
public class Demo2 { public static void main(String[] args) { String str=new String("Java"); change(str); System.out.println("str:"+str); } static void change(String arg){ arg="PHP"; }}//结果://str:Java
分析:
2.2.2 提供了改变自身方法的引用数据类型
public class Demo3 { public static void main(String[] args) { StringBuilder sb=new StringBuilder("Java"); change(sb); System.out.println("sb:"+sb); } static void change(StringBuilder arg){ arg.append("语言"); }}//结果://sb:Java语言
分析:
2.2.3 提供了改变自身方法的引用数据类型,但未使用,而是用赋值运算符
public class Demo4 { public static void main(String[] args) { StringBuilder sb=new StringBuilder("Java"); change(sb); System.out.println("sb:"+sb); } static void change(StringBuilder arg){ arg=new StringBuilder("PHP"); }}//结果://sb:Java
分析:
2.3 其他例子
下面这个案例也可以说明
public class Demo5 { public static void main(String[] args) { //创建user1对象 User user1=new User(1,"Jack"); //创建user2对象 User user2=new User(2,"Tom"); //调用swap方法前 System.out.println("调用swap()方法前:"); System.out.println(user1); System.out.println(user2); System.out.println("-------------------------"); //调用swap方法 swap(user1,user2); System.out.println("用swap()方法后:"); System.out.println(user1); System.out.println(user2); } //swap方法用于交换 public static void swap(User user1,User user2){ User user3=user1; user1=user2; user2=user3; }}class User{ private int id; private String username; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public User(int id, String username) { this.id = id; this.username = username; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + '}'; }}//结果://调用swap()方法前://User{id=1, username='Jack'}//User{id=2, username='Tom'}//-------------------------//用swap()方法后://User{id=1, username='Jack'}//User{id=2, username='Tom'}
3. 总结
通过上面几个案例可以明白 ,java中方法参数传递方式是按值传递。
- 若参数是基本类型,传递的是基本类型的字面量值的拷贝。
- 若参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。
0 0
- Java中按值传递问题
- java数据传递问题
- JAVA引用传递问题
- java参数传递问题
- java参数传递问题
- Java 中值传递问题
- Java参数传递问题
- java值传递问题
- java中值传递问题
- JAVA引用传递问题
- java参数传递问题
- java参数传递问题
- java参数传递问题
- Java中值传递和引用传递问题
- java-webwork:参数传递问题
- java的参数传递问题。
- java中的参数传递问题
- java方法参数传递问题
- GDB寄存器和内存
- C++的高级特性
- 用charles拦截android设备https,证书无效的解决方法
- LeetCode 371.Sum of Two Integers
- Julia :迎接0.6的到来
- Java中按值传递问题
- 数据结构-二叉树(包含递归和非递归版本)
- Java中hashCode的作用
- python交互模式下退格键乱码问题
- Fn+W
- 学习GIT
- IOS开发学习笔记(四)
- 深度神经网络(DNN)模型与前向传播算法
- 29、文件操作--顺序文件的写操作