按值传递 pk 按址传递(Java)

Java 中,为类的方法传递参数时,本身的传递机制是按址传递,还是按值传递?

//: 按值传递与按址传递测试类 Test1.java

public class Test1 {

    public static void main(String[] args) {

       User t = new User();

       t.setUserId(0);

       t.setUsername( "0" );

       t.setPassword( "0" );

       System. out .println( "User=>Bef    Id:" +t.getUserId()+ "\tname:" +t.getUsername()+ "\tpassword:" +t.getPassword());

       change (t);

       System. out .println( "User=>Aft    Id:" +t.getUserId()+ "\tname:" +t.getUsername()+ "\tpassword:" +t.getPassword());

    }

    public static void change(User t){

       // 在此, t 引用的地址没有改变

       t.setUsername( "00" ); // t 的属性引用的地址改变了

       t.setPassword( "00" );

    }

} /* Output:

User=>Bef   Id:0   name:0 password:0

User=>Aft  Id:0   name:00    password:00

*///:~ 结论:按址传递

//: 按值传递与按址传递测试类 Test2.java

public class Test2 {

    public static void main(String[] args) {

       int t = 0;

       System. out .println( "int=>Bef    t:" +t);

       change (t);

       System. out .println( "int=>Aft    t:" +t);      

    }

    public static void change( int t){

       // 在此, t 引用的地址没有改变

       t = 1; // 在此, t 引用的地址改变了

    }

} /* Output:

int=>Bef    t:0

int=>Aft   t:0

*///:~ 结论:按址传递

//: 按值传递与按址传递测试类 Test3.java

public class Test3 {

    public static void main(String[] args) {

       Integer t = 0;

       System. out .println( "Integer=>Bef   t:" +t);

       change (t);

       System. out .println( "Integer=>Aft   t:" +t);      

    }

    public static void change(Integer t){

       // 在此, t 引用的地址没有改变

       t = 1; // 在此, t 引用的地址改变了

    }

} /* Output:

Integer=>Bef   t:0

integer=>Aft  t:0

*///:~ 结论:按址传递

//: 按值传递与按址传递测试类 Test4.java

public class Test4 {

    public static void main(String[] args) {

       String t = "0" ;

       System. out .println( "String=>Bef t:" +t);

       change (t);

       System. out .println( "String =>Aft   t:" +t);      

    }

    public static void change(String t){

// 在此, t 引用的地址没有改变

       t = "00" ; // 在此, t 引用的地址改变了

    }

} /* Output:

String=>Bef    t:0

String=>Aft   t:0

*///:~ 结论:按址传递

    最终结论: Java 中,为类的方法传递参数时,本身的传递机制是按址传递。那么,为什么打印的结果会不一样呢?主要是由赋值符号“ = ”造成的,众所周知,在 Java 中,一切都是对象,所以即便是个数字、字符,或者字符串,都被称为是对象。在 Java 中,规定的赋值(“ = ”)机制是按址传递,即将对象的地址赋给引用(即把对象的地址赋给“ = ”左侧的变量),所以每出现一次赋值语句,左侧变量的地址都会发生改变。既然这样,那么为什么在 Test234 中最后打印 t 的值时却没有改变呢?这就是程序本身的迷惑性造成的,其实 change 方法内部的 t 与该方法外的 t 不是一个引用,如果把 change 参数的 t 改为其他名字你就明白了,这就是故意用来迷惑不成熟的程序员的。在传递参数时,首先要新生成参数列表中的虚参变量,然后将传递的实参的对象地址赋给虚参,这样就完成了 Java 中的参数传递。

       因此,当在一个方法内部改变方法外面的某个对象的值时,一定要注意“ = ”的迷惑性( = ”只传址,不传值 )。

       总之一句话, Java 中传的都是地址,不是值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值