秋招结束后,整个人都闲了下来。闲了将近一个月,现在准备把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;
    }
}

经过该交换方法可能大部分人认为打印的应该是两个不同的字符串

java项目难点面试 java项目难题_java项目难点面试


但是该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两个引用的对象地址

java项目难点面试 java项目难题_System_02


做个小实验看这个代码

我做的实验仅仅是想让你明白 值传递的特点:赋值者与被赋值者之间在改变引用地址时的无关性!!!

再验证一下这个特点

让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项目难点面试 java项目难题_java项目难点面试_03


这就已经证明了值传递的特点:赋值者与被赋值者无关 他们之后做的改变引用地址与原来的赋值者无关关于java对象的引用地址 有什么不同呢 看图!!

赋值前

java项目难点面试 java项目难题_jvm_04


值传递赋值后:
当mainTest的引用改变 不会干扰到main

java项目难点面试 java项目难题_java项目难点面试_05


引用传递赋值后:
当mainTest的引用地址发生改变 main的引用也会和他一样改变

java项目难点面试 java项目难题_开发语言_06


或者是这样:

java项目难点面试 java项目难题_System_07