以下接口和类已成功编译。 问题在下面的输出中提到:
interface MyInterface{} class MyClass implements MyInterface{} class InterDoubt{ static MyInterface mi ;//= new MyClass() ; public static void main(String[] args){ System.out.println("X") ; try{ synchronized(mi){ try{ mi.wait(4000) ; } catch(InterruptedException ie){ System.out.println("Exception occured at main.") ; } } } catch(Exception e){ System.out.println("voilla, MyInterface is an interface,\n" + "then why compiler allows compilation of\n" + "mi.getClass(), mi.wait().\n" + "Or how the methods of Object class are available in an interface." ); } System.out.println("Y") ; } }
输出:
X
瞧,MyInterface是一个接口,
那为什么编译器允许编译
mi.getClass(),mi.wait()。
或如何在接口中使用Object类的方法。
ÿ
编辑 :-我接受拒绝的答案,因为这是最具解释性的。但是在阅读了答案之后,又出现了一个问题:-
“ 请记住,如果接口试图在Object类中声明一个声明为’final’的公共实例方法,那么它将导致编译时错误。例如,’public final Class getClass()’是一个声明为’最终”在Object类中,因此,如果接口尝试使用此签名声明方法,则编译将失败 (引自解释)。
那么为什么下面的代码被成功编译:-
interface MyInter{ public void method() ; } class MyClass implements MyInter{ public final void method() { ....... ....... ....... } }
Java语言规范中指定了您正确指出的异常。接口将自动从类java.lang.Object中获取所有成员。从这里:
Java语言规范明确指出,接口的成员是在接口中声明的成员和从直接超级接口继承的成员。如果接口没有直接的超级接口,则该接口会隐式声明一个与Object类中声明的每个公共实例方法相对应的公共抽象成员方法,除非具有相同签名,相同返回类型和兼容throws子句的方法由以下方式显式声明:该界面。这就是使Object方法的签名可供编译器使用的原因,并且代码编译时没有任何错误。请记住,如果接口试图在Object类中声明一个声明为“ final”的公共实例方法,那么它将导致编译时错误。例如,“ public final Class getClass()”