What is the reason behind "non-static method cannot be referenced from a static context"? [duplicate]
В чем причина "на нестатический метод нельзя ссылаться из статического контекста"?
Очень распространенная ошибка новичков заключается в том, что вы пытаетесь использовать свойство класса "статически", не создавая экземпляр этого класса. В результате вы получаете упомянутое сообщение об ошибке:
Вы можете либо сделать нестатический метод статическим, либо создать экземпляр этого класса для использования его свойств.
В чем причина этого? Меня интересует не решение, а причина.
private java.util.List<String> someMethod(){ /* Some Code */ return someList; }
publicstaticvoidmain(String[] strArgs){ // The following statement causes the error. java.util.List<String> someList = someMethod(); }
Переведено автоматически
Ответ 1
Вы не можете вызвать то, чего не существует. Поскольку вы не создали объект, нестатический метод еще не существует. Статический метод (по определению) существует всегда.
Ответ 2
Метод, который вы пытаетесь вызвать, является методом уровня экземпляра; у вас нет экземпляра.
static методы принадлежат классу, не-static методы принадлежат экземплярам класса.
Ответ 3
Суть объектно-ориентированного программирования заключается в инкапсуляции логики вместе с данными, с которыми она оперирует.
Методы экземпляра - это логика, поля экземпляра - это данные. Вместе они образуют объект.
Что может быть результатом запуска вышеупомянутой программы?
Без объекта нет данных экземпляра, и хотя методы экземпляра существуют как часть определения класса, им нужен экземпляр объекта, чтобы предоставлять для них данные.
Теоретически метод экземпляра, который не обращается ни к каким данным экземпляра, может работать в статическом контексте, но тогда на самом деле нет никаких причин для того, чтобы это был метод экземпляра. Это решение языкового дизайна разрешить это в любом случае, а не придумывать дополнительное правило, запрещающее это.
Ответ 4
Я только что понял, я думаю, что люди не должны слишком рано знакомиться с концепцией "статический".
Статические методы, вероятно, должны быть скорее исключением, чем нормой. В любом случае, особенно на ранних этапах, если вы хотите изучить ООП. (Зачем начинать с исключения из правила?) Это очень непедагогично для Java, что "первое", что вы должны изучить, - это общедоступная статическая функция void main . (В любом случае, немногие реальные Java-приложения имеют свои собственные основные методы.)