资讯专栏INFORMATION COLUMN

Java值传递的一些理解

waltr / 2868人阅读

摘要:而且栈内存一般使用的是一级,读写速度快。堆内存主要存放由创建的对象和数组,垃圾回收器回收这部分内容。所以虽然值传递复制的是栈内的原值,但表现出来的特性仍然是趋向于引用传递因为你复制一个引用的原值,并没有卵用。

今天下午一直在看一些常见的Java试题,看到很多问题都涉及到Java参数传递的问题,之前自己也是一知半解,虽然知道是值传递,但没有办法通俗易懂的讲出个所以然来,所以特地查一些资料并且记录下来今天的理解。
首先,Java的内存分配分为三种:栈内存、堆内存、方法区内存。

1.栈内存:主要存放函数中定义的基本类型变量,对象的引用。在程序运行到跳出变量作用域后Java会自动释放内存。使用栈的好处是在于,栈的先进后出的性质符合程序中函数调用运行特点,即后调用先返回,这样就可以尽快释放不用到的内存空间。而且栈内存一般使用的是一级cache,读写速度快。
2.堆内存:主要存放由new创建的对象和数组,Java垃圾回收器回收这部分内容。使用堆结构的意义,我推测是在于易于控制(垃圾回收的时候总是回收最久没有使用的空间,而堆可以很快的取出结构中最大或最小的值)。
3.方法区内存:主要存放类信息和static变量。这里穿插一个小知识点:在每次类被加载的时候,总是先执行static属性的定义,以及static语句的执行。

好,说完内存就可以清晰的解释Java参数传递了。
1.Java只用值传递
2.值传递时只复制了栈内存的内容
3.对于基本类型对象, 栈内存中留有的是原值,所以参数传递时,值传递将原值复制一份到调用函数内
4.对于复杂对象(new出来的对象,通过单例模式获得的对象我认为也算是new出来的对象,或者说是原值在堆内存中的对象),栈内只存有的是一个指向堆内值得引用。所以虽然值传递复制的是栈内的“原值”,但表现出来的特性仍然是趋向于引用传递(因为你复制一个引用的原值,并没有卵用)。

总之,传参数时,如果参数是基本类型,那在调用之后原值不会被改变;如果参数是复杂类型,在调用后参数会改变。

参考资料是知乎的一个问题下的众多答案:
https://www.zhihu.com/questio...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65108.html

相关文章

  • 引用传递传递(pass by value vs pass by reference)

    摘要:字节码验证于是就写了以下的类,用来验证然后,然后,看字节码如下图。以上,就是整个关于引用传递和值传递的理解,有说的不对的,望指正。 写这个的原因主要是今天看到了知乎的一个问题,发现自己有些地方有点懵逼,写下来记录一下,知乎上排名第一的答案说的很清楚,不过看了以后依旧有点迷迷糊糊,所以自己写了个几行代码测试。首先上一个,感觉比较对的结论:**Horstmann的《java核心技术》(中文...

    longmon 评论0 收藏0
  • java中传方式个人理解

    摘要:接下了,我们调用方法,来尝试改变的值以此验证中的传值方式。我们将作为实参传给方法,形参来接受这个实参,在这里就体现出了两种传参方式的不同。中只有值传递这一种方式,只不过对于引用类型来说,传递的参数是对象的引用罢了。 前言 这几天在整理java基础知识方面的内容,对于值传递还不是特别理解,于是查阅了一些资料和网上相关博客,自己进行了归纳总结,最后将其整理成了一篇博客。 值传递 值传递是指...

    vvpvvp 评论0 收藏0
  • Java开发常见问题集锦

    摘要:下面是一些常见的理解性问题,每一个问题尽量用图或代码去描述。内容全部来自,包括基本语法数组集合类泛型面向对象垃圾回收异常控制输入输出和内存。不断更新,欢迎大家提出有趣味的问题和意见。 程序员经常可以通过搜索或者记忆来完成代码,但是许多时候并不真正理解为什么那样写。也就是说,有一定经验的程序员不会犯一些低级的语法错误,但是因为不深入理解有可能造成一些高级错误,比如说运行无效率,代码难De...

    MSchumi 评论0 收藏0
  • 求职准备 - 收藏集 - 掘金

    摘要:一基础接口的意义百度规范扩展回调抽象类的意义想不想通过一线互联网公司面试文档整理为电子书掘金简介谷歌求职记我花了八个月准备谷歌面试掘金原文链接翻译者 【面试宝典】从对象深入分析 Java 中实例变量和类变量的区别 - 掘金原创文章,转载请务必保留原出处为:http://www.54tianzhisheng.cn/... , 欢迎访问我的站点,阅读更多有深度的文章。 实例变量 和 类变量...

    cuieney 评论0 收藏0
  • Java基础知识储备一:Java传递和引用传递

    摘要:每个栈帧中包括局部变量表用来存储方法中的局部变量非静态变量函数形参。操作数栈虚拟机的解释执行引擎被称为基于栈的执行引擎,其中所指的栈就是指操作数栈。指向运行时常量池的引用存储程序执行时可能用到常量的引用。 本篇文章转自微信公众号:Java后端技术 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出...

    frontoldman 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<