Java 方法形参如何变成实参
在Java中,形参是方法定义时用来接收外部传递给方法的值或对象的变量,实参是方法调用时传递给形参的具体值或对象。本文将介绍Java中方法形参如何变成实参的机制。
1. 传值调用
在Java中,方法的参数传递是按值传递的,也就是说,将实参的值复制给形参。这意味着无论是基本数据类型还是对象,实参的改变不会影响到形参的值。
1.1 基本数据类型
对于基本数据类型,形参接收的是实参的值。下面是一个示例代码:
public class Example {
public static void main(String[] args) {
int num = 10;
System.out.println("调用前:num = " + num);
changeValue(num);
System.out.println("调用后:num = " + num);
}
public static void changeValue(int value) {
value = 20;
System.out.println("方法内部:value = " + value);
}
}
输出结果:
调用前:num = 10
方法内部:value = 20
调用后:num = 10
可以看到,虽然在changeValue
方法内部将形参value
的值改为了20,但是对实参num
没有任何影响。
1.2 对象
对于对象,形参接收的是实参对象的引用,也就是说形参和实参指向同一个对象。下面是一个示例代码:
public class Example {
public static void main(String[] args) {
Person person = new Person("Alice");
System.out.println("调用前:person.name = " + person.getName());
changeValue(person);
System.out.println("调用后:person.name = " + person.getName());
}
public static void changeValue(Person p) {
p.setName("Bob");
System.out.println("方法内部:person.name = " + p.getName());
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
输出结果:
调用前:person.name = Alice
方法内部:person.name = Bob
调用后:person.name = Bob
可以看到,虽然在changeValue
方法内部修改了形参p
所引用的Person
对象的name
属性,但是由于形参和实参指向同一个对象,所以对实参也产生了影响。
2. 传引用调用
在Java中,并不支持传引用调用。虽然对象的引用是通过值传递的,但是在方法内部如果修改了形参所引用的对象,对实参并没有影响。因为实参和形参分别存储在不同的内存空间中。
下面是一个示例代码:
public class Example {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
System.out.println("调用前:sb = " + sb);
changeValue(sb);
System.out.println("调用后:sb = " + sb);
}
public static void changeValue(StringBuilder s) {
s.append(" World");
System.out.println("方法内部:sb = " + s);
}
}
输出结果:
调用前:sb = Hello
方法内部:sb = Hello World
调用后:sb = Hello World
可以看到,虽然在changeValue
方法内部修改了形参s
所引用的StringBuilder
对象,但是对实参sb
并没有影响。
综上所述,Java方法的形参通过值传递的方式变成实参,对于基本数据类型,形参接收的是实参的值;对于对象,形参接收的是实参对象的引用。无论是基本数据类型还是对象,在方法内部对形参的修改都不会影响到实参。