JAVA中函数传参的意义
来源:互联网 发布:淘宝电信卡实名认证 编辑:程序博客网 时间:2024/06/03 05:15
JAVA中有两种类型,基本类型和引用类型。但在函数传参的过程中,基本类型和引用传递的到底是什么呢?
在JVM中,基本类型中的数值使用一块内存来保存。引用类型由两块内存来保存,一块内存中装的是真实的数据,就是引用的对象,另一块内存中装的是指向类数据的引用,存储的是对象的内存地址。jvm需要通过此引用找到该对象的方法表,类型信息。其中类型信息包括类型基本信息,常量池,字段信息,方法信息,类变量信息,指向class的引用,指向classloader的引用。这些数据都存放在方法区。
在函数传参的过程中,基本类型只会传递数值,那么引用类型传递的真实的数据,还是指向该内存的地址呢?
下面的文章引用自 java中函数是值传递还是引用传递?
相信有些同学跟我一样,曾经对这个问题很疑惑。在网上也看了一些别人说的观点,评论不一。有说有值传递和引用传递两种,也有说只有值传递的,这里只说下个人见解
先看一个例子
public class Test1 { public static void main(String[] args) { int a = 10; changeNum(a); System.out.println("main a=" + a); } static void changeNum(int a) { a = 100; System.out.println("changeNum a=" + a); }}
结果:
changeNum a=100
main a=10
说明对于基本的数值类型其实传递的是一份数值的拷贝,传入函数之后跟原来的值就没有关系了,在函数中改变这个数的值也不会影响到原来的值。
再看一个例子
public class P { String name = "P"; public P(String name) { this.name = name; } @Override public String toString() { return name; }}public class Test { static P p1 = new P("p1"); public static void main(String[] args) { P p = new P("P"); System.out.println("before change p:" + p.toString); changeObj(p); System.out.println("after change p:" + p.toString()); } static void changeObj(P p) { p = new P("pp"); System.out.println("change p:" + p.toString()); //p = p1; //System.out.println(p.toString()); }}
这个例子中的运行结果会是什么呢?
在这个例子中传入的是一个对象类型的数据。
我们先来猜想一下:如果传入的是一个对象的引用,在函数中改变了这个引用所指向的对象,那么外部的引用"p"应该是指向了新创建的P("pp")的对象才对
所以猜想的结果是:
before change p:P
change p:pp
after change p:pp
那让我们来实际运行一下看看结果,实际的结果是:
before change p:P
change p:pp
after change p:P
想猜想的不一样!!!
这就让我们很疑惑了,为什么函数没有改变引用所指向对象呢?
其实是这样的,首先要理解“=”赋值操作的意义,
对于基本类型来说“=”赋值操作是直接改变内存地址上的值,
而对引用类型来说“=”赋值其实是改变引用变量所指向的内存地址。
赋值操作后
引用的赋值并没有对原来的对象造成影响,"hello"对象仍然是存在的,只是str又指向了新的"world"对象
理解了赋值操作后,现在来说下函数的参数传递
函数的参数实际上就是函数内部的一个局部变量,从外部传值给这个参数实际上就是一个赋值的过程。
来看看第一个例子,传一个定义一个int类型名称为a的形式参数,其实完全可以把名称改为b
然后把外部变量a的值传递给函数的变量,就是赋值。基本类型的赋值就是把外部a变量的10赋值给函数变量a,所以这其实是两个变量,两者之间没有任何关系,
所以对函数内部变量的改变也不会对外部的变量造成影响。
再来说下引用类型的传递,其实是一个道理。
在传递的时候是把一个对象的内存地址赋值给函数内部的引用类型的局部变量
如上图所示,两个变量是指向同一个对象的。
在第二个例子中,我们在函数内部新创建了一个对象,并重新赋值给内部变量p,其实是改变了内部变量的引用所指向的对象,如下图所示
所以对外部的p变量是没有影响的。
总结:
函数参数传递其实是一个赋值的过程,基本类型传递的是数值,引用类型传递的引用对象的内存地址。
另外一点要特别注意,函数的参数其实是函数内部的局部变量。不要跟外部变量混淆
以上内容均为原创,转载请注明出外 http://www.cnblogs.com/taixuyingcai/p/6373423.html
- JAVA中函数传参的意义
- java中主函数的意义
- java无参构造函数的意义
- java中final的意义
- java中final的意义
- java中final的意义
- java中final的意义
- java中final的意义
- java中static的意义
- java中final的意义
- webkit中graphicscontext中函数的意义
- 函数中省略号的意义和用法
- 函数中省略号的意义和用法
- telnetlib 中各种 read 函数的意义
- telnetlib 中各种 read 函数的意义
- listen函数中backlog参数的意义
- 函数中省略号的意义和用法
- telnetlib 中各种 read 函数的意义
- java多线程:1 基础知识
- 关于导入外部样式表的目录问题
- 分布式异步编程框架 Koper
- asp.net中一般处理程序和普通类文件使用HttpContext对象
- selenium浏览器chrome驱动对应chrome版本
- JAVA中函数传参的意义
- docker安装mysql
- 协成智慧与福建警察学院签订战略合作协议
- 设备控制接口函数(ioctl 函数)
- java正则表达式
- ubuntu安装numpy,matplotlib等
- spring 配置
- spring注解测试
- Django_使用easyui