Java值传递

实参/形参

  • 实参(实际参数,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值