为什么标记或标记的表面由JVM专门处理

时间:2012-11-20 06:45:32

标签: java interface

我有一个问题,我在谷歌搜索,得到了很多答案。我不确定哪个是真的。 请任何人解释一下。为什么标记的界面是由JVM专门打印的? 例: 让我们采取序列化的interfeace,其中没有任何方法,但stil JVM不会抛出任何编译时异常。 JVM如何处理这种类型的接口,当我们实现标记接口时会发生什么。

感谢。

4 个答案:

答案 0 :(得分:3)

他们对jvm没什么特别的。不需要接口来定义任何方法。想象一个实现空接口的类,就像将类标记为特定类型一样,您可以在运行时使用instanceof轻松检查。

除了这种类型信息外,它还可用于强调类的高级方面,或快速识别具有特定属性的类(通过人工和自动化工具或IDE)。

答案 1 :(得分:1)

在大多数情况下,“marker”接口是开发人员和他们编写的库之间的区别,而不是JVM。

  

为什么标记的界面是由JVM专门打印的?

没有。没有方法的接口没有特殊行为。这些接口由图书馆设计人员专门用于特定目的。

  

示例:让我们采取其中没有任何方法的可序列化的interfeace,但是stil JVM不会抛出任何编译时异常。

后者暗示JVM不了解Serializable接口的特殊行为。而是ObjectInputStream / ObjectOutputSTream 检查的东西,而不是更多。其他序列化库可能会也可能不会对此接口执行某些操作。例如XStream忽略了它。

  

JVM如何处理这种接口,当我们实现标记接口时会发生什么。

关于Serializable的唯一特别之处是JVM知道内置数组类型是否是Serializable,例如。

System.out.println(new byte[0] instanceof Serializable); // is true

这只能起作用,因为JVM知道这种类型应该是Serializable,因为它没有在任何类中定义。这是一种特殊情况,不适用于其他标记接口。

答案 2 :(得分:0)

如果接口没有方法,我没有看到为什么jvm抛出异常的原因。 标记接口允许特定于类型的实现 - 您可以执行(实例)检查并执行特定于标记接口类型的自定义。 JVM必须做类似的事情。

然而,

Annotation(post java 5)是标记接口的更好选择。

答案 3 :(得分:0)

  

为什么标记或标记接口由JVM专门处理

他们不是。我不知道'标记'是什么意思,但它没有任何区别。

  

为什么标记的界面是由JVM专门打印的?

不是。

  

示例:让我们采取其中没有任何方法的可序列化的interfeace,但是stil JVM不会抛出任何编译时异常。

除非你有一个错误的编译器,否则没有编译时异常。我自1997年以来从未见过。如果您指的是编译错误,它们是打印,而不是抛出 Java编译器,而不是JVM。如果你问为什么没有为不包含任何方法的接口打印编译错误,原因是它是合法的Java代码:检查Java语言规范。

  

JVM如何处理这种接口<​​/ p>

与任何其他界面相同。

  

当我们实施标记接口时会发生什么。

与任何其他界面相同,但我不知道'标记'是什么意思。

如果您在所有这些混乱中提出的问题是“Serializable界面如何运作”?答案是ObjectOutputStream类通过ObjectOutputStream.writeObject()运算符检查传递给Serializable的任何对象是否为实现instanceof的类。而已。没有编译器或JVM的处理,只是你自己编写的完全相同的代码。