A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾勇 中级黑马   /  2014-12-25 14:39  /  901 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo
{
        public static void main(String args[])
        {
                 int a = 30;
                 int[] myarr ={10,20};
               change(a);
              System.out.println(“a=”+a);

             change(myarr);
             System.out.println("myarr[0]="+myarr[0]);
        }
        public static void change(int a)
        {
             a=20;
         }
      public static void change(int[] arr)
        {
                     arr[0] =90;
       }
}
打印结果是 a=30 ; myarr[0]=90
分析:
基本数据类型是在 栈内存中的,引用数据类型是在堆内存中,比如数组,对象等;       当我们 int a=30的时候,a=30 是保存在栈内存中的,而 int [] myarr= {10,20}的时候,
在堆内存中产生一个数组,并分配一个地址,而且把该地址赋值给栈内存中的变量 myarr ,
使得该变量指向了 堆内存中的数组。
       当执行到函数change(a)时,会开辟一个新栈,该栈中 a 被赋值为20 ,该函数执行结束后,
返回主栈,由于主栈中 a还是30 ,所以在打印的时候,会打印出 : a = 30
      当执行到函数chang(myarr)的时候,同样会开辟一个新的栈,并将myarr的值传入,而此时myarr的值
是堆内存中数组的地址,所以此时函数中 arr指向了堆内存中的数组,当我们对arr操作时,实际上是在对堆
内存中的数组进行操作,所以堆内存中数组第0位上的数被改变为90。 函数执行完毕,返回主栈中,执行到打印arr[0]的时候,
就会打印出 arr[0]=90;


1 个回复

倒序浏览
学习了,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马