Когда использовать статические методы

Мне интересно, когда использовать статические методы? Скажем, у меня есть класс с несколькими геттерами и сеттерами, одним или двумя методами, и я хочу, чтобы эти методы вызывались только для экземпляра объекта класса. Означает ли это, что я должен использовать статический метод?

Пример:

Obj x = new Obj();
x.someMethod();

...or:

Obj.someMethod(); // Is this the static way?

Я в замешательстве!


person KP65    schedule 19.04.2010    source источник


Ответы (22)


Одно практическое правило: спросите себя, имеет ли смысл вызывать этот метод, даже если объект еще не создан? Если да, то он определенно должен быть статичным.

Итак, в классе Car у вас может быть метод:

double convertMpgToKpl(double mpg)

... что было бы статично, потому что кто-то может захотеть узнать, во что конвертируется 35 миль на галлон, даже если никто никогда не строил Car. Но этот метод (который устанавливает эффективность одного конкретного Car):

void setMileage(double mpg)

... не может быть статическим, так как невозможно вызвать метод до создания какого-либо Car.

(Между прочим, обратное не всегда верно: иногда у вас может быть метод, который включает два Car объекта, и при этом он все равно должен быть статическим. Например:

Car theMoreEfficientOf(Car c1, Car c2)

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

person not-just-yeti    schedule 19.04.2010
comment
Вот несколько хороших примеров. Я бы добавил, однако, что статика часто бывает полезна, когда вы знаете, что что-то не изменится в разных экземплярах. Если это так, я бы действительно рассмотрел принцип единой ответственности, который подразумевает, что у класса должна быть одна ответственность и, следовательно, только одна причина для изменения. Я считаю, что следует подумать о перемещении функции ConvertMpgToKpl (double mpg) и аналогичных методов в их собственный класс. Объект car предназначен для создания экземпляров автомобилей, а не для сравнения между ними. Они должны быть внешними по отношению к классу. - person Zack Jannsen; 13.08.2012
comment
Думаю, я бы предпочел метод Car#isMoreEfficientThan(Car). Его преимущество в том, что машина, которую вы возвращаете вничью, не является произвольной. По названию метода видно, что возвращается в галстуке. - person Cruncher; 07.01.2014
comment
Я также был бы осторожен при создании статического метода, который использует какой-либо внешний ресурс (файловую систему, базу данных и т. Д.). Этот тип статики может сделать ужасным тестировать методы потребления. Я лично стараюсь, чтобы статика оставалась полезной. - person Seth M.; 07.04.2014
comment
Действительно сильная сплоченность - person Sumit Kumar Saha; 02.02.2015
comment
Фактически, он должен быть реализован как компаратор. - person Dogweather; 04.02.2015
comment
просто чтобы просто добавить, когда у вас нет зависимости данных / кода, перейдите на static else, если данные появятся на картинке, это просто частный (желательно) / общедоступный - person shivi; 22.04.2015
comment
@Cruncher не должен isMoreEfficientThan(...) возвращать boolean? (true, если более эффективный, false, если такой же или менее эффективный) - person Braden Best; 14.01.2016
comment
@ B1KMusic Конечно. То, что я имею в виду под тем, какая машина возвращается в связи, - это истинные карты для вызванной машины и ложные карты для пропущенной машины. Это без двусмысленности. - person Cruncher; 14.01.2016
comment
@ Кранчер А. Спасибо за разъяснение. - person Braden Best; 14.01.2016
comment
Могу ли я предположить, что любой базовый линейный сценарий, работающий как JAR на Linux-машине, должен быть статическим? Например, программа java, которая обрабатывает кучу файлов путем фильтрации (черный список / белый список), упаковывает и помещает их в каталог архива. По сути, все ваши классы являются служебными классами, которые вызываются напрямую из main. Это верно? - person Kenny Steegmans; 02.08.2016
comment
@KennySteegmans Нет, я думаю, это не связано. Например, я мог бы представить себе «класс FileList», возможно, даже с подклассами «ImageFileList» и «AppFileList» и т. Д., И поэтому вы могли бы использовать систему объектно-ориентированного программирования. По общему признанию, это вероятно излишек в описываемой вами ситуации, и, вероятно, будет достаточно набора хорошо спроектированных статических методов. (И, конечно, вы можете запустить свою программу, вызвав статический метод (main).) - person not-just-yeti; 10.08.2016
comment
Спасибо за отличный ответ. Теперь я знаю, что статический метод java используется всеми экземплярами определенного класса, это означает, что каждый экземпляр имеет свой собственный нестатический метод, такой как нестатическая переменная? Спасибо. - person typeof programmer; 02.06.2017
comment
есть ли общее заявление о состоянии / побочных эффектах статических методов? - person philx_x; 20.10.2017
comment
-1 Примеры методов double convertMpgToKpl(double mpg) и Car theMoreEfficientOf( Car c1, Car c2 ) явно не являются методами класса Car. И сегодня, в 2017 году, в эпоху DI и слабой связи, эти методы вообще не должны быть статичными даже в другом классе. - person Syed Aqeel Ashiq; 15.11.2017
comment
Вопреки некоторым комментариям, мне нравится второй пример. Несмотря на то, что это может быть не лучший метод для практического использования, он помог мне лучше понять ответ на вопрос. - person jamesc1101; 04.12.2017
comment
@TomBrito Никаких проблем с производительностью, поскольку нет разницы в производительности после JIT-компиляции кода. Вызов виртуальных методов обходится дорого, но они, очевидно, неприменимы, когда метод может быть статическим. Метод - это классы без предков, которые обрабатываются особым образом, как и непереопределенные методы (независимо от того, final или нет). - person maaartinus; 13.03.2018
comment
Спасибо @ not-just-yeti Понятно на примере автомобиля - person Nibras; 12.10.2018

Определите статические методы только в следующих сценариях:

  1. Если вы пишете служебные классы и менять их не предполагается.
  2. Если метод не использует никакую переменную экземпляра.
  3. Если какая-либо операция не зависит от создания экземпляра.
  4. Если есть код, который может легко использоваться всеми методами экземпляра, извлеките этот код в статический метод.
  5. Если вы уверены, что определение метода никогда не будет изменено или отменено. Поскольку статические методы не могут быть переопределены.
person Mohd    schedule 15.03.2011
comment
хорошие моменты, но они являются требованиями, если вы хотите сделать метод статическим, а не причинами для его создания. - person tetsuo; 11.12.2013
comment
@Mohd о требовании 5. Когда можно быть на 100% уверенным, что метод никогда не будет изменен или отменен? Разве не всегда есть неизвестные факторы, которые нельзя учесть в момент написания статического метода? - person PixelPlex; 31.08.2015
comment
Утилита-классы очень сложно рассуждать, плохо то, что рано или поздно все начинает `` выглядеть '' как утилита (да, я имею в виду этот раздутый, неприкасаемый и плохо протестированный пакет утилит), и ваши тестовые примеры потребуется больше работы (издеваться над статическими утилитами - ТРУДНО). В первую очередь отдавайте предпочтение объектам. - person Sergio; 15.06.2016
comment
@Mohd, этот ответ - именно то, что я ищу. Я столкнулся с множеством проблем при использовании статических методов в многопоточности. Не могли бы вы уточнить пункты 2, еще 3 (например, 100 лайков для вас) - person Prakash Pandey; 17.12.2016
comment
Я думаю, что статический класс следует изобрести, если вы собираетесь использовать статические переменные и методы. - person Robert Rocha; 26.02.2018
comment
Разве 4 не должно быть методом экземпляра? Нет необходимости делать его статичным? - person Yassin Hajaj; 22.05.2018

Есть несколько веских причин для использования статических методов:

  • Производительность: если вы хотите запустить какой-то код и не хотите создавать для этого дополнительный объект, вставьте его в статический метод. JVM также может сильно оптимизировать статические методы (я думаю, что однажды я читал Джеймса Гослинга, заявляющего, что вам не нужны специальные инструкции в JVM, поскольку статические методы будут такими же быстрыми, но не могут найти источник - таким образом это могло быть полностью ложным). Да, это микрооптимизация, и, вероятно, в ней нет необходимости. А мы, программисты, никогда не делаем ненужных вещей только потому, что они классные, верно?

  • Практичность: вместо вызова new Util().method(arg) вызовите Util.method(arg) или method(arg) со статическим импортом. Проще, короче.

  • Добавление методов: вы действительно хотели, чтобы у класса String был метод экземпляра removeSpecialChars(), но его там нет (и не должно, поскольку специальные символы вашего проекта могут отличаться от символов другого проекта), и вы не может добавить его (поскольку Java в некотором роде нормальна), поэтому вы создаете служебный класс и вызываете removeSpecialChars(s) вместо s.removeSpecialChars(). Милая.

  • Чистота. Приняв некоторые меры предосторожности, ваш статический метод будет чистой функцией. , то есть все, от чего он зависит, - это его параметры. Данные на входе, данные на выходе. Это легче читать и отлаживать, поскольку у вас нет проблем с наследованием, о которых нужно беспокоиться. Вы также можете сделать это с помощью методов экземпляра, но компилятор поможет вам немного больше со статическими методами (не разрешая ссылки на атрибуты экземпляра, методы переопределения и т. Д.).

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

Теперь, что более важно, почему бы вам не создавать статический метод? По сути, полиморфизм не имеет значения. Вы не сможете переопределить метод или объявить его в интерфейсе (до Java 8). Это требует большой гибкости от вашего дизайна. Кроме того, если вам нужно состояние, вы столкнетесь с множеством ошибок параллелизма и / или узких мест, если не будете осторожны.

person tetsuo    schedule 11.12.2013
comment
Здесь перечислены многие веские причины, по которым статика может быть полезна. Еще одно, о чем я могу думать, это то, что писать модульные тесты для таких методов очень просто. - person nilesh; 25.07.2016
comment
@tetsuo Спасибо! Ваше объяснение очень ясное, а приведенные причины очень логичны и имеют большой смысл. - person Deniss M.; 09.05.2017
comment
А мы, программисты, никогда не делаем ненужных вещей только потому, что они классные, верно? +1 - person Scaramouche; 07.03.2018
comment
При этом статический метод становится полностью именованной функцией stackoverflow.com/questions/155609/ - person ; 13.07.2018
comment
Я согласен с производительностью и практичностью, но не с чистотой. Статический метод может изменять статические члены класса (которые могут быть закрытыми). Это может быть полезно. Например, у вас может быть такой метод, как static synchronized int allocateID () {return idNext ++;}. Фактически, статический метод может быть таким же чистым или нечистым, как нестатический метод с точки зрения побочных эффектов. - person Adam Gawne-Cain; 06.09.2019
comment
@ AdamGawne-Cain Достаточно честно, Java не является функциональным языком и не имеет реальной поддержки чистых функций. Я предполагаю, что мой мыслительный процесс, когда я писал это, был таков, поскольку со статическими методами вы отказываетесь от многих функций, таких как полиморфизм, динамическое связывание, наследование и области экземпляров - было бы легче сохранить методы чистыми, поскольку вам нужно только беспокоиться о том, чтобы не используя любое состояние класса и вызывая только другие чистые методы. Но да, вы правы, он по-прежнему вызывает много опасений по поводу побочных эффектов методов экземпляра. - person tetsuo; 09.09.2019

Прочитав статьи Миско, я считаю, что статические методы плохи с точки зрения тестирования. Вместо этого вам следует иметь фабрики (возможно, с помощью инструмента внедрения зависимостей, например Guice).

как мне убедиться, что у меня есть только одно из чего-то

есть только одно из чего-то. Проблема «как мне убедиться, что у меня есть только одно из чего-то» хорошо обходится. Вы создаете только один экземпляр ApplicationFactory в своем основном файле, и в результате вы создаете только один экземпляр всех ваших синглтонов.

Основная проблема статических методов - это процедурный код.

Основная проблема статических методов - это процедурный код. Я понятия не имею, как проводить модульное тестирование процедурного кода. Модульное тестирование предполагает, что я могу создать экземпляр своего приложения изолированно. Во время создания экземпляра я связываю зависимости с mocks / Friendly, которые заменяют реальные зависимости. При процедурном программировании нечего "связывать", поскольку нет объектов, код и данные разделены.

person Alfred    schedule 20.04.2010
comment
Я не понимаю, что такое невозможность модульного тестирования процедурного кода. Разве вы не просто настраиваете тестовые примеры, которые сопоставляют правильный ввод с правильным выводом, используя статический метод вместе с классом в качестве единицы? - person tjb; 21.03.2012
comment
Вы можете сделать это, чтобы проверить эти функции. Но при использовании этих статических методов в других классах, которые вы хотите протестировать, я считаю, что вы не можете их подделать (имитируют / дружелюбны) или что-то еще, потому что вы не можете создать экземпляр класса. - person Alfred; 22.03.2012
comment
Но не могут ли статические методы получать доступ только к статическим членам? Если я правильно понимаю, как создание экземпляра класса может иметь значение? - person tjb; 22.03.2012
comment
Вы прочитали статью полностью = ›misko .hevery.com / 2008/12/15 /? Вы должны попытаться понять 3-й абзац о швах / изоляции. Особенно последняя строка 3-го абзаца = ›Да, статические методы легко вызвать, но если статический метод вызывает другой статический метод, нет возможности переопределить зависимость вызываемого метода. - person Alfred; 22.03.2012
comment
Спасибо, что указали на этот абзац, после прочтения всех трех статей я думаю, что начинаю понимать. - person tjb; 22.03.2012
comment
Я надеюсь, что это так. Вы также можете посмотреть видео с misko, в котором немного объясняется тестирование = ›youtube.com/watch?v= wEhu57pih5w. На YouTube доступно еще больше видео. - person Alfred; 22.03.2012
comment
@Alfred: ознакомьтесь с PowerMock, который может имитировать статические методы. При использовании PowerMock существует несколько сценариев, если таковые имеются, в которых вы обнаруживаете зависимости методов, которые невозможно смоделировать. - person Carles Sala; 20.05.2013
comment
Ты тупой или из гугла? Пожалуйста, уйди с этим парнем. Программирование - это не только модульное тестирование. А если ты плохой программист, то юнит-тестирование - единственный способ написать работающее ПО. - person luke1985; 08.10.2013
comment
Вы можете выполнить модульное тестирование статики с помощью PowerMock, однако вскоре вы обнаружите, что у вас закончилось пространство Permgen (сделал это, получил футболку), и это все еще неприятно. Если вы не ЗНАЕТЕ (основываясь на как минимум десятилетнем собственном опыте работы с настоящими объектно-ориентированными языками, а не переходом с C), НЕ ДЕЛАЙТЕ ЭТОГО. Серьезно, худший код, который я когда-либо видел, исходил от использования статики встроенным разработчиком, и в большинстве случаев мы застряли с ним навсегда, а добавление дополнительного кода только еще сильнее заперло нас в немодифицируемом монолите. Слабая связь: нет, проверяемая: почти не поддающаяся изменению: НИКОГДА. Избегать! - person user1016765; 26.05.2014
comment
Я могу понять сложность тестирования статических методов, которые зависят от статического состояния. Но когда вы тестируете статические методы без состояния, такие как Math.abs() или Arrays.sort(), даже методы, в которые вы можете передавать все зависимости, я не понимаю, как это когда-либо препятствовало бы модульному тестированию. Я бы сказал, что простое практическое правило: если у вас когда-нибудь будет причина высмеивать процедурную логику, не помещайте ее в статический метод. У меня никогда не было причин высмеивать Arrays.sort() или Math.abs(). - person Andy; 08.05.2015
comment
@Andy Если вы вводите все зависимости, значит, вы больше не проводите модульное тестирование статического метода. Вы косвенно тестируете зависимости статического метода. Это больше не модульный тест. - person user6123723; 27.02.2020
comment
@ user6123723 Я говорил о передаче имитаций зависимостей в тестируемый метод - person Andy; 28.02.2020
comment
@ Энди Достаточно честно! - person user6123723; 28.02.2020

static метод - это один из типов методов, для вызова которого не требуется инициализировать какой-либо объект. Вы заметили, что static используется в функции main в Java? Выполнение программы начинается оттуда без создания объекта.

Рассмотрим следующий пример:

 class Languages 
 {
     public static void main(String[] args) 
     {
         display();
     }

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }
person Zishan    schedule 10.06.2014
comment
лучший ответ на самом деле - person Yahya; 17.09.2016

Статические методы в java принадлежат классу (а не его экземпляру). Они не используют переменные экземпляра и обычно принимают входные данные из параметров, выполняют с ними действия, а затем возвращают некоторый результат. Методы экземпляров связаны с объектами и, как следует из названия, могут использовать переменные экземпляра.

person Kevin Sylvestre    schedule 19.04.2010

Нет, статические методы не связаны с экземпляром; они принадлежат к классу. Статические методы - ваш второй пример; методы экземпляра являются первыми.

person duffymo    schedule 19.04.2010
comment
Если манипуляции с состоянием объекта не требуются, следует использовать статические методы. - person MastAvalons; 17.06.2019

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

  1. Статический метод принадлежит классу, а не объекту класса.
  2. Статический метод, вызываемый без необходимости создания экземпляра класса.
  3. статический метод может получить доступ к статическому элементу данных и может изменить его значение.
  4. Доступ к статическому методу можно получить, просто используя имя статического имени точки класса. . . пример: Student9.change ();
  5. Если вы хотите использовать нестатические поля класса, вы должны использовать нестатический метод.

// Программа изменения общего свойства всех объектов (статическое поле).

class Student9{  
 int rollno;  
 String name;  
 static String college = "ITS";  

 static void change(){  
 college = "BBDIT";  
 }  

 Student9(int r, String n){  
 rollno = r;  
 name = n;  
 }  

 void display (){System.out.println(rollno+" "+name+" "+college);}  

public static void main(String args[]){  
Student9.change();  

Student9 s1 = new Student9 (111,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

O / P: 111 Индийский BBDIT 222 Американский BBDIT 333 Китайский BBDIT

person IndianProgrammer1234    schedule 13.06.2015

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

Вы должны использовать статический метод, если метод не использует какие-либо поля (или только статические поля) класса.

Если используются какие-либо нестатические поля класса, вы должны использовать нестатический метод.

person Carsten    schedule 19.04.2010
comment
Четкий, короткий и простой ответ. - person Josi; 10.02.2019

Статические методы должны вызываться в классе, методы экземпляра должны вызываться в экземплярах класса. Но что это значит на самом деле? Вот полезный пример:

У автомобильного класса может быть метод экземпляра Accelerate (). Вы можете ускорить автомобиль только в том случае, если автомобиль действительно существует (был построен), и поэтому это будет метод экземпляра.

У автомобильного класса также может быть метод подсчета, называемый GetCarCount (). Это вернет общее количество созданных (или построенных) автомобилей. Если машины не построены, этот метод вернет 0, но его все равно можно будет вызвать, и, следовательно, это должен быть статический метод.

person Charlie Seligman    schedule 25.04.2018

Используйте статический метод, если вы хотите иметь доступ к методу без экземпляра класса.

person jamz    schedule 19.04.2010
comment
Это не дает никаких оснований для разработки программы. - person adamjmarkham; 01.01.2012

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

person Sagar    schedule 11.03.2013
comment
Сохранение состояния в статических переменных - это плохо по многим причинам - например, многопоточная безопасность, отладка, инкапсуляция данных и т. Д. Статические методы подходят, если они являются чистыми функциями (работают только с параметрами, без их изменения). Хорошим примером может служить служебный класс, например, для математических вычислений. - person Vladimir Demirev; 07.11.2019

Статический: Obj.someMethod

Используйте static, если вы хотите предоставить доступ к методу на уровне класса, т.е. когда метод должен быть вызван без экземпляра класса.

person Finbarr    schedule 19.04.2010

Статические методы не нужно вызывать для объекта, и именно тогда вы его используете. Пример: ваш Main () является статическим, и вы не создаете объект для его вызова.

person Vaishak Suresh    schedule 20.04.2010
comment
Ура! Посмотрите, откуда я пришел, задавая в Google вопросы для новичков по Java! Это маленький мир :-) - person Deepak; 05.11.2015
comment
@Deepak действительно маленький мир :) - person Vaishak Suresh; 09.11.2015

Статические методы и переменные - это управляемая версия «глобальных» функций и переменных в Java. В каких методах можно получить доступ как classname.methodName() или classInstanceName.methodName(), т.е. к статическим методам и переменным можно получить доступ, используя имя класса, а также экземпляры класса.

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

person Manju Yadav    schedule 30.09.2011

Статические методы можно использовать, если

  • # P2 #
    # P3 #
    1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
    2. ABCClass.convertFarenheitToCelcium(double farenheit)
    
    # P4 #
    Math.random()
    Math.sqrt(double)
    Math.min(int, int)
    StringUtils.isEmpty(String)
    StringUtils.isBlank(String)
    
  • Хочется использовать как простую функцию. Входные данные передаются явно и получают данные результата как возвращаемое значение. Наследование, создание экземпляра объекта не входит в картину. Лаконично, читабельно.

ПРИМЕЧАНИЕ. Мало кто возражает против тестируемости статических методов, но статические методы тоже можно тестировать! С jMockit можно имитировать статические методы. Тестируемость. Пример ниже:

new MockUp<ClassName>() {
    @Mock
    public int doSomething(Input input1, Input input2){
        return returnValue;
    }
};
person Amit Kaneria    schedule 23.08.2016

Статические методы - это методы в Java, которые можно вызывать без создания объекта класса. Это принадлежит к классу.

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

person Community    schedule 28.05.2017

Статический метод имеет две основные цели:

  1. Для служебных или вспомогательных методов, которым не требуется состояние объекта. Поскольку нет необходимости в доступе к переменным экземпляра, наличие статических методов устраняет необходимость для вызывающей стороны создавать экземпляр объекта только для вызова метода.
  2. Для состояния, которое используется всеми экземплярами класса, как счетчик. Все экземпляры должны иметь одно и то же состояние. Методы, которые просто используют это состояние, также должны быть статическими.
person hemanto    schedule 05.02.2018

В eclipse вы можете включить предупреждение, которое поможет вам обнаружить потенциальные статические методы. (Над выделенной строкой есть еще одна, которую я забыл выделить)

настройка затмения

person ave4496    schedule 06.03.2017

Мне интересно, когда использовать статические методы?

  1. Обычно методы static используются для доступа к static полям.
  2. Но у вас могут быть static методы, не обращаясь к static переменным. Вспомогательные методы без ссылки на переменную static можно найти в некоторых классах Java, например java.lang.Math

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
    
  3. Другой вариант использования этих методов в сочетании с методом synchronized - это реализация блокировки уровня класса в многопоточной среде.

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

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

Более подробная информация представлена ​​на странице документации Oracle.

Не все комбинации переменных и методов экземпляра и класса разрешены:

  1. Методы экземпляра могут напрямую обращаться к переменным экземпляра и методам экземпляра.
  2. Методы экземпляра могут напрямую обращаться к переменным класса и методам класса.
  3. Методы класса могут напрямую обращаться к переменным класса и методам класса.
  4. Методы класса не могут напрямую обращаться к переменным экземпляра или методам экземпляра - они должны использовать ссылку на объект. Кроме того, методы класса не могут использовать ключевое слово this, поскольку нет экземпляра, на который можно было бы ссылаться.
person Ravindra babu    schedule 24.07.2017
comment
Разве мы не можем получить доступ к статическим полям с помощью обычных методов? Тогда это A common use for static methods is to access static fields. не аргумент. - person parsecer; 09.07.2019

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

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

  1. Если метод не изменяет состояние объекта или не использует какие-либо переменные экземпляра.

  2. Вы хотите вызвать метод без создания экземпляра этого класса.

  3. Метод является хорошим кандидатом на статичность, если он работает только с предоставленными ему аргументами, например. public int factorial (int number) {}, этот метод работает только с числом, указанным в качестве аргумента.

  4. Утилитарные методы также являются хорошим кандидатом на статичность, например. StringUtils.isEmpty (текст строки), это служебный метод для проверки, пуста ли строка или нет.

  5. Если функция метода останется статической в ​​иерархии классов, например. Метод equals () не является хорошим кандидатом на создание статического, потому что каждый класс может переопределить равенство.

Источник находится здесь

person Jake N    schedule 27.01.2021

Если вы не хотите создавать объект для вызова метода в своем коде, просто объявите этот метод как статический. Поскольку статический метод не требует вызова экземпляра, но проблема здесь в том, что не все статические методы вызываются JVM автоматически. Этой привилегией пользуется только метод main () «public static void main [String ... args]» в Java, потому что во время выполнения это метод Signature public «static» void main [], который JVM ищет в качестве точки входа в начать выполнение кода.

Пример:

public class Demo
{
   public static void main(String... args) 
   {
      Demo d = new Demo();

      System.out.println("This static method is executed by JVM");

     //Now to call the static method Displ() you can use the below methods:
           Displ(); //By method name itself    
      Demo.Displ(); //By using class name//Recommended
         d.Displ(); //By using instance //Not recommended
   }

   public static void Displ()
   {
      System.out.println("This static method needs to be called explicitly");
   }
} 

Вывод: - Этот статический метод выполняется JVM. Этот статический метод необходимо вызывать явно. Этот статический метод необходимо вызывать явно. Этот статический метод необходимо вызывать явно.

person Amrit    schedule 16.05.2020