Dane wyjściowe programu Java | Zestaw 5

Przewiduj wynik następujących programów Java.
Program 1:  
 

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     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:  
 

Java
   // 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:  
 

Java
   // 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).
 

Utwórz quiz