2014-01-28 100 views
3

我遇到了一些代码,并不能理解它的某个方面,虽然我已经做了一些广泛的搜索!为什么在Java中的方法调用中使用括号?

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

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

+1

我相信你正在寻找的答案是:如果一个方法返回一个对象,那么该对象的方法可以从该方法调用。 –

+2

也许你会明白'{Foo a = getFoo(); a.doSomethingFooish();}'。但是不需要存储'getFoo()'的结果,我们可以直接使用它:'getFoo()。doSomethingFooish()' – Ingo

+0

哦,我明白了。非常感谢您的帮助。 – user3243986

回答

9

这就是常用的成语,叫做方法链接,貌似。

getContentPane().add(panel); 

解析作为

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

的括号表示一个方法调用,并且其返回值被就地用作this对象的下一个方法调用(add)。

1

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

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

所以你可能不会看到你正在使用的类getContentPane()方法,但该方法可进一步上涨的类层次结构,并通过与JFrame的继承关系曝光。

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

1
getContentPane().add(panel); 

getContentPane方法没有输入参数,所以你必须用括号空调用它使Java编译器的快乐。之后,您拨打电话getContentPane-呼叫add(panel)

0

getContentPane()是在JFrame一个方法,并返回一个对象(一个ContentPane),其有一个方法add(),这又需要一个裁判一个JPanel对象作为其参数。最后挺直的。

由于getContentPane()属于当前对象,它会如果代码被写成

this.getContentPane().add(panel); 

要跟进这样的事情是在Javadoc看起来是个好主意有点清晰。例如 API for JSE7

1

Java语言规范可能有点拘谨,但作为一个开发者,你要处理很多形式文法,所以我要指出的相关规则,并加以解释:

的一个method invocation的语法定义了括号是强制性的:

MethodInvocation: 
    MethodName (ArgumentList?) 
    Primary . NonWildTypeArguments? Identifier (ArgumentList?) 
    ... 

Primary表达式可以是MethodInvocation,所以方法调用返回对象可以被“链接”:

Primary: 
    PrimaryNoNewArray 
    ... 

PrimaryNoNewArray: 
    ... 
    MethodInvocation 
    ... 
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(); 

链接在减少一半的代码。

希望这会有所帮助。

+0

方法链接,我认为我并不陌生。当我研究“代码”时,它没有任何意义。现在我知道,谢谢。 – user3243986

相关问题