近来学习java过程中遇到问题,但是网上没有看到正确的解答,感觉自己的想法是对的,故在此献丑了。
如下:
Map m = new HashMap();
System.out.println(m);
在System.out.println(m) 中,我知道是调用了Map的toString()。但是Map里面没有toString()的定义或重写,这是怎么回事?
答案如下:
先讲下基础知识:
A a = new B(); //B继承A
如果a要调用方法,就只能调用A类里有的方法,分两种情况:
(1)调用B类中没有的方法;
(2)调用B类中重写的方法; //这就是动态绑定,也就是所谓的多态
在问题中,大家疑惑的就是,HashMap继承了AbstractMap的toString()方法,但是Map中没有定义toString()方法,但是Map对象m却可以直接调用toString()方法,这不符合多态的规则。
其实很简单。在java中,Object是所有其他类的祖宗,其他类都是子子孙孙,故其他的类都继承了Object类中的toString()方法。而在Map m = new HashMap()中,HashMap重写了toString(),故产生动态绑定(也叫多态),所以System.out.println(m)就能实现了。