当前位置: 首页 > news >正文

以学校为目标做网站策划书建设网站制作汉狮团队

以学校为目标做网站策划书,建设网站制作汉狮团队,织梦做网站简单吗,网站页面吸引力前言初学Java的时候#xff0c;老师在课堂上说“Java有值传递和引用传递”#xff0c;但网上“Java只有值传递”的呼声很高。本人在查找资料的过程中#xff0c;在这两个说法之间反复横跳。经过本人的整理后#xff0c;其实还真的是Java只有值传递。什么是值传递#xff1…前言初学Java的时候老师在课堂上说“Java有值传递和引用传递”但网上“Java只有值传递”的呼声很高。本人在查找资料的过程中在这两个说法之间反复横跳。经过本人的整理后其实还真的是Java只有值传递。什么是值传递什么是引用传递首先我们先明确一下值传递和引用传递的定义(来自维基百科)。值传递When a parameter is passed by value, the caller and callee have two independent variables with the same value. If the callee modifies the parameter variable, the effect is not visible to the caller.拙译当一个参数进行值传递的时候调用者和被调用者有两个值相同的独立变量。如果被调用者修改了参数值并不会影响调用者。引用传递When a parameter is passed by reference, the caller and the callee use the same variable for the parameter. If the callee modifies the parameter variable, the effect is visible to the caller’s variable.拙译当一个参数进行引用传递的时候调用者和被调用者使用同一个变量。如果被调用者修改了参数值调用者也会受到影响。总结一下值传递和引用传递最本质的区别在与调用者和被调用者有没有使用同一个变量。可能有人还是对这两个定义抱有疑问没关系我们用C做个例子。C中的值传递和引用传递(不感兴趣可略过)这里先说明下为什么用C。因为C的有指针概念所以对于指针和引用是有做严格区分的感兴趣的小伙伴可以看下这篇博客C/C中的值传递引用传递指针传递指针引用传递。基于需要本文对C的值传递和引用传递来进行简要说明。C的值传递可以看到a变量(地址为0x22fe4c)在调用f()函数进行值传递的变量p(地址为0x22fe20)已经是另一个变量了而且在改变p的值后地址为0x22fe4c的内容并没有改变即a的值没有改变。所以值传递无法改变传递的变量的值。引用传递可以看到a变量(地址为0x22fe4c)在调用f()函数进行值传递的变量p(地址为0x22fe4c)还是同一个变量而且在改变p的值后地址为0x22fe4c的内容变为0xff即a的值发生改变。所以引用传递可以改变传递的变量的值。总结一下在C中的值传递和引用传递在大体上是跟值传递和引用传递的定义相符的。也就是说这个定义是可以在编程语言中适用的。Java中的值传递和引用传递说明一下System.identityHashCode()的作用是用来判断两个对象是否是内存中同一个对象跟用判断内存地址是否一样的效果一样有疑惑的朋友可以看下这篇博客JavaObject.hashCode()和System.identityHashCode()的区别值传递以上可以得到跟值传递定义一样的结论Java的值传递过程中会复制传递的参数值到另一个变量这两个变量之间互不影响而且只有基本数据类型进行传递时是以值传递的方式。引用传递从这个图也可以看出Java引用传递过程中的两个数组a, b是指向同一个内存地址这一个变量的改变会影响到另一个变量而且只有除了String类型以外的其他对象类型在作为参数传递时是使用引用传递的。从这两个例子来看Java既有值传递也有引用传递啊所以“Java只有值传递”这个说法是错误的非也。String类型在查找资料的过程中很多人的说法是“String类型也是值传递”为什么呢举个栗子public class Test {public static void main(String[] args){Test t new Test();String s oh;t.test(s);System.out.println(print in main , ans is s);}public void test(String s) {s hello;System.out.println(print in test , ans is s);}}运行的结果是这样的print in test , ans is helloprint in main , ans is oh我们可以看到实参s在传入方法test()后形参s’改变了也不影响实参的值。为什么(以下解释基于《深入理解Java虚拟机》的理解)在字符串s传递过程中虚拟机在常量池划出一块内存其地址为addr1存值“oh”虚拟机在栈中分配s一块内存内存中存的值为addr1虚拟机将s复制一份出来即s‘s和s’内存不同但是它们的值都是addr1将s’传入方法体方法体在常量池中划分一块内存其地址为addr2存值hello方法体将s’值改为addr2方法结束main打印的是s因为s存的值为addr1所以打印出来的结果为addr1存的值“oh”所以String类型在调用过程中也是采用值传递。“Java只有值传递”是错误的吗不是我们拿“Java引用传递”的例子来解释。public static void main(String[] args) {int[] a {1, 2, 3};f(a);...}public static void f(int[] b) {b[0] 100;...}我们在得到结论的时候是因为在经过方法f()之后a[0]的值从1改变为100。可这个过程严格上是引用传递吗我们从虚拟机内部来观察传递过程虚拟机在堆上划分了一块用于存储数组a的内存其内存地址为addr1。虚拟机在栈中分配给a一个内存地址这个地址存的是addr1。虚拟机复制a其别名为ba和b的内存地址不同但是他们的值都是addr1。将b传入方法方法改变了addr1的数组的值。方法结束f和main打印的都是addr1的内存值都是同一个对象。在这个过程中a和b的内存地址不同但是他们存值的内存地址后的对象是同一个。就是下图的这种关系所以从虚拟机的角度来看实参a和形参b是两个独立变量只是实参a把对象地址当做值传递给形参b。按照值传递的定义来看a和b只是两个值相同的独立变量Java是值传递。而a和b的值的值(这里不是写错)所指向的内容是同一个所以我们前面在看到是“引用传递”的情况。总结严格来说Java只有值传递因为在实参传递的过程中虚拟机复制了实参的值到形参并且实参和形参指向的不是同一块内存。这个说法是基于这种逻辑(a、b、c这三个变量是独立的b为对象地址)这时我们只要保证实参和形参是两个独立的个体且值都是b就好。而Java有值传递和引用传递这一说法的出现是因为我们在刚学习Java的时候还不到了解虚拟机的水平没有了解到实参和形参是两个值相同的不同独立体利用这种“美好的”误会来理解“引用传递”吧。参考资料以及正文中提及的文章
http://www.zqtcl.cn/news/94722/

