黑马程序员技术交流社区

标题: 形参与实参 [打印本页]

作者: 罗雪梅    时间: 2012-9-28 22:55
标题: 形参与实参
老师讲说java参数传递的只有值传递没有引用传递,但是当一个数组数据做为参数传递的是时候不就是引用传递吗,而且引用传递形参的改变直接影响实参的改变。
class Poke
{
    public static void main(String[] args)
    {
        int n=0;
        int[] arr={5,7,4,19};
      //调用方法   
      Show(n);
   //n是基础类型所以输出n=0形参不改变实参
       System.out.println(n);
       Show(arr);
    //arr是引用类型,就做为了参数传递了并且改变了实参的值
      System.out.println(arr);
    }

   //数组做为参数的方法
    public static void (int n)
   {
       n+=5;
   }
   public static void (int[] arr)
   {
      for(int i=0;i<arr.length;i++)
     {
           arr+=1;
     }
   }
}

帮忙看一下我标红的注释理解的正确的吗?
还有老师说的那句





作者: 李建强    时间: 2012-9-28 23:09
一、简单类型是按值传递的(pass by value),
当以参数形式传递变量是,其实传递的是基本类型的副本,
因为改变的是副本,所以对这个参数怎么改变都不影响正本(原来的值)。

二、引用也是按值传递的(pass by value)

这个问题有对象是按值还是按引用两种说法,各有道理。
官方说法是按值。两种说法可以说都对,这个问题起源于C中的指针既能传值也能传指针。
一开始很多Java程序员都是C程序员转型的,
一看哎呦,传一个对象的引用过来就能改变对象的值,这不就是俺们C中的指针吗?
所以才有了传值还是传引用的讨论。

首先,引用是什么?
引用类似有C种的指针,但是我们却看不到它的值,
也可以说引用是一种数据类型,我们建立多个引用,
这些引用即使指向一个对象,也是不相同的,
同一个对象可以有多个不同的引用。
因为它们都有自己的内存地址。可以理解为保存地址的类型。
而且这个引用(类型)的值(也就是地址)还可以改变,就像是一个变量。
这个引用归根结底还是一个值。
引用如果传递的话是传递的是这个引用的一个副本。

如果你学过C,还是按传引用好理解。
而且这两种说法都可以说对。


Java中改变参数的值有两种方法:
一、通过“=”号赋值,不会影响到源数据。
二、传递引用,正相反,会改变源数据。


作者: 李建强    时间: 2012-9-28 23:11
字写得有点多,
因为刚才回答问题总结了一部分,到你这又加了一部分,
都是自己的理解一个字一个字敲出来的。
以前学这块的时候参考了N多的资料。

PS,今天一下午没见到版主了。
作者: 罗雪梅    时间: 2012-9-29 21:08
谢谢谢谢,讲得很明白很透彻




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2