本文共 1041 字,大约阅读时间需要 3 分钟。
最开始学习java的时候,老师跟我们说java中没有指针,=可以理解为指向,当时关于方法传参是值传递还是引用传递老师都有讲过,但是后来工作之后,时间越长好多基础的东西反而忘得越多,今天碰巧想起关于传值还是传引用的问题,整理了一下顺便记录下.
先看下边的代码:
public static void main(String[] args) {
int a = 1;
add(a);
System.out.println(a);
}
static void add(int value) {
value++;
}
最后打印的结果是1,value++并没有对a生效.
而下边的代码:
public static void main(String[] args) {
StringBuilder a = new StringBuilder("abc");
add(a);
System.out.println(a);
}
static void add(StringBuilder value) {
value.append("x");
}
打印结果是 abcx,append方法对a生效了,这是为什么呢?Java是面向对象语言,但是却不是百分之百面向对象语言,因为java中有四大基本数据类型,整形(byte,short,int,long),浮点型(float,double),字符型char,布尔型boolean,在方法传参的时候四大基本数据类型是传递值,对象则是传递引用.这样就很好的解释了上面两段程序.
而下面这段程序:
public static void main(String[] args) {
String a = "abc";
change(a);
System.out.println(a);
}
static void change(String value) {
value = "xxx";
}
打印出来的依然是 abc,String是对象,传参是传递引用,但是为什么改动没生效呢?因为不论传递值还是传递引用,都是将方法参数中的value进行指向,传递值就会在内存中复制出一个相同的值,然后value指向这个新的值,所以改动不生效.传递引用则是将value指向传进来参数的内存地址,例子二中的append方法生效.但是例子三中,值刚传进来的时候是将value指向了a的地址,但是value又重新指向了一个新开辟的内存空间,对a是没有影响的,所以不会影响a的结果.
转载地址:http://jftnx.baihongyu.com/