虽然我做了一些广泛的搜索,但我发现了一些代码并且无法理解它的某个方面!
我的问题是:为什么在方法调用的中间使用括号?
package com.zetcode;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class QuitButtonExample extends JFrame {
public QuitButtonExample() {
initUI();
}
private void initUI() {
JPanel panel = new JPanel();
getContentPane().add(panel);
panel.setLayout(null);
JButton quitButton = new JButton("Quit");
quitButton.setBounds(50, 60, 80, 30);
quitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
panel.add(quitButton);
setTitle("Quit button");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
QuitButtonExample ex = new QuitButtonExample();
ex.setVisible(true);
}
});
}
}
我指的是getContentPane().add(panel);
声明。我知道它的作用,但并不真正理解它是如何工作的。我是Java的新手,并且在OO中有基础,比如类字段,类方法,实例字段,实例方法,内部类,但是这个。
答案 0 :(得分:9)
这就是常见的成语,称为方法链接,看起来像。
getContentPane().add(panel);
解析为
Container c = this.getContentPane();
c.add(panel);
parens表示方法调用,其返回值作为this
对象用于下一个方法调用(add
)。
答案 1 :(得分:2)
这称为方法链。要理解这一点,一个简单的例子将对您有所帮助。
String a = "hellloo";
String b = a.toUpperCase().replace("LOO", "O").concat(" WORLD");
System.out.println(b);
这将打印HELLO WORLD。
请记住方法链中的方法是从左到右处理的。
上面执行为
toUpperCase()
- “HELLLOO”replace("LOO", "O")
- “HELLO”concat(" WORLD")
- “HELLO WORLD”对于上面的代码,我们首先获取ContentPane,然后向其添加一个面板。
这减少了实现它所需的代码量。
通常情况就好像
Container container = getContentPane();
container.getContentPane();
Chaining将代码减少了一半。
希望这有帮助。
答案 2 :(得分:1)
getContentPane()
是在this
上调用的方法。因为它是一个方法,所以必须使用括号来调用它。
在Java中,this
引用对象的当前实例,在调用当前类中的方法时可以省略。由于QuitButtonExample
扩展了JFrame
类,因此可以调用JFrame
的所有受保护和公共方法。
因此,您可能无法在正在处理的类上看到getContentPane()
方法,但该方法可在类层次结构的后面进一步使用,并通过与JFrame
的继承关系公开。
此外,getContentPane()
方法返回类型为Container
的对象,我们也可以在其上调用方法。当从方法接收到对象并且立即调用另一个方法时,例如getContentPane().add(panel)
,这称为链接。没有必要将从方法返回的每个对象存储到变量中,我们可以简单地使用从调用方法返回的对象,而不将其分配给存储的变量。
答案 3 :(得分:1)
getContentPane().add(panel);
getContentPane
方法没有输入参数,因此您必须使用空括号调用它以使java编译器满意。之后,您对add(panel)
的结果进行getContentPane
来电 - 致电。
答案 4 :(得分:1)
Java语言规范可能有点正式,但作为开发人员,您将处理许多正式语法,所以让我指出相关规则并解释它们:
method invocation的语法定义括号是必需的:
MethodInvocation:
MethodName ( ArgumentList? )
Primary . NonWildTypeArguments? Identifier ( ArgumentList? )
...
Primary
表达式可以是MethodInvocation
,因此返回对象的方法调用可以“链接”:
Primary:
PrimaryNoNewArray
...
PrimaryNoNewArray:
...
MethodInvocation
...
答案 5 :(得分:0)
getContentPane()
是JFrame
中的一种方法,它返回一个对象(ContentPane
),该对象有一个方法add()
,该方法又将引用转换为{{ 1}} object作为参数。最后很直接。
由于JPanel
属于当前对象,如果代码写为
getContentPane()
要跟进这样的事情,最好查看Javadoc。例如 API for JSE7