JavaRush /Java 博客 /Random-ZH /Java 中的参考数据类型

Java 中的参考数据类型

已在 Random-ZH 群组中发布
不了解Java语法,就不可能成为一名认真的开发人员,所以今天我们继续学习语法。 在之前的一篇文章中我们讨论了原始变量,但是由于变量有两种类型,所以今天我们将讨论第二种类型——Java中的引用类型。那么它是什么?为什么 Java 中需要引用数据类型? Java 中的参考数据类型 - 1假设我们有一个具有某些特征的 TV 对象,例如频道号、音量和标志:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
像 , 这样的简单类型如何int存储这些数据?让我们记住:一个变量int是 4 个字节。但里面有两个相同类型的变量(4 字节 + 4 字节),还有boolean(+1 字节)...总计 - 4 到 9,但通常,对象中存储更多信息。该怎么办?您不能将对象放入变量中。在我们故事的这一点上,参考变量出现了。 引用变量存储特定对象所在的内存位置的地址。也就是说,这是一张带有地址的“名片”,通过它我们可以在共享内存中找到我们的对象并用它执行一些操作。Java 中任何对象的引用都是引用变量。这就是我们的 TV 对象的样子:
TV telly = new TV();
我们设置一个 TV 类型的变量,其名称telly是指向所创建的 TV 类型对象的链接。也就是说,JVM 在堆上为 TV 对象分配内存,创建它及其在内存中的位置地址,将其放入变量 中telly,该变量存储在堆栈中。您可以在本讲座中阅读有关内存的更多信息,即堆栈和许多其他有用的信息。TV类型的变量和TV类型的对象,你注意到了吗?这并不是没有道理的:某种类型的对象必须有相应的相同类型的变量(不包括继承和接口实现,但现在我们不考虑这一点)。毕竟,我们不会将汤倒入玻璃杯中,不是吗?事实证明,我们的对象是一台电视,它的引用变量就像一个控制面板。使用这个遥控器,我们可以与我们的对象及其数据进行交互。例如,设置我们电视的特征:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
这里我们使用点运算符.来访问并开始使用变量引用的对象的内部元素。例如,在第一行中,我们告诉变量telly:“给我们一个isOn您正在引用的对象的内部变量,并将其设置为 true”(为我们打开电视)。

重新定义参考变量

假设我们有两个引用类型的变量以及它们引用的对象:
TV firstTV = new TV();
TV secondTV = new TV();
如果我们写:
firstTV = secondTV;
这意味着我们将第一个变量作为地址副本(地址位的值)分配给第二个对象,现在两个变量都引用第二个对象(换句话说,两个遥控器用于同一对象)电视)。同时,第一个对象没有引用它的变量。结果,我们有一个无法访问的对象,因为该变量对于它来说是一个条件线程,没有它,它就会变成垃圾,只存在于内存中并占用空间。该对象随后将被垃圾收集器从内存中销毁。 Java 中的参考数据类型 - 2您可以中断与对象的连接线程,而无需另一个链接:
secondTV = null;
结果,将只有一个指向该对象的链接 - firstTV,并且secondTV将不再指向任何人(这并不妨碍我们将来为它分配一个指向某些对象(如电视)的链接)。

字符串类

另外,我想提一下String类。这是一个基类,设计用于存储和处理以字符串形式存储的数据。例子:
String text = new String("This TV is very loud");
这里我们传递了一个字符串来存储在对象的构造函数中。但没有人这样做。毕竟,可以创建字符串:
String text = "This TV is very loud";
方便多了,对吧?从使用流行度来看,String它并不逊色于原始类型,但它仍然是一个类,引用它的变量也不是原始类型,而是引用类型。我们String有连接字符串的奇妙能力:
String text = "This TV" + " is very loud";
结果,我们将再次获得文本:This TV is very loud,因为这两行将合并为一个整体,并且变量将引用此全文。一个重要的细微差别是String这是一个不可变的类。这是什么意思?让我们看这个例子:
String text = "This TV";
text = text + " is very loud";
看起来一切都很简单:我们声明一个变量,给它一个值。在下一行我们改变它。但我们并没有真正改变。由于这是一个不可变的类,因此第二行的初始值不会更改,但会创建一个新的值,该新值又包含第一个+ " is very loud".

参考常数

在有关基本类型的文章中,我们谈到了常量的主题。当我们将引用变量声明为final时,它会如何表现?
final TV telly = new TV();
您可能认为这将使对象变得不可变。但不,事实并非如此。 Java 中的参考数据类型 - 3带有修饰符的引用变量final将绑定到特定对象,而无法以任何方式解除绑定(重新定义它或将其等于null)。也就是说,设置这样一个变量的值后,代码如下:
telly = new TV();
或者
telly = null;
会导致编译错误。即final只作用于链接,对对象本身没有影响。如果我们最初让它可变,我们可以毫无问题地改变它的内部状态:
telly.soundVolume = 30;
有时,即使在方法参数中,变量也被指定为最终变量!
public void enableTV (final TV telly){
   telly.isOn = true;
}
这样做是为了在编写方法的过程中这些参数不能被覆盖,从而减少混乱。如果我们表示final一个引用不可变对象的引用变量怎么办?例如String
final String PASSWORD = "password";
结果,我们将得到一个常量,一个基本类型常量的类似物,因为在这里我们既不能重新定义引用,也不能改变对象的内部状态(内部数据)。

让我们总结一下

  1. 简单变量存储值位,而引用变量存储表示如何检索对象的位。
  2. 仅针对一种类型的对象声明对象引用。
  3. Java 中的任何类都是引用类型。
  4. Java 中任何引用变量的默认值为null
  5. String是引用类型的标准示例。这个类也是不可变的。
  6. 带有修饰符的引用变量final仅绑定到一个对象,无法重新定义。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION