文选流氓 发表于 2003-2-5 12:07

1-1-4-16 接口的讨论

发信人: IvorChen (嘻皮博士), 信区: Java      

我也一直对这个问题有点疑惑,那位大虾指点一下


【 在 Iammyself (我就是我) 的大作中提到: 】
: 看了前面对接口的讨论,有点糊涂了:
: 前面讨论中说道对接口的引用实际上是返回实现该接口的类的对象,从而可以调用实现
: 该接口的方法。
: 不用关心是哪个类实现了该接口。
: 可是,如果是有多个类都实现了该接口,它到底返回哪个类的的对象?真的有点糊涂了




发信人: ChMoons (Moons), 信区: Java      

我不是大吓,我的理解是程序在编译时,并不知道到底是那个类实现了接口类,在程序
运行时,
通过类似态联编的机制确定是哪个类对象。由于Java是强类型转换语言,在指定是那个
类对象时要
将接口类强制强制转换成指定的实现类。
运行时,通过这种方法就应该可以找到是哪个实现类的对象了。可以找一个类似的示例
看看!
【 在 Iammyself (我就是我) 的大作中提到: 】
: 看了前面对接口的讨论,有点糊涂了:
: 前面讨论中说道对接口的引用实际上是返回实现该接口的类的对象,从而可以调用实现
: 该接口的方法。
: 不用关心是哪个类实现了该接口。
: 可是,如果是有多个类都实现了该接口,它到底返回哪个类的的对象?真的有点糊涂了




发信人: Iammyself (我就是我), 信区: Java      

这样的话,岂非在编程时根本无法知道自己调用的接口的方法到底是哪一个了?
怎么控制调用自己所希望的接口方法?

【 在 ChMoons (Moons) 的大作中提到: 】
: 我不是大吓,我的理解是程序在编译时,并不知道到底是那个类实现了接口类,在程序
: 运行时,
: 通过类似态联编的机制确定是哪个类对象。由于Java是强类型转换语言,在指定是那个
: 类对象时要
: 将接口类强制强制转换成指定的实现类。
: 运行时,通过这种方法就应该可以找到是哪个实现类的对象了。可以找一个类似的示例
: 看看!





发信人: ChMoons (Moons), 信区: Java      

怎么会连自己都不知道呢?我说的是编译器编译java文件时没有静态的确定。编程时你来范ㄊ悄歉隼嗍迪纸涌冢执行那个对象的方法
【 在 Iammyself (我就是我) 的大作中提到: 】
: 这样的话,岂非在编程时根本无法知道自己调用的接口的方法到底是哪一个了?
: 怎么控制调用自己所希望的接口方法?


发信人: miTYH (mi.TYH), 信区: Java      

其是很简单,这就是为什么要面向对象技术和面向对象程序设计语言的重要原因之一
接口是定义某种类型对象的操作,同是一个'吃'字,人和猪的吃法大不相同。但我们在
程序中都可用一个animal.吃()来调用.到了运行时刻,自然会分清是哪一个吃。Java
的运行时刻的prepare,link操作会自动实现这以动态绑定。
虽然你把人和猪都赋值给animal类型的句柄,但animal中存贮的实际对象的句柄则仍然
人是人猪还是猪。不会混乱的.这些工作都是准备和链接完成,非常复杂。短时间内
实在无法说明白。只好敬请原谅了.

【 在 Iammyself (我就是我) 的大作中提到: 】
: 看了前面对接口的讨论,有点糊涂了:
: 前面讨论中说道对接口的引用实际上是返回实现该接口的类的对象,从而可以调用实现
: 该接口的方法。
: 不用关心是哪个类实现了该接口。
: 可是,如果是有多个类都实现了该接口,它到底返回哪个类的的对象?真的有点糊涂了




发信人: mmcenter (MM中心), 信区: Java      

你具体用了哪个类,那就是那个类了。接口其实是一种多继承的折衷方法。
所以就象你将任何一个类放进vector这类东西中,系统就把它看成是一个
object,你愿意怎么造型是程序的事情了。接口一样,例如你的applet实现了
actionListener接口,你add(actionListener)的时候就可以add(this),
按照多继承的想法你可以理解成this是actionListener的一个子类,上溯
造型而已,所以多个类实现了同一个接口,就象多个类继承一个父类一样理解
就行了。

【 在 Iammyself (我就是我) 的大作中提到: 】
: 看了前面对接口的讨论,有点糊涂了:
: 前面讨论中说道对接口的引用实际上是返回实现该接口的类的对象,从而可以调用实现
: 该接口的方法。
: 不用关心是哪个类实现了该接口。
: 可是,如果是有多个类都实现了该接口,它到底返回哪个类的的对象?真的有点糊涂了




发信人: liyawei (lili), 信区: Java      


【 在 mmcenter (MM中心) 的大作中提到: 】
: 你具体用了哪个类,那就是那个类了。接口其实是一种多继承的折衷方法。
: 所以就象你将任何一个类放进vector这类东西中,系统就把它看成是一个
: object,你愿意怎么造型是程序的事情了。接口一样,例如你的applet实现了
: actionListener接口,你add(actionListener)的时候就可以add(this),
: 按照多继承的想法你可以理解成this是actionListener的一个子类,上溯
: 造型而已,所以多个类实现了同一个接口,就象多个类继承一个父类一样理解
: 就行了。
补充以下:
对于大的应用特别是分布式应用来说,接口起到的将实现与表现(接口)分离的作用就更
明显了。接口的使用者不需要关心是哪个类实现了该接口。而只需要用它。
如何确定是哪个类实现了它,一般来说,如果是大型应用,偶合性低的话,
可以采用运行时刻指定的方式。
典型的例子有JAVA IDL中指定ORB的实现类。JNDI编程中实现initialcontext factory的类。
而类的动态绑定都是由JAVA IDL和JNDI这些infrastructure帮应用考虑的。
不用程序员关心太多。
动态指定的方式可以在JAVA 的命令行用-D参数指定,也可以在配置时刻修改相应的
配置文件如orb.properties



发信人: liyawei (lili), 信区: Java      
标题: 关于接口
发信站: BBS 水木清华站 (Sun Jun3 10:34:07 2001)

的确,JAVA 中的接口从语言上说是多继承的一种变体,
同时避免了C++的中存在的多石栗问题。
不过,我们再从面向对象的层次来看,可以这么理解。
接口可以看作一个对象的TYPE。而不是CLASS
因此,使用它使,就可以把真正的CLASS的石栗造型到接口代表的TYPE上去。
因此,一个CLASS可以实现多个INTERFACE,那么,它可以被CAST到多个TYPE即
接口
页: [1]
查看完整版本: 1-1-4-16 接口的讨论