Úroveň obtiažnosti : Stredne pokročilý
Predpovedajte výstup nasledujúcich programov Java.
Program 1:
class GfG { public static void main(String args[]) { String s1 = new String('geeksforgeeks'); String s2 = new String('geeksforgeeks'); if (s1 == s2) System.out.println('Equal'); else System.out.println('Not equal'); } }
výstup:
Not equal
Vysvetlenie: Keďže s1 a s2 sú dva rôzne objekty, referencie nie sú rovnaké a operátor == porovnáva referenciu objektu. Takže vypíše 'Nerovná sa' na porovnanie skutočných znakov v reťazci Musí sa použiť metóda .equals().
Program 2:
Java
class Person { private void who() { System.out.println('Inside private method Person(who)'); } public static void whoAmI() { System.out.println('Inside static method Person(whoAmI)'); } public void whoAreYou() { who(); System.out.println('Inside virtual method Person(whoAreYou)'); } } class Kid extends Person { private void who() { System.out.println('Kid(who)'); } public static void whoAmI() { System.out.println('Kid(whoAmI)'); } public void whoAreYou() { who(); System.out.println('Kid(whoAreYou)'); } } public class Gfg { public static void main(String args[]) { Person p = new Kid(); p.whoAmI(); p.whoAreYou(); } }
výstup:
Inside static method Person(whoAmI) Kid(who) Kid(whoAreYou)
Vysvetlenie: Statická väzba (alebo čas kompilácie) nastáva pre statické metódy. Tu p.whoAmI() volá statickú metódu, takže je volaná počas kompilácie, preto vedie k statickej väzbe a vytlačí metódu v triede Person.
Zatiaľ čo p.whoAreYou() zavolá metódu in Kid triedy, pretože Java ju štandardne berie ako virtuálnu metódu, tj dynamickú väzbu.
Program 3:
class GfG { public static void main(String args[]) { try { System.out.println('First statement of try block'); int num=45/3; System.out.println(num); } catch(Exception e) { System.out.println('Gfg caught Exception'); } finally { System.out.println('finally block'); } System.out.println('Main method'); } }
výstup:
First statement of try block 15 finally block Main method
Vysvetlenie:
Keďže neexistuje žiadna výnimka, blok catch sa nevolá ale the konečne blok sa vždy vykoná po bloku try bez ohľadu na to, či sa výnimka spracuje alebo nie.
Program 4:
class One implements Runnable { public void run() { System.out.print(Thread.currentThread().getName()); } } class Two implements Runnable { public void run() { new One().run(); new Thread(new One()'gfg2').run(); new Thread(new One()'gfg3').start(); } } class Three { public static void main (String[] args) { new Thread(new Two()'gfg1').start(); } }
výstup:
gfg1gfg1gfg3
vysvetlenie: Na začiatku sa nové vlákno začína názvom gfg1 potom v triede Dva metóda prvého spustenia spustí vlákno s názvom gfg1 potom sa vytvorí nové vlákno volaním metódy run, ale keďže nové vlákno možno vytvoriť iba volaním metódy štart, predchádzajúce vlákno vykoná akciu a znova gfg1 sa vytlačí. Teraz sa vytvorí nové vlákno volaním metódy štart, takže nové vlákno začína s gfg3 názov a teda aj výtlačky gfg3 .
java pole slice