BETA

Μαθαίνοντας την Java-Καθοριστε Boolean και Char Data types [μάθημα 9]

Εικόνα Michail

Συνεχίζουμε τα μαθήματα εκμάθησης της Java, έχοντας ήδη κάνει το πρώτο εισαγωγικό μάθημα και έχοντας δει,πως μπορουμε να εγκαταστήσουμε το NetBeans, προκειμένου να δημιουργήσουμε τις εφαρμογές μας και στη συνεχεια δημιουργώντας την πρωτη μας εφαρμογή.
Έχοντας δει κιόλας, σχετικά με τα LANGUAGE FUNDAMENTALS και στη συνέχεια, Ονομασία Μεταβλητών, και τα INTEGER TYPES, καθώς και τα Floating Point Types, συνεχίζουμε με το 9ο μάθημα της σειράς.
[box color=blue]Σε αυτή την φάση για τα εκπαιδευτικά μαθήματα χρησιμοποιούμε το λειτουργικό σύστημα Windows, μα οι διαφορές είναι ελάχιστες, ως μηδαμινές και στα υπόλοιπα λειτουργικά[/box]

Στο σημερινό μάθημα, θα ολοκληρώσουμε την αναφορά μας στα primitive data types αναλύοντας την θεωρία που αναφέρεται στις boolean και char μεταβλητές. Μην ξεχνάτε ότι ακολουθούμε την ίδια δομή ανάπτυξης στην θεωρία όπως με εκείνη που παρουσιάζεται στο online tutorial της Oracle.

Ξεκινώντας από τις μεταβλητές που τυχόν θα οριστούν με boolean data type, θα παρατηρήσουμε ότι το εύρος των τιμών που μπορούμε να αναθέσουμε σε αυτές περιορίζεται σε δύο μόνο λέξεις – true και false. Οι δύο αυτές δεσμευμένες λέξεις χρησιμοποιούνται από την java για να αντιπροσωπεύσουν τις δύο πιθανές τιμές που μπορεί να πάρει μια boolean μεταβλητή.

Η χρήση των δύο αυτών τιμών γίνεται κυρίως όταν θέλουμε να αξιολογήσουμε το αποτέλεσμα μιας συνθήκης.
Αξίζει να παρατηρήσουμε την εξής διαφορά από άλλες γλώσσες προγραμματισμού – στην Java δεν μπορείτε να μετατρέψετε μια boolean τιμή (δηλαδή το true ή το false) σε αριθμό.
Δεν μπορούμε να αντιστοιχήσουμε π.χ. την true τιμή με τον αριθμό 1 και την false τιμή με τον αριθμό 0 όπως γίνεται σε πολλές άλλες γλώσσες προγραμματισμού.

Στο πιο κάτω πρόγραμμα μπορείτε να δείτε πως η java παράγει την τιμή false ή true βασιζόμενη στην συνθήκη που είναι υπό εξέταση.

Line 6 – Ορίζουμε μια μεταβλητή t και της αναθέτουμε σαν αρχική τιμή το true.

Line 7 – Ζητάμε να δούμε στην οθόνη μας με τι ισούται η μεταβλητή t.
Αυτή είναι μια επιβεβαίωση ότι οι ίδιες οι λέξεις είναι οι τιμές μιας boolean μεταβλητής και όχι κάποιος αντιπροσωπευτικός αριθμός.

Line 8 – Oρίζουμε μια μεταβλητή x και της αναθέτουμε την αρχική τιμή 10.
Αυτή η μεταβλητή θα χρησιμοποιηθεί λίγο αργότερα στο πρόγραμμα μας όπως θα αναλύσουμε αμέσως τώρα.

Line 10 – Εδώ ορίζουμε μια boolean μεταβλητή y της οποίας η τιμή (true ή false) θα προέλθει από την αξιολόγηση της συνθήκης x > 20.

Line 11 – Επειδή το x έχει οριστεί να ισούται με την τιμή 10, η συνθήκη x > 20 θα μας δώσει false γιατί το 10 δεν είναι αριθμητικά μεγαλύτερο από τον αριθμό 20.

