秋招结束后,整个人都闲了下来。闲了将近一个月,现在准备把Java基础在深层次的复习一遍,主要是看得《Java核心技术卷一》和《卷二》,下面的问题都是之前我个人反复看过很多次的问题:
1.Java是引用传递还是值传递?
看下面的代码
public class MainTest {
String isBoolean;
public static void main(String[] args) {
MainTest mainTest=new MainTest();
mainTest.isBoolean="mainTest";
MainTest mainTest1=new MainTest();
mainTest1.isBoolean="mainTest1";
System.out.println(mainTest.isBoolean);
swap(mainTest,mainTest1);
System.out.println(mainTest.isBoolean);
}
public static void swap(MainTest main,MainTest main1){
MainTest temp=main;
main=main1;
main1=temp;
}
}
经过该交换方法可能大部分人认为打印的应该是两个不同的字符串
但是该swap方法并不能改变mainTest和mainTest1的引用,为什么呢?
这就和Java的调用方法的两种方式有关了,实际上,对象引用是按值传递的 mainTest和mainTest1的引用存储了对象在堆中的地址,调用方法时,将mainTest与mainTest1的**地址的值
**传递给swap方法的两个参数,但是swap方法交换的是swap方法参数里的那两个参数的引用地址,在方法结束后main与main1被丢弃了。
简单来说等价于:
public static void main(String[] args) {
MainTest mainTest=new MainTest();
mainTest.isBoolean="mainTest";
MainTest mainTest1=new MainTest();
mainTest1.isBoolean="mainTest1";
System.out.println("mainTest:"+mainTest.isBoolean);
//swap(mainTest,mainTest1);
MainTest main=mainTest;
System.out.println("main:"+main.isBoolean);
MainTest main1=mainTest1;
MainTest temp=main;
main=main1;
main1=temp;
System.out.println("mainTest:"+mainTest.isBoolean);
System.out.println("main:"+main.isBoolean);
}
可以看到发生交换的仅仅是main 和 main1两个引用的对象地址
做个小实验看这个代码
我做的实验仅仅是想让你明白 值传递的特点:赋值者与被赋值者之间在改变引用地址时的无关性!!!
再验证一下这个特点
让maintest与mainTest1去交换引用
public static void main(String[] args) {
MainTest mainTest=new MainTest();
mainTest.isBoolean="mainTest";
MainTest mainTest1=new MainTest();
mainTest1.isBoolean="mainTest1";
System.out.println("mainTest:"+mainTest.isBoolean);
//swap(mainTest,mainTest1);
MainTest main=mainTest;
System.out.println("main:"+main.isBoolean);
MainTest main1=mainTest1;
MainTest temp=mainTest;
mainTest=mainTest1;
mainTest1=temp;
System.out.println("mainTest:"+mainTest.isBoolean);
System.out.println("main:"+main.isBoolean);
}
打印的是这样:
这就已经证明了值传递的特点:赋值者与被赋值者无关 他们之后做的改变引用地址与原来的赋值者无关
关于java对象的引用地址 有什么不同呢 看图!!
赋值前
值传递赋值后:
当mainTest的引用改变 不会干扰到main
引用传递赋值后:
当mainTest的引用地址发生改变 main的引用也会和他一样改变
或者是这样: