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的作用就消失了。
在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的作用就消失了。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树