java真的是值传递么?
2019独角兽企业重金招聘Python工程师标准>>>
在java中我们在给方法传值时,真的是我们认为的值传递么?如果不是,那么是引用传递么?
其实在java中方法传值时,java的内部处理机制是不一样的,当传入是基本数据类型时,你可以认为是值传递,而当传入的是一个对象时,就不仅仅是值传递,应该说你如果还认为是值传递时,那就大错特错了,因为是引用传递
简单数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面只有这八种数据类型是这种存储模型;而其他的只要是继承于Object类的复杂数据类型都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的。
但是不是所有的引用类型或者复杂类型都遵循上面的原则
比如经常使用的String类型就是一种形似引用的值传递,这是因为java内部对String类型进行过优化处理
再比如Date数据类型也是一种复杂的类型但其同样不是一种引用传值,而是值传递
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
//这是String类型的时候进行的值传递,你只要放开注释就可以看见了
// String []a={1+""};
// System.out.println(a[0]);
// test(a);
// System.out.println(a[0]);
// }
// public static void test(String [] a){
// a[0]=10+"";
// }
// String s=1+"";
// System.out.println(s);
// test(s);
// System.out.println(s);
//下面这是在Date中的值传递,其中的Thread线程必须要加上,因为计算机是进行时间片轮转,在这段代码很少的情况下,如果不让Thread睡一会儿很容易在一个时间片就执行所以你会看输出的结果是一样的,关于Date类型我会在下一篇中详细介绍
Date date = new Date();
System.out.println(date.getTime());
Thread.sleep(1000);
test(date);
System.out.println(new Date().getTime());
System.out.println(date.getTime()); //如果是引用传递的话其应该和test方法中打印的应该是一样的,但是事实却不是,而且还有一个很奇怪的现象不管你让thread睡多长时间,传入的date和打印方法中的date是一样的
}
public static void test(Date date){
date = new Date();
System.out.println(date.getTime());
}
java:
基本类型存储在栈中,因此它们的存取速度要快于存储在堆中的对应包装类的实例对象。从Java5.0(1.5)开始,JAVA虚拟机(Java Virtual Machine)可以完成基本类型和它们对应包装类之间的自动转换。因此我们在赋值、参数传递以及数学运算的时候像使用基本类型一样使用它们的包装类,但这并不意味着你可以通过基本类型调用它们的包装类才具有的方法。另外,所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。
转载于:https://my.oschina.net/u/178660/blog/58069
java真的是值传递么?相关推荐
- java开根号函数_Java中真的只有值传递么?
原创: ITwalking 转载于公众号[ 编程大道] (本文非引战或diss,只是说出自己的理解,欢迎摆正心态观看或探讨) 回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法 ...
- 面试官:兄弟,说说Java到底是值传递还是引用传递
二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催.我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经 ...
- Java中的值传递和引用传递
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为 ...
- Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递?
来自:沉默王二 在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很 ...
- 为什么说 Java 中只有值传递?
对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文章可以把这个事情讲解的通俗易懂. ...
- (重要)java都是值传递,与对象形参所指向的对象改变,其实参所指向的对象也相应改变并不矛盾(2011年9.30日一天写的两个程序的总结结果)...
1.0建立二叉树的代码,在java中必须创建二叉树的方法必须用返回值,因为不存在c语言中的引用传递,在java中只有值传递 代码1为正确,代码2(没有使用返回值)为错误.那么为什么之前的例子中将对象作 ...
- java中形参不可以是对象吗_(重要)java都是值传递,与对象形参所指向的对象改变,其实参所指向的对象也相应改变并不矛盾(2011年9.30日一天写的两个程序的总结结果)...
1.0建立二叉树的代码,在java中必须创建二叉树的方法必须用返回值,因为不存在c语言中的引用传递,在java中只有值传递 代码1为正确,代码2(没有使用返回值)为错误.那么为什么之前的例子中将对象作 ...
- java只有值传递_面试官:为什么 Java 中只有值传递?
1.为什么 Java 中只有值传递? 首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语.按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(ca ...
- 【Java基础】Java中的值传递、引用传递
Java中的值传递.引用传递 对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己.--<Java编程思想> 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本 ...
最新文章
- 【性能优化】纳尼?内存又溢出了?!是时候总结一波了!!
- 2021年3月16日 北京快手Java开发实习面试(海外增长方向)
- 全球 Top 1000 计算机科学家 h 指数公布,中国顶尖计算机科学家人数进入前三
- MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器
- 家在深圳接入云信,让用户在社交中感受到“家在深圳”
- Python 中的url,Base64和MD5编码解码的使用
- PHP-CGI, FastCGI, PHP-FPM的关系和区别
- c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序
- springboot学习,实现原理技术点汇总
- C++:类的构造函数
- python count函数用法 comm_Python学习第六天课后练习案例 (主要针对的内容是python函数的定义和使用)...
- Spring Security Oauth2 (四) 密码码模式 代码
- 财务与IIT的发展正在质变
- redhat5下安装informix
- cpu的用户态和内核态和内存的用户空间内核空间
- Python爬虫实战, QQ空间自动点赞
- 共阳极管的代码_共阳极数码管-共阳极数码管显示
- 随机效应估算与固定效应估算_混合效应模型和面板数据分析zz Flona
- 苹果操作系统 leopard 10.5 (PC破解完全中文安装版,IBM X40安装成功)
- (新手版)GitHub 使用思想,上传,首次上传及日常使用教程(肯定看得懂)
热门文章
- oracle 初始化出错,OCCI编程时,初始化Date种出错
- php 字符串包含另一个字符串_leetcode1433_go_检查一个字符串是否可以打破另一个字符串...
- 天翼云从业认证(4.12) 天翼云医疗行业解决方案
- LeetCode:63. 不同路径 II
- 【项目管理】接手一支技术团队,你会做些哪些事?
- Winform中设置ZedGraph的多条Y轴的标题和刻度不显示十次幂
- AndroidStudio中使用XML和Java代码混合控制UI界面实现QQ相册照片列表页面
- SonarQube4.4+Jenkins进行代码检查实例之三-单元测试分析
- 如何在MacOS上创建第一个iOS Flutter应用
- 笔试训练1 知识点整理