您现在的位置是:亿华云 > 热点
Java 是值传递还是引用传递?
亿华云2025-10-04 00:28:10【热点】0人已围观
简介作者 | 王磊来源 | Java中文社群ID:javacn666)转载请联系授权微信ID:GG_Stone)开篇先来曝答案,在 Java语言中,本质只有值传递,而无引用传递,解释和证明详见正文。说到值
作者 | 王磊
来源 | Java中文社群(ID:javacn666)
转载请联系授权(微信ID:GG_Stone)
开篇先来曝答案,值传在 Java 语言中,递还本质只有值传递,引用而无引用传递,传递解释和证明详见正文。值传
说到值传递和引用传递我们不得不提到两个概念:值类型和引用类型。递还
1、引用值类型
通俗意义上来说,传递所谓的值传值类型指的就是 Java 中的 8 大基础数据类型:
整数型:byte、int、递还short、引用long浮点型:float、传递double字符类型:char布尔类型:boolean从 JVM 层面来讲:所谓的值传值类型指的是在赋值时,直接在栈中(Java 虚拟机栈)生成值的递还类型,如下图所示:
2、引用引用类型
引用类型是指除值类型之外的数据类型,比如:
类接口数组字符串包装类(Integer、Double...)从 JVM 的层面来讲,所谓的引用类型是指,在初始化时将引用生成栈上,而值生成在堆上的云南idc服务商这些数据类型,如下图所示:
3、值传递
值传递(Pass By Value)指的是方法传参时,传递的是原内容的副本,因此对副本进行如何修改都不会影响原内容。
实现代码如下:
public class PassTest {
public static void main(String[] args) {
int age = 18;
System.out.println("调用方法前:" + age);
intTest(age);
System.out.println("调用方法后:" + age);
}
private static void intTest(int age) {
age = 30;
System.out.println("方法中修改为:" + age);
}
}程序的执行结果为:
调用方法前:18
方法中修改为:30
调用方法后:18
从上述结果可以看出,在方法中修改参数并未影响原内容,我们把这种传参方式称之为值传递。
4、引用传递
引用传递(Pass By Reference)指的是方法传参时,传递的是参数本身,因此对参数进行任意修改都会影响原内容。
模拟“引用传递”的实现代码如下:
public class PassTest {
public static void main(String[] args) {
char[] name = { 磊, 哥};
System.out.println("调用方法前:" + new String(name));
paramTest(name);
System.out.println("调用方法后:" + new String(name));
}
private static void paramTest(char[] n) {
n[1] = 神;
System.out.println("方法中修改为:" + new String(n));
}
}程序的执行结果为:
调用方法前:磊哥
方法中修改为:磊神
调用方法后:磊神
从上述的结果可以看出在 paramTest 方法中修改了参数之后,在 main 方法中再打印参数时,发现参数的值也跟着发生了改变,那么似乎我们可以得出结论,Java 中貌似也有“引用传递”,然而实事并如此,我们接着看。高防服务器
5、真假“引用传递”
我们给上面的代码添加一行,如下所示:
public class PassByValue {
public static void main(String[] args) {
char[] name = { 磊, 哥};
System.out.println("调用方法前:" + new String(name));
paramTest(name);
System.out.println("调用方法后:" + new String(name));
}
private static void paramTest(char[] n) {
n = new char[2]; // 添加此行代码
n[1] = 神;
System.out.println("方法中修改为:" + new String(n));
}
}程序的执行结果为:
调用方法前:磊哥
方法中修改为:神
调用方法后:磊哥
从上述结果可以看出,当我们在 paramTest 方法中添加 new char[] 之后,“引用传递”就突然变值传递了?为什么?
这是因为,在 Java 语言中本质上只有值传递,也就说 Java 的传参只会传递它的副本,并不会传递参数本身。
前面那个带引号的“引用传递”其实只是传递了它的引用副本,如下图所示:
PS:《Java虚拟机规范》中对 Java 堆的描述是:“所有的对象实例以及数组都应当在堆上分配”。
所以我们在调用 new char[] 之后,可以看出 n 对象有了新地址,而原内容并未被修改,如果按照引用传递的思路来看的话,不管执行任何方式的修改都会改变原内容,因此我们可以更加确认 Java 语言中只有值传递,如下图所示:
总结
通过本文的内容,我们可以得出:在 Java 语言中只有值传递,服务器租用方法传参时只会传递副本信息而非原内容。我们还知道了基础数据类型会直接生成到栈上,而对象或数组则会在栈和堆上都生成信息,并将栈上生成的引用,直接指向堆中生成的数据,如下图所示:
很赞哦!(446)
相关文章
- 为什么大家都选优质域名?到底存在着什么好处?
- 为什么现在中文域名觉得好?使用中文域名有什么好处?
- 只要我们做的是从目前的市场情况选择域名,从简单易记,从个性特征上,我们就可以找到一个好域名进行注册。域名注册进行域名记录和解析以及绑定网站后,客户可以通过URL登录您的网站。
- 这个不用多说,不同平台的注册价格不同,且不同平台对域名释放交易的把控与曝光不同,当然价格相对便宜且平台渠道广操作便利的平台最好。
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
- 2、根据用户基础选择访问提供程序。由于互联问题的存在,接入商的选择也非常重要,如果用户群主要在联通,尽量选择联通接入较好的接入商,如果用户群主要在电信,那么选择电信接入较好的接入商。如果用户组位于国家/地区,则选择更好的访问提供程序进行交互。
- 小白注册网站域名该怎么办?有什么步骤?
- 以上的就是为大家介绍的关于域名的详解
- 这个不用多说,不同平台的注册价格不同,且不同平台对域名释放交易的把控与曝光不同,当然价格相对便宜且平台渠道广操作便利的平台最好。
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
站长推荐
4、域名传输时,取决于域名原始用户的邮箱是否有效,以及他是否将密码发送到此邮箱。
注册域名要了解几大点?新手有什么方式注册域名?
公司名字不但要与其经营理念、活动识别相统一,还要能反映公司理念,服务宗旨、商品形象,从而才能使人看到或听到公司的名称就能产生愉快的联想,对商店产生好感。这样有助于公司树立良好的形象。
3、商标域名一经注册,就可以作为域名裁决过程中的主要信息之一。这可以大大增加公司被抢注的相关域名胜诉的机会。
主流搜索引擎显示的相关搜索项越多,越能积极反映该域名的市场价值。同时,被评估域名的搜索引擎显示结果不佳可能是由于以下两个原因:
什么是im域名?新手需要了解im域名哪些?
四、一定要仔细阅读细节
尽量不要在域名中出现特殊字符,这样的域名很容易导致访问者输入错误,同时给人留下不专业的印象,降低网站的可信度,并流失大量潜在客户。