请问大神,关于参数传递的问题

参数传递分两种,按值传递和按址传递,为啥会出现两种不同的参数传递?其中其中参数怎么变化的?

java中的确都是按值传递,可以通过下面的图理解,A是实参,B是函数参数,
当参数类型是int这样的基本数据类型的时候,比如实参是int A=1,那么函数参数B的值也是1,但是他们在栈里边的地址是不一样的,这也就是
为什么在函数体内对B进行一系列操作,对A的值没有影响的原因。当实参是引用的时候,同样也是传值,传的是引用值。也就是说A的值指向对象(这里说指向不是很合适,毕竟不是指针),
那么B的值是等于A的引用值,同样B指向了与A指向的同一个对象,同理A与B在栈中的地址是不一样的,但是他们的值是相同的,当B对堆中的对象
进行操作后,堆对象的属性就会改变,当A读取堆对象的时候,自然发现属性已经改变了。

其实要注意的一点就是,对基本数据类型的操作是在栈内的,而对于对象是在堆内操作。(图画得不是很好,还请见谅)

图片说明

Java中都是按值传递,只不过对于基本类型是值。而对象类型本身是引用,是传递引用的值。

参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。

在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。

本来只要一个引用传递(你所谓的按址传递)就可以了。这是最简单的,Java中一切都是对象是最符合直觉和语法规律的。
但是作为一种编程语言,必须考虑现实的问题,也就是性能问题。产生一个对象,初始化,调用,这些都是有开销的。如果简单的运算,比如整数、浮点数的四则运算,都用对象来实现的话,逻辑上是简单了,但是程序的性能就很差了。
于是java作为向性能妥协的考虑,引入了简单类型,或者叫值类型。这种bypass的机制使得面对一些基本的数据,比如整数、浮点、布尔值等的时候,像c++那样可以直接被计算机处理,而省略了作为对象的一切步骤。同时java允许使用装箱/拆箱的方式将它们虚拟成对象。
因为值类型的存在,所以就有了值类型的传递。对于值类型,你不能直接引用它,对它的=赋值,只会拷贝一个新的副本,而不是建立一个引用,修改这个副本不会修改之前的那个。这就是值传递和引用传递的区别。