新手如果太简单了,大家别笑话啊。
以前我发过一帖关于这方面问题,那时候是用Integer做的例子http://topic.csdn.net/u/20080316/10/4a928676-9e66-4015-b13f-3603512db582.html,因为Integer没有set方法,所以今天我写了个Javabean来说例子;Javabean就是个Person类,不用多说。
第一个类:public class ChangeTest {
  public void changM(Person person){
 person.setId("1243");
  }
  public static void main(String[]args){
  ChangeTest change=new ChangeTest();
  Person person=new Person();
  person.setId("678");
  change.changM(person);
  System.out.println(person.getId());
  }
}
结果:1243
第二个类:public class ChangeTest {
  public void changM(Person person){
 person=new Person();
 person.setId("1243");
  }
  public static void main(String[]args){
  ChangeTest change=new ChangeTest();
  Person person=new Person();
  person.setId("678");
  change.changM(person);
  System.out.println(person.getId());
  }
}
结果:678
写了一个看地址的,第三个类:
public class ChangeTest {
  public void changM(Person person){
 System.out.println(person);  person=new Person();
 person.setId("1243");
 System.out.println(person);  }
  public static void main(String[]args){
  ChangeTest change=new ChangeTest();
  Person person=new Person();
  System.out.println(person);
  person.setId("678");
  change.changM(person);
  System.out.println(person);
  System.out.println(person.getId());
  }
}
结果:
Person@1e63e3d
Person@1e63e3d
Person@1004901

Person@1e63e3d
678
现在该我问了:当我在changM方法中直接写person.set时能改变外面对象的值,也就是说这个变量是指向外面那个对象。而当我写person=new Person()时,这里产生了两个对象了,这个person和外面的person指向的地址就不同了,也就是在内存空间有两片不同的了。那么java是怎么区分这两种情况的呢,如果没new新的时person和形参person指同一片内存。而当有了new Person()时变成不同的了。

解决方案 »

  1.   

    2个Person等于2张纸,一开始都写着一个人的地址。在方法里,其中一张改了,写上了另一个人的地址,但另外一张纸却不会变化的!。如果你修改了纸上写的人的信息,那么另一张写着同样人的那张纸当然也会变了!
      

  2.   

    第一种
    public void changM(Person person){ 
     person.setId("1243"); 
      } 
    第二种
     public void changM(Person person){

     person=new Person();
     person.setId("1243");
     
      }
      

  3.   

    我知道第二种情况的person地址变了,从第三个类打印的地址信息可以看出。但是我问是Java怎么知道这种变化,同样是和形参相同的拼写,都是person。
      

  4.   

    第二种情况,开始person时是个形参,它指向了传递递过来的那个对象.当你执行person = new Person()时,内存中又创建了一个对象(在堆中创建),并且把这个对象赋给了person这个变量.这时候person自然就指向新的这个对象了,它所有的操作都是针对新对象的.