为什么Java引入了一些没有定义方法的接口?例如Cloneable
,Serializable
,Type
等等。
第二件事:在Class.class
包中,有一个方法定义registerNatives()
没有正文,并且从静态块调用,但Class.class
不是抽象的,而是final
。为什么这样?
为什么Java需要一些没有body的方法来从静态块调用。?
答案 0 :(得分:11)
为什么Java引入了一些没有定义方法的接口?
这称为Tagged or Marker interface。这些不用于任何用途或操作。这些方法用于标记或标记类。这样你就可以确定someclass是否是这些类的子类。
关于第二个问题
如果仔细观察,可以看到声明
private static native void registerNatives();
所以registerNatives
是一种原生方法。
那么什么是原生方法。如果您看到this so question
该方法以“本机”代码实现。也就是说,代码可以 不能在JVM中运行。它通常用C或C ++编写。
本机方法通常用于与系统调用或 用其他编程语言编写的库。
因此这些方法是从本机代码加载的。因此,您不需要声明方法的主体,但它们仍然不是抽象的,因为它们是从本机代码实现的。
答案 1 :(得分:8)
标记接口用作标记,以便将消息通知给java编译器,以便它可以向实现它的类添加特殊行为。 Java标记接口中没有成员。
标记接口的目的是通过在类实现标记接口时为类提供某些功能来强制类中的某种功能。
阅读Java Marker Interface也请参阅What is the use of marker interfaces in Java?
答案 2 :(得分:2)
对于第一个,您实际上是在寻求标记界面。标记接口在设计上不应该向行为添加任何内容,而只支持对象的多态转换。例如Serializable使对象能够跨JVM边界进行流式传输。标记接口遵循“通用类型替换”理念。
对于第二个,你实际上是在要求JNI。 Java不会以Java形式实现其所有代码。我的意思是遵循Java语法的类和代码。您需要深入了解本机平台API以实现该API的某些时间。例如套接字和TCP通信。 Java的这个特性实际上使它与平台无关。 JVM运行时依赖于平台,因为它使用基于平台的本机方法和dll或.so库来实现和集成平台。我们作为程序员调用高级Java SDK API调用。
答案 3 :(得分:0)
registerNatives()
本机方法在JVM本身中实现。 What does the registerNatives() method do?
Why Java need some method without body to be called from static block.?
这是从静态块调用的,因为我们需要在加载类时调用此方法,而不是在创建实例时调用此方法。
答案 4 :(得分:0)
Java编程语言的一个“干净”特性是它要求在接口(纯行为)和类(状态和行为)之间进行分离。接口在Java中用于指定派生类的行为。 通常,您会遇到没有行为的Java接口。换句话说,它们只是空接口定义。这些被称为标记接口。 Java API中的标记接口的一些示例包括:
标记接口也称为“标记”接口,因为它们根据其目的将所有派生类标记为类别。例如,可以克隆实现Cloneable接口的所有类(即,可以在它们上调用clone()方法)。 Java编译器检查以确保在类上调用clone()方法并且该类实现Cloneable接口。例如,考虑在对象o:
上调用clone()方法SomeObject o = new SomeObject();
SomeObject ref = (SomeObject)(o.clone());
如果类SomeObject没有实现Cloneable接口(并且Cloneable不是由SomeObject继承的任何超类实现的),则编译器会将此行标记为错误。这是因为clone()方法只能由“Cloneable”类型的对象调用。因此,即使Cloneable是一个空接口,它也有一个重要的用途。