A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

iefegend

中级黑马

  • 黑马币:53

  • 帖子:159

  • 精华:0

© iefegend 中级黑马   /  2014-10-19 09:35  /  900 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

其实这个问题讨论起来没什么意义,可能在实际中的用处并不是很大。
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类中的方法是不会出错的,因为TC类都直接或间接地继承了Object中的方法。
但重点是,如果it的类型T不是具体的类而是接口时,那么它还会有Object中的方法和属性么?有很多人都认为接口的直接或间接父类也是Object,但真的是这样的么,没错我们常说接口是一个特殊的类,如果是类的话,那么它的根类不就是Object么?事实上,我个人认为可以把接口看作是特殊的类,但它并不是Oject类的子类(如果有的话sc就不会为空),接口interfaceclass应该属于同一级别的概念,他们之间是不存在从属关系的,我们通常定义地接口是没有继承Object类的。但是从上面的代码中,我们也看到了我们使用T类型的引用去调用了C类(实现了T接口)中的toString(),我们都很清楚如果T中没有toString()的话,我们使用T类型的引用去调用实现类中的toString()方法在编译的时候是通不过的,但现在编译器确实没有报错,这种现象该如何解释呢?是不是编译器对这种情况进行了特殊对待?
实际上在Sun的官方文档TJLSThe Java Language Specification)就有相关说明:
其中第99.2节关于接口有这么一段话:

它大概意思是说当一个接口没有直接extends superinterfaces时,那么再该接口中就会隐含定义了一套与Object类中的方法签名完全相同的方法,所以,我们在程序中调用接口的那些与Object中具有相同签名的方法时,编译器不会报错!
  这段描述对我很有帮助,说了这么多,只是想让大家在空闲时间来考虑JAVA的设计思路和理念,巩固和加深对它的理解。以上所有的均为个人看法,仅供参考,不对之处还望指出,大家共同研究讨论。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马