Java高级篇-7-Java中方法的参数是如何传递的
来源:互联网 发布:ubuntu14.04安装php 编辑:程序博客网 时间:2024/06/02 06:34
本篇来学习下Java中的方法的参数是如何传递的。应该都听说过值传递和引用传递,值传递很好理解,就是把这个实际的值给传进去,引用传递就有点费脑子。在Java的方法中,引用传递传递的不是引用本身,而是之前应用的一个副本。这样说,不能理解没关系,我们分别通过代码来理解值传递和引用传递。
1.值传递
Java中按值传递(call by value),先记住这个结论:值传递,方法得到的是所有参数值的一个拷贝,方法并不能修改传递给它的任何参数变量的内容。下面那一个例子来举例。
package com.java.learn;/** * create by Anthony on 2017/10/30 */public class PassToMethod { public static void main(String args[]){ int a = 10; System.out.println("修改之前a的值是 "+ a); changeMe(a); System.out.println("修改之后a的值是 "+ a); } public static void changeMe(int b){ b = (100 + b); }}运行结果:
修改之前a的值是 10修改之后a的值是 10分析:
为甚执行了changeMe(a)这个方法里的代码,a的值没有变成110呢?
1)先声明一个int类型变量a,a的值是10.
2)这里把a当做参数传给changeMe方法,关键点在这里,这个时候b(为了和a区分开来,用b)被初始化为a的对应值,也就是10的一个拷贝,此时b也等于10
3)b执行了b=100+b,也就是等于110,但是这个不是a的值,此时仍等于10.
4)这个方法结束后,参数b不再使用,会被JVM回收。
5)所以,打印a的值还是等于10
我们可以得出这个结论:当方法参数的类型是基本数据类型(8种)的时候,一个方法是不可能修改一个基本类型的参数的值。
2.引用传递
前面我们知道,java中数据类型除了8种基本数据类型,剩下的就是引用类型,包括类,数组。所以,这里我们举例一个List。
package javademo;import java.util.ArrayList;import java.util.List;public class PassDataTypeMethodDemo { public static void main(String args[]){ List list = new ArrayList(); list.add("aaa"); changeList(list); System.out.println(list.toString()); } public static void changeList(List list){ list.add("bbb"); }}运行结果是:[aaa,bbb]
分析:main()方法先创建了一个ArrarList对象list,并且添加了一个元素aaa,然后manin()方法调用changeList()方法的时候,changeList中参数list是main()方法中变量list的一个副本。这两个list变量都指向堆中的同一个ArrayList对象,所以操作的是同一个,结果会添加bbb到ArrayList中。
来看一个类作为参数传入的引用传递
package javademo;public class Car { public String name = "lamborghini";}
package javademo;public class PassDataTypeMethodDemo { public static void main(String args[]){ //定义一个Car对象,c是这个对象的引用 Car c = new Car(); //先显示这个对象的name属性 System.out.println(c.name); //调用changeCar(Car c)方法 changeCar(c); //再显示这个对象的name属性,看是否发生了变化 System.out.println(c.name); } public static void changeCar (Car c){ c.name = "toyota"; }}
输出是:
lamborghinitoyota
正确理解:当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
这个知识点很费脑子,我理解也不是很透彻,还是有疑惑,先这样吧,以后对内存堆和栈有了深入理解再来填坑。相关可以参考:https://www.zhihu.com/question/31203609
- Java高级篇-7-Java中方法的参数是如何传递的
- java 参数是如何传递的
- java是如何传递参数的?
- java 参数是如何传递的
- Java中函数参数的传递是值传递
- 在Java中方法参数的传递,对象是传递引用
- java中方法的参数传递机制
- java中方法参数的传递机制
- JAVA中方法参数的引用传递
- JAVA中方法参数的引用传递
- Java中方法参数的传递
- Java中方法的参数传递机制
- java中方法的参数传递机制
- java中方法的参数传递机制
- java中方法的参数传递机制
- java中方法的参数传递机制
- JAVA中方法的参数传递
- Java中方法的参数传递机制
- 小程序学习心得之事件冒泡
- 基于OpenCV-python3实现抠图&替换背景图
- 我遇到的jsp表单提交乱码问题
- 嵌入式linux调试技巧
- 编写一个程序,实现设置上月、本月电表读数,显示上月、本月电表读数,计算并显示本月用电数。假设每度电的价格为1.2元,计算并显示本月电费。
- Java高级篇-7-Java中方法的参数是如何传递的
- java 泛型 编译警告:使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
- Tornado官方文档(二)【概述,异步和非阻塞IO】
- Hibernate入门
- in和exists
- Ubuntu搭建samba
- jQuery对象与DOM对象
- 1002. 写出这个数
- 5.3判断并计算三角形的面积