貌似关于Java中方法调用时参数的传递是值传递还是引用传递的讨论从来就没有停止过,
大致有两种流派:
1,基本类型是按值传递,引用类型为引用传递。
2,Java中只有值传递。

        两方都引用了很多论据证明自己的说法是正确,但是到现在也没有一个公认的结论...

对于这个问题我是这么理解的:两种说法都对,只不过是叫法和看问题的角度不同。


        我个人认为当实参为引用类型的时候,当发生方法调用,实参传递给形参的,是实参中存储的内存地址的一个拷贝,这个拷贝出来的副本的"值"和原实参中存储的内存地址的"值"相同,故这两个栈内存地址对应的堆内存是相同的,所以在被调用的方法中对形参所作的一切操作都会对实参生效,而当实参为基本类型的时候,实参传递给形参的仍然是实参"值"的一个简单拷贝,此时实参和形参占用的是两个不同的内存地址,所以在被调用的方法中对形参的操作不会对实参有影响,当方法调用结束返回后,形参所对应的内存空间就会被释放。

        感觉之所以会有这两种不用处理方式,是因为设计Java语言的时候考虑到了时间和空间的问题:创建一个引用类型的对象所花费的空间和时间远远大于一个基本类型,假如执行int i = 0;这条语句需要1S的话(实际上要比这快的多),那么执行Person p = new Person();这条语句可能要花费1000S,而且对象占用的空间远大于基本类型;当实参为引用类型时,将全部的值(包括Person的姓名,年龄,性别...)拷贝给形参完全可以,但这样做内存中将会有两个完全相同的对象(起始内存地址不同),既浪费时间又浪费空间,如果只将实参中存储的地址拷贝出一份,传递给形参,就可以在被调用的方法中对这个地址指向的内容进行操作,会大大提高效率。

        另外,很多人都说Java中没有指针,我觉得对于
   

//Animal为Interface,Dog和Cat为实现Animal的类
       Animal animal = new Dog(); 
       animal = new Cat();


这样的代码来说,把animal理解成指针就会解决很多的问题。


在网上看到了这么一段话,拿来用用:
pass by reference这个术语的语义有精确的定义:方法/函数操作实际参数本身。
我不知道pass by reference这个词对Java是否适用,假如适用的话,按照我上面的观点,方法/函数操作的并不是实际参数本身,而是实际参数的一个拷贝值,无论是基本类型还是引用类型:基本类型拷贝的是实际值,引用类型拷贝的是地址值,算不算咬文嚼字?


还有:
In programming language design, the term pass by reference properly means that when an argument is passed to a function, the invoked function gets a reference to the original value, not a copy of its value.
这段话很神啊,回味灰常无穷,Java中的基本类型传参是不是属于"copy of its value"这种情况?将"original value"中存储的内存地址copy出一个副本传递给"the invoked function"算不算"gets a reference to the original value"? 英文和汉语总是有隔阂,我的英文很烂啊,不懂啊,就像有的地方包子非要叫成馒头,我也木有办法啊。

        好了,不说了,上面的观点就算我意淫好了,有的时候,知道程序的结果为什么是这样或者那样对我来说就足够了。其实我认为,很多的事情不需要研究的太深,会用就行了,如果真闲的蛋疼可以死扣一下JDK API,里面提到的各种数学公式是那么有趣...反正我是研究不明白了,再研究这辈子我也不可能去SUN开发JDK了。