说先来一段代码引入疑惑:
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中所有方法的绑定】