Η κατασκευή αντικειμένων της κλάσης Student μπορεί να πραγματοποιηθεί είτε στη main είτε σε οποιαδήποτε μέθοδο κλάσης:

Σχετικά έγγραφα
Αντικειμενοστρεφής Προγραμματισμός Τμήμα Εφαρμοσμένης Πληροφορικής Αναγκαιότητα Κλάσεων

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Κλάσεις και Αντικείµενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Ανάλυση Πληροφοριακών Συστημάτων. Εαρινό Εξάμηνο Lec08 09/04/2019 Διδάσκων: Γεώργιος Χρ. Μακρής

Οντοκεντρικός Προγραμματισμός

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

2.1 Αντικειµενοστρεφής προγραµµατισµός

Διαγράμματα Κλάσεων στη Σχεδίαση

Αντικειμενοστρεφής Προγραμματισμός

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 29/11/07

«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

3 Αλληλεπίδραση Αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειµενοστραφής Προγραµµατισµός

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΘΕΜΑΤΑ ΕΞΕΤΑΣΕΩΝ ΟΜΑΔΑ Α

Τμήμα Πολιτικών Μηχανικών και Μηχανικών Περιβάλλοντος ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής, :00-10:00 π.μ.

Εισαγωγή στον Προγραμματισμό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors, equals, tostring Αντικείμενα ως παράμετροι

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Έλεγχος ισότητας String Interning Αποαναφοροποίηση - dereferencing

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 26/2/2008

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Εφαρμογή Μεθοδολογίας ICONIX

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

Αντικειµενοστρεφής Προγραµµατισµός

ΕΡΓΑΣΙΑ 2. Κατασκευάζοντας Ημερολόγια. Ημερομηνία Ανάρτησης: 23/02/2018 Ημερομηνία Παράδοσης: 13/03/2018, 09:00

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Generics και ArrayLists

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

Αντικειμενοστραφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 5: Κατασκευαστές (Constructors)

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

ΑΣΚΗΣΕΙΣ ΕΡΓΑΣΤΗΡΙΟΥ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Μάθημα 1 [3/11/2015].

Ειδικά Θέματα Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

POINTERS, AGGREGATION, COMPOSITION

Εισαγωγή στον Προγ/μό Η/Υ

Διάγραμμα Κλάσεων. Class Diagram

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι String Interning

ΕΡΓΑΣΙΑ 4. Εκλογικό Σύστημα με Μεταφορά και Συσσώρευση Ψήφων. Ημερομηνία Ανάρτησης: 16/04/2018 Ημερομηνία Παράδοσης: 04/05/2018, 09:00

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 13/12/07

Βασικά Στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors Υπερφόρτωση Αντικείμενα ως παράμετροι

Κληρονομικότητα. Κληρονομικότητα (inheritance) είναι ο τρόπος µε τον οποίο μία τάξη μπορεί να κληρονομήσει ιδιότητες και συμπεριφορά από άλλες τάξεις.

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Βασικά της γλώσσας JAVA

Διαδικαστικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Περισσότερα για τις Κλάσεις, τα Αντικείμενα και τις Μεθόδους

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Αντικειμενοστρεφής Προγραμματισμός

Δομημένος Προγραμματισμός

Transcript:

