java:objects
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:objects [2020/02/10 08:13] – [Ένα πιο εκτεταμένο παράδειγμα] gthanos | java:objects [2022/02/23 15:25] (current) – [Garbage Collection] gthanos | ||
---|---|---|---|
Line 54: | Line 54: | ||
class Rectangle { | class Rectangle { | ||
| | ||
- | | + | int width, height; |
- | | + | |
- | int height; | + | |
Point origin; | Point origin; | ||
| | ||
- | // constructors | ||
public Rectangle(int initWidth, int initHeight, Point initOrigin) { | public Rectangle(int initWidth, int initHeight, Point initOrigin) { | ||
width = initWidth; | width = initWidth; | ||
Line 72: | Line 69: | ||
} | } | ||
| | ||
- | // methods | ||
void setWidth(int newWidth ) { | void setWidth(int newWidth ) { | ||
width = newWidth; | width = newWidth; | ||
Line 115: | Line 111: | ||
// Declare variables | // Declare variables | ||
- | Point originOne, originTwo; | + | Point origin1, origin2; |
- | Rectangle | + | Rectangle |
- | // Create objects | + | |
- | originOne = new Point(23, 94); | + | |
- | originTwo = new Point(15, -33); | + | |
- | rectOne = new Rectangle(100, | + | |
- | rectTwo = new Rectangle(50, | + | |
| | ||
- | // display rectOne' | + | // Create the objects |
- | | + | |
- | | + | origin2 = new Point(15, -33); |
+ | | ||
+ | rect2 = new Rectangle(50, | ||
| | ||
- | // set rectTwo' | + | // print origin of rect1 and rect2 |
- | | + | |
- | // display rectTwo' | + | System.out.println(" |
- | System.out.println(" | + | |
| | ||
- | // move rectTwo | + | |
- | | + | rect2.setOrigin(origin1); |
- | System.out.println(" | + | // display rect2 origin |
+ | System.out.println(" | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | // print origin of rect1 and rect2 | ||
+ | System.out.println(" | ||
+ | System.out.println(" | ||
| | ||
- | // display rectOne' | ||
- | System.out.println(" | ||
- | |||
// assign originOne value to originTwo | // assign originOne value to originTwo | ||
- | | + | |
} | } | ||
} | } | ||
</ | </ | ||
- | Αποθηκεύστε και τα τρία αρχεία | + | <WRAP todo 80% center round> |
- | + | Δημιουργήστε ένα project | |
- | < | + | </WRAP> |
- | javac Point.java // μεταγλώττιση | + | |
- | javac Rectange.java | + | |
- | javac CreateObjectDemo.java | + | |
- | </ | + | |
- | + | ||
- | Για να το τρέξετε γράφετε | + | |
- | + | ||
- | < | + | |
- | java CreateObjectDemo | + | |
- | </ | + | |
- | + | ||
- | Το παραπάνω πρόγραμμα τυπώνει τα εξής στην κονσόλα. | + | |
- | + | ||
- | < | + | |
- | [rectOne] | + | |
- | [rectOne] width: 100, height: 200 | + | |
- | [rectTwo] | + | |
- | [rectTwo] | + | |
- | [rectOne] | + | |
- | </code> | + | |
==== Επεξήγηση του παραπάνω κώδικα ===== | ==== Επεξήγηση του παραπάνω κώδικα ===== | ||
Line 174: | Line 150: | ||
<code java> | <code java> | ||
// Declare variables | // Declare variables | ||
- | Point originOne, originTwo; | + | Point origin1, origin2; |
- | Rectangle | + | Rectangle |
// Create objects | // Create objects | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
- | Οι πρώτες δύο γραμμές ορίζουν τις μεταβλητές '' | + | Οι πρώτες δύο γραμμές ορίζουν τις μεταβλητές '' |
<WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
Line 195: | Line 171: | ||
Αμέσως μετά τις δηλώσεις των μεταβλητών ακολουθούν οι κλήσεις των κατασκευαστών των αντίστοιχων κλάσεων. Όπως προαναφέραμε, | Αμέσως μετά τις δηλώσεις των μεταβλητών ακολουθούν οι κλήσεις των κατασκευαστών των αντίστοιχων κλάσεων. Όπως προαναφέραμε, | ||
- | Η παρακάτω εικόνα δείχνει τις μεταβλητές '' | + | Η παρακάτω εικόνα δείχνει τις μεταβλητές '' |
{{: | {{: | ||
Line 202: | Line 178: | ||
<code java> | <code java> | ||
- | // set rectTwo' | + | // set rect2 origin |
- | | + | |
- | // display | + | // display |
- | System.out.println(" | + | System.out.println(" |
- | + | ||
- | // move rectTwo | + | // move rect2 origin |
- | | + | |
- | System.out.println(" | + | |
- | + | // print origin of rect1 and rect2 | |
- | // display rectOne' | + | System.out.println(" |
- | System.out.println(" | + | System.out.println(" |
</ | </ | ||
Στις γραμμές αυτές συμβαίνουν τα εξής: | Στις γραμμές αυτές συμβαίνουν τα εξής: | ||
- | - Το αντικείμενο '' | + | - Το αντικείμενο '' |
- | - Εκτυπώνονται οι αλλαγές για το '' | + | - Στη συνέχεια, |
- | - Εκτυπώνονται οι αλλαγές για το '' | + | - Εκτυπώνονται οι αλλαγές για το '' |
+ | - Εκτυπώνονται οι αλλαγές για το '' | ||
- | Tα παρακάτω δύο σχήματα αποτυπώνουν α) την αλλαγή του πεδίου **origin** | + | Παρατηρούμε ότι οι συντεταγμένες |
- | Παρατηρείστε ότι πλέον μόνο η μεταβλητή '' | + | Τα παρακάτω δύο σχήματα αποτυπώνουν α) την αλλαγή του πεδίου **origin** του '' |
+ | |||
+ | Παρατηρείστε ότι πλέον μόνο η μεταβλητή '' | ||
| **(a)** | | **(a)** | ||
Line 229: | Line 208: | ||
Τέλος το πρόγραμμα τελειώνει με την γραμμή κώδικα: | Τέλος το πρόγραμμα τελειώνει με την γραμμή κώδικα: | ||
<code java> | <code java> | ||
- | // assign | + | // assign |
- | | + | |
</ | </ | ||
- | Μετά την γραμμή αυτή η μεταβλητή '' | + | Μετά την γραμμή αυτή η μεταβλητή '' |
{{: | {{: | ||
Line 240: | Line 219: | ||
Προκειμένου να δημιουργηθούν νέα αντικείμενα χρησιμοποιείται ο τελεστής **new**. O τελεστής **new** χρησιμοποιείται συνήθως με τον κατασκευαστή μίας κλάσης προκειμένου να κάνει τα εξής: | Προκειμένου να δημιουργηθούν νέα αντικείμενα χρησιμοποιείται ο τελεστής **new**. O τελεστής **new** χρησιμοποιείται συνήθως με τον κατασκευαστή μίας κλάσης προκειμένου να κάνει τα εξής: | ||
- Δέσμευση της απαραίτητης μνήμης και δημιουργία του αντικειμένου. Η αρχικά ορισμένη μεταβλητή δείχνει πλέον στην περιοχή μνήμης που έχει δεσμευτεί. | - Δέσμευση της απαραίτητης μνήμης και δημιουργία του αντικειμένου. Η αρχικά ορισμένη μεταβλητή δείχνει πλέον στην περιοχή μνήμης που έχει δεσμευτεί. | ||
- | - Αρχικοποίηση των εσωτερικών μεταβλητών (πεδίων) του αντικειμένου με κλήση του κατάλληλου κατασκευαστή της κλάσης. Εάν δεν έχει οριστεί κατασκευαστής τότε ο τελεστής **new** καλείται με χρήση του default κατασκευαστή (default constructor) που δεν έχει ορίσματα | + | - Αρχικοποίηση των εσωτερικών μεταβλητών (πεδίων) του αντικειμένου με κλήση του κατάλληλου κατασκευαστή της κλάσης. Εάν δεν έχει οριστεί κατασκευαστής τότε ο τελεστής **new** καλείται με χρήση του default κατασκευαστή (//default constructor//) που δεν έχει ορίσματα. |
+ | |||
+ | <code java> MyObject obj = new MyObject();</ | ||
<WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
Line 248: | Line 229: | ||
</ | </ | ||
- | ===== Πολλαπλοί κατασκευαστές σε μία κλάση ===== | + | ===== Διαφορετικοί κατασκευαστές σε μία κλάση ===== |
- | Μία κλάση μπορεί να έχει πολλούς διαφορετικούς κατασκευαστές. Κάθε κατασκευαστής ορίζει | + | Μία κλάση μπορεί να έχει περισσότερους από ένα |
<code java> | <code java> | ||
public class CreateRectangleObjects { | public class CreateRectangleObjects { | ||
public static void main(String []args) { | public static void main(String []args) { | ||
- | Point originOne | + | Point origin1 |
- | | + | |
- | | + | |
} | } | ||
} | } | ||
Line 263: | Line 244: | ||
- | ===== Χρήση | + | ===== Χρήση |
Όταν φτιάξετε ένα αντικείμενο είναι σίγουρο ότι θα θέλετε να το χρησιμοποιήσετε προκειμένου να κάνετε μία εργασία όπως να γράψετε κάτι στα δεδομένα του, να διαβάσετε από αυτά ή να χρησιμοποιήσετε κάποια από τις μεθόδους του. | Όταν φτιάξετε ένα αντικείμενο είναι σίγουρο ότι θα θέλετε να το χρησιμοποιήσετε προκειμένου να κάνετε μία εργασία όπως να γράψετε κάτι στα δεδομένα του, να διαβάσετε από αυτά ή να χρησιμοποιήσετε κάποια από τις μεθόδους του. | ||
Line 277: | Line 258: | ||
</ | </ | ||
+ | /* | ||
<WRAP important 80% center round> | <WRAP important 80% center round> | ||
Απαραίτητη προϋπόθεση για να δουλέψει ο παραπάνω κώδικας είναι τα πεδία width και height να είναι προσβάσιμα, | Απαραίτητη προϋπόθεση για να δουλέψει ο παραπάνω κώδικας είναι τα πεδία width και height να είναι προσβάσιμα, | ||
Line 284: | Line 266: | ||
Όπως προείπαμε μία καλή προγραμματιστική πρακτική είναι η απόκρυψη των πεδίων κάθε κλάσης και η δήλωση συναρτήσεων για την πρόσβαση στα δεδομένα της. Σε αυτή την περίπτωση η απευθείας πρόσβαση στα πεδία των αντικειμένων είναι μη επιτρεπτή (ο compiler δεν μεταγλωττίζει το πρόγραμμα). Η πρόσβαση σε μεταβλητές που έχουν τον προσδιοριστή **private** μπορεί να γίνει μόνο μέσω βοηθητικών συναρτήσεων (set/get) που έχουν τον προσδιοριστή **public**. | Όπως προείπαμε μία καλή προγραμματιστική πρακτική είναι η απόκρυψη των πεδίων κάθε κλάσης και η δήλωση συναρτήσεων για την πρόσβαση στα δεδομένα της. Σε αυτή την περίπτωση η απευθείας πρόσβαση στα πεδία των αντικειμένων είναι μη επιτρεπτή (ο compiler δεν μεταγλωττίζει το πρόγραμμα). Η πρόσβαση σε μεταβλητές που έχουν τον προσδιοριστή **private** μπορεί να γίνει μόνο μέσω βοηθητικών συναρτήσεων (set/get) που έχουν τον προσδιοριστή **public**. | ||
</ | </ | ||
+ | */ | ||
==== Χρήση των μεθόδων ενός αντικειμένου ==== | ==== Χρήση των μεθόδων ενός αντικειμένου ==== | ||
Line 293: | Line 275: | ||
| | ||
</ | </ | ||
+ | /* | ||
<WRAP important 80% center round> | <WRAP important 80% center round> | ||
Ισχύουν και για τις μεθόδους όσα αναφέρονται για τους προσδιοριστές τύπου **public**, **private** των πεδίων. | Ισχύουν και για τις μεθόδους όσα αναφέρονται για τους προσδιοριστές τύπου **public**, **private** των πεδίων. | ||
</ | </ | ||
+ | */ | ||
===== Garbage Collection ===== | ===== Garbage Collection ===== | ||
Οι γλώσσες προγραμματισμού που μέχρι τώρα έχετε γνωρίσει (βλέπε **C**) αναθέτουν την ευθύνη δέσμευσης μνήμης στον προγραμματιστή μέσω των συναρτήσεων **malloc()** και **free()**. Σε αντιδιαστολή, | Οι γλώσσες προγραμματισμού που μέχρι τώρα έχετε γνωρίσει (βλέπε **C**) αναθέτουν την ευθύνη δέσμευσης μνήμης στον προγραμματιστή μέσω των συναρτήσεων **malloc()** και **free()**. Σε αντιδιαστολή, | ||
- | Πώς όμως αποδεσμεύεται η μνήμη που δεσμεύτηκε προηγούμενα από το πρόγραμμα μας, αλλά δεν την χρειαζόμαστε πλέον; Περιοδικά το **JVM** κοιτάει εάν υπάρχει δεσμευμένη μνήμη για αντικείμενα στα οποία δεν υφίστανται πλέον αναφορές/ | + | Πώς όμως αποδεσμεύεται η μνήμη που δεσμεύτηκε προηγούμενα από το πρόγραμμα μας, αλλά δεν την χρειαζόμαστε πλέον; Περιοδικά το **JVM** κοιτάει εάν υπάρχει δεσμευμένη μνήμη για αντικείμενα στα οποία δεν υφίστανται πλέον αναφορές/ |
Ο μηχανισμός **Garbage Collection** απαντάται σε αρκετές γλώσσες υψηλού επιπέδου, | Ο μηχανισμός **Garbage Collection** απαντάται σε αρκετές γλώσσες υψηλού επιπέδου, |
java/objects.1581322421.txt.gz · Last modified: 2020/02/10 08:13 (external edit)