[英]Interface with no methods
为什么Java引入了一些没有定义方法的接口? 例如Cloneable
, Serializable
, Type
等等。
第二件事:在Class.class
包中有一个方法定义了registerNatives()
没有body,从静态块调用,但Class.class
不是抽象的,而是final
。 为什么这样? 为什么Java需要一些没有body的方法来从静态块中调用。
为什么Java引入了一些没有定义方法的接口?
这称为标记或标记接口 。 这些不用于任何用途或操作。 这些方法用于标记或标记类。 这样您就可以确定某些类是否是这些类的子类。
关于第二个问题
仔细观察,您可以看到声明
private static native void registerNatives();
所以registerNatives
是一种原生方法。
那么什么是原生方法。 如果你看到这样的问题
该方法以“本机”代码实现。 也就是说,代码不能在JVM中运行。 它通常用C或C ++编写。
本机方法通常用于与系统调用或用其他编程语言编写的库进行交互。
所以这些方法是从本机代码加载的。 因此,您不需要声明方法的主体,但它们仍然不是抽象的,因为它们是从本机代码实现的。
标记接口用作标记以将消息通知给java编译器,以便它可以向实现它的类添加特殊行为。 Java标记接口中没有成员。
Marker接口的目的是通过在类实现标记接口时为类提供某些功能来强制类中的某种功能。
对于第一个,您实际上要求标记接口。 标记接口在设计上不应该向行为添加任何内容,而只支持对象的多态转换。 例如,Serializable使对象能够跨JVM边界进行流式传输。 标记接口遵循“通用类型替换”理念。
对于第二个,你实际上是在要求JNI。 Java不会以Java形式实现其所有代码。 我的意思是遵循Java语法的类和代码。 您需要深入了解本机平台API以实现该API的某些时间。 例如套接字和TCP通信。 Java的这个特性实际上使它与平台无关。 JVM运行时依赖于平台,因为它使用基于平台的本机方法和dll或.so库来实现和集成平台。 我们作为程序员调用高级Java SDK API调用。
registerNatives()
本机方法在JVM本身中实现。 registerNatives()方法有什么作用?
Why Java need some method without body to be called from static block.?
这是从静态块调用的,因为我们需要在加载类时调用此方法,而不是在创建实例时调用此方法。
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是一个空接口,它也是一个重要的目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.