2011-05-30 14 views
0

我正在閱讀libreoffice的Java代碼,並且有一件事我不是很瞭解。 方法updateUI()調用2次方法updateUI並將它們作爲參數傳遞給Vector變量,但此方法不接受任何參數。任何人都可以解釋我這個參數的作用?如果updateUI()被調用是這樣的:瞭解如何調用非靜態方法的問題

UnoDataAware.updateUI(); 

它抱怨說:

非靜態方法不能從靜態上下文

回答

0

updateUI()是一個實例方法所引用,所以你必須從一個實例中調用它,而updateUI(Collection dataAwares)是一個靜態方法,並且直接從該類中調用。

而從同一來源:

  /** 
199  * given a collection containing DataAware objects, 
200  * calls updateUI() on each memebr of the collection. 
201  * @param dataAwares a collection containing DataAware 

對象。 202 */

0

您正在看錯行。

看線203,這就是被調用的方法。

1

有一個在你提供的第二連桿的另一方法:(線203)

public static void updateUI(Collection dataAwares) { 
      for (Iterator i = dataAwares.iterator(); i.hasNext();) 
       ((DataAware) i.next()).updateUI(); 
     } 

這是方法正被稱爲2次。靜態意味着您必須先指定類名稱,然後才能調用它。除非你是那個班的一部分。

Users.getFirstName()(例如)

+0

靜態並不意味着你必須指定類的名稱,然後才能調用它,它只是意味着你*可以*指定類的名稱。你可以做'someInstance.someStaticMethod();'。但是,在「靜態上下文」(即靜態方法的主體)內,不能引用實例成員。也就是說,你不能'static void someMethod(){someNonStaticMethod(); }'。這是因爲沒有指定實例來調用'someNonStaticMethod'。 – 2011-06-07 17:44:13

0

這也就是所謂的功能:

public static void updateUI(Collection dataAwares)

public void updateUI()

1

當你調用靜態版本這種方法你沒有在實例化的上下文中使用它目的。這就是您需要將參數傳遞給靜態方法的原因,以便它知道要更新UI的對象。

該參數將允許靜態updateUI方法通過DataAware對象的集合迭代,並從非靜態上下文調用他們updateUI方法。這意味着無參數updateUI不需要對該對象的引用,因爲它屬於一個對象。