User Tools

Site Tools


java:wrapper_classes

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:wrapper_classes [2017/01/30 10:48] – [Autoboxing και Unboxing] gthanosjava:wrapper_classes [2022/02/24 12:45] (current) – external edit 127.0.0.1
Line 3: Line 3:
 Στην εισαγωγική [[java:variables|ενότητα]] των μεταβλητών είδαμε την διάκριση των μεταβλητών μεταξύ **βασικών τύπων** και **αναφορικών τύπων**. Για όλους τους βασικούς τύπους που συναντήσαμε η Java ορίζει ισοδύναμούς αναφορικούς τύπους δεδομένων οι οποίοι βρίσκονται μέσα στο πακέτο [[http://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html|java.lang]]. Οι αντιστοιχίες μεταξύ βασικών και αναφορικών τύπων είναι οι εξής: Στην εισαγωγική [[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]] | | 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]]  | | byte  | [[http://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html|Byte]]  |
Line 36: Line 36:
 </code> </code>
  
-Κάθε κλάση στην Java περιέχει την μέθοδο [[java:toString|toString()]]. Οι ισοδύναμοι αναφορικοί τύποι επανα-ορίζουν την μέθοδο //toString()//, ώστε να επιστρέφει ένα αλφαριθμητικό με την αριθμητική τιμή που αποθηκεύεται στον αναφορικό τύπο.+Επιπλέον, κάθε κλάση στην Java περιέχει την μέθοδο [[java:toString|toString()]]. Οι ισοδύναμοι αναφορικοί τύποι επανα-ορίζουν την μέθοδο //toString()//, ώστε να επιστρέφει ένα αλφαριθμητικό με την αριθμητική τιμή που αποθηκεύεται στον αναφορικό τύπο.
  
-Εκτός από τα παραπάνω, κάθε αναφορικός τύπος περιέχει και άλλες μεθόδους που συνδέονται με την τιμή που είναι αποθηκευμένη στον αναφορικό τύπο ή static μεθόδους που επιτελούν συγκεκριμένες εργασίες. Για παράδειγμα, ένα μικρό τμήμα από τις μεθόδους που περιέχονται στην κλάση //Integer// είναι οι παρακάτω: +ροηγούμενο: [[:java:enum | Απαριθμήσεις ]] | [[:toc | Περιεχόμενα]] | Επόμενο: [[:java:autoboxing Autoboxing & Auto-unboxing ]]|
-<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> +
- +
-===== Autoboxing και 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()// αποτελεί μία επιπλέον δυνατότητα που μας δίνει ο compiler. +
-</WRAP> +
- +
-==== 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.1485773286.txt.gz · Last modified: 2017/01/30 10:48 by gthanos