两个数交换引发的血案

案例:变量=1,b=2,使a,b交换值?

 

 1 package demo;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5           Integer a = 1;
 6           Integer b = 2;
 7                 
 8                 System.out.println("before:a="+a+",b="+b);
 9                 swap(a,b);
10                 System.out.println("after:a="+a+",b="+b);
11     }
12 
13     private static void swap(Integer a, Integer b) {
14         int temp = a;
15          a = b ;
16          b = temp;
17         
18     }
19 }
20                 

 

结果:a=1,b=2

值传递:值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,不管副本如何变化,对原始值都没有任何影响,原始值保持不变。

引用传递:传递的是引用副本指向自己的地址,而不是自己的副本,因此如果函数修改了参数,原始值也随之改变

Java反射:私有的成员属性是不能直接通过反射去赋值的,如果就要直接赋值,f.setAccessible(true)

Java装箱和拆箱:Integer a=1,JVM会自动装箱成为Integer a = Integer.valueOf(1),如果i的值在-128到127之间,就直接从IntegerCashe里获取(常量池),

        超出了范围,就会新建一个Integer类型的对象

    自动拆箱:引用类型转换为基本类型,下面的代码在编译后的class文件中为: int i = new Integer(1).intValue();  //int i = new Integer(1);
    自动装箱: 基本类型转换为引用类型,下面的代码在编译后的class文件中为:Integer ii = Integer.valueOf(i);    //Integer ii = i;
用反射改为引用传递:

 1 package demo;
 2 
 3 import java.lang.reflect.Field;
 4 
 5 public class Test {
 6     public static void main(String[] args) {
 7           Integer a = 1;
 8           Integer b = 2;
 9                 
10                 System.out.println("before:a="+a+",b="+b);
11                 swap(a,b);
12                 System.out.println("after:a="+a+",b="+b);
13     }
14 
15     private static void swap(Integer i1, Integer i2) {
16         try {
17             Field f = Integer.class.getDeclaredField("value");
18             f.setAccessible(true);
19             int temp = i1.intValue();//改为:Integer temp = new Integer(i1.intValue())
20             f.set(i1, i2.intValue());
21             f.set(i2, temp);
22         } catch (NoSuchFieldException e) {
23             e.printStackTrace();
24         } catch (SecurityException e) {
25             e.printStackTrace();
26         } catch (IllegalArgumentException e) {
27             e.printStackTrace();
28         } catch (IllegalAccessException e) {
29             e.printStackTrace();
30         }
31                 
32         
33     }
34 }
35                 

运行结果a=2,b=2



 



 

posted @ 2017-05-08 01:57  等你,在雨中  阅读(116)  评论(0)    收藏  举报