传值
关于传值问题,我们可以先来看看以下代码:
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
总的来说,当一个变量是简单的数据类型时,它就是值传递,对值的拷贝做改变,而对于类的实例它采用的是类的引用。