Java中的接⼝是否继承Object类
Java 中的 Object 类——层次结构的根,Java 中所有的类从根本上都继承⾃这个类。Object 类是 Java 中唯⼀没有⽗类的类。其他所有的类,包括标准容器类,⽐如数组,都继承了Object 类中的⽅法。
Java 中的接⼝——抽象类的变体,可以说也是⼀种“类”,在接⼝中,所有⽅法都是抽象的。
根据以上观点,再结合三段论的⽅法,可以得出——Java 中的接⼝也是继承 Object 类的。因为 Java 的接⼝也是⼀种“类”,所以它是继承Object 类的。但是事实并⾮如此。
先来分析⼏段代码。
代码 1
public interface TestObject {
void test();
String getString();
}
public static void main(String[] args) {
Set<String> result = new HashSet<String>();
for (Method m : Methods()) {
result.Name());
}
System.out.println(result);
}
代码的输出结果是:[test, getString],没有包括 Object 中的任何⽅法。
代码 2
public interface I { }
public static void main(String[] args) {
I i = null;equals()方法
i.equals(null);
}
编译通过,但是运⾏肯定报错(空指针)。
为什么 I 接⼝中没有 equals ⽅法还可以调⽤?要回答这个问题,⽤代码是解决不了的,因为谁说的都有道理(代码 1 说明没有继承 Object 类,代码 2 说明继承了 Object 类)。
9.2. Interface Members
The members of an interface are:
Those members declared in the interface.
Those members inherited from direct superinterfaces.
If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public ins
tance method m with signature s, return type r,
and throws clause tdeclared in Object, unless a method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface.
It is a compile-time error if the interface explicitly declares such a method m in the case where m is declared to be final in Object.
It follows that is a compile-time error if the interface declares a method with a signature that is override-equivalent () to a public method of Object, but has a different return type or incompatible throws clause.
The interface inherits, from the interfaces it extends, all members of those interfaces, except for (a) fields, classes, and interfaces that it hides and (b) methods that it overrides ().
Fields, methods, and member types of an interface type may have the same name, since they are used in different contexts and are disambiguated by different lookup procedures (). However, this is discouraged as a matter of style.
在 Java 的 Object 类中有三类可见⽅法:non-final public,final,protected。
1. final ⽅法,即 wait,notify,getclass,不能由⼀个类实现(覆盖)这些⽅法。因此,编译器必须防⽌代码的接⼝中声明的⽅法(Cannot override the final method from Object)。
2. non-final public ⽅法,即 equals, toString等,只要符合正确的重写规则,是可以重写的。但是实现类可以不实现它,因为它在 Object 中实现了(默认)。
3. protected ⽅法,即clone, finalize,如果声明这些⽅法在接⼝中,那么它们将成为公共的⽅法。
注意:以上接⼝重写 Object 类中的⽅法,必须要符合 Java 的⽅法,重写机制,要不然就是⼀个新⽅法。总结:接⼝没有实现 Object 类。
最后⼀段代码
public interface TestObject {
// ⾃⼰接⼝的⽅法.
void test();
// 访问级别⽐ Object 中 hashCode 低.
/
/Illegal modifier for the interface method hashCode; only public & abstract are permitted
//protected int hashCode();
// 可以重写 Object 中 public ⽅法,但是实现类,可以不实现它.
@Override
public String toString();
//Cannot override the final method from Object
// final 的⽅法不能重写,编译器会报错.
//public void notify();
// protected ⽅法可以被提⾼访问级别, 实现类也必须实现.
void finalize() throws Throwable;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论