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

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

值类型

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


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

菅江晖

目录
相关文章
|
2月前
|
存储 Java C#
C# 中的值类型与引用类型
在 C# 编程中,值类型和引用类型的区别至关重要,直接影响内存管理、性能优化及编程模式选择。值类型直接存储数据(如 `int`、`float`),而引用类型存储数据的引用地址(如 `class`、`string`)。值类型的赋值涉及数据复制,适合小数据量;引用类型仅复制引用,适合大数据量处理但需关注垃圾回收。本文通过具体代码示例详细解析二者的定义、存储方式及性能影响,并提供实战案例分析及易错点避免方法,帮助读者更好地理解和应用。
61 2
|
存储 C# C++
值类型和引用类型
值类型和引用类型
|
Go
值类型与引用类型,值传递与引用传递
值类型与引用类型,值传递与引用传递
41 0
|
C++
C/C++形参和实参的区别?
C/C++形参和实参的区别?
298 0
C/C++形参和实参的区别?
再聊一次值类型和引用类型
这是一个托管的值类型,表示array的一个片断, 在用做websocket接收数据的载体时我发现每次值传递后, 这个ArraySegment<byte>貌似发生了变化。这勾起了我的探究欲。
再聊一次值类型和引用类型
|
存储 开发框架 .NET
C#系列之值类型和引用类型
C#系列之值类型和引用类型
166 0
C#系列之值类型和引用类型
|
存储 数据格式 JSON
第183天:引用类型和值类型
一、内存分配 1、数值型内存分配 1 2 var num1; //这个时候不进行内存分配 3 var num3=9;//分配内存 4 var num4=num3;//会不会分配 5 6 // 这里到底分配还是不分配内存?? 7 // 答案 --分配内存 彼此拥有独立的内存空间,互不影响 8 console.
1009 0
方法的形式参数为引用数据类型时
方法的形式参数为引用数据类型:   基本数据类型(太简单,不是我今天要讲解的)   引用数据类型     1.方法的形式参数为类名时:需要该类的对象。(匿名对象的时候已经讲过了)     2.方法的形式参数为抽象类名时:需要该抽象类的子类对象。
999 0
【基础中的基础】引用类型和值类型,以及引用传递和值传递
一直在博客园怼人,非常惭愧。所以郑重决定: 好好写一篇干货,然后再接着怼人。 这是一起帮上陈百万同学的求助,讲了一会之后,我觉得很有些普世价值,干脆就发到园子来。面向小白,高手轻拍。   我们从最简单的说起(基础知识,懂的同学直接往下拉),直接上代码: static int amo...
1542 0