Java里的按值传递与引用传递
按值传递还是按引用传递
指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:
public class TempTest {
private void test1(int a){
//做点事情
}
public static void main(String[] args) {
TempTest t = new TempTest();
int a = 3;
t.test1(a);//这里传递的参数a就是按值传递
}
}
按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。
示例如下:
public class TempTest {
private void test1(int a){
a = 5;
System.out.println("test1方法中的a==="+a);
}
public static void main(String[] args) {
TempTest t = new TempTest();
int a = 3;
t.test1(a);//传递后,test1方法对变量值的改变不影响这里的a
System.out.println(”main方法中的a===”+a);
}
}
运行结果是:
test1方法中的a===5
main方法中的a===3
指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
示例如下:
public class TempTest {
private void test1(A a){
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
t.test1(a); //这里传递的参数a就是按引用传递
}
}
class A{
public int age = 0;
}
传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
示例如下:
第1行 public class TempTest {
第2行 private void test1(A a){
第3行 a.age = 20;
第4行 System.out.println("test1方法中的age="+a.age);
第5行 }
第6行 public static void main(String[] args) {
第7行 TempTest t = new TempTest();
第8行 A a = new A();
第9行 a.age = 10;
第10行 t.test1(a);
第11行 System.out.println(”main方法中的age=”+a.age);
第12行 }
第13行 }
第14行 class A{
第15行 public int age = 0;
第16行 }
运行结果如下:
test1方法中的age=20
main方法中的age=20
要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。
用上面的例子来进行分析:
(1):运行开始,运行第8行,创建了一个A的实例,内存分配示意如下:
也就是说:是两个变量都指向同一个空间。
(6):运行第11行,根据此时的内存示意图,输出main方法中的age=20
理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面呢?
方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:
第1行 public class TempTest {
第2行 private void test1(A a){
第3行 a = new A();//新加的一行
第4行 a.age = 20;
第5行 System.out.println("test1方法中的age="+a.age);
第6行 }
第7行 public static void main(String[] args) {
第8行 TempTest t = new TempTest();
第9行 A a = new A();
第10行 a.age = 10;
第11行 t.test1(a);
第12行 System.out.println(”main方法中的age=”+a.age);
第13行 }
第14行}
第15行class A{
第16行 public int age = 0;
第17行}
test1方法中的age=20
main方法中的age=10
(1):运行开始,运行第9行,创建了一个A的实例,内存分配示意如下:
(7):运行第12行,根据此时的内存示意图,输出main方法中的age=10
(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;
转载于:https://blog.51cto.com/yqsshr/147695
Java里的按值传递与引用传递相关推荐
- Java基础中按值传递和引用传递详解
下面是我在网上看到的一个帖子,解释的感觉挺全面,就转过来,以供以后学习参考: 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: [java] view plaincopy ...
- php引用传递_php的按值传递与引用传递 - 小俊学习网
两者的区别: 值传递是两个变量占用不同的内存空间,而传引用则是同一个内存空间,实际就是对同一个变量进行操作. 传值,原有的值不会消失,不会改变,两个变量分别占用一个内存:传引用,原值会被修改,两个变量 ...
- 天真,居然还有人认为java的参数传递方式是引用传递
代码写的越急,程序跑得越慢.-- Roy Carlson 时间过得真快,2020已经过去了一半,但是疫情好像还没有真正的消灭,人们出行还是得带着口罩,天气越来越热,受罪啊. 言归正传,都2020年了, ...
- java hashmap 初始化赋值_HashMap引用传递,对象直接赋值,修改的是同一个对象,new HashMap「」(Map)才是生成新的对象...
HashMap引用传递:对象直接赋值,修改的是同一个对象 MapsrcMap = new HashMap<>(); srcMap.put("a","a&quo ...
- JAVA中参数传递问题的总结(按值传递和引用传递)
关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象). 首先以两个例子开始: 1) public class Test2 { public static ...
- java改变实参_java中引用传递问题,在函数中修改引用的指向,会不会影响实参?...
是时候展现一下我的JAVA基础知识了,2333. 我按照执行顺序给你写注释好了. Person p1 = new Person(10); //创建了一个对象 //p1.age=10; modify(p ...
- [转载] java中对象作为参数传递给一个方法,到底是值传递,还是引用传递
参考链接: 用Java传递和返回对象 看完绝对清晰~ java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型 值传递:引用类型,地址值传递,所 ...
- 【重难点】【Java基础 04】值传递和引用传递、序列化和反序列化
[重难点][Java基础 04]值传递和引用传递.序列化和反序列化 文章目录 [重难点][Java基础 04]值传递和引用传递.序列化和反序列化 一.值传递和引用传递 1.对比 二.序列化 1.基本概 ...
- java形参、实参、值传递、引用传递
工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...
最新文章
- C++ STL: 超详细 容器 deque 以及 适配器queue 和 stack 源码分析
- etcd与mysql_一、配置etcd数据库
- bootstrap-内联文本元素-插入文本
- jdk-12.0.2 64位最新版
- Altium designer不显示飞线的三种方法
- 刚刚,阿里云知行动手实验室正式开放公测了
- VTK:PolyData之PolyDataToUnstructuredGrid
- LeetCode之Merge Two Sorted Lists
- modelsim 安装后运行,出现fatal License Error
- 阿里云 EMR Delta Lake 在流利说数据接入中的架构和实践
- 转_人人网开放平台技术架构
- ADF开发遇到错误:JBO-26030 无法锁定记录,其他用户持有该锁
- 受 SQLite 多年青睐,C 语言到底好在哪儿? 1
- linux环境中nagios(nagios core)安装?nagios安装?
- Android知识点复习(一)-Android系统架构
- HCNA-RS笔记-20171105-day03
- 《自己动手写操作系统》实践(一)
- python实现千图成像
- linux vi脚本,用VIM编写脚本
- 批量修改文件夹名称的一部分
热门文章
- oracle的cv函数,cv_wait 和 cv_timedwait 函数
- java链接mysql输出查询_用java做网站,java连接数据库并查询输出到页面
- python作品_学习 Python 有些枯燥?那是你学错方法了,看这里
- 算法之------搜索篇
- java使用不存在的字符串_jpa – java.lang.IllegalArgumentException:您试图使用查询字符串中不存在的字符串名称设置参数值...
- 【pip install psycopg2安装报错】Error: pg_config executable not found.
- 天翼云从业认证(4.2)网站建设实战
- shields 徽标_所有徽标看起来都一样
- 笔记-中项案例题-2018年上-整体管理
- Java开发中模拟接口工具moco的使用