每篇一题答案
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);
}
}