java:wrapper_classes

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

java:wrapper_classes [2017/01/30 10:50]
gthanos [Unboxing]
java:wrapper_classes [2022/02/24 12:45]
Line 1: Line 1:
-====== Βασικοί τύποι δεδομένων και ισοδύναμοι αναφορικοί τύποι ====== 
- 
-Στην εισαγωγική [[java:variables|ενότητα]] των μεταβλητών είδαμε την διάκριση των μεταβλητών μεταξύ **βασικών τύπων** και **αναφορικών τύπων**. Για όλους τους βασικούς τύπους που συναντήσαμε η Java ορίζει ισοδύναμούς αναφορικούς τύπους δεδομένων οι οποίοι βρίσκονται μέσα στο πακέτο [[http://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html|java.lang]]. Οι αντιστοιχίες μεταξύ βασικών και αναφορικών τύπων είναι οι εξής: 
- 
-^ Βασικός τύπος ^ Αναφορικός τύπος ^ 
-| boolean | [[http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html|Boolean]] | 
-| byte  | [[http://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html|Byte]]  | 
-| char  | [[http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html|Character]]   | 
-| int  | [[http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html|Integer]]   | 
-| long  | [[http://docs.oracle.com/javase/7/docs/api/java/lang/Long.html|Long]]  | 
-| short  | [[http://docs.oracle.com/javase/7/docs/api/java/lang/Short.html|Short]]  | 
-| float  | [[http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html|Float]]   | 
-| double  | [[http://docs.oracle.com/javase/7/docs/api/java/lang/.html|Double]]  | 
- 
-Κάθε αναφορικός τύπος μπορεί να δημιουργηθεί από ένα βασικό τύπο ή από ένα αλφαριθμητικό ([[http://docs.oracle.com/javase/7/docs/api/java/lang/String.html|String]]). Για παράδειγμα η κλάση //Integer// έχει τους παρακάτω δύο κατασκευαστές: 
- 
-<code java> 
-Integer(int value); 
-  //Constructs a newly allocated Integer object that represents the specified int value. 
-Integer(String s); 
-  //Constructs a newly allocated Integer object that represents the int value indicated by the String parameter. 
-</code> 
- 
-Eπίσης, κάθε μία από τις παραπάνω κλάσεις περιέχει μεθόδους για την εξαγωγή ενός βασικού τύπου δεδομένων από τον αναφορικό τύπο. Για παράδειγμα η κλάση //Integer// περιέχει μεθόδους για την εξαγωγή βασικών τύπων από των αναφορικό ως εξής: 
-<code java> 
-byte byteValue(); 
-//Returns the value of this Integer as a byte. 
-short shortValue(); 
-//Returns the value of this Integer as a short. 
-int intValue(); 
-//Returns the value of this Integer as an int. 
-long longValue(); 
-//Returns the value of this Integer as a long. 
-float floatValue(); 
-//Returns the value of this Integer as a float. 
-</code> 
- 
-Κάθε κλάση στην Java περιέχει την μέθοδο [[java:toString|toString()]]. Οι ισοδύναμοι αναφορικοί τύποι επανα-ορίζουν την μέθοδο //toString()//, ώστε να επιστρέφει ένα αλφαριθμητικό με την αριθμητική τιμή που αποθηκεύεται στον αναφορικό τύπο. 
- 
-Εκτός από τα παραπάνω, κάθε αναφορικός τύπος περιέχει και άλλες μεθόδους που συνδέονται με την τιμή που είναι αποθηκευμένη στον αναφορικό τύπο ή static μεθόδους που επιτελούν συγκεκριμένες εργασίες. Για παράδειγμα, ένα μικρό τμήμα από τις μεθόδους που περιέχονται στην κλάση //Integer// είναι οι παρακάτω: 
-<code java> 
-static Integer decode(String nm) 
-//Decodes a String into an Integer. Accepts decimal, hexadecimal, and octal numbers 
-static int highestOneBit(int i) 
-//Returns an int value with at most a single one-bit, in the position of the highest-order ("leftmost") one-bit in the specified int value. 
-int lowestOneBit(int i) 
-//Returns an int value with at most a single one-bit, in the position of the lowest-order ("rightmost") one-bit in the specified int value. 
-static int parseInt(String s) 
-//Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign '-' ('\u002D') to indicate a negative value or an ASCII plus sign '+' ('\u002B') to indicate a positive value.  
-static int reverse(int i) 
-//Returns the value obtained by reversing the order of the bits in the two's complement binary representation of the specified int value. 
- 
-κλπ. 
-</code> 
- 
-===== Auto-boxing και Auto-unboxing ===== 
- 
-Ο compiler της Java μας δίνει την δυνατότητα να χρησιμοποιήσουμε βασικούς τύπους σε σημεία του κώδικα που απαιτείται η ισοδύναμη αναφορική μορφή ή αναφορικούς τύπους σε σημεία του κώδικα που ζητείται η βασική μορφή. Ο compiler έχει την ιδιότητα να αναγνωρίζει σημεία του κώδικα που απαιτούν τις παραπάνω μετατροπές τύπου και κάνει αυτόματα τις μετατροπές αυτές. Η ιδιότητα αυτή του Java compiler απαντάται στην βιβλιογραφεία ως Auto-boxing και Auto-unboxing. Θα δώσουμε παρακάτω από ένα παράδειγμα μετατροπής πάνω στο οποίο θα συζητήσουμε τις διαδικασίες Auto-boxing και Auto-unboxing. 
- 
-==== Autoboxing ==== 
- 
-<code java AutoboxExample.java> 
-public class AutoboxExample { 
-  public static void main(String []args) { 
-    int a=5; 
-    System.out.println("a: "+a); 
-  } 
-} 
-</code> 
- 
-Ο παραπάνω κώδικας εκτυπώνει την τιμή της μεταβλητής //a// που τυγχάνει να είναι βασικού τύπου. Για να το επιτύχει αυτό καλείται να εκτυπώσει ένα αλφαριθμητικό (//String//) που αποτελείται από την ένωση δύο αλφαριθμητικών όπως αυτά ορίζονται πριν και μετά τον τελεστή //+//. Αριστερά του τελεστή //+// έχουμε το αλφαριθμητικό ''"a: "'' ενώ δεξιά του τελεστή έχουμε μία μεταβλητή τύπου int. Προκειμένου να μπορεί να εκτελεστεί το πρόγραμμα, ο compiler θα πρέπει να μετατρέψει τον βασικό τύπο σε αναφορικό και στη συνέχει να καλέσει την συνάρτηση //toString()// του αναφορικού τύπου που επιστρέφει την τιμή της μεταβλητής ως String.  
- 
-Η παραπάνω αυτόματη μετατροπή που κάνει ο compiler, μπορεί να γραφεί ισοδύναμα ως εξής: 
- 
-<code java AutoboxExample.java> 
-public class AutoboxExample { 
-  public static void main(String []args) { 
-    int a=5; 
-    System.out.println("a: "+ (new Integer(a)).toString() ); 
-  } 
-} 
-</code> 
- 
-Οι δύο παραπάνω κλάσεις είναι ισοδύναμες. Η αιτία της ισοδυναμίας είναι η ιδιότητα του compiler να αναγνωρίζει την ανάγκη μετατροπής ενός βασικού τύπου σε αναφορικό.  
- 
-<WRAP tip 80% center round> 
-Στο συγκεκριμένο παράδειγμα, ο compiler εκτός από την μετατροπή του τύπου καλεί αυτόματα και την μέθοδο //toString()// προκειμένου να λάβει την τιμή του ακεραίου ως αλφαριθμητικό. Η αυτόματη κλήση της μεθόδου //toString()// αποτελεί μία επιπλέον δυνατότητα του Java compiler. 
-</WRAP> 
- 
-==== Auto-unboxing ==== 
- 
-<code java UnboxExample.java> 
-public class UnboxExample { 
-  public static int sum(int a, int b) { 
-     return a+b; 
-  } 
-   
-  public static void main(String []args) { 
-    Integer a = new Integer(5); 
-    Integer b = new Integer(10); 
-    int result = sum(a,b); 
-    System.out.println("sum: "+ result ); 
-  }  
-} 
-</code> 
- 
-Στο παραπάνω παράδειγμα, είναι προφανές ότι η μέθοδος //sum// λαμβάνει ως ορίσματα δύο ακεραίους βασικού τύπου, ενώ τα ορίσματα με τα οποία καλείται η συνάρτηση είναι ακέραιοι αναφορικού τύπου //Integer//. Ο compiler αντιλαμβάνεται ότι προκειμένου να χρησιμοποιηθεί η συνάρτηση απαιτείται η μετατροπή των δύο μεταβλητών αναφορικού τύπου σε βασικού τύπου. Ο ισοδύναμος κώδικας που υλοποιεί ο compiler είναι ο παρακάτω. 
- 
-<code java UnboxExample.java> 
-public class UnboxExample { 
-  public static int sum(int a, int b) { 
-     return a+b; 
-  } 
-   
-  public static void main(String []args) { 
-    Integer a = new Integer(5); 
-    Integer b = new Integer(10); 
-    int result = sum(a.intValue(),b.intValue()); 
-    System.out.println("sum: "+ result ); 
-  }  
-} 
-</code> 
- 
-Ο compiler έχει την δυνατότητα να μετατρέπει τους βασικούς τύπους σε ισοδύναμους αναφορικούς και αντίστροφα, αλλά δεν επιτρέπει την μετατροπή σε μη ισοδύναμους τύπους. Για παράδειγμα, στο παρακάτω πρόγραμμα, εάν ο ένας από τους δύο αριθμούς είναι τύπου //Long// αντί για //Integer// τότε δεν καλείται η μέθοδος //a.intValue()// (είναι διαθέσιμη και στην κλάση //Long//). Αντ' αυτού λαμβάνουμε το παρακάτω μήνυμα λάθους 
- 
-<code java UnboxExample.java> 
-public class UnboxExample { 
-  public static int sum(int a, int b) { 
-     return a+b; 
-  } 
-   
-  public static void main(String []args) { 
-    Long a = new Long(5); 
-    Integer b = new Integer(10); 
-    int result = sum(a,b); 
-    System.out.println("sum: "+ result ); 
-  }  
-} 
-</code> 
- 
-<code> 
-$ javac UnboxExample.java  
-UnboxExample.java:9: error: method sum in class UnboxExample cannot be applied to given types; 
-    int result = sum(a,b); 
-                 ^ 
-  required: int,int 
-  found: Long,Integer 
-  reason: actual argument Long cannot be converted to int by method invocation conversion 
-1 error 
-</code> 
- 
-|Προηγούμενο: [[:java:tostring | H μέθοδος toString() ]] | [[:toc | Περιεχόμενα]] | Επόμενο: [[:java:enum | Enumerations ]]| 
  
java/wrapper_classes.txt · Last modified: 2022/02/24 12:45 (external edit)