我正在尝试愚蠢的事情,使关于波动的概念(我可以添加哪些组件)和继承。
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
的父项(或更具体的父项)中定义了g
。JFrame
Component
被视为组件,因为g
也是add()
。
这似乎是一个真实或错误的问题,但请在技术上解释我,我认为是对的?
但为什么例外说
向容器添加窗口。
为什么不
向组件添加容器。
将component
作为Component
传递给Container
?
我的第三个问题是getcontext().prec = 102
和101
之间需要递归继承吗?
编辑为什么例外是这样说的?
答案 0 :(得分:5)
JFrame的层次结构就是这样,
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Frame
javax.swing.JFrame
JFrame
还是Component
,Container
和Window
。
那么,为什么例外向容器添加窗口而不是容器到容器,
那是因为您可以向Container
添加Container
。例如,JPanel
到JFrame
。
您无法向Window
添加Container
。因为Window
用于顶级组件而不是在另一个组件内。
对于第三个问题:
Component和Container之间需要递归继承吗?
没有必要这样做。而且情况也不是这样。 Container
是Component
。但是Component
并不总是Container
。它只是你在这里看到的JFrame的多级继承。不是递归的。
答案 1 :(得分:5)
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");
}
}