2

I have an interface like below.

I got this default code in Eclipse. Confused, Why the "@Override" attribute is coming?

Is there any other TOP level default interface is available where we have declared all these methods and later implemented in Object class?

  public interface IRecord {
        @Override
        public String toString();

        public void showName(String name);
    }

And its one implementation like below

public class Record implements IRecord{

    @Override
    public void showName(String name) {
          //Doing something
    }
}

It's getting complied very well as expected but I am little surprised why its not asking me to implement toString() method's implementation?

It's there in Object class but Object class is not implementing my interface.

4

6 回答 6

6

所有类都隐式扩展Object,已经实现toString()。并且由于您的Record类实现了您的接口,并从 继承了toString()方法Object,因此合同得以履行。

于 2013-05-24T12:01:39.033 回答
2

在我们声明了所有这些方法并随后在 Object 类中实现的地方,是否还有其他可用的 TOP 级默认接口?

来自Java 语言规范

如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法m,其签名为 s,返回类型为 r,并且 throws 子句 t对应于每个公共实例方法m,签名为 s,返回类型为 r,和 throws 子句 t在 Object 中声明,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的方法。

换句话说,即使是一个空接口也隐式地继承了所有的公共方法Object。这就是 Eclipse(正确)添加@Override注释的原因。由于从 中删除的任何方法,它很可能永远不会失败Object,但它有助于避免拼写错误:

interface IRecord {
   @Override
   public String toSTring();
}

Error: "The method toSTring() of type IRecord must override or implement a supertype method"

请参阅问题第二部分的其他答案。

于 2013-05-24T12:30:44.857 回答
1

接口不继承自Object,但任何将实现您的接口的类都会继承,因此默认情况下会实现它。

您可能想知道为什么 Eclipse 会toString在您的界面模板中为您提供覆盖默认值的功能:我认为它是为了提醒您toString稍后实现一些有意义的东西。

于 2013-05-24T12:04:23.363 回答
1

每个类都在 java 中扩展java.lang.Object,如果你不扩展一个,那么隐式地考虑 Object。

只看你的代码:

public interface IRecord {
    @Override
    public String toString();

    public void showName(String name);
}

你怎么在 toString() 方法中有一个 @Override 注释,你必须从某个地方继承它,

JLS 中提到: 如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法 m,签名为 s,返回类型为 r,并且 throws 子句 t 对应于每个签名为 s,返回类型为 r 的公共实例方法 m , 并抛出在 Object 中声明的子句 t。

这就是为什么您可以在 toString() 方法上方看到覆盖注释的原因。

现在,当您实现 IRecord 类时,您的实现类也扩展了 Object 类,它具有 toString() 方法。因此,它不需要在这里实现它。

于 2013-05-24T12:05:19.320 回答
0

@Override 属性是为了编译器安全。这只是为了确保您确实是要覆盖一个方法并且您没有错误地这样做

于 2013-05-24T12:01:54.957 回答
0

因为Object是 Object 类中定义的所有其他类和toString方法的基类,所以它已经实现了。

于 2013-05-24T12:02:20.477 回答