Φωτογραφία Παναγιώτης ΣΤΑΣΙΝΟΠΟΥΛΟΣ
point [4]
από Παναγιώτης ΣΤΑΣΙΝΟΠΟΥΛΟΣ - Thursday, 29 April 2010, 6:23 PM
 

Διαβάζοντας το κώδκα στη σελίδα 121 (σημειώσεις) για το rectangle βλέπω ότι χρησιμοποιούμε ένα πίνακα με 4 στοιχεία

point=new point[4];

Στη main class πάλι σελ 123 δίνουμε τιμές στα στοιχεία point του πίνακα που αποτελούνται από ζεύγη τιμών (x,y) που οριζουν τη μεταβλητή point.

Η απορία μου είναι, τί τιμές τελικά παίρνει ο πίνακας? Δε θα έπρεπε να έχουμε έναν πίνακα διάστασης (4χ2) για να του θέσουμε 4 ζεύγη τιμών?   

 
Φωτογραφία Νικόλαος Πανάγος
Απάντηση: point [4]
από Νικόλαος Πανάγος - Thursday, 29 April 2010, 7:28 PM
 
Παναγιώτη θα προσπαθήσω να το εξηγήσω όσο καλύτερα μπορώ γιατί υπάρχει σύγχιση...

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

Η δήλωση λοιπόν points = new Point[4]; δημιουργεί έναν πίνακα τύπου Point μεγέθους 4 στοιχείων και θέτει τη μεταβλητή μέλος points να δείχνει σε αυτόν τον πίνακα. Ο πίνακας αυτός δεν είναι δισδιάστατος αλλά μονοδιάστατος, αποτελείται από 4 στοιχεία. Απλά, αυτό που θα πρέπει να προσέξεις είναι πως το κάθε στοιχείο του πίνακα δύναται να αποθηκεύσει ένα αντικείμενο τύπου Point, το οποίο με τη σειρά του περιέχει 2 πεδία, το x και το y.

Στη σελίδα 123 τώρα, υποθέτω πως αναφέρεσαι στη γραμμή:

Point[] p = {new Point(2, 2), ... }

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

int[] array = {1, 3, 5, 7};

Η μόνη διαφορά είναι πως στην περίπτωση του Point δεν έχεις βασικούς τύπους αλλά αντικείμενα και άρα θα πρέπει να τα δημιουργήσεις on-the-fly με τη σύνταξη new Point(2, 2) κ.ο.κ.
Αυτό που θα πρέπει να προσέξεις είναι πως έχεις έναν μονοδιάστατο πίνακα 4 στοιχείων, το κάθε στοιχείο του οποίου αποθηκεύει αντικείμενα τύπου Point.

ΝΠ
Φωτογραφία Παναγιώτης ΣΤΑΣΙΝΟΠΟΥΛΟΣ
Απάντηση: point [4]
από Παναγιώτης ΣΤΑΣΙΝΟΠΟΥΛΟΣ - Thursday, 29 April 2010, 7:59 PM
 

άρα όταν ζητήσω να τυπωθεί το στοιχείο point[0] για παράδειγμα θα πάρω ως αποτέλεσμα το 2,2.

Έιχα την έννοια του πίνακα που παίρνει βασικούς τύπους στο μυαλό μου και αυτό με μπέρδευε. Νομίζω τώρα είναι πιο ξεκάθαρο. Αυτό που δεν καταλαβαίνω ίσως είναι πώς δουλεύει η μνήμη όταν  πέρνάω στο πίνακα ένα αντικείμενο. Δηλ. στη θέση μηδέν τί χώρο ακριβώς δεσμεύει η μνήμη? πχ.8 bytes (αν χ,y είναι integer).

thks

Φωτογραφία Νικόλαος Πανάγος
Απάντηση: point [4]
από Νικόλαος Πανάγος - Thursday, 29 April 2010, 8:27 PM
 
Για να τυπώσεις την τιμή του χ του Point που είναι αποθηκευμένο στο πρώτο στοιχείο θα γράψεις System.out.println(points[0].getX());

Στο συγκεκριμένο παράδειγμα ναι, 8 bytes θα καταναλώνει το κάθε στοιχείο του πίνακα, αλλά δεν καταλαβαίνω γιατί θες να μπλέξεις με low level πράγματα όπως αυτό. Η διαχείριση της μνήμης είναι ένα θέμα που απασχολεί τον compiler και δεν θα έπρεπε να απσχολεί εσένα, εσένα θα έπρεπε να σε καλύπτει το γεγονός πως ορίζοντας μια νέα κλάση μπορείς αυτόματα να δηλώνεις και πίνακες της κλάσης αυτής. Το πως το κάνει ο compiler είναι δικό του πρόβλημα!
Στο λέω αυτό εντελώς φιλικά, γιατί υπάρχει περίπτωση να χάσεις το δάσος για να δεις το δέντρο. Αυτό που προέχει είναι να καταλάβεις πως λειτουργούν οι πίνακες και πως μπορούμε να αποθηκεύουμε κάθε λογής αντικείμενα σε αυτούς. Μη σε απασχολεί η διαχείριση της μνήμης.

ΝΠ