小编典典

为什么对象类方法在接口中可用?

java

以下接口和类已成功编译。 问题在下面的输出中提到:

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() {
        .......
        .......
              .......
    }

}

阅读 195

收藏
2020-11-30

共1个答案

小编典典

Java语言规范中指定了您正确指出的异常。接口将自动从类java.lang.Object中获取所有成员。从这里

Java语言规范明确指出,接口的成员是在接口中声明的成员和从直接超级接口继承的成员。如果接口没有直接的超级接口,则该接口会隐式声明一个与Object类中声明的每个公共实例方法相对应的公共抽象成员方法,除非具有相同签名,相同返回类型和兼容throws子句的方法由以下方式显式声明:该界面。这就是使Object方法的签名可供编译器使用的原因,并且代码编译时没有任何错误。请记住,如果接口试图在Object类中声明一个声明为“
final”的公共实例方法,那么它将导致编译时错误。例如,“ public final Class getClass()”

2020-11-30