实参/形参
- 实参(实际参数,Arguments):用于传递给函数/方法的参数,必须有确定的值。
- 形参(形式参数,Parameters):用于定义函数/方法,接收实参,不需要有确定的值。
String hello = "Hello!";
// hello 为实参
sayHello(hello);
// str 为形参
void sayHello(String str) {
System.out.println(str);
}
值传递方式
基本类型值传递
基本类型值传递时,不会改变实参的值。
public static void main(String[] args) {
int a1 = 10;
System.out.println(a1);
updateInt(a1);
System.out.println(a1);
}
private static void updateInt(int a1) {
a1 = 20;
}
//updateInt before10
//updateInt after10
包装类型值传递
形参在执行时,会生成新的引用地址。
public static void main(String[] args) {
System.out.println("=========================");
Integer i1 = 1;
System.out.println("updateInteger before " + i1);
System.out.println("updateInteger before hashcode " + i1.hashCode());
updateInteger(i1);
System.out.println("updateInteger after " + i1);
System.out.println("updateInteger after hashcode " + i1.hashCode());
Integer i2 = 1;
System.out.println("i2 hashcode " + i2);
System.out.println("i2 hashcode " + i2.hashCode());
}
private static void updateInteger(Integer a1) {
System.out.println("updateInteger execute before " + a1.hashCode());
a1 = 20;
System.out.println("updateInteger execute after " + a1.hashCode());
}
updateInteger before 1
updateInteger before hashcode 1
updateInteger execute before 1
updateInteger execute after 20
updateInteger after 1
updateInteger after hashcode 1
i2 hashcode 1
i2 hashcode 1
引用类型传递1
public static void main(String[] args) {
System.out.println("=========================");
String s1 = "s1";
System.out.println("updateString before " + s1);
System.out.println("updateString before hashcode " + s1.hashCode());
updateString(s1);
System.out.println("updateString after " + s1);
System.out.println("updateString after hashcode " + s1.hashCode());
//字符串常量池
String s2 = "s1";
System.out.println("s2 " + s2);
System.out.println("s2 hashcode" + s2.hashCode());
}
private static void updateString(String s1) {
System.out.println(s1.hashCode());
s1 = "s2";
System.out.println(s1.hashCode());
}
updateString before s1
updateString before hashcode 3614
3614
3615
updateString after s1
updateString after hashcode 3614
s2 s1
s2 hashcode3614
引用类型传递
形参传递的为引用类型的地址值
public static void main(String[] args) {
User user = new User();
user.setName("name1");
System.out.println("updateName before hashcode " + user.hashCode());
System.out.println("updateName before username hashcode " + user.getName().hashCode());
System.out.println("updateName before " + user.getName());
updateName(user);
System.out.println("updateName after hashcode " + user.hashCode());
System.out.println("updateName after username hashcode " + user.getName().hashCode());
System.out.println("updateName after " + user.getName());
}
private static void updateName(User user) {
System.out.println("updateInteger execute before " + user.hashCode());
user.setName("name2");
System.out.println("updateInteger execute after " + user.hashCode());
}
updateName before hashcode 1956725890
updateName before username hashcode 104584966
updateName before name1
updateInteger execute before 1956725890
updateInteger execute after 1956725890
updateName after hashcode 1956725890
updateName after username hashcode 104584967
updateName after name2