值与对象

我们以前知道String是一种数据类型,其实不然,String实际上是Java里面内置的一个类。也就是是Java帮我们定义好的一个类,里面同样有属性,有方法,我们可以直接调用。在实际使用过程中,值与对象又是不一样的,今天就来了解一下。

 

一个小实验

我们都知道,赋值是将右边的值赋予给左边的变量,而==比较则是比较两边的值是否相同,那我们现在进行以下尝试:

我们已经知道String是一个类了,那么根据这个类我们可以直接套用模板创建一个str对象了,如下:

我们使用==比较符号,str和str1都是"Hello"字符串,猜猜输出结果会是什么?

1541037825736

它俩明明一样啊,难道是我的计算机坏了?我们再尝试用String类的equals方法(更多方法会在下一章讲解)进行比较:

输出结果为:

1541037970185

现在就说一下原理。Java变量类型的前8种类型称为“值类型”,除了这8种以外我们都称之为“引用类型”。对于多个值,我们在进行比较的时候,是比较它的内容是否相同,而对于多个对象,是在比较它的地址是否相同。我们刚刚使用了new关键字新建了一个对象,相当于在内存中开辟了一块新的存储空间,所以str和str1的位置是不同的,所以返回false。

实际生活中的例子:你有一个苹果,我有一个苹果,值的判断是我们两个的是不是都是红色的苹果,所以返回true,而对象的判断,则是判断我们两个是不是同一个苹果,不是,所以返回false。

 

数据的传递

说完了双等于比较符号,现在看看单个等于号赋值符号。赋值的时候也是相同道理,对象进行赋值的时候是将地址赋予给左边的对象,而值的赋值则是将内容赋予给左边的变量。这样的结果是:引用类型的赋值完成后,被赋值的对象将会随着赋予别人值对象的变化而变化。

生活中的实例:现在有一箱(2×2分布)苹果,值的赋值过程是把我的苹果(1,1)复制一个,放到你的位置处(1,2),原来在(1,2)这个位置的苹果就不要了,当我咬了(1,1)的苹果一口,(1,2)的苹果还是完好无损,不受影响;而引用类型的赋值过程是把我的苹果的位置(1,1)告诉你,让你去找这个苹果,就说这个苹果是你的了,当我咬了一口(1,1)的苹果时,你会看到你的苹果也被咬了一口,因为实际上我们俩的是同一个苹果。

这就是Java中的引用传递,也就相当于C语言里面的指针。