Τι είναι οι μεταβλητές στη java. WDH: Java - Τύποι, τιμές και μεταβλητές

Οι πρωτόγονοι τύποι στην Java είναι ένα σημαντικό, συχνά χρησιμοποιούμενο μέρος της γλώσσας που απαιτεί ειδικό χειρισμό. Σε αυτή τη δημοσίευση θα προσπαθήσουμε να απαντήσουμε σε όλες τις ερωτήσεις που σχετίζονται με τους πρωτόγονους τύπους, τον μηχανισμό λειτουργίας και την επεξεργασία τους. Το άρθρο προορίζεται τόσο για αρχάριους που μόλις ξεκίνησαν τον ακανθώδες δρόμο της εκμάθησης Java (είμαι ένας από αυτούς), όσο και για άτομα που είναι αρκετά εξοικειωμένα με τη γλώσσα, που θα μπορέσουν να ανανεώσουν τις γνώσεις τους και, ελπίζω, βρίσκουν κάτι ενδιαφέρον για τον εαυτό τους.

Πρωτόγονοι τύποι

Οι πρωτόγονοι τύποι παραβιάζουν ελαφρώς την αντικειμενοστραφή φύση της γλώσσας Java, καθώς αντιπροσωπεύουν μεμονωμένες (απλές) τιμές. Αυτό το χαρακτηριστικό εξηγείται από την επιθυμία να εξασφαλιστεί η μέγιστη απόδοση. Η δημιουργία μιας απλής μεταβλητής αντικειμένου χρησιμοποιώντας νέα δεν είναι αρκετά αποτελεσματική, επειδή η νέα μεταφέρει το αντικείμενο στο σωρό. Αντίθετα, δημιουργείται μια "αυτόματη" μεταβλητή που δεν αποτελεί αναφορά στο αντικείμενο. Μια μεταβλητή αποθηκεύει μια μεμονωμένη τιμή και βρίσκεται στη στοίβα. Η στοίβα είναι μια περιοχή αποθήκευσης δεδομένων που βρίσκεται στη μνήμη RAM. Ο επεξεργαστής έχει άμεση πρόσβαση σε αυτήν την περιοχή μέσω ενός δείκτη στοίβας, επομένως η στοίβα είναι ένας πολύ γρήγορος και αποτελεσματικός τρόπος αποθήκευσης δεδομένων. Όσον αφορά την ταχύτητα, η στοίβα είναι δεύτερη μετά τους καταχωρητές (λογικό, αφού οι καταχωρητές βρίσκονται μέσα στον επεξεργαστή).
Όλα τα μεγέθη των πρωτόγονων τύπων είναι αυστηρά καθορισμένα και δεν εξαρτώνται από την αρχιτεκτονική του μηχανήματος. Αυτός είναι ένας από τους λόγους για τη βελτιωμένη φορητότητα των προγραμμάτων Java.
Η Java ορίζει οκτώ πρωτόγονους τύπους, οι οποίοι μπορούν να χωριστούν σε τέσσερις ομάδες:

Ολόκληροι αριθμοί

Υπάρχουν τέσσερις πρωτόγονοι τύποι που ορίζονται για ακέραιους αριθμούς: ψηφιόλεξη, μικρός, ενθ, μακρύς. Όλοι αυτοί οι τύποι αντιπροσωπεύουν υπογεγραμμένες ακέραιες τιμές: θετικές ή αρνητικές. Δεν υπάρχουν θετικές ανυπόγραφες ακέραιες τιμές στην Java ( ανυπόγραφο). Όπως αναφέρθηκε προηγουμένως, όλα τα μεγέθη των πρωτόγονων τύπων είναι σταθερά:
Ο μικρότερος ακέραιος τύπος είναι ψηφιόλεξη. Οι μεταβλητές αυτού του τύπου είναι πολύ βολικές για εργασία με ροές I/O και για χειρισμό δυαδικών δεδομένων. Ακολουθεί ο τύπος μικρός, το οποίο χρησιμοποιείται λιγότερο συχνά από όλους τους άλλους τύπους. Ο πιο συχνά χρησιμοποιούμενος τύπος είναι ενθ. Χρησιμοποιείται συνεχώς σε βρόχους για την ευρετηρίαση πινάκων. Μπορεί να φαίνεται ότι η χρήση τύπων ψηφιόλεξηΚαι μικρόςσε μέρη όπου δεν απαιτείται ευρύ φάσμα τιμών, θα είναι πιο αποτελεσματικό από τη χρήση ενθ. Αλλά αυτό δεν είναι αλήθεια, γιατί όταν αξιολογούνται οι εκφράσεις, οι τιμές τύπου byte ή short θα μετατραπούν σε ενθ(θα επανέλθουμε σε αυτό το θέμα αργότερα). Όταν τύπος μήκους ενθδεν είναι αρκετό για να αποθηκεύσετε την τιμή, πρέπει να χρησιμοποιήσετε μακρύς. Το εύρος των τιμών του είναι αρκετά μεγάλο, γεγονός που κάνει μακρύςβολικό όταν εργάζεστε με μεγάλους ακέραιους αριθμούς.

Αριθμοί κινητής υποδιαστολής

Οι αριθμοί κινητής υποδιαστολής (ή πραγματικοί αριθμοί) αντιπροσωπεύονται από τύπους φλοτέρΚαι διπλό. Χρησιμοποιείται για την αποθήκευση τιμών με ακρίβεια σε ένα συγκεκριμένο σημείο μετά την υποδιαστολή.
Τύπος φλοτέρορίζει μια αριθμητική τιμή κινητής υποδιαστολής μονής ακρίβειας. Αυτός ο τύπος χρησιμοποιείται όταν χρειάζεστε μια αριθμητική τιμή με ένα κλασματικό μέρος, αλλά χωρίς μεγάλη ακρίβεια. Τύπος διπλόχρησιμοποιείται για την αποθήκευση τιμών κινητής υποδιαστολής διπλής ακρίβειας. Η επεξεργασία τιμών διπλής ακρίβειας είναι ταχύτερη από την επεξεργασία μεμονωμένων τιμών ακριβείας. Επομένως, οι περισσότερες μαθηματικές συναρτήσεις της τάξης java.lang.Mathεπιστρέφουν τιμές τύπου διπλό. Το πιο αποτελεσματικό στη χρήση διπλόόταν πρέπει να διατηρήσετε την ακρίβεια των επαναλαμβανόμενων υπολογισμών ή να χειριστείτε μεγάλους αριθμούς.

Σύμβολα

Στην προδιαγραφή, ο πρωτόγονος τύπος char ανήκει στους ολοκληρωμένους τύπους (ή αναπόσπαστους τύπους), αλλά επειδή παίζει λίγο διαφορετικό ρόλο, μπορεί να του δοθεί η δική του κατηγορία. Ο ρόλος του είναι να αναπαριστά σύμβολα Unicode. Απαιτούνται 16 bit για την αποθήκευση χαρακτήρων. Είναι περίεργο, γιατί 8 bit είναι αρκετά για να αναπαραστήσουν χαρακτήρες σε κύριες γλώσσες (για παράδειγμα, αγγλικά, γαλλικά, ισπανικά). Αλλά αυτό είναι το τίμημα της διεθνοποίησης. Unicodeχρησιμοποιεί ένα πλήρες σύνολο διεθνών χαρακτήρων σε όλες τις γνωστές γλώσσες του κόσμου.

