两个数交换引发的血案
案例:变量=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
温壶月光当茶饮

浙公网安备 33010602011771号