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

Old*_*ool 3 java inheritance swing

我正在尝试愚蠢的事情来使关于波动(我可以添加哪个组件)和继承的概念清楚.

JFrame f = new JFrame();
JFrame g = new JFrame();
f.add(g); // i know that its silly.
Run Code Online (Sandbox Code Playgroud)

它编译fin因为JFrame是a container并且add方法在其中定义.它的声明是

Component add ( Component comp);
Run Code Online (Sandbox Code Playgroud)

如果我做了上面有趣的东西我得到例外说

向容器添加窗口.

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

f.add(g);
Run Code Online (Sandbox Code Playgroud)

f被视为容器因为add()未定义JFrame但在其父级(或更具体的父级)中定义的是Container.While g被视为Component,因为JFrameComponent也是.

这似乎是一个真实或错误的问题,但请从技术上解释我,我相信是对还是不对?

但为什么例外说

向容器添加窗口.

那么为何不

将容器添加到组件.

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

我的第三个问题是,在Component和之间需要递归继承Container

编辑为什么异常这样说?

Cod*_*der 5

JFrame的层次结构是这样的,

java.awt.Component
 java.awt.Container
  java.awt.Window
   java.awt.Frame
    javax.swing.JFrame
Run Code Online (Sandbox Code Playgroud)

A JFrame是a Component,Containera Window也是.

那么,为什么例外说将一个窗口添加到容器而不是容器添加到容器,

那是因为你可以添加Container一个Container.例子,JPanelJFrame.

你只能添加Window一个Container.因为Windows用于顶级组件而不是在另一个组件内.

对于你的第三个问题:

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

没有必要这样做.而且情况也不是这样.A Container是一个Component.但Component并非总是如此Container.它只是你在这里看到的JFrame的多级继承.不是递归的.


Cod*_*roc 5

JFrame extends Frame extends Window extends Container extends Component

所以间接地JFrameComponentjframe.add(jframe2)合法的JFrame是孩子Window的消息是说,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");
     }
 }
Run Code Online (Sandbox Code Playgroud)