Λογικές τιμές

Ο πρωτόγονος τύπος boolean έχει σχεδιαστεί για να αποθηκεύει λογικές τιμές. Αυτός ο τύπος μπορεί να λάβει μία από τις δύο πιθανές τιμές: true ή false. Οι τιμές Boole επιστρέφονται από όλες τις λογικές πράξεις (όπως πράξεις σύγκρισης). Είναι υποχρεωτικό κατά την κατασκευή κύκλων και τελεστών (για παράδειγμα, για, εάν).

Κυριολεκτικά

Οι τιμές των πρωτόγονων τύπων δεδομένων αρχικοποιούνται στις περισσότερες περιπτώσεις χρησιμοποιώντας κυριολεκτικά. Ας τους δούμε.

Ακέραιοι κυριολεκτικά

Τα πιο συχνά χρησιμοποιούμενα κυριολεκτικά. Οποιαδήποτε ακέραια τιμή είναι αριθμητική κυριολεκτική (για παράδειγμα, -10 , 10 - δεκαδικές τιμές). Μπορείτε να χρησιμοποιήσετε οκταδικά, δεκαεξαδικά και δυαδικά κυριολεκτικά:

// δεκαδική κυριολεξία, αριθμοί, δεν ξεκινά με 0 int δεκαδικό = 10. // 10 // το οκταδικό κυριολεκτικό ξεκινά με 0, μετά οι αριθμοί int οκταδικό = 010; // 8 // Το δεκαεξαδικό κυριολεκτικό ξεκινά με 0x ή 0X, μετά αριθμοί και σύμβολα int δεκαεξαδικό = 0x10; // 16 // Η δυαδική κυριολεξία ξεκινά με Ob ή 0B, μετά οι αριθμοί int binary = 0b10; // 2
Όλα τα ακέραια κυριολεκτικά αντιπροσωπεύουν τιμές ενθ. Εάν η κυριολεκτική τιμή βρίσκεται στο εύρος ψηφιόλεξη, μικρόςή απανθρακώνω, τότε μπορεί να αντιστοιχιστεί σε μια μεταβλητή αυτού του τύπου χωρίς casting τύπου. Για να δημιουργήσετε ένα κυριολεκτικό του τύπου μακρύς, πρέπει να υποδείξετε ρητά στον μεταγλωττιστή προσθέτοντας την κυριολεξία με το γράμμα " μεγάλο" ή " μεγάλο":

Byte b1 = 127; byte b2 = 128; // βραχυκύκλωμα σφάλματος s1 = -32768; short s2 = -32769; // χαρακτήρας σφάλματος c1 = 0; char c2 = -1; // μήκος σφάλματος l1 = 10l; long l2 = 0x7ffffffffffffffffL; // μέγιστη τιμή τύπου long

Κυριολεκτικά κινητής υποδιαστολής

Υπάρχουν δύο μορφές σημειογραφίας για χαρακτήρες κινητής υποδιαστολής: τυπική και εκθετική:

// τυπική φόρμα double d1 = 0.; // ισοδυναμεί με.0 ή 0.0; διπλό d2 = 0,125; // εκθετική μορφή - χρησιμοποιήστε το σύμβολο "e" ή "E" // αφού είναι η δύναμη του 10 με την οποία ο δεδομένος αριθμός πρέπει να πολλαπλασιαστεί διπλάσιο d3 = 125E+10. // εάν ο βαθμός είναι θετικός, το "+" μπορεί να παραλειφθεί διπλό d4 = 1,25e-10;
Σε όλα τα κυριολεκτικά κινητής υποδιαστολής εκχωρείται ένας τύπος από προεπιλογή διπλό. Επομένως, για να δημιουργήσετε ένα κυριολεκτικό like φλοτέρ, πρέπει να καθορίσετε το γράμμα " μετά την κυριολεξία φά" ή " φά". Μπορείτε επίσης να προσθέσετε το γράμμα " στα κυριολεκτικά ρε" ή " ρε», υποδεικνύοντας ότι πρόκειται για κυριολεκτικό διπλό, αλλά γιατί;

Διπλό d1 = 0,125; float f2 = 0,125f;
Μπορείτε να χρησιμοποιήσετε δεκαεξαδικά κυριολεκτικά κινητής υποδιαστολής, για παράδειγμα:

// P - δυαδική σειρά, η οποία δείχνει τη δύναμη του 2 με την οποία ο δεδομένος αριθμός πρέπει να πολλαπλασιαστεί διπλάσιο d = 0x10.P10d; // φυσικά, είναι δυνατό χωρίς "d" float f = 0x20.P10f;
Για να διευκολυνθεί η ανάγνωση μεγάλων κυριολεκτικών γραμμάτων, η έκδοση 7 της γλώσσας πρόσθεσε τη δυνατότητα χρήσης του χαρακτήρα «_» μέσα σε ένα κυριολεκτικό:

// μπορείτε να κάνετε οποιουσδήποτε συνδυασμούς χρησιμοποιώντας οποιονδήποτε αριθμό χαρακτήρων "_" int phone = 111__111__111; int bin = 0b1000_1000_1000; διπλά δολάρια = 23_000.450__500; // δεν επιτρέπεται η χρήση του χαρακτήρα "_" στο τέλος ή στην αρχή ενός κυριολεκτικού, και επίσης δεν είναι δυνατός ο διαχωρισμός "0x" και "0b"

Κυριολεκτικά χαρακτήρες

Τα κυριολεκτικά των χαρακτήρων περικλείονται σε μονά εισαγωγικά. Όλοι οι χαρακτήρες που εμφανίζονται μπορούν να ρυθμιστούν με αυτόν τον τρόπο. Εάν ένας χαρακτήρας δεν μπορεί να εισαχθεί απευθείας, χρησιμοποιήστε ακολουθίες διαφυγής που ξεκινούν με τον χαρακτήρα " \ Αν και όλες αυτές οι ακολουθίες μπορούν να αντικατασταθούν από τις αντίστοιχες Unicodeκώδικας. Μπορείτε επίσης να δημιουργήσετε έναν κυριολεκτικό χαρακτήρα χρησιμοποιώντας οκταδικές ("\xxx") και δεκαεξαδικές ("\uxxxx") μορφές.

Char h = "a"; // τυπική φόρμα char a = "\001"; // οκταδική μορφή char c = "\u0001"; // δεκαεξαδική μορφή
Υπάρχουν και κυριολεκτικά εγχόρδων. Μπορείτε να λάβετε πληροφορίες σχετικά με αυτά.

Boolean κυριολεκτικά

Με τους λογικούς τελεστές όλα είναι απλά. Υπάρχουν μόνο δύο κυριολεκτικά boolean:

