User Tools

Site Tools


java:objects

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:objects [2020/02/08 16:27] – [Δημιουργία Αντικειμένων] gthanosjava:objects [2022/02/23 15:25] (current) – [Garbage Collection] gthanos
Line 24: Line 24:
  
 <code java Point.java> <code java Point.java>
-public class Point { +class Point { 
-    private int x; +  int x;   // x coordinate 
-    private int y; +  int y;   // y coordinate 
-     +   
-    public Point(int xPos, int yPos) { +  public Point(int xPos, int yPos) { 
-      x = xPos; +    x = xPos; 
-      y = yPos; +    y = yPos; 
-    +  
-     +   
-    public int getX() { +  int getX() { 
-      return x; +    return x; 
-    +  
-     +   
-    public void setX(int xPos) { +  void setX(int xPos) { 
-      x = xPos; +    x = xPos; 
-    +  
-     +   
-    public int getY() { +  int getY() { 
-      return y; +    return y; 
-    +  
-     +   
-    public void setY(int yPos) { +  void setY(int yPos) { 
-      y = yPos; +    y = yPos; 
-    }+  }
 } }
 </code> </code>
  
 <code java Rectangle.java> <code java Rectangle.java>
-public class Rectangle {+class Rectangle {
          
-  // fields +  int widthheight; 
-  private int width+  Point origin;
-  private int height; +
-  private 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 ) {
-  public void setWidth(int newWidth ) {+
     width = newWidth;     width = newWidth;
   }   }
      
-  public int getWidth() {+  int getWidth() {
     return width;     return width;
   }   }
          
-  public void setHeight(int newHeight ) {+  void setHeight(int newHeight ) {
     height = newHeight;     height = newHeight;
   }   }
      
-  public int getHeight() {+  int getHeight() {
     return height;     return height;
   }   }
          
-  public void setOrigin(Point newOrigin) {+  void setOrigin(Point newOrigin) {
     origin = newOrigin;     origin = newOrigin;
   }   }
      
-  public Point getOrigin() {+  Point getOrigin() {
     return origin;     return origin;
   }   }
      
-  public int getArea() {+  int getArea() {
        return width * height;        return width * height;
   }   }
        
   // Move rectangle origin by dx,dy   // Move rectangle origin by dx,dy
-  public void moveOrigin(int dx, int dy) {+  void moveOrigin(int dx, int dy) {
     origin.setX( origin.getX() + dx );     origin.setX( origin.getX() + dx );
     origin.setY( origin.getY() + dy );     origin.setY( origin.getY() + dy );
Line 115: Line 111:
        
     // Declare variables     // Declare variables
-    Point originOneoriginTwo+    Point origin1origin2
-    Rectangle rectOnerectTwo; +    Rectangle rect1rect2;
-    // Create objects +
-    originOne = new Point(23, 94); +
-    originTwo = new Point(15, -33); +
-    rectOne = new Rectangle(100, 200, originOne); +
-    rectTwo = new Rectangle(50, 100, originTwo);+
          
-    // display rectOne's width, height, and area +    // Create the objects 
-    System.out.println("[rectOne]  xPos: " + rectOne.getOrigin().getX() + "yPos: " + rectOne.getOrigin().getY()); +    origin1 = new Point(23, 94)
-    System.out.println("[rectOne]  width: " + rectOne.getWidth() + "height: " + rectOne.getHeight());+    origin2 = new Point(15-33)
 +    rect1 = new Rectangle(100, 200, origin1); 
 +    rect2 = new Rectangle(50100, origin2);
          
-    // set rectTwo's position +    // print origin of rect1 and rect2 
-    rectTwo.setOrigin(originOne);     +    System.out.println("[rect1]  origin.x: " + rect1.getOrigin().getX() + ", origin.y: " + rect1.getOrigin().getY()); 
-    // display rectTwo's position +    System.out.println("[rect2]  origin.x: " + rect2.getOrigin().getX() + ", origin.y: " + rect2.getOrigin().getY());
-    System.out.println("[rectTwo]  xPos: " + rectTwo.getOrigin().getX() + ", yPos: " + rectTwo.getOrigin().getY());+
          
-    // move rectTwo and display its new position +    // set rect2 origin 
-    rectTwo.moveOrigin(40, -20); +    rect2.setOrigin(origin1); 
-    System.out.println("[rectTwo]  xPos: " + rectTwo.getOrigin().getX() + ", yPos: " + rectTwo.getOrigin().getY());+    // display rect2 origin 
 +    System.out.println("[rect2]  origin.x: " + rect2.getOrigin().getX() + ", origin.y: " + rect2.getOrigin().getX()); 
 +     
 +    // move rect2 origin and display its new position 
 +    rect2.moveOrigin(40, -20); 
 +     
 +    // print origin of rect1 and rect2 
 +    System.out.println("[rect1]  origin.x: " + rect1.getOrigin().getX() + ", origin.y: " + rect1.getOrigin().getY()); 
 +    System.out.println("[rect2]  origin.x: " + rect2.getOrigin().getX() + ", origin.y: " + rect2.getOrigin().getY());
          
-    // display rectOne's position 
-    System.out.println("[rectOne]  xPos: " + rectOne.getOrigin().getX()+", yPos: " + rectOne.getOrigin().getY()); 
- 
     // assign originOne value to originTwo     // assign originOne value to originTwo
-    originTwo originOne;+    origin2 origin1;
   }   }
 } }
 </code> </code>
  
-Αποθηκεύστε και τα τρία αρχεία στον ίδιο κατάλογο. Για να μεταγλωττίσετε τα παραπάνω πρόγραμμα αρκεί να γράψετε +<WRAP todo 80% center round> 
- +Δημιουργήστε ένα project με τα παραπάνω τρία αρχεία java στο IDE της επιλογής σας και εκτελέστε τον κώδικα. Τρέξτε τον κώδικα βήμα-βήμα βλέποντας πως αλλάζουν οι τιμές των μεταβλητών. 
-<code> +</WRAP>
-javac Point.java              // μεταγλώττιση της κλάσης Point +
-javac Rectange.java           // μεταγλώττιση της κλάσης Rectangle +
-javac CreateObjectDemo.java   // μεταγλώττιση της κλάσης CreateObjectDemo +
-</code> +
- +
-Για να το τρέξετε γράφετε +
- +
-<code> +
-java CreateObjectDemo +
-</code> +
- +
-Το παραπάνω πρόγραμμα τυπώνει τα εξής στην κονσόλα. +
- +
-<code> +
-[rectOne]  xPos: 23, yPos: 94 +
-[rectOne] width: 100, height: 200 +
-[rectTwo]  xPos: 23, yPos: 94                                                                                                                                                                 +
-[rectTwo]  xPos: 63, yPos: 74                                                                                                                                                                 +
-[rectOne]  xPos: 63, yPos: 74   +
-</code> +
 ==== Επεξήγηση του παραπάνω κώδικα ===== ==== Επεξήγηση του παραπάνω κώδικα =====
  
Line 174: Line 150:
 <code java> <code java>
     // Declare variables     // Declare variables
-    Point originOneoriginTwo+    Point origin1origin2
-    Rectangle rectOnerectTwo;+    Rectangle rect1rect2;
     // Create objects     // Create objects
-    originOne = new Point(23, 94); +    origin1 = new Point(23, 94); 
-    originTwo = new Point(15, -33); +    origin2 = new Point(15, -33); 
-    rectOne = new Rectangle(100, 200, originOne); +    rect1 = new Rectangle(100, 200, origin1); 
-    rectTwo = new Rectangle(50, 100, originTwo);+    rect2 = new Rectangle(50, 100, origin2);
 </code> </code>
  
-Οι πρώτες δύο γραμμές ορίζουν τις μεταβλητές ''originOne'', ''originTwo'',''rectOne'' και ''rectTwo''. Οι μεταβλητές δυνητικά δείχνουν σε τύπους δεδομένων **Point** και **Rectangle**. Προς το παρόν όμως το περιεχόμενο των μεταβλητών αυτών είναι απροσδιόριστο (στην πραγματικότητα ο compiler αρχικοποιεί τις μεταβλητές αυτές στην τιμή **null**). +Οι πρώτες δύο γραμμές ορίζουν τις μεταβλητές ''origin1'', ''origin2'',''rect1'' και ''rect2''. Οι μεταβλητές δυνητικά δείχνουν σε τύπους δεδομένων **Point** και **Rectangle**. Προς το παρόν όμως το περιεχόμενο των μεταβλητών αυτών είναι απροσδιόριστο (στην πραγματικότητα ο compiler αρχικοποιεί τις μεταβλητές αυτές στην τιμή **null**). 
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
Line 195: Line 171:
 Αμέσως μετά τις δηλώσεις των μεταβλητών ακολουθούν οι κλήσεις των κατασκευαστών των αντίστοιχων κλάσεων. Όπως προαναφέραμε, ο κατασκευαστής όταν καλείται δεσμεύει την απαραίτητη μνήμη για το αντικείμενο,  αρχικοποιεί τα πεδία του αντικειμένου και επιστρέφει μία αναφορά προς το αντικείμενο που δημιούργησε. Αμέσως μετά τις δηλώσεις των μεταβλητών ακολουθούν οι κλήσεις των κατασκευαστών των αντίστοιχων κλάσεων. Όπως προαναφέραμε, ο κατασκευαστής όταν καλείται δεσμεύει την απαραίτητη μνήμη για το αντικείμενο,  αρχικοποιεί τα πεδία του αντικειμένου και επιστρέφει μία αναφορά προς το αντικείμενο που δημιούργησε.
  
-Η παρακάτω εικόνα δείχνει τις μεταβλητές ''originOne'', ''originTwo'', ''rectOne'', ''rectTwo'' μετά την αρχικοποίηση τους από τους αντίστοιχους κατασκευαστές.+Η παρακάτω εικόνα δείχνει τις μεταβλητές ''origin1'', ''origin2'', ''rect1'', ''rect2'' μετά την αρχικοποίηση τους από τους αντίστοιχους κατασκευαστές.
  
 {{:java:createobjectdemoreference2.png|}} {{:java:createobjectdemoreference2.png|}}
Line 202: Line 178:
  
 <code java> <code java>
-    // set rectTwo's position +    // set rect2 origin 
-    rectTwo.setOrigin(originOne);     +    rect2.setOrigin(origin1); 
-    // display rectTwo's position +    // display rect2 origin 
-    System.out.println("[rectTwo]  xPos: " + rectTwo.getOrigin().getX() + ", yPos: " + rectTwo.getOrigin().getY()); +    System.out.println("[rect2]  origin.x: " + rect2.getOrigin().getX() + ", origin.y: " + rect2.getOrigin().getX()); 
-  +     
-    // move rectTwo and display its new position +    // move rect2 origin and display its new position 
-    rectTwo.moveOrigin(40, -20); +    rect2.moveOrigin(40, -20); 
-    System.out.println("[rectTwo]  xPos: " + rectTwo.getOrigin().getX() + ", yPos: " + rectTwo.getOrigin().getY()); +     
-  +    // print origin of rect1 and rect2 
-    // display rectOne's position +    System.out.println("[rect1]  origin.x: " + rect1.getOrigin().getX() + ", origin.y: " + rect1.getOrigin().getY()); 
-    System.out.println("[rectOne]  xPos: " + rectOne.getOrigin().getX()+", yPos: " + rectOne.getOrigin().getY());+    System.out.println("[rect2]  origin.x: " + rect2.getOrigin().getX() + ", origin.y: " + rect2.getOrigin().getY());
 </code> </code>
  
 Στις γραμμές αυτές συμβαίνουν τα εξής: Στις γραμμές αυτές συμβαίνουν τα εξής:
-    - Το αντικείμενο ''rectTwo'' επιλέγει ως πεδίο origin to ''originOne''. Στη συνέχεια, μέσω του ''rectTwo'' μεταβάλλονται οι συντεταγμένες του αντικειμένου ''originOne''+    - Το αντικείμενο ''rect2'' επιλέγει ως πεδίο origin to ''origin1'' 
-    - Εκτυπώνονται οι αλλαγές για το ''rectTwo'' στην κονσόλα. +    - Στη συνέχεια, μέσω του ''rect2'' μεταβάλλονται οι συντεταγμένες του αντικειμένου ''origin1''
-    - Εκτυπώνονται οι αλλαγές για το ''rectOne'' στην κονσόλα. Παρατηρούμε ότι οι συντεταγμένες του πεδίου **origin** άλλαξαν και για το αντικείμενο ''rectOne''.+    - Εκτυπώνονται οι αλλαγές για το ''rect1'' στην κονσόλα. 
 +    - Εκτυπώνονται οι αλλαγές για το ''rect2'' στην κονσόλα. 
  
-Tα παρακάτω δύο σχήματα αποτυπώνουν α) την αλλαγή του πεδίου **origin** του ''rectTwo'', ώστε να δείχνει στο αντικείμενο ''rectOne'' και β) την αλλαγή των περιεχομένων του ''originOne'' μέσω του αντικειμένου ''rectTwo''. Οι αλλαγές αυτές επηρεάζουν και το πεδίο **origin** του ''rectOne'' που δείχνει στο κοινό αντικείμενο ''origineOne''.+Παρατηρούμε ότι οι συντεταγμένες του πεδίου **origin** άλλαξαν για το αντικείμενο ''rect2'' και παράλληλα για το αντικείμενο ''rect1'', διότι τα πεδία ''origin'' των δύο αντικειμένων δείχνουν στο ίδιο αντικείμενο.
  
-Παρατηρείστε ότι πλέον μόνο η μεταβλητή ''originTwo'' δείχνει στο αντικείμενο τύπου **Point** με συντεταγμένες 15, -33.+Τα παρακάτω δύο σχήματα αποτυπώνουν α) την αλλαγή του πεδίου **origin** του ''rect2'', ώστε να δείχνει στο αντικείμενο ''rect1'' και β) την αλλαγή των περιεχομένων του ''origin1'' μέσω του αντικειμένου ''rect2''.  
 + 
 +Παρατηρείστε ότι πλέον μόνο η μεταβλητή ''origin2'' δείχνει στο αντικείμενο τύπου **Point** με συντεταγμένες 15, -33.
  
 |  **(a)**  | |  **(b)**  | |  **(a)**  | |  **(b)**  |
Line 229: Line 208:
 Τέλος το πρόγραμμα τελειώνει με την γραμμή κώδικα: Τέλος το πρόγραμμα τελειώνει με την γραμμή κώδικα:
 <code java> <code java>
-    // assign originOne value to originTwo +    // assign origin1 value to origin2 
-    originTwo originOne;+    origin2 origin1;
 </code> </code>
  
-Μετά την γραμμή αυτή η μεταβλητή ''originTwo'' δείχνει στο αντικείμενο που δείχνει και η μεταβλητή ''originOne''. Πλέον δεν υπάρχει καμία μεταβλητή ή αναφορά που να δείχνει στο αντικείμενο τύπου **Point** με συντεταγμένες 15, -33. Το αντικείμενο αυτό θα διαγραφεί αυτόματα από την λειτουργία **[[#garbage_collection|Garbage Collection]]** του JVM.+Μετά την γραμμή αυτή η μεταβλητή ''origin2'' δείχνει στο αντικείμενο που δείχνει και η μεταβλητή ''origin1''. Πλέον δεν υπάρχει καμία μεταβλητή ή αναφορά που να δείχνει στο αντικείμενο τύπου **Point** με συντεταγμένες 15, -33. Το αντικείμενο αυτό θα διαγραφεί αυτόματα από την λειτουργία **[[#garbage_collection|Garbage Collection]]** του JVM.
  
 {{:java:createobjectdemoreference5.png|}} {{:java:createobjectdemoreference5.png|}}
Line 240: Line 219:
 Προκειμένου να δημιουργηθούν νέα αντικείμενα χρησιμοποιείται ο τελεστής **new**. O τελεστής **new** χρησιμοποιείται συνήθως με τον κατασκευαστή μίας κλάσης προκειμένου να κάνει τα εξής: Προκειμένου να δημιουργηθούν νέα αντικείμενα χρησιμοποιείται ο τελεστής **new**. O τελεστής **new** χρησιμοποιείται συνήθως με τον κατασκευαστή μίας κλάσης προκειμένου να κάνει τα εξής:
   - Δέσμευση της απαραίτητης μνήμης και δημιουργία του αντικειμένου. Η αρχικά ορισμένη μεταβλητή δείχνει πλέον στην περιοχή μνήμης που έχει δεσμευτεί.   - Δέσμευση της απαραίτητης μνήμης και δημιουργία του αντικειμένου. Η αρχικά ορισμένη μεταβλητή δείχνει πλέον στην περιοχή μνήμης που έχει δεσμευτεί.
-  - Αρχικοποίηση των εσωτερικών μεταβλητών (πεδίων) του αντικειμένου με κλήση του κατάλληλου κατασκευαστή της κλάσης. Εάν δεν έχει οριστεί κατασκευαστής τότε ο τελεστής **new** καλείται με χρήση του default κατασκευαστή (default constructor) που δεν έχει ορίσματα .χ. ''MyObject obj = new MyObject();'', όπου για την κλάση ''MyObject'' δεν έχει οριστεί κανένας κατασκευατής).+  - Αρχικοποίηση των εσωτερικών μεταβλητών (πεδίων) του αντικειμένου με κλήση του κατάλληλου κατασκευαστή της κλάσης. Εάν δεν έχει οριστεί κατασκευαστής τότε ο τελεστής **new** καλείται με χρήση του default κατασκευαστή (//default constructor//) που δεν έχει ορίσματα. Για παράδειγμα, για την ενδεικτική κλάση ''MyObject'' στην οποία δεν έχει οριστεί κανένας κατασκευατής  
 + 
 +<code java> MyObject obj = new MyObject();</code>
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
Line 248: Line 229:
 </WRAP> </WRAP>
  
-===== Πολλαπλοί κατασκευαστές σε μία κλάση =====+===== Διαφορετικοί κατασκευαστές σε μία κλάση =====
  
-Μία κλάση μπορεί να έχει πολλούς διαφορετικούς κατασκευαστές. Κάθε κατασκευαστής ορίζει μία διαφορετική αρχικοποίηση των εσωτερικών μεταβλητών των αντικειμένων που δημιουργούνται με βάση το "σχέδιο" της κλάσης. Το ποιoς κατασκευαστής θα κληθεί εξαρτάται από τον τύπο, τη σειρά και τον αριθμό των ορισμάτων σε αναλογία με την υπερφόρτωση μεθόδων. Ας υποθέσουμε την παρακάτω μέθοδο **main**, στην οποία καλούνται δύο διαφορετικοί κατασκευαστές για δύο διαφορετικά αντικείμενα της ίδιας κλάσης **Rectangle**. Παρατηρήστε ότι η μεταβλητή **rectOne** αρχικοποιείται από την 1ο κατασκευαστή της κλάσης και η μεταβλητή **rectTwo** από τον 2ο κατασκευαστή.+Μία κλάση μπορεί να έχει περισσότερους από ένα κατασκευαστές. Κάθε κατασκευαστής ορίζει ένα διαφορετικό τρόπο αρχικοποίησης των εσωτερικών μεταβλητών των αντικειμένων που δημιουργούνται από την κλάση. Το ποιoς κατασκευαστής θα κληθεί εξαρτάται από τον τύπο, τη σειρά και τον αριθμό των ορισμάτων σε αναλογία με την υπερφόρτωση μεθόδων. Ας υποθέσουμε την παρακάτω μέθοδο **main**, στην οποία καλούνται δύο διαφορετικοί κατασκευαστές για δύο διαφορετικά αντικείμενα της ίδιας κλάσης **Rectangle**. Παρατηρήστε ότι η μεταβλητή **rect1** αρχικοποιείται από την πρώτο κατασκευαστή της κλάσης και η μεταβλητή **rect2** από τον δεύτερο κατασκευαστή.
  
 <code java> <code java>
 public class CreateRectangleObjects { public class CreateRectangleObjects {
   public static void main(String []args) {   public static void main(String []args) {
-    Point originOne = new Point(10,5); +    Point origin1 = new Point(10,5); 
-    rectOne = new Rectangle(100, 200, originOne); +    rect1 = new Rectangle(100, 200, origin1); 
-    rectTwo = new Rectangle(50, 100, -40, 80);+    rect2 = new Rectangle(50, 100, -40, 80);
   }   }
 } }
Line 263: Line 244:
  
  
-===== Χρήση Αντικειμένων =====+===== Χρήση των πεδίων και των μεθόδων ενός αντικειμένου =====
  
 Όταν φτιάξετε ένα αντικείμενο είναι σίγουρο ότι θα θέλετε να το χρησιμοποιήσετε προκειμένου να κάνετε μία εργασία όπως να γράψετε κάτι στα δεδομένα του, να διαβάσετε από αυτά ή να χρησιμοποιήσετε κάποια από τις μεθόδους του. Όταν φτιάξετε ένα αντικείμενο είναι σίγουρο ότι θα θέλετε να το χρησιμοποιήσετε προκειμένου να κάνετε μία εργασία όπως να γράψετε κάτι στα δεδομένα του, να διαβάσετε από αυτά ή να χρησιμοποιήσετε κάποια από τις μεθόδους του.
Line 277: Line 258:
 </code> </code>
  
 +/*
 <WRAP important 80% center round> <WRAP important 80% center round>
 Απαραίτητη προϋπόθεση για να δουλέψει ο παραπάνω κώδικας είναι τα πεδία width και height να είναι προσβάσιμα, δηλαδή να μην έχουν προσδιοριστή πρόσβασης τύπου **private**. Απαραίτητη προϋπόθεση για να δουλέψει ο παραπάνω κώδικας είναι τα πεδία width και height να είναι προσβάσιμα, δηλαδή να μην έχουν προσδιοριστή πρόσβασης τύπου **private**.
Line 284: Line 266:
 Όπως προείπαμε μία καλή προγραμματιστική πρακτική είναι η απόκρυψη των πεδίων κάθε κλάσης και η δήλωση συναρτήσεων για την πρόσβαση στα δεδομένα της. Σε αυτή την περίπτωση η απευθείας πρόσβαση στα πεδία των αντικειμένων είναι μη επιτρεπτή (ο compiler δεν μεταγλωττίζει το πρόγραμμα). Η πρόσβαση σε μεταβλητές που έχουν τον προσδιοριστή **private** μπορεί να γίνει μόνο μέσω βοηθητικών συναρτήσεων (set/get) που έχουν τον προσδιοριστή **public**. Όπως προείπαμε μία καλή προγραμματιστική πρακτική είναι η απόκρυψη των πεδίων κάθε κλάσης και η δήλωση συναρτήσεων για την πρόσβαση στα δεδομένα της. Σε αυτή την περίπτωση η απευθείας πρόσβαση στα πεδία των αντικειμένων είναι μη επιτρεπτή (ο compiler δεν μεταγλωττίζει το πρόγραμμα). Η πρόσβαση σε μεταβλητές που έχουν τον προσδιοριστή **private** μπορεί να γίνει μόνο μέσω βοηθητικών συναρτήσεων (set/get) που έχουν τον προσδιοριστή **public**.
 </WRAP> </WRAP>
 +*/
 ==== Χρήση των μεθόδων ενός αντικειμένου ==== ==== Χρήση των μεθόδων ενός αντικειμένου ====
  
Line 293: Line 275:
    System.out.println("Rectangle dimensions are " + rect.getWidth() + ", " + rect.getHeight() );    System.out.println("Rectangle dimensions are " + rect.getWidth() + ", " + rect.getHeight() );
 </code> </code>
 +/*
 <WRAP important 80% center round> <WRAP important 80% center round>
 Ισχύουν και για τις μεθόδους όσα αναφέρονται για τους προσδιοριστές τύπου **public**, **private** των πεδίων. Ισχύουν και για τις μεθόδους όσα αναφέρονται για τους προσδιοριστές τύπου **public**, **private** των πεδίων.
 </WRAP> </WRAP>
 +*/
 ===== Garbage Collection ===== ===== Garbage Collection =====
  
 Οι γλώσσες προγραμματισμού που μέχρι τώρα έχετε γνωρίσει (βλέπε **C**) αναθέτουν την ευθύνη δέσμευσης μνήμης στον προγραμματιστή μέσω των συναρτήσεων **malloc()** και **free()**. Σε αντιδιαστολή, η **JAVA** αφήνει τον προγραμματιστεί να ορίσει όσα αντικείμενα επιθυμεί και δεσμεύει την μνήμη για αυτά μέσω του τελεστή **new**. Οι γλώσσες προγραμματισμού που μέχρι τώρα έχετε γνωρίσει (βλέπε **C**) αναθέτουν την ευθύνη δέσμευσης μνήμης στον προγραμματιστή μέσω των συναρτήσεων **malloc()** και **free()**. Σε αντιδιαστολή, η **JAVA** αφήνει τον προγραμματιστεί να ορίσει όσα αντικείμενα επιθυμεί και δεσμεύει την μνήμη για αυτά μέσω του τελεστή **new**.
  
-Πώς όμως αποδεσμεύεται η μνήμη που δεσμεύτηκε προηγούμενα από το πρόγραμμα μας, αλλά δεν την χρειαζόμαστε πλέον; Περιοδικά το **JVM** κοιτάει εάν υπάρχει δεσμευμένη μνήμη για αντικείμενα στα οποία δεν υφίστανται πλέον αναφορές/references που δείχνουν σε αυτά. Σε αυτές τις περιπτώσεις, ελευθερώνεται η μνήμη που έχει δεσμευτεί για τα αντικείμενα αυτής της κατηγορίας. Παράλληλα η αποδέσμευση της μνήμης και η διαγραφή των αντικειμένων πιθανόν συνεπάγεται ότι και άλλα αντικείμενα δεν διαθέτουν πια αναφορές προς αυτά κ.ο.κ. Η διαδικασία συνεχίζεται μέχρι να αποδεσμευτεί όλη η δυναμικά δεσμευμένη μνήμη. +Πώς όμως αποδεσμεύεται η μνήμη που δεσμεύτηκε προηγούμενα από το πρόγραμμα μας, αλλά δεν την χρειαζόμαστε πλέον; Περιοδικά το **JVM** κοιτάει εάν υπάρχει δεσμευμένη μνήμη για αντικείμενα στα οποία δεν υφίστανται πλέον αναφορές/references που δείχνουν σε αυτά. Σε αυτές τις περιπτώσεις, ελευθερώνεται η μνήμη που έχει δεσμευτεί για τα αντικείμενα αυτής της κατηγορίας. Παράλληλα η αποδέσμευση της μνήμης και η διαγραφή των αντικειμένων πιθανόν συνεπάγεται ότι και άλλα αντικείμενα δεν διαθέτουν πια αναφορές προς αυτά κ.ο.κ. Η διαδικασία συνεχίζεται μέχρι να αποδεσμευτεί όλη η δυναμικά δεσμευμένη μνήμη στην οποία το πρόγραμμα έχει χάσει κάθε δυνατότητα πρόσβασης
  
 Ο μηχανισμός **Garbage Collection** απαντάται σε αρκετές γλώσσες υψηλού επιπέδου, απελευθερώνοντας τον προγραμματιστή από την ευθύνη αποδέσμευσης της μνήμης που δεσμεύτηκε προηγούμενα. Η ευθύνη της δεύσμευσης/αποδέσμευσης μνήμης δεν επαφίεται στον προγραμματιστή, πράγμα που κάνει λιγότερο επίπονο τον προγραμματισμό.  Ο μηχανισμός **Garbage Collection** απαντάται σε αρκετές γλώσσες υψηλού επιπέδου, απελευθερώνοντας τον προγραμματιστή από την ευθύνη αποδέσμευσης της μνήμης που δεσμεύτηκε προηγούμενα. Η ευθύνη της δεύσμευσης/αποδέσμευσης μνήμης δεν επαφίεται στον προγραμματιστή, πράγμα που κάνει λιγότερο επίπονο τον προγραμματισμό. 
java/objects.1581179223.txt.gz · Last modified: 2020/02/08 16:27 (external edit)