重新整理的关于Java基础的难点问题合集

秋招结束后,整个人都闲了下来。闲了将近一个月,现在准备把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的引用也会和他一样改变

在这里插入图片描述
或者是这样:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值