在Java中按值调用和按引用调用
作者:?sofia 发布时间:2021-12-26 20:09:21
一、为什么按值调用和按引用调用?
方法或函数可以通过两种方式调用。一种是按值调用,另一种是按引用调用,这两种方式通常根据作为输入或参数传递给它们的值的类型来区分。
在我们开始之前,让我澄清一件事,在Java中,只有按值调用(值传递),没有按引用调用。
二、按值调用
按值调用是一种方法,通过复制给定变量(或常量或任何保存数据的对象)的实际值,将参数传递给函数
这意味着当我们调用一个传递参数值的方法时,这个参数值会被复制到内存的一部分(取决于类型),值的副本会被传递给调用方法的参数。
在Java中,只有按值调用,没有按引用调用。
三、引用调用
通过引用调用是一种将值的引用(即地址)传递给方法的方法。
这意味着,当我们通过将引用的副本(即地址)传递给该方法的值而不是值本身的副本来调用该方法时,调用方法具有该值的引用(即地址)。
当调用方法更改值的引用时,原始引用也会更改。
四、为什么Java中只有按值调用,没有按引用调用?
根据定义,引用调用是我们传递该变量的引用(即地址)的地方。要做到这一点,我们需要首先存储地址,这将需要一个指针(在C中,其传递为*variableName)。正如我们所知,在java中,我们没有指针,因此不可能传递引用(即地址)并执行逐引用调用。
Java不支持指针,这就是为什么Java不支持引用调用。但是C/C++支持指针,因此这些语言支持引用调用。
您可能会问,为什么Java不支持指针?好吧,这是另一个有争议的话题,我们可以在其他文章中讨论,直到签出这个stackoverflow页面,可以参考,这让您对它有了一些了解。
但是,我们仍然可以借助对象行为在Java中实现引用调用。
五、Java中的引用调用,但如何调用?
Java总是使用按值调用。这意味着该方法获取所有参数值的副本,并且该方法不能修改传递的变量的内容。Java使用两种方法参数:
Java基本类型
Java对象引用
它看起来非常简单明了,就像将基本类型传递给方法一样。但在将对象传递给该方法时,这是非常引人注目的。当一个对象被传递给一个方法时,该方法会获得对象引用的一个副本,而原始副本和正式副本都引用同一个对象,因此在调用方法中,可以更改对象参数的状态。
让我们通过一个例子来详细了解上述两个方法参数。
将Java基本数据类型作为参数传递给方法
对于原始数据类型参数,原始值不变。让我们举一个简单的例子:
public class PrimitiveDataInAction {
public static void main(String[] args) {
int someValue = 50;
System.out.println("Before method call :: " + someValue);
modified(someValue);
System.out.println("After method call :: " + someValue);
}
public static void modified(int someValue) {
System.out.println("exiting name :: " + someValue);
// modifying the parameter
someValue = 15;
System.out.println("modified name :: " + someValue);
}
}
输出:
Before method call :: 50
exiting name :: 50
modified name :: 15
After method call :: 50Process finished with exit code 0
当您将原始数据类型变量传递给一个方法时,它会为该方法创建一个本地副本,并执行方法中提到的任何操作&一旦这个变量从这个方法中出来,方法本地副本就会从内存中删除
&
调用该变量之前加载的前一个值。
六、Java对象引用
对于Java对象引用类型的按值调用,会更改原始值。
让我们举一个简单的例子:
class JavaObjectReferencesInAction {
public static void main(String[] args) {
List <String> listOfString = new ArrayList < > ();
listOfString.add("Mahesh");
System.out.println("Before modified :: " + listOfString);
modified(listOfString);
System.out.println("After modified :: " + listOfString);
}
public static void modified(List < String > listOfString) {
// modifying the string
listOfString.add("Imran");
}
}
输出:
Before modified :: [Mahesh]
exiting listOfString :: [Mahesh]
modified listOfString :: [Mahesh, Imran]
After modified :: [Mahesh, Imran]Process finished with exit code 0
让我们看看它是如何工作的。
在上面的示例中,我们创建了一个ArrayList
对象,并在其中添加了一个字符串值Mahesh
。现在列表中的数据是一个字符串,值为Mahesh
。
在下一行中,我们调用了modified
方法,该方法获取一个列表,并向同一给定列表中添加一个字符串Imran
但是当我们调用这个修改过的方法时,Java对象引用代替了值。它传递list的引用,list只是list的实际对象
这也会导致修改原始列表。
七、结论
我们详细讨论了一个棘手的面试问题,即Java中的按值调用和按引用调用。对于初学者来说,这可能需要消化很多东西,但相信我,一旦你开始玩它,它就会在你的脑海中清晰地浮现出来。
来源:https://javakk.com/2626.html


猜你喜欢
- 1.Android 加载https请求的网页的时候 打不开当load有ssl层的https页面时,如果这个网站的安全证书在Android无法
- 1、 初始化地图,在绘制时可先将地图进行初始化,用数组来存储关卡的位置,然后利用循环给地图中 关卡所在处赋予代表关卡的值。关键代码如下///
- storm操作zookeeper的主要函数都定义在命名空间backtype.storm.cluster中(即cluster.clj文件中)。
- 本文实例讲述了Android编程四大组件之BroadcastReceiver(广播接收者)用法。分享给大家供大家参考,具体如下:这里介绍如何
- 一、前言 本学期学习了JAVA语言,在学期的结束,写一个有操作界面,与数据库关联的管理系统,用来巩固自己本学习所学的知识。 用到的知识:JA
- 接下来想做一个图廊,所以并没有必要用立方体,只需做一些“墙壁”就行了。而在一个平面上建起另一个矩形的
- 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。使用场景:当创建复杂对象的算法应该独
- 现在基于信息安全问题,特别是版本是23以上权限越严格。特别是拍照,读,写权限一般权限允许过,下次就不用询问了的,所以很多应用都喜欢在首页或者
- 自定义控件是根据自己的需要自己来编写控件。安卓自带的控件有时候无法满足你的需求,这种时候,我们只能去自己去实现适合项目的控件。同时,安卓也允
- 本文实例为大家分享了Flutter自定义底部导航栏的具体代码,供大家参考,具体内容如下文件结构:main.dartimport 'p
- 前言最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯
- (一).前言: 这两天QQ进行了重大更新(6.X)尤其在UI风格上面由之前的蓝色换成了白色居多了,侧滑效果也发生了一些变化,那我们今天来模仿
- 一、简介在现阶段的Android开发中,注解越来越流行起来,比如ButterKnife,Retrofit,Dragger,EventBus等
- 我们在使用SpringBoot进行测试的时候一般是需要加两个注解:@SpringBootTest目的是加载ApplicationContex
- 那些GC的默认值其实GC或者说JVM的参数非常非常的多,有控制内存使用的:有控制JIT的:有控制分代比例的,也有控制GC并发的:当然,大部分
- 1.下载安装OpenCVhttps://opencv.org/releases/选择合适的平台安装包下载,然后双击安装,也就是解压的过程。这
- 如今,互联网项目对于安全的要求越来越严格,这就是对后端开发提出了更多的要求,目前比较成熟的几种大家比较熟悉的模式,像RBAC 基于角色权限的
- 本文实例为大家分享了Android实现欢迎滑动页面的具体代码,供大家参考,具体内容如下一、效果图二、源码1.activity_welcome
- 1. Limit实现分页1.1 为什么需要分页 减少数据的处理量1.2 使用Limit实现分页select * from user limi
- 一、对象与内存控制的知识点1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量)。2.继承关系中,当使用的对象引用变量编译