@Test
public void testReference(){
B b=new B();
b(b);
System.out.println(b.getId()); //结果为null
}
private void b(B b){
b=new B();
b.setId("123");
}
class B{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
则在外部得到的o并非被修改,这是因为在JAVA中的引用传递是虚拟引用,其只是在新的方法b中新 定义的一个指针b,而此b的引用和传递进来的参数指针指向的是同一地址,所以说是虚拟引用。在方法体b()中新建的了个对象进而赋值给b,此时方法体内的b就不是指向外部的地址了,而是指向新开辟的内存地址,固而在外部的指针仍然是指向的原来的地址,所以其的ID仍然为null.
而如果在方法体中对b进行set操作,则其外部的对象也被修改了。因此这样,方法体内部的b仍然是指向的是外部的指针指向的地址,对其进行set操作也即是对外部内存地址进行的修改。
*******关键需要理解的是:java中引用是在方法体内新建了一个指针,而并非是直接引用。 在需要用引用传递时,尽量用set方法来进行修改外部的值。 而如果外部对象是通过方法体获取的,则可以通过创建内部类来进行操作。如下:
@Test
public void testObject(){
A a=new A();
a.item=new Item();
a(a);
System.out.println(a.item.getId());
}
private A a(A a){
a.item=new Item("11", "name", "type", "", null);
a.itemRevision=new ItemRevision();
return a;
}
class A{
Item item;
ItemRevision itemRevision;
}这样就可以达到引用的目的