全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

探讨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变量是没有影响的。

总结:

函数参数传递其实是一个赋值的过程,基本类型传递的是数值,引用类型传递的引用对象的内存地址。

另外一点要特别注意,函数的参数其实是函数内部的局部变量。不要跟外部变量混淆.

以上所述是小编给大家介绍的Java中函数是值传递还是引用传递问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java值传递和引用传递  # java  # 函数传递  # 带你详细了解Java值传递和引用传递  # Java中值传递和引用传递的区别  # Java中的值传递和引用传递实例介绍  # java中的值传递和引用传递的区别分析  # 解析Java按值传递还是按引用传递  # java通过实例了解值传递和引用传递  # Java引用传递实现方式以及与值传递的区别  # 的是  # 是一个  # 让我们  # 所示  # 小编  # 自己的  # 也不  # 改变了  # 也有  # 看了  # 在这个  # 结果是  # 第一个  # 将会  # 在此  # 是这样  # 没有任何  # 两种  # 这个问题  # 跟我 


相关文章: 网站制作服务平台,有什么网站可以发布本地服务信息?  Swift中循环语句中的转移语句 break 和 continue  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  如何快速建站并高效导出源代码?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  网站网页制作专业公司,怎样制作自己的网页?  高防服务器:AI智能防御DDoS攻击与数据安全保障  C++时间戳转换成日期时间的步骤和示例代码  如何解决ASP生成WAP建站中文乱码问题?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何通过多用户协作模板快速搭建高效企业网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  建站之星Pro快速搭建教程:模板选择与功能配置指南  山东云建站价格为何差异显著?  如何注册花生壳免费域名并搭建个人网站?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  昆明网站制作哪家好,昆明公租房申请网上登录入口?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  动图在线制作网站有哪些,滑动动图图集怎么做?  建站之星备案流程有哪些注意事项?  电商网站制作价格怎么算,网上拍卖流程以及规则?  婚礼视频制作网站,学习*后期制作的网站有哪些?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  清除minerd进程的简单方法  宝塔建站教程:一键部署配置流程与SEO优化实战指南  相册网站制作软件,图片上的网址怎么复制?  如何通过二级域名建站提升品牌影响力?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  香港网站服务器数量如何影响SEO优化效果?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何快速选择适合个人网站的云服务器配置?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  如何用免费手机建站系统零基础打造专业网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  建站之星如何取消后台验证码生成?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  独立制作一个网站多少钱,建立网站需要花多少钱?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  如何在Tomcat中配置并部署网站项目?  建站之星微信建站一键生成小程序+多端营销系统  如何确认建站备案号应放置的具体位置?  如何在搬瓦工VPS快速搭建网站?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  如何使用Golang table-driven基准测试_多组数据测量函数效率  如何用wdcp快速搭建高效网站?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  实现虚拟支付需哪些建站技术支撑? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。