Boolean ναι = αληθές. // true boolean no = false; // ψέμα
Τα Boolean literals μπορούν να αντιστοιχιστούν μόνο σε μεταβλητές τύπου boolean. Είναι επίσης σημαντικό να το καταλάβουμε αυτό ψευδήςόχι ίσα 0 , ΕΝΑ αληθήςόχι ίσα 1 . Μετατροπή μεταβλητής τύπου booleanΔεν θα λειτουργήσει με άλλους πρωτόγονους τύπους.

Λειτουργίες

Πάνω από ενσωματωμένους τύπους

  • τελεστές σύγκρισης ( > , < , >= , <= ) και ισότητα ( == , != )
  • μοναδικοί τελεστές ( + , - )
  • πολλαπλασιαστικό ( * , / , % ) και πρόσθετο ( + , - ) χειριστές
  • αύξηση ( ++ ) και μείωση ( -- ) σε μορφές προθέματος και μετάθεμα
  • εικονική ( >> , << ) και ανυπόγραφο ( >>> ) χειριστές βάρδιας
  • τελεστές bitwise ( ~ , & , ^ , | )
  • τελεστής υπό όρους ( ? : )
  • χειριστής χυτού

Πάνω από Floating-Pointτύπους

Μπορείτε να εκτελέσετε όλες τις ίδιες λειτουργίες σε αριθμούς κινητής υποδιαστολής όπως μπορείτε σε ακέραιους, με εξαίρεση τους τελεστές bitwise και shift.

Άνω του τύπου boolean

  • τελεστές ισότητας ( == Και != )
  • λογικοί τελεστές ( ! ,& , | , ^ )
  • λογικοί τελεστές υπό όρους ( && , || )
  • τελεστής υπό όρους ( ? : )

Μετατροπή

Υπάρχουν τρεις τύποι μετασχηματισμών:
  • διευρυνόμενος μετασχηματισμός ( πλάτυνση)
  • περιοριστικός μετασχηματισμός ( στένωση)
  • διεύρυνση + στένωση (μετατροπή ψηφιόλεξηΠρος την απανθρακώνω, αρχικά ψηφιόλεξημετατροπή σε ενθ, και μετά ενθ- V απανθρακώνω)

Επέκταση του μετασχηματισμού

Εάν και οι δύο τύποι είναι συμβατοί και το μήκος του τύπου προορισμού είναι μεγαλύτερο από το μήκος του τύπου πηγής, εκτελείται μια διευρυνόμενη μετατροπή (για παράδειγμα ψηφιόλεξημετατράπηκε σε ενθ). Ο παρακάτω πίνακας δείχνει όλους τους πιθανούς μετασχηματισμούς επέκτασης. Στο μάθημα επισημαίνονται τύποι, η μετατροπή των οποίων μπορεί να οδηγήσει σε απώλεια δεδομένων.

Στενικός μετασχηματισμός

Με μια περιορισμένη μετατροπή, ενδέχεται να χαθούν πληροφορίες σχετικά με το συνολικό μέγεθος μιας αριθμητικής τιμής, ενώ μπορεί επίσης να χαθούν η ακρίβεια και το εύρος. Όλοι οι πιθανοί περιοριστικοί μετασχηματισμοί φαίνονται στον πίνακα:
μικρός byte, χαρακ
απανθρακώνω byte, σύντομο
ενθ byte, σύντομος, χαρακ
μακρύς int, byte, short, char
φλοτέρ long, int, byte, short, char
διπλό float, long, int, byte, short, char

Για να μετατρέψετε δύο μη συμβατούς τύπους, πρέπει να χρησιμοποιήσετε ένα cast ( χύσιμο). Εάν οι τιμές του ακέραιου τύπου πηγής είναι μεγαλύτερες από το επιτρεπόμενο εύρος τιμών του τύπου στόχου, τότε θα μειωθεί στο αποτέλεσμα της διαίρεσης modulo με το εύρος του τύπου στόχου. Εάν μια τιμή ενός τύπου κινητής υποδιαστολής μετατραπεί σε μια τιμή ενός ακέραιου τύπου, τότε συμβαίνει περικοπή (το κλασματικό τμήμα απορρίπτεται).

Byte a = (byte)128; // - 128 byte b = (byte)42; // Το ghosting είναι δυνατό, αλλά σε αυτήν την περίπτωση δεν είναι απαραίτητο int i1 = (int)1e20f; // 2147483647 int i2 = (int)Float.NaN; // 0 float f1 = (float)-1e100; // -Infinity float f2 = (float)1e-50; // 0,0

Προβολή

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

Int a = 100; float b = 50,0f; διπλό c = 50,0; διπλό αποτέλεσμα = a - b + c; // 100,0 // στην πραγματικότητα: αποτέλεσμα = (διπλό)((float)a - b) + c;
Οι κανόνες προώθησης αποδεικνύονται καλά από το ακόλουθο διάγραμμα:

Μαθήματα περιτυλίγματος

Για να αναπαραστήσουν πρωτόγονους τύπους ως αντικείμενα, δημιουργήθηκαν κλάσεις περιτυλίγματος ( τάξεις περιτυλίγματος). Τι πλεονεκτήματα μας προσφέρουν τα μαθήματα περιτυλίγματος;
  • τη δυνατότητα χρήσης αντικειμένων κλάσεων περιτυλίγματος ως παραμέτρων σε μεθόδους ή ως γενικές παραμέτρους
  • τη δυνατότητα χρήσης σταθερών που είναι υπεύθυνες για τα όρια του αντίστοιχου τύπου δεδομένων ( MIN_VALUEΚαι MAX_VALUE)
  • τη δυνατότητα χρήσης μεθόδων για μετατροπή σε άλλους πρωτόγονους τύπους, μετατροπή μεταξύ αριθμητικών συστημάτων
Υπάρχουν οκτώ κατηγορίες περιτυλίγματος, μία για κάθε πρωτόγονο τύπο:
Σχεδόν όλες οι τάξεις (εκτός BooleanΚαι Χαρακτήρας) κληρονομούνται από μια αφηρημένη κλάση Αριθμόςκαι είναι συγκρίσιμα (εφαρμόστε τη διεπαφή Συγκρίσιμος). Η ιεραρχία είναι περίπου ως εξής:


// υπάρχουν διάφοροι τρόποι για να δημιουργήσετε έναν Ακέραιο i1 = νέο Ακέραιο("10"); Ακέραιος i2 = νέος Ακέραιος(10); Integer i3 = Integer.valueOf(10); Integer i4 = Integer.valueOf("10", 10); // μπορείτε να καθορίσετε το σύστημα αριθμών, μόνο για περιτυλίγματα ακέραιων αρχέγονων τύπων Character c1 = new Character("c"); // υπάρχει μόνο ένας τρόπος // παίρνουμε τιμές πρωτόγονων τύπων int i5 = i1.intValue(); char c2 = c1.charValue();

Αυτόματη συσκευασία και αποσυσκευασία

