Я думаю, что стоит отметить, что по правилам языка Java компилятор Java вставляет эквивалент «этого». когда он замечает, что вы обращаетесь к методам экземпляра или полям экземпляра без явного экземпляра. Конечно, компилятор знает, что он может делать это только из метода экземпляра, который имеет «эту» переменную, поскольку статические методы этого не делают.
Это означает, что, когда вы находитесь в методе экземпляра следующее эквивалентны:
instanceMethod();
this.instanceMethod();
и они также эквивалентны:
... = instanceField;
... = this.instanceField;
Компилятор эффективно вставляя «это.» когда вы не поставляете конкретный экземпляр.
Этот кусочек «магической помощи» компилятором может путать новичков: это означает, что вызовы экземпляров и статические вызовы иногда имеют одинаковый синтаксис, в то время как на самом деле это вызовы разных типов и базовых механизмов.
Вызов метода экземпляра иногда называют вызовом метода или отправкой из-за поведения виртуальных методов, поддерживающих полиморфизм; поведение диспетчеризации происходит независимо от того, написал ли явный экземпляр объекта для использования или компилятор вставил «это».
Механизм вызова статического метода проще, как вызов функции на языке, отличном от OOP.
Лично я думаю, что сообщение об ошибке вводит в заблуждение, он может читать «нестатический метод не может ссылаться на статический контекст без указания явного экземпляра объекта».
Что компилятор жалуется на то, что он не может просто вставить стандарт «это». как это делается в методах экземпляра, потому что этот код находится в статическом методе; однако, возможно, автор просто забыл предоставить пример интереса для этого вызова —, скажем, экземпляр, который может быть предоставлен статическому методу в качестве параметра или создан в этом статическом методе.
Короче говоря, вы, безусловно, можете вызвать методы экземпляра из статического метода, вам просто нужно указать и указать явный экземпляр объекта для вызова.
«Поскольку вы еще не создали объект, нестатический метод еще не существует». - Большое спасибо. Я должен был подумать об этом. – DragonBorn 2008-11-14 18:46:14
Метод сам по себе существует. Где-то в определении загруженного класса. Так что ответ неправильный :) – 2008-11-14 19:57:46