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,因为JFrame它Component也是.
这似乎是一个真实或错误的问题,但请从技术上解释我,我相信是对还是不对?
但为什么例外说
向容器添加窗口.
那么为何不
将容器添加到组件.
作为g传递给add()作为component?
我的第三个问题是,在Component和之间需要递归继承Container?
编辑为什么异常这样说?
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.例子,JPanel到JFrame.
你只能添加Window一个Container.因为Windows用于顶级组件而不是在另一个组件内.
对于你的第三个问题:
Component和Container之间需要递归继承吗?
没有必要这样做.而且情况也不是这样.A Container是一个Component.但Component并非总是如此Container.它只是你在这里看到的JFrame的多级继承.不是递归的.
JFrame extends Frame extends Window extends Container extends Component
所以间接地JFrame是Component和jframe.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)