java:wrapper_classes

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Βασικοί τύποι δεδομένων και ισοδύναμοι αναφορικοί τύποι ====== Στην εισαγωγική [[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> ===== Autoboxing και Unboxing ===== Ο compiler της Java μας δίνει την δυνατότητα να χρησιμοποιήσουμε βασικούς τύπους σε σημεία του κώδικα που απαιτείται η ισοδύναμη αναφορική μορφή ή αναφορικούς τύπους σε σημεία του κώδικα που ζητείται η βασική μορφή. Ο compiler έχει την ιδιότητα να αναγνωρίζει σημεία του κώδικα που απαιτούν τις παραπάνω μετατροπές τύπου και κάνει αυτόματα τις μετατροπές αυτές. Θα δώσουμε παρακάτω από ένα παράδειγμα μετατροπής πάνω στο οποίο θα συζητήσουμε τις διαδικασίες Autoboxing και 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:packages:intro | Πακέτα στη γλώσσα προγραμματισμού Java ]]|

java/wrapper_classes.1456476149.txt.gz · Last modified: 2016/02/26 11:15 (external edit)