Java参数传递



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

代码#1是否

addKeyListener((KeyListener)new TAdapter());

和代码#2

addKeyListener(new TAdapter());

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

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

嗯,是的,确实"该方法可以接受从实现接口的某个类继承的类的实例"。

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

至于为什么那个类被命名为TAdapter,恐怕我无法回答。至少,这不是任何普遍使用的惯例。:(

如果一个方法以ObjectParameter为参数,则由于多态性,它也可以采用SubClassOfObjectParameter

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

因此,我可以放心地假设Java在参数中的工作方式之一传递的是该方法可以接受一个类的实例从实现相同接口的某个类继承方法说明中列出的名称?

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

这是因为多态性。你应该读一下。尤其是多态性小节。

最新更新