对于非基本的变量,涉及两个概念, 引用和对象实体.对象实体指的是内存中一块区域,在这个区域中存储的是对象实例化后生成的一组数据结构.而引用也是一种特殊类型的变量,可以理解为是它的名就是非基本变量的名,它的值是对象实体的内存地址.
对于很多类型的语言,都会涉及到的一个问题,如果方法中的参数为非基本变量,它是怎样传递的,传值?传址?下面讨论一下java和javascript两种语言下的参数传递 问题.
java
在方法体内的非基本类型的变量引用是方法体外变量引用的一个副本,也就是说他们有相同的值(对象实体的物理内存),即指向相同的内存中的对象实体.但内存中同时也存在着两个引用.如果方法体内的对象再次创建对象,也就是下面方法change2所做的,这个时候,作为副本的引用的值就改变了,它会指向新的对象.而外面的引用并没有发生变化.
看下面的例子.
public class A {
int a =1;
}
public class B{
public static void change1(A a) {
a.a = 2;
}
public static void change2(A a) {
a.a =2;
a = new A();
a.a = 4;
System.out.print("");
}
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
System.out.println("a1.a =" + a1.a);
System.out.println("a2.a =" + a2.a);
System.out.println("method is executed!");
change1(a1);
change2(a2);
System.out.println("a1.a =" + a1.a);
System.out.println("a2.a =" + a2.a);
}
}
结果如下:
a1.a =1
a2.a =1
method is executed!
a1.a =2
a2.a =2
其实,javascript似乎也是采用了同样的策略,两者得到结果一致.