的确,在java中所有的东西都是值传递。分为两种:基本类型和对象。先说基本类型,基本类型分配空间是在栈中分配的,比如int a=4;那么在栈中分配四个字节的空间(这在java中是一定的,不象c++中看机子是多少位),将4赋给这四个字节。当使用方法void ff(int a){}时,那么是先在栈中再分配四个字节,将a中的数据考到这四个字节中,所以无法影响外面的值,当然,这和c是一样的,没有什么好说的。那么对象呢,比如Student student=new student();步骤是这样的,先在堆中开辟一个可以存下student对象的这么大一个空间,然后在栈中在开辟四个字节的空间用来存储student对象在堆中的地址,那么当执行方法void fff(Student student){}又是怎么回事呢,刚刚说呢,java全是值传递,此时先在栈中开辟四个字节的空间,然后将student对象在堆中的地址赋给他,那么现在可以发现型参和实参里面的值是一样的,但是在栈中的地址不一样的,当你使用student.setName("a");时,是对这四个字节里面存储的地址所代表的那个对象的操作,所以现在你对实参进行的操作和对型参进行的操作都是对同一个对象进行操作,因为那两个四个字节里面存储的地址数据是一样的。
那么当你在方法体内部使用如下代码呢:
void fff(Student s){
  s=new Student();
}
现在你在方法体里面的s这四个字节里面存储的又是什么值呢?和在方法体外面的那个值是否一样的,不一样了。因为s=new Student();在堆中又从新开辟了个Student对象,现在在s中存储的是新的student对象的地址,那么你现在在对s进行操作:s.setName();那么肯定是不能改变方法体外面的值的,是吧?
那么在进行swap(Student a,Student b)时又是怎么回事呢?
void swap(Student a,Student b){
  Student temp=a;
  b=a;
  a=temp;
}
当你执行这段代码时,可以在栈上发现三个用来存储Student对象地址的空间,你执行temp=a;时,仅仅是将a这四个地址里面的数据赋给了temp,下面的语句也是一样的,但是经过上面的分析,你认为当我改变方法体内部变量a这四个字节里面的数据时会影响到方法体外面的那个四个字节里面的数据吗,肯定是不能的,当你调用这个方法:
Student student1;
Student student2;
ff(student1,student2);
student1这四个字节在栈中的位置与方法体里面的a在栈中的地址就不一样,你虽然改变了a里面的值,但是没有改变student1这四个字节里面的值