Προγράμματα με δομή Κληρονομικότητας
Επέκταση ιεραρχίας με νέες κλάσεις
Επέκταση ιεραρχίας με νέες κλάσεις Οι κλάσεις που δεν προορίζονται για δημιουργία στιγμιοτύπων, αλλά προορίζονται να χρησιμοποιηθούν αποκλειστικά ως υπερκλάσεις για άλλες κλάσεις ονομάζονται αφηρημένες κλάσεις (abstract classes).
ΗκλάσηDatabase Πριν την κληρονομικότητα public class Database private ArrayList<CD> cds; private ArrayList<DVD> dvds; public Database() cds = new ArrayList<CD>(); dvds = new ArrayList<DVD>(); public void list() // print list of CDs for(cd cd : cds) cd.print(); System.out.println(); public void addcd(cd thecd) cds.add(thecd); public void adddvd(dvd thedvd) dvds.add(thedvd); // print list of DVDs for(dvd dvd : dvds) dvd.print(); System.out.println();
ΗκλάσηDatabase Μετά public class Database private ArrayList<Item> items; public Database() items = new ArrayList<Item>(); public void additem(item theitem) items.add(theitem); public void list() for(item item : items) item.print(); System.out.println();
Υποκλάσεις και υποτύποι Εντολές ανάθεσης Car mycar = new Car(); Vehicle v1 = new Vehicle(); Vehicle v2 = new Car(); Vehicle v3 = new Bicycle(); Car c1 = new Vehicle(); // αυτό είναι λάθος!
Υποκλάσεις και υποτύποι Πολυμορφικές μεταβλητές Οι μεταβλητές που αποθηκεύουν τύπους αντικειμένων στη Java ονομάζονται πολυμορφικές. Ο όρος αναφέρεται στο γεγονός ότι μια μεταβλητή μπορεί να αποθηκεύει αντικείμενα διαφορετικών τύπων (δηλ. του δηλωμένου τύπου ή οποιουδήποτε υποτύπου αυτού) for(item item : items) item.print(); System.out.println();
Υποκλάσεις και υποτύποι Προσαρμογή ρμ τύπου Ορισμένες φορές ο κανόνας ότι δε μπορούμε να κάνουμε ανάθεση μιας μεταβλητής ενός υπερτύπου σε έναν υποτύπο μας περιορίζει περισσότερο από ότι χρειάζεται. Vehicle v; Car c = new Car(); v = c; //σωστό c = v; // λάθος Vehicle v; Car c = new Car(); v = c; //σωστό c = (Car) v; // σωστό τελεστής προσαρμογής ής ρ ρμ γής τύπου
Υποκλάσεις και υποτύποι Προσαρμογή τύπου Vehicle v; Car c; Bicycle b; c = new Car(); v = c; //σωστό b = (Bicycle) c; //σφάλμα μεταγλώττισης b = (Bicycle) v; //σφάλμα χρόνου εκτέλεσης Οι τύποι Car και Bicycle δεν έχουν σχέση υποτύπου/υπερτύπου. Η προσαρμογή τύπου πρέπει να αποφεύγεται ρ ρμ γή ρ φ γ οποτεδήποτε είναι δυνατό γιατί μπορεί να οδηγήσει σε σφάλματα εκτέλεσης.
ΗκλάσηObject Όλες οι κλάσεις έχουν μια υπερκλάση, είτε αυτή δηλώνεται είτε δε δηλώνονται ως υποκλάσεις. Η κλάση Object είναι κλάση της πρότυπης βιβλιοθήκης της Java η οποία λειτουργεί ως υπερκλάση για όλα τα αντικείμενα. public class Person... public class Person extends Object... Η ύπαρξη κοινής υπερκλάσης για όλα τα αντικείμενα εξυπηρετεί δύο σκοπούς: Μπορούμε να δηλώσουμε πολυμορφικές μεταβλητές τύπου Object που μπορούν να περιέχουν οποιοδήποτε αντικείμενο (δε χρησιμοποιείται συχνά) Η κλάση Object ορίζει κάποιες μεθόδους οι οποίες στη συνέχεια είναι αυτόματα διαθέσιμες σε κάθε αντικείμενο.
ΗκλάσηObject............
Αυτόματη πλαισίωση & κλάσεις περιτύλιξης Οι τιμές των απλών τύπων (π.χ. int, boolean) δεν είναι αντικείμενα και άρα δε κληρονομούν από την κλάση Object. Άρα δεν είναι δυνατό να τους προσθέσουμε σε μια συλλογή. Τι γίνεται αν θέλουμε να δημιουργήσουμε μια λίστα ακεραίων; xρησιμοποιούμε κλάση περιτύλιξης (wrapper class), π.χ. η κλάση περιτύλιξης του τύπου int λέγεται Integer
Αυτόματη πλαισίωση & κλάσεις περιτύλιξης Ρητή ηήπεριτύλιξη: Integer iwrap = new Integer(ix); έτσι ώστε η iwrap να μπορεί να αποθηκευτεί σε μια συλλογή ArrayList<Integer> Αυτόματη πλαισίωση (autoboxing): οποτεδήποτε χρησιμοποιείται μια τιμή ενός θεμελιώδους τύπου σε μια κατάσταση που απαιτεί τύπο αντικειμένου, ο μεταγλωττιστής περιτυλίγει αυτόματα την τιμή του θεμελιώδους τύπου σε ένα κατάλληλο αντικείμενο περιτύλιξης: private ArrayList<Integer> marklist;... public void storemarkinlist(int mark) marklist.add(mark);
Αυτόματη πλαισίωση & κλάσεις περιτύλιξης Η αντίστροφη διαδικασία (αποπλαισίωση) εκτελείται και αυτή αυτόματα: int firstmark = marklist.remove(0); remove(0); Η αυτόματη πλαισίωση εφαρμόζεται επίσης οποτεδήποτε μια τιμή θεμελιώδους τύπου μεταβιβάζεται ως παράμετρος σε μια μέθοδο που αναμένει τύπο περιτύλιξης και όταν μια τιμή ενός θεμελιώδους τύπου αποθηκεύεται σε μια μεταβλητή ενός τύπου περιτύλιξης. Αντίστοιχα και η αποπλαισίωση.