Вопрос-ответ

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;
}

public static void main(String[] strArgs){
// The following statement causes the error.
java.util.List<String> someList = someMethod();
}
Переведено автоматически
Ответ 1

Вы не можете вызвать то, чего не существует. Поскольку вы не создали объект, нестатический метод еще не существует. Статический метод (по определению) существует всегда.

Ответ 2

Метод, который вы пытаетесь вызвать, является методом уровня экземпляра; у вас нет экземпляра.

static методы принадлежат классу, не-static методы принадлежат экземплярам класса.

Ответ 3

Суть объектно-ориентированного программирования заключается в инкапсуляции логики вместе с данными, с которыми она оперирует.

Методы экземпляра - это логика, поля экземпляра - это данные. Вместе они образуют объект.

public class Foo
{
private String foo;
public Foo(String foo){ this.foo = foo; }
public getFoo(){ return this.foo; }

public static void main(String[] args){
System.out.println( getFoo() );
}
}

Что может быть результатом запуска вышеупомянутой программы?

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

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

Ответ 4

Я только что понял, я думаю, что люди не должны слишком рано знакомиться с концепцией "статический".

Статические методы, вероятно, должны быть скорее исключением, чем нормой. В любом случае, особенно на ранних этапах, если вы хотите изучить ООП. (Зачем начинать с исключения из правила?) Это очень непедагогично для Java, что "первое", что вы должны изучить, - это общедоступная статическая функция void main . (В любом случае, немногие реальные Java-приложения имеют свои собственные основные методы.)

java