方法传递参数&按值传递和按引用传递

  1. 云栖社区>
  2. 博客>
  3. 正文

方法传递参数&按值传递和按引用传递

技术小阿哥 2017-11-27 14:13:00 浏览554

方法传递参数:

   方法就像一个任务要做一件事情,而参数就是一个事情里所需要给予的条件。就像要去买东西这样一件事情,这件事情的参数是需要购买物品的钱,需要传递一个“钱”的参数给这个方法它才能进行执行。例如:

wKioL1nnes-TnxIjAAl6SLt7rbE230.png

  释义:method方法声明了一个int类型的参数,参数名为a。在main方法里调用method方法时就需要给它传递一个参数值,参数值要求符合类型且不超过类型的存储范围。此时给method传递的值是10,所以打印的结果就是10



如果方法声明了参数,在调用此方法时不传递参数值就会报语法错误。例如:

wKiom1nnfYiz1cH6AAf0FDZScf4977.png




按值传递:

  在传递参数值中有按值传递和按引用传递。所有的基本数据类型都是按值传递,按值传递就是把值复制一份过去,不会对原本的变量产生影响,给方法传递的是值。所以即便在方法里改变了传递的值,但它原本的值也不会有改变。因为给它传递的是值而不是原本的内存地址引用。例如:

wKioL1nnetrTfPNVAA1BRsNesGY105.png

  在main方法里将i的值传递给了参数a,传递的是一个值,所以参数a做出的改变并不会影响到变量ii的输出的结果还是10a的输出的结果则是100




按引用传递:

  除了基本数据类型以外的值都是按引用传递,按引用传递其实就是按地址传递,给参数传递的是同一片内存地址,传递后参数和变量指向的都是同一个内存地址。所以参数做出改变,原本的变量值也会随之而改变。因为它传递的是内存地址,这是按引用传递和按地址传递最大的区别。例如:

wKiom1nnfZmjLm_nAA9RdbpJVQo215.png


  数组是八种基本数据类型之外的类型,所以传递参数值时是按引用传递的,也就是按内存地址传递了一个引用。传递后此时数组i和参数a指向的都是使用的同一个内存地址,a的值发生了改变,i的值也会随之发生改变,所以打印的结果都111。就像两个人在同一碗粥一样,他们都是共同使用同一个资源,只要其中一个人对这个资源进行了改变,那么另一个也会受到影响。



  在java中是不可以对内存地址进行改变的,但是在C语言则可以通过内存指针对内存地址进行改变。所以按值传递在C语言里可以将它们的值都指向同一个内存地址,就变成类似于按地址传递的效果了。例如:

wKioL1nneuyRtwJ0AA8SYTZNInY076.png

通过内存指针改变内存地址后i的值和num的值都是指向同一个内存地址。所以i的值发生改变num的值也会随之改变。




本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1974010,如需转载请自行联系原作者