当前位置: 首页 > 面试题库 >

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

富勇军
2023-03-14
问题内容

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

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()”



 类似资料:
  • 我知道这是一个很基本的问题,但一个面试官用一种很诡计的方式问我,我很无奈:( 我只知道一个界面的材料或理论定义,并在我工作的许多项目中实现了它。但我真的不明白这为什么有用,怎么有用。 接口方面有一点我也不懂。例如,我们使用 finally块中的。但我没有看到该类实现或继承接口()类,我的意思是。我想知道怎么才能直接调用方法名。同样,我不理解Dispose方法是如何工作的,因为我们需要用我们自己的实

  • 我是大学里的一个新手Java程序员。今天我发现了一些东西,打破了我关于Java语法如何工作的一个概念。 在ArrayList类中找不到方法stream(),但它可能看起来好像在那里。当我将鼠标移到Eclipse中的-方法上时,它表示这是集合的一部分,但我在其在线文档中的任何地方都找不到方法。 如果方法不是我调用它的类的一部分,为什么它可以调用它?

  • 问题内容: 我多次听说,在实例化对象时应该执行以下操作: “接口”名称=新的“类”(); 例如,针对实现的类链表: 实现许多接口,包括队列,双端队列等。上面的代码和 要么 为什么必须同时指定两次类型?似乎多余,但oracledocs似乎没有提及。 问题答案: 在Java 7中是多余的。可以将其重写为。 你想写类似的原因: 如果您改变主意,则可以为您提供以后更改数据收集的自由。这样,您的代码将更加灵

  • 问题内容: 我最近参加了一次采访,他们问我一个问题:“为什么接口比抽象类更受青睐?” 我尝试给出一些答案,例如: 我们只能获得一种扩展功能 他们是100%抽象 实现不是硬编码的 他们要求我使用您使用的任何JDBC API。“它们为什么是接口?”。 我可以为此得到更好的答案吗? 问题答案: 该面试问题反映出提出该问题的人的某种信念。我相信这个人是错的,因此您可以选择两个方向之一。 给他们他们想要的答

  • 问题内容: 今天,我使用了Eclipse的“拉接口”重构功能来创建基于现有类的接口。该对话框提供了将新界面的所有新方法创建为“抽象”方法的功能。 那会有什么好处? 我认为,允许您将接口方法声明为抽象的事实是该语言的多余且无害的功能,因此不建议特别提倡。 为什么Eclipse支持这种样式,或者为什么有人自愿选择支持这种样式? 澄清:我不是在问为什么接口方法是抽象的,这是显而易见的。我想问为什么人们会

  • 我真的很想理解这些的实时使用是什么: 1.Java概念“超类变量可以引用子类对象”有什么用处?即使这样,SuperClass变量只能用于访问由SuperClass定义的对象的那些部分,而不能访问子类成员,这甚至可以由子类对象实现。 2.动态方法调度的需求是什么?下面我有一个例子: 提前谢了。