Úroveň obtížnosti : Střední
Předpovězte výstup následujících programů Java:
Program 1:
Javaclass Gfg { // constructor Gfg() { System.out.println('Geeksforgeeks'); } static Gfg a = new Gfg(); //line 8 public static void main(String args[]) { Gfg b; //line 12 b = new Gfg(); } }
výstup:
Geeksforgeeks
Geeksforgeeks
Vysvětlení:
Víme, že statické proměnné jsou volány, když se třída načítá a statické proměnné jsou volány pouze jednou. Nyní řádek 13 vede k vytvoření objektu, který zase volá konstruktor a 'Geeksforgeeks' se vytiskne podruhé. Pokud by na řádku 8 nebyla použita statická proměnná, objekt by byl volán rekurzivně nekonečně, což by vedlo k chybě StackOverFlow.
strojové učení pod dohledem
Program 2:
Javaclass Gfg { static int num; static String mystr; // constructor Gfg() { num = 100; mystr = 'Constructor'; } // First Static block static { System.out.println('Static Block 1'); num = 68; mystr = 'Block1'; } // Second static block static { System.out.println('Static Block 2'); num = 98; mystr = 'Block2'; } public static void main(String args[]) { Gfg a = new Gfg(); System.out.println('Value of num = ' + a.num); System.out.println('Value of mystr = ' + a.mystr); } }
výstup:
Static Block 1
Static Block 2
Value of num = 100
Value of mystr = Constructor
Vysvětlení:
Statický blok se provede, když je třída načtena do paměti. Třída může mít více statických bloků, které se provádějí ve stejném pořadí, v jakém byly zapsány do programu.
Poznámka : Statické metody mohou přistupovat k proměnným třídy bez použití objektu třídy. Vzhledem k tomu, že konstruktor je volán při vytváření nové instance, jsou nejprve volány statické bloky a poté je volán konstruktor. Pokud bychom spustili stejný program bez použití objektu, konstruktor by nebyl volán.
Program 3:
Javaclass superClass { final public int calc(int a int b) { return 0; } } class subClass extends superClass { public int calc(int a int b) { return 1; } } public class Gfg { public static void main(String args[]) { subClass get = new subClass(); System.out.println('x = ' + get.calc(0 1)); } }
výstup:
java architektura
Compilation fails. Vysvětlení:
Metoda calc() ve třídě superClass je konečná a nelze ji tedy přepsat.
Program 4:
Javapublic class Gfg { public static void main(String[] args) { Integer a = 128 b = 128; System.out.println(a == b); Integer c = 100 d = 100; System.out.println(c == d); } }
výstup:
false
true
Vysvětlení:
Ve zdrojovém kódu objektu Integer najdeme metodu 'valueOf', ve které můžeme vidět, že rozsah objektu Integer leží od IntegerCache.low(-128) do IntegerCache.high(127). Proto čísla nad 127 neposkytnou očekávaný výstup. Rozsah IntegerCache lze vypozorovat ze zdrojového kódu třídy IntegerCache.