2014-01-28 64 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

相關問題