Το τελευταίο data type το οποίο θα μας απασχολήσει στην συνέχεια του μαθήματος μας είναι το char.
To char data type αντιπροσωπεύει μεμονωμένους χαρακτήρες.
Αυτό σημαίνει ότι μια μεταβλητή με data type char μπορεί να δεχτεί μόνο ένα χαρακτήρα σαν αποδεκτή τιμή.
Το μέγεθος κάθε χαρακτήρα είναι 2 bytes το οποίο προσθέτει μια ιδιαιτερότητα στην διαχείριση των char μεταβλητών – μπορούμε να χειριστούμε char μεταβλητές σαν integer και αυτό μας επιτρέπει να πραγματοποιήσουμε αριθμητικές πράξεις με αυτές ή να χρησιμοποιηθούν σε συνθήκες συγκρίσεων.
Αυτό θα το δείτε καλύτερα στο παράδειγμα που θα παρουσιάσουμε λίγο αργότερα στο μάθημα μας.

Όπως είπαμε πιο πριν, μια char μεταβλητή μπορεί να ισούται μόνο με ένα χαρακτήρα ο οποίος πρέπει να γραφτεί εντός μονών εισαγωγικών ( ‘ ‘ ).
Για παράδειγμα ο χαρακτήρας ‘B’ (μαζί με τα εισαγωγικά) είναι μια αποδεκτή τιμή για μια char μεταβλητή. Όμως, μια μεταβλητή σε διπλά εισαγωγικά σύμβολα “Β” δεν θεωρείται char αλλά String και αυτό κατά συνέπεια δεν είναι αποδεκτό.

Μια αποδεκτή τιμή μιας char μεταβλητής δεν είναι μόνο ένας χαρακτήρας αλλά και ο αντίστοιχος του unicode αριθμός.
Όλοι οι χαρακτήρες και σύμβολα μπορούν να αντιπροσωπευτούν με ένα διεθνές σύστημα εγγραφής που ονομάζεται unicode.
Η μορφή παρουσίασης χαρακτήρων δια μέσου αυτού του συστήματος γίνεται με hexadecimal τιμές που αρχίζουν από \u0000 μέχρι \uFFFF.
Για παράδειγμα ο ελληνικό γράμμα π μπορούμε να το αντιπροσωπεύσουμε με τον unicode αριθμό \u03C0.

Εκτός από τον ειδικό τρόπο παρουσίασης unicode συμβόλων (με την χρήση του \u) υπάρχουν και άλλοι ειδικοί χαρακτήρες (ονομάζονται escape sequences) οι οποίοι δεν μπορούν να εκτυπωθούν στην οθόνη αλλά η σημαντικότητά τους είναι αναμφισβήτητα μεγάλη. Στον πιο κάτω πίνακα μπορείτε να δείτε τους πιο χρήσιμους escape sequences χαρακτήρες:

-Ας δούμε όμως ένα πρόγραμμα που χρησιμοποιεί char μεταβλητές οι οποίες δέχονται τιμές με διαφορετικούς τρόπους και μορφές έτσι ώστε να μπορέσουμε να δούμε πρακτικά όλα όσα έχουμε πει στην ανάλυση της θεωρίας μας:

Line 6 – Ξεκινάμε το πρόγραμμα μας ορίζοντας μια char μεταβλητή a και αναθέτοντας σε αυτήν σαν τιμή τον χαρακτήρα A.
Μην ξεχάσετε την χρήση των μονών εισαγωγικών στην τιμή του χαρακτήρα Α.

Line 7 – Μην ξεχάσετε την χρήση των μονών εισαγωγικών στην τιμή του χαρακτήρα Α.
Συνεχίζοντας, ορίζουμε μια δεύτερη char μεταβλητή b στην οποία αναθέτουμε το αποτέλεσμα της πρόσθεσης της μεταβλητής a με τον αριθμό 1.

Ας μιλήσουμε για αυτήν την πρόσθεση λίγο περισσότερο.
Είπαμε στην αρχή του μαθήματος μας ότι μπορούμε να κάνουμε κάνουμε κάποιες αριθμητικές πράξεις ανάμεσα σε χαρακτήρες και αριθμούς.
Αυτό συμβαίνει επειδή κάθε φορά που ο compiler βλέπει έναν αριθμό να συνδυάζεται με έναν χαρακτήρα, τότε υπάρχει μια αυτόματη μετατροπή του χαρακτήρα στον αντίστοιχό του ASCII αριθμό.
Ο πιο κάτω πίνακας σας δίνει αναλυτικότερα τους αντίστοιχους αριθμούς για όλα τα σύμβολα και χαρακτήρες που χρησιμοποιούμε για να γράψουμε προγράμματα και κείμενα με το πληκτρολόγιο:

