1、对于基础类型,传递值;

     函数内对参数的操作不影响到外部的参数值。

2、对于非基础类型,传引用。

     一般情况下,函数中参数的操作会影响到外部的参数值。如函数对Student对象修改name属性后,外部的Student对象的name就变了;

    对于基础类型的包装类型,本来也适用于本规则,但实际却另外蹊跷:

   

public static void main(String[] args) {
Integer i = 100;
changeVal(i);
System.out.println(i);
}
public static void changeVal(Integer i)
{
i = 9;
}

打印结果为:100


    上面语句执行后,外部对象的值不会变,原因在于,这个实际的实际行为为:i = Integer.valueOf(9); 这相当于给这个参数重新赋值了,而不是对原有对象属性进行修改,所以外部值不会变;

    那是否有办法进行改变呢?

    有的,通过反射机制修改Integer对象的内部属性。

public static void changeVal(Integer i)
{
try {
Class c=Integer.class;
Field f=c.getDeclaredField("value");
f.setAccessible(true);
f.set(i, 9);
} catch (Exception e) {
e.printStackTrace();
}
}

这样执行的结果就是9了。