tifyty

pure Java, what else ?

Tudásteszt, metódus szignatúra

Nem keverjük össze az overriding és az overloading fogalmát. Amíg az első egy adott metódus felüldefiniálása egy leszármaztatott osztályban, addig a második azt jelenti, hogy különböző metódusokat deklarálhatunk ugyanazon a néven, ugyanabban osztályban vagy interfészben, úgy, hogy csak a paraméter listában térnek el. A következők a kérdések:

final

Lehet-e, hogy két metódus csak abban tér el egymástól, hogy az egyiknek a paraméterei final módosítóval lettek megjelölve. Lehetséges-e tehát:

public class Overload {

	public void method(int a, int b) {

	}

	public void method(final int a, final int b) {

	}
}
Nem lehet, mert a final nem része a szignatúrának.

primitive vs. objektum

Mit ír ki ez a program:

public class Overload {

	public void method(int a) {
		System.out.println("int");
	}

	public void method(Integer a) {
		System.out.println("Integer");

	}
	
	public static void main(String[] args){
		new Overload().method(3);
	}
}
A válasz: int.
Amikor kiválasztja, hogy melyik metódust kell meghívnia azt választja, amelyik leginkább illeszkedik a meghívási paraméterekhez.

Hogyan lehet elérni, hogy azt írja ki Integer?

		new Overload().method((Integer)3);

És mit fog kiírni a következő program?

public class Overload {

	public void method(int a, Integer b) {
		System.out.println("int Integer");
	}

	public void method(Integer a, int b) {
		System.out.println("Integer int");

	}

	public static void main(String[] args) {
		new Overload().method(3, 3);
	}
}
Semmit, a program nem fordul le, mert nem egyértelmű, hogy melyik metódust akarjuk meghívni.

És ha kiegészítjük ?

public class Overload {

	public void method(int a, Integer b) {
		System.out.println("int Integer");
	}

	public void method(Integer a, int b) {
		System.out.println("Integer int");

	}

	public void method(int a, int b) {
		System.out.println("int int");

	}

	public static void main(String[] args) {
		new Overload().method(3, 3);
	}
}
Most már egyértelmű, azt írja ki, hogy int int

No, de mit mond a szabvány?

Overloaded methods and constructors are resolved at compile time by picking the most specific method or constructor from those which are applicable.

Magyarul az overloaded metódusok és konstruktorok közül a megfelelő kiválasztása fordítási időben történik meg, és azt választja a fordító, amelyik a legjobban illeszkedik, a legspecifikusabb.

A fordító először megkeresi az összes olyan metódust, amelyik meghívható és amelyik alkalmazható. A meghívható azt jelenti, hogy a használat helyétől és a private, protected és public kulcsszavak használatától függően elérhető-e az adott metódus, az alkalmazható pedig azt jelenti, hogy a neve stimmel-e és az argumentum listája olyan-e, hogy ha csak az a metódus lenne elérhető az adott névvel, akkor meghívható lenne-e.

Amikor az összes ilyen metódust összegyűjtötte a Java, akkor megnézi, hogy boxing és unboxing nélkül mit lehetne meghívni (mert ugye lehetnek kódok, amiket még 1.5 előtt írtak, és akkor még szelídebb volt a Java, nem boxolt, és nem jött még akkor el a karácsony sem). (int <–> Integer és tsai.)

Ha ez nem vezetett eredményre, akkor a kód 1.5 előtt sem fordult volna le, így megpróbálja ismét, de most már lehet bokszolni meg csomagot bontani.

Na, ha még ez sem sikerült, akkor bepróbálkozik még egyszer, utoljára, de most már figyelembe veszi a változó argumentumszámú metódusokat is.

Ha ezek után több metódus is van, akkor az kell meghívni, amelyik specifikusabb. A Java szabvány szerint

The informal intuition is that one method is more specific than another if any invocation handled by the first method could be passed on to the other one without a compile-time type error.

és utána jön két oldalon keresztül egy matematikai definíció, amit nem fogok elmagyarázni. Az azért kell, hogy Java fordítót lehessen írni. Ha ahhoz kell, hogy megértsed, amit a program csinál, akkor valahol, valaki, valamit nagyon elrontott. Általában az overloading egyszerű a gyakorlatban, nem szabad elrettenni tőle, és ilyen furmányos kérdéseket, mint amik fent vannak, csak a lökött job interview-kon a méglököttebb vizsgáztatók szoktak kérdezni.

8 responses to “Tudásteszt, metódus szignatúra

  1. Iorek február 15, 2013 8:19 du.

    Na megint bebizonyítottad, hogy rossz programozó vagyok. A harmadikat nem tudtam, pedig utólag logikusnak tűnik.

    • v február 17, 2013 1:13 du.

      Nem attól lesz valaki jó programozó, hogy a szabványt kívülről tudja, és olyan biztonsággal értelmezi a kódot, mint a javac. A jó programozó NEM ír production kódba ilyen overloading-ot. Ez itt csak szellemi torna, olyan mint a bingózás, a sudoku, vagy a keresztrejtvény. Ha nem tudsz megoldani egy sudoku-t, attól még nem vagy rossz matematikus.

  2. Botond február 15, 2013 8:45 du.

    Mint olyat, akit az adott jelentkező hozzáállása még az aktuális tudásánál is jobban érdekel, kíváncsi lennék arra, hogy hányan válaszolnak vajon úgy a fenti kérdésre, hogy van elképzelés, logika (legyen az akár helytelen) a válasz mögött és hányan mondanak be valamit hasra vagy hiedelemből (jobb esetben rutinból, de a lényeget mégsem feltétlenül értve)..

  3. Kofa február 15, 2013 9:58 du.

    “Hogyan lehet elérni, hogy azt írja ki Integer?”
    Pl. a main metódusban System.out.println(“Integer”);
    🙂

    A móka még érdekesebb lesz, ha a generics is képbe kerül, mind az overloading, mind az overriding esetén:
    http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#Using_Generic_Methods

    Bónusz őrület: http://wouter.coekaerts.be/2012/java-puzzle-cookies

  4. Mefi február 16, 2013 2:00 de.

    Az utolsó előttit leszámítva mindegyik ment. 🙂 Bár ma a Google egy konferencián durvábbakat kérdezett.

  5. Bence február 18, 2013 1:10 du.

    Már majdnem nekiálltam válaszolni a kérdésekre, amikoris szembesültem vele, hogy költői darabok voltak.

    Nekem is az utolsó előtti volt a nagyobb falat, de kipróbálás útján megbizonyosodtam arról, hogy jól tippeltem.

    Overriding poszt is lesz?

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: