import javax.swing.*;
class Foo{
public static void main(String args[]){
JFrame f=new JFrame();
f.add("North",new JButton()); //Line 1
f.add(new JButton(),"North"); //Line 2
f.setVisible(true);
}
}
swing API 声明 JFrame 类包含 5 个名为 add 的方法,继承自 java.awt.Container 和另一个继承自 java.awt.Component 的 add 方法。
**Their signatures are as follows:**
*Inherited from java.awt.Container*
add(Component)
add(Component,int)
add(Component,Object)
add(Component,Object,int)
add(String,Component)
*Inherited from java.awt.Component*
add(java.awt.PopupMenu)
我预计在 API 中会有两个重载方法,其签名为 add(Component,String) 和 add(String,Component)。但鉴于情况并非如此,我假设第 1 行调用 add(String,Component) 而第 2 行调用 add(Component,Object)。
还有,谁能给我解释一下调用的方法是如何实现的。我试图通过查看 API 的源代码来解决这个问题,但是方法调用链就像一个迷宫,我可以使用以前去过那里的人的指导。
最佳答案
最终,他们都调用Container#addImpl(Component, Object, int)
, 期待 add(PopupMenu)
add(Component)
调用addImpl(comp, null, -1)
add(String, Component)
调用addImpl(comp, name, -1)
add(Component, int)
调用addImpl(comp, null, index)
add(Component, Object)
调用addImpl(comp, constraints, -1)
add(Component, Object, int)
调用addImpl(comp, constraints, index)
addImpl
做了很多工作...
它确保;
- 组件是自己添加的
- 该组件不是
Window
类型(因为您不能向组件添加窗口) - 组件的图形配置相同
- 该组件尚未包含在现有容器中,如果是则将其删除
- 该组件是在有效索引范围内添加的(如果
index
> -1)
然后...
- 将组件添加到此容器管理的组件列表中
- 调用组件的
addNotify
方法(如果容器在屏幕上实现) - 通知布局管理器新添加的组件
- 通知所有监听器有关容器事件 (
componentAdded
) 和层次结构事件 (hierarchyChanged
)
额外
“添加”方法是装饰器。他们提供了许多入口方法,这些方法可以过滤成一个方法,目的是根据工作的上下文使开发人员的生活更简单。
关于java - 我在Java中使用这个方法调用时调用的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14722498/