如果接口引用一个子类对象(实现了它的),而接口里没有定义toString()方法,怎么调用这个引用的对象里的toString()方法?如:Map m=new HashMap();
System.out.println(m);假设已经给m赋值,为什么打印出来的是用的HashMap类里的toString()方法???用接口引用,m看成Map类型的,但是toString()在Map接口里没定义呀?m只能调用接口定义的方法和常量呀?即只能调用继承或实现的方法和属性,子类新增的方法不能调用。请高手给解答一下。
System.out.println(m);假设已经给m赋值,为什么打印出来的是用的HashMap类里的toString()方法???用接口引用,m看成Map类型的,但是toString()在Map接口里没定义呀?m只能调用接口定义的方法和常量呀?即只能调用继承或实现的方法和属性,子类新增的方法不能调用。请高手给解答一下。
m定义为一个Map ,而它实际上指向的是 HashMap() ,
从语法上来讲,编译器会把它作为一个Map的对象看, 这种情况下,如果调用了子类独有的方法,
首先编译器都不能通过编译.而可以调用父接口已经定义的方法的原因是 : java的动态多态的表现, 它还是把m做为一个Map看待,
只是在运行的时候,具体找到了该引用在内存中的HashMap实例的内存地址,从而调用了该内存块中的和你接口同名的方法或者属性.
在JLS9.2节中接口中的成员方法讲得很明确,基本的是说:接口中的抽象方法来源有两类:
1)你自己定义的抽象方法
2)类Object中的public型方法迁移过去的方法(以public abstract形式--即:抽象方法)因此:显然Map接口中当然的抽象方法public abstract String toString();这个抽象方法的.(Object中的public型方法,Map接口中都有)
因为 B test = new A();
这个操作的时候,其实已经隐式地,向上转型了
Map,HashMap都继承了类java.util.AbstractMap
AbstractMap类覆写了Object类的toString()方法
这个就是个动态绑定(多态)