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())); 
        }
    }