Java语言中的美化课程

aio*_*obe 96 java

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

我马上提出的是:

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

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

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

Yis*_*hai 35

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

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

接口

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

值得一提的是:

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

注:我离开了名单的事情,提供JNI(如IO),因为你总是可以实现自己的JNI调用,如果你是这样的倾向.但是,以特权方式与JVM交互的本机调用是不同的.

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


Mic*_*rdt 19

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

  • @aioobe:确切地说.请注意,您还有int.class,char.class等. (4认同)

Dea*_*n J 13

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


Dar*_*ron 12

  1. 枚举.你不允许继承它,但编译器可以.
  2. java.util.concurrent下的许多东西都可以在没有JVM支持的情况下实现,但它们的效率要低得多.


Bil*_*ard 11

所有Number类都以Autoboxing的形式有点神奇.


Boz*_*zho 10

由于提到了重要的,我将提到一些接口:

Iterable(因为1.5)接口-它允许一个对象参与foreach循环:

Iterable<Foo> iterable = ...;
for (Foo foo : iterable) {

}
Run Code Online (Sandbox Code Playgroud)

Serializable接口有一个非常特殊的意义,从一个标准的接口不同.您可以定义将被考虑的方法,即使它们未在界面中定义(如readResolve()).该transient关键字是影响行为的语言元素Serializable实现者.

  • @Michael Borgwardt它有 - transient`关键字 (5认同)

emo*_*ory 6

  1. Throwable,RuntimeException,错误AssertionError
  2. 参考文献 WeakReference,SoftReference,PhantomReference
  3. 枚举
  4. 注解


Ale*_*yak 6

Java数组如 int[].class