Java 传引用

来源:互联网 发布:网络诈骗心得体会 编辑:程序博客网 时间:2024/06/05 19:57

Java中,对于method是传的引用。用一些小例子才阐述。

更正一下,这里参考了一下几篇文章,众说纷纭。看得我也是迷惑不已,主要是对引用和值的理解。

两条真理:

Truth #1: Everything in Java is passed by value. Objects, however, are never passedat all.

Truth #2: The values of variables are always primitives or references, never objects.

为了方便记忆以及混淆,我们可以这样理解。

凡是参数为基本类型或String, 那么是只是传值,方法中对该值的任何改变不会保留。

凡是参数为对象或对象的属性,那么是传引用,方法中对该对象属性的任何改变都会保留。


代码如下:

 public class ParamTest {
 
 public void funcString(String input)
 {
  input += "123";
 }
 
 public void funcInt (int input)
 {
  input += 1;
 }
 
 public void funcObj(Fresher input)
 {
  input.setName("Changed");
  input.setAge(2);
 }

 public static void main(String[] args)
 {
  ParamTest pTest= new ParamTest();
  
  //1. Test String
  String test = "test";
  pTest.funcString(test);
  System.out.println(test);
  
  //2. Test primitive types
  int num = 1;
  pTest.funcInt(num);
  System.out.println(num);
  
  //3. Test Object
  Fresher fresher = pTest.new Fresher();
  pTest.funcObj(fresher);
  System.out.println("Fresher: "+fresher.getName()+" "+fresher.getAge());
 }

 class Fresher
 {
  private String name;
  private int age;
  
  Fresher()
  {
   name = "init";
   age = 1;
  }
  String getName() {
   return name;
  }
  
  void setName(String name) {
   this.name = name;
  }
  
  int getAge() {
   return age;
  }
  
  void setAge(int age) {
   this.age = age;
  }
 }
}

没加注释哈,不要BS。Java 传引用 - Edison - 飞

1. 对于primitive types:

在上面代码中,本来num是指向stack中的1的,当调用method funcInt(int input)时,它的引用被复制然后赋给input,即二者指向同一快地址。

方法内有input = input +1; 实际上stack中就出现了2,而input就指向这个2.而num却还是指向1的。

当方法退出时,input的指向没有更新给num。所以num依然指向 1.

此时input == num---false!

故打印 1.

2. 对于String

同上。input的指向不会影响到test。

注:String是不可变类。String+=“123”; 编译时会生成一个StringBuilder。最终将更新后的StringBuilder生成的String返回。

此时input == test  ---false!

故打印 "test"

3.对于Object

Object比较特殊。input 和 fresher指向同一快地址,在方法里面调用Object自己的方法去更新值,那么Object内部属性变量的指向发生了变化。当方法退出时,input和fresher还是指向相同的地址,即 input == fresher --true!

故打印 Fresher: Changed 2