Очень распространенной ошибкой новичков является попытка использовать свойство класса "статически" без создания экземпляра этого класса. Это приводит к появлению упомянутого сообщения об ошибке:
Вы можете либо сделать нестатический метод статическим, либо создать экземпляр этого класса, чтобы использовать его свойства.
**Почему? Я не прошу решений. Я был бы благодарен узнать, что является причиной этого. Самая главная причина!
private java.util.List<String> someMethod(){
/* Some Code */
return someList;
}
public static void main(String[] strArgs){
// The following statement causes the error. You know why..
java.util.List<String> someList = someMethod();
}
Вы не можете вызвать то, чего не существует. Поскольку вы еще не создали объект, нестатический метод еще не существует. Статический метод (по определению) всегда существует.
Метод, который вы пытаетесь вызвать, является методом уровня экземпляра; у вас нет экземпляра.
Статические методы принадлежат классу, нестатические методы принадлежат экземплярам класса.
Суть объектно-ориентированного программирования заключается в инкапсуляции логики вместе с данными, на которых она работает.
Методы экземпляра - это логика, поля экземпляра - это данные. Вместе они образуют объект.
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() );
}
}
Что может быть результатом запуска вышеуказанной программы?
Без объекта нет данных экземпляра, и хотя методы экземпляра существуют как часть определения класса, им нужен экземпляр объекта для предоставления данных для них.
Теоретически, метод экземпляра, который не имеет доступа к каким-либо данным экземпляра, может работать в статическом контексте, но тогда нет никаких причин для того, чтобы он был методом экземпляра. В любом случае, это решение по языковому дизайну, а не придумывать дополнительное правило, запрещающее его.
Я только что понял, я думаю, что люди не должны подвергаться понятию «статический» очень рано.
Статические методы, вероятно, должны быть скорее исключением, чем нормой. Особенно рано в любом случае, если вы хотите изучить ООП. (Зачем начинать с исключения из правила?) Это очень контрпедагогично для Java, что «первая» вещь, которую вы должны выучить, - это публичная статическая пустая главная вещь. (В любом случае, немногие реальные приложения Java имеют свои основные методы.)
Я думаю, что стоит отметить, что по правилам языка Java компилятор Java вставляет эквивалент «этого».«когда он замечает, что вы получаете доступ к методам экземпляра или полям экземпляра без явного экземпляра. Конечно, компилятор знает, что он может делать это только из метода экземпляра, который имеет переменную «это», как это делают статические методы.
Это означает, что когда вы используете метод экземпляра, следующие значения эквивалентны:
instanceMethod();
this.instanceMethod();
и это также эквивалентно:
... = instanceField;
... = this.instanceField;
Компилятор эффективно вставляет «это».«когда вы не предоставляете конкретный экземпляр.
Этот (предназначенный для pun) бит «магической справки» компилятора может сбивать с толку новичков: это означает, что вызовы экземпляра и статические вызовы иногда имеют одинаковый синтаксис, в то время как в действительности это вызовы разных типов и базовых механизмов.
Вызов метода экземпляра иногда упоминается как вызов метода или отправка из-за поведения виртуальных методов, поддерживающих полиморфизм; диспетчерское поведение происходит независимо от того, написали ли вы явный экземпляр объекта для использования или компилятор вставил «это».«.
Механизм вызова статического метода проще, как вызов функции на языке без OOP.
Лично я думаю, что сообщение об ошибке вводит в заблуждение, оно может гласить «на нестатический метод нельзя ссылаться из статического контекста без указания явного экземпляра объекта ».
Компилятор жалуется на то, что он не может просто вставить стандарт «это».«как это происходит внутри методов экземпляра, поскольку этот код находится в статическом методе; однако, возможно, автор просто забыл предоставить экземпляр интереса для этого вызова & # 8212; скажем, экземпляр, возможно, предоставленный статическому методу в качестве параметр или созданный в рамках этого статического метода.
Короче говоря, вы наверняка можете вызывать методы экземпляра из статического метода, вам просто нужно иметь и указывать явный объект экземпляра для вызова.
Ответы пока описывают почему, но вот еще кое-что, что вы, возможно, захотите рассмотреть:
Вы можете вызвать метод из мгновенного класса, добавив вызов метода к его конструктору
Object instance = new Constuctor().methodCall();
или
primitive name = new Constuctor().methodCall();
Это полезно, если вы хотите использовать метод мгновенного класса только один раз в одной области. Если вы вызываете несколько методов из мгновенного класса в одной области, определенно создайте референтный экземпляр.
Если мы попытаемся получить доступ к методу экземпляра из статического контекста, компилятор не сможет угадать, на какой метод экземпляра (переменная для какого объекта) вы ссылаетесь. Тем не менее, вы всегда можете получить к нему доступ, используя ссылку на объект.
Компилятор фактически добавляет аргумент к нестатическим методам. Он добавляет < код > это < / код > указатель / ссылка. Это также причина, по которой статический метод не может использовать this < / code >, потому что нет объекта.
Статический метод связывает действие с типом объекта, тогда как нестатический метод связывает действие с экземпляром этого типа объекта. Обычно это метод, который делает что-то по отношению к экземпляру.
Например:
класс Car может иметь метод wash, который указывает на мытье конкретного автомобиля, тогда как статический метод относится к типу car.
если метод не является статичным, он «рассказывает» компилятору, что метод требует доступа к данным уровня экземпляра в классе (например, нестатическое поле). Эти данные не будут доступны, если не будет создан экземпляр класса. Таким образом, компилятор выдает ошибку, если вы пытаетесь вызвать метод из статического метода.. Если на самом деле метод НЕ ссылается на какой-либо нестатический элемент класса, сделайте метод статическим.
Например, в Resharper при создании нестатического метода, который НЕ ссылается на какой-либо статический элемент класса, генерируется предупреждающее сообщение «Этот метод может быть статичным»
Простая причина этого заключается в том, что статические данные членов родительского класса доступ может быть (только если они не переопределены), но, например, (нестатический) Члены данных или методы нам нужны их ссылки, и поэтому они могут быть только вызывается через объект.
Таким образом, вы просите очень основную причину?
Ну, поскольку вы разрабатываете на Java, компилятор генерирует объектный код, который виртуальная машина Java может интерпретировать. JVM в любом случае представляет собой бинарную программу, которая работает на машинном языке (вероятно, версия JVM, специфичная для вашей операционной системы и оборудования, была ранее скомпилирована другим языком программирования, таким как C, чтобы получить машинный код, который может работать на вашем процессоре). В конце любой код переводится на машинный код. Так, создать объект (экземпляр класса) эквивалентно резервированию пространства памяти (регистры памяти, которые будут регистрами процессора, когда планировщик процессора операционной системы поместит вашу программу в начало очереди, чтобы выполнить ее) иметь место для хранения данных, которое может читать и записывать данные. Если у вас нет экземпляра класса (который происходит в статическом контексте), у вас нет этого пространства памяти для чтения или записи данных. На самом деле, как говорили другие люди, данных не существует (потому что с самого начала вы никогда не писали и не зарезервировали место памяти для их хранения).
Извините за мой английский! Я латинский!
Нестатический метод зависит от объекта. Он распознается программой после создания объекта.& Лт; / Br >
Статические методы могут быть вызваны еще до создания объекта. Статические методы отлично подходят для сравнения или операций, которые не зависят от реальных объектов, с которыми вы планируете работать.