java:class_fields
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| java:class_fields [2017/01/27 15:18] – [Απόκρυψη δεδομένων και εσωτερικής υλοποίησης] gthanos | java:class_fields [2022/02/23 10:11] (current) – gthanos | ||
|---|---|---|---|
| Line 6: | Line 6: | ||
| - Τα ονόματα των μεταβλητών είναι case-sensitive. Κάθε μεταβλητή μπορεί να ξεκινά με ένα γράμμα της αλφαβήτου (κεφαλαίο ή μικρό), | - Τα ονόματα των μεταβλητών είναι case-sensitive. Κάθε μεταβλητή μπορεί να ξεκινά με ένα γράμμα της αλφαβήτου (κεφαλαίο ή μικρό), | ||
| - | - Οι υπόλοιποι χαρακτήρες των μεταβλητών σας μπορεί να είναι γράμματα (κεφαλαία και μικρά), | + | - Οι υπόλοιποι χαρακτήρες των μεταβλητών σας μπορεί να είναι γράμματα (κεφαλαία και μικρά), |
| - Αν το όνομα της μεταβλητής σας αποτελείται από μία λέξη τότε γράψτε την λέξη αυτή με μικρά γράμματα (π.χ. role, colour, speed). Εάν η μεταβλητή σας περιέχει δύο λέξεις ενώστε τις λέξεις αυτές κάνοντας το πρώτο γράμμα κάθε λέξης κεφαλαίο (π.χ. adminRole, brighterColour, | - Αν το όνομα της μεταβλητής σας αποτελείται από μία λέξη τότε γράψτε την λέξη αυτή με μικρά γράμματα (π.χ. role, colour, speed). Εάν η μεταβλητή σας περιέχει δύο λέξεις ενώστε τις λέξεις αυτές κάνοντας το πρώτο γράμμα κάθε λέξης κεφαλαίο (π.χ. adminRole, brighterColour, | ||
| - Εάν η μεταβλητή σας ορίζεται ως σταθερά, | - Εάν η μεταβλητή σας ορίζεται ως σταθερά, | ||
| Line 12: | Line 12: | ||
| ===== Τύποι πεδίων της κλάσης ===== | ===== Τύποι πεδίων της κλάσης ===== | ||
| - | Μία κλάση μπορεί να διαθέτει | + | Μία κλάση μπορεί να διαθέτει |
| - | - [[java: | + | - **[[java: |
| - | - [[java: | + | - **[[java: |
| - | Βασικούς τύπους δεδομένων συναντήσαμε ήδη στην προηγούμενη σελίδα. **Reference** τύποι | + | === Βασικοί |
| - | {{ :java:rectangle-origin.png? | + | Βασικοί τύποι δεδομένων είναι οι ακεραιες μεταβλητές που συναντήσαμε στην [[java:class|κλάση Rectangle της προηγούμενης σελίδας]]. Οι βασικοί τύποι δεδομένων περιγράφονται περιληπτικά στον παρακάτω πίνακα: |
| - | <code java Point.java> | + | ^ τύπος δεδομένων ^ byte ^ short ^ int ^ long ^ float ^ double ^ boolean ^ char ^ |
| + | | αριθμός bits | 8 | 16 | 32 | 64 | 32-bit IEEE 754 floating point | 64-bit IEEE 754 floating point | not-applicable<color red> | ||
| + | | αριθμός bytes | 1 | 2 | 4 | 8 | 4 | 8 | not-applicable< | ||
| + | | εύρος τιμών | ||
| - | public class Point { | + | <color red>*</color> Ο τύπος **boolean** λαμβάνει μόνο δύο τιμές. Ο αριθμός των bytes που καταλαμβάνονται δεν ορίζεται και πιθανόν διαφέρει από υλοποίηση σε υλοποίηση JVM. |
| - | private int x; | + | |
| - | private int y; | + | |
| - | + | ||
| - | public Point(int xPos, int yPos) { | + | |
| - | x = xPos; | + | |
| - | y = yPos; | + | |
| - | } | + | |
| - | + | ||
| - | public int getX() { | + | |
| - | return x; | + | |
| - | } | + | |
| - | + | ||
| - | public void setX(int xPos) { | + | |
| - | x = xPos; | + | |
| - | } | + | |
| - | + | ||
| - | public int getY() { | + | |
| - | return y; | + | |
| - | } | + | |
| - | + | ||
| - | public void setY(int yPos) { | + | |
| - | y = yPos; | + | |
| - | } | + | |
| - | } | + | |
| - | </code> | + | |
| - | Με χρήση της παραπάνω | + | === Αναφορικοί Τύποι === |
| - | <code java Rectangle.java> | + | Αναφορικοί (reference) τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που περιγράφονται από κλάσεις. Για παράδειγμα, |
| - | public class Rectangle { | + | |
| - | + | {{ : | |
| - | // the Rectangle class has 3 fields | + | |
| - | private int width; | + | |
| - | private int height; | + | |
| - | private | + | |
| - | + | ||
| - | // the Rectangle class has one constructor | + | |
| - | public Rectangle(int initWidth, int initHeight, Point initOrigin) { | + | |
| - | width = initWidth; | + | |
| - | | + | |
| - | | + | |
| - | } | + | |
| - | public | + | <code java Point.java> |
| - | | + | class Point { |
| + | int x; | ||
| + | int y; // y coordinate | ||
| + | |||
| + | | ||
| + | | ||
| + | y = yPos; | ||
| } | } | ||
| - | | + | |
| - | | + | int getX() { |
| - | | + | |
| } | } | ||
| - | | + | |
| - | | + | void setX(int xPos) { |
| - | | + | |
| } | } | ||
| | | ||
| - | | + | |
| - | | + | |
| } | } | ||
| | | ||
| - | | + | void setY(int yPos) { |
| - | | + | |
| - | origin.setY(newY); | + | |
| } | } | ||
| - | /* | + | } |
| - | // this method cannot compile as long as x,y | + | |
| - | // are declared private. | + | |
| - | public void setOrigin(int newX, int newY) { | + | |
| - | origin.x = newX; | + | |
| - | origin.y = newY; | + | |
| - | } | + | |
| - | */ | + | |
| - | } | + | |
| </ | </ | ||
| - | Η κλάση '' | + | Με χρήση της παραπάνω κλάσης η κλάση '' |
| - | + | ||
| - | <WRAP todo 80% center round> | + | |
| - | Μεταγλωττίστε τις δύο παραπάνω κλάσεις γράφοντας | + | |
| - | < | + | |
| - | javac Point.java | + | |
| - | javac Rectangle.java | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private ===== | + | |
| - | + | ||
| - | Πιθανόν να παρατηρήσατε νωρίτερα τους προσδιοριστές **public** και **private**. Οι προσδιοριστές αυτοί αφορούν την προσβασιμότητα των πεδίων ή των μεθόδων της κλάσης από άλλες κλάσεις. Στη συνέχεια θα δούμε και τον προσδιοριστή τύπου **protected** καθώς και την πιθανή έλλειψη προσδιοριστή τύπου, ο οποίος από μόνος του είναι ένας επιπλέον προσδιοριστής. Για την ώρα θα εξετάσουμε | + | |
| - | + | ||
| - | Όταν __ένα πεδίο ή μία μέθοδος__ ορίζεται ως **public** τότε αυτό είναι | + | |
| - | - άλλες κλάσεις που περιέχουν πεδία που ανήκουν στη συγκεκριμένη κλάση. Για παράδειγμα, | + | |
| - | - [[java: | + | |
| - | + | ||
| - | Με βάση τα παραπάνω | + | |
| - | <code java> | + | |
| - | private int x; | + | |
| - | private int y; | + | |
| - | </ | + | |
| - | + | ||
| - | Σε αυτή την περίπτωση, | + | |
| - | * public int getX() | + | |
| - | * public int setX(int xPos) | + | |
| - | * public int getY() | + | |
| - | * public int setY(int yPos) | + | |
| - | + | ||
| - | Ο παραπάνω περιορισμός δεν θα υπήρχε εάν τα πεδία της κλάσης **Point** είχαν οριστεί ως **public** αντί για **private**. | + | |
| - | + | ||
| - | <WRAP todo 80% center round> | + | |
| - | Αλλάξτε τον προσδιοριστή πρόσβασης για τα πεδία της κλάσης **Point** από **private** σε **public**. Βγάλτε από τα σχόλια την | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Απόκρυψη δεδομένων και εσωτερικής υλοποίησης ===== | + | |
| - | + | ||
| - | Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων σε τρίτες κλάσεις που τις χρησιμοποιούν. Κατά κανόνα, | + | |
| - | + | ||
| - | Ακολουθώντας την παραπάνω πρακτική θα επαναορίσουμε την κλάση **Rectangle**, | + | |
| <code java Rectangle.java> | <code java Rectangle.java> | ||
| - | + | class Rectangle { | |
| - | public | + | |
| | | ||
| // the Rectangle class has 3 fields | // the Rectangle class has 3 fields | ||
| - | | + | int width; |
| - | | + | int height; |
| - | | + | Point origin; |
| | | ||
| // the Rectangle class has one constructor | // the Rectangle class has one constructor | ||
| Line 155: | Line 78: | ||
| } | } | ||
| - | | + | void setWidth(int newWidth ) { |
| width = newWidth; | width = newWidth; | ||
| - | } | ||
| - | | ||
| - | public int getWidth() { | ||
| - | return width; | ||
| } | } | ||
| | | ||
| - | | + | void setHeight(int newHeight ) { |
| height = newHeight; | height = newHeight; | ||
| - | } | ||
| - | | ||
| - | public int getHeight() { | ||
| - | return height; | ||
| } | } | ||
| | | ||
| - | | + | void setOrigin(Point newOrigin) { |
| origin = newOrigin; | origin = newOrigin; | ||
| } | } | ||
| | | ||
| - | | + | Point getOrigin() { |
| return origin; | return origin; | ||
| } | } | ||
| | | ||
| + | int area() { | ||
| + | return width * height; | ||
| + | } | ||
| } | } | ||
| </ | </ | ||
| - | Για | + | Η κλάση '' |
| |Προηγούμενο: | |Προηγούμενο: | ||
java/class_fields.1485530328.txt.gz · Last modified: 2017/01/27 15:18 by gthanos
