JAVA中传值与“传引用“辨析
一.概念简单辨析
Java常用的数据类型有
(1).八大基本数据类型:
1、boolean:数据值只有true或false,适用于逻辑计算。
2、char:char型(字符型)数据在内存中占用2个字节。char型数据用来表示通常意义上的字符,每个字符占2个字节,Java字符采用Unicode编码,它的前128字节编码与ASCII兼容字符的存储范围在\u0000~\uFFFF,在定义字符型的数据时候要注意加’ ',比如 '1’表示字符’1’而不是数值1,
3、byte:byte型(字节型)数据在内存中占用1个字节,表示的存储数据范围为:-128~127。
4、short:short型(短整型)数据在内存中占用2个字节。
5、int:int型(整型)数据在内存中占用4个字节。
6、long:long型(长整型)数据在内存中占用8个字节。
7、float:float型(单精度浮点型)数据在内存中占用4个字节。(float精度为7-8位)
8、double:double型(双精度浮点型)数据在内存中占用8个字节。
(2).三种引用类型:
1.类:属性与方法的集合
2.接口:常量与抽象方法的集合
3.数组:一组数据的集合
在Java中,前一种类型即八大基本数据类型在参数传递的过程中采用拷贝值的方式也就是 按值传递;
而对于引用类型来说,其在参数传递的过程中则采用拷贝引用的方式,也就是不严格意义上的 “按引用传递”;
(由于Java中没有类似C++的指针,因此"按引用传递"的过程实际上拷贝的是地址副本)
二.实例分析:传值
public class Test {public static class A{int m=10;
}public static void main(String[] args){A a = new A();int n=a.m;n=20;System.out.println("m="+a.m);System.out.println("n="+n);
}}
最后输出的结果为m=10,n=20。
之所以出现这样结果的原因是按值传递仅仅拷贝了变量的值,n与m分别储存在不同且相互独立的内存空间,因此在main函数中,对n的值进行改变后并不会影响m的值。
三.实例分析:传引用
public class Test {public static class A{int m=0;
}public static void main(String[] args){A b = new A();b.m=10;change(b);System.out.println("main函数中m为:"+b.m);}
public static void change(A a){a.m=20;System.out.println("change方法中m为:"+a.m);
}
}
此时最后的输出结果为:
change方法中m为:20
main函数中m为:20
之所以出现这种情况的原因是change(b)过程中传递的是b的引用,即change方法中的a与main函数中的b均指向同一个内存空间,因此在change函数中导致的m的改变实质上是对b这一对象中m属性值的改变;
如果对代码进行更改:
public class Test {public static class A{int m=0;
}public static void main(String[] args){A b = new A();b.m=10;change(b);System.out.println("main函数中m为:"+b.m);}
public static void change(A a){a = new A();a.m=20;System.out.println("change方法中m为:"+a.m);
}
}
此时的结果为:
change方法中m为:20
main函数中m为:10
因为此时在change函数中为a分配了新的内存空间,a对象中m的改变不会再导致b中m的改变.
四.得出结论
按值传递,不会改变原来的值,引用传递,会改变引用对象的值
JAVA中传值与“传引用“辨析相关推荐
- 传值类型_Java内存管理:Stackoverflow问答-Java是传值还是传引用(十一)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题 ...
- Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 推荐阅读 第一季 0.Java的线程安全.单例模式.JVM内存结构等知识梳理 1.Java内存管理-程序运行过程(一) 2 ...
- php中什么时候用传值,php中传值与传引用的区别。什么时候传值什么时候传引用?...
java中的this与super的区别 java中的this与super的区别 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Ba ...
- vue中传值和传引用_vue prop属性传值与传引用示例
vue prop属性传值与传引用示例 vue组件在prop里根据type决定传值还是传引用. 简要如下: 传值:String.Number.Boolean 传引用:Array.Object 若想将数组 ...
- 几句话弄清楚Java参数传值还是传引用
最近刷题用递归解决关于树的问题的时候,在递归函数调用的时候什么时候传入值,什么时候传入引用有疑问,因为这关系到什么时候我们需要恢复现场,什么时候不需要.在网上搜索了一下,感觉这篇总结的非常简单明了,简 ...
- Java中传值与传地址
为什么80%的码农都做不了架构师?>>> 基本类型都是传值,传入的参数的改变不会影响原来的变量值. String类型也是传值,不会改变. 对象作为参数进行传递时,是把对象在内存 ...
- PHP面试题:请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略 按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 优缺点:按值传递时,php必须复制值.特别是对于大型的字符串和对象来说,这将会 ...
- Java中的传值与传引用
曾经对java中传值还是传引用的问题十分困惑,而且也被问到过许多次,无论是面试,还是平时我们平时的讨论中. 在stackoverflow上面浏览时,无意中发现了跟这个问题有关的论题,于是深入地查看了, ...
- java的函数传值_java 函数形参传值和传引用的区别[转]
java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. publicclassTestFun { publicstaticvoidt ...
最新文章
- k8s 集群 Ingress Nginx传递用户真实IP问题
- 函数 —— 分析命令行参数 getopt() getopt_long() getopt_long_only()
- nginx下rewrite规则中参数超过10 $10 解决方案
- VS2010 小技巧
- 【totti】一道weblogic认证考题所想到的
- 154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?| 中国 AI 应用开发者报告
- VS2019配置opencv4.1.2(永久配置)
- 计算机毕业设计(附源码)python兴澜幼儿园管理系统
- 非常值得收藏的15个 Google 高级搜索技巧
- linux分析java堆栈信息,Linux下获取java堆栈文件并进行分析
- PDF解密工具—Cisdem PDF Password Remover
- NOIp2016 题解
- 临沂吴忠军新浪微博主页
- UE4实现生化危机7影子谜题
- 【中国疫情数据可视化】
- SCARA四轴机器人丝杆花键_scara机器人专用丝杆花键BNA1616螺母旋转式滚珠丝杆,ZCIV滚珠丝杆花键副...
- 给layim和websocket 菜鸟一个温馨的提示
- 管理者也要警惕经验主义,保持开放心态
- java 强制gc_如何强制GC回收垃圾
- 老年人养生:有意识的进行左手摇蒲扇 有助于预防脑溢血 健康养生