2010-02-10 3 views
2

В настоящее время я пытаюсь вызвать его, как это:как делает следующий код работы

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

Выходной код привет

+0

Не могли бы вы переформатировать свой вопрос, используя формат «кода»? – Timothy

+4

Обратите внимание, что ваш код сработал бы, если бы вы изменили 'Test t = null;' на 'Test t = new Test();' – Pool

+1

@ The Feast: он работает даже сейчас, см. Мой комментарий к первоклассному ответу. – Roman

ответ

11

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

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

+0

Но они могут быть вызваны (не нулевыми) экземплярами с тем же эффектом. (Хотя это не предпочтительнее, поскольку это может быть обманчиво.) –

+1

@FarmBoy: их даже можно вызвать в экземплярах _null_ с таким же эффектом, компилятор оптимизирует его для вас) – Roman

+0

Точно. Как это возможно? Что происходит внизу. –

1

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

+2

Поскольку они находятся в одном классе **, и оба метода являются статическими ... ** – akf

5

Вам не нужно инстанцировать тест для вызова статического метода. Ваш главный может выглядеть следующим образом:

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

    public static void main(String[] args) { 
     Test.test(); 
    } 
} 
+1

Прокомментируйте ваш код. ;) – CSchulz

3

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

ClassName.methodName(args); 

или

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

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

instanceName.methodName(args) 

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

Так что в вашем случае:

Test.test(); 

или

test(); 

от основной метод будет делать.

0

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

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

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

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

Test.test(); 

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

+0

Test.test() отлично работает. Но выше также работает фрагмент кода выше. Я хотел знать, как это работает –

+0

Не считается хорошей практикой использовать экземпляр для ссылки на статические методы. Используйте Test.test(), а не myClass.test(). – jax

0

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

+0

Как основной метод в том же классе **, и оба они статические ** ... – akf

0

Кстати.Код работает отлично без каких-либо ошибок nullpointer Этот код печатает hi

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

+0

@ Ответчик Романа на ваш вопрос. –

1
for (Method m : Class.forName ("Test").getDeclaredMethods()) { 
    if (Modifier.isStatic (m.getModifiers()) { 
     m.invoke (null); 
    } 
} 

только для лулзов

+0

Прохладный! Мне это нравится! :) –

0

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

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

Смежные вопросы