问题

标准Java API中的某些类与其他类略有不同。我在谈论那些在没有编译器和/或JVM的特殊支持的情况下无法实现的类。

我马上提出的是:

  • 对象(显然),因为它,除了其他东西没有超类。
  • 字符串作为语言对运营商的特殊支持。
  • 线程,因为它有这个神奇的start()方法,尽管事实上没有字节码指令"分叉"执行。

我想这些类似于JLS中提到的所有类都是这样或那样的。如我错了请纠正我。

无论如何,还有其他类似的课程吗? Java语言中是否有完整的"荣耀类"列表?


#1 热门回答(35 赞)

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

##类

  • AutoBoxing类 - 编译器只允许特定的类
  • Class - 有自己的文字(例如int.class)。我还会在不创建新实例的情况下添加其泛型类型。
  • 字符串 - 它的重载 - 操作符和文字的支持
  • 枚举 - 可以在switch语句中使用的唯一类(很快也会赋予String特权)。它还做其他事情(自动静态方法创建,序列化处理等),但理论上这些可以用代码完成 - 它只是很多样板,并且一些约束不能在子类中强制执行(例如特殊的子类化规则)但是如果没有枚举的特权状态你永远无法实现的是将它包含在switch语句中。
  • 对象 - 所有对象的根(我会添加它的克隆和终结方法不是你可以实现的东西)
  • 参考文献:WeakReference,SoftReference,PhantomReference
  • 线程 - 该语言没有给你一个启动线程的特定指令,而是神奇地将它应用于start()方法。
  • Throwable - 可以使用throw,throws和catch的所有类的根,以及编译器对Exception与RuntimeException和Error的理解。
  • NullPointerException和其他异常,例如ArrayIndexOutOfBounds,它们可以被其他字节码指令抛出而不是被抛出。

##接口

  • Iterable - 唯一可用于增强for循环的接口

###尊敬的提及:

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

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

数组是有争议的 - 它们继承了Object,具有理解的层次结构(Object []是String []的超类型),但它们是语言特性,而不是自己定义的类。


#2 热门回答(19 赞)

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


#3 热门回答(13 赞)

sun.misc.unsafe是所有肮脏,精神破坏的黑客攻击的母亲。


原文链接