http://blog.csdn.net/jamesliulyc/archive/2009/01/27/3853839.aspx
不知道解释的是否正确,请高手指点,嘿嘿

解决方案 »

  1.   

    没有理论和事实依据,完全是想当然的“分析”。
    记住一点:Object类是所有类的超类。如果一个类没有直接继承任何类,那么它就必然继承自Object。所以,class A { },其实相当于class A extends Object {};同样地,class A implements B { },也就相当于class A extends Object implements B { },还不明白吗?
      

  2.   

    越看越糊涂,接口真的能调Object里面的方法嘛??
      

  3.   

    没怎么明白
    Object类是所有类的超类啊。
    还是不明白
      

  4.   

    没怎么明白
    Object类是所有类的超类啊。
    还是不明白
      

  5.   

    class A extends Object 这个是重点。Object有print函数的
      

  6.   

    Object类是Java语言的根类,Java语言中,所有的类都直接或间接继承与它
      

  7.   

    想想单根继承,任何类都继承自Object。应该说任何东西都继承自Object。
      

  8.   

    答:1楼 Dan1980兄弟的理解完全正确,即: class A implements B { },也就相当于class A extends Object implements B { }
      

  9.   

    不是这个问题,我知道所有的类继承或者间接继承,我是说
    接口通过什么方式调用Object类里面的方法interface A { }
    class B implements A{ 
        //为了让大家看清楚问题,我重写了toString()方法,并显式调用它
        public String toString() {
             return "B";
        }
    } //这里隐式的继承了Object,这个我知道,但我不是问这个public class Test {
        A test = new B();
        //多态机制,大家都知道编译时候会到A里面检查是否有toString()方法
        //显然A里面声明了toString()方法,但是并没有继承Object()类,因为
        //接口无法继承类,
        //A里面没有声明toString()方法,但是编译不出错
        System.out.println(test.toString());
    }我的问题是讨论下,接口A里面确实存在Object里面的方法,但是是通过方式
    请大家仔细研究下,我只是觉得这个问题很有价值,仅做讨论(因为我知道
    这个里面的细节对于java程序员知道的)
      

  10.   

    (因为
    这个里面的细节对于java程序员来说很少有人知道的) 
      

  11.   


    郑重声明:接口无法不能继承类,即接口跟Object类是独立的,具体问题请看11楼
      

  12.   

    其实一楼分析的很清楚了。
    你的问题是:接口通过什么方式调用Object类里面的方法??A test = new B(); 因为Object是超类,这里new之后(实例化过程),当然应该有了。
      

  13.   

    答:
    1)接口A里面没有声明toString()方法,但是接口A中,toString()方法是接口A中的方法成员.(即:Object类中的每一个public的实例方法,都是接口的方法成员(当然是public abstract形式)[JLS讲得很清楚 见JLS9.2节 "接口中的方法成员"),这才是编译不出错的真正原因2)test的类型是接口A,但test中运行时真正所指的对象(即:引用test的定义类型是接口A,但其运行时的所指的对象类型是 类B)是类B的对象,因而
    test.toString()所调用的是运行时所指对象即类B的对象中的toString()方法,,若类B对象没有重写toString()方法,则自动调用是类B的父类Object类的对象的toString()方法了.
    - 一句话,就是一个方法重写,运行时是如何调用的.
      

  14.   

    这里你用IDE   System.out.println(test.toString());试test.后的方法全是Object类里的方法
      

  15.   

    答:你的问题不就是:
    我是说,接口通过什么方式调用Object类里面的方法?
    是这个意思吗? 
      

  16.   

    楼主看这句话:......toString()方法是接口A中的方法成员.(即:Object类中的每一个public的实例方法,都是接口的方法成员(当然是public abstract形式)[JLS讲得很清楚 见JLS9.2节 "接口中的方法成员"),这才是编译不出错的真正原因 
      

  17.   

        A test = new B();
        //多态机制,大家都知道编译时候会到A里面检查是否有toString()方法
        //显然A里面声明了toString()方法,但是并没有继承Object()类,因为
        //接口无法继承类,
        //A里面没有声明toString()方法,但是编译不出错
        System.out.println(test.toString());因为编译器,运行器都会肯定test一定直接或者间接的继承Object对象(无论它实现了接口与否),所以必然存在了toString方法
      

  18.   

    答:接口A与类Object无关,但:
    (a)接口A中的方法成员两部分:1)你自己定义的  2)类Object中的所有的public实例方法对应地迁移过去的(public abstract形式).
    (b)类B实现了接口A,则类B的任务是:1)重写(a)中1)处的方法  2)重写(a)中2)处的方法
    又由于:类B实现了接口A 就是:类B extends Object implements 接口A,
    则:类B的任务:1)重写(a)中1)处的方法 由类B自己来完成  而:)重写(a)中2)处的方法 实际上是由Object类完成的,不是由类B自己来完成的.,当然类B自己随时可以再重写.
    (c)所有通过接口A调用Object类的方法,是由实现接口A的类B的对象来进行的(因为它:重写了接口A中的所有的方法(包括:来自于Object类的对应的抽象方法))  这就是:通过接口A调用Object类的方法的内部过程--就是类B实现接口A(隐含实现了来自于Object类的对应的抽象方法)[你真该认真看看<<JAVA语言规范>>(9.2节接口中的方法成员)]
     
      

  19.   

    用Eclipse,test.后面确实是Object类中的方法。
      

  20.   

    同意,不能说接口继承有Object的方法,而是编译器知道不管test指向什么类,这个类一定继承Object
      

  21.   

    23楼正解
    ------------------------------
    你在Ide中定义接口看看interface A {
      // ide 报错:  
      // The return type is incompatible with Object.toString()
      // 返回类型与Object.toString()不匹配
      public int toString(); // 返回类型是int报错,需要String类型
    }
    //(a)接口A中的方法成员两部分:1)你自己定义的  2)类Object中的所有的public实例方法对应地迁移过去的(public abstract形式). 
      

  22.   

    其实接口并不会调用什么方法...接口只是储存实现他的实例(比如A中储存的是B),所以真正的是B在调用.toString方法............A发出命令...B来完成......
      

  23.   

    http://blog.csdn.net/ZangXT/archive/2008/11/27/3389395.aspx
    java语言规范中有说明。