1. Mga static na pamamaraan

Bilang karagdagan sa mga static na variable, ang mga klase ay maaari ding magkaroon ng mga static na pamamaraan.

Ang mga regular na pamamaraan ay nakatali sa mga bagay (mga pagkakataon) ng isang klase at maaaring sumangguni sa mga ordinaryong (hindi static) na mga variable ng klase (pati na rin ang mga static na variable at pamamaraan ). Ang mga static na pamamaraan ay nakatali sa static na object ng klase at maaari lamang ma-access ang mga static na variable at/o iba pang mga static na pamamaraan ng klase.

Upang tumawag ng isang ordinaryong (non-static) na pamamaraan sa isang klase, kailangan mo munang lumikha ng isang bagay ng klase at pagkatapos ay tawagan ang pamamaraan sa bagay. Hindi ka maaaring tumawag ng isang ordinaryong pamamaraan sa klase sa halip na isang bagay.

Halimbawa:

Hindi ka maaaring tumawag ng isang non-static na pamamaraan sa isang klase!
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!
   }
}

Ngunit upang tumawag ng isang static na pamamaraan, sapat na para sa static na bagay ng klase na umiral lamang (at ito ay palaging umiiral pagkatapos na mai-load ang klase sa memorya). Ito ang dahilan kung bakit ang pangunahing() na pamamaraan ay static. Nakatali ito sa static na object ng klase, kaya hindi mo na kailangang lumikha ng anumang mga bagay upang tawagan ito.

Upang magdeklara ng static na pamamaraan, kailangan mong isulat ang static na keyword bago ang header ng pamamaraan. Ang pangkalahatang hitsura ng konstruksyon na ito ay ang mga sumusunod:

static Type name(parameters)
{
   method code
}

Mga halimbawa:

Code Tandaan
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

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


Tinatawag ng Java machine ang mainpamamaraan na may utos na tulad nito: Solution.main();



Ang static test()na pamamaraan ay tinatawag sa static main()na pamamaraan.

Upang tumawag ng static na paraan mula sa ibang klase, kailangan mong tukuyin ang pangalan ng klase bago ang pangalan ng static na paraan. Ang pangkalahatang hitsura ng konstruksyon na ito ay ang mga sumusunod:

Type name = ClassName.methodName(arguments)

Mga halimbawa:

Code Static na pamamaraan
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. Static vs ordinary (non-static) na mga pamamaraan

Ano ang pagkakaiba sa pagitan ng mga static na pamamaraan at mga ordinaryong?

Ang isang ordinaryong pamamaraan ay nakatali sa isang ordinaryong bagay (isang halimbawa ng isang klase), habang ang isang static na pamamaraan ay hindi. Maaaring ma-access ng isang ordinaryong paraan ang mga variable sa instance nito, ngunit hindi maaaring ma-access ng static na paraan: wala lang itong nauugnay na instance.

Ang mga pagkakaiba sa pagitan ng dalawang uri ng mga pamamaraan ay ipinahayag sa sumusunod na talahanayan:

Kakayahan/pag-aari Ordinaryong pamamaraan Static na pamamaraan
Nakatali sa isang instance ng klase Oo Hindi
Maaaring tumawag ng mga ordinaryong pamamaraan ng klase Oo Hindi
Maaaring tumawag sa mga static na pamamaraan ng klase Oo Oo
Maaaring ma-access ang mga ordinaryong variable ng klase Oo Hindi
Maaaring ma-access ang mga static na variable ng klase Oo Oo
Maaaring tawagin sa isang bagay Oo Oo
Maaaring tawagin sa klase Hindi Oo

Bakit kailangan ang gayong mga pamamaraan kung ang mga ito ay lubhang limitado? Ang sagot ay ang pamamaraang ito ay mayroon ding mga pakinabang.

Una, hindi mo kailangang ipasa ang anumang object reference upang ma-access ang mga static na pamamaraan at variable.

Pangalawa, kung minsan kailangan mo doon upang maging isang solong halimbawa ng isang variable. Halimbawa, System.out( static out variable ng klase ng System ).

At, pangatlo, kung minsan kailangan mong tumawag ng isang paraan bago ito maging posible na lumikha ng mga bagay. Halimbawa, tinatawag ng Java machine ang pangunahing() na pamamaraan upang simulan ang pagpapatupad ng programa bago pa man malikha ang isang halimbawa ng klase.

Nakatali sa isang instance ng klase

