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 revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:objects [2020/02/21 10:13]
gthanos [Ένα πιο εκτεταμένο παράδειγμα]
java:objects [2022/02/23 15:10]
gthanos [Επεξήγηση του παραπάνω κώδικα]
Line 113: Line 113:
     Point origin1, origin2;     Point origin1, origin2;
     Rectangle rect1, rect2;     Rectangle rect1, rect2;
-    // Create objects+     
 +    // Create the objects
     origin1 = new Point(23, 94);     origin1 = new Point(23, 94);
     origin2 = new Point(15, -33);     origin2 = new Point(15, -33);
Line 119: Line 120:
     rect2 = new Rectangle(50, 100, origin2);     rect2 = new Rectangle(50, 100, origin2);
          
-    // display rectOne's width, height, and area +    // print origin of rect1 and rect2 
-    System.out.println("[rect1]  xPos: " + rect1.origin.+ ", yPos: " + rect1.origin.y); +    System.out.println("[rect1]  origin.x: " + rect1.getOrigin().getX() + ", origin.y: " + rect1.getOrigin().getY()); 
-    System.out.println("[rect2]  xPos: " + rect2.origin.+ ", yPos: " + rect2.origin.y);+    System.out.println("[rect2]  origin.x: " + rect2.getOrigin().getX() + ", origin.y: " + rect2.getOrigin().getY());
          
-    // set rectTwo's position+    // set rect2 origin
     rect2.setOrigin(origin1);     rect2.setOrigin(origin1);
-    // display rectTwo's position +    // display rect2 origin 
-    System.out.println("[rect2]  xPos: " + rect2.origin.+ ", yPos: " + rect2.origin.y);+    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
     rect2.moveOrigin(40, -20);     rect2.moveOrigin(40, -20);
-    System.out.println("[rect2]  xPos: " + rect2.origin.x + ", yPos: " + rect2.origin.y); 
          
-    // display rectOne's position +    // print origin of rect1 and rect2 
-    System.out.println("[rect1]  xPos: " + rect1.origin.+ ", yPos: " + rect1.origin.y); +    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()); 
 +    
     // assign originOne value to originTwo     // assign originOne value to originTwo
     origin2 = origin1;     origin2 = origin1;
Line 141: Line 142:
 </code> </code>
  
-Αποθηκεύστε και τα τρία αρχεία στον ίδιο κατάλογο. Εάν δεν φτιάξετε ένα project στο NetBeans, για να μεταγλωττίσετε το παραπάνω πρόγραμμα αρκεί να γράψετε: +<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> +
-[rect1]  xPos: 23, yPos: 94 +
-[rect2]  xPos: 15, yPos: -33 +
-[rect2]  xPos: 23, yPos: 94 +
-[rect2]  xPos: 63, yPos: 74 +
-[rect1]  xPos: 63, yPos: 74  +
-</code> +
 ==== Επεξήγηση του παραπάνω κώδικα ===== ==== Επεξήγηση του παραπάνω κώδικα =====
  
Line 198: Line 178:
  
 <code java> <code java>
-    // set rect2's position +    // set rect2 origin 
-    rect2.setOrigin(origin1);     +    rect2.setOrigin(origin1); 
-    // display rect2's position +    // display rect2 origin 
-    System.out.println("[rect2]  xPos: " + rect2.getOrigin().getX() + ", yPos: " + rect2.getOrigin().getY()); +    System.out.println("[rect2]  origin.x: " + rect2.getOrigin().getX() + ", origin.y: " + rect2.getOrigin().getX()); 
-  +     
-    // move rect2 and display its new position+    // move rect2 origin and display its new position
     rect2.moveOrigin(40, -20);     rect2.moveOrigin(40, -20);
-    System.out.println("[rect2]  xPos: " + rect2.getOrigin().getX() + ", yPos: " + rect2.getOrigin().getY()); +     
-  +    // print origin of rect1 and rect2 
-    // display rect1's position +    System.out.println("[rect1]  origin.x: " + rect1.getOrigin().getX() + ", origin.y: " + rect1.getOrigin().getY()); 
-    System.out.println("[rect1]  xPos: " + rect1.getOrigin().getX()+", yPos: " + rect1.getOrigin().getY());+    System.out.println("[rect2]  origin.x: " + rect2.getOrigin().getX() + ", origin.y: " + rect2.getOrigin().getY());
 </code> </code>
  
 Στις γραμμές αυτές συμβαίνουν τα εξής: Στις γραμμές αυτές συμβαίνουν τα εξής:
-    - Το αντικείμενο ''rect2'' επιλέγει ως πεδίο origin to ''origin1''. Στη συνέχεια, μέσω του ''rect2'' μεταβάλλονται οι συντεταγμένες του αντικειμένου ''origin1''+    - Το αντικείμενο ''rect2'' επιλέγει ως πεδίο origin to ''origin1'' 
-    - Εκτυπώνονται οι αλλαγές για το ''rect2'' στην κονσόλα. +    - Στη συνέχεια, μέσω του ''rect2'' μεταβάλλονται οι συντεταγμένες του αντικειμένου ''origin1''
-    - Εκτυπώνονται οι αλλαγές για το ''rect1'' στην κονσόλα. Παρατηρούμε ότι οι συντεταγμένες του πεδίου **origin** άλλαξαν και για το αντικείμενο ''rect1''.+    - Εκτυπώνονται οι αλλαγές για το ''rect1'' στην κονσόλα. 
 +    - Εκτυπώνονται οι αλλαγές για το ''rect2'' στην κονσόλα.  
 + 
 +Παρατηρούμε ότι οι συντεταγμένες του πεδίου **origin** άλλαξαν για το αντικείμενο ''rect2'' και παράλληλα για το αντικείμενο ''rect1'', διότι τα πεδία ''origin'' των δύο αντικειμένων δείχνουν στο ίδιο αντικείμενο.
  
