当前位置:首页 > 数码 > 中值的传递与援用传递机制-Java (中值的传递与传递函数)

中值的传递与援用传递机制-Java (中值的传递与传递函数)

admin4个月前 (05-08)数码32
Java

开篇先来曝答案,在言语中,实质只要值传递,而无援用传递,解释和证实详见注释。

说到值传递和援用传递咱们不得不提到两个概念:值类型和援用类型。

1、值类型

深刻意义过去说,所谓的值类型指的就是Java中的8大基础数据类型:

从JVM层面来讲:所谓的值类型指的是在赋值时,间接在栈中(Java虚构机栈)生成值的类型,如下图所示:

2、援用类型

援用类型是指除值类型之外的数据类型,比如:

从JVM的层面来讲,所谓的援用类型是指,在初始化时将援用生成栈上,而值生成在堆上的这些数据类型,如下图所示:

3、值传递

值传递(PassByValue)指的是方法传参时,传递的是原内容的正本,因此对正本启动如何修正都不会影响原内容。

实现代码如下:

publicclassPassTest{publicstaticvoidmn(String[]args){intage=18;System.out.println("调用方法前:"+age);intTest(age);System.out.println("调用方法后:"+age);}privatestaticvoidintTest(intage){age=30;System.out.println("方法中修正为:"+age);}}

程序的口头结果为:

从上述结果可以看出,在方法中修正参数并未影响原内容,咱们把这种传参形式称之为值传递。

4、援用传递

援用传递(PassByReference)指的是方法传参时,传递的是参数自身,因此对参数启动恣意修正都会影响原内容。

模拟援用传递的实现代码如下:

publicclassPassTest{publicstaticvoidmain(String[]args){char[]name={'磊','哥'};System.out.println("调用方法前:"+newString(name));paramTest(name);System.out.println("调用方法后:"+newString(name));}privatestaticvoidparamTest(char[]n){n[1]='神';System.out.println("方法中修正为:"+newString(n));}}

程序的口头结果为:

从上述的结果可以看出在paramTest方法中修正了参数之后,在main方法中再打印参数时,发现参数的值也跟着出现了扭转,那么仿佛咱们可以得出论断,Java中貌似也有援用传递,但是实事并如此,咱们接着看。

5、虚实援用传递

咱们给下面的代码参与一行,如下所示:

