发新话题
打印

Java面向对象值传递和引用传递

Java面向对象值传递和引用传递

不时被这个参数到底是值传递还是引用传递的问题纠结 今晚特意好好想了想, 总结如下:
  值传递:传递的就是实际的内存当中存储的 实在的值
  例如:int a=3; a 就指向了内存当中某一个物理地址里面存储的3
  当把a传递给另外一个变量, 不论是局部变量还是 全局变量, 都是值传递, 即把a指向的物理内存中的这个3 传递给了另外一个变量, 例如int b=a; 这句话之后就把3传递给了b, 可能b在内存中又开拓了一个物理地址空间, 但是存储的依然是3。 之后就任凭b随便改变里面的值, 瞎折腾都可以, 但是a指向的那个内存单元中的3不会变的。
  例如 int a=3;
  int b=a;
  b++;
  system. out. println(a);//依然是3
  system. out. println(b);//b变为4
  这个跟参数传递一样的, 例如
  int a=3;
  public void test(int a){
  a=4;
  ]
  test(a);//这里把a传递给这个函数的时候, 就相当于把a传递给下面的b一样, 是把值=3传递给了形参a, 所以任凭形参a=4 但是原来的a依然不变是3;由于两个a在内存当中的地址不一样, 所以互相不影响。
  下面讨论引用传递:
  int [] a={1, 2, 3};
  System. out. println(a[1]);//为2
  int b[]=a;
  b[0]=4;
  b[1]=5;
  b[2]=6;
  System. out. println(a[1]); //为5
  很奇怪吧, 这里详细解释一下。 由于对象在内存当中存的是通过引用访问的, 在内存中a指向的是一个地址的引用, 比如a在内存中存的是一个地址00001, 而00001地址里面存的才是真正的对象的实际内容, 这时候把a传递给b, 就是把这个引用地址给了b, 让b也指向了00001, 这时候b修改了00001内存地址当中的值的时候, 就修改了实际的对象值, 所以回过头来a再去指向这个00001内存地址的时候里面的值自然也就被修改了。
  一句话:当是根底类型传递时候用的是值传递, 对象等复合类型传递的时候是引用的传递。
  引用传递抽象点解释就是我把我们家的门牌号通知你了, 然后你来我家捣乱了, 我回家之后家里的东西自然就乱了。 而值传递抽象点解释就是我把我们家的设计图纸给你了, 你在我们家附近盖了跟我一样的房子, 然后你随便瞎折腾,跟我们家有关。文章由岁月无痕官网整理,收集辛苦,希望能保留出处。
jiyizhen-buy.com颈椎保健枕太空记忆枕 igerl.com歌瑞尔内衣

TOP

发新话题