全网整合营销服务商

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

免费咨询热线: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引用传递实现方式以及与值传递的区别  # 的是  # 是一个  # 让我们  # 所示  # 小编  # 自己的  # 也不  # 改变了  # 也有  # 看了  # 在这个  # 结果是  # 第一个  # 将会  # 在此  # 是这样  # 没有任何  # 两种  # 这个问题  # 跟我 


相关文章: 如何在景安服务器上快速搭建个人网站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  测试制作网站有哪些,测试性取向的权威测试或者网站?  Android自定义listview布局实现上拉加载下拉刷新功能  Android滚轮选择时间控件使用详解  南京网站制作费用,南京远驱官方网站?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  建站之星备案流程有哪些注意事项?  清除minerd进程的简单方法  C++中引用和指针有什么区别?(代码说明)  香港服务器WordPress建站指南:SEO优化与高效部署策略  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  Bpmn 2.0的XML文件怎么画流程图  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  制作企业网站建设方案,怎样建设一个公司网站?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  建站之星如何助力网站排名飙升?揭秘高效技巧  一键网站制作软件,义乌购一件代发流程?  IOS倒计时设置UIButton标题title的抖动问题  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  独立制作一个网站多少钱,建立网站需要花多少钱?  太原网站制作公司有哪些,网约车营运证查询官网?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  网页设计与网站制作内容,怎样注册网站?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  网站制作公司排行榜,四大门户网站排名?  如何选择高效可靠的多用户建站源码资源?  如何快速完成中国万网建站详细流程?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  *服务器网站为何频现安全漏洞?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  建站之星安装后界面空白如何解决?  建站之星安装步骤有哪些常见问题?  如何批量查询域名的建站时间记录?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  建站之星如何开启自定义404页面避免用户流失?  北京企业网站设计制作公司,北京铁路集团官方网站?  全景视频制作网站有哪些,全景图怎么做成网页?  韩国服务器如何优化跨境访问实现高效连接?  网站制作员失业,怎样查看自己网站的注册者?  简单实现Android文件上传  小程序网站制作需要准备什么资料,如何制作小程序?  定制建站如何定义?其核心优势是什么? 

您的项目需求

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