java中只有值传递
先上概念:java程序设计语言中,总是采用按值传递,也就是说,一个方法中所获得参数,都是原来实参的一个拷贝。
具体要讲清楚这几个概念,需要搞清以下几个例子就好了:
1、java中基本数据类型的传递,都是值传递:
double num=10;
sample.change(num);
public static smaple(double anum)
{ anum=anum*3;
}
此方法调用完成以后,num仍旧等于10,而anum作为形参,刚开始,anum=num=10,然后,anum=anum*3=30,然后用完就释放掉了。
图例如下:
有一条一定要记住:所谓引用传递还是值传递,其根本区别在于是否改变了原始定义的那个变量的值,也就是上图中的num!!!
2、但是如下有一种情况,会让部分人迷惑:
例如:
有一个修改成绩的方法,和一个学生对象:
public class Student{
int id;
int num;
String name;}
修改成绩的方法:
public static void change(Student s){
s.num=s.num+10;}
Student st=new Student(10010,75,”Li”);
change(st);
此时,st.num变为85。
具体过程如下:
通过上述图示,容易看出,s和st指向同一个对象,但是值得注意的是,此时s得到的Student对象的地址为在st哪里拷贝过来的,并不是直接用的st存储的地址,也就是s和st处存储对象地址的位置并不一样。
此时,会有人迷惑,这不是修改了原始对象的值了吗,怎么不是引用传递?此时的问题在于,s修改了st处对象的地址了吗?并没有!!,所以此处仍是值传递,只不过是地址的拷贝!
3、下面例子看懂,就一切都懂了:
Student a=new Student(10010,66,”Li”);
Student b=new Student(10013,77,”Wang”);
publict static void shift(Student x,Student y)
{Student temp=x;
x=y;
y=temp;}
预判一下,结果如何?经过该函数后,a——>Wang和b——>Li,还是a和b的指向都未变?如果a和b的指向变了,说明java是引用传递,否则还是值传递。
结果证明,a——>Li,b——Wang并没有改变!!!
图示如下:
看到了吧,x和y指向变了,而a和b没变!所以仅仅依靠一个方法,是无法改变原来两个变量的指向的,java里面参数传递都是拷贝,没有引用,所以java里面只有值传递!!
好了,有问题请@我 ==