相关文章:

  • 如何用ps做网站导航一个网站开发时间
  • 合肥城乡建设网站06628 网页制作与网站建设
  • 网站设计岗位的职责与要求北京网站建设 合一
  • 网站制作app开发公司网站建设 英文
  • 毕业设计网页制作网站建设网站预约挂号怎么做
  • 河东天津网站建设永州做网站的公司
  • 网页制作与网站建设填空题免费的企业邮箱怎么申请
  • 智慧农业网站建设沈阳建设信息网
  • 永久免费素材网站个人网站域名所有权
  • 做网站都需要什么工具网站开发培训哪里好
  • 做网站里面的图片像素要求安徽 网站建设
  • 电子商务推广网站wordpress小程序搭建
  • 张家港网站开发培训广告代理那些平台可以给网站做外链
  • 搞一个公司网站得多少钱中国航天空间站最新消息
  • php移动网站开发微商做图王官方网站
  • 制作网站中英文字体不能为网页设计与制作教程试题
  • 网站建设与管理案例柳洪轶wordpress学校站模板
  • 湖北省和住房建设厅官方网站自媒体专业
  • 榆林网站开发自己建设购物网站
  • 新材建设局网站百度提问首页
  • 网站优化网站建设栅格布局 网站设计
  • 网站建设销售前景网站手机开
  • 网站建站 用户注册北京网站建设方案报价
  • jsp做网站 案例网站模板 招聘
  • 德州建设银行兑换网站服务器网站跳转怎么做的
  • 金华专业做网站公司湖南网站建设服务
  • 企业网站设计沈阳苏宁电器网站建设特点分析
  • 建设工程类公司网站易语言可以做api网站对接吗
  • 青岛做网站皆赴青岛博wordpress 数据库 备份
  • 外贸公司网站空间哈尔滨seo优化专注