Με βάση λοιπόν τον πιο πάνω πίνακα, ο χαρακτήρας A μετατρέπεται στον ακέραιο αριθμό 65 πριν προστεθεί με τον αριθμό 1. Το αποτέλεσμα αυτής της πρόσθεσης είναι ένας νέος ακέραιος με την τιμή 66.
Όμως η νέα μεταβλητή b περιμένει να δεχτεί χαρακτήρα.
Άρα είναι αναγκαία η μετατροπή (casting) του αποτελέσματος της πρόσθεσης στον αντίστοιχο χαρακτήρα με βάση τον ASCII πίνακα.
Μετά από αυτή την διαδικασία η char μεταβλητή a ισούται με τον χαρακτήρα A και η char μεταβλητή b ισούται με τον χαρακτήρα B (γιατί αυξήσαμε τον ASCII αριθμό του Α κατά ένα αριθμό).

Line 8 - Αυτό ακριβώς είναι και το αποτέλεσμα της πρώτης μεθόδου println στην οποία ζητάμε να δούμε τον χαρακτήρα με τον οποίο ισούται η char μεταβλητή b.

Line 9 – Με την χρήση της δεύτερης println μεθόδου ζητάμε να δούμε το αποτέλεσμα της πρόσθεσης των δύο μεταβλητών a και b. Το αποτέλεσμα δεν θα πρέπει να μας προκαλεί καμία απολύτως έκπληξη.
Εδώ ζητάμε να προσθέσουμε δύο char μεταβλητές και με βάση τα όσα ήδη έχουμε αναλύσει, περιμένουμε να γίνει πρώτα μετατροπή των χαρακτήρων με τους οποίους ισούνται οι μεταβλητές στους αντίστοιχους ASCII ακέραιους αριθμούς και μετά να γίνει η πρόσθεση ανάμεσα σε ακέραιους.
Επειδή δεν κάνουμε καμία μετατροπή (casting) του τελικού αριθμού πίσω σε χαρακτήρα αυτό που βλέπουμε σαν αποτέλεσμα μετά την εκτέλεση του προγράμματος είναι ο αριθμός 131.

Line 10 – Στην τρίτη println μέθοδο ενεργοποιείται ο μηχανισμός που αναφέρει πως οτιδήποτε προσθέτουμε σε String (Strings περικλείονται πάντα από διπλά εισαγωγικά) απλά θα “κολλήσουν” δίπλα διπλά χωρίς να γίνει καμία απολύτως πράξη.
Οπότε το String “a + b is “ απλά δέχεται σαν επέκτασή του την τιμή με την οποία ισούται η μεταβλητή a που είναι ο χαρακτήρας A.
Με άλλα λόγια όπως συνηθίζω να λέω και στους δικούς μου μαθητές “String με οτιδήποτε άλλο data type θα μας δώσει String”.
Αμέσως μετά ακολουθεί η πρόσθεση μιας καινούργιας μεταβλητής b.
Όμως επειδή πρόσθεση ανάμεσα σε Strings δεν υφίσταται τότε απλά θα κολλήσει και η τιμή της μεταβλητής b ( που γνωρίζουμε ότι είναι ο χαρακτήρας B) δίπλα στο ήδη υπάρχων String.
Καταλαβαίνεται ότι εδώ βλέπουμε μια δεύτερη ιδιότητα του συμβόλου ( + ) που απλά συνδέει Strings μεταξύ τους.

Line 12 – Αρχικά ορίζουμε μια integer μεταβλητή x και της αναθέτουμε την τιμή 88.

Line 13 – Από την στιγμή που γνωρίζουμε από την θεωρία ότι ένας χαρακτήρας μετατρέπεται στον αντίστοιχο ASCII αριθμό πριν χρησιμοποιηθεί σε αριθμητικές πράξεις, τότε μπορούμε να πραγματοποιήσουμε και ακριβώς την αντίθετη διαδικασία. Δηλαδή να ορίσουμε μια αριθμητική τιμή και αφού την μετατρέψουμε στον αντίστοιχο χαρακτήρα τότε να την αναθέσουμε σε μια char μεταβλητή.
Αυτή ακριβώς την ιδέα εκφράζουν οι δύο πρώτες γραμμές κώδικα.

Line 14 - Αμέσως μετά δίνεται μια τιμή σε unicode μορφή στην char μεταβλητή trademark.
Ο συγκεκριμένος unicode αριθμός ισούται με το trademark σύμβολο.

Line 15 – Αυτό άλλωστε φαίνεται και από το αποτέλεσμα της println μεθόδου που ζητάμε να δούμε στην οθόνη μας με τι ισούται η μεταβλητή y και η μεταβλητή trademark.

