1. Статични методи

Освен статични променливи, класовете могат да имат и статични методи.

Редовните методи са обвързани с обекти (инстанции) на клас и могат да се отнасят до обикновени (нестатични) променливи на класа (Howто и статични променливи и методи ). Статичните методи са обвързани със статичния обект на класа и имат достъп само до статичните променливи и/or други статични методи на класа.

За да извикате обикновен (нестатичен) метод на клас, първо трябва да създадете обект от класа и след това да извикате метода на обекта. Не можете да извикате обикновен метод на класа instead of обект.

Пример:

Не можете да извикате нестатичен метод на клас!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Но за да се извика статичен метод, е достатъчно статичният обект на класа просто да съществува (и той винаги съществува, след като класът се зареди в паметта). Ето защо методът main() е статичен. Той е обвързан със статичния обект на класа, така че не е необходимо да създавате обекти, за да го извикате.

За да декларирате статичен метод, трябва да напишете ключовата дума static преди заглавката на метода. Общият вид на тази конструкция е Howто следва:

static Type name(parameters)
{
   method code
}

Примери:

Код Забележка
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

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


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



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

За да извикате статичен метод от друг клас, трябва да укажете името на класа преди името на статичния метод. Общият вид на тази конструкция е Howто следва:

Type name = ClassName.methodName(arguments)

Примери:

Код Статичен метод
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. Статични срещу обикновени (нестатични) методи

Каква е разликата между статичните методи и обикновените?

Един обикновен метод е обвързан с обикновен обект (екземпляр на клас), докато статичен метод не е. Един обикновен метод може да има достъп до променливи в своя екземпляр, но статичен метод не може: той просто няма асоцииран екземпляр.

Разликите между двата типа методи са изразени в следната table:

Способност/свойство Обикновен метод Статичен метод
Обвързан с екземпляр на класа да Не
Може да извиква обикновени методи на класа да Не
Може да извиква статични методи на класа да да
Има достъп до обикновени променливи на класа да Не
Има достъп до статичните променливи на класа да да
Може да се извика на обект да да
Може да се извика в класа Не да

Защо са необходими такива методи, ако са толкова силно ограничени? Отговорът е, че този подход има и своите предимства.

Първо, не е необходимо да подавате препратка към обект, за да имате достъп до статични методи и променливи.

Второ, понякога трябва да има само един екземпляр на променлива. Например System.out( статичната изходяща променлива на системния клас ).

И трето, понякога трябва да извикате метод, преди дори да е възможно да създавате обекти. Например Java машината извиква метода main(), за да започне изпълнението на програмата дори преди да бъде създаден екземпляр на класа.

Обвързан с екземпляр на класа

Когато се извика обикновен метод, към него имплицитно се предава аргумент - обектът, на който се извиква методът . Този параметър се нарича 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вътре в статичен метод.

Или си представете друга ситуация: нито един обект от нашия клас все още не е създаден в нашата програма. Можем ли да извикаме статичен метод от нашия клас? да И може ли този статичен метод да извика обикновен (нестатичен) метод?

Е, на Howъв обект бихме го нарекли? В края на краищата, все още не съществува нито един екземпляр от нашия клас!

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

Статичните методи могат да бъдат извикани от всяко място - от всяко място в програмата. Това означава, че те могат да бъдат извикани Howто от статични методи, така и от обикновени. Тук няма ограничения.

Има достъп до обикновени променливи на класа

Можете да получите достъп до обикновени променливи на клас от обикновен метод, тъй като той може лесно да получи препратка към екземпляр на класа чрез неявния thisпараметър.

Статичният метод не знае кой екземпляр на класа трябва да използва, за да получи стойности на обикновени променливи. И по-общо казано, лесно можем да имаме ситуация, в която се извиква статичен метод, но нито един екземпляр от класа все още не е създаден в програмата.

В резултат на това статичните методи не могат да имат достъп до обикновени променливи на клас.

Да предположим, че статичен метод извиква обикновен метод. На Howъв обект трябва да се извика този обикновен метод?

Статични методи

Никой не знае! Ето защо не можете да извикате обикновен метод от статичен, без да подадете препратка към обект!

Има достъп до статичните променливи на класа

Ситуацията с извикванията на статични променливи е същата като с извикванията на статични методи. Статичните променливи могат да бъдат достъпни от всяка точка на програмата. Това означава, че имате достъп до тях от статични и обикновени методи.

Може да се извика на обект

На обект могат да бъдат извикани Howто статични, така и обикновени методи. Възможно е извикване на обикновен метод — наистина, това е единственият начин да се извика обикновен метод. Статичен метод може да бъде извикан и на обект: в този случай компилаторът сам определя типа на променливата и извиква статичния метод въз основа на неговия тип:

Код Как го вижда компилаторът
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);

Може да се извика в класа

Можете да извикате само статичен метод на клас. За да извикате обикновен метод, имате нужда от препратка към екземпляр на класа. Следователно не можете да извикате обикновен метод, като използвате тази конструкция:ClassName.methodName(arguments)