2

抱歉把死人带回来。但是我仍然不清楚这部分规范的内容。

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

给定

interface Testing
{
    void test();
}
public class Test{
    public static void main(String[] args) {
        Testing t = new Testing(){
            @Override
            public void test(){
            }
        };
        t.test();
        t.toString();
    }
}

现在,正如规范所述,上述内容将更改为

    interface Testing
    {
        void test();
        String toString();
        //other non-final methods of Object
    }
    public class Test{
        public static void main(String[] args) {
            Testing t = new Testing(){
                @Override
                public void test(){
                }
            };
            t.test();
            t.toString(); 
        }
    }

还。请确认是否存在接口层次结构,然后它们都将获得这些抽象方法。

4

2 回答 2

1

这意味着每个类都扩展 Object(在其类层次结构中的某个点)。但是,接口不扩展 Object。这是为了避免多重继承带来的问题。

由于接口不扩展Object,这意味着我们无法使用方法,例如toString我们可以访问的对象的类型(不是类)是否是接口。但是我们知道这些方法必须是可用的,因为所有类在某个时候都扩展自Object. 因此,为了解决这个问题,所有Object的非最终方法都在所有没有超接口的接口中隐式声明。这些方法的这些约定总是得到满足,因为所有类都必须在某些时候从Object.

ObjectTL;DR -当我们有一个存储在类型是接口的变量中的某个类的实例时,确保我们可以访问可用的方法是一个技巧(例如。 Serializable

编辑:回答你的问题,你有点不对劲。如果该接口没有父接口并且对于要添加的每个方法,则所有非最终方法Object都将添加到接口(无论是否使用):接口明确声明了没有匹配的方法。

于 2012-09-17T09:32:26.947 回答
0

只要接口没有超接口,它就会获得 Object 类方法的隐式声明。只要这些方法都包含在接口中。扩展或实现此接口的每个接口在此接口显式声明或隐式声明的方法之间没有太大区别。在那一点上,该接口与明确声明它们一样好。

于 2012-09-17T09:15:37.737 回答