Το JDK 5 εισήγαγε δύο σημαντικά χαρακτηριστικά:
  • Αυτοσυσκευασία ( autoboxing) είναι η διαδικασία αυτόματης ενθυλάκωσης ενός πρωτόγονου τύπου σε μια κατάλληλη κατηγορία περιτυλίγματος. Δεν χρειάζεται να δημιουργήσετε ρητά ένα αντικείμενο.
  • Αποσυσκευασία ( unboxing) είναι η διαδικασία αυτόματης εξαγωγής ενός πρωτόγονου τύπου από την αντίστοιχη κλάση περιτυλίγματος. Δεν χρειάζεται να καλέσετε ρητά μια μέθοδο για να αποκτήσετε έναν πρωτόγονο τύπο.
Αυτά τα εργαλεία διευκολύνουν τη δημιουργία αντικειμένων, την απόκτηση πρωτόγονων τύπων και απλοποιούν την εργασία με συλλογές.

Δημόσια static void main(String... s) ( Integer i1 = 10; // autoboxing - Integer.valueOf(10) int i2 = i1; // unboxing - i1.intValue() μέθοδος(10); // autoboxing σε αντικείμενο της κλάσης Integer - Integer.valueOf(10) ++i1; // unboxing - i1.intValue(), autoboxing - Integer.valueOf(i1.intValue() + 1) ) private static int μέθοδος(Integer i) ( επιστροφή i ; // αποσυσκευασία του αντικειμένου που έγινε αποδεκτό ως παράμετρος - i.intValue() )

Μερικές χρήσιμες μέθοδοι

Ακέραιος αριθμός i1 = 128; i1.compareTo(5); // 1, δηλαδή i.intValue() > Integer.valueOf(5) Integer.decode("0xabc"); // δεν λειτουργεί με δυαδικές κυριολεξίες Integer.parseInt("10", 3); // λειτουργεί με οποιοδήποτε σύστημα αριθμών // μέθοδος μετατροπής i1.byteValue(); // (byte)i.intValue() // μέθοδοι επαλήθευσης Float f = 20,5f; Boolean badFloat = f.isInfinite() || f.isNaN(); // false, autoboxing boolean // convert to string f.toString();
Σας ευχαριστώ για την προσοχή σας. Όλες οι προσθήκες, διευκρινίσεις και κριτικές είναι ευπρόσδεκτες.

Η Java είναι μια αντικειμενοστραφής γλώσσα, η οποία χαρακτηρίζεται από αφαίρεση, αλλά για εφαρμοσμένες εργασίες πρέπει πάντα να λειτουργείτε με γνωστές παραμέτρους. Στον προγραμματισμό, ονομάζονται μεταβλητές. Πώς διαφέρει μια μεταβλητή java από ένα αντικείμενο;

Είναι απλό - μια μεταβλητή είναι ένα κελί μνήμης όπου αποθηκεύεται η τιμή της. Οποιαδήποτε ενέργεια είναι άμεση εργασία με αυτήν την περιοχή της μνήμης. Ένα αντικείμενο είναι μια πιο σύνθετη ποσότητα. Καταλαμβάνει ένα συγκεκριμένο εύρος μνήμης, η αλληλεπίδραση πραγματοποιείται μέσω μιας συγκεκριμένης συνάρτησης μεταφοράς (μεθόδων), που εκφράζεται στις παραμέτρους του αντικειμένου.
Σε αυτό το άρθρο θα μιλήσουμε συγκεκριμένα για μεταβλητές· εδώ αυτή δεν είναι καθόλου ασήμαντη έννοια.

Οι μεταβλητές Java δηλώνονται ως εξής:

data_type variable_name;

Εδώ, κατά τη δήλωση, μπορείτε να εκχωρήσετε μια τιμή.

data_type variable_name = variable_value;

Μπορείτε επίσης να δηλώσετε πολλές μεταβλητές ταυτόχρονα, απλώς αναφέροντάς τις χωρισμένες με κόμμα.

data_type variable_name1, variable_name2...;

Ταξινόμηση ανά υπαγωγή

Υπάρχουν τέσσερις τύποι μεταβλητών java:

  • μεταβλητές παράδειγμα?
  • μεταβλητές κλάσης?
  • Τοπικές μεταβλητές.
  • Παράμετροι.

Ας έχουμε πολλά αντικείμενα της ίδιας κλάσης Automobile(). Εκτός από τις κοινές παραμέτρους, έχουν μοναδικές, ας πούμε, τη μέγιστη ταχύτητα maxSpeed(). Μπορούν να εκκινηθούν στο σώμα του προγράμματος ή μπορούν να αποθηκευτούν σε μη στατικά πεδία κλάσης (δηλωμένα χωρίς προσθήκη της λέξης στατική). Έτσι, κάθε στιγμιότυπο θα έχει μια μεμονωμένη παράμετρο που δεν εξαρτάται από τις ταχύτητες άλλων αντικειμένων.

δημόσια κατηγορία Automobile (όνομα δημόσιας συμβολοσειράς; ιδιωτικό διπλό maxSpeed; δημόσιο αυτοκίνητο (αυτονομικό όνομα συμβολοσειράς) (όνομα = autoName; ))

Μια μεταβλητή κλάσης, ή μια στατική μεταβλητή java, από την άλλη πλευρά, δηλώνεται αποκλειστικά χρησιμοποιώντας τη λέξη static. Σε αυτήν την περίπτωση, η τιμή του θα είναι η ίδια για όλες τις περιπτώσεις. Στην περίπτωση του ίδιου αυτοκινήτου, εισαγάγετε την παράμετρο gearsNum – τον ​​αριθμό των ταχυτήτων. Για όλες τις περιπτώσεις θα είναι ίσο με 6.

Ο προαιρετικός τελικός τροποποιητής σάς επιτρέπει να εκχωρήσετε μια τιμή σε μια μεταβλητή μόνο μία φορά. Ο μεταγλωττιστής το επιβάλλει αυτό.

δημόσιας κατηγορίας Automobile (δημόσιο μοντέλο String; ιδιωτικό διπλό maxSpeed; δημόσιο στατικό τελικό int gearsNum = 6;)

Οι τοπικές μεταβλητές και οι μέθοδοι στη java σχετίζονται πάντα. Τα τελευταία περιέχουν συχνά βοηθητικές παραμέτρους που δεν χρειάζονται σε περαιτέρω κώδικα. Δεν υπάρχει ειδική μορφή αρχικοποίησης για τη δήλωση μιας τοπικής μεταβλητής· το εύρος της δράσης της εξαρτάται μόνο από τη θέση της δήλωσης. Σε αυτή την περίπτωση - σε σγουρά τιράντες μέσα στη μέθοδο. Κατά την έξοδο από αυτήν, η μεταβλητή θα καταστραφεί, επομένως δεν θα είναι πλέον δυνατή η πρόσβαση σε αυτήν.

Μια ακραία περίπτωση τοπικών μεταβλητών είναι οι παράμετροι. Συγκεκριμένα, το κλασικό παράδειγμα του «Hello, World!»:

class HelloWorld (δημόσιο static void main ( String args ) ( System . out . println ( "Hello World!" ); ) )

Υπάρχουν δύο παράμετροι εδώ ταυτόχρονα. Το πρώτο είναι στην πραγματικότητα "Hello, World!", το δεύτερο είναι το όρισμα συμβολοσειράς args στην κύρια.

Ταξινόμηση κατά ορατότητα

Με βάση αυτά που περιγράφηκαν παραπάνω, μπορεί να εντοπιστεί μια ακόμη διαίρεση - σύμφωνα με την ορατότητα των μεταβλητών. Υπάρχουν 4 ομάδες:

  • Δημόσιο Αυτός ο τροποποιητής μεταβλητής είναι διαθέσιμος σε όλες τις κλάσεις και τα αντικείμενα του προγράμματος. Δηλώθηκε χρησιμοποιώντας τη δημόσια λέξη-κλειδί στην αρχή της γραμμής.
  • Προστατεύεται. Το εύρος των μεταβλητών java σε αυτήν την περίπτωση περιορίζεται στο τρέχον πακέτο και στις υποκλάσεις. Δηλώνεται με τον ίδιο τρόπο - με την προστατευμένη λέξη-κλειδί.
  • Η συσκευασία προστατεύεται. Τροποποιητής για μεταβλητές διαθέσιμος μόνο εντός του πακέτου. Δεν απαιτείται δήλωση, η απουσία λέξεων-κλειδιών σημαίνει ότι το πακέτο προστατεύεται.
  • Ιδιωτικός. Μεταβλητές που είναι προσβάσιμες αποκλειστικά μέσα σε μια κλάση. Σε αυτήν την περίπτωση, μπορείτε να προσδιορίσετε τον τύπο μιας μεταβλητής χρησιμοποιώντας την ιδιωτική λέξη-κλειδί.

Παρά το γεγονός ότι τα ιδιωτικά στοιχεία είναι διαθέσιμα μέσα στην κλάση, το ερώτημα είναι: "πώς να αποκτήσω πρόσβαση σε ιδιωτικές μεταβλητές java;" έχει ακόμα απάντηση. Για να μπορείτε να αλλάξετε την τιμή μιας ιδιωτικής παραμέτρου από έξω, αρκεί να δημιουργήσετε μια δημόσια μέθοδο μέσα στην ίδια κλάση. Για παράδειγμα όπως αυτό:

class Drive (ιδιωτικά int gears; public void setGears (int val) (gears = val;))

Με αυτόν τον τρόπο, εάν είναι απαραίτητο, μπορείτε εύκολα να αλλάξετε την τιμή μιας ιδιωτικής μεταβλητής.

Οι δείκτες είναι μια άλλη επιλογή για καθολικές μεταβλητές. Θυμηθείτε ότι χρησιμοποιούμε τον ακόλουθο συμβολισμό για να δημιουργήσουμε ένα αντικείμενο:

object_class pointer_name = new object_class;

Τέτοιες μεταβλητές ονομάζονται μεταβλητές αναφοράς.

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

Όλοι οι τύποι στην Java χωρίζονται σε πρωτόγονοςΚαι αναφορά. Ο λογικός τύπος είναι πρωτόγονος boolean, ακέραιοι αριθμητικοί τύποι ψηφιόλεξη, μικρός, ενθ, μακρύς, απανθρακώνωκαι κυμαινόμενοι αριθμητικοί τύποι φλοτέρΚαι διπλό. Οι τύποι αναφοράς περιλαμβάνουν τάξεις, διεπαφέςΚαι πίνακες. Υπάρχει επίσης ένα ειδικό μηδενικός τύπος.

Ενα αντικείμενοστην Java είναι είτε μια δυναμικά δημιουργημένη παρουσία μιας κλάσης είτε ένας δυναμικά δημιουργημένος πίνακας. Οι τιμές ενός τύπου αναφοράς είναι αναφορές σε αντικείμενα. Όλα τα αντικείμενα, συμπεριλαμβανομένων των πινάκων, κληρονομούν μεθόδους από την κλάση Object. Οι συμβολοσειρές αντιπροσωπεύονται από αντικείμενα της κλάσης String.

ΜεταβλητόςΑυτό είναι ένα όνομα αποθήκευσης δεδομένων ενός συγκεκριμένου τύπου. Ακριβώς μιλώντας:

  • Μια μεταβλητή ενός πρωτόγονου τύπου περιέχει πάντα μια τιμή του συγκεκριμένου τύπου.
  • Μια μεταβλητή κατηγορίας τύπου μπορεί να περιέχει είτε την τιμή μηδενικό(μηδενική αναφορά) ή μια αναφορά σε ένα αντικείμενο αυτής της κλάσης ή σε απόγονό της.
  • Μια μεταβλητή τύπου διεπαφής μπορεί να περιέχει είτε μια μηδενική αναφορά είτε μια αναφορά σε ένα αντικείμενο οποιασδήποτε κλάσης που υλοποιεί αυτήν τη διεπαφή.
  • Μια μεταβλητή τύπου "πίνακας Τ", όπου το Τ είναι πρωταρχικός τύπος, μπορεί να περιέχει είτε μηδενική αναφορά είτε αναφορά σε αντικείμενο τύπου "πίνακας Τ".
  • Μια μεταβλητή τύπου "πίνακας Τ", όπου το Τ είναι τύπος αναφοράς, μπορεί να περιέχει είτε μηδενική αναφορά είτε αναφορά σε πίνακα που αποτελείται από δεδομένα που είναι συμβατή με το Τ.
  • Μια μεταβλητή τύπου Object μπορεί να περιέχει είτε μηδενική αναφορά είτε αναφορά σε οποιοδήποτε αντικείμενο.

5.3.2. Πρωτόγονοι τύποι

5.3.2.1. Πληκτρολογήστε boolean

Τύπος booleanαποτελείται από δύο λογικές σταθερές: αληθής(αλήθεια) και ψευδής(ψέμα). Μια boolean τιμή μπορεί να μεταδοθεί για να πληκτρολογήσετε boolean, δεν υπάρχουν άλλες σιωπηρές εκπομπές αυτού του τύπου στην Java. Μια τιμή Boolean μπορεί να μετατραπεί σε μια συμβολοσειρά χρησιμοποιώντας τον κανόνα μετατροπής σιωπηρής συμβολοσειράς.

Παράδειγμα δήλωσης μεταβλητής boolean:

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

5.3.3.2. Κατηγορία αντικειμένου

Η τυπική κλάση Object είναι ο πρόγονος όλων των άλλων κλάσεων Java που κληρονομούν τις μεθόδους της. Αυτές οι μέθοδοι περιγράφονται λεπτομερώς στο Κεφ. 5.14.

5.3.3.3. Κατηγορία χορδών

Τα στιγμιότυπα της κλάσης String είναι συμβολοσειρές κειμένου, δηλαδή συμβολοσειρές χαρακτήρων Unicode. Ένα αντικείμενο της κλάσης String έχει σταθερή (αμετάβλητη) τιμή. Οι σταθερές συμβολοσειράς είναι αναφορές σε στιγμιότυπα της κλάσης String.

Ο τελεστής συνένωσης συμβολοσειρών δημιουργεί έμμεσα ένα νέο αντικείμενο της κλάσης String.

5.3.4. Μεταβλητές

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

5.3.4.1. Τύποι μεταβλητών

Υπάρχουν επτά τύποι μεταβλητών στην Java:

  1. Μεταβλητή κατηγορίαςΕίναι ένα στατικό πεδίο δεδομένων σε μια δήλωση κλάσης ή οποιοδήποτε πεδίο δεδομένων σε μια δήλωση διεπαφής. Μια μεταβλητή κλάσης δημιουργείται όταν φορτώνεται η κλάση ή η διεπαφή της. αμέσως μετά τη δημιουργία του εκχωρείται μια προεπιλεγμένη τιμή. Μια μεταβλητή κλάσης καταστρέφεται όταν η κλάση ή η διεπαφή της αποφορτωθεί (αφού ολοκληρωθεί η οριστικοποίησή της).
  2. Μεταβλητή υλοποίησηςΑυτό είναι ένα πεδίο δεδομένων σε μια δήλωση κλάσης που δεν είναι στατικό. Μια τέτοια μεταβλητή δημιουργείται και δίνεται μια προεπιλεγμένη τιμή όταν δημιουργείται μια παρουσία της δεδομένης κλάσης ή μιας κλάσης που είναι απόγονός της. Μια μεταβλητή υλοποίησης καταστρέφεται όταν η αντίστοιχη παρουσία κλάσης συλλέγεται σκουπίδια (αφού ολοκληρωθεί η οριστικοποίησή της).
  3. Στοιχεία πίνακαΑυτές είναι μεταβλητές χωρίς όνομα που δημιουργούνται και δίνεται μια προεπιλεγμένη τιμή όταν δημιουργείται ο πίνακας. Αυτές οι μεταβλητές καταστρέφονται όταν ο πίνακας αφαιρείται από τη συλλογή σκουπιδιών.
  4. Επιλογές κατασκευαστήαυτά είναι τα ονόματα των τιμών των ορισμάτων που μεταβιβάστηκαν στον κατασκευαστή. Για κάθε παράμετρο στη δήλωση του κατασκευαστή, μια νέα μεταβλητή δημιουργείται κάθε φορά που καλείται ο κατασκευαστής (είτε ρητά είτε σιωπηρά). Σε αυτήν τη μεταβλητή εκχωρείται η πραγματική τιμή του ορίσματος που μεταβιβάστηκε στον κατασκευαστή όταν καλείται. Η μεταβλητή καταστρέφεται αφού το σώμα του κατασκευαστή ολοκληρώσει την εκτέλεση.
  5. Παράμετροι μεθόδουαυτά είναι τα ονόματα των τιμών των ορισμάτων που μεταβιβάστηκαν στη μέθοδο. Για κάθε παράμετρο σε μια δήλωση μεθόδου, δημιουργείται μια νέα μεταβλητή κάθε φορά που καλείται αυτή η μέθοδος. Σε αυτήν τη μεταβλητή εκχωρείται η πραγματική τιμή του ορίσματος που μεταβιβάστηκε στη μέθοδο όταν καλείται. Η μεταβλητή καταστρέφεται μετά την ολοκλήρωση της εκτέλεσης του σώματος της μεθόδου.
  6. Παράμετρος χειριστή εξαίρεσηςδημιουργείται κάθε φορά που εκτελείται ένα τμήμα σύλληψηχειριστής δοκιμάστε. Η τιμή του γίνεται το αντικείμενο που σχετίζεται με την εξαίρεση που προέκυψε. Η μεταβλητή καταστρέφεται όταν το μπλοκ ολοκληρώσει την εκτέλεση σύλληψη.
  7. Τοπικές μεταβλητές. Κάθε φορά κατά τη διάρκεια της εκτέλεσης του προγράμματος, ο έλεγχος μεταφέρεται σε ένα νέο μπλοκ ή δήλωση Για, για κάθε δήλωση μεταβλητής εντός αυτού του μπλοκ ή της δήλωσης, δημιουργείται μια αντίστοιχη τοπική μεταβλητή. Εάν η δήλωση περιέχει την αρχική τιμή της μεταβλητής, τότε της εκχωρείται αυτή η τιμή. Μια τοπική μεταβλητή καταστρέφεται όταν το μπλοκ ή η δήλωση στην οποία έχει δηλωθεί ολοκληρώσει την εκτέλεση.

Το ακόλουθο παράδειγμα περιέχει δηλώσεις πολλών μεταβλητών των ακόλουθων ποικιλιών:

Σημείο κλάσης ( στατικά int numPoints; // numPoints - μεταβλητή κλάσης int x, y; // x και y - μεταβλητές υλοποίησης int w = new int; // w - πίνακας ακεραίων, w - στοιχείο πίνακα int setX(int x) ( // x - παράμετρος μεθόδου int oldx = this.x; // oldx - τοπική μεταβλητή this.x = x; επιστροφή oldx; ) )

5.3.4.2. Αρχικές τιμές μεταβλητών

Για να είναι δυνατή η πρόσβαση σε μια μεταβλητή, πρέπει να της εκχωρηθεί μια τιμή. Εν

  • Σε κάθε μεταβλητή κλάσης, μεταβλητή υλοποίησης και σε κάθε στοιχείο πίνακα εκχωρείται μια προεπιλεγμένη τιμή κατά τη δημιουργία ως εξής:
    • μεταβλητές τύπου ψηφιόλεξη, μικρός, ενθ, μακρύςλάβετε την τιμή 0 του αντίστοιχου τύπου.
    • μεταβλητές τύπου φλοτέρΚαι διπλόλάβετε την τιμή +0 του αντίστοιχου τύπου.
    • μεταβλητές τύπου απανθρακώνωλάβετε την τιμή "\u0000"?
    • μεταβλητές τύπου booleanπάρτε την αξία ψευδής;
    • Οι μεταβλητές τύπου αναφοράς παίρνουν μια τιμή μηδενικό;
  • Σε κάθε μέθοδο και παράμετρο κατασκευαστή εκχωρείται η πραγματική τιμή του αντίστοιχου ορίσματος, που προσδιορίζεται τη στιγμή που κλήθηκε η μέθοδος ή ο κατασκευαστής.
  • Η παράμετρος χειριστή εξαιρέσεων αρχικοποιείται από το αντίστοιχο αντικείμενο.
  • Σε μια τοπική μεταβλητή πρέπει να εκχωρηθεί μια τιμή για να μπορέσει να χρησιμοποιηθεί, είτε με αρχικοποίηση σε μια δήλωση είτε από έναν τελεστή εκχώρησης.

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

Μια μεταβλητή είναι το κύριο συστατικό της αποθήκευσης δεδομένων σε ένα πρόγραμμα Java. Μια μεταβλητή ορίζεται από έναν συνδυασμό ενός αναγνωριστικού, ενός τύπου και μιας προαιρετικής αρχικής τιμής. Εκτός, Όλες οι μεταβλητές έχουν ένα εύρος, το οποίο καθορίζει την ορατότητά τους σε άλλα αντικείμενα και τη διάρκεια ζωής τους.

Στην Java, όλες οι μεταβλητές πρέπει να δηλωθούν για να μπορέσουν να χρησιμοποιηθούν. Μπορείτε να δηλώσετε μια μεταβλητή οπουδήποτε στο πρόγραμμα. Η βασική μορφή δήλωσης μεταβλητής μοιάζει με αυτό:

τύπος αναγνωριστικό[=τιμή][, αναγνωριστικό[=τιμή] ...] ;

  • τύποςείναι ένας από τους βασικούς τύπους Java ή το όνομα μιας κλάσης ή μιας διεπαφής.
  • αναγνωριστικόείναι το όνομα της μεταβλητής

Μπορείτε να εκχωρήσετε μια αρχική τιμή σε μια μεταβλητή (να την αρχικοποιήσετε) καθορίζοντας ένα σύμβολο ίσου και μια τιμή. Θυμηθείτε ότι η έκφραση αρχικοποίησης πρέπει να επιστρέψει μια τιμή του ίδιου (ή συμβατού) τύπου με αυτή που καθορίζεται για τη μεταβλητή. Μπορείτε να χρησιμοποιήσετε μια λίστα διαχωρισμένη με κόμματα για να δηλώσετε περισσότερες από μία μεταβλητές συγκεκριμένου τύπου.

Παρακάτω δίνονται διάφορα παραδείγματα δήλωσης μεταβλητών διαφόρων τύπων. Σημειώστε ότι ορισμένες δηλώσεις εκτελούν αρχικοποίηση μεταβλητής.

ένα , σι , ντο ; // δήλωση τριών μεταβλητών τύπου int: a, b και c
ενθ ρε = 3 , μι , φά = 5 ; // δήλωση τριών ακόμη μεταβλητών τύπου int withαρχικοποίηση των d και f
ψηφιόλεξη z = 22 ; // αρχικοποίηση της μεταβλητής z
διπλό πι = 3.14159 ; // δήλωση της κατά προσέγγιση τιμής της μεταβλητήςπι
απανθρακώνω Χ = "Χ"; // εκχωρώντας την τιμή "x" στη μεταβλητή x

Δεν μπορείτε να χρησιμοποιήσετε μια μη αρχικοποιημένη μεταβλητή σε παραστάσεις, επομένως η μεταβλητή πρέπει να αρχικοποιηθεί είτε κατά τη δήλωση είτε πριν τη χρήση της σε οποιαδήποτε έκφραση. Για παράδειγμα, το τμήμα κώδικα παρακάτω θα αναγνωριστεί ως λανθασμένο ήδη στο στάδιο της μεταγλώττισης.

ημέρες διακοπών ;
Σύστημα . έξω . println( ημέρες διακοπών) ; // ΛΑΘΟΣ! Η μεταβλητή δεν έχει αρχικοποιηθεί

Έχουμε ήδη συζητήσει πώς να ονομάσουμε σωστά τις μεταβλητές.

Δυναμική προετοιμασία μεταβλητών

Η Java επιτρέπει στις μεταβλητές να αρχικοποιούνται δυναμικά χρησιμοποιώντας οποιαδήποτε έκφραση που είναι έγκυρη τη στιγμή που δηλώνεται η μεταβλητή. Για παράδειγμα:

ένα = 3.0 , σι = 4.0 ;
// Δυναμική προετοιμασία μεταβλητής γ
διπλό ντο = Μαθηματικά . sqrt ( ένα * ένα + σι * σι) ;
Σύστημα . έξω . println( "Η υποτείνουσα ισούται με" + ντο) ;

Πεδίο εφαρμογής και διάρκεια ζωής μεταβλητών

Αυτό είναι ένα αρκετά σημαντικό θέμα και πρέπει να εξεταστεί με περισσότερες λεπτομέρειες. Και για να γίνει αυτό, πρέπει πρώτα να εξετάσουμε τη χρήση μπλοκ κώδικα στην Java.

Χρήση μπλοκ κωδικών

Η Java σάς επιτρέπει να ομαδοποιήσετε μία ή περισσότερες δηλώσεις σε μπλοκ κώδικα, που ονομάζονται επίσης μπλοκ κώδικα. Αυτό γίνεται κλείνοντας τις δηλώσεις σε σγουρά άγκιστρα. Μόλις δημιουργηθεί, ένα μπλοκ κώδικα γίνεται μια λογική ενότητα που μπορεί να χρησιμοποιηθεί στα ίδια σημεία με μια μεμονωμένη πρόταση. Για παράδειγμα, ένα μπλοκ μπορεί να χρησιμεύσει ως στόχος των δηλώσεων if και for. Σκεφτείτε την ακόλουθη δήλωση if:

( Χ< y ) { // έναρξη του μπλοκ
x = y;
y = 0 ;
} // τέλος του μπλοκ

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

Η Java επιτρέπει τη δήλωση μεταβλητών μέσα σε οποιοδήποτε μπλοκ. Ένα μπλοκ ξεκινά με ένα ανοιγόμενο σγουρό στήριγμα και τελειώνει με ένα σγουρό στήριγμα που κλείνει. Το μπλοκ ορίζει το εύρος του ορισμού. Έτσι, ανοίγοντας κάθε νέο μπλοκ, δημιουργούμε ένα νέο πεδίο εφαρμογής. Πεδίο εφαρμογήςκαθορίζει ποια αντικείμενα είναι ορατά σε άλλα μέρη του προγράμματος. Καθορίζει επίσης τη διάρκεια ζωής αυτών των αντικειμένων.

Ο βασικός κανόνας που πρέπει να θυμάστε είναι ότι οι μεταβλητές που δηλώνονται μέσα σε ένα εύρος δεν είναι ορατές (δηλαδή, μη προσβάσιμες) για κωδικοποίηση εκτός αυτού του πεδίου. Έτσι, η δήλωση μιας μεταβλητής εντός ενός εύρους τη διατηρεί εντοπισμένη και προστατευμένη από μη εξουσιοδοτημένη πρόσβαση ή/και τροποποίηση.

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

Μεταβλητός y, που ορίζεται εντός του πεδίου εφαρμογής του που οριοθετείται από σγουρά τιράντες, είναι προσβάσιμο μόνο εντός αυτού. Πέρα από τα όριά της, η μεταβλητή y δεν είναι πλέον διαθέσιμη και η μεταβλητή Χδιαθέσιμο και στο εύρος της μεταβλητής y.

Ένα άλλο σημαντικό πράγμα που πρέπει να θυμάστε είναι ότι οι μεταβλητές δημιουργούνται όταν εισέρχονται στο εύρος τους και καταστρέφονται κατά την έξοδο από αυτό.

Αυτό σημαίνει ότι η μεταβλητή θα χάσει την αξία της μόλις βγει εκτός πεδίου εφαρμογής.

Αν και τα μπλοκ μπορούν να είναι ένθετα, Σε ένα εσωτερικό μπλοκ δεν μπορείτε να δηλώσετε μεταβλητές με το ίδιο όνομα όπως στο εξωτερικό πεδίο.

Ο κώδικας που εμφανίζεται στο παράδειγμα στα αριστερά θα δημιουργήσει ένα σφάλμα μεταγλώττισης.

Τέτοια κόλπα, δυνατά σε C και C++, δεν λειτουργούν στην Java.

Σταθερές στην Java

Στην Java, η λέξη-κλειδί που χρησιμοποιείται για να δηλώσει σταθερές είναι τελικός. Λέξη-κλειδί τελικόςσημαίνει ότι μπορείτε να αντιστοιχίσετε μια τιμή σε μια δεδομένη μεταβλητή μόνο μία φορά, μετά την οποία δεν μπορεί να αλλάξει. Συνιστάται η χρήση κεφαλαίων γραμμάτων για την ονομασία σταθερών, αν και αυτό δεν απαιτείται, αλλά αυτό το στυλ συμβάλλει στην αναγνωσιμότητα του κώδικα. Παράδειγμα σταθερής δήλωσης:

διπλό CM_PER_INCH = 2.54 ;

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

Οι αριθμητικοί τύποι είναι τύποι που έχουν σχεδιαστεί για την αποθήκευση αριθμών. Όταν κάνετε μαθηματικά, ασχολείστε με αριθμητικές τιμές. Υπάρχουν δύο είδη αριθμητικών τύπων. Αυτά που είναι σχεδιασμένα να αποθηκεύουν αριθμούς χωρίς κλασματικό μέρος ονομάζονται ολόκληροςτύπους και αυτούς στους οποίους μπορεί να αποθηκευτεί το κλασματικό μέρος ενός αριθμού - πραγματικός,ή τύπους με κινητής υποδιαστολής.

Δεν υπάρχει έννοια των ανυπόγραφων αριθμών στην Java. Όλοι οι αριθμητικοί τύποι σε αυτήν τη γλώσσα είναι υπογεγραμμένοι. Για παράδειγμα, εάν η τιμή μιας μεταβλητής byte είναι 0x80 σε δεκαεξαδικό, τότε ο αριθμός είναι -1.

2.1.1.1. Ακέραιοι τύποι

Η έλλειψη ανυπόγραφων αριθμών της Java μειώνει τον αριθμό των τύπων ακεραίων στο μισό. Η γλώσσα έχει 4 ακέραιους τύπους, που καταλαμβάνουν 1, 2, 4 και 8 byte στη μνήμη. Κάθε τύπος - byte, short, int και long - έχει τις δικές του φυσικές χρήσεις.

Τύποςψηφιόλεξη

Ο τύπος byte είναι υπογεγραμμένος τύπος 8 bit. Το εύρος του είναι -128 έως 127. Είναι το καταλληλότερο για την αποθήκευση αυθαίρετης ροής byte που έχει ληφθεί από το δίκτυο ή από ένα αρχείο.

byte b;
byte c = 11;

Εκτός εάν εμπλέκεται χειρισμός bit, ο τύπος byte θα πρέπει γενικά να αποφεύγεται. Για κανονικούς ακέραιους αριθμούς που χρησιμοποιούνται ως μετρητές και σε αριθμητικές εκφράσεις, ο τύπος int ταιριάζει πολύ καλύτερα.

Τύποςμικρός

Το Short είναι ένας υπογεγραμμένος τύπος 16-bit. Το εύρος του είναι -32768 έως 32767. Είναι ίσως ο πιο σπάνια χρησιμοποιούμενος τύπος στην Java, αφού ορίζεται ως ένας τύπος στον οποίο το πιο σημαντικό byte έρχεται πρώτο.

κοντό s?
σύντομο t= 129;
Τύποςενθ

Ο τύπος int αντιπροσωπεύει ακέραιους αριθμούς 32-bit. Το εύρος των έγκυρων τιμών για αυτόν τον τύπο είναι -2147483648 έως 2147483647. Η πιο κοινή χρήση αυτού του τύπου δεδομένων είναι η αποθήκευση συνηθισμένων ακεραίων με τιμές έως δύο δισεκατομμύρια. Αυτός ο τύπος είναι εξαιρετικός για χρήση με πίνακες και μετρητές. Τα επόμενα χρόνια, αυτός ο τύπος θα ταιριάζει απόλυτα με τις λέξεις μηχανών όχι μόνο επεξεργαστών 32 bit, αλλά και επεξεργαστών 64 bit με υποστήριξη για γρήγορη διοχέτευση για την εκτέλεση κώδικα 32 bit σε λειτουργία συμβατότητας. Κάθε φορά που εμφανίζονται μεταβλητές τύπου byte, short, int και ακέραιοι κυριολεκτικά στην ίδια έκφραση, ο τύπος ολόκληρης της έκφρασης μεταφέρεται σε int πριν την ολοκλήρωση της αξιολόγησης.

int j = 1000;
Τύποςμακρύς

Ο μακρύς τύπος έχει σχεδιαστεί για να αντιπροσωπεύει υπογεγραμμένους αριθμούς 64 bit. Το εύρος των αποδεκτών τιμών του είναι αρκετά μεγάλο ακόμη και για εργασίες όπως η μέτρηση του αριθμού των ατόμων στο σύμπαν,

μακρύςΜ;
μακρύςn = 123;

Δεν υπάρχει ανάγκη ταυτοποίησης bit βάθοςακέραιος τύπος με την ποσότητα μνήμης που καταλαμβάνει. Ο κώδικας Java που εκτελείται μπορεί να χρησιμοποιήσει όση μνήμη για τις μεταβλητές σας κρίνει κατάλληλη, αρκεί η συμπεριφορά τους να ταιριάζει με τη συμπεριφορά των τύπων που ορίζετε.

Πίνακας 2.1. Πίνακας βάθους bit και αποδεκτών περιοχών για διάφορους τύπους ακεραίων

Λίγο βάθος

Εύρος

-9, 223, 372,036, 854, 775, 808 ... 9, 223, 372, 036, 854, 775, 807

-2, 147, 483, 648 .... 2, 147, 483, 647

-32,768 .... 32, 767

-128 ... 127

2.1.1.2. Αριθμοί κινητής υποδιαστολής

Οι αριθμοί κινητής υποδιαστολής, που συχνά ονομάζονται πραγματικοί αριθμοί σε άλλες γλώσσες, χρησιμοποιούνται σε υπολογισμούς που απαιτούν τη χρήση κλάσματος. Η Java εφαρμόζει ένα πρότυπο (IEEE-754) σύνολο τύπων για αριθμούς κινητής υποδιαστολής - float και double - και τελεστές για εργασία με αυτούς.

Πίνακας 2.2. Χαρακτηριστικά τύπων αριθμών κινητής υποδιαστολής

Λίγο βάθος

Εύρος

1.7e-308....1.7e+ 308

3.4e-038....3.4e+ 038

Τύποςφλοτέρ

Σε μεταβλητές με το συνηθισμένο, ή ενιαία ακρίβεια,που δηλώνεται χρησιμοποιώντας τη λέξη-κλειδί float, χρησιμοποιούνται 32 bit για την αποθήκευση της πραγματικής τιμής,

float f;
float f2 = 3,14;
Τύποςδιπλό

Οταν διπλή ακρίβεια,καθορίζεται με χρήση της διπλής λέξης-κλειδιού, 64 bit χρησιμοποιούνται για την αποθήκευση τιμών. Ολα υπερφυσικόςμαθηματικές συναρτήσεις όπως sin, cos, sqrt επιστρέφουν διπλό αποτέλεσμα,

διπλόρε;
διπλό pi = 3,14159265358979323846;