Εδώ ολοκληρώσαμε την αναφορά μας στα οκτώ primitive types που χρησιμοποιεί η java.
Εκτός όμως από μεμονωμένους χαρακτήρες, πολλές φορές έχουμε την ανάγκη να χρησιμοποιήσουμε μεταβλητές οι οποίες αποθηκεύουν ονόματα.
Αυτό είναι εφικτό να πραγματοποιηθεί με την υποστήριξη μιας ειδικής κλάσης που επιτρέπει μια σειρά από χαρακτήρες να αναφέρονται σαν μια ενιαία οντότητα.
Η κλάση για την οποία μιλάμε είναι java.lang.String και σε μελλοντικό μάθημα θα αφιερώσουμε αρκετό χρόνο για να μιλήσουμε για τις δυνατότητες της.
Για αρχή όμως μπορούμε να κρατήσουμε το γεγονός ότι μια μεταβλητή που ορίζεται σαν String δεν είναι primitive type αλλά αντικείμενο για αυτό και δεν βρίσκουμε το όνομα αυτής της κλάσης στην λίστα των primitive types.

Για να ορίσουμε μια String μεταβλητή, είναι απαραίτητο εκτός από την λέξη String που πρέπει να προηγείται του ονόματος της μεταβλητής, να έχουμε εσωκλείσει το όνομα με το οποίο ισούται η μεταβλητή σε διπλά εισαγωγικά όπως το πιο κάτω παράδειγμα:

String s = “this is a string”;

Τα String αντικείμενα είναι immutable όπως τους έχει δοθεί επίσημα η ιδιότητα.
Δηλαδή από την στιγμή που θα δημιουργηθούν δεν μπορεί να αλλάξει η τιμή τους κατά την διάρκεια εκτέλεσης τους προγράμματος.
Όμως μην σας απασχολεί το γεγονός ότι αναφέρονται σαν αντικείμενα.
Εσείς απλά μπορείτε να τα θεωρήσετε και να τα χρησιμοποιήσετε σαν μια ειδική κατηγορία των primitive types.
Όμως επειδή η String κλάση έχει κάποια ενδιαφέροντα στοιχεία να μας δώσει, θα αναφερθούμε αποκλειστικά σε αυτήν σε μελλοντικό μάθημα.

Για την δημιουργία και την εκτέλεση του προηγούμενου προγράμματος ορίσαμε μερικές μεταβλητές και δώσαμε σε αυτές αμέσως μια αρχική τιμή.
Αυτό δεν είναι πάντα απαραίτητο, αν και μπορεί να είναι το επιθυμητό, γιατί απλά δεν είναι δυνατόν να γνωρίζουμε την αρχική τιμή με την οποία θέλουμε να ξεκινάει η δήλωση κάθε μεταβλητής.
Έτσι απλά δηλώνουμε τις μεταβλητές μας χωρίς να τους δίνουμε αρχικές τιμές.

Τώρα πολλοί από εσάς ίσως να αναρωτιέστε τι συμβαίνει με τις μεταβλητές όταν δεν ξέρουμε την αρχική τους τιμή και απλά τις ορίζουμε.
Όπως και τι συμβαίνει με το μέρος της μνήμης που έχει αποθηκεύσει το όνομα αλλά δεν έχει αριθμητική τιμή.

Η Java έχει φροντίσει για αυτό.
Εάν ο προγραμματιστής δεν ξέρει τις αρχικές τιμές, τότε μπορούμε απλά να δώσουμε την αριθμητική τιμή μηδέν σαν αρχική τιμή, ειδάλλως η java θα το κάνει για μας.
Ο λόγος που η java ενεργεί κατά αυτό το τρόπο είναι για να μην αποκτήσει η μεταβλητή λάθος τιμή από μόνη της παίρνοντας την τυχαία τιμή που υπάρχει στην μνήμη του υπολογιστή εκείνη την χρονική στιγμή την οποία την ορίζουμε.
Με βάση αυτό το γενικό κανόνα, ο compiler θα αρχικοποιήσει τις μεταβλητές είτε με την τιμή μηδέν είτε με την τιμή null με βάση πάντα το είδος της μεταβλητής που έχουμε.
Όμως το να αφήνουμε το σύστημα να κάνει μια τέτοια δουλειά για μας θεωρείται κακός τρόπος προγραμματισμού και καλό είναι να το αποφεύγουμε.
Στην παρακάτω εικόνα βλέπετε σε οργανωμένη μορφή όλα τα primitive data types με τις προκαθορισμένες τιμές τους:

Μιχάλης Κασάπογλου(http://kassapoglou.com)

  • Σχόλια

0 Comments:

Scroll to Top