java中的值传递和引用传递
来源:互联网 发布:中国经济数据网 编辑:程序博客网 时间:2024/04/30 13:04
最近看的一本面试书上写:
Java语言提供了两种参数传递的方式:值传递和引用传递。
值传递:在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此对形参的改变不会影响实参的值。
引用传递:传递的是对象(也可以看作是对象的地址),这时形参与实参的对象指向同一块存储单元,因此对形参的修改就会影响实参的值。
后来在网上查阅了一些资料,说Java中只存在值传递,而引用传递,传递的是引用的地址值,实际上还是值传递。个人更倾向与这种说法。在Java中,除了8种基本数据类型(int、short、long、byte、float、double、char、boolean)是直接按值传递,而其他的类型都是传递的地址值。
public class Test{public static void change(StringBuffer ss1,StringBuffer ss2){ss1.append(" World");ss2=ss1;}public static void main(String[] args){int m=1;int n=m;n++;System.out.println(m);System.out.println(n);Integer a=1;Integer b=a;b++;System.out.println(a);System.out.println(b);StringBuffer s1=new StringBuffer("Hello");StringBuffer s2=new StringBuffer("Hello");change(s1,s2);System.out.println(s1);System.out.println(s2);}}输出为:
1
2
1
2
Hello World
Hello
在上面的例子中,虽然m,n这一组和a,b这一组代码和结果基本上完全一样,但是他们实质上代表了两种不同的类型。int属于8中基本数据类型之一的,是直接传递值的,n=m后,m和n就指向不同的存储单元。但是Integer是int的包装类(不属于基本类型),一旦一个对象被创建出来后,就不允许修改它的值了。所以,b=a后,a和b指向同一块存储单元,b++后,单独分配了一块内存存储结果,把新的地址值给了b(等于新创建了一个值为2的Integer对象赋值给b)。所以这个时候a和b并没有任何关系了,他俩的值也不同了。s1将自己的地址值传给ss1,而在执行ss1.append(" World“)时,改变了这个地址值的那块内存里的值,从Hello变成了Hello world。s2将自己的地址值传递给ss2,但是在ss2=ss1时,ss2的地址值和ss1相同了,但是s2的地址值并没有任何改变。所以仍然是Hello。
0 0
- java中的“值传递”和“引用传递”
- java中的值传递和引用传递
- Java中的值传递和引用传递
- java中的值传递和引用传递
- java中的值传递和引用传递
- java中的值传递和引用传递
- Java中的值传递和引用传递
- java中的值传递和引用传递
- java中的值传递和引用传递
- java中的值传递和引用传递
- java中的值传递和引用传递
- java中的值传递和引用传递
- java中的值传递和引用传递
- java中的值传递和引用传递
- Java中的值传递和引用传递
- Java中的值传递和引用传递
- java中的值传递和引用传递
- Java中的值传递和引用传递
- 一些杂乱的知识点(未整理)
- a class's lifetime
- redhat安装上安装和配置jdk1.8详细步骤
- UVALive 3683 A Scheduling Problem(树形DP)
- 算法竞赛入门经典 第二版 习题5-11 更新字典 Updating a Dictionary uva12504
- java中的值传递和引用传递
- Linux中关于init.d分析
- poj 2104 K-th Number (分桶法和平方分割)
- 什么是机器学习:一次权威定义之旅
- Java NIO笔记之Buffer
- 多线程2--毕向东基础视频教程学习笔记
- dpdk内存管理之内存初始化(内存收集)
- kernel32.dll函数介绍
- 动态内存分配:如何将两个字符串连接成单个字符串