Προγραμματισμός

Πώς να αποθηκεύσετε δεδομένα σε αντικείμενα Java

Τελευταία ενημέρωση: Ιανουάριος 2020

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

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

Μεταβλητές και πρωτόγονοι τύποι

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

/ * * Αυτό είναι επίσης ένα σχόλιο. Ο μεταγλωττιστής αγνοεί τα πάντα από το * the first / * μέχρι το "star slash" που τελειώνει το σχόλιο. * * Εδώ είναι το "αστέρι" που τελειώνει το σχόλιο. * / public class IntegerTest {public static void main (String [] args) {// Εδώ είναι η δήλωση μιας μεταβλητής int που ονομάζεται anInteger, // την οποία δίνετε μια αρχική τιμή 100. int anInteger = 100; // Δηλώστε και αρχικοποιήστε έναInteger System.out.println (anInteger); // Έξοδοι 100 // Μπορείτε επίσης να κάνετε αριθμητική με πρωτόγονους τύπους, χρησιμοποιώντας τους // τυπικούς αριθμητικούς τελεστές. anInteger = 100 + 100; System.out.println (anInteger); // Έξοδοι 200}} 

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

δημόσια τάξη DoubleTest {public static void main (String [] args) {// Εδώ είναι η δήλωση μιας διπλής μεταβλητής που ονομάζεται aDouble. // Δίνεις επίσης στο aDouble μια αρχική τιμή 5,76. διπλό aDouble = 5.76; // Δηλώστε και αρχικοποιήστε aDouble System.out.println (aDouble); // Έξοδοι 5.76 // Μπορείτε επίσης να κάνετε αριθμητική με τύπους κινητής υποδιαστολής. aDouble = 5,76 + 1,45; System.out.println (aDouble); // Έξοδοι 7.21}} 

Δοκιμάστε να εκτελέσετε τα παραπάνω προγράμματα. Θυμηθείτε, πρέπει να μεταγλωττίσετε για να τα εκτελέσετε:

javac * .java java IntegerTest java DoubleTest 

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

Ολοκληρωμένοι τύποι

ΤΥΠΟΣΨηφιόλεξηΜικρόςΕντΜακρύς
ΜΕΓΕΘΟΣ (bits)8163264
ΕΥΡΟΣ-128 έως 127-32,768 έως 32,767-2.147.483.648 έως 2.147.483.647-263 έως 263-1

Τύποι κυμαινόμενου σημείου (μορφή IEEE 754)

 
ΤΥΠΟΣΚινούμενο σημείο μίας ακρίβειαςΚινούμενο σημείο διπλής ακρίβειας
ΜΕΓΕΘΟΣ (bits)3264
ΕΥΡΟΣ+/- 1,18x10-38 έως +/- 3,4x1038+/- 2.23x10-308 έως +/- 1.8x10308

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

// Θραύσμα κώδικα // Δήλωση μεταβλητής s τύπου String, // και αρχικοποίηση με αναφερόμενη συμβολοσειρά "Hello". String s = "Γεια"; // Συνένωση συμβολοσειράς σε s με αναφερόμενη συμβολοσειρά "World" String t = s + "World"; System.out.println (t); // Έξοδοι Γειά σου Κόσμε

Μεταβλητό εύρος

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

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

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

δημόσια τάξη AlarmClock {public void snooze () {// Χρόνος αναβολής σε χιλιοστά του δευτερολέπτου = 5 δευτερόλεπτα snoozeInterval = 5000; System.out.println ("ZZZZZ for:" + snoozeInterval); }} 

Μπορείτε να φτάσετε snoozeInterval μόνο από το υπνάκος() μέθοδος, που είναι η δήλωση snoozeInterval, όπως φαίνεται εδώ:

δημόσια τάξη AlarmClockTest {public static void main (String [] args) {AlarmClock aClock = new AlarmClock (); aClock.snooze (); // Αυτό είναι ακόμα καλό. // Η επόμενη γραμμή κώδικα είναι μια ΛΑΘΟΣ. // Δεν μπορείτε να αποκτήσετε πρόσβαση στο snoozeInterval εκτός της μεθόδου αναβολής. snoozeInterval = 10000; }} 

Παράμετροι μεθόδου

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

δημόσια τάξη AlarmClock {public void snooze (long snoozeInterval) {System.out.println ("ZZZZZ for:" + snoozeInterval); }} 
δημόσια τάξη AlarmClockTest {public static void main (String [] args) {AlarmClock aClock = new AlarmClock (); // Περάστε στο διάστημα αναβολής όταν καλέσετε τη μέθοδο. aClock.snooze (10000); // Αναβολή για 10000 msecs. }} 

Μεταβλητές μέλους: Πώς τα αντικείμενα αποθηκεύουν δεδομένα

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

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

Μεταβλητό εύρος και διάρκεια ζωής

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

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

Σκεψου το Ξυπνητηρι τάξη. Περνώντας το snoozeInterval μέσα στο υπνάκος() η μέθοδος δεν είναι υπέροχος σχεδιασμός. Φανταστείτε να πληκτρολογείτε σε ένα διάστημα αναβολής στο ξυπνητήρι σας κάθε φορά που πατάτε το κουμπί αναβολής. Αντ 'αυτού, απλώς δώστε ολόκληρο το ξυπνητήρι α snoozeInterval. Το συμπληρώνετε με μια μεταβλητή παρουσίας στο Ξυπνητηρι τάξη, όπως φαίνεται παρακάτω:

δημόσια τάξη AlarmClock {// Δηλώνετε το snoozeInterval εδώ. Αυτό το καθιστά μια μεταβλητή παρουσίας. // Το αρχικοποιείτε επίσης εδώ. μεγάλο m_snoozeInterval = 5000; // Χρόνος αναβολής σε χιλιοστά του δευτερολέπτου = 5 δευτερόλεπτα. public void snooze () {// Μπορείτε ακόμα να μεταβείτε στο m_snoozeInterval με μια μέθοδο AlarmClock // επειδή βρίσκεστε στο πεδίο της τάξης. System.out.println ("ZZZZZ for:" + m_snoozeInterval); }} 

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

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

δημόσια τάξη AlarmClockTest {public static void main (String [] args) {// Δημιουργήστε δύο ρολόγια. Κάθε ένα έχει το δικό του m_snoozeInterval AlarmClock aClock1 = νέο AlarmClock (); AlarmClock aClock2 = νέο AlarmClock (); // Αλλαγή aClock2 // Σύντομα θα δείτε ότι υπάρχουν πολύ καλύτεροι τρόποι για να το κάνετε αυτό. aClock2.m_snoozeInterval = 10000; aClock1.snooze (); // Αναβολή με το διάστημα aClock1 aClock2.snooze (); // Αναβολή με διάστημα aClock2}} 

Δοκιμάστε αυτό το πρόγραμμα και θα το δείτε aClock1 έχει ακόμη το διάστημα των 5.000 ενώ aClock2 έχει ένα διάστημα 10.000. Και πάλι, κάθε παρουσία έχει τα δικά της δεδομένα παρουσίας.

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

JavaWorld

Ενθυλάκωση

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

Αυτή είναι μια στοιχειώδης ιδέα, αλλά διευκολύνει τη ζωή μας ως προγραμματιστές. Φανταστείτε, για παράδειγμα, ότι θέλετε να διδάξετε ένα Πρόσωπο αντικείμενο να σηκωθεί. Χωρίς ενθυλάκωση, οι εντολές σας θα μπορούσαν να είναι κάπως έτσι: "Λοιπόν, υποθέτω ότι θα χρειαστεί να σφίξετε αυτόν τον μυ εδώ στο μπροστινό μέρος του ποδιού, χαλαρώστε αυτόν τον μυ εδώ στο πίσω μέρος του ποδιού. Χμμμ - πρέπει να λυγίσετε και τη μέση. Ποιοι μύες πυροδοτούν αυτήν την κίνηση; Πρέπει να τα σφίξετε, να τα χαλαρώσετε. Ωχ! Ξεχάσατε το άλλο πόδι. Σκατά. Παρακολουθήστε το - μην αναποδογυρίσετε ... "Έχετε την ιδέα. Με ενθυλάκωση, θα πρέπει απλώς να επικαλεστεί το Σήκω πάνω() μέθοδος. Πολύ εύκολο, ναι;

Μερικά πλεονεκτήματα στην ενθυλάκωση:

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

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

// Κακό - δεν χρησιμοποιεί το encapsulation public class Person {int m_age; } δημόσια τάξη PersonTest {public static void main (String [] args) {Person p = new Person (); p.m_age = -5; // Γεια σου - πώς μπορεί κάποιος να είναι μείον 5 ετών; }} // Καλύτερα - χρησιμοποιεί το encapsulation public class Person {int m_age; public void setAge (int age) {// Ελέγξτε για να βεβαιωθείτε ότι η ηλικία είναι μεγαλύτερη από 0. Θα μιλήσω περισσότερα για το // εάν δηλώσεις σε άλλη στιγμή. εάν (ηλικία> 0) {m_age = ηλικία; }}} δημόσια τάξη PersonTest {public static void main (String [] args) {Person p = new Person (); p.setAge (-5); // Δεν θα έχει κανένα αποτέλεσμα τώρα. }} 

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

Μια σημείωση για τις μεθόδους

Οι μέθοδοι μπορούν να επιστρέψουν τιμές που χρησιμοποιεί ο καλούντος. Για να επιστρέψετε μια τιμή, δηλώστε έναν μη επιστρεφόμενο τύπο επιστροφής και χρησιμοποιήστε ένα ΕΠΙΣΤΡΟΦΗ δήλωση. ο getSnoozeInterval () Η μέθοδος που φαίνεται στο παρακάτω παράδειγμα το απεικονίζει αυτό.

Γράψτε το πρόγραμμα