A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© happymouse 中级黑马   /  2014-9-2 11:52  /  1266 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行
中形式参数值的改变不影响实际参数的值。

  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 int a1=1;
  4.                 int a2=2;
  5.                 swap(a1,a2);
  6.                 System.out.println("a1="+a1);
  7.                 System.out.println("a2="+a2);
  8.         }

  9.         private static void swap(int a1, int a2) {
  10.                 int tmp;
  11.                 tmp=a1;
  12.                 a1=a2;
  13.                 a2=tmp;
  14.         }
  15. }
复制代码
代码运行结果是:

  1. a1=1
  2. a2=2
复制代码
为什么呢?

原因就是传递的参数是值传递,即调用swap函数时a1和a2两个值是将拷贝传给了函数中
的a1和a2两个值,此时main中的a1和a2与swap函数中的a1和a2是两个完全不同的值,
所以在main中打印a1和a2肯定会是原来的值。


引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),
这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,
这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。


  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 Testa ta=new Testa();
  4.                 Testb tb=new Testb();
  5.                 swap(ta,tb);
  6.                 System.out.println("a=" + ta.a);
  7.                 System.out.println("b=" + tb.b);
  8.         }

  9.         private static void swap(Testa ta, Testb tb) {
  10.                
  11.                 int tmp=0;
  12.                 tmp=ta.a;
  13.                 ta.a=tb.b;
  14.                 tb.b=tmp;
  15.         }
  16. }

  17. class Testa
  18. {
  19.         public int a=1;
  20. }

  21. class Testb
  22. {
  23.         public int b=2;
  24. }
复制代码
运行结果是:

  1. a=2
  2. b=1
复制代码
为什么呢?
原因就是传递的参数是引用传递,当在swap函数中交换Testa和Testb中的值时其实是真实的修改了
Testa和Testb中的值,这样Testa和Testb中的值就真实的发生了变化



String虽然是引用数据类型,但在当参数传递时表现的是值传递的特点,这个需要特别记忆



5 个回复

倒序浏览
Java中没有引用传递,只有值传递
回复 使用道具 举报
fantacyleo 发表于 2014-9-2 12:16
Java中没有引用传递,只有值传递

原因就是传递的参数是引用传递,当在swap函数中交换Testa和Testb中的值时其实是真实的修改了
Testa和Testb中的值,这样Testa和Testb中的值就真实的发生了变化
》》》
说法不同吧?你也解释一遍呗
回复 使用道具 举报
LFW 发表于 2014-9-2 13:21
原因就是传递的参数是引用传递,当在swap函数中交换Testa和Testb中的值时其实是真实的修改了
Testa和Test ...

Java的参数传递是值传递,这在Java语言规范中说得很清楚了。引用传递,我个人认为在逻辑上是多余的。C++ C# Pascal等语言还保留引用传递这种说法,但实际上它们的引用传递是通过运算符来完成的,既然引入了运算符,说白了就是求值,归根到底还是值传递。

lz说调用swap函数时a1和a2两个值将拷贝传给了形参a1和a2,但testa和testb又何尝不是呢?只不过testa和testb的值是对象的地址罢了,但其本身和1、2、3这样的值相比并没有什么特殊。
回复 使用道具 举报
MeryStyle 来自手机 中级黑马 2014-9-2 23:08:52
报纸
楼主赞一个。
回复 使用道具 举报
引用数据类型传递传的是地址 应该这样理解                     另  Sting 传递的是值  这点也没弄懂
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马