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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李宁 中级黑马   /  2013-1-16 22:57  /  2208 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 shaohuashang 于 2013-1-17 01:22 编辑

class Test
{
public static void main(String[] args)
{
int i = 0;
test(i);这句代码执行完i值不应该是变成1了吗?
System.out.println(i);为什么打印i=0
}
public static void test(int i)
{
i++;
}
}


public class Test
{
public static void main(String[] args)
{
int[] a=new int[1];
test(a);
System.out.println(a[0]);这里打印的是1,和上面的区别在哪里?
}
public static void test(int[] a)
{
a[0]++;
}
}

5 个回复

倒序浏览
首先,java方法的形参只有值传递,而传递基本类型为基本类型的数值,传递引用类型为引用类型的地址值副本。所以传递基本类型时,只是栈中多创建了一个变量,所以方法内不会改变方法外的原始变量的值,而引用传递,传递的是地址值的副本,既栈中又有一个地址指向堆中的数组对象,由于原始变量也指向堆中这个数组,所以自然就是会跟着方法内所变化
回复 使用道具 举报
public static void test(int i)
{
i++;
}这里的i是局部变量,和上面的成员变量i不是同一个。i++之后,又没有返回,打印的是上面的成员变量i的值,内存地址不一样。

回复 使用道具 举报
本帖最后由 黄金龙 于 2013-1-16 23:22 编辑
  1. class Demo12
  2. {
  3. public static void main(String[] args)
  4. {
  5. int i = 0;
  6. test(i);//这句代码执行完i值不应该是变成1了吗?这里是变成了1不过在下面的方法不在这里..
  7. System.out.println(i);//为什么打印i=0   这里的话就直接是上面的i的值0 没用参与下面的运算
  8. }
  9. public static void test(int i)
  10. {
  11. i++;
  12. System.out.println(i);//这里才是test(i)的值是1
  13. }
  14. }

  15. 而下面是直接调用的是a[0]的值是1


复制代码
回复 使用道具 举报

  1. class Test
  2. {
  3. public static void main(String[] args)
  4. {
  5. int i = 0;
  6. test(i);            //  这里调用test(),在此函数体里i++,属于后置自增  若改成 k=i++ 这里 k=0 ,i 永远为 1
  7. System.out.println(i);  // 调用test() 完后,里面参数 i 在栈区释放了,所以这里仍然是 i 的初始值 0
  8. }
  9. public static void test(int i)
  10. {
  11. i++;
  12. }
  13. }


  14. public class Test
  15. {
  16. public static void main(String[] args)
  17. {
  18. int[] a=new int[1];
  19. test(a);
  20. System.out.println(a[0]);    //这里是数组,实际上是把数组a的首地址传递给test()函数,而第一个元素a[0]默认值是0,调用test()后返回值为1,所以数组第一个元素        
  21. }                                        //就是首地址的元素值,a[0]=1
复制代码
回复 使用道具 举报
你第二个new了一个对象,传递的就是这个地址的引用了。。改变的是引用里面的值
。。传递的值保存在地址里。

第一个是传进去的I是局部变量  当方法执行完以后 就被释放  原来的I是不变的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马