2009-12-17

SCJP-6 06. Statiniai metodai per nuorodą

Turime kodą:
void m1() {
  Integer z = null;
  z.toString();  // NullPointerException
}

void m2() {
  Integer z = null;
  z.toString(12345);  // ok
}

Kodėl vykdant m1 kils NullPointerException, o m2 -- nekils? Antru atveju toString metodas yra ne objekto metodas, o statinis (klasės) metodas toString(int) su argumentu 12345. Kompiliavimo metu kreipinys z.toString(...) pakeičiamas kreipiniu Integer.toString(...) todėl vykdymo metu antru atveju problemų nekyla. Tačiau paprastai rekomenduojama statinius metodus kviesti naudojant klasės pavadinimą (taip pabrėžiant, kad metodas priklauso klasei, o ne objektui). Taigi m2 metodo kodas tvarkingiau atrodytų taip:
void m2() {
 Integer.toString(12345);
}

Egzamine, žinoma, gali pakliūti ir klausimų, kuriuose statiniai metodai kviečiami naudojantis nuorodos tipo kintamuoju, ir atvirkščiai -- naudojant klasės pavadinimą, bandoma iškviesti objekto metodą. Tad pravartu atsiminti, kokie yra dažniausiai sutinkamus metodai -- statiniai, ar objekto.

Komentarų nėra: