Java JVM的引用类型

Java JVM的引用类型,java,jvm,Java,Jvm,在一些Java文献中,语句 Java虚拟机的引用类型 机器被巧妙地命名为 参考文献 它广受欢迎。然而,作者倾向于不解释为什么这种说法是有效的。另一件能让我更明白这一点的事情是 JVM的引用类型意味着什么?JVM是否在堆中表示自己 如果您能解释一下这句话,我将不胜感激 谢谢, Ashmawy将整个段落置于上下文中时,这一点变得更加清晰: Java虚拟机的引用类型被巧妙地命名为reference。类型引用的值有三种类型:类类型、接口类型和数组类型。这三种类型的值都是对动态创建的对象的引用。类类型的值

在一些Java文献中,语句

Java虚拟机的引用类型 机器被巧妙地命名为 参考文献

它广受欢迎。然而,作者倾向于不解释为什么这种说法是有效的。另一件能让我更明白这一点的事情是

JVM的引用类型意味着什么?JVM是否在堆中表示自己

如果您能解释一下这句话,我将不胜感激

谢谢,


Ashmawy

将整个段落置于上下文中时,这一点变得更加清晰:

Java虚拟机的引用类型被巧妙地命名为reference。类型引用的值有三种类型:类类型、接口类型和数组类型。这三种类型的值都是对动态创建的对象的引用。类类型的值是对类实例的引用。数组类型的值是对数组的引用,数组是Java虚拟机中成熟的对象。接口类型的值是对实现接口的类实例的引用。另一个引用值是null值,它表示引用变量不引用任何对象

(摘自)


我假设“巧妙命名”位指的是这样一个事实,即引用有三种不同的类型,JVM可以区分每种类型。

我认为
巧妙地
部分涉及到这样一个事实,即引用类型通常被称为
指针,这就需要读者学习两个术语。JVM术语只是使用术语
reference
来表示这一点

还有一个历史背景

引入Java时,最大的竞争对手是C++。C++的主要问题是它被认为太难了。java最初定位为C++的简单替代。它有一个非常接近C++的语法,但是所有的困难的东西(操作符重载,模板,多个传递机制)等都被从语言中删除。 而现在,问题来了

Java最初以的形式销售,没有指针。之所以说这是因为指针被认为是C++最难的东西,所以如果java没有这些指针,它必须是一种更简单的语言。 因此,聪明的部分来自于简单地为“指针”发明另一个术语。将它们称为reference,您可以声明Java没有指针(而是引用)

<>这引起了很多争论,引起了很多混乱,特别是因为C++已经有了“引用”一词,并用它来做其他事情(虽然概念上有点关联)。争论通常围绕着两个阵营展开,其中一个阵营声称Java确实没有指针,因为你不能用它们做指针运算,它们也不能直接表示内存地址,而另一个阵营则声称你不必用指针做算术,就可以称它为指针


换言之,使用
参考
一词是否明智仍有待商榷。

您在这里寻找的词是:

用词表达与其字面意思相反的意思


在那句话中使用“聪明”显然具有讽刺意味。“Java虚拟机的引用类型被赋予了一个明显而愚蠢的名称‘reference’”,这是另一种解读这句话的方式。

或者,这可能是表示JVM设计者在内存管理方面采取的不同方法的唯一概念

若您还记得,在C/C++中,您可以自由地在本地堆栈或全局堆中为变量分配内存。C++在方法的本地堆栈中为对象分配内存,然后将整个对象作为参数传递给其他方法是可能的。 Java设计师剥夺了开发人员的这种自由。您不能在本地堆栈中创建对象,只能在全局堆中创建对象。因此,Class/Interface/Array类型的每个变量实际上都是对堆中某个内存地址的引用。并且不能仅通过引用按值传递对象


如果你没有选择,你甚至不需要考虑你有什么类型的变量-值类型还是引用类型。

好吧,是的,下面的子类别引用类型(类、接口、数组)的泛化是显而易见的。但在该语句中使用“聪明”一词会自动触发这样一种假设,即JVM引用被命名为reference是一个更微妙(不是那么明显)的潜在原因,因为它的指针没有命名。但事实就是这样。这并不聪明,因为与C语言的连接已经很清楚了。如果你不考虑在Java中处理的是值还是引用类型,请永远不要让你的Java代码用于人们依赖的任何东西。引用通常只在语言中称为指针(hello C!)这并不能区分两者。引用通常被实现为指针,是的,但它们通常不被称为指针,除非您使用的是缺乏区分能力的贫乏语言。