问题:一个对象被当作参数值传递到方法后,此方法可改变对象的属性,并可返回变化后的结果,是值传递还是引用传递?
答案是:值传递,因为java中只有值传递没有引用传递。
- 实参:实际参数,是提前准备好并赋值完成的变量。分配到栈上。如果是基本类型直接分配到栈上,如果是引用类型,栈上分配引用空间存储指向堆上分配的对象本身的指针。
- 形参:形式参数,方法调用时在栈上分配的实参的拷贝。
- 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,形参接收的是原始值的一个拷贝,此时内存中存在两个相等的变量
- 引用传递:方法调用时将实参的地址传递给对应的形参,实参和形参指向相同的内容。
Java数据类型分别基本数据类型与引用类型,下面介绍基本数据类型与引用类型传递参数的例子。
1.实参为基本数据类型的参数传递
基本类型传递时,线程在栈上分配形式参数空间并拷贝实际参数的值。
public class PassParamTest {
public void swap(int a,int b) {
int temp=a;
a=b;
b=temp;
System.out.println("a="+a+" "+"b="+b);
}
public static void main(String[] args) {
PassParamTest p=new PassParamTest();
int c=3;
int d=4;
p.swap1(c, d);
System.out.println("c="+c+" "+"d="+d);
}
}
输出:
a=4 b=3
c=3 d=4
由此可以看出形参a,b的值执行的交换,实参c,d的值保持不变,当方法结束形参a,b随栈帧被回收。
2.实参为引用类型的参数传递
- jvm会在栈帧的局部变量表中会创建形参变量,用来接收实参变量的值。
- 由于实参是reference类型,实参变量的值不等同于对象本身,它可能是一个指向对象起始地址的指针也可能是一个代表对象的句柄,因此实参的值传递给形参后,它们指向堆中的同一个内存地址。
- 若传递的是一个对象实例,那么形参实参指向同一个对象。在方法中修改形参的属性值,形参与实参的值均会改变,因为改变的是同一个对象的属性值。值得注意的是,实参本身并未发生改变。
public class PassParamTest {
public void change(Person per) {
per.setAge(15);
per.setName("Xiao Xiao");
System.out.println("age="+per.getAge()+" "+"name="+per.getName());
}
public static void main(String[] args) {
PassParamTest p=new PassParamTest();
Person person=new Person();
person.setAge(12);
person.setName("Yi Xiao");
p.change(person);
System.out.println("age="+person.getAge()+" "+"name="+person.getName());
}
}
class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
输出:
age=15 name=Xiao Xiao
age=15 name=Xiao Xiao
特殊的:String,Integer等类型的封装类型为final类型,对数据的修改操作实际上是创建了一个新的对象。
一个典型的例子:
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.println(ex.ch);
}
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}
输出:
good and gbc
参考链接:https://blog.csdn.net/qq_29175301/article/details/81559629
博客探讨Java中对象作为参数传递时是值传递还是引用传递,指出Java只有值传递。介绍了实参、形参概念,值传递和引用传递的区别,还分别给出基本数据类型和引用类型传递参数的例子,特殊的封装类型修改操作会创建新对象。

268

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



