Java参数按值传递?按引用传递
JAVA 参数 引用 传递
2023-09-27 14:23:32 时间
有时候在想,java在调用方法时候究竟是按值传递还是按引用传递,之前有人说是基本数据类型按值传递,引用类型按引用传递。一时间,似乎都有道理。
笔者在此不追究字眼上的辨别识字能力,把自己对这个问题的理解阐述一下,笔者不想说这是按值传递还是按引用传递,自己理解就好了吧,毕竟java会用才是王道。
先看一下下面的代码:
public static void main(String[] args) { // TODO Auto-generated method stub testInt(); testStr(); testPack(); testObj(); testObj_2(); } //NO1.测试基本数据类型 public static void testInt(){ int num1 = 12; System.out.println("Before change::"+num1); changeInt(num1); System.out.println("After change::"+num1); } //测试字符串类型 public static void testStr(){ String str = "helloworld"; System.out.println("Before change::"+str); changeStr(str); System.out.println("After change::"+str); } //测试包装类型 public static void testPack(){ Integer integer = new Integer(42); System.out.println("Before change::"+integer); changePack(integer); System.out.println("After change::"+integer); } //测试引用类型 public static void testObj(){ Person person = new Person(); System.out.println("Before change::"+person.age); changeObj(person); System.out.println("After change::"+person.age); } //测试引用类型方式二 public static void testObj_2(){ Person person = new Person(); System.out.println("Before change::"+person.age); changeObj_2(person); System.out.println("After change::"+person.age); } public static void changeInt(int num){ num = 21; } public static void changeStr(String str){ str = "hellobeijing"; } public static void changePack(Integer integer){ integer = new Integer(89); } public static void changeObj(Person person){ person.age = 87; } public static void changeObj_2(Person person){ person = new Person(); person.age = 78; } //引用类型测试类 class Person{ public int age = 78;
Look NO1:
说明一下:笔者在上面画的两张图着实不咋样,只能做到这种程度了。我们分析一下:当数据为基本数据类型时,我们传给形参的仅仅是一个实参的副本(Copy),当然由于栈内存变量共享的特征,这两个变量共同指向此变量值。
当我们对形参进行改变时,首先,在栈内存中会寻找是否存在新的变量值,如果有,则指向新的变量值(体现栈内存数据共享的特点)。如果没有的话,在栈内存中回开辟一块空间,存储新的变量值,同时形参变量会指向新的变量值。
此时我们发现,这时的变量值已经与实参的变量没有关系,两个独立的变量。所以经过函数后改变的变量值与之前的没有关系,故输出的还是之前的变量值。
另外,我们看到,当传递对象的引用时,person引用变量中存储的是Person对象在堆内存中的内存地址,所以传递的是内存地址(笔者理解为是一串数字)。此时两个形参变量是有共同的内存地址值,所以指向同一个内存对象。我们观察
发现,当我们改变对象中的属性值时,有牵一发而动全身的感觉,只要你改变这个对象,这个对象就被改变,而不存在另外开辟一个对象的概念(String类型和包装类型除外)。
PS:还没有写完,正在上班时间,晚上再写吧!
如有错误,请大家帮忙纠正一下。
来源:51CTO
java是值传递还是引用传递 所谓值传递就是一个参数被传进方法中修改,却不影响原始值,为什么原始值不受影响呢?因为jvm是将原始值复制了一份传递出去的,所以叫值传递(这句话很重要,这决定了对象数据类型到底是值传递正确,还是引用传递正确)。
Java 参数传递到底是按 值传递 还是 引用传递 首先明确,Java 中方法参数传递方式是按值传递。对于基本类型(int a, long b),参数传递时传递的是值,例如 int a = 5,传递的就是 5。如果是引用类型,传递是指向具体对象内存地址的地址值
Java 参数传递到底是按 值传递 还是 引用传递 ? 首先明确,**Java中方法参数传递方式是按值传递**。对于基本类型(int a, long b),参数传递时传递的是值,例如int a = 5,传递的就是5。如果是引用类型,传递是指向具体对象内存地址的地址值...
记录一个Java引用传递的问题 前两个月一直写PHP去了,感觉好久没有写Java代码,因为最近要重构公司的Java项目,又把Java捡起来。在写代码过程中,有一个点之前其实没太注意,差点踩一脚,就通过这篇文章简单记录一下。
相关文章
- java 程序员 和 三八女神节有什么神秘的关系,你晓得吗? 用Java 给女神绘制一张贺卡你会吗?
- JRuby中调用java带可变参数的方法
- [转]java利用AES实现URL的参数加密
- [转]java.lang.OutOfMemoryError: PermGen space及其解决方法
- Java不定参数
- java移位运算符对右侧参数进行模运算
- 第44节:Java当中的JVM
- Java虚拟机垃圾回收(三) 7种垃圾收集器:主要特点 应用场景 设置参数 基本运行原理
- java stream map 作为参数
- 如何实现具有多个参数的Java 8的Function?
- java 方法作为参数封装在map
- Java扩展方法之SPI
- Java底层四个核心技术
- java 使用反射调用可变参数方法
- java可变参数
- There is no getter for property named 'id' in class 'java.lang.String'
- java多种请求参数的设置
- Java_jdbc 基础笔记之七 数据库连接(方法升级)
- JAVA方法中的参数用final来修饰的原因
- Java面向对象(五)学习笔记 JDBC下
- java(17) - 增强for循环、装箱拆箱、可变参数
- java实现request请求参数转map工具类
- Java数据结构与算法 day05 排序算法
- Java开源十年之后仍然引起争议
- ajax 调用 java webapi 多个参数(一)
- Java小白入门200例04之查找字符的ASCII值
- Java小白入门200例77之Java方法的可变参数
- java实现图片压缩与拼接
- java版本的Kafka消息写入与读取
- Java 可变长参数