传值传引

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/W_Chelsea/article/details/96283753

传值

关于传值问题,我们可以先来看看以下代码:

1		public void fuzhi(){
2			int x = 1;
3			this.change(x);
4			System.out.println(x);
5		}
6		public void change(int i){
7			i=10;
8		}

这个代码最后输出的结果为1。
为什么是1而不是10呢?
首先我们先来说一下数据类型
我们知道在Java中有这些数据类型:
第一类:逻辑型 boolean
第二类:字节型 byte
第三类:文本型 char
第四类:数值型

  • 整数型(long,short,int)
  • 浮点型(float,double)

我们再来看之前的代码,在执行到第二行代码时,整数型变量x被赋予了一个值:1,在内存中即:
【变量x】→1
在第三行调用change方法时,这里并不是直接将x指向了change方法中的值,而是多做了一个步骤:将变量x拷贝了一次,将这个拷贝过的x使用调用的方法change。所以第四行输出的x还是原来的x,也就是1。这就是传值问题。简单来说:

  • 【变量x】→1
  • 拷贝x
  • 【变量x(拷贝)】→10
  • 输出原来的变量x

一般来说,如果一个数据类型是简单类型的,那么它就是值传递。

传引用

关于传引用,有这样一段代码:

1		public void fuzhi(){
2			StringBuffer x = new StringBuffer("Good");
3			this.change2(x);
4		System.out.println(x);
5		}
6		public void change2(StringBuffer i){
7			i.append(" moring!");
8		}

这段代码的运行结果却不是原来的变量值Good了,而是Good moring!
这里面又发生了什么神奇的事情呢?

这里的数据类型已经不再是简单类型,这里传递的是类的引用:

第二行【变量x】→Good
第三行在调用change2时变量i指向了x指向的内存空间,所以在调用append时,仍然是在刚开始的变量x上作调整。所以【变量x】→Good moring

总的来说,当一个变量是简单的数据类型时,它就是值传递,对值的拷贝做改变,而对于类的实例它采用的是类的引用。

猜你喜欢

转载自blog.csdn.net/W_Chelsea/article/details/96283753