java数组的继承_java – 从JVM的角度来看,从原始数组继承是不可能的?

Could it be implemented in the JVM without too many changes?

不,这些变化将是巨大的.它们会影响整个Java工具链,也会影响JLS / JVM抽象层或其下方的大量第三方代码.

没有什么可以阻止您下载(OpenJDK)源代码并尝试自己做这个实验.但真正Java中发生这种情况的可能性很小(IMO).

我在最底层列出了一些技术问题.我确信还有其他人.

Does the JVM treats arrays like any object with a class that can be inherited from?

没有.

Java中的数组类型提供了少量方法. (方法是getClass,hashCode,toString,clone,wait,notify和notifyAll …根据Object API.)

据我所知,这些方法的实际实现是由java.lang.Object定义的本机方法提供的.但由于JLS不允许您编写从数组继承的代码,因此JVM规范不需要提供实现此类代码的方法.而且,在实践中,它没有.

Does the JVM treats arrays like enums, ie, making the array objects inherit automatically from a defined array class?

否.数组类型隐式继承自java.lang.Object.

Is the array class defined somewhere in such a way that it could be inherited from?

没有这样的类.数组类型隐式继承自Object.

在JVM规范级别,使阵列更像“类似”有几个主要障碍:

>数组类型(“[elem-type”)的“类型字符串”表示仅提及该元素.实际的数组类型没有名称,如果是,那么“Lname;”表示这是一个常规类,而不是数组类型.

>数组由特殊的JVM指令创建,这些指令将元素类型提供为操作数而不是数组类型.

除此之外,JVM实现将假设数组如何工作以便有效地实现它们.即使(根据JLS)理论上似乎可以使用invoke指令来调用数组上的非标准方法,JVM解释器或JIT编译器也不知道该怎么做…即使你不知何故设法通过类加载器和验证器潜行调用.

一旦你越过那个,那么就存在这样的问题,即如果数组可以用用户定义的超类声明,那么那些超类(可能)将能够拥有实例变量.但这意味着JVM规范需要改变,以便:

>数组的堆节点可以包含实例变量以及数组本身,

>常规字段加载和存储指令适用于数组对象以及reculare对象,

>依此类推.

正如您所看到的,这个“小扩展”在JVM中揭示了许多其他设计决策.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值