Kapag tinawag ang isang ordinaryong pamamaraan, ang isang argumento — ang bagay kung saan tinawag ang pamamaraan — ay tahasang ipinapasa dito. Ang parameter na ito ay tinatawag na this. Ang implicit na parameter na ito (isang sanggunian sa bagay kung saan tinatawag ang pamamaraan) ay nakikilala ang mga ordinaryong pamamaraan mula sa mga static.

Walang ganitong implicit na parameter ang mga static na pamamaraan, kaya hindi mo magagamit ang thiskeyword sa loob ng mga static na pamamaraan, at hindi ka makakatawag ng non-static na paraan sa loob ng static na paraan. Wala talagang makukuhang reference sa isang instance ng isang klase.

Maaaring tumawag ng mga ordinaryong pamamaraan ng klase

Ang isang ordinaryong pamamaraan ay laging may implicit thisna parameter, kaya palagi kang mayroong reference sa object kung saan tinatawag ang method. Sa tuwing tatawag ka ng isang ordinaryong paraan sa loob ng isa pang ordinaryong pamamaraan, ang implicit thisna parameter ay ginagamit upang gawin ang tawag na iyon. Halimbawa

Code Paano ito gumagana
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);
}

Iyon ang dahilan kung bakit hindi ka maaaring tumawag ng isang ordinaryong pamamaraan mula sa isang static. Walang implicit na variable na pinangalanan thissa loob ng isang static na pamamaraan.

O isipin ang isa pang sitwasyon: wala pang isang bagay ng aming klase ang nalikha sa aming programa. Maaari ba tayong tumawag ng isang static na pamamaraan ng ating klase? Oo. At maaari bang tumawag ang static na pamamaraan na ito ng isang ordinaryong (non-static) na pamamaraan?

Buweno, anong bagay ang itatawag natin dito? Pagkatapos ng lahat, wala pang isang halimbawa ng aming klase!

Maaaring tumawag sa mga static na pamamaraan ng klase

Maaaring tawagan ang mga static na pamamaraan mula sa kahit saan — mula sa anumang lugar sa programa. Nangangahulugan ito na maaari silang tawagan mula sa parehong mga static na pamamaraan at mga ordinaryong. Walang mga paghihigpit dito.

Maaaring ma-access ang mga ordinaryong variable ng klase

Maaari mong ma-access ang mga ordinaryong variable ng isang klase mula sa isang ordinaryong pamamaraan, dahil madali itong makakuha ng reference sa isang instance ng klase sa pamamagitan ng implicit na thisparameter.

Ang isang static na pamamaraan ay hindi alam kung aling instance ng klase ang dapat nitong gamitin upang makakuha ng mga halaga ng mga ordinaryong variable. At higit sa pangkalahatan, madali tayong magkaroon ng sitwasyon kung saan tinatawag ang isang static na pamamaraan ngunit wala pang isang pagkakataon ng klase ang nalikha sa programa.

Bilang resulta, hindi ma-access ng mga static na pamamaraan ang mga ordinaryong variable ng isang klase.

Ipagpalagay na ang isang static na pamamaraan ay tumatawag sa isang ordinaryong pamamaraan. Anong bagay ang dapat itawag sa ordinaryong pamamaraang iyon?

Mga static na pamamaraan

Walang nakakaalam! Iyon ang dahilan kung bakit hindi ka maaaring tumawag ng isang ordinaryong pamamaraan mula sa isang static nang hindi nagpapasa sa isang reference sa isang bagay!

Maaaring ma-access ang mga static na variable ng klase

Ang sitwasyon sa mga tawag sa mga static na variable ay kapareho ng sa mga tawag sa mga static na pamamaraan. Maaaring ma-access ang mga static na variable mula saanman sa programa. Nangangahulugan iyon na maaari mong ma-access ang mga ito mula sa mga static at ordinaryong pamamaraan.

Maaaring tawagin sa isang bagay

Parehong static at ordinaryong mga pamamaraan ay maaaring tawagin sa isang bagay. Posible ang isang ordinaryong tawag sa pamamaraan — sa katunayan, iyon ang tanging paraan upang tumawag sa isang ordinaryong paraan. Ang isang static na pamamaraan ay maaari ding tawagan sa isang bagay: sa kasong ito ang compiler mismo ang tumutukoy sa uri ng variable at tinatawag ang static na pamamaraan batay sa uri nito:

Code Paano ito nakikita ng compiler
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);

Maaaring tawagin sa klase

Maaari kang tumawag lamang ng isang static na pamamaraan sa isang klase. Upang tumawag sa isang ordinaryong pamamaraan, kailangan mo ng isang sanggunian sa isang halimbawa ng klase. Samakatuwid, hindi ka maaaring tumawag ng isang ordinaryong pamamaraan gamit ang construct na ito:ClassName.methodName(arguments)