Проблема с пониманием того, как вызывается нестатический метод

#java #libreoffice

#java #libreoffice

Вопрос:

Я читаю Java-код libreoffice, и есть одна вещь, которую я действительно не понимаю. Метод updateUI() дважды вызывает метод updateUI, и они передают в качестве параметра векторную переменную, НО этот метод не принимает никаких параметров. Кто-нибудь может объяснить мне, что делает этот параметр? если updateUI() вызывается таким образом:

 UnoDataAware.updateUI(); 
  

он жалуется и говорит:

на нестатический метод нельзя ссылаться из статического контекста

Ответ №1:

Во второй предоставленной вами ссылке есть другой метод: (строка 203)

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

Этот метод вызывается 2 раза. Статический означает, что вы должны указать имя класса, прежде чем сможете его вызвать. Если только вы не принадлежите к этому классу.

Users.getFirstName() (пример)

Комментарии:

1. Статичность не означает, что вы должны указывать имя класса, прежде чем сможете его вызвать, это просто означает, что вы можете указать имя класса. Вы можете сделать someInstance.someStaticMethod(); . Однако в «статическом контексте» (т. Е. в теле статического метода) вы не можете ссылаться на члены экземпляра. Т.Е. вы не можете сделать static void someMethod() { someNonStaticMethod(); } . Это потому, что не указан экземпляр для вызова someNonStaticMethod .

Ответ №2:

Я бы сказал, что проблема с перекрестными ссылками плохая. Вот метод, который вы ищете:

DataAware.updateUI(Collection dataAwares)

Ответ №3:

Когда вы вызываете статическую версию этого метода, вы не используете его в контексте созданного объекта. По этой причине вам нужно передать параметр статическому методу, чтобы он знал, для каких объектов обновлять пользовательский интерфейс.

Этот параметр позволит статическому updateUI методу выполнять итерации по коллекции объектов DataAware и вызывать их updateUI метод из нестатического контекста. Это означает, что для параметра без updateUI не нужна ссылка на объект, потому что он принадлежит объекту.

Ответ №4:

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 */

Ответ №5:

Вы смотрите не на ту строку.

Посмотрите на строку 203 , это вызываемый метод.

Ответ №6:

Это функция, которая вызывается:

public static void updateUI(Collection dataAwares)

не

public void updateUI()