This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
java:variables [2015/07/07 18:08] gthanos [Μεταβλητές στην γλώσσα Προγραμματισμού Java] |
java:variables [2016/02/18 11:22] doufexi commented out repeated text, added "(κυρίως για λόγους αναγνωσιμότητας)", added toc link |
||
---|---|---|---|
Line 2: | Line 2: | ||
Οι μεταβλητές στην γλώσσα προγραμματισμού Java διακρίνονται σε δύο βασικές κατηγορίες: | Οι μεταβλητές στην γλώσσα προγραμματισμού Java διακρίνονται σε δύο βασικές κατηγορίες: | ||
- | * **βασικοί τύποι (//primitive data types//)**: Ως βασικοί τύποι δεδομένων ορίζονται οι τύποι δεδομένων, οι οποίοι καταλαμβάνουν προκαθορισμένο αριθμό bytes στην μνήμη και είναι προκαθορισμένοι από τον compiler της γλώσσας. Κοινοί τύποι είναι byte, char, integer, long, float, double κλπ. Ανάλογοι τύποι δεδομένων απαντώνται και σε άλλες γλώσσες προγραμματισμού, όπως οι **C/C++**. | + | * **βασικοί τύποι (//primitive data types//)**: Ως βασικοί τύποι δεδομένων ορίζονται οι τύποι δεδομένων, οι οποίοι καταλαμβάνουν προκαθορισμένο αριθμό bytes στην μνήμη και είναι προκαθορισμένοι από τον compiler της γλώσσας. Κοινοί τύποι είναι byte, char, int(integer), long, float, double κλπ. Ανάλογοι τύποι δεδομένων απαντώνται και σε άλλες γλώσσες προγραμματισμού, όπως οι γλώσσες **C/C++**. |
- | * **αναφορικοί τύποι (//reference types//)**: Σε αυτή την κατηγορία ανήκουν όλοι οι τύποι δεδομένων οι οποίοι ορίζονται μέσα από μία κλάση και υλοποιούνται με χρήση αντικειμένων. Ο λόγος που καλούνται αναφορικοί τύποι είναι ότι οι μεταβλητή κάθε αντικειμένου στην Java δεν περιέχει το αντικείμενο καθ' αυτό, αλλά ένα δείκτη (αναφορά-reference) στο αντικείμενο. Το αντικείμενο βρίσκεται σε μία διαφορετική περιοχή της μνήμης, όπου δεσμεύεται η απαραίτητη μνήμη από τον κατασκευαστή του αντικειμένου κατά την αρχικοποίηση του και αποδεσμεύεται η μνήμη από τον μηχανισμό Garbage Collection κατά την καταστροφή του. | + | * **αναφορικοί τύποι (//reference types//)**: Σε αυτή την κατηγορία ανήκουν όλοι οι τύποι δεδομένων οι οποίοι ορίζονται μέσα από μία κλάση και υλοποιούνται με χρήση αντικειμένων. Ο λόγος που καλούνται αναφορικοί τύποι είναι ότι οι μεταβλητή κάθε αντικειμένου στην Java δεν περιέχει το αντικείμενο καθ' αυτό, αλλά ένα δείκτη (αναφορά-reference) στο αντικείμενο. Το αντικείμενο βρίσκεται σε μία διαφορετική περιοχή της μνήμης, όπου δεσμεύεται η απαραίτητη μνήμη από τον κατασκευαστή του αντικειμένου κατά την αρχικοποίηση του και αποδεσμεύεται η μνήμη από τον μηχανισμό [[java:jre#Garbage Collection|Garbage Collection]] κατά την καταστροφή του. |
<WRAP tip 80% round center>Κάθε κλάση στην Java απεικονίζει ένα διαφορετικό τύπο δεδομένων. Μπορούμε να έχουμε τόσους τύπους δεδομένων, όσα και οι διαφορετικές πιθανές κλάσεις στην Java. Επομένως, ο αριθμός των δυνατών τύπων δεδομένων στην Java είναι άπειρος.</WRAP> | <WRAP tip 80% round center>Κάθε κλάση στην Java απεικονίζει ένα διαφορετικό τύπο δεδομένων. Μπορούμε να έχουμε τόσους τύπους δεδομένων, όσα και οι διαφορετικές πιθανές κλάσεις στην Java. Επομένως, ο αριθμός των δυνατών τύπων δεδομένων στην Java είναι άπειρος.</WRAP> | ||
- | Η γλώσσα προγραμματισμού Java διαμορφώνει τις παρακάτω κατηγορίες μεταβλητών με βάση το σημείο στο οποίο ορίζονται. Οι παρακάτω διάκριση ισχύει τόσο για βασικές μεταβλητές, όσο και για αναφορικές μεταβλητές: | + | Επιπλέον, η γλώσσα προγραμματισμού Java διαμορφώνει τις παρακάτω κατηγορίες μεταβλητών με βάση το σημείο στο οποίο ορίζονται. Οι παρακάτω διάκριση ισχύει τόσο για βασικές μεταβλητές, όσο και για αναφορικές μεταβλητές: |
- | * **Instance Variables (non-static class fields):** Η συγκεκριμένη κατηγορία μεταβλητών είναι εκείνη που συναντούμε συνήθως στα [[java:class_fields|πεδία των κλάσεων]]. Οι μεταβλητές αυτές είναι διαφορετικές για κάθε αντικείμενο της κλάσης και αποθηκεύουν την κατάσταση του αντικειμένου σε κάθε χρονική στιγμή. | + | * **Instance Variables (non-static class fields):** Η συγκεκριμένη κατηγορία μεταβλητών είναι εκείνη που συναντούμε συνήθως στα [[java:class_fields|πεδία των κλάσεων]]. Οι μεταβλητές αυτές έχουν διαφορετικές τιμές για κάθε αντικείμενο της κλάσης και αποθηκεύουν την κατάσταση του αντικειμένου σε κάθε χρονική στιγμή. |
* **Static Variables (static class fields):** Οι [[java:static_keyword|στατικές μεταβλητές]] αποτελούν και αυτές [[java:class_fields|πεδία της κλάσης]]. Η διαφορά από τις **Instance Variables** είναι ότι δεν ανήκουν σε επιμέρους αντικείμενα, αλλά στην κλάση. Αυτό πρακτικά σημαίνει ότι η τιμή των μεταβλητών αυτών είναι κοινή για όλα τα αντικείμενα της κλάσης. | * **Static Variables (static class fields):** Οι [[java:static_keyword|στατικές μεταβλητές]] αποτελούν και αυτές [[java:class_fields|πεδία της κλάσης]]. Η διαφορά από τις **Instance Variables** είναι ότι δεν ανήκουν σε επιμέρους αντικείμενα, αλλά στην κλάση. Αυτό πρακτικά σημαίνει ότι η τιμή των μεταβλητών αυτών είναι κοινή για όλα τα αντικείμενα της κλάσης. | ||
* **Τοπικές μεταβλητές (local-variables):** τοπικές μεταβλητές σε μεθόδους (σε αναλογία με τις τοπικές μεταβλητές στην γλώσσα C). | * **Τοπικές μεταβλητές (local-variables):** τοπικές μεταβλητές σε μεθόδους (σε αναλογία με τις τοπικές μεταβλητές στην γλώσσα C). | ||
Line 16: | Line 16: | ||
===== Βασικοί Τύποι Δεδομένων ===== | ===== Βασικοί Τύποι Δεδομένων ===== | ||
- | + | /* | |
- | Ως βασικοί τύποι δεδομένων (//primitive data types//) ορίζονται οι τύποι δεδομένων που είναι ορισμένοι σε κάθε γλώσσα προγραμματισμού και δεν χρειάζεται να τους ορίσουν οι προγραμματιστές. Εκτός των βασικών τύπων δεδομένων στην java μπορούμε να ορίσουμε δικούς μας τύπους μέσω κλάσεων, τους λεγόμενους //reference types//. | + | Ως βασικοί τύποι δεδομένων (//primitive data types//) ορίζονται οι τύποι δεδομένων που είναι ορισμένοι σε κάθε γλώσσα προγραμματισμού και δεν χρειάζεται να τους ορίσουν οι προγραμματιστές. Εκτός των βασικών τύπων δεδομένων στην java μπορούμε να ορίσουμε δικούς μας τύπους μέσω κλάσεων, τους λεγόμενους //reference types//. */ |
Οι βασικοί τύποι δεδομένων στην Java σε αναλογία με την γλώσσα προγραμματισμού C είναι οι εξής: | Οι βασικοί τύποι δεδομένων στην Java σε αναλογία με την γλώσσα προγραμματισμού C είναι οι εξής: | ||
Line 45: | Line 45: | ||
==== Κυριολεκτικά (literals) ==== | ==== Κυριολεκτικά (literals) ==== | ||
+ | |||
+ | Με τον όρο "κυριολεκτικά" (literals) εννοούμε την ανάθεση "σταθερών" τιμών σε μεταβλητές βασικών τύπων μέσα στον κώδικα. Παραδείγματα κυριολεκτικών είναι τα παρακάτω: | ||
+ | <code java> | ||
+ | boolean result = true; | ||
+ | char capitalC = 'C'; | ||
+ | byte b = 100; | ||
+ | short s = 10000; | ||
+ | int i = 100000; | ||
+ | </code> | ||
=== Κυριολεκτικά αλφαριθμητικών (strings) === | === Κυριολεκτικά αλφαριθμητικών (strings) === | ||
Τα κυριολεκτικά αλφαριθμητικών ορίζονται με διπλά εισαγωγικά. Ένα παράδειγμα ορισμού **String** μπορείτε να δείτε παρακάτω: | Τα κυριολεκτικά αλφαριθμητικών ορίζονται με διπλά εισαγωγικά. Ένα παράδειγμα ορισμού **String** μπορείτε να δείτε παρακάτω: | ||
- | |||
<code java> | <code java> | ||
String str = "this is a string"; | String str = "this is a string"; | ||
</code> | </code> | ||
+ | Μπορείτε να παράγετε ένα νέο αλφαριθμητικό από την συνένωση δύο υφιστάμενων αλφαριθμητικών με χρήση του χαρακτήρα '+' ως εξής: | ||
+ | <code java> | ||
+ | String greeting = "Hello " + "World!"; | ||
+ | </code> | ||
+ | Μετά την εκτέλεση της παραπάνω εντολής η μεταβλητή //greeting// περιέχει το αλφαριθμητικό <color red>"Hello World!"</color>. | ||
+ | |||
+ | === Κυριολεκτικά χαρακτήρων === | ||
Κυριολεκτικά χαρακτήρων ορίζονται με απλά εισαγωγικά ως εξής: | Κυριολεκτικά χαρακτήρων ορίζονται με απλά εισαγωγικά ως εξής: | ||
Line 60: | Line 75: | ||
</code> | </code> | ||
- | Οι χαρακτήρες στην Java καταλαμβάνουν 2 bytes και έχουν κωδικοποίηση UTF-16. Μπορείτε να γράψετε χαρακτήρες με χρήση της //unicode escape// μορφής τους, όπως παρακάτω | + | Οι χαρακτήρες στην Java καταλαμβάνουν 2 bytes και έχουν κωδικοποίηση UTF-16. Μπορείτε να αναθέσετε τιμές σε χαρακτήρες με χρήση της //unicode escape// μορφής τους, όπως παρακάτω: |
<code java> | <code java> | ||
Line 73: | Line 88: | ||
* ''\n'' (line feed) | * ''\n'' (line feed) | ||
* ''\f'' (form feed) | * ''\f'' (form feed) | ||
- | * ''\r'' (carriege return) | + | * ''\r'' (carriage return) |
* ''\"'' (double quote) | * ''\"'' (double quote) | ||
* ''\''' (single quote) | * ''\''' (single quote) | ||
* ''\\'' (backslash) | * ''\\'' (backslash) | ||
- | === Κυριολεκτικά ακεραίων αριθμών (int) === | + | === Κυριολεκτικά ακεραίων αριθμών === |
- | * **Δεκαδικές τιμές** (π.χ. ''int decVal = 26;'') | + | Τα κυριολεκτικά ακεραίων αριθμών είναι τύπου int εκτός εάν έχουν τον χαρακτήρα 'L' ή 'l' στο τέλος οπότε είναι τύπου long (θα εξηγήσουμε στη συνέχεια). Αν θέλετε να αναθέσετε μία ακέραια τιμή σε μία μεταβλητή τύπου byte, short, int τότε αρκεί να χρησιμοποιήσετε μία δήλωση της μορφής: |
- | * **Δεκαεξαδικές τιμές:** (π.χ. ''int hexVal = 0x1a;'') | + | <code java> |
- | * **Δυαδικές τιμές:** (π.χ. ''int binVal = 0b11010;'') | + | byte b = 100; |
+ | short s = 10000; | ||
+ | int i = 100000; | ||
+ | </code> | ||
+ | |||
+ | <WRAP tip 80% center round> | ||
+ | Εάν επιχειρήσετε να αναθέσετε σε μία μεταβλητή μία τιμή η οποία υπερβαίνει την χωρητικότητα της τότε θα λάβετε ένα μήνυμα λάθους από τον compiler, όπως παρακάτω | ||
+ | <code java> | ||
+ | byte b = 1000; | ||
+ | |||
+ | error: incompatible types: possibly lossy conversion from integer to byte. | ||
+ | byte b = 1000; | ||
+ | ^ | ||
+ | Δεν μπορείτε να αναθέσετε σε μία μεταβλητή τύπου byte την τιμή 1000, καθώς | ||
+ | το εύρος τιμών της είναι από -128 έως 127. | ||
+ | </code> | ||
+ | </WRAP> | ||
+ | |||
+ | Εάν θέλετε να αναθέσετε σε μία μεταβλητή τύπου long μία τιμή που είναι μεγαλύτερη από την μέγιστη τιμή της μεταβλητή int ή μικρότερη της ελάχιστης τιμή της int, τότε θα πρέπει να χρησιμοποιήσετε ένα κυριολεκτικό τύπου long, όπως δείχνουμε παρακάτω: | ||
+ | <code java> | ||
+ | long a = 2147483648878787L; | ||
+ | ή | ||
+ | long a = 2147483648878787l; | ||
+ | </code> | ||
+ | Εάν παραλείψετε τον χαρακτήρα 'L' ή 'l', τότε ο compiler εμφανίζει το παρακάτω μήνυμα λάθους. | ||
+ | <code> | ||
+ | error: integer number too large: 2147483648878787 | ||
+ | long a = 2147483648878787; | ||
+ | ^ | ||
+ | </code> | ||
+ | |||
+ | Σε έναν ακέραιο αριθμό (byte, short, int, long) μπορείτε να αναθέσετε τιμές χρησιμοποιώντας κυριολεκτικά δεκαδικής, δεκαεξαδικής ή δυαδικής μορφής. Ενδεικτικά παραδείγματα δίνονται παρακάτω: | ||
+ | |||
+ | * **Δεκαδικές τιμές**: ''int decVal = 26;'' | ||
+ | * **Δεκαεξαδικές τιμές:** ''int hexVal = 0x1a;'' | ||
+ | * **Δυαδικές τιμές:** ''int binVal = 0b11010;'' | ||
=== Κυριολεκτικά αριθμών κινητής υποδιαστολής (float) === | === Κυριολεκτικά αριθμών κινητής υποδιαστολής (float) === | ||
- | Τα κυριολεκτικά αριθμών κινητής υποδιαστολής είναι τύπου double. | + | Τα κυριολεκτικά αριθμών κινητής υποδιαστολής είναι τύπου double και όχι float. Αυτό πρακτικά σημαίνει ότι μπορείτε να αναθέσετε οποιαδήποτε τιμή σε μία μεταβλητή double χωρίς περιορισμούς. |
<code java> | <code java> | ||
- | double d = 0.14768; ή double d = 0.14768L; | + | double d = 0.14768; ή double d = 0.14768D; |
</code> | </code> | ||
- | Εάν ένα κυριολεκτικό είναι τύπου float θα πρέπει να τελειώνει σε //F// ή //f//, δηλ. | + | |
+ | <WRAP tip 80% center round> | ||
+ | **Δεν συνιστάται, αλλά για λόγους πληρότητας αναφέρεται εδώ.** | ||
+ | |||
+ | Εάν για οποιονδήποτε λόγο θέλετε να αναθέσετε μία τιμή σε μία μεταβλητή τύπου float τότε αυτή θα πρέπει να έχει τα εξής χαρακτηριστικά: | ||
+ | * να χωρά σε μία μεταβλητή τύπου float. | ||
+ | * η τιμή να τελειώνει με τον χαρακτήρα 'F' ή 'f', δηλώνοντας ένα κυριολεκτικό float. | ||
+ | Δείτε το παρακάτω παραδειγμα: | ||
+ | <code java> | ||
+ | float d= 1288789.99999999999999999999; | ||
+ | |||
+ | Λαμβάνετε το παρακάτω μήνυμα λάθους, καθώς πάτε να αντιστοιχίσετε σε μία μεταβλητή τύπου float ένα κυριολεκτικό double. | ||
+ | error: possible loss of precision | ||
+ | float d= 1288789.99999999999999999999; | ||
+ | ^ | ||
+ | required: float | ||
+ | found: double | ||
+ | </code> | ||
+ | |||
+ | Αντίστοιχα, εάν σε ένα κυριολεκτικό τύπου float δηλώσετε μία τιμή που υπερβαίνει τις δυνατότητες μίας μεταβλητής float να το αποθηκεύσει τότε επίσης θα λάβετε ένα μήνυμα λάθους. Για παράδειγμα: | ||
+ | <code java> | ||
+ | float d= 1288787879999999999999999999999999999999999999999999999999.99999999999999999999F; | ||
+ | |||
+ | error: floating point number too large | ||
+ | float d= 1288789999999999999999999999999999999999999999999999999999999.99999999999999999999F; | ||
+ | ^ | ||
+ | </code> | ||
+ | |||
+ | |||
+ | </WRAP> | ||
+ | Εάν ένα κυριολεκτικό είναι τύπου float αντί για double, θα πρέπει να τελειώνει σε //F// ή //f//, δηλ. | ||
<code java> | <code java> | ||
float f = 0.14768f; ή float f = 0.14768F; | float f = 0.14768f; ή float f = 0.14768F; | ||
Line 98: | Line 178: | ||
==== Χρήση χαρακτήρων '_' (underscore) σε αριθμητικά κυριολεκτικά ==== | ==== Χρήση χαρακτήρων '_' (underscore) σε αριθμητικά κυριολεκτικά ==== | ||
- | Μπορούμε να χρησιμοποιήσουμε χαρακτήρες //underscore// σε αριθμητικά κυριολεκτικά, όπως παρακάτω: | + | Μπορούμε να χρησιμοποιήσουμε χαρακτήρες //underscore// σε αριθμητικά κυριολεκτικά (κυρίως για λόγους αναγνωσιμότητας) όπως παρακάτω: |
<code java> | <code java> | ||
Line 121: | Line 201: | ||
- | | | [[java:arrays | Πίνακες ]] | | + | | Προηγούμενο: [[java:comments | Σχόλια ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:arrays | Πίνακες ]] | |