所以我们都知道所有的类都隐式地扩展了Object。那么接口呢?是否有一个隐式的超级界面?我说有。下面的代码进行编译:
java.io.Serializable s1 = null;
java.io.Serializable s2 = null;
s1.equals(s2);equals方法不是在Serializable中声明的,而是在Object中声明的。由于接口只能扩展其他接口,而Object是一个类,而不是一个接口,因此必须有一些正在扩展的隐式接口。然后Object类必须隐式地实现这个隐式接口(哇,写起来很奇怪)。
所以,问题是,这到底有多正确?
发布于 2009-04-29 17:47:51
由于接口只能扩展其他接口,而Object是一个类,而不是一个接口,因此必须有一些正在扩展的隐式接口。
不是的。引用Java Language Specification
如果接口没有直接的超接口,则接口隐式声明具有签名s、返回类型r的公共抽象成员方法m,并抛出与对象中声明的每个公共实例方法m对应的抛出子句t,除非接口显式声明了具有相同签名、相同返回类型和兼容的子句的方法。如果接口显式声明了这样一个方法m,则这是一个编译时错误,其中m在Object中被声明为final。
这与您的“隐式超级接口”之间的区别在于,Object有许多最终的和受保护的方法,并且您不能在接口中包含这些修饰符。
发布于 2009-04-29 17:42:56
这里的s1和s2是对象引用,指的是实现可序列化的对象的实例。Java中没有接口引用这样的东西。
所以Java知道无论这些对象是什么,它们都是从java.lang.Object派生出来的。因此上面的代码是有效的。
发布于 2009-04-29 17:44:13
当你声明像这样的东西时:
java.io.Serializable s1 = null;别忘了Java中的一切都是从Object派生出来的。所以在这里,你只是说s1 is (或者Object或者一些扩展Object的类)那个implements Serializable。根本就没有魔法。Java中的所有东西都是从Object派生出来的,不管它是否显式。因此,equals方法始终可用。
https://stackoverflow.com/questions/803466
复制相似问题