在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
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
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
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
String=>Aft    t:0

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

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

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

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