A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如题:有代码

  1. Map map = new HashMap();
  2. System.out.println(map.toString());
复制代码

根据父类引用指向子类对象的特性,父类引用只能调用父类中的定义的方法,,
那么如果说接口没有继承Object,那么Map中哪来的toString方法?但是如果说
接口继承了Object,但是接口中都是没有实现的方法,如何继承的?{:3_47:}

7 个回复

倒序浏览
接口的存在就是为了让类来实现的,所有的类都是Object的子类,接口引用的对象,肯定也是一个对象,所以可以调用Object方法,至于Java内部如何实现的,我觉得就没必要细究了
回复 使用道具 举报
接口只能继承接口,不能从类继承;类能够实现接口
回复 使用道具 举报 1 0
Map map = new HashMap();
System.out.println(map.toString());
map.toString()调用的是Map中的toString()吗?我想你是弄错了,它调用的是HashMap类中的toString()(当然也可能是从它的父类中继承过来的,实际上是AbstractMap类中重写的toString()),但肯定不是Map中的,再说了Map中怎么可能有实现了的具体的toString(),这地方体现的是java中的多态,你可以看看jdk API文档。

你再看看在Class AbstractMap<K,V>中是不是有个重写的toString()。调用的应该就是这个HashMap从AbstractMap中继承过来的toString();而AbstractMap是继承Object类的,同时它还实现了Map接口。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
iefegend 发表于 2014-8-15 11:50
Map map = new HashMap();
System.out.println(map.toString());
map.toString()调用的是Map中的toString() ...

你这哥儿们有没有好好看我的描述?我问的是Map中的toString()方法,我难道不知道toString()是从子类中继承来的?关键在于Map是一个接口,用接口的引用去调用子类对象的方法不是只能调用接口中实现的方法吗???{:3_47:}
回复 使用道具 举报
刘高峰 发表于 2014-8-14 19:03
接口的存在就是为了让类来实现的,所有的类都是Object的子类,接口引用的对象,肯定也是一个对象,所以可以 ...

你说的我不明白?你好好看懂我的问题,再回答!{:3_47:}
回复 使用道具 举报
本帖最后由 刘高峰 于 2014-8-15 15:15 编辑
咸菜+萝卜干 发表于 2014-8-15 13:22
你说的我不明白?你好好看懂我的问题,再回答!

我的意思就是说,如果map不能调用toString()方法的话,那它还算是一个对象吗?这明显是不合理的。但是按照常理来说,父类引用只能调用父类中定义的方法,只是你说的这种情况很特殊,你可以认为接口中隐含了一套Object方法,或者编译器做了特殊处理。这就是一种特殊情况,要真正弄明白很麻烦,但是就算真正弄明白了也没有实际意义,所以没必要细究了
回复 使用道具 举报
实际上在Sun的官方文档TJLS(The Java Language Specification)就有相关说明:
其中第9章9.2节关于接口有这么一段话:
If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object, unless a method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface.
它大概意思是说当一个接口没有直接extends superinterfaces时,那么再该接口中就会隐含定义了一套与Object类中的方法签名完全相同的方法,所以,我们在程序中调用接口的那些与Object中具有相同签名的方法时,编译器不会报错!

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报 2 0
您需要登录后才可以回帖 登录 | 加入黑马