Java isAbstract()修饰符返回不正确的结果-为什么?
据我所知,以下代码应打印为输出Java isAbstract()修饰符返回不正确的结果-为什么?,java,arrays,core,modifier,Java,Arrays,Core,Modifier,据我所知,以下代码应打印为输出False 但是,当我运行这段代码时,它将True打印为输出 来自Java文档: 如果整数参数包含抽象修饰符,则返回true, 否则就错了 有人能帮我理解这种行为吗?在JLS中可以找到这种行为的提示: 每个数组都有一个关联的类对象,与具有相同组件类型的所有其他数组共享 尽管数组类型不是类,但每个数组的class对象的行为就像:[被剪断] 根据这种推理,数组不是一个“真实”的类,因此它肯定不是一个具体的类。同样的逻辑也适用于被认为是抽象的int.class。我的解释是
False
但是,当我运行这段代码时,它将True
打印为输出
来自Java文档:
如果整数参数包含抽象修饰符,则返回true,
否则就错了
有人能帮我理解这种行为吗?在JLS中可以找到这种行为的提示: 每个数组都有一个关联的类对象,与具有相同组件类型的所有其他数组共享 尽管数组类型不是类,但每个数组的class对象的行为就像:[被剪断]
根据这种推理,数组不是一个“真实”的类,因此它肯定不是一个具体的类。同样的逻辑也适用于被认为是抽象的
int.class
。我的解释是,数组被认为是抽象的,因为数组是由JVM本身实例化的
任何数组类型都不存在具体的类
阵列具有以下属性:
Cloneable
和Serializable
final
修饰符要求为true
,接口
修饰符要求为false
)另一方面,它没有指定数组类型的抽象
或静态
修饰符应该是什么,这意味着返回真
或假
的决定没有记录在JDK中。因此,任何实现都可以选择返回真
或假
int java.lang.Class.getModifiers()
返回此类或接口的Java语言修饰符,用整数编码。修饰符由Java虚拟机的公用、受保护、专用、最终、静态、抽象和接口常量组成;应使用类修饰符的方法对其进行解码
如果基础类是数组类,则其公共、私有和受保护的修饰符与其组件类型的修饰符相同。如果此类表示基元类型或void,则其公共修饰符始终为true,而其受保护和私有修饰符始终为false。如果此对象表示数组类s,一个基元类型或void,则其最终修饰符始终为true,其接口修饰符始终为false其其他修饰符的值不由本规范确定。
修改器编码在Java虚拟机规范表4.1中定义
根据我对is的java语言规范的理解: 如果基础类是数组类,那么它的公共、私有 和受保护的修改器与其组件类型的修改器相同。 如果此类表示基元类型或void,则其公共修饰符 始终为true,并且其受保护和私有修饰符始终为true 假的 现在,它的其他修饰符的值不由本规范确定,例如,ABSTRACT 来自JVM表4.1-A: ACC_ABSTRACT 0x0400声明的抽象;不得实例化。的定义说明: 抽象类是不完整或被认为不完整的类 如果有像
[]
这样的纯数组,那么它确实是不完整的,因为没有提供组件类型
这将违反以下规范:
如果ClassOrInterfaceType不表示
可偿还的类型
它不仅表示一个可修改的类型,而且根本没有类型。因此,创建[]
的实例是不可能的,就像创建抽象类一样
由于没有纯数组
[]
,这只是一种推测。此外,为字节[]返回了修饰符
。它仍然是所示的规范。是的,那么它应该注意返回true,它应该是false。有趣的发现…我可以确认这对于每个数组类型都是正确的,包括多维数组。对此的最佳解释是数组类是抽象的,因为字节[]
实例不是由公共类byte[]
类定义的,与其他类不同。我不知道我现在说的是什么xD公共抽象最终版
?很有趣。对于那些挖掘出实际规范并向我指出我还不知道的事情的人,总是+1。
public class Test{
public static void main(String[] args) {
System.out.println(Modifier.isAbstract(byte[].class.getModifiers()));
}
}