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

3
我看到了一些代码,尽管我进行了广泛的搜索,但我仍然无法理解其中某个方面!
我的问题是:为什么方法调用中要使用括号?
    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新手,并且掌握了类字段、类方法、实例字段、实例方法、内部类等基础知识,但对这个还不熟悉。


1
我相信你正在寻找的答案是:如果一个方法返回一个对象,则可以从该方法调用该对象的方法。 - Ceiling Gecko
2
你可能会理解 { Foo a = getFoo(); a.doSomethingFooish();}。但是没有必要存储 getFoo() 的结果,我们可以直接使用它:getFoo().doSomethingFooish() - Ingo
哦,我明白了。非常感谢您的帮助。 - user3243986
6个回答

9
这是一个常见的习语,称为“方法链”。
getContentPane().add(panel);

解析为

Container c = this.getContentPane();
c.add(panel);

括号表示一个方法调用,返回值将被用作下一个方法调用(add)中的this对象。

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。
类似地,对于上面的代码,我们首先获取 ContentPane,然后向其添加一个面板。
这减少了实现所需的代码量。
通常情况下,它可能像下面这样。
Container container = getContentPane();
container.getContentPane();

链接调用可以将代码减少一半。

希望这能够帮助到您。


方法链式调用,我觉得我并不陌生。当我学习“代码”时,它并没有什么意义。现在我明白了,谢谢。 - user3243986

1
getContentPane().add(panel);

getContentPane方法没有输入参数,因此您必须使用空括号调用它,以使Java编译器满意。之后,您需要在getContentPane调用的结果上进行add(panel)调用。


1
作为开发人员,你将会处理很多正式的语法,因此《Java语言规范》可能有点正式。让我指出相关规则并对其进行解释: 方法调用的语法定义了括号是必需的。
MethodInvocation:
    MethodName ( ArgumentList? )
    Primary . NonWildTypeArguments? Identifier ( ArgumentList? )
    ...

一个 Primary 表达式可以是一个 MethodInvocation,因此返回对象的方法调用可以被“链接”起来:
Primary:
    PrimaryNoNewArray
    ...

PrimaryNoNewArray:
    ...
    MethodInvocation
    ...

1

getContentPane()是在this上调用的方法。由于它是一个方法,必须使用括号进行调用。

在Java中,this指的是对象的当前实例,并且在调用当前类中的方法时可以省略。由于QuitButtonExample扩展了JFrame类,因此它能够调用JFrame的所有受保护和公共方法。

因此,您可能看不到正在使用的类上的getContentPane()方法,但该方法在类层次结构中更高级别处可用,并通过与JFrame的继承关系公开。

此外,getContentPane()方法返回类型为Container的对象,我们也可以在其上调用方法。当从方法接收到对象并立即调用另一个方法,例如getContentPane().add(panel),这被称为链接。不需要将从方法返回的每个对象存储到变量中,我们可以简单地使用从调用的方法返回的对象而无需将其分配给存储的变量。


0

getContentPane()JFrame中的一个方法,它返回一个对象(一个ContentPane),该对象具有一个add()方法,该方法将一个JPanel对象的引用作为其参数。最后非常简单明了。

由于getContentPane()属于当前对象,因此如果代码编写为

this.getContentPane().add(panel);

要跟进这样的事情,最好查看Javadoc。例如JSE7 API


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接