说先来一段代码引入疑惑:
package com.sunwoda.blogdemo; public class Test1 { public static void main(String[] args) { Inter i = new Demo();//-------------(1) i.print();//-------------------------(2) i.toString();//----------------------(3) } } interface Inter { void print(); } class Demo implements Inter{ public void print() { System.out.println("Hello!"); } }可以看到main中(1),接口引用指向子类对象(编译看左边,运行看右边),(2)中调用print()方法,这两句都是很容易理解的正常语句【接口中声明了print方法,并且子类实现接口时也重写了print方法】,但是(3)中调用toString方法(在顶层的Object类中定义),这个对于新手来说就有点疑惑了。【我的接口中并没有声明toString()方法呀,并且子类实现接口的过程中也没有提到toString()方法,涉及到toString方法的唯一的一个地方就是任何类都要继承Object类,难道接口也继承了Object方法,默认声明了toString方法?】
展开讨论:接口有没有继承Object类?
反驳:这种说法严重错误,我们都知道接口是不能继承类的!(如果能继承类,就意味着接口中可以定义有方法体的方法了,这是不可以的)
结论解释:接口没有继承Object类,但是拿到了Object类中所有方法的映射【接口不拥有Object的这些方法,但是它知道这些方法(相当于照镜子,能看到所有特征,但是不是它的),因此在父类引用指向子类对象动态绑定的时候,它接受Object中所有方法的绑定】