讨论下接口为什么能调用Object里面的方法

JamesLiu 2009-01-31 05:06:26
http://blog.csdn.net/jamesliulyc/archive/2009/01/27/3853839.aspx
不知道解释的是否正确,请高手指点,嘿嘿
...全文
345 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
CEO27 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ChDw 的回复:]
因为编译器,运行器都会肯定test一定直接或者间接的继承Object对象(无论它实现了接口与否),所以必然存在了toString方…
[/Quote]
同意,不能说接口继承有Object的方法,而是编译器知道不管test指向什么类,这个类一定继承Object
ff9994 2009-02-01
  • 打赏
  • 举报
回复
用Eclipse,test.后面确实是Object类中的方法。

云上飞翔 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jamesliulyc 的回复:]

郑重声明:接口无法不能继承类,即接口跟Object类是独立的,具体问题请看11楼
[/Quote]
答:接口A与类Object无关,但:
(a)接口A中的方法成员两部分:1)你自己定义的 2)类Object中的所有的public实例方法对应地迁移过去的(public abstract形式).
(b)类B实现了接口A,则类B的任务是:1)重写(a)中1)处的方法 2)重写(a)中2)处的方法
又由于:类B实现了接口A 就是:类B extends Object implements 接口A,
则:类B的任务:1)重写(a)中1)处的方法 由类B自己来完成 而:)重写(a)中2)处的方法 实际上是由Object类完成的,不是由类B自己来完成的.,当然类B自己随时可以再重写.
(c)所有通过接口A调用Object类的方法,是由实现接口A的类B的对象来进行的(因为它:重写了接口A中的所有的方法(包括:来自于Object类的对应的抽象方法)) 这就是:通过接口A调用Object类的方法的内部过程--就是类B实现接口A(隐含实现了来自于Object类的对应的抽象方法)[你真该认真看看<<JAVA语言规范>>(9.2节接口中的方法成员)]
ChDw 2009-02-01
  • 打赏
  • 举报
回复
A test = new B();
//多态机制,大家都知道编译时候会到A里面检查是否有toString()方法
//显然A里面声明了toString()方法,但是并没有继承Object()类,因为
//接口无法继承类,
//A里面没有声明toString()方法,但是编译不出错
System.out.println(test.toString());



因为编译器,运行器都会肯定test一定直接或者间接的继承Object对象(无论它实现了接口与否),所以必然存在了toString方法
fuyou001 2009-02-01
  • 打赏
  • 举报
回复
楼主看这句话:......toString()方法是接口A中的方法成员.(即:Object类中的每一个public的实例方法,都是接口的方法成员(当然是public abstract形式)[JLS讲得很清楚 见JLS9.2节 "接口中的方法成员"),这才是编译不出错的真正原因
fuyou001 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jiangnaisong 的回复:]
引用 11 楼 jamesliulyc 的回复:
不是这个问题,我知道所有的类继承或者间接继承,我是说
接口通过什么方式调用Object类里面的方法

A test = new B();
//多态机制,大家都知道编译时候会到A里面检查是否有toString()方法
//显然A里面声明了toString()方法,但是并没有继承Object()类,因为
//接口无法继承类,
//A里面没有声明toString()方法,但是编译不出错
System.out.println(test.toSt…
[/Quote]

看明白 了
云上飞翔 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jamesliulyc 的回复:]
都没理解我意思,嗨,怎么就是没人理解多态呢,
问题没你们说的那么简单,别想相当然的认为

不熟悉多态机制的,请先看书,然后再回帖!!!具体问题11楼
[/Quote]
答:你的问题不就是:
我是说,接口通过什么方式调用Object类里面的方法?
是这个意思吗?
fuyou001 2009-02-01
  • 打赏
  • 举报
回复
这里你用IDE System.out.println(test.toString());试test.后的方法全是Object类里的方法
JamesLiu 2009-02-01
  • 打赏
  • 举报
回复
都没理解我意思,嗨,怎么就是没人理解多态呢,
问题没你们说的那么简单,别想相当然的认为

