首页 > 其他分享 >值传递和引用传递区别是什么?

值传递和引用传递区别是什么?

时间:2023-08-14 22:22:47浏览次数:44  
标签:10 name 区别 System 传递 person static 引用 println

先看两个例子,如果例子的背后原理都懂,就不需要看这篇文章了,如果看不懂其中的某一个,那么就听我道来~

 1 public class Demon02 {
 2     public static void main(String[] args) {
 3         int a =1;
 4         System.out.println(a);
 5         changeNumber(a);
 6         System.out.println(a);
 7     }
 8     private static int changeNumber(int a){
 9         a=10;
10         return a;
11     }
12 }

结果
1
1

 1 public class Demo01 {
 2     public static void main(String[] args) {
 3         Person person = new Person();
 4         System.out.println(person.name);
 5         changeName(person);
 6         System.out.println(person.name);
 7 
 8     }
 9     static class Person{
10         private String name;
11     }
12     private static void changeName(Person person){
13         person.name="张三";
14     }
15 
16 }

结果

null

张三

一般第二个例子比较好理解,因为将person这个对象的属性name赋值了张三,所以他的值会发生变化,第一个例子应该有不少人会懵圈。那为啥会出现这个结果呢?先看两个概念:

值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。 先说例子1: 第5行代码调用了第8行的方法,其中第5行的a是实参,第8行的a是形参,调用的时候是将10这个值赋予方法中a的值,这样形参a第8行为1,接着第9行形参a的值被修改为10,第10行返回形参a的值10. 但是第5行并没有接收函数返回值。所以并没有改变第三行赋于a=1的值,这样第6行打印a的时候值还是1. 例子2: 第3行首先new了一个person对象,第5行调用方法的时候将person对象的地址已经传递到函数的形参person,此时对person对象的属性name赋值张三,那么同时修改了第3行建的person对象的属性name值。 所以第6行再次打印的时候,就会出现张三的名字。 那么我们对例子1做简单的调整,就会发现不一样的结果:
 1 public class Demon02 {
 2     public static void main(String[] args) {
 3         int a =1;
 4         System.out.println(a);
 5         a = changeNumber(a);
 6         System.out.println(a);
 7     }
 8     private static int changeNumber(int a){
 9         a=10;
10         return a;
11     }
12 }

第5行加一个a=之后结果如下:

1
10

那这又是为啥呢?

原因是将函数返回的值重新赋于a,这样修改了a的值,使得a=10.

标签:10,name,区别,System,传递,person,static,引用,println
From: https://www.cnblogs.com/qcjcode/p/17629828.html

相关文章

  • 新人笔记-参数的传递
    publicclassMethodDemo03{publicstaticvoidmain(String[]args){intnumber=100;System.out.println("调用方法前"+number);change(number);System.out.println("调用方法后"+number);}publicsta......
  • ifconfig与ipconfig的区别
    转自:ipconfig和ifconfig区别_明子~的博客-CSDN博客简单来说,ipconfig是Windows中显示当前TCP/IP配置信息,而ifconfig是Linux中网络适配器的查看指令。1.ipconfig:Windows中ipconfig实用程序可用于显示当前TCP/IP配置的设置值。这些信息一般用来检验人工配置的TCP/IP设置是否正确。......
  • python中function使用class调用和使用对象调用的区别
    问题在python中,class中函数的定义中有一个特殊的self指针,如果一个函数有一个self参数,通常意味着这是一个非静态函数,也就是调用的时候第一个参数是对象指针,只是这个指针是调用这个函数时由python来自动填充。tsecer@harry:catcls_mth.pyclasstsecer():defharry(self):......
  • Python中os._exit(), sys.exit(), exit() 的区别
    在Python3.x中,os._exit(),sys.exit(),和exit()是三个不同的终止程序执行的函数,它们之间有一些区别:os._exit():这个函数是os模块中的一个函数,它用于直接终止程序的执行,并且不会触发任何清理活动或关闭程序中的资源。它不会抛出任何异常或执行任何finally子句。使用os._exit(......
  • React和Vue的区别,大家怎么看?
    Vue更适合小项目,React更适合大公司大项目;Vue的学习成本较低,很容易上手,但项目质量不能保证......真的是这样吗?借助本篇文章,我们来从一些方面的比较来客观的去看这个问题。 论文档的丰富性从两个方面来看这个问题:社区的支持力度及文档的完善性。 对于任何编程语......
  • CyclicBarrier和CountDownLatch的区别
    引言在并发编程中,CyclicBarrier和CountDownLatch是两个常用的同步工具类。它们都可以用于线程之间的等待和协调,但在使用方式和功能上有一些区别。本文将深入探讨CyclicBarrier和CountDownLatch的区别,并给出相应的代码示例。CyclicBarrier和CountDownLatch简介CyclicBarrierCycl......
  • cookie和session的区别及原理
    Cookie概念在浏览某些网站时,这些网站会把一些数据存在客户端,用于使用网站等跟踪用户,实现用户自定义功能.是否设置过期时间:如果不设置过期时间,则表示这个Cookie生命周期为浏览器会话期间,只要关闭浏览器,cookie就消失了.这个生命期为浏览会话期的cookie,就是会话C......
  • 计算机网络中速率和带宽的区别
    速率,指的是连接在计算机网络上的主机在数字信道上传送数据的速率,它也称为数据率或比特率,单位是bps。速率往往指的是额定速率或者标称速率,意思也就是在非常理想的情况下才能达到的数据传送的速率,然而在现实生活中是达不到的。带宽,在计算机网络中用来表示网络的通信线路传送数据的能......
  • 锐龙r76800h和r75800h差多少 r7 6800h和r7 5800h区别
    AMDR76800H采用了6nm工艺,Zen3+架构,参数为8C16T,最高4.7GHz,16MBL3缓存,12CU2.2GHz核显。选R75800H还是r76800h这些点很重要!看完你就知道了http://www.adiannao.cn/dyR75800H为8核16线程,主频3.2GHz,三级缓存翻倍至16MB,搭载了DDR4-3200内存。R7-6800H与R7-......
  • 入手评测锐龙r7 6800u和r7 6800h区别 r76800u和r76800h对比
    aMD锐龙76800U处理器,采用全新的Zen3+架构,6nm制程工艺,8大核16线程,最大加速时钟频率可达4.7GHz,三级缓存16MB。锐龙76800U处理器核显为AMDRadeon680M显卡,RDNA2架构,12显示核心,2200MHz显示频率,相较于前代显示性能提升约2倍选r76800u还是r76800h这些点很重......