调用对象超类的方法时如何处理对象?

时间:2015-07-24 11:51:43

标签: java swing inheritance

我正在尝试愚蠢的事情,使关于波动的概念(我可以添加哪些组件)和继承。

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

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

Component add ( Component comp);

如果我做上面有趣的事情,我会得到例外说法

  

向容器添加窗口。

我从中分析的是,当我们在继承树中调用上面类中定义的方法时,该对象被视为继承树中上述类的对象。当我们这样做时

f.add(g);

f被视为容器,因为add()中没有定义JFrame,但是在Container的父项(或更具体的父项)中定义了gJFrame Component被视为组件,因为g也是add()

这似乎是一个真实或错误的问题,但请在技术上解释我,我认为是对的?

但为什么例外说

  

向容器添加窗口。

为什么不

  

向组件添加容器。

component作为Component传递给Container

我的第三个问题是getcontext().prec = 102 101之间需要递归继承吗?

编辑为什么例外是这样说的?

2 个答案:

答案 0 :(得分:5)

JFrame的层次结构就是这样,

java.awt.Component
 java.awt.Container
  java.awt.Window
   java.awt.Frame
    javax.swing.JFrame

JFrame还是ComponentContainerWindow

那么,为什么例外向容器添加窗口而不是容器到容器

那是因为您可以向Container添加Container。例如,JPanelJFrame

您无法向Window添加Container。因为Window用于顶级组件而不是在另一个组件内。

对于第三个问题:

  

Component和Container之间需要递归继承吗?

没有必要这样做。而且情况也不是这样。 ContainerComponent。但是Component并不总是Container。它只是你在这里看到的JFrame的多级继承。不是递归的。

答案 1 :(得分:5)

JFrame extends Frame extends Window extends Container extends Component

所以间接JFrameComponentjframe.add(jframe2)合法,而JFrameWindow消息的孩子说的adding a window to a container.是非法的。

在课程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");
     }
 }