Výstup programu Java | Sada 5
Předvídejte výstup následujících programů Java.
Program 1:
// Main.java public class Main { public static void gfg ( String s ) { System . out . println ( 'String' ); } public static void gfg ( Object o ) { System . out . println ( 'Object' ); } public static void main ( String args [] ) { gfg ( null ); } } //end class
Výstup :
String
Vysvětlení : V případě přetížení metody nejkonkrétnější metoda je vybrána v době kompilace. Protože 'java.lang.String' je specifičtější typ než 'java.lang.Object'. V tomto případě je zvolena metoda, která bere jako parametr 'String'.
Program 2:
// Main.java public class Main { public static void gfg ( String s ) { System . out . println ( 'String' ); } public static void gfg ( Object o ) { System . out . println ( 'Object' ); } public static void gfg ( Integer i ) { System . out . println ( 'Integer' ); } public static void main ( String args [] ) { gfg ( null ); } } //end class
výstup:
Compile Error at line 19.
Vysvětlení: V tomto případě metoda Přetížení nejkonkrétnější metoda je vybrána v době kompilace.
Protože 'java.lang.String' a 'java.lang.Integer' je specifičtější typ než 'java.lang.Object', ale mezi 'java.lang.String' a 'java.lang.Integer' žádný není konkrétnější.
V tomto případě se Java nemůže rozhodnout, kterou metodu zavolat.
Program 3:
// Main.java public class Main { public static void main ( String args [] ) { String s1 = 'abc' ; String s2 = s1 ; s1 += 'd' ; System . out . println ( s1 + ' ' + s2 + ' ' + ( s1 == s2 )); StringBuffer sb1 = new StringBuffer ( 'abc' ); StringBuffer sb2 = sb1 ; sb1 . append ( 'd' ); System . out . println ( sb1 + ' ' + sb2 + ' ' + ( sb1 == sb2 )); } } //end class
výstup:
abcd abc false abcd abcd true
Vysvětlení: V Javě je řetězec neměnný a vyrovnávací paměť řetězce je proměnlivá.
Takže řetězec s2 a s1 oba ukazují na stejný řetězec abc. A po provedení změn řetězec s1 ukazuje na abcd a s2 ukazuje na abc, tedy false. Zatímco v řetězcové vyrovnávací paměti oba sb1 a sb2 ukazují na stejný objekt. Vzhledem k tomu, že vyrovnávací paměť řetězců je proměnlivá, provádějte změny v jednom řetězci také ve druhém řetězci. Takže oba řetězce stále ukazují na stejný objekt po provedení změn v objektu (zde sb2).
Program 4:
// Main.java public class Main { public static void main ( String args [] ) { short s = 0 ; int x = 07 ; int y = 08 ; int z = 112345 ; s += z ; System . out . println ( '' + x + y + s ); } } //end class
výstup:
Compile Error at line 8
Vysvětlení:
1. Na řádku 12 Znak '' v println způsobí, že čísla budou automaticky přetypována jako řetězce. Takže neprovádí sčítání, ale připojuje se jako řetězec.
2. V řádku 11 += provede automatické přehození na zkrat. Číslo 123456 však nemůže být obsaženo v shortu, takže skončíte se zápornou hodnotou (-7616).
(POZNÁMKA - krátké 2 bajty -32768 až 32767) Zde číslo 123456 neznamená, že hodnota int zit ukazuje délku hodnoty int
3. Ti další dva jsou však červení sledi, protože kód se kvůli řádku 8 nikdy nezkompiluje.
Jakékoli číslo začínající nulou je považováno za osmičkové číslo (což je 0-7).