Java的值传递和引用传递

打印 上一主题 下一主题

主题 947|帖子 947|积分 2841

值传递不会改变本身,引用传递(如果传递的值需要实例化到堆里)如果发生修改了会改变本身。

1.基本数据类型都是值传递
  1. package com.example.basic;
  2. public class Test {
  3.     public static void main(String[] args) {
  4.         int a=10;
  5.         modify(a);
  6.         System.out.printf("\n方法main中的a等于%d",a);输出:方法main中的a等于10
  7.     }
  8.     public static void modify(int a){
  9.         a=20;
  10.         System.out.printf("方法modify中的a等于%d",a);输出:方法modify中的a等于20
  11.     }
  12. }
复制代码
 栈里保存的是变量和方法,堆里保存的是具体实例化的对象

原理:

两个a都保存在栈中,没有交集,互不影响,所以不会发生改变

 
 
2.如果传递的是一个需要实例化的对象,就是引用传递
  1. package com.example.basic;
  2. public class Test {
  3.     public static void main(String[] args) {
  4.         int[] a={1,2,3};
  5.         modify(a);
  6.         System.out.println("方法main中的a[1]:"+a[1]);输出:方法main中的a[1]:88
  7.     }
  8.     public static void modify(int[] a){
  9.         a[1]=88;
  10.         System.out.println("方法modify中的a[1]:"+a[1]);输出:方法modify中的a[1]:88
  11.     }
  12. }
复制代码
原理

数组在栈里申明了,但具体数据是保存在堆中,栈中保存的是具体数据的内存引用地址,a和a[1]是同一个内存地址,所以了修改a[1]了,会改动到a。

面试时怎么回答:
值传递不会改变本身,基本数据类型都是值传递(String也这样,括号里不用说)。当发生引用传递,并且传递的值会实例化到JVM的堆中,如果在传递的过程中,改动到了传递的值,由于传递的值和本身,指向同一个内存地址,所以它本身会被修改到。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表