您的位置:首页 > 编程语言 > Java开发

Java中是传值还是传引用

2016-04-25 15:01 232 查看
总述:对于基本类型变量,Java是传值的副本;对于对象型变量,Java是传引用的副本。

在java中,变量分为两类:基本类型变量,对象型变量。(注意:String 类型也是对象型变量)

1,基本类型变量的传值

传值就是把自己复制一份传递,即使自己的副本变了,他们的值也不变。

例子:

public class test {
public static void main(String args[]){
boolean te = true;
System.out.println("传值之前:"+te);
test(te);
System.out.println("传值之后:"+te);
}
public static void test(boolean te){
te = !te;
System.out.println("方法类的值:"+te);
}
}
输出结果:
传值之前:true

方法类的值:false

传值之后:true

以参数形式传递简单类型的变量时,将参数的值作为一个副本传进方法函数的,那么无论在方法中如何操作这个数,都是操作副本,于源值本身是没有影响的。

2.对象型变量的传递

传值就是传递引用副本指向自己的地址,而不是它实际值的副本。为什么这么做呢?因为对象类型是放在堆里,一方面,速度相对于基本类型比较慢;另一方面,对象类型本身比较大,如果采用重新复制对象值的方式,即浪费内存,又浪费时间。

通过两个例子实际看下

例2.1

public class test {
public static void main(String args[]){
StringBuffer string = new StringBuffer("hello");
test(string);
System.out.println(string);
}
public static void test(StringBuffer str){
str.append(" world");
}

}
输出结果:
hello world

Java对于引用对象类型的变量时,将引用的一个副本传递进方法函数,那么这个函数里面的引用副本所指向的是什么呢,是对象的地址。通过引用副本找到地址并修改地址中的值,也就是修改了对象。

例2.2

public class test {
public static void main(String args[]){
String string = new String("hello");
test(string);
System.out.println(string);
}
public static void test(String str){
str = "world";
}

}
输出结果:
hello

为什么会这样呢?

我们必须清楚一点:String类是final类型的,因此,你不可以修改和继承这个类。str="world"就是隐含的让编译器生成一个新的String对象。既然是新的,那么自然和源值没有关系,但函数结束,str的作用就消失了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息