一、定理: 1.如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
2. 如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝
简单的理解这句话的意思:数据类型是基本类型 ------------------值传递。
数据类型是引用类型 -----------------地址拷贝传递。
1.问:什么是基本类型,什么是引用类型?
基本类型:byte、short、int、long、float、double、char、boolean 。 除了这八种,其他的都是引用类型的。我们自己写的类就是引用类型的,String 是一种特殊的引用类型。看看以下列子:
public static void main(String[] args) {
String st1="hello word";
int a=5;
StringBuilder builder=new StringBuilder("StringBuilder");
System.out.println("add 前, a= "+a);
System.out.println("add 前,st1= "+st1);
System.out.println("add 前,builder= "+builder);
add(st1);
add(a);
add(builder);
System.out.println("add 后,a= "+a);
System.out.println("add 后,st1= "+st1);
System.out.println("add 后,builder= "+builder);
}
private static void add(String st){
st+="hello";
}
private static void add(int i){
i=10;
}
private static void add(StringBuilder sb){
sb.append("add hello");
}
执行结果是:
add 前, a= 5
add 前,st1= hello word
add 前,builder= StringBuilder
add 后,a= 5
add 后,st1= hello word
add 后,builder= StringBuilderadd hello
a是基本类型,所以前后数值不变,builder是引用类型所以执行了add后数值改变。st1是引用类型,按理来说执行add后应该改变其值,但是结果却是没有。为什么呢?答案在String本身上。在这里要永远记住一点:“String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”。意思也就是说在执行了add后创建了新String对象,add方法中的st所指向指向新String对象的地址,st1还是指向 "hello word"这个地址。