java:inheritance

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:inheritance [2015/02/13 13:01]
gthanos
java:inheritance [2015/02/13 14:01]
gthanos [Implicit και Explicit Casting of Objects]
Line 4: Line 4:
  
 {{  :​java:​super_sub_class.jpg ​ | }} {{  :​java:​super_sub_class.jpg ​ | }}
- 
  
 Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//​subclass//​) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//​superclass//​) μπορεί να κληρονομεί πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε το παράδειγμα κληρονομικότητας που παρουσιάσαμε νωρίτερα ελαφρά παραλλαγμένο. Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//​subclass//​) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//​superclass//​) μπορεί να κληρονομεί πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε το παράδειγμα κληρονομικότητας που παρουσιάσαμε νωρίτερα ελαφρά παραλλαγμένο.
Line 96: Line 95:
   * Μπορούμε να γράψουμε νέες μεθόδους που έχουν το ίδιο //​signature//​ (ίδιο όνομα, ίδιο αριθμό και ίδιο τύπο ορισμάτων),​ ώστε να επαναορίσουμε (//​override//​) τις μεθόδους αυτές στην υποκλάση. Η πρακτική αυτή είναι συνήθης.   * Μπορούμε να γράψουμε νέες μεθόδους που έχουν το ίδιο //​signature//​ (ίδιο όνομα, ίδιο αριθμό και ίδιο τύπο ορισμάτων),​ ώστε να επαναορίσουμε (//​override//​) τις μεθόδους αυτές στην υποκλάση. Η πρακτική αυτή είναι συνήθης.
   * Μπορούμε να γράψουμε νέες στατικές (//​static//​) μεθόδους που έχουν το ίδιο //​signature//,​ ώστε να επαναορίσουμε (//​override//​) τις μεθόδους αυτές στην υποκλάση. Επαναορίζοντας στατικές μεθόδους,​ κρύβουμε τις αντίστοιχες μεθόδους της γονικής κλάσης.   * Μπορούμε να γράψουμε νέες στατικές (//​static//​) μεθόδους που έχουν το ίδιο //​signature//,​ ώστε να επαναορίσουμε (//​override//​) τις μεθόδους αυτές στην υποκλάση. Επαναορίζοντας στατικές μεθόδους,​ κρύβουμε τις αντίστοιχες μεθόδους της γονικής κλάσης.
-  * +  * Μπορούμε να γράψουμε κατασκευαστές της υποκλάσης που χρησιμοποιούν κατασκευαστές της γονικής κλάσης. 
 + 
 +===== Implicit και Explicit Casting of Objects ===== 
 + 
 +Σε συνέχεια του προηγούμενου παραδείγματος κληρονομικότητας μπορούμε να γράψουμε 
 + 
 +<code java> 
 +MountainBike myBike = new MountainBike();​ 
 +</​code>​ 
 + 
 +Από την παραπάνω δήλωση η μεταβλητή ''​myBike''​ είναι τύπου ''​MountainBike''​. Επειδή όμως ο τύπος ''​MountainBike''​ κληρονομεί από την μεταβλητή ''​Bicycle''​ η συγκεκριμένη μεταβλητή είναι και τύπου Bicycle. Επομένως θα μπορούσαμε να γράψουμε 
 + 
 +<code java> 
 +Bicycle myBicycle = myBike; 
 +   //​ή 
 +Βicycle yourBicycle = new MountainBike();​ 
 +</​code>​ 
 + 
 +Την παραπάνω ανάθεση την ονομάζουμε //Implicit Casting// διότι αναθέτουμε μία μεταβλητή ενός τύπου δεδομένων (''​myBike''​) σε μία μεταβλητή γονικού τύπου δεδομένων (''​myBicycle''​),​ χωρίς type casting. 
 + 
 +Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα 
 + 
 +<code java> 
 +Bycycle myBicycle = new Bicycle();​ 
 +MountainBike myBike = myBicycle;​ 
 +</​code>​ 
 + 
 +Σε αυτή την περίπτωση ο compiler διαμαρτύρεται,​ διότι η μεταβλητή ''​myBicycle''​ είναι τύπου ''​Bicycle''​ και δεν είναι απαραίτητο ότι είναι και τύπου ''​MountainBike''​. Αν θέλουμε να ξεπεράσουμε το παραπάνω πρόβλημα θα πρέπει να γράψουμε το εξής: 
 + 
 +<code java> 
 +Bycycle myBicycle = new Bicycle();​ 
 +MountainBike myBike = (MountainBike) myBicycle;​ 
 +</​code>​ 
 + 
 +Εδώ ενημερώνουμε τον compiler ότι η μεταβλητή ''​myBicycle''​ είναι και τύπου ''​MountainBike'',​ λαμβάνοντας ο προγραμματιστής την ευθύνη ότι κάτι τέτοιο ισχύει. Εάν δεν ισχύει κάτι τέτοιο κατά την εκτέλεση του προγράμματος θα παραχθεί μία εξαίρεση (exception)*. Θα δούμε πιο κάτω τι είναι και πως διαχειριζόμαστε τις εξαιρέσεις. 
 + 
 +Ένας πιο ασφαλής τρόπος για να επαναλάβουμε τον παραπάνω κώδικα,​ χωρίς να παραχθεί εξαίρεση είναι ο εξής: 
 + 
 +<code java> 
 +Bycycle myBicycle = new Bicycle();​ 
 +MountainBike myBike; 
 +if (myBicycle instanceof MountainBike) { 
 +    myBike = (MountainBike)myBicycle;​ 
 +
 +</​code>​
  
 +|Προηγούμενο:​ [[ :​java:​interfaces | Διεπαφές ]] | Επόμενο:​ [[ :​java:​multiple_inheritance | Κληρονομικότητα πολλαπλών γονικών κλάσεων ]]|
  
java/inheritance.txt · Last modified: 2016/03/31 08:25 by doufexi