这里结果输出A啊,唉,这都错,半路出家和尚啊……doit传进去的参数作用范围只是函数内部,Java是值调用。
突然想到,这里的String类型的之所以不变,是因为String类型的变量是不可变的。
import java.awt.List; import java.util.ArrayList; public class Test { public static void main(String[] args) { new Test().doit(); } public void doit() { String str = "B"; int i = 1; ArrayList array = new ArrayList(); print(array, str, i); System.out.println(str); System.out.println(i); System.out.println(array.toString()); } public void print(ArrayList array, String str, int j) { for(int i=0; i<10; i++) { array.add(Integer.valueOf(i)); } str = "a"; j += 2; System.out.println(str); System.out.println(j); System.out.println(array.toString()); } }
可以看到结果如下:
a 3 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] B 1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
也就是说,方法内部的变量执行另外的方法后,只有ArrayList的值改变了,而String和int类型的都没有变。
- ]
-
一.先说说参数传递的几个术语:
。
值调用(call by vale):表示方法接收的是调用者传递的值
。
引用调用(call by reference):表示方法接收的是调用者传递的变量地址
;
一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值
-
**JAVA语言总是采用值调用。 也就是说,JAVA方法得到的是所有参数值的一个拷贝,方法不能修改传递给他的任何参数变量的内容。 例如: int age=100; person.setAge(age); 在以上方法调用后,age 的值还是100; 下面再看一例子,假如某方法将一个变更值修改为原来的值的3倍: public void addValue(int x){ x = 3 * x; } 然后调用这个方法: int percent = 10; addValue(percnet); 无论如何调用,percent的值还是10,下面是执行过程: 1.x被初始化为percent值的一个拷贝(也就是10); 2.x被乘以3后,值变为30。但是percent仍然是10; 3.该方法结束后,参数变量x不再使用。 如图一: 二.java方法传参类型: 基本数据类型:(数字,布尔型) 对象引用类型: 基本数据类型传参在上例中已经说过了,是不能修改基本数据类型参数的值的. 那么对于对象引用类型的传参,能否修改呢? 先来看例子: 有如下方法: public static void tripleSalary(Employee x) { x.raiseSalary(200); }
当调用如下代码
harry = new Employee();
tripleSalary(harry);
时,具体的执行过程如下:
1).x被初始化为harry对象的拷贝,这里是一个对象的引用;
2).raiseSalary方法应用于这个对象引用.即x和harry同时引用的Employee对象薪金提高了200%.
3).方法调用结束后,参数变量x不再使用.但对象变量harry继续引用那个薪金增至3倍Employee对象.
其过程如下图:

通过以上实例,可以看出对象参数传递的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象.
很多程序语言提供两种传递方式:值传递和引用传递(C++和Pascal).
有些程序员认为java语言对对象参数传递也是用的引用调用.实际上是理解错误.这种错误具有一定的普遍性.下面通过一反例来说明该问题:
首先,编写一个交换两个Employee对象的方法:
public staitc void swap(Employee x,Emplyee y)
{
Employee temp = x;
x = y;
y = temp;
}
如果JAVA程序语言是对对象采用引用调用,那么这个方法就应该能够实现交换数据的效果:
Employee a = new Employee("Alice",...);
Employee b = new Employee("Bob",...);
swap(a,b);
但是,方法并没有改变存储在变量a和b中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。
在方法结束时,参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象如下图:

这个过程说明:java语言对对象采用的不是引用调用,实际上对象引用进行的是值传递。
最后总结一下在JAVA中,方法参数的使用情况:
*一个方法不能修改一个基本数据类型的参数;
*一个方法可以改变一个对象参数的状态(属性);
*一个方法不能实现让对象参数引用一个新对象;
本文深入探讨Java中参数传递的机制,包括值调用与引用调用的区别,通过实例展示了如何在方法内部修改对象参数状态而不影响外部引用,以及在不同场景下参数传递的类型与效果。
丢人 ——JAVA基础--方法传参&spm=1001.2101.3001.5002&articleId=82128375&d=1&t=3&u=13124b64f13c4cccb7e15bd8fb37ef3d)

被折叠的 条评论
为什么被折叠?