Αντικειμενοστρεφής Προγραμματισμός Τμήμα Εφαρμοσμένης Πληροφορικής Δημιουργία Κλάσεων/Αντικειμένων/Συσχετίσεων/Συνδέσεων Δημιουργία κλάσεων και αντικειμένων Θεωρούμε ένα υποθετικό σύστημα που αναφέρεται σε Φοιτητές και Μαθήματα. Για τη μοντελοποίηση των Φοιτητών δημιουργούμε την κλάση Student. Η κλάση διαθέτει ως ιδιότητες το όνομα και τον αριθμό μητρώου του φοιτητή, ενώ από πλευράς μεθόδων πέραν των κατασκευαστών και των μεθόδων πρόσβασης διαθέτει και μια μέθοδο εκτύπωσης των τιμών των ιδιοτήτων. public class Student { private String name; private String id; public Student(String text1, String text2) { name = text1; id = text2; public Student(String text1) { name = text1; id = "9999"; public String getname() { return name; public String getid() { return id; public void printinfo() { System.out.println("Name: " + name); System.out.println("AM: " + id); Η κατασκευή αντικειμένων της κλάσης Student μπορεί να πραγματοποιηθεί είτε στη main είτε σε οποιαδήποτε μέθοδο κλάσης: public class Main { public static void main(string[] args) { Student S1 = new Student("John", "1209"); Student S2 = new Student("Nick"); S1.printInfo();

Αλέξανδρος Χατζηγεωργίου, 2012 S2.printInfo(); Το τμήμα της εντολής Student S1 = new Student("John", "1209"); μετά τον τελεστή "=", δηλαδή: new Student("John", "1209"); δημιουργεί ένα αντικείμενο της κλάσης Student καλώντας τον αντίστοιχο κατασκευαστή και μεταβιβάζοντας ως ορίσματα το όνομα και τον ΑΜ του φοιτητή. Το τμήμα της εντολής πριν από τον τελεστή "=", δηλαδή Student S1 δημιουργεί μια αναφορά τύπου Student, δηλαδή μια μεταβλητή της οποίας το περιεχόμενο μπορεί να λάβει ως τιμή τις διευθύνσεις αντικειμένων τύπου Student (ουσιαστικά πρόκειται για έναν "δείκτη"). Μετά την εκτέλεση της εντολής, ανατίθεται στην αναφορά S1 η διεύθυνση του αντικειμένου που δημιουργήθηκε και κατά συνέπεια η αναφορά "δείχνει" πλέον στο δημιουργηθέν αντικείμενο. Αυτό μπορεί να παρασταθεί διαγραμματικά ως εξής: S1 John 1209 Επειδή όλες οι ενέργειες επί του αντικειμένου που δημιουργήθηκε πραγματοποιούνται μέσω της αναφοράς S1, καταχρηστικά αναφερόμαστα συχνά στο ίδιο το αντικείμενο ως 'S1'. Ωστόσο θα πρέπει να γίνει κατανοητή η διαφορά μεταξύ μιας αναφοράς ενός αντικειμένου (η οποία προτού αρχικοποιηθεί μπορεί να μην "δείχνει" πουθενά) και του ίδιου του αντικειμένου. Η αποστολή ενός μηνύματος στο αντικείμενο ισοδυναμεί με την κλήση μιας μεθόδου του αντικειμένου. Για παράδειγμα, η αποστολή του μηνύματος printinfo() στο αντικείμενο προς το οποίο δείχνει η αναφορά S1 με σκοπό να εκτυπωθούν στην κονσόλα οι τιμές των ιδιοτήτων του πραγματοποιείται με την εντολή: S1.printInfo(); Δημιουργία συσχετίσεων μεταξύ κλάσεων Για τη μοντελοποίηση ενός μαθήματος δημιουργούμε την κλάση Course: public class Course {

Αντικειμενοστρεφής Προγραμματισμός Τμήμα Εφαρμοσμένης Πληροφορικής private String name; private int credits; public Course(String text, int number) { name = text; credits = number; public String getname() { return name; public int getcredits() { return credits; Για να μοντελοποιήσουμε το γεγονός ότι ένας φοιτητής παρακολουθεί ένα μάθημα (και άρα σχετίζεται με αυτό) δημιουργούμε μια συσχέτιση μεταξύ των κλάσεων Student και Course με κατεύθυνση από την πρώτη προς τη δεύτερη (μονόδρομη συσχέτιση). Μια τέτοια συσχέτιση σε ένα διάγραμμα κλάσεων απεικονίζεται ως εξής: - id Student - credits Course Η συσχέτιση υποδηλώνει ότι ένα αντικείμενο τύπου Student "γνωρίζει" το αντικείμενο Course με το οποίο σχετίζεται και επιτρέπει την αποστολή μηνυμάτων από το αντικείμενο Student προς το αντικείμενο Course (όχι όμως και το ανάποδο, δεδομένου ότι η συσχέτιση έχει μονόδρομη κατεύθυνση). Η συσχέτιση υλοποιείται στην κλάση Student ως μια ιδιότητα που είναι αναφορά τύπου Course: private Course mycourse; προφανώς, αν η αναφορά αυτή δεν λάβει συγκεκριμένη τιμή δεν "δείχνει" πουθενά. Μπορούμε να αναθέσουμε τιμή σε μια αναφορά όπως και σε οποιαδήποτε άλλη ιδιότητα. Αν υποθέσουμε ότι η αναφορά λαμβάνει τιμή μέσω κατάλληλης μεθόδου set, η αντίστοιχη μέθοδος θα ήταν ως εξής: public void setcourse(course c) { mycourse = c;

Αλέξανδρος Χατζηγεωργίου, 2012 Για να συσχετίσουμε ένα συγκεκριμένο αντικείμενο Student με ένα αντικείμενο Course θα πρέπει, αφού δημιουργηθούν και τα 2 αντικείμενα, να καλέσουμε τη μέθοδο setcourse() επί του αντικειμένου Student μεταβιβάζοντας ως όρισμα το αντικείμενο Course. Για παράδειγμα στη main: public class Main { public static void main(string[] args) { Student S1 = new Student("John", "1209"); Student S2 = new Student("Nick"); Course C1 = new Course("Java", 5); S1.setMyCourse(C1); S2.setMyCourse(C1); //δημιουργία σύνδεσης Student S1->Course C1 S2.printInfo(); S2.printInfo(); Μετά την εκτέλεση της εντολής S1.setMyCourse(C1); η αναφορά mycourse του αντικειμένου S1 "δείχνει" πλέον στο αντικείμενο C1. Από το σημείο αυτό και μετά υφίσταται σύνδεση (link) μεταξύ των δύο αντικειμένων. Επισημαίνεται ότι οι συσχετίσεις υφίστανται στατικά μεταξύ κλάσεων και δημιουργούν την "υποδομή" για τη σύνδεση αντικειμένων. Απλώς και μόνο η ύπαρξη μια συσχέτισης δεν οδηγεί αυτομάτως και σε δημιουργία συνδέσεων μεταξύ των αντικειμένων. Οι συνδέσεις δημιουργούνται δυναμικά κατά τη διάρκεια της εκτέλεσης και μπορούν να μεταβάλλονται ή να καταστρέφονται. (για παράδειγμα η αναφορά mycourse του αντικειμένου S1 μπορεί να τροποποιηθεί στη συνέχεια ώστε να "δείχνει" σε άλλο μάθημα). Ένα αντικείμενο τύπου Student μπορεί να αξιοποιήσει τη γνώση του συσχετισμένου μαθήματος ώστε να αποστείλει μηνύματα σε αυτό είτε για την εκτέλεση λειτουργιών είτε για την άντληση δεδομένων. Στον παρακάτω πλήρη κώδικα της κλάσης Student η μέθοδος printinfo έχει τροποποιηθεί ώστε μαζί με τα στοιχεία του φοιτητή να εκτυπώνονται και στα στοιχεία του συσχετιζόμενου μαθήματος. public class Student { private String name; private String id; private Course mycourse; //αναφορά προς αντικείμενο τύπου Course public Student(String text1, String text2) { name = text1; id = text2; public Student(String text1) { name = text1; id = "9999";

Αντικειμενοστρεφής Προγραμματισμός Τμήμα Εφαρμοσμένης Πληροφορικής public void setmycourse(course c) { mycourse = c; public String getname() { return name; public String getid() { return id; public void printinfo() { System.out.println("Name: " + name); System.out.println("AM: " + id); System.out.println("Course: " + mycourse.getname()); System.out.println("Credits: " + mycourse.getcredits()); Δημιουργία αμφίδρομης συσχέτισης με πολλαπλότητα Στην περίπτωση που θέλουμε να μοντελοποιήσουμε και το ότι ένα μάθημα "γνωρίζει" τους φοιτητές που είναι εγγεγραμμένοι σε αυτό θα πρέπει να δημιουργήσουμε και μια συσχέτιση αντίθετης φοράς (από την κλάση Μάθημα προς την κλάση Φοιτητής). Επιπλέον, επειδή στη συνήθη περίπτωση πολλοί φοιτητές εγγράφονται σε ένα μάθημα, η αντίστοιχη συσχέτιση πρέπει να έχει πολλαπλότητα "πολλά", που υποδηλώνει ότι ένα αντικείμενο τύπου Μάθημα μπορεί να συσχετιστεί με πολλά αντικείμενα τύπου Φοιτητής. Σε επίπεδο διαγράμματος κλάσεων μια τέτοια αμφίδρομη συσχέτιση απεικονίζεται ως εξής (το σύμβολο '*' υποδηλώνει "πολλά": - id Student - credits Course * Για λόγους απλούστευσης του διαγράμματος, όταν μια συσχέτιση είναι αμφίδρομη δεν απεικονίζεται ως δύο διαφορετικές ακμές αλλά ως μια γραμμή χωρίς βέλη (υπονοούνται βέλη και προς τις δύο κατευθύνσεις). Επίσης, για την απλοποίηση του παραδείγματος υποθέτουμε ότι σε ένα μάθημα μπορούν να εγγραφούν το πολύ 100 φοιτητές (από 0 έως 100) και κατά συνέπεια το σύμβολο της πολλαπλότητας τροποποιείται ανάλογα: - id Student * - credits Course

Αλέξανδρος Χατζηγεωργίου, 2012 Πώς υλοποιείται όμως μια τέτοια συσχέτιση από την κλάση Course προς την κλάση Student; Ακριβώς όπως η συσχέτιση από την κλάση Student προς την κλάση Course υλοποιήθηκε ως μια αναφορά τύπου Course μέσα στην κλάση Student, κατά ανάλογο τρόπο απαιτείται η προσθήκη πολλών αναφορών τύπου Student μέσα στην κλάση Course. Προφανώς δεν έχει νόημα η δημιουργία 100 ιδιοτήτων τύπου Student, αλλά η δημιουργία ενός πίνακα 100 θέσεων όπου κάθε θέση είναι μια αναφορά που μπορεί εν δυνάμει να "δείξει" προς ένα αντικείμενο τύπου Student. Αν δηλαδή θεωρήσουμε ένα αντικείμενο Course μπορούμε να θεωρήσουμε ότι φιλοξενεί έναν πίνακα αναφορών προς Student, που επιτρέπει στο μάθημα να συσχετιστεί με έως 100 φοιτητές, όπως φαίνεται στο παρακάτω σχήμα: John 1209... Java 5 Bob 1110 Σε επίπεδο κώδικα απαιτείται η προσθήκη μιας ιδιότητας στην κλάση Course υπό μορφή πίνακα 100 θέσεων όπου κάθε θέση αποτελεί αναφορά προς αντικείμενα Student: private Student[] enrolledstudents = new Student[100]; Τονίζεται για ακόμα μια φορά η αναγκαιότητα χρήσης ονομάτων που εκφράζουν όσο το δυνατόν περισσότερο την σημασία κάθε μεταβλητής. Επίσης, αξίζει να σημειωθεί ότι ένας πίνακας αποτελεί αντικείμενο στην Java και κατά συνέπεια πριν από τη χρήση του πίνακα απαιτείται η κατασκευή του αντίστοιχου αντικειμένου με χρήση της δεσμευμένης λέξης new. Όπως ακριβώς η κλάση Student είχε εφοδιαστεί με μέθοδο (setmycourse) που επέτρεπε στα αντικείμενα άλλων κλάσεων να θέτουν τιμή στην αναφορά mycourse ενός φοιτητή (και ουσιαστικά να συνδέουν έναν φοιτητή με ένα μάθημα), και η κλάση Course θα πρέπει να εφοδιαστεί με μέθοδο που να επιτρέπει την καταχώρηση τιμών στον πίνακα enrolledstudents (ουσιαστικά να καταχωρούν φοιτητές σε ένα μάθημα). Λόγω της χρήσης του πίνακα απαιτείται η ύπαρξη ενός μετρητή εγγεγραμμένων φοιτητών, έτσι ώστε κάθε νέος φοιτητής να εγγράφεται στην επόμενη ελεύθερη θέση του πίνακα enrolledstudents. Για το λόγο αυτό προστίθεται μια ιδιότητα counter στην κλάση Μάθημα που αντιπροσωπεύει τον αριθμό των ήδη εγγεγραμμένων φοιτητών: private int counter = 0; //δηλώνουμε ρητά ότι ο μετρητής μηδενίζεται κατά //την κατασκευή ενός μαθήματος (αν ο μηδενισμός μιας //int μεταβλητής είναι εγγυημένος στην Java) Η μέθοδος καταχώρησης ενός φοιτητή σε μάθημα, σε απλή μορφή (χωρίς τον έλεγχο της υπέρβασης των διαθέσιμων θέσεων του πίνακα) θα μπορούσε να γραφεί ως εξής: public void addstudent(student s) {

Αντικειμενοστρεφής Προγραμματισμός Τμήμα Εφαρμοσμένης Πληροφορικής enrolledstudents[counter] = s; counter++; //καταχώρηση της τιμής της αναφοράς s //στην επόμενη ελεύθερη θέση του πίνακα //αύξηση του μετρητή ώστε να δείχνει στην //επόμενη ελεύθερη θέση Έχοντας στη διάθεσή μας μια συσχέτιση μεταξύ Μαθήματος και Φοιτητών, μπορούμε στη μέθοδο main (ή στον κώδικα οποιασδήποτε άλλης κλάσης) να δημιουργήσουμε αντικείμενα τύπου φοιτητής, να δημιουργήσουμε αντικείμενα τύπου Μάθημα και να εγγράψουμε φοιτητές σε κάποιο μάθημα, αποστέλλοντας το μήνυμα addstudent() στο αντίστοιχο αντικείμενο Μάθημα, μεταβιβάζοντας ως όρισμα το αντικείμενο Φοιτητή (την αναφορά προς αυτό): public class Main { public static void main(string[] args) { Student S1 = new Student("John", "1209"); Student S2 = new Student("Nick", "1709"); Course C1 = new Course("Math101"); S1.setMyCourse(C1); S2.setMyCourse(C2); C1.addStudent(S1); C1.addStudent(S2); από τις εντολές C1.addStudent(S1); C1.addStudent(S2); και μετά, το αντικείμενο C1 (μάθημα Math101) είναι συνδεδεμένο με τους φοιτητές S1 και S2, και κατά συνέπεια μπορεί να αποστείλει μηνύματα σε αυτά. Για παράδειγμα, μπορούμε να εφοδιάσουμε την κλάση Μάθημα με μια μέθοδο εκτύπωσης των στοιχείων των φοιτητών που είναι εγγεγραμμένοι σε ένα μάθημα. Για την υλοποίηση της λειτουργίας, απαιτείται η αλληλεπίδραση του μαθήματος με τους εγγεγραμμένους φοιτητές (αποστέλλοντας μηνύματα) ώστε να προκληθεί η εκτύπωση του ονόματος και του αριθμού μητρώου κάθε φοιτητή. Δεδομένου ότι οι φοιτητές μπορεί να είναι πολλοί, απαιτείται σάρωση της δομής δεδομένων που περιλαμβάνει τις αναφορές προς τους εγγεγραμμένους φοιτητές και την αποστολή κατάλληλου μηνύματος εκτύπωσης των στοιχείων. Η αντίστοιχη μέθοδος στην κλάση Course είναι: public void printstudentsinfo() { for(int i=0; i<counter; i++) { enrolledstudents[i].printinfo(); Δημιουργία αμφίδρομης συσχέτισης με πολλαπλότητα - χρήση δομής ArrayList

Αλέξανδρος Χατζηγεωργίου, 2012 Οι πίνακες ως δομές δεδομένων έχουν δύο μειονεκτήματα: είναι στατικοί ως προς το μέγεθος (δηλαδή το μέγεθός τους δεν μπορεί να μεταβληθεί κατά τη διάρκεια της εκτέλεσης του προγράμματος) και είναι στατικοί ως προς τον τύπο δεδομένων (δηλαδή αν δηλώσουμε ότι ένας πίνακας περιλαμβάνει στοιχεία του τύπου Α, δεν μπορούμε στην πορεία να εισάγουμε στοιχεία άλλου τύπου). H Java διαθέτει μια πλούσια συλλογή ισχυρών, καλά σχεδιασμένων και αποδοτικών δομών δεδομένων (Collection API) που ενδείκνυνται για όλα σχεδόν τα προβλήματα που μπορεί να αντιμετωπίσει ένας προγραμματιστής. Η πλέον συνηθισμένη και εύκολη δομή δεδομένων είναι η ArrayList που συμπεριφέρεται ως δυναμικός πίνακας (άρα είναι εύκολη στη χρήση) και επιπλέον δεν ισχύουν οι 2 περιορισμοί των πινάκων. Το μέγεθος της δομής μεταβάλλεται αυτόματα (μεγαλώνει) αν παραστεί ανάγκη κατά την εκτέλεση του προγράμματος. Για να χρησιμοποιήσουμε ένα ArrayList πρέπει να δημιουργήσουμε ένα στιγμιότυπο (αντικείμενο) της αντίστοιχης κλάσης: ArrayList enrolledstudents = new ArrayList(); Σε μια δομή τύπου ArrayList μπορούν να καταχωρηθούν αντικείμενα οποιουδήποτε τύπου (δεδομένου ότι οποιαδήποτε κλάση στην Java είναι υποκλάση της Object). Το πρόβλημα με αυτή την "ελευθερία" είναι ότι σε περίπτωση που "εξαχθεί" ένα αντικείμενο από μια θέση της δομής απαιτείται ρητή μετατροπή τύπου ώστε να μπορέσουμε να "χρησιμοποιήσουμε" το αντικείμενο. Π.χ. αν θέλουμε να εξάγουμε το 6ο στοιχείο μιας δομής στην οποία έχουν καταχωρηθεί αντικείμενα τύπου Student θα πρέπει να γίνει μετατροπή τύπου ως εξής: Student sixthstudent = (Stundet) enrolledstudents.get(5); Κάτι τέτοιο δεν είναι πάντοτε βολικό, ειδικά για τις περιπτώσεις όπου γνωρίζουμε ότι σε μια δομή ArrayList θα καταχωρηθούν αντικείμενα ενός μόνο τύπου. Για το λόγο αυτό μπορούμε να αξιοποιήσουμε τη δυνατότητα που παρέχεται από την έκδοση της Java 1.5 και μετά των generics (γενικευμένων τύπων) που επιτρέπουν να δηλώσουμε μια δομή δεδομένων υποδεικνύοντας τον τύπο δεδομένων των στοιχείων που θα περιλαμβάνουν. Στην περίπτωση αυτή δεν απαιτείται μετατροπή τύπου κατά την εξαγωγή στοιχείων και επιπλέον δεν επιτρέπεται η εισαγωγή στοιχείων άλλου τύπου (type safety). Η δήλωση είναι ως εξής: ArrayList<Student> enrolledstudents = new ArrayList<Student>(); Για την καταχώρηση ενός στοιχείου σε μια δομή ArrayList χρησιμοποιείται η μέθοδος add() και για την εξαγωγή ενός στοιχείου που βρίσκεται στη θέση με αριθμοδείκτη i η μέθοδος get(i). Για την εύρεση του πλήθους στοιχείων μιας δομής ArrayList διατίθεται η μέθοδος size(). Επομένως, ο πλήρης κώδικας της κλάσης Course με τη χρήση ArrayList είναι: import java.util.*; public class Course { private String name; private ArrayList<Student> enrolledstudents; private int counter;

Αντικειμενοστρεφής Προγραμματισμός Τμήμα Εφαρμοσμένης Πληροφορικής public Course(String text) { name = text; enrolledstudents = new ArrayList<Student>(); counter = 0; public void addstudent(student s) { enrolledstudents.add(s); public void printstudentsinfo() { System.out.println("Course: " + name); System.out.println("--------"); for(int i=0; i<enrolledstudents.size(); i++) { Student s = enrolledstudents.get(i); s.printinfo(); public String getname() { return name; Χρήση του δείκτη this Στο ανωτέρω πρόγραμμα κάθε φοιτητής διατηρεί μια αναφορά προς το μάθημα που παρακολουθεί και κάθε Μάθημα προς τους φοιτητές που είναι εγγεγραμμένοι σε αυτό. Κατά συνέπεια απαιτείται η καταχώρηση της αναφοράς ενός μαθήματος σε έναν φοιτητή και επίσης η καταχώρηση των φοιτητών που παρακολουθούν ένα Μάθημα. Προφανώς κάτι τέτοιο θα ήταν άνευ νοήματος σε ένα πραγματικό σύστημα και το ζητούμενο θα ήταν για παράδειγμα, κατά την εγγραφή ενός φοιτητή σε ένα μάθημα, αυτομάτως να ενημερώνεται και ο φοιτητής για το μάθημα που παρακολουθεί. Αυτό επιτυγχάνεται σε αντικειμενοστρεφείς γλώσσες όπως η Java μόνο μέσω της αναφοράς this. Κάθε αντικείμενο διατηρεί μια αναφορά που "δείχνει" προς το ίδιο το αντικείμενο. Η αναφορά αυτή λαμβάνεται από τη δεσμευμένη λέξη this. Με άλλα λόγια, όταν εκτελείται κώδικας επί ενός αντικειμένου (μέσα σε κάποια μέθοδο) η αναφορά this δείχνει πάντοτε προς το ίδιο το αντικείμενο, δηλαδή το αντικείμενο στο οποίο εκτελείται ο κώδικας. Επομένως, κάθε αντικείμενο έχει γνώση της αναφοράς του "εαυτού του" την οποία μπορεί να μεταβιβάσει σε άλλα αντικείμενα, αν θέλει να τους γνωστοποιήσει τη διεύθυνσή του. Στα πλαίσια του ανωτέρου παραδείγματος, μέσα στον κώδικα της μεθόδου addstudent(student s) στην κλάση Course, μετά την εγγραφή του φοιτητή στο μάθημα: enrolledstudents.add(s); υπάρχει η δυνατότητα αποστολής της αναφοράς this (που σύμφωνα με όσα αναφέρθηκαν θα "δείχνει" στο αντικείμενο Μάθημα όπου εκείνη τη στιγμή εκτελείται η εγγραφή φοιτητών) στον αντίστοιχο φοιτητή (που είναι γνωστός μέσω της αναφοράς s που λαμβάνεται ως παράμετρος). Κατά συνέπεια αποστέλλοντας το μήνυμα setmycourse() προς τον φοιτητή s, με παράμετρο την αυτοαναφορά this, γνωστοποιούμε στον φοιτητή ποιο είναι το μάθημα και ο φοιτητή αυτομάτως καταχωρεί το μάθημα στην αναφορά mycourse που διαθέτει.

Αλέξανδρος Χατζηγεωργίου, 2012 Με αυτόν τον τρόπο οποτεδήποτε καλείται η μέθοδος addstudent() επί ενός Μαθήματος, επιτυγχάνονται και οι 2 στόχοι, δηλαδή αφενός η εγγραφή του φοιτητής στο Μάθημα και αφετέρου η σύνδεση του Φοιτητή με το αντίστοιχο μάθημα. Ο κώδικας της μεθόδου addstudent() θα είναι ως εξής: public void addstudent(student s) { enrolledstudents.add(s); s.setmycourse(this); Οι σχετικές ενέργειες θα μπορούσαν να αναπαρασταθούν γραφικά ως εξής: John 1209 S1 2: καταχώρηση της αναφοράς S1 στη λίστα φοιτητών 3: αποστολή μηνύματος setmycourse(this) 4: καταχώρηση της αναφοράς this στην αναφορά προς Μάθημα του φοιτητή S1... Java 5 this 1: αποστολή μηνύματος addstudent(s1)