你真的了解形参、实参、引用类型、值类型吗?

简介: 也许你可能知道引用传递、值传递以及标题所示的概念。但你是否真正了解它们为什么会这样?引用类型和值类型究竟是什么?引用传递与值传递的区别?以及方法形参和实参的区别?通过本篇文章将帮助大家进阶对于以上内容的了解。

值类型

8大数据类型
byte、boolean、char、short、int、float、long、double
只有以上所述类型才属于值类型
值类型变量存储的是内存地址中值的拷贝

值之间的传递

他们之间在传递时,会直接传入值的拷贝
如果为其中一个变量重新赋值,并不会影响另一个变量的值。
例:

int c = 5;
int d = c;
c = 6;
//此时的d 还是5

问题:为什么不会影响?
因为 c存的是内存地址值的拷贝 ,重新赋值时会去内存地址(栈)中寻找值并复制。找不到则从内存地址创建值并复制给变量!

引用类型

除了8大数据类型以外的其他类型都是引用类型
引用类型存储的是指向对象的内存地址

引用之间的传递

引用类型传递的是对象的内存地址,并不是对象的拷贝,所以修改同一内存地址的对象内容会直接影响其他引用该对象的变量
例1:

        StringBuilder a = new StringBuilder();
        StringBuilder b = a;
        a.append("1234");
        System.out.println(b);
        //1234

引用类型仅仅只是指向内存地址,当重新赋其他对象时,只会使其指向的内存地址的指针发生改变,并不会影响到原来内存地址的对象。
例2:

 String a = "sdaf";
String b = a;
a = "1234";
System.out.println(b);
//sdaf

a的赋值并没有影响到b。因为a=“1234”的操作是重新创建对象的操作。仅仅只是它的引用地址发生了改变。所以b所引用的对象并没有发生任何改变自然也就等于原值了。

通过以上简述,可以看出来,不管是值传递,还是引用传递。传递的其实都是变量所储存的内容!他们实际上并没有什么本质上的区别

实参和形参

  • 实参(argument)就是主调方法传入的参数。
  • 形参(parameter)就是被调方法定义时声明的参数,作用域仅方法本身。

传入实参必须于形参类型一致!

这两个参数不是同一个参数

"当调用方法时,主调方法传入实参,被调方法会立即给形参分配内存空间并将实参赋值给形参,然后执行方法相关逻辑,并在方法结束后释放形参内存资源"。

以上这段话也很好的解释了为什么值类型在传递至被调方法中,修改值并不会对原变量产生影响。正如我们上面所说的一样,他们之间在传递时,会直接复制值进行传递。

同时也解释了为什么传入引用类型时修改对象内数据会对原变量产生影响。因为传递的是内存地址

再说一点与本章内容无关的知识:值类型的值储存的地方取决于 值类型变量声明的地方。如果为类变量,那么值存在堆中。类初始化时创建。如果为成员变量,那么值存在堆中,随对象的创建而创建,为对象私有。如果为局部变量,则随方法的入栈创建在栈中,局部变量可以共享栈中的数据,随方法的出栈而销毁。

总结

  • 1.值传递和引用传递 其实传递的都是其变量所存储的内容。他们本质没有什么区别
  • 2.对象中有可以供你直接操作的方法或字段。操作对象的内容会直接修改所引用内存空间的对象内容。所以其他引用此对象的变量自然都会改变
  • 3.值类型并没有可以让你操作的内部元素。你只能通过重新赋值的方式改变变量所存储的值。改变的也只能是重新赋值的变量。
  • 4.值类型存储的是内存地址的值的拷贝引用类型存储的是引用对象的内存地址。两者重新赋值都不会对其原有的值造成影响
  • 5.方法会将传入的实参赋值给形参。形参作用于方法内。随方法的结束而销毁。

参考

Java虚拟机—栈帧、操作数栈和局部变量表
基本数据类型的值存放在哪里
文章包含作者个人见解,如果错误 敬请指正。


将喜欢的一切留在身边,这便是努力的意义。

菅江晖

目录
相关文章
|
网络协议 Ubuntu
如何修改wsl的Ubuntu的dns,固定dns
本文介绍了如何在 WSL 中配置网络设置。首先,修改 `/etc/wsl.conf` 文件,添加 `generateResolvConf = false`。其次,编辑 `/etc/resolv.conf` 文件,指定 DNS 服务器地址。最后,重启 WSL 即可生效。
1870 2
|
人工智能 机器人 测试技术
使用LM Studio在本地运行LLM完整教程
GPT-4被普遍认为是最好的生成式AI聊天机器人,但开源模型一直在变得越来越好,并且通过微调在某些特定领域是可以超过GPT4的。
6729 1
|
Kubernetes Cloud Native 容器
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
3426 1
|
消息中间件 Web App开发 API
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
|
传感器 网络协议 物联网
手把手教你在 Windows 环境中搭建 MQTT 服务器
手把手教你在 Windows 环境中搭建 MQTT 服务器
2290 0
|
供应链 搜索推荐 算法
淘宝电商运营的小秘籍,看完血赚。
在淘宝电商竞争激烈的环境中,掌握实用运营技巧是成功的关键。本文深入剖析了淘宝电商运营的五大核心策略:精准市场定位与选品、引人入胜的店铺装修、优质客户服务、灵活营销推广及数据驱动决策。通过这些技巧,你可以在淘宝平台上打造独具魅力的店铺,吸引更多流量和客户,实现销售业绩稳步增长,最终脱颖而出,成为知名品牌。
1421 10
|
人工智能 自然语言处理 搜索推荐
大模型时代,如何让AI客服“听懂人话”、“更有温度”?
大模型时代,如何让AI客服“听懂人话”、“更有温度”?
959 1
|
存储 测试技术 数据安全/隐私保护
自动化测试小技巧之Airtest-Selenium和Excel的无缝协作
【8月更文挑战第26天】在自动化测试中,Airtest-Selenium 与 Excel 的无缝协作能显著提升测试效率与可维护性。通过将 Excel 作为数据源,可轻松存储和读取测试用例数据;测试结果可自动记录在 Excel 中,便于跟踪与分析;利用 Excel 管理测试用例,简化了用例的增删改查;此外,还能自动截图并记录日志,方便问题定位。这种方式不仅提高了自动化测试的灵活性,还使得测试过程更加透明与高效。
379 1
|
传感器 中间件 Windows
04 Windows下mosquitto安装
04 Windows下mosquitto安装
708 0