java和C#的传递机制是一样的,都是拷贝,不是传递,是拷贝,只不过对于基本类型,拷由的是RAM中的内容,而对于引用类型,拷贝的是对象的引用值,这类似于C语言的指针。
对于基本类型,变量名存取的是内存的值。
对于引用类型,变量名存取的是指针名,指针指向的是内存的值
基本类型
如int num=5;
定义一个类:
Class MyClass {
Int num=5;//定义了一个属性
}
myClass是这个类的一个对象
变量名 | 指针 | 内存值 |
num | 无 | 5 |
myClass | 1451 | 5等关于类的内容 |
看以下试验:
程序1:
package mypackage;
import java.util.*;
public class Test {
int age;//定义Tets的一个属性age
/**
* 用于两个对象交换(此处换的是对象的引用)
* @param test1:对象1
* @param test2:对象2
*/
public static void swap(Test t1,Test t2){
int temp;
temp=t1.age;
t1.age=tt2.age;
t2.age=temp;
}
public static void main(String[] args) {
Test test1=new Test();
test1.age=1;
Test test2=new Test();
test2.age=2;
Test.swap(test1, test2);//交换
System.out.println("tes1.age="+test1.age);//输出Test1的年龄
System.out.println("tes2.age="+test2.age);//输出Test1的年龄
}
}
以下是输出结果:
tes1.age=2
tes2.age=1
程序2:
package mypackage;
import java.util.*;
public class Test {
static Scanner input=new Scanner(System.in);
int age;//定义Tets的一个属性age
/**
* 用于两个对象交换(引处换的是对象的属性)
* @param test1:对象1
* @param test2:对象2
*/
public static void swap(Test t1,Test t2){
Test temp;
temp=t1;
t1=t2;
t2=temp;
System.out.println("swap方法内:t1.age="+t1.age);
}
public static void main(String[] args) {
Test test1=new Test();
test1.age=1;
Test test2=new Test();
test2.age=2;
Test.swap(test1, test2);
System.out.println("swap方法外:test1.age="+test1.age);
}
}
以下是结果:
swap方法内:t1.age=2
swap方法外:test1.age=1
程序1的过程是:
假设test1的指针是1151,test2的指针是1251
Test.swap(test1, test2),把test1的指针(该指针指的是内存区域)拷贝一份,传递给swap方法, 于是t1就存储了test1的指针1151,t2就存储了test2的指针1251, test1.age就是获取或设置1151内的内存值,test2.age就是获取或设置1251内的内存值,
双方置换了内存中的age值(注意是内存中的值变化了),然后从此函数中出来,再输出test1.age是,test1的指针还是1151(为什么?因为它开始是把指针拷贝过去的,是拷贝!),它还是指向那片内在区域,但是内存的值我们给换了(这是关键),所以输出
tes1.age=2
tes2.age=1
程序2的过程:
假设test1的指针是1151,test2的指针是1251
Test.swap(test1, test2)后,把test1的指针1151拷贝一份传给swap函数,于是t1就存储了指针1451,同理,t2存储了指针1251,然后在swap方法里两者的指针发生了置换,于是t1存储了指针1251,t2存储了指针1151,输出t1.age时,由于t1存储的是1251,所以输出t1.age=2;
方法完成后,又回到了主方法。最后输出test1.age,test1对应的指针是哪个?(1251!,还是那句话,拷贝)1251存储的age的值是1,所以输出
test1.age=1;
test2.age=2
经验:只要方法不动内存里的值出来此方法后就不会对拷贝指针给它的对象产生影响,改变了内存的值就会指南针给它的对象产生影响。现实中的判断就是方法内的对象只要不使用.运算符使用能对象的属性或方法就不产生影响,反之,就是产生影响.