как работает следующий код - PullRequest
2 голосов
/ 10 февраля 2010

В настоящее время я пытаюсь вызвать это так:

class Test {
    public static void test() {
        System.out.println("hi");
    }
    public static void main(String[] args) {
        Test t = null;
        t.test();
    }
}

Вывод кода привет

Ответы [ 11 ]

11 голосов
/ 10 февраля 2010

Попробуйте Test.test() с именем класса перед точкой.

Статические методы вызываются в самом классе, а не в экземплярах класса.

5 голосов
/ 10 февраля 2010

Вам не нужно создавать экземпляр Test для вызова статического метода. Ваша главная может выглядеть так:

public static void main(String[] args) {
    Test.test();
}
3 голосов
/ 10 февраля 2010

Статические метиоды должны вызываться с именем класса, без необходимости создания экземпляра класса, как в

ClassName.methodName(args);

или

methodName(args); // from other static methods of the same class.

Вы также можете ссылаться на статические методы с помощью ссылки на объект, такой как

instanceName.methodName(args)

но это не рекомендуется, потому что это не дает понять, что они являются классовыми методами.

Итак, в вашем случае:

Test.test();

или

test();

из основного метода сделаем.

2 голосов
/ 10 февраля 2010

Попробуйте:

Test.test();
1 голос
/ 10 февраля 2010
for (Method m : Class.forName ("Test").getDeclaredMethods ()) {
   if (Modifier.isStatic (m.getModifiers ()) {
      m.invoke (null);
   }
}

только для lulz

1 голос
/ 10 февраля 2010

Вы в одном классе, вы можете просто позвонить test() с main().

0 голосов
/ 10 февраля 2010

Это работает, потому что при вызове статического метода с использованием ссылки, ссылка не используется . Компилятор просматривает объявленный тип / static / время компиляции выражения, к которому вызывается метод, и использует этот тип для поиска статического метода.

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

0 голосов
/ 10 февраля 2010

Кстати. Код работает нормально без каких-либо исключений Этот код печатает привет

Я хотел знать, что происходит внутри, когда ссылка используется для вызова статического метода.

0 голосов
/ 10 февраля 2010

Звоните Test.test(). Так как метод main является static и в том же классе, вы также можете напрямую вызвать test().

0 голосов
/ 10 февраля 2010

Хорошая вещь о статических методах и статических переменных в том, что вам не нужен экземпляр класса для его использования.

Обычно вы создаете экземпляр и вызываете метод

Test myClass = new Text();
myClass.test();

Однако для статических методов первая строка не нужна, вам просто нужно написать имя класса в начале

Test.test();

Однако в статических методах вы не можете получить доступ к каким-либо переменным экземпляра внутри класса Test - если только они не являются статическими!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...