Java里的传值实际上是拷贝引用,而不是拷贝对象。
如果是以基本数据类型(包括String类)做参数进行传递,或以某个类名(包括数组名)为类型做为参数而[color=red]直接对其类进行操
作(非类的属性)[/color],这样的传递叫值传递;
如果是以某个类名为类型做为参数进行传递而[color=red]针对该类的属性进行的操作[/color],这样的传递叫做引用传递。
也就是说在值传递的过程中其操作不会对所传进来的对象有任何的影响,它传进来的只是该对象的一个副本,其本身不会有任
何的改变;而引用传递则传进来的是该对象的一个别名,即引用该对象在虚拟机中的“地址”,因此引用传递会对该“地址”的内
部属性产生影响,而不会改变该“地址”在虚拟机中的位置,即引用传递在外部看来是没有发生过任何变话的,但从内部看来,
它的属性会随着调用它的方法的改变而改变
因此,也有人说JAVA只有“值传递”,而没有引用传递。
一个简单的例子:
输出为:
a,b
b,a
*************************************************************
按值传递:
8中基本数据类型(int,short int ,long int, double, float, char, byte,boolean)和String,Integer,Char,Double等基本数据类型的包装类
特点:在内存中复制一份数据,把复制后的数据传递到方法内部
作用:在方法内部改变参数的值,外部数据不会跟着发生改变,既不受影响。
简单地说,如果在方法中修改了传入实参变量的值,方法调用结束后,那个在调用的端的实参不会改变。
按引用传递:
除String ,Integer,Char等基本类型包装类以外的其他引用类型(对象)和数组.
热点:将对象引用的副本传递到方法内部
作用:在方法内部修改对象的内容,外部数据也会跟着发生变化。
与传值传递方式正好不同,按引用传递是指每次传递时实参时,把实参在内存中的引用(存储地址)复制一份,然后把副本传递到方法内部。
*********************************************************************
传值与传址是相对于方法而言的。什么为传。要有东西才是传。
例如:
在main方法中各打印出对象A,B,C的num,得到的值为20,30,10。可知A,B,C都是新的实例。互不影响。
传值与传址是在一个方法里传入,如public void method(Test test){
}
传入等于创建了一个副本。根据具体情况分析。
如public void change(int num){
num = num +10;
}
改变的只是副本,值无变化,如果再第一个num加this。改变的就是本身了,有变化。
如
虽然改变的是副本的信息,但是副本和正本的指针指向同一地址,所以改变的是属性,会有变化。慢慢分析了解吧
如果是以基本数据类型(包括String类)做参数进行传递,或以某个类名(包括数组名)为类型做为参数而[color=red]直接对其类进行操
作(非类的属性)[/color],这样的传递叫值传递;
如果是以某个类名为类型做为参数进行传递而[color=red]针对该类的属性进行的操作[/color],这样的传递叫做引用传递。
也就是说在值传递的过程中其操作不会对所传进来的对象有任何的影响,它传进来的只是该对象的一个副本,其本身不会有任
何的改变;而引用传递则传进来的是该对象的一个别名,即引用该对象在虚拟机中的“地址”,因此引用传递会对该“地址”的内
部属性产生影响,而不会改变该“地址”在虚拟机中的位置,即引用传递在外部看来是没有发生过任何变话的,但从内部看来,
它的属性会随着调用它的方法的改变而改变
因此,也有人说JAVA只有“值传递”,而没有引用传递。
一个简单的例子:
public class test{
public static void swap(String[] name){
String temp;
temp = name[0];
name[0] = name[1];/*传进去的虽然是一个副本,但是修改了数组的属性,对该数组的属性进行了操作,属于引用传递.*/
name[1] = temp;
}
public static void swap(String name0, String name1){
String temp;
temp = name0;
name0 = name1;
name1 = temp;
}
public static void main(String[] args){
String[] name = {"a","b"};
String name0 = "a";
String name1 = "b";
swap(name0, name1);
System.out.println(name0+","+name1);
swap(name); System.out.println(name[0]+","+name[1]);
}
}
}
输出为:
a,b
b,a
*************************************************************
按值传递:
8中基本数据类型(int,short int ,long int, double, float, char, byte,boolean)和String,Integer,Char,Double等基本数据类型的包装类
特点:在内存中复制一份数据,把复制后的数据传递到方法内部
作用:在方法内部改变参数的值,外部数据不会跟着发生改变,既不受影响。
简单地说,如果在方法中修改了传入实参变量的值,方法调用结束后,那个在调用的端的实参不会改变。
按引用传递:
除String ,Integer,Char等基本类型包装类以外的其他引用类型(对象)和数组.
热点:将对象引用的副本传递到方法内部
作用:在方法内部修改对象的内容,外部数据也会跟着发生变化。
与传值传递方式正好不同,按引用传递是指每次传递时实参时,把实参在内存中的引用(存储地址)复制一份,然后把副本传递到方法内部。
*********************************************************************
传值与传址是相对于方法而言的。什么为传。要有东西才是传。
例如:
Class Test{
int num=10;
Test A = new Test();此处的对象A是类Test的新实例,A的num为10;
A.num=20;
Test B = new Test();
B.num=30;
Test C = new Test();
}
在main方法中各打印出对象A,B,C的num,得到的值为20,30,10。可知A,B,C都是新的实例。互不影响。
传值与传址是在一个方法里传入,如public void method(Test test){
}
传入等于创建了一个副本。根据具体情况分析。
如public void change(int num){
num = num +10;
}
改变的只是副本,值无变化,如果再第一个num加this。改变的就是本身了,有变化。
如
public void change(Test test){
test.a=test.a+10
}
虽然改变的是副本的信息,但是副本和正本的指针指向同一地址,所以改变的是属性,会有变化。慢慢分析了解吧