我对以下代码感到困惑。这段代码是由其他人编写的,我目前正在研究这些代码,以便更好地理解参数传递在Java中的工作原理。
代码#1
addKeyListener((KeyListener)new TAdapter());
和代码#2
addKeyListener(new TAdapter());
假设TAdapter是扩展KeyAdapter类的类,那么意味着同样的事情并执行相同的操作吗?我还注意到我不一定要将TAdapter对象显式地转换为KeyListener,即使我在Eclipse中读取的方法描述中该方法也接受了KeyListener对象。为什么这可能? 我从Java文档中快速搜索了KeyAdapter类,显然KeyAdapter类实现了KeyListener接口。 因此,我可以安全地假设Java在参数传递中的工作方式之一是该方法可以接受从某个类继承的类的实例,该类实现方法描述中列出的同名接口吗?如果是这样,为什么这也可能?
P.S。另外,我不明白为什么程序员将TAdapter命名为TAdapter,T代表什么?我也注意到这种类命名在其他源代码中,但我从来没有理解这个假定的约定。
答案 0 :(得分:1)
嗯,是的,确实“该方法可以接受从实现接口的某个类继承的类的实例”。
更一般地说,implements
接口可以说是多态性的接口的子类,并且可以为任何参数或变量分配其声明的类的任何子类的实例。 / p>
至于为什么这个班级被命名为TAdapter
,我恐怕无法回答。它至少不是任何通常使用的惯例。 :)
答案 1 :(得分:1)
如果某个方法将 ObjectParameter 作为参数,则由于多态,它也可以采用 SubClassOfObjectParameter 。
TAdapter 开头的 T 只是一个糟糕的命名风格,因为它很神秘!
答案 2 :(得分:1)
所以我可以安全地假设Java在参数中的工作方式之一 传递方法是该方法可以接受一个类的实例 继承自实现相同接口的某个类 方法描述中列出的名称?
是
如果是这样的话,为什么呢? 可能的?
这是因为多态性。你应该阅读this。特别是多态性小节。