-Tα παρακάτω δύο σχήματα αποτυπώνουν α) την αλλαγή του πεδίου **origin** του ''rect2'', ώστε να δείχνει στο αντικείμενο ''rect1'' και β) την αλλαγή των περιεχομένων του ''origin1'' μέσω του αντικειμένου ''rect2''. Οι αλλαγές αυτές επηρεάζουν και το πεδίο **origin** του ''rect1'' που δείχνει στο κοινό αντικείμενο ''origineOne''.+Τα παρακάτω δύο σχήματα αποτυπώνουν α) την αλλαγή του πεδίου **origin** του ''rect2'', ώστε να δείχνει στο αντικείμενο ''rect1'' και β) την αλλαγή των περιεχομένων του ''origin1'' μέσω του αντικειμένου ''rect2''
  
 Παρατηρείστε ότι πλέον μόνο η μεταβλητή ''origin2'' δείχνει στο αντικείμενο τύπου **Point** με συντεταγμένες 15, -33. Παρατηρείστε ότι πλέον μόνο η μεταβλητή ''origin2'' δείχνει στο αντικείμενο τύπου **Point** με συντεταγμένες 15, -33.
Line 236: 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 246: Line 231:
 ===== Πολλαπλοί κατασκευαστές σε μία κλάση ===== ===== Πολλαπλοί κατασκευαστές σε μία κλάση =====
  
-Μία κλάση μπορεί να έχει πολλούς διαφορετικούς κατασκευαστές. Κάθε κατασκευαστής ορίζει μία διαφορετική αρχικοποίηση των εσωτερικών μεταβλητών των αντικειμένων που δημιουργούνται με βάση το "σχέδιο" της κλάσης. Το ποιoς κατασκευαστής θα κληθεί εξαρτάται από τον τύπο, τη σειρά και τον αριθμό των ορισμάτων σε αναλογία με την υπερφόρτωση μεθόδων. Ας υποθέσουμε την παρακάτω μέθοδο **main**, στην οποία καλούνται δύο διαφορετικοί κατασκευαστές για δύο διαφορετικά αντικείμενα της ίδιας κλάσης **Rectangle**. Παρατηρήστε ότι η μεταβλητή **rectOne** αρχικοποιείται από την 1ο κατασκευαστή της κλάσης και η μεταβλητή **rectTwo** από τον 2ο κατασκευαστή.+Μία κλάση μπορεί να έχει πολλούς διαφορετικούς κατασκευαστές. Κάθε κατασκευαστής ορίζει μία διαφορετική αρχικοποίηση των εσωτερικών μεταβλητών των αντικειμένων που δημιουργούνται με βάση το "σχέδιο" της κλάσης. Το ποιoς κατασκευαστής θα κληθεί εξαρτάται από τον τύπο, τη σειρά και τον αριθμό των ορισμάτων σε αναλογία με την υπερφόρτωση μεθόδων. Ας υποθέσουμε την παρακάτω μέθοδο **main**, στην οποία καλούνται δύο διαφορετικοί κατασκευαστές για δύο διαφορετικά αντικείμενα της ίδιας κλάσης **Rectangle**. Παρατηρήστε ότι η μεταβλητή **rect1** αρχικοποιείται από την 1ο κατασκευαστή της κλάσης και η μεταβλητή **rect2** από τον 2ο κατασκευαστή.
  
 <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 273: Line 258:
 </code> </code>
  
 +/*
 <WRAP important 80% center round> <WRAP important 80% center round>
 Απαραίτητη προϋπόθεση για να δουλέψει ο παραπάνω κώδικας είναι τα πεδία width και height να είναι προσβάσιμα, δηλαδή να μην έχουν προσδιοριστή πρόσβασης τύπου **private**. Απαραίτητη προϋπόθεση για να δουλέψει ο παραπάνω κώδικας είναι τα πεδία width και height να είναι προσβάσιμα, δηλαδή να μην έχουν προσδιοριστή πρόσβασης τύπου **private**.
Line 280: Line 266:
 Όπως προείπαμε μία καλή προγραμματιστική πρακτική είναι η απόκρυψη των πεδίων κάθε κλάσης και η δήλωση συναρτήσεων για την πρόσβαση στα δεδομένα της. Σε αυτή την περίπτωση η απευθείας πρόσβαση στα πεδία των αντικειμένων είναι μη επιτρεπτή (ο compiler δεν μεταγλωττίζει το πρόγραμμα). Η πρόσβαση σε μεταβλητές που έχουν τον προσδιοριστή **private** μπορεί να γίνει μόνο μέσω βοηθητικών συναρτήσεων (set/get) που έχουν τον προσδιοριστή **public**. Όπως προείπαμε μία καλή προγραμματιστική πρακτική είναι η απόκρυψη των πεδίων κάθε κλάσης και η δήλωση συναρτήσεων για την πρόσβαση στα δεδομένα της. Σε αυτή την περίπτωση η απευθείας πρόσβαση στα πεδία των αντικειμένων είναι μη επιτρεπτή (ο compiler δεν μεταγλωττίζει το πρόγραμμα). Η πρόσβαση σε μεταβλητές που έχουν τον προσδιοριστή **private** μπορεί να γίνει μόνο μέσω βοηθητικών συναρτήσεων (set/get) που έχουν τον προσδιοριστή **public**.
 </WRAP> </WRAP>
 +*/
 ==== Χρήση των μεθόδων ενός αντικειμένου ==== ==== Χρήση των μεθόδων ενός αντικειμένου ====
  
Line 289: 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 =====
  
java/objects.txt · Last modified: 2022/02/23 15:25 by gthanos