Java 没有方法的接口

Java 没有方法的接口,java,class,interface,java-native-interface,Java,Class,Interface,Java Native Interface,为什么Java引入了一些没有定义方法的接口?例如Cloneable,Serializable,Type等等 第二件事:在Class.Class包中,有一个方法定义为registerNatives(),没有主体,从静态块调用,但是Class.Class不是抽象的,而是final。为什么会这样? 为什么Java需要从静态块调用一些没有主体的方法 为什么Java引入了一些没有定义方法的接口 这就是所谓的。它们不用于任何用途或操作。这些方法用于标记或标记类。这样您就可以确定某个类是否是这些类的子类 关于

为什么Java引入了一些没有定义方法的接口?例如
Cloneable
Serializable
Type
等等

第二件事:在
Class.Class
包中,有一个方法定义为
registerNatives()
,没有主体,从静态块调用,但是
Class.Class
不是抽象的,而是
final
。为什么会这样? 为什么Java需要从静态块调用一些没有主体的方法

为什么Java引入了一些没有定义方法的接口

这就是所谓的。它们不用于任何用途或操作。这些方法用于标记或标记类。这样您就可以确定某个类是否是这些类的子类

关于第二个问题

如果你仔细看,你会发现声明是正确的

 private static native void registerNatives();
因此,
registerNatives
是一种本地方法

那么什么是原生方法呢。如果你看到

该方法在“本机”代码中实现。也就是说,代码 不在JVM中运行。它通常用C或C++编写。 本机方法通常用于与系统调用或 用其他编程语言编写的库


因此,这些方法是从本机代码加载的。因此,您不需要声明方法体,但它们仍然不是抽象的,因为它们是从本机代码实现的

标记接口用作标记,向java编译器通知消息,以便它可以向实现它的类添加特殊行为。Java标记接口中没有成员

标记接口的目的是通过向实现标记接口的类提供一些功能来强制类中的某种功能

阅读并参见

本机方法在JVM本身中实现。


这是从静态块调用的,因为我们需要在加载类时调用此方法,而不是在创建实例时调用此方法。

对于第一个方法,您实际上需要一个标记接口。标记接口在设计上不应该向行为添加任何内容,而只支持对象的多态转换。e、 Serializable使对象能够跨JVM边界进行流式处理。标记接口遵循“通用类型替换”理念

对于第二个,您实际上是在请求JNI。Java并不是以Java形式实现其所有代码。我的意思是在遵循Java语法的类和代码中。有时,您需要深入到本机平台API以实现该API的某些功能。e、 g.套接字和TCP通信。正是Java的这一特性使其真正独立于平台。JVM运行时依赖于平台,因为它使用基于平台的本机方法和dll或.so库来实现并与平台集成。作为程序员,我们称之为高级Java SDK API调用。

Java编程语言的“干净”特性之一是,它要求在接口(纯行为)和类(状态和行为)之间进行分离。接口在Java中用于指定派生类的行为。 您经常会遇到Java中没有行为的接口。换句话说,它们只是空的接口定义。这些被称为标记接口。Java API中的一些标记接口示例包括:

  • java.lang.Cloneable
  • java.io.Serializable
  • java.util.EventListener
标记接口也称为“标记”接口,因为它们根据用途将所有派生类标记到一个类别中。例如,可以克隆实现可克隆接口的所有类(即,可以对它们调用clone()方法)。Java编译器检查以确保是否对类调用了clone()方法,并且该类实现了可克隆接口。例如,考虑对对象O:

调用CURONE()方法的以下调用
SomeObject o = new SomeObject();
SomeObject ref = (SomeObject)(o.clone());

如果类SomeObject未实现接口Cloneable(并且Cloneable未由SomeObject继承的任何超类实现),编译器将此行标记为错误。这是因为clone()方法只能由“Cloneable”类型的对象调用。因此,即使Cloneable是一个空接口,它也有一个重要的用途。

请将这两个问题列为两个问题!这个问题不是重复的。但答案是:第二个问题不应该跟着提。是的,我明白。但第二个问题呢?我明白你们关于标记接口的观点了,但第二个问题呢?这个问题可能会帮助你们对标记接口有一个清晰的认识,并感谢你们的帮助。谢谢
Why Java need some method without body to be called from static block.?
SomeObject o = new SomeObject();
SomeObject ref = (SomeObject)(o.clone());