JavaRush /Курсы /Java Syntax Pro /Статические методы

Статические методы

Java Syntax Pro
11 уровень , 2 лекция
Открыта

1. Статические методы

Кроме статических переменных, в классах могут быть и статические методы.

Обычные методы привязаны к объектам (экземплярам) класса и могут обращаться к обычным-переменным класса (а также к статическим переменным и методам). Статические же методы привязаны к статическому объекту класса и могут обращаться только к статическим переменным и/или другим статическим методам класса.

Чтобы вызвать обычный метод у класса, сначала нужно создать объект этого класса, а только потом вызвать метод у объекта. Вызвать обычный метод не у объекта, а у класса нельзя.

Пример:

Вызвать нестатический метод у класса нельзя!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // тут будет ошибка!
   }
}

А чтобы вызвать статический метод, достаточно чтобы просто существовал статический объект класса (который всегда существует после загрузки класса в память). Именно поэтому метод main() — статический. Он привязан к статическому объекту класса, для его вызова не нужно создавать никакие объекты.

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

static тип имя(параметры)
{
   код метода
}

Примеры:

Код Примечание
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


Метод main вызывается Java-машиной командой вида: Solution.main();



Статический метод test() вызывается в статическом методе main().

Чтобы вызвать статический метод из другого класса, нужно указать имя класса перед именем статического метода. Общий вид этой конструкции такой:

Тип имя = ИмяКласса.имяМетода(параметры)

Примеры:

Код Статический метод
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Статические vs Обычные методы

Чем же отличаются статические методы от обычных?

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

Отличия двух типов методов можно выразить в таблице:

Способность Обычный метод Статический метод
Есть связь с экземпляром класса Да Нет
Может вызывать обычные методы класса Да Нет
Может вызывать статические методы класса Да Да
Может обращаться к обычным переменным класса Да Нет
Может обращаться к статическим переменным класса Да Да
Может быть вызван у объекта Да Да
Может быть вызван у класса Нет Да

Зачем такие методы нужны, если они так сильно ограничены? Все дело в том, что у такого подхода тоже есть свои преимущества.

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

Во-вторых, иногда бывает нужно, чтобы переменная была в единственном экземпляре. Как, например, переменная System.out (статическая переменная out класса System).

И, в-третьих, иногда нужно вызвать метод еще до того, как будет возможность создавать какие-то объекты. Например, вызов метода main(), с которого начинается выполнение программы: его вызывает Java-машина до создания экземпляра класса.

Есть связь с экземпляром класса

При вызове обычного метода в него передается скрытый параметр — объект, у которого его вызывали. Этот параметр имеет имя this. Именно этот скрытый параметр — ссылка на объект, у которого вызвали метод — и отличает обычные методы от статических.

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

Может вызывать обычные методы класса

В обычном методе класса всегда есть скрытый параметр — this — ссылка на объект класса, у которого был вызван метод. Каждый раз, когда вы вызываете обычный метод внутри другого обычного метода, для этого вызова используется скрытый параметр this. Пример

Код Как оно работает
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

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

Ну или представьте другой случай: в программе еще не создан ни один объект нашего класса. Статический метод класса можно вызвать? Да. А сможет этот статический метод вызвать обычный метод?

И у какого объекта он его вызовет? Ведь еще не существует ни одного экземпляра нашего класса!

Может вызывать статические методы класса

Статические методы можно вызывать откуда угодно — из любого места программы. А значит, их можно вызывать и из статических методов, и из обычных. Никаких ограничений тут нет.

Может обращаться к обычным переменным класса

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

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

Поэтому статические методы не могут обращаться к обычным переменным класса.

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

Статические методы

Неизвестно! Поэтому и нельзя вызывать обычный метод из статического, не указывая ссылку на объект!

Может обращаться к статическим переменным класса

Ситуация с обращением к статическим переменным такая же, как и с обращениями к статическим методам. К статическим переменным можно обращаться из любого места в программе. А значит, можно обращаться из статических и обычных методов.

Может быть вызван у объекта

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

Код Как его видит компилятор
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Может быть вызван у класса

У класса можно вызвать только статический метод, для вызова обычного метода нужна ссылка на экземпляр класса. Поэтому нельзя вызвать обычный метод конструкцией вида ИмяКласса.имяМетода(параметры)


Комментарии (388)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
FosTeR Уровень 14
24 ноября 2025
Для тех кто не понял. Простым языком: Статик==общественное Не статик == личное. Личное может пользоваться общественным, а наоборот нет.
Zhenyok Avramenko Уровень 19
29 сентября 2025
я удивлён что кто-то не понял, тут всё ясно даже баобабу, статики создаются сразу и глобальны, а обычные после создания объекта, вы можете создать всю программу из статиков, но это будет канешь мем, ну а чё?
Sumrak Уровень 13
16 сентября 2025
печально конечно, что купив курс, все равно приходиться лезть в другие источники, что бы найти пояснения или вообще полностью прослушать другую лекцию, т.к. описание тут написано так, что ничего не понятно бывает тут пишут.. что ты и должен, для решения задачи, искать как ее решить в других источника... бред.. материал, должен быть сделан так, что бы было понятно, а не искать другие лекции..
Илья Уровень 3
4 августа 2025
"А чтобы вызвать статический метод, достаточно чтобы просто существовал статический объект класса (который всегда существует после загрузки класса в память). Именно поэтому метод main() — статический. " это что за издевательство?! вы для новичков пишите или для кого? какое то масло масленное ужас!
Илья Уровень 3
4 августа 2025
плохая теоретическая лекция ничего не понятно очень плохо
Georgy Dmitriev Уровень 19
20 июля 2025
чет слишком легкие задачи
Екатерина Уровень 14
9 июля 2025
я так понимаю, что статические методы похожи на маленькие вспомогательные программы в созданном классе
Anonymous #3585174 Уровень 33
25 июня 2025
like
VadChet Уровень 29
12 мая 2025
Получается, что названия Статик и не-Статик не совсем подходящие. Думаю, лучше подойдут Классовый (или Общий) и Объектный (Частный). Общий - один для всех. Частный - у каждого свой.
Андрей Уровень 1
30 апреля 2025

и из статического метода нельзя вызвать нестатический: ссылку на экземпляр класса попросту неоткуда взять.
Вообще то можно. Если я в статический метод передам ссылку на объект и уже с ней вызову нестатический метод - это сработает.
8 мая 2025
Мне кажется тут и имеется ввиду, то что если вызвать ее без ссылки на объект
Андрей Уровень 1
14 мая 2025
Да, этот момент указан в конце лекции, я раньше времени написал