【java】的传值方式
【java】的传值方式
当你问大多数程序员Java是传值还是传引用的时候,你可能会得到两种答案之一:
(1)Java传递原始类型数据时使用的是传值方式;传递对象时则使用传引用方式;String类型的数据采用的是传值方式,因为字符串是不可变的。(2)Java传递所有参数都使用传值方式。
只有第二个答案是正确的。理解传值和传引用的区别的关键是要记住,当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。
证明
如果Java通过传引用方式传递对象,那么执行下面的代码就会交换保存在两个变量a和b中的引用,而相应的输出应该如下:
a: 4
b: 100
Swapped!
a: 100
b: 4
其实真正的动作是在方法的参数o1和o2中的引用,它并不影响原始变量a和b。下面是其实际输出:
a: 4
b: 100
Swapped!
a: 4
b: 100
- public class SwapTip {
- public static void main(String []args) {
- Integer a = new Integer(4);
- Integer b = new Integer(100);
- System.out.println("a: " + a);
- System.out.println("b: " + b);
- swap(a, b);
- System.out.println("Swapped!");
- System.out.println("a: " + a);
- System.out.println("b: " + b);
- }
- public static void swap(Object o1, Object o2) {
- Object t = o1;
- o1 = o2;
- o2 = t;
- }
- }
为什么说这个争论的答案是有意义的?
很多参与过争论传递参数的方式的程序员最后都会说:“只是语义不同而已”或者是“没有关系,因为都理解它真正的工作原理。”
对于有经验的程序员来说这可能是一个语义问题,但是对于那么没有什么经验的程序员来说,情况就不一样了。对于程序员来说一个语言的黑拿越少,他们在用那种语言写程序的时候就能做得越好。
一个类比
对象引用与实例的关系就像遥控器与电视机的关系,引用控制对象就像遥控器控制电视机一样。如果一个遥控器的复制品给了另一个人,那么那个人也可以控制电视机。复制的遥控器对电视机的动作(比如说调节音量、改换频道或者调节时钟)对于它本身和原装遥控器来说都是可见的。如果那个人改装了复制的遥控器去控制另外一台电视机,那么原来的遥控器不会受到影响。
诚然,Java是通过传值还是传引用的方式来传递参数只是一个学术上的区别,只要我们知道期望哪种行为即可。但是有时候知道台后的事情也是重要的。
Java只有一种参数传递方式,那就是传值。它简单、有文档可查并且确实是如此。
转自http://www.blogjava.net/zsh118/articles/24564.html
- public class Test {
- public static void main(String[] args) {
- StringBuffer a = new StringBuffer("A");
- StringBuffer b = new StringBuffer("B");
- int i = 5;
System.out.println(a + "," + b + "," + i);- operate(a, b, i);
- System.out.println(a + "," + b + "," + i);
- }
- public static void operate(StringBuffer x, StringBuffer y, int j) {
- x.append(y);
- y = x;
- y.append("C");
- j = 1;
- }
- }
运行结果:
A,B,5
ABC,B,5
【java】的传值方式的更多相关文章
- java中传值方式的个人理解
前言 这几天在整理java基础知识方面的内容,对于值传递还不是特别理解,于是查阅了一些资料和网上相关博客,自己进行了归纳总结,最后将其整理成了一篇博客. 值传递 值传递是指在调用函数时将实际参数复制一 ...
- java参数传值方式
java参数有值类型和引用类型两种.所以java参数的传值也就从这两个方面分析. 从内存模型来说参数传递更为直观一些,这里涉及到两种类型的内存:栈内存(stack)和堆内存(heap). 基本类 ...
- Java方法 传值方式
这个问题是面试的时候经常会问到的一道题吧?这次做项目的过程中,其中一个同学因为无用了,导致了一个bug,不过是在提测前啦!本来我想借着这次机会分享一下java方法传参的机制,但是经过几天的学习,了解, ...
- Java中的参数传值方式
本文转载自 https://blog.csdn.net/SEU_Calvin/article/details/70089977 1. 你觉得下面程序会输出什么 public static void ...
- java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)
java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配, ...
- 【转载】Java是传值还是传引用
1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Te ...
- java 传参方式--值传递还是引用传递
java 传参方式--值传递还是引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递.写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用 ...
- iOS 浅谈MVC设计模式及Controllers之间的传值方式
1.简述你对MVC的理解? MVC是一种架构设计.它考虑了三种对象:Model(模型对象).View(试图对象).Controller(试图控制器) (1)模型:负责存储.定义.操作数据 (2)视图: ...
- 页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,
首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...
随机推荐
- u-boot中bss段的使用
近日在调试uboot时,发现了一个现象,即在relocate_code前如果给未初始化或者初始化值为0的变量赋值的话,则在relocate_code后程序无法正常执行.经过学习,恶补如下知识 BSS段 ...
- u-boot v2018.01 启动流程分析 简单版(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/weixin_39655765/artic ...
- canvas实现圆角、圆框图片
参考资料: http://www.zhangxinxu.com/study/201406/image-border-radius-canvas.html https://www.jianshu.com ...
- NOIP2015普及组总结
NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...
- Ubuntu18.04下更改apt源为阿里云源
1.复制源文件备份,以防万一 我们要修改的文件是sources.list,它在目录/etc/apt/下,sources.list是包管理工具apt所用的记录软件包仓库位置的配置文件,同样类型的还有位于 ...
- shiro框架学习-8-shiro缓存
1. shiro进行认证授权时会查询数据库获取用户角色权限信息,每次登录都会去查询,这样对性能会又影响.可以设置缓存,查询时先去缓存中查找,缓存中没有再去数据库查询. 从shiro的架构图中可以看到有 ...
- oracle 7.4安装nvidia驱动
2019-8-28 参考网页: 如何在k8s集群中安装nvidia.cuda并使用GPU进行训练 https://blog.csdn.net/u013042928/article/details/78 ...
- Python学习:Python设计模式-单例模式
一.单例模式存在的意义 在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什么时候不适合使用单例模式, ...
- Devexpress 10
序言 Grid表格 资料 https://www.devexpresscn.com/
- 实战build-react(二)-------引入Ant Design(增加)
https://blog.csdn.net/zhan_lijian/article/details/85271906(copy) 1.肯定参考facebook关于react官网咯 快速搭建 creat ...