成都室内设计公司排名,宁波抖音seo搜索优化软件,挖金矿游戏网站建设,一个网站的首页设计ps作者 | 王磊来源 | Java中文社群#xff08;ID#xff1a;javacn666#xff09;转载请联系授权#xff08;微信ID#xff1a;GG_Stone#xff09;开篇先来曝答案#xff0c;在 Java 语言中#xff0c;本质只有值传递#xff0c;而无引用传递#xff0c;解释和证明详见… 作者 | 王磊来源 | Java中文社群IDjavacn666转载请联系授权微信IDGG_Stone开篇先来曝答案在 Java 语言中本质只有值传递而无引用传递解释和证明详见正文。说到值传递和引用传递我们不得不提到两个概念值类型和引用类型。1.值类型通俗意义上来说所谓的值类型指的就是 Java 中的 8 大基础数据类型整数型byte、int、short、long浮点型float、double字符类型char布尔类型boolean从 JVM 层面来讲所谓的值类型指的是在赋值时直接在栈中Java 虚拟机栈生成值的类型如下图所示2.引用类型引用类型是指除值类型之外的数据类型比如类接口数组字符串包装类Integer、Double...从 JVM 的层面来讲所谓的引用类型是指在初始化时将引用生成栈上而值生成在堆上的这些数据类型如下图所示PS关于包装类为什么是引用类型我们后面的文章会单独讲记得关注Java中文社群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 语言中只有值传递方法传参时只会传递副本信息而非原内容。我们还知道了基础数据类型会直接生成到栈上而对象或数组则会在栈和堆上都生成信息并将栈上生成的引用直接指向堆中生成的数据如下图所示往期推荐阿里为什么推荐使用LongAdder而不是volatileJava 中 10 大坑爹功能面试系列第2篇回文字符串判断的3种方法List 集合去重的 3 种方法阿里的简历多久可以投递一次次数多了有没有影响可以同时进行吗