不熟悉多态机制的,请先看书,然后再回帖!!!具体问题11楼
云上飞翔 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jamesliulyc 的回复:]
不是这个问题,我知道所有的类继承或者间接继承,我是说
接口通过什么方式调用Object类里面的方法

A test = new B();
//多态机制,大家都知道编译时候会到A里面检查是否有toString()方法
//显然A里面声明了toString()方法,但是并没有继承Object()类,因为
//接口无法继承类,
//A里面没有声明toString()方法,但是编译不出错
System.out.println(test.toString());
[/Quote]
答:
1)接口A里面没有声明toString()方法,但是接口A中,toString()方法是接口A中的方法成员.(即:Object类中的每一个public的实例方法,都是接口的方法成员(当然是public abstract形式)[JLS讲得很清楚 见JLS9.2节 "接口中的方法成员"),这才是编译不出错的真正原因

2)test的类型是接口A,但test中运行时真正所指的对象(即:引用test的定义类型是接口A,但其运行时的所指的对象类型是 类B)是类B的对象,因而
test.toString()所调用的是运行时所指对象即类B的对象中的toString()方法,,若类B对象没有重写toString()方法,则自动调用是类B的父类Object类的对象的toString()方法了.
- 一句话,就是一个方法重写,运行时是如何调用的.
mysky191_chi 2009-02-01
  • 打赏
  • 举报
回复
mark 学习了
luojihaidao 2009-02-01
  • 打赏
  • 举报
回复
其实一楼分析的很清楚了。
你的问题是:接口通过什么方式调用Object类里面的方法??

A test = new B(); 因为Object是超类,这里new之后(实例化过程),当然应该有了。
ZangXT 2009-02-01
  • 打赏
  • 举报
回复
JamesLiu 2009-02-01
  • 打赏
  • 举报
回复

郑重声明:接口无法不能继承类,即接口跟Object类是独立的,具体问题请看11楼
JamesLiu 2009-02-01
  • 打赏
  • 举报
回复
(因为
这个里面的细节对于java程序员来说很少有人知道的)
JamesLiu 2009-02-01
  • 打赏
  • 举报
回复
不是这个问题,我知道所有的类继承或者间接继承,我是说
接口通过什么方式调用Object类里面的方法

interface A { }
class B implements A{
//为了让大家看清楚问题,我重写了toString()方法,并显式调用它
public String toString() {
return "B";
}
} //这里隐式的继承了Object,这个我知道,但我不是问这个

public class Test {
A test = new B();
//多态机制,大家都知道编译时候会到A里面检查是否有toString()方法
//显然A里面声明了toString()方法,但是并没有继承Object()类,因为
//接口无法继承类,
//A里面没有声明toString()方法,但是编译不出错
System.out.println(test.toString());
}

我的问题是讨论下,接口A里面确实存在Object里面的方法,但是是通过方式
请大家仔细研究下,我只是觉得这个问题很有价值,仅做讨论(因为我知道
这个里面的细节对于java程序员知道的)
kuangfengyu1387 2009-02-01
  • 打赏
  • 举报
回复
其实接口并不会调用什么方法...接口只是储存实现他的实例(比如A中储存的是B),所以真正的是B在调用.toString方法............A发出命令...B来完成......
erjun 2009-02-01
  • 打赏
  • 举报
回复
开发开发开发开发
kevin-yy 2009-02-01
  • 打赏
  • 举报
回复
23楼正解
------------------------------
你在Ide中定义接口看看

interface A {
// ide 报错:
// The return type is incompatible with Object.toString()
// 返回类型与Object.toString()不匹配
public int toString(); // 返回类型是int报错,需要String类型
}
//(a)接口A中的方法成员两部分:1)你自己定义的 2)类Object中的所有的public实例方法对应地迁移过去的(public abstract形式).
bzwm 2009-01-31
  • 打赏
  • 举报
回复
有这么复杂?
顶下1楼
加载更多回复(9)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