Java语言中的美化类

2022-08-31 10:47:31

标准 Java API 中的某些类的处理方式与其他类略有不同。我说的是那些没有编译器和/或JVM的特殊支持就无法实现的类。

我马上想到的是:

  • Object(显然)因为它,除其他外,没有一个超级类。
  • String因为该语言对 + 运算符有特殊支持。
  • Thread因为它有这个神奇的start()方法,尽管事实上没有字节码指令“分叉”执行。

我想所有像这样的类都在JLS中以某种方式被提及。如果我错了,请纠正我。

话说回来,还存在哪些其他这样的类呢?在Java语言中是否有任何完整的“美化类”列表?


答案 1

有很多不同的答案,所以我认为收集它们(并添加一些)会很有用:

  • 自动装箱类 - 编译器仅允许特定类
  • - 例如,有自己的文本(int.class)。我还会在不创建新实例的情况下添加其通用类型。
  • 字符串 - 具有重载的 +-运算符和对文本的支持
  • Enum - 唯一可以在 switch 语句中使用的类(很快也会向 String 授予特权)。它还可以做其他事情(自动静态方法创建,序列化处理等),但理论上可以用代码完成 - 它只是大量的样板,并且一些约束不能在子类中强制执行(例如特殊的子类规则),但是如果没有枚举的特权状态,您永远无法完成的就是将其包含在switch语句中。
  • 对象 - 所有对象的根(我会添加它的克隆和finize方法不是你可以实现的)
  • 引用:弱引用、软引用、幻像引用
  • Thread - 该语言不会给你一个特定的指令来启动一个线程,而是神奇地把它应用到start()方法。
  • Throwable - 可以使用 throw、throws 和 catch 的所有类的根,以及编译器对 Exception vs. RuntimeException 和 Error 的理解。
  • NullPointerException和其他异常,例如ArrayIndexOutOfBounds,它可以由athrow以外的其他字节码指令引发。

接口

  • 可迭代 - 唯一可用于增强型 for 循环的接口

荣誉奖颁发给:

  • java.lang.reflect.数组 - 无法创建由 Class 对象定义的新数组。
  • 附注它们是一种特殊的语言功能,在运行时的行为类似于接口。您当然不能定义另一个 Annotation 接口,就像您无法定义 Object 的替代接口一样。但是,您可以实现它们的所有功能,并且只需使用另一种方法来检索它们(以及一大堆样板文件),而不是反射。事实上,在引入注释之前,有许多基于XML和基于javadoc标签的实现。
  • ClassLoader - 它肯定与JVM有特权关系,因为没有语言方法来加载类,尽管有字节码方式,所以它就像数组一样。它还具有被 JVM 回调的特殊特权,尽管这是一个实现细节。
  • 可序列化 - 您可以通过反射实现该功能,但它有自己的特权关键字,在某些情况下,您将花费大量时间与SecurityManager亲密接触。

注意:我从列表中省略了提供JNI的东西(例如IO),因为如果您愿意,您始终可以实现自己的JNI调用。但是,以特权方式与 JVM 交互的本机调用是不同的。

数组是值得商榷的 - 它们继承了Object,具有可理解的层次结构(Object[]是String[]的超类型),但它们是一种语言特征,而不是它本身定义的类。


答案 2

Class答案是肯定的。它有自己的文字(它与 BTW 共享的区别),并且是所有反射魔法的起点。String


推荐