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

Java 为什么对象类方法在接口中可用?,java,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{

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

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

瞧,我的界面是一个界面

那个么为什么编译器允许编译

mi.getClass(),mi.wait()

或者对象类的方法在接口中的可用性

Y


已编辑:- 我接受否认的回答,因为这是最具解释性的。但在阅读了答案之后,又出现了一个问题:-

请记住,如果接口试图在对象类中声明一个声明为'final'的公共实例方法,那么它将导致编译时错误。例如,'public final class getClass()'是在对象类中声明为'final'的公共实例方法,因此,如果接口尝试声明具有此签名的方法,则编译将失败。(引自解释)

那么为什么要成功编译以下代码:-

interface MyInter{
    public void method() ;
}

class MyClass implements MyInter{

    public final void method() {
        .......
        .......
              .......
    }

}

在运行时,引用mi后面应该有一个真实对象(或null)。实际类型将实现此接口,因此编译器允许它。在运行时,实现该接口的任何类型都可能存在。

是的,除了原语值之外,所有对象的方法都可用。接口对象仍然是对象,因此它们有对象的方法。

您正确指出的异常在Java语言规范中指定。接口将自动从添加的类java.lang.Object中获取所有成员。发件人:


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


cast(Object)mi总是成功的,那么为什么需要您提供它呢?

Java语言规范明确指出,接口的成员是在接口中声明的成员,以及从直接超级接口继承的成员。如果接口没有直接superinterface,则该接口隐式声明一个公共抽象成员方法,该方法对应于对象类中声明的每个公共实例方法,除非该接口显式声明了一个具有相同签名、相同返回类型和兼容throws子句的方法。

给定接口类型,如果是实现该接口的具体类型,并且是对该具体类型实例的接口引用,则编译器不允许您对接口中未指定的具体实例调用方法。此外,对象方法根本不是任何(显式)接口的一部分。接口实例不是对象,它们只委托对象的公共方法。接口实例必须是对象。除原语值之外的所有数据都是对象。创建实例时,需要从类创建实例(尽管如此,使用接口变量保存它)。要创建实现对象的类,该类必须继承某些内容(如果未指定,则该类将继承对象)。这意味着每个实例(包括由接口变量持有的实例)都是Object.TYPO:“要创建实现对象的类,”=>“要创建实现接口的类,”:-预告我在第一篇文章中提到的文章。接口不是对象。它与语言的关系更为复杂(考虑invokevirtual等人)。你确定上述内容吗?当我在Eclipse中尝试此操作时,我得到一个错误,即变量mi可能尚未初始化。此外,引发异常的不是wait()调用。它是synchronized(mi)。至于您的附加语句,它当然是编译的,因为method
method
只是接口中声明的实现。JLS语句所谈论的是在
对象
类本身上声明的方法。除了当前接受的答案(正确地定义了引号的属性)之外,这还有什么贡献?