其实这个问题讨论起来没什么意义,可能在实际中的用处并不是很大。 public interface T { void itMethod(); } public class C implements T { public void itMethod() { System.out.println("override interface method!!"); } public void clsMethod(){ System.out.println("class method!!"); } } public class Demo { public static void main(String[] args) { T it=new C (); it.it(); it.clsMethod();//此行会报错;这是大家都知道的,因为接口没有clsMethod方法 System.out.println(it.toString());//接口中也没有看到toString方法,但此处没有报错。 Class cs= T.class; Class sc=cs.getSuperclass(); //sc引用为空 } } 对于这种情况,如果上述引用型变量it的类型(T)是某一个类的话,大家也就很容易理解,因为所有类的根类都是Object类,Object类中的方法也就自然的能被其直接或间接子类继承,根据多态的原理,it调用Object类中的方法是不会出错的,因为T和C类都直接或间接地继承了Object中的方法。 但重点是,如果it的类型T不是具体的类而是接口时,那么它还会有Object中的方法和属性么?有很多人都认为接口的直接或间接父类也是Object,但真的是这样的么,没错我们常说接口是一个特殊的类,如果是类的话,那么它的根类不就是Object么?事实上,我个人认为可以把接口看作是特殊的类,但它并不是Oject类的子类(如果有的话sc就不会为空),接口interface与class应该属于同一级别的概念,他们之间是不存在从属关系的,我们通常定义地接口是没有继承Object类的。但是从上面的代码中,我们也看到了我们使用T类型的引用去调用了C类(实现了T接口)中的toString(),我们都很清楚如果T中没有toString()的话,我们使用T类型的引用去调用实现类中的toString()方法在编译的时候是通不过的,但现在编译器确实没有报错,这种现象该如何解释呢?是不是编译器对这种情况进行了特殊对待? 实际上在Sun的官方文档TJLS(The Java Language Specification)就有相关说明: 其中第9章9.2节关于接口有这么一段话:
它大概意思是说当一个接口没有直接extends superinterfaces时,那么再该接口中就会隐含定义了一套与Object类中的方法签名完全相同的方法,所以,我们在程序中调用接口的那些与Object中具有相同签名的方法时,编译器不会报错! 这段描述对我很有帮助,说了这么多,只是想让大家在空闲时间来考虑JAVA的设计思路和理念,巩固和加深对它的理解。以上所有的均为个人看法,仅供参考,不对之处还望指出,大家共同研究讨论。
|