为什么在Java中使用方法调用中间使用括号?

时间:2014-01-28 10:29:59

标签: java class methods field instance

虽然我做了一些广泛的搜索,但我发现了一些代码并且无法理解它的某个方面!

我的问题是:为什么在方法调用的中间使用括号?

    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中有基础,比如类字段,类方法,实例字段,实例方法,内部类,但是这个。

6 个答案:

答案 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。

请记住方法链中的方法是从左到右处理的。

上面执行为

  1. toUpperCase() - “HELLLOO”
  2. replace("LOO", "O") - “HELLO”
  3. concat(" WORLD") - “HELLO WORLD”
  4. 将“HELLO WORLD”分配给字符串b。
  5. 对于上面的代码,我们首先获取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