实际上,Java期望一个对象用于输入和输出的大部分语义,无论是基本类型还是实际对象,排除类型名称,参数列表和返回类型等类元数据
本质上是一种OOP语言,无论是否所有内容都作为对象存储在内存中,所有内容都被视为一个对象
所以,我想知道,制作中的ReferenceType是什么类型的对象RelationalExpression (instanceof)?
例如,在以下表达式中:
object instanceof ReferenceType
我想知道ReferenceType
是否是实际对象,如果没有,JVM如何根据JVM规范将其表示为字节码以及它如何运作?
答案 0 :(得分:2)
实际上,Java期望输入和输出的对象 的一切,
嗯,不,这是夸大其词。即使我们排除诸如标点符号和关键字之类的语法元素,Java也具有基本类型的值。它有类型名称。
并且,本质上是一种OOP语言,一切都是 被视为对象,
你快乐地抛出“一切”这个词,让自己陷入困境。我认为你试图断言,在OO语言中,所有数据都在对象内部表示。至少那是我能够达到的最接近合理的解释,事实上它对某些OO语言(SmallTalk,Ruby,......)都是正确的 - 但不是Java。
所以我想知道,是什么类型的对象 生产中的ReferenceType,RelationalExpression(instanceof)?
这不是一个对象。这是一个类型名称。
它在运行时如何在JVM中表示?
我必须检查以确定,但很可能它是由对表达式出现的类的常量池的引用表示的。
什么样的对象可以 如果通常使用类型,则传递给此表达式(如果有) 声明如类声明符或变量声明符?
instanceof
表达式的右侧操作数是类型名称,实际上,它在类和变量声明符中使用。它既不是参考值也不是原始类型的值。
是的吗? 一个“元对象”,只代表一个真实的类型或类,
Java语言没有“元对象”的概念,至少与java.lang.Class
类型的对象不同。但是Class
类型的对象仍然是对象,对它们的引用不适合用作instanceof
表达式的右手操作数。右侧操作数必须是类型名称。
为什么 Java的开发人员是否不允许传递Class对象 一个ReferenceType,或者我在想错误的范例 的instanceof?
我不能权威地谈论Java设计师的动机,而不是其中之一。但是,我确实观察到,自Java 1.1以来可用的Class.isInstance()
用于允许引用Class
作为instanceof
表达式的右手操作数的目的。
instanceof
的右侧操作数必须是类型名称。
答案 1 :(得分:1)
ReferenceType是一个符号引用。根据Java虚拟机规范(Java 10),instanceof
具有相应的instanceof indexbyte1 indexbyte2
指令。可以将两个索引字节构造为一个32位(无符号)整数,该整数是当前类的运行时常量池的索引。
从操作数堆栈中弹出必须为引用类型的objectref。无符号的indexbyte1和indexbyte2用于在当前类的运行时常量池(第2.6节)中构造一个索引,其中索引的值为(indexbyte1 << 8)| | | | | | | | |。索引字节2。索引处的运行时常量池项必须是对类,数组或接口类型的符号引用。
其中objectref是instanceof
表达式中的左侧对象引用。
如果objectref不为null,则解析符号引用,并根据解析的类型评估objectref的类型,以确定objectref是否为ReferenceType的实例:
如果objectref为null,则instanceof指令将推入int结果 0作为操作数堆栈上的int。
否则,将解析命名的类,数组或接口类型 (第5.4.3.1节)。如果objectref是已解析的类或数组的实例 输入或实现解析的接口instanceof指令 将int结果1作为int推入操作数堆栈;除此以外, 它将int结果推为0。