Przewiduj wynik następujących programów 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
Wyjście :
String
Wyjaśnienie : W przypadku przeciążanie metody najbardziej specyficzna metoda jest wybierana w czasie kompilacji. Ponieważ „java.lang.String” jest bardziej specyficznym typem niż „java.lang.Object”. W tym przypadku wybierana jest metoda, która jako parametr przyjmuje „String”.
Program 2:
Java
// 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
Wyjście:
Compile Error at line 19.
Wyjaśnienie: W tym przypadku metoda Przeciążenie najbardziej specyficzna metoda jest wybierana w czasie kompilacji.
Ponieważ „java.lang.String” i „java.lang.Integer” są typami bardziej szczegółowymi niż „java.lang.Object”, ale pomiędzy „java.lang.String” i „java.lang.Integer” żaden nie jest bardziej szczegółowy.
W tym przypadku Java nie jest w stanie zdecydować, którą metodę wywołać.
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
Wyjście:
abcd abc false abcd abcd true
Wyjaśnienie : W Javie ciąg jest niezmienny, a bufor ciągów jest zmienny.
Zatem ciągi s2 i s1 wskazują na ten sam ciąg abc. Po dokonaniu zmian ciąg s1 wskazuje na abcd, a s2 wskazuje na abc, stąd wartość false. W buforze łańcuchowym zarówno sb1, jak i sb2 wskazują na ten sam obiekt. Ponieważ bufory ciągów są modyfikowalne, zmiany w jednym ciągu powodują również zmiany w drugim ciągu. Zatem oba łańcuchy nadal wskazują na ten sam obiekt po dokonaniu zmian w obiekcie (tutaj 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
Wyjście:
Compile Error at line 8
Wyjaśnienie:
1. W linii 12 „” w println powoduje automatyczne rzutowanie liczb jako ciągi znaków. Więc nie dodaje, ale dodaje razem jako ciąg.
2. W linii 11 += automatycznie rzutuje na zwarcie. Jednak liczba 123456 nie może być zawarta w skrócie, więc otrzymasz wartość ujemną (-7616).
(UWAGA - krótkie 2 bajty -32768 do 32767) Tutaj liczba 123456 nie oznacza wartości int zit pokazuje długość wartości int
3. Te pozostałe dwa to jednak błędne koło, ponieważ kod nigdy się nie skompiluje ze względu na linię 8.
Każda liczba zaczynająca się od zera jest traktowana jako liczba ósemkowa (czyli 0-7).
Linux $home