初步认识引用

每篇一题答案

        int[] arr1 = new int[]{1, 2, 3, 4};
        int[] arr2 = arr1;
        arr2[0] = 100;
        System.out.println(Arrays.toString(arr1));

这道题的答案涉及到引用方面的知识,arr1所存储的内容是对象new int[]{1, 2, 3, 4}的地址;
本篇博客会讲到可以通过引用来控制所指向的对象,arr1赋值给arr2就是把arr1所指向的地址赋值给了arr2,所以arr2也是这个对象的引用之一,所以arr2[0] = 100 改变了对象数组中的第一一个元素的值;
那么对象改变了,arr1所指向的对象自然也会改变;

初步认识引用

对象和引用

引用可以说是“低配”的指针,因为引用在本质上是和指针一样的,都是一个地址,并且其的内容都是指向目标的地址;
但是为了避免一些比较难理解的错误,引用在指针的功能上进行了很大程度的裁剪;
现存下来的引用解引用操作不需要使用 * 显式进行(在需要的时候自动解引用),比较操作只能会用 != 和 == 进行比较; < > <= >= 这些都支持了;
至于对象是什么我们在这里先不做解释,在下一篇博客《类和对象》中会进行讲述;
接下来我们来看看具体是怎么引用的;

        int[] arr1 = new int[]{1, 2, 3, 4};
        int[] arr2 = arr1;

上述代码中 new int[ ]就是对象,而arr1以及arr2都是属于引用的,这段代码的含义如图所示:
在这里插入图片描述需要注意的是这是数组的引用,在Java中引用类型的就只有那么几个:字符串、数组、类和接口;
如果是内置类型的变量是不能够用引用来控制变量的值得,例如int类型的变量;但是可以通过Integer类来创建引用来达到控制的目的,因为其原来的代码是这样的

        Integer i = new Integer(7);
        int a = i;

代码中的Integer是一个类,可以创建引用,引用 i 指向的对象为 Integer(7);第二行代码则是把引用 i 所指向的内容 7 赋值给变量a;

引用指向对象的规则

1、只有且只能引用指向对象,不能引用指向引用,也不能对象指向引用,更不能对象指向对象;
2、一个对象可以被对多个引用指向;引用就像是别名,真名不可变,但是他人给你取得别名可以有很多,这些别名都能代表他们心目中的你;
3、操作引用,其实是操作引用所指向的对象,如果一个对象有多个引用指向,如果操作其中一个引用来改变对象,那么其他几个也会改变;

引用的赋值操作符理解

赋值操作符是“=”,它在引用的意思是把对象的地址赋值拷贝给被赋值对象,使其也指向该对象,那么就可以通过该引用来控制对应的对象了;
我们假设下列代码中对象的地址为0x1000,第一个指向对象的引用是arr1,arr1中存储的内容就是0x1000,;
第二步将arr1赋值给arr2,其实就是把arr1的内容赋值拷贝给arr2,这样arr2也和arr1一样指向了相同对象;

       int[] arr1 = new int[]{1, 2, 3, 4};
        int[] arr2 = arr1;
        System.out.println(Arrays.toString(arr2));
[1, 2, 3, 4]

引用的比较操作符理解

引用的比较操作符只有两种——!=和==,二者主要是比较引用是否相同,即指向的对象是否相同;
以下代码为例:
str和str1看似是代表两个字符串,但是这两个引用所指向的对象并没有改变,都是“123456”,所以两者的内容都是“123456”的地址,所以判断str == str1的时候输出的是true;
而需要输入的字符串str2所指向对象是next()返回的,而next()又是scanner引用所指向的对象中的方法,所以str和str2所指向的对象不一样,二者的存储的内容也是不一样;

        String str = "123456";
        String str1 = "123456";
        Scanner scanner = new Scanner(System.in);
        String str2 = scanner.next();
        System.out.println(str == str2);
        System.out.println(str == str1);
123456
false
true

引用操作符理解

C语言中常常出现的解引用符在Java中是不存在的,为了简化操作,Java把解引用给去掉了,只有在使用到的时候系统会自动解引用;那么什么时候会解引用呢?
“.”和“[ ]”就是系统自动解引用的操作符,我们称作引用操作符;
需要注意的是[ ]是数组所独有的方法,主要是为了获取数组下标元素;

        int[] arr = {1, 2, 3, 4};
        System.out.println(arr.length);
        System.out.println(arr[3]);
        System.out.println(Arrays.toString(arr));

每篇一题

public class Test {
    public static void main(String[] args) {
        String s1 = "runoob";
        String s2 = "runoob";
        System.out.println("s1 == s2 is:" + s1 == s2);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值