publicclassPassByValue{publicstaticvoidmain(String[]args){char[]name={'磊','哥'};System.out.println("调用方法前:"+newString(name));paramTest(name);System.out.println("调用方法后:"+newString(name));}privatestaticvoidparamTest(char[]n){n=newchar[2];//参与此行代码n[1]='神';System.out.println("方法中修正为:"+newString(n));}}

程序的口头结果为:

从上述结果可以看出,当咱们在paramTest方法中参与newchar[]之后,援用传递就突然变值传递了?为什么?

这是由于,在Java言语中实质上只要值传递,也就说Java的传参只会传递它的正本,并不会传递参数自身。

前面那个带引号的援用传递其实只是传递了它的援用正本,如下图所示:

所以咱们在调用newchar[]之后,可以看出n对象有了新地址,而原内容并未被修正,假设依照援用传递的思绪来看的话,不论口头任何形式的修正都会扭转原内容,因此咱们可以愈加确认Java言语中只要值传递,如下图所示:

总结

经过本文的内容,咱们可以得出:在Java言语中只要值传递,方法传参时只会传递正本消息而非原内容。咱们还知道了基础数据类型会间接生成到栈上,而对象或数组则会在栈和堆上都生成消息,并将栈上生成的援用,间接指向堆中生成的数据,如下图所示:


java值传递和引用传递的区别java核心卷

1.基本类型和引用类型在内存中的保存Java中数据类型分为两大类,基本类型和对象类型。 相应的,变量也有两种类型:基本类型和引用类型。 基本类型的变量保存原始值,即它代表的值就是数值本身;而引用类型的变量保存引用值,引用值指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,引用类型包括:类类型,接口类型和数组。 相应的,变量也有两种类型:基本类型和引用类型。 2.变量的基本类型和引用类型的区别基本数据类型在声明时系统就给它分配空间:12int a; a=10;//正确,因为声明a时就分配了空间引用则不同,它声明时只给变量分配了引用空间,而不分配数据空间Date date;//执行实例化,开辟数据空间存放Date对象,然后把空间的首地址传给today变量//date=new Date();//如果注释掉上一步操作//The local variable date may not have been initialized//也就是说对象的数据空间没有分配();看一下下面的初始化过程,注意引用也是占用空间的,一个空Object对象的引用大小大概是4byte:123Date a,b; //在内存开辟两个引用空间 a = new Date();//开辟存储Date对象的数据空间,并把该空间的首地址赋给a b = a; //将a存储空间中的地址写到b的存储空间中3.引用传递和值传递这里要用实际参数和形式参数的概念来帮助理解,值传递:方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。 引用传递:也称为传地址。 方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。

java新手关于基本参数传参和引用变量传参的区别

要解决这个问题,首先你必须得理解两个概念。

值传递:在具体的实参传递到方法中定义的形参的时候,传递的是值的拷贝,也就是复制一份来的值,这样就有个两个值,在方法内部对参数进行处理的时候,实际上是处理的那个拷贝后的值,而原来的值更本没有改变,因此就不会动。

引用传递:在具体的实参传递到方法定义的形参的时候,传递的是引用的地址的拷贝,也就是对象在堆中的地址,这样的话指针指向实际对象的值是同一个,也就是你传递了引用,其实也就改变了对象本身。

ps:也有一种说法是引用传递也是值传递,其实是不同的说法,本质上都是一样的。

数组都是引用数据类型,因此属于引用传递。也就是说他们传递的过程会对值本身产生变化,而int是基本数据类型,属于值传递,传递前后参数和原始值没有任何关系,所以值不会发生变化。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Java

“中值的传递与援用传递机制-Java (中值的传递与传递函数)” 的相关文章

大编程趋势-5-年-Java-2024-开发者的 (编程是大趋势吗)

大编程趋势-5-年-Java-2024-开发者的 (编程是大趋势吗)

Java 作为编程领域的支柱,拥有超过 900 万开发人员和超过 30 年的发展历史。它以其先进的安全功能、优越的性能和跨平台开发能力而闻名。展望 2024 年,Java 正准备进行一场突破性的转...

Java循环结构与实现方式 (java循环语句案例)

Java循环结构与实现方式 (java循环语句案例)

循环简介 循环是编程中常用的一种控制结构,用于重复执行某一段代码或操作。循环的执行需要满足一定的条件,当条件满足时,循环会一直执行,直到条件不满足时才结束。所以循环其实就是重复地完成某一件事...

Java-Lambda-表白式的多面运行-从基础到初级 (java类的定义和使用)

Java-Lambda-表白式的多面运行-从基础到初级 (java类的定义和使用)

Lambda表白式是8中引入的最有影响力的性能之一。它们经过准许繁复而优雅地创立匿名函数来成功Java中的函数式编程。在这篇博文中,咱们将讨论编写lambda表白式的各种方式。 概述...

在-Java-年依然盛行的-2023-25-个要素 (在javascript中)

在-Java-年依然盛行的-2023-25-个要素 (在javascript中)

译者|刘汪洋 审校|重楼 学习的环节中,我看法到在90年代末OOP正值鼎盛期间,Java作为能够真正成功这些概念的言语显得尤为突出(虽然我此前学过C++,但相比Java影响较小)。我特...

Java中不倡导经常使用foreach的六大场景 (java中不等于怎么写)

Java中不倡导经常使用foreach的六大场景 (java中不等于怎么写)

在中,foreach是一个罕用的循环结构,它可以极大地简化遍历数组或汇合(例如List或Set)的代码。它通常被以为是一种愈加繁复和易读的迭代形式。但是,或许有一些状况下不倡导经常使用foreac...

Java-渣滓回收器的运作形式-对不再沉闷对象的跟踪机制

Java-渣滓回收器的运作形式-对不再沉闷对象的跟踪机制

作为一门面向对象的编程言语,具备智能内存治理的个性。这象征着开发人员无需手动调配和监禁内存,而是由Java虚构机的渣滓回收器担任治理。渣滓回收器经过监督程序中不再经常使用的对象来回收内存,以提高内...

掌握Java并发编程-免除竞态条件的困扰 (掌握JavaScript基础)

掌握Java并发编程-免除竞态条件的困扰 (掌握JavaScript基础)

1. 竞态条件的概念和问题 竞态条件指的是多个线程同时访问共享资源,由于执行顺序的不确定性,导致程序结果与预期不符的情况。竞态条件问题通常出现在以下情况下: 多个线程争用同一把锁 多个线程...

Java-以及如何成功它-为何它本应更繁难-异步编程 (java一个子类可以有多个父类吗)

Java-以及如何成功它-为何它本应更繁难-异步编程 (java一个子类可以有多个父类吗)

在过去的好多年里,多线程和异步不时作为技术里的初级局部,在技术序列中,一个言语分为入门局部、进阶局部和初级局部,所以,异步是作为其中的初级技术局部存在的。 关于异步和多线程这局部吧,经常存在...