0

我对下面的代码感到困惑。这段代码是由其他人编写的,我目前正在研究代码以更了解参数传递在 Java 中的工作原理。

代码#1

addKeyListener((KeyListener)new TAdapter());

和代码#2

addKeyListener(new TAdapter());

假设 TAdapter 是扩展 KeyAdapter 类的类,意味着相同的事情并执行相同的事情?我还注意到我不一定必须将 TAdapter 对象显式转换为 KeyListener,即使从我在 Eclipse 中阅读的方法描述中该方法接受 KeyListener 对象也是如此。为什么这可能?我从 Java 文档中快速搜索了 KeyAdapter 类,显然 KeyAdapter 类实现了 KeyListener 接口。所以我可以安全地假设 Java 在参数传递中的工作方式之一是该方法可以接受一个类的实例,该类继承自实现方法描述中列出的同名接口的某个类?如果是这样,为什么这也是可能的?

PS 顺便说一句,我不明白程序员为什么将类命名为 TAdapter,T 代表什么?我在其他源代码中也注意到这种类型的类命名,但我从来不理解这种假定的约定。

4

3 回答 3

1

嗯,是的,确实“该方法可以接受一个类的实例,该实例继承自某个实现接口的类”。

更一般地,implements一个接口的类在多态性方面可以说是该接口的子类,并且任何参数或变量都可以分配为其声明类的任何子类的实例。

至于那个班为什么叫这个名字TAdapter,恐怕我无法回答。至少,这不是任何常用的约定。:)

于 2012-12-30T07:35:52.510 回答
1

如果方法将ObjectParameter作为参数,由于多态性,它也可以使用SubClassOfObjectParameter

TAdapter开头的T只是一种不好的命名风格,因为它很神秘!

于 2012-12-30T07:40:46.183 回答
1

所以我可以安全地假设 Java 在参数传递中的工作方式之一是该方法可以接受一个类的实例,该类继承自实现方法描述中列出的同名接口的某个类?

是的

如果是这样,为什么这也是可能的?

这是因为多态性。你应该读这个。特别是多态性小节。

于 2012-12-30T08:09:23.967 回答