java - 当对象调用其父类(super class)的方法时如何处理对象?

标签 java swing inheritance

我正在尝试一些愚蠢的事情来使关于 Swing (我可以添加到哪个组件)和继承的概念变得清晰。

JFrame f = new JFrame();
JFrame g = new JFrame();
f.add(g); // i know that its silly.

它编译 fin 因为 JFrame 是一个 container 并且其中定义了 add 方法。它的声明是

Component add ( Component comp);

如果我做了上面有趣的事情,我会得到异常提示

adding a window to a container.

我由此分析出的是,当我们调用继承树中上述类中定义的方法时,该对象被视为继承树中上述类的对象。就像我们在这里做的那样

f.add(g);

f 被视为容器,因为 add() 未在 JFrame 中定义,而是在其父级(或父级到父级)中定义具体来说)就是 Container。虽然 g 被视为组件,因为 JFrame 也是一个 Component

这似乎是一个正确或错误的问题,但请从技术上向我解释一下,我认为是对还是错?

但是为什么异常在说

adding a window to a container.

为什么不

adding a container to a component.

as g 作为 component 传递给 add()?

我的第三个问题是ComponentContainer之间递归继承的必要性是什么?

编辑为什么异常这么说?

最佳答案

JFrame extends Frame extends Window extends Container extends Component

因此 JFrame 间接地是一个 Component 并且 jframe.add(jframe2)合法的并且作为 JFrame is child of Window 消息说将窗口添加到容器。 是非法的。

因为它在 Container 类中检查如下,

 /**
 * Checks that the component is not a Window instance.
 */
 private void checkNotAWindow(Component comp){
    if (comp instanceof Window) {
       throw new IllegalArgumentException("adding a window to a container");
     }
 }

关于java - 当对象调用其父类(super class)的方法时如何处理对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31609886/

相关文章:

java - JAVA Swing 中具有窗口焦点的 JTable Cell

java - 标记 "<optional>"在 dependencyManagement 元素中是否有效?

java - 将 UIManager 中的 FileChooserUI 属性设置为系统的

c# - C# 8 默认接口(interface)实现是否允许多重继承

c++ - 从模板类继承,类型在子类中声明

javascript - 如何使用 window.crypto.getRandomValues 获取特定范围内的随机值

java - 处理 BlockingQueue 中的所有元素

java - 在 java.awt.Graphics 上绘制 java.awt.Cursor

java - 如何自动更改jlable中的图像

c# - 基类继承另一个基类?