天津建设协会网站,雄安网站建设公司,网站的ftp别的公司会给么,建筑工程网上培训平台看了半天帖子#xff0c;讲得乱七八糟#xff0c;坑死了 [1] 先说结论 基本类型、包装类型、String类型作为参数传递之后#xff0c;在方法里面修改他们的值#xff0c;原值不会改变#xff01;引用类型不一定#xff0c;要看是怎么修改它的。 [2] 为什么基本类型、包装类… 看了半天帖子讲得乱七八糟坑死了 [1] 先说结论 基本类型、包装类型、String类型作为参数传递之后在方法里面修改他们的值原值不会改变引用类型不一定要看是怎么修改它的。 [2] 为什么基本类型、包装类型、String类型传参之后原值不会变
[2.1] 基本类型 通常情况下Java 基本数据类型变量在 JVM 中的存储方式是将其存储在栈Stack中。 栈用于存储方法执行时的局部变量、操作数栈和方法返回值等。 当程序运行到一个方法时JVM 会为该方法创建一个栈帧Stack Frame并将该栈帧压入栈顶。栈帧中会包含该方法的局部变量表Local Variable Table、操作数栈Operand Stack等信息。 在局部变量表中JVM 会为每个基本数据类型变量分配一定的存储空间并将其存储在栈帧中。例如一个 int 类型的变量需要 4 个字节的存储空间JVM 会在局部变量表中分配 4 个字节的空间并将其用于存储该变量的值。类似地其他基本数据类型变量在局部变量表中也会分配相应大小的存储空间。 当基本类型变量作为形参传递给方法时发生了以下步骤 1、在调用方法时将实参的值复制一份传递给形参。这意味着在方法中对形参的任何修改都不会影响到实参本身。 2、在方法内部使用形参来进行计算或操作。 3、当方法执行完毕并返回时会将方法返回值压入栈中同时将栈帧出栈方法的局部变量表也随之销毁。因此形参也随之销毁其存储的值也就被销毁了。 [2.2] 包装类型、String类型 首先要明确包装类型、String类型都是引用类型。 Java 中的引用类型变量在 JVM 中的存储方式与基本数据类型变量有所不同。引用类型变量存储的是一个指向对象在堆中存储空间的地址而不是对象本身。因此引用类型变量的大小是固定的不受引用对象大小的影响。 具体来说引用类型变量在栈中分配一个固定大小的存储空间用于存储指向堆中对象的地址。当创建一个对象时JVM 会在堆中分配一段连续的存储空间用于存储对象的实例变量、类信息等。对象在堆中的存储位置由 JVM 管理并由引用类型变量记录。 当引用类型变量被赋值为 null 时表示该变量不再指向任何对象。如果该引用类型变量没有被使用那么在垃圾回收器执行垃圾回收时该对象会被回收其在堆中占用的存储空间会被释放。 由于String类和包装类都被设定成不可变的没有提供value对应的setter方法而且很多都是final的我们无法改变其内容所以其值不变导致我们看起来好像是值传递即没有影响原来的值。 [3] 为什么引用类型传参之后原值可能会变 引用传递的是一个引用、这个引用存放的是参数的地址的值如果在函数中没有改变这个参数的引用地址没有new一个新的地址—这也叫做浅拷贝那么就会改变原来的值影响到传入的参数。比如数组、集合就是很明显的例子如果在函数中改变了参数的引用地址,也就是new了一个那就不会改变参数的值了这也叫做深拷贝。 例如
Test
public void main() {User u1 new User();User u2 new User();changeValue(u1, u2);System.out.println(u1\nu2);}public void changeValue(User u1,User u2) {u1.setUid((long) 1111);u2 new User();u2.setUid((long) 1111);}
//User(uid1111, unamenull, uimgnull, utelnull, upwdnull, idennull, umetonull, loginIpnull, loginDatenull)
//User(uidnull, unamenull, uimgnull, utelnull, upwdnull, idennull, umetonull, loginIpnull, loginDatenull)