ΑΤΕΙ Θεσσαλονίκης Τμήμα Πληροφορικής

Σχετικά έγγραφα
ΕΠΛ233 ΠΟΛΥΜΟΡΦΙΣΜΟΣ

ΑΤΕΙΘ - ΣΤΕΦ Τμήμα Πληροφορικής

ΕΠΛ233 ΔΙΑΠΡΟΣΩΠΕΙΕΣ

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Υπερφόρτωση (Overloading) Υπέρβαση (Overriding) - Upcasting Downcasting Final classes, methods

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

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

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

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

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

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

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

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

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

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

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

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

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Προσομοίωση παρακολούθησης πληθυσμών αλεπούδων και κουνελιών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

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

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

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

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

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

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

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

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

Αντικείμενα στη Java. Παύλος Εφραιμίδης. Java Αντικείμενα στη Java 1

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

Διδάσκων: Παναγιώτης Ανδρέου

ΕΠΛ233 ΠΛΗΡΟΦΟΡΙΑ ΤΥΠΟΥ. Type Information. Μ. Δικαιάκος

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

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

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

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

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

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

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

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

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

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

Αντικείμενα (Objects) στην Java. Αντικείμενα στη Java. Δημιουργία Αντικειμένων. Δηλώσεις Μεταβλητών (2) Ο τελεστής new (1)

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

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

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 9: Κληρονομικότητα (Inheritance)

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

Από τη UML στον Κώδικα. Μέρος Α

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα Downcasting Πολυμορφισμός Late Binding

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

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

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

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

2.1. Εντολές Σχόλια Τύποι Δεδομένων

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

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

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

(Διαφάνειες Νίκου Βιδάκη)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

Προγράμματα με δομή Κληρονομικότητας

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής - Εβδομάδα 1

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

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

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

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

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

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

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

Προγραμματισμός ΙΙ. 2. Μέθοδοι. (Java)

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

Κάποιες γενικές παρατηρήσεις:

Αντικειμενοστρέφεια. Ορισμοί αντικειμενοστρέφειας. Κάποιες γενικές παρατηρήσεις: Περιεχόμενα. Ποιοι είναι οι ορισμοί των παρακάτω;

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, 1908

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

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Transcript:

Αντικειμενοστρεφής Προγραμματισμός adamidis@it.teithe.gr Abstract classes, δομητές και πολυμορφισμός, finalize, downcasting Αφηρημένες (abstract) κλάσεις Είναι πάντα βασικές κλάσεις μιας ιεραρχίας κλάσεων. Στόχος των αφηρημένων κλάσεων είναι να χειριστούμε ένα σύνολο κλάσεων μέσω μίας κοινής διασύνδεσης. Στα προηγούμενα παραδείγματα η κλάση Instrument χρησιμοποιείται για να δημιουργήσει την κοινή διασύνδεση. Δηλώνουμε μία υπερκλάση που να καθορίζει μόνο την γενική μορφή η οποία θα χρησιμοποιείται από κοινού από όλες τις υποκλάσεις, αφήνοντας σε κάθε υποκλάση την δυνατότητα να συμπληρώνει από μόνη της τις επιμέρους λεπτομέρειες. Δεν είναι δυνατό να δημιουργηθούν αντικείμενα αφηρημένων κλάσεων. Αφηρημένες (abstract) μέθοδοι 1/2 Οι αφηρημένες μέθοδοι δεν είναι πλήρεις. Σύνταξη: abstract <τύπος> <όνομα>([<λίστα_παραμέτρων>]); Εάν μία κλάση περιέχει τουλάχιστον μία αφηρημένη μέθοδο τότε η κλάση πρέπει να δηλωθεί ως abstract. Ο τροποποιητής abstract δεν μπορεί να εφαρμοστεί σε μεθόδους static ή σε δομητές (constructors). (Γιατί;) Αφηρημένες (abstract) μέθοδοι 2/2 Εάν κάποια κλάση κληρονομεί μία αφηρημένη κλάση τότε σε αυτή θα πρέπει οπωσδήποτε να οριστούν πλήρως οι αφηρημένες μέθοδοι. Εάν δεν οριστούν τότε και η υποκλάση θα είναι αφηρημένη και φυσικά δεν μπορούμε να δημιουργήσουμε αντικείμενα της υποκλάσης. Προσοχή: Δεν είναι απαραίτητο να οριστούν ως abstract όλες οι μέθοδοι μίας abstract κλάσης. Αντιθέτως, είναι δυνατό μία abstract κλάση να μην έχει μεθόδους abstract. Αφηρημένες κλάσεις και μέθοδοι Παράδειγμα Wind Woodwind abstract Instrument abstract ; { /*... */ abstract ; Percussion Brass Stringed abstract class Instrument { int i; // storage allocated for each public abstract ; public { return "Instrument"; public abstract ; class Wind extends Instrument { public { System.out.println("Wind.play()"); public { return "Wind"; public { class Percussion extends Instrument { public { System.out.println("Percussion.play()"); public { return "Percussion"; public { 1

class Stringed extends Instrument { public { System.out.println("Stringed.play()"); public { return "Stringed"; public { class Brass extends Wind { public { System.out.println("Brass.play()"); public { System.out.println("Brass.adjust()"); class Woodwind extends Wind { public { System.out.println("Woodwind.play()"); public { return "Woodwind"; public class Music4 { static void tune(instrument i) { //... i.play(); static void tuneall(instrument[] e) { for(int i = 0; i < e.length; i++) tune(e[i]); Instrument[] orchestra = new Instrument[5]; int i = 0; orchestra[i++] = new Wind(); orchestra[i++] = new Percussion(); orchestra[i++] = new Stringed(); orchestra[i++] = new Brass(); orchestra[i++] = new Woodwind(); tuneall(orchestra); Παράδειγμα (4) : Σειρά κλήσης EΞΟΔΟΣ: Wind.play() Percussion.play() Stringed.play() Brass.play() Woodwind.play() Η μνήμη που ανατίθεται στο αντικείμενο αρχικοποιείται στο δυαδικό μηδέν. Κλήση του δομητή της βασικής κλάσης. Το βήμα επαναλαμβάνεται μέχρι την ρίζα της ιεραρχίας. Αρχικοποίηση μελών με την σειρά που δηλώνονται Κλήση του δομητή της παραγόμενης κλάσης class Meal { Meal() { System.out.println("Meal()"); class Bread { Bread() { System.out.println("Bread()"); class Cheese { Cheese() { System.out.println("Cheese()"); class Lettuce { Lettuce() { System.out.println("Lettuce()"); class Lunch extends Meal { Lunch() { System.out.println("Lunch()"); class PortableLunch extends Lunch { PortableLunch() { System.out.println("PortableLunch()"); class Sandwich extends PortableLunch { Bread b = new Bread(); Cheese c = new Cheese(); Lettuce l = new Lettuce(); Sandwich() { System.out.println("Sandwich()"); new Sandwich(); 2

EΞΟΔΟΣ: Meal() Lunch() PortableLunch() Bread() Cheese() Lettuce() Sandwich() Κατά την υπέρβαση της finalize() πρέπει να καλέσουμε την finalize() της βασικής κλάσης class DoBaseFinalization { public static boolean flag = false; class Characteristic { String s; Characteristic(String c) { s = c; System.out.println("Creating Characteristic " + s); protected void finalize() { System.out.println("finalizing Characteristic " + s); Κατά την υπέρβαση της finalize() πρέπει να καλέσουμε την finalize() της βασικής κλάσης class DoBaseFinalization { public static boolean flag = false; class Characteristic { String s; Characteristic(String c) { s = c; System.out.println("Creating Characteristic " + s); protected void finalize() { System.out.println("finalizing Characteristic " + s); class LivingCreature { Characteristic p = new Characteristic("is alive"); LivingCreature() {System.out.println("LivingCreature()"); System.out.println("LivingCreature finalize"); // Call base-class version LAST! class Animal extends LivingCreature { Characteristic p = new Characteristic("has heart"); Animal() { System.out.println("Animal()"); System.out.println("Animal finalize"); class Amphibian extends Animal { Characteristic p = new Characteristic("can live in water"); Amphibian() { System.out.println("Amphibian()"); System.out.println("Amphibian finalize"); if (DoBaseFinalization.flag) super.finalize(); Παράδειγμα (4) public class Frog extends Amphibian { Frog() { System.out.println("Frog()"); System.out.println("Frog finalize"); if (args.length!= 0 && args[0].equals("finalize")) DoBaseFinalization.flag = true; else System.out.println("Not finalizing bases"); new Frog(); // Instantly becomes garbage System.out.println("Bye!"); // Force finalizers to be called: System.gc(); 3

Παράδειγμα - Έξοδος java Frog Not finalizing bases Creating Characteristic is alive LivingCreature() Creating Characteristic has heart Animal() Creating Characteristic can live in water Amphibian() Frog() Bye! Frog finalize finalizing Characteristic is alive finalizing Characteristic has heart finalizing Characteristic can live in water Παράδειγμα - Έξοδος java Frog finalize Creating Characteristic is alive LivingCreature() Creating Characteristic has heart Animal() Creating Characteristic can live in water Amphibian() Frog() Bye! Frog finalize Amphibian finalize Animal finalize LivingCreature finalize finalizing Characteristic is alive finalizing Characteristic has heart finalizing Characteristic can live in water Κλήση πολυμορφικών μεθόδων από δομητές abstract class Glyph { abstract void draw(); Glyph() { System.out.println("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()"); class RoundGlyph extends Glyph { int radius = 1; RoundGlyph(int r) { radius = r; System.out.println( "RoundGlyph.RoundGlyph(), radius = " + radius); Κλήση πολυμορφικών μεθόδων από δομητές void draw() { System.out.println( "RoundGlyph.draw(), radius = " + radius); public class PolyConstructors { new RoundGlyph(5); java PolyConstructors Glyph() before draw() RoundGlyph.draw(), radius = 0 Glyph() after draw() RoundGlyph.RoundGlyph(), radius = 5 : Συμβουλές Κατά τον πολυμορφισμό: Οι δομητές να επιφορτιστούν μόνο με την ικανοποιητική αρχικοποίηση των αντικειμένων και όχι με περισσότερες λειτουργίες. Αποφύγετε την κλήση μεθόδων από δομητές. Οι μόνες ασφαλείς μέθοδοι είναι οι μέθοδοι final και οι private (εμμέσως final) Downcasting (1) Η βασική κλάση μπορεί να δεχθεί μηνύματα από κάποια υποκλάση της αφού έχουν την ίδια βασική διασύνδεση/ συμπεριφορά. Έτσι το upcasting είναι μία απλή υπόθεση. Η υποκλάση έχει επιπλέον στοιχεία τα οποία απαιτούν την υλοποίηση επιπλέον μεθόδων. Από την βασική κλάση δεν έχουμε πρόσβαση στις επιπλέον μεθόδους. Έτσι μετά το upcast δεν μπορούμε να καλέσουμε τις νέες μεθόδους. Πρέπει να βρούμε τον ακριβή τύπο του αντικειμένου για να μπορέσουμε να χρησιμοποιήσουμε τις επιπλέον μεθόδους. Η μετακίνηση προς τα κάτω της ιεραρχίας των κλάσεων (η μετατροπή σε αντικείμενο τύπου υποκλάσης) ονομάζεται downcast. 4

Downcasting (2) Το upcast είναι ασφαλές. Για το downcast ο compiler απαιτεί να δηλωθεί ο τύπος μετατροπής. Για παράδειγμα ο κύκλος είναι σχήμα, αλλά ένα σχήμα μπορεί να είναι κύκλος, τρίγωνο ή κάτι άλλο. Η Java ελέγχει όλες τις μετατροπές τύπων κατά την εκτέλεση του προγράμματος (Run-time type identification - RTTI) και επιβεβαιώνει την σωστή μετατροπή. Εάν ο τύπος είναι λάθος έχουμε ClassCastException. Downcasting - Παράδειγμα class Useful { public void f() {System.out.println("Useful.f()"); public void g() {System.out.println("Useful.g()"); class MoreUseful extends Useful { public void f() {System.out.println("MoreUseful.f()"); public void g() {System.out.println("MoreUseful.g()"); public void u() {System.out.println("MoreUseful.u()"); public void v() {System.out.println("MoreUseful.v()"); public void w() {System.out.println("MoreUseful.w()"); public class RTTI { Useful[] x = { new Useful(), new MoreUseful() ; x[0].f(); x[1].g(); //! x[1].u(); if (x[1] instanceof MoreUseful) ((MoreUseful)x[1]).u(); ((MoreUseful)x[0]).u(); // Exception thrown Downcasting Παράδειγμα (instanceof) class Useful { public void f() {System.out.println("Useful.f()"); public void g() {System.out.println("Useful.g()"); class MoreUseful extends Useful { public void f() {System.out.println("MoreUseful.f()"); public void g() {System.out.println("MoreUseful.g()"); public void u() {System.out.println("MoreUseful.u()"); public void v() {System.out.println("MoreUseful.v()"); public void w() {System.out.println("MoreUseful.w()"); public class RTTI { Useful[] x = { new Useful(), new MoreUseful() ; x[0].f(); x[1].g(); //! x[1].u(); if (x[1] instanceof MoreUseful) ((MoreUseful)x[1]).u(); if (x[0] instanceof MoreUseful) ((MoreUseful)x[0]).u(); 5