Java中有8个基本类型, 而其他,包括数组,枚举和自定义类都是引用类型。
基本类型:
String aaa = "aaaaaa";
String bbb = aaa;
执行完后, 变量 bbb 会含有和aaa一样的值,而且在JVM中,会有2个独立的字符串变量"aaaaaa"。
Point aa = new Point();
Point bb = aa;
执行后,JVM只有一个Point对象, bb 也是指向这个内存区域的 。
所以,代码的测试结果:
String aaa = "aaaaaa";
String bbb = "bbbbbb";
List tlist = new ArrayList();
tlist.add(aaa);
tlist.add(bbb);
aaa = "111111";
bbb = "222222";
System.out.println(tlist.get(0));
System.out.println(tlist.get(1));
执行结果:
aaaaaa
bbbbbb
而
{
Point aa = new Point();
aa.changeValue(0, 1);
testChange(aa);
System.out.println(aa.x + "," +aa.y);
}
private static void testChange(Point aa){
aa.changeValue(3, 4);
}
class Point{
int x;
int y;
public void changeValue(int x , int y){
this.x = x;
this.y = y;
}
}
执行结果: 3,4
数组,枚举, 自定义类结果都是这个。
如果想通过复制的方法, 不改变原对象的值,可以使用 clone() 方法。
这个需要对象实现 Cloneable 接口。
数组类型可以直接调用这个 clone() 方法。
在引用传递中, 必须是有了确切的引用, (新建了对象, 初始化了值) , 复合类型的引用才会被传递到方法中去 . .
如果在方法中, 对象新建了值, 那么就会丢失原来的引用地址 . . . .
以HASHMAP 为例 :
public class Test {
public static void testMap(Map map){
//map = new HashMap(); 此时,对象的引用被修改了,外部方法将丢失它的值.
map.put("aaa", "ggg");
}
public static void main(String[] args){
System.out.println("Haha");
Map testMap = new HashMap();
testMap(testMap);
String a = testMap==null?"null":"have";
}