Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας,

έχω μια απορία στην κληρονομικότητα στη java.

Έστω ότι έχω μία κλάση Item και μία υποκλάση CD της Item.

Αν δημιουργήσω μία μεταβλητή τύπου Item και της δώσω ως τιμή ένα αντικείμενο της κλάσης CD

πχ. --> Item item = new CD();

τότε μέσω αυτής της μεταβλητής (item) ποιες μεθόδους της κλάσης CD μπορώ να καλέσω (αν μπορώ φυσικά να καλέσω κάποιες) ?

 

Επιπλέον, γνωρίζουμε ότι στη Java όλες οι κλάσεις κληρονομούν από την κλάση Object.

Αν τότε έχω μία κλάση Item και πάλι

δημιουργώντας μία μεταβλητή τύπου Object και αναθέτοντάς της ως τιμή ένα αντικείμενο τύπου Item ποιες μεθόδους της κλάσης Item μπορώ να καλέσω (αν μπορώ φυσικά να καλέσω κάποιες) ?

Γιατί δηλαδή να μην εκχωρώ οποιαδήποτε αντικείμενα - οποιασδήποτε κλάσης σε μεταβλητές τύπου Object πάντα ?

Ευχαριστώ πολύ για το χρόνο σας.

Δημοσ.

Τo Item Ιtem = new CD(); αν δεν κάνω λαθος ειναι ισοδύναμο με το CD item = new CD(); απλά στην πρώτη περίπτωση μπορείς να το αρχικοποιήσεις και με άλλες υποκλάσεις της Item ενώ στην δευτερη δεν μπορεις να κανεις κάτι τετοιο. Δηλαδή αν έχεις CD και Book υποκλάσεις της Item μπορεις να πεις:

 

>Item item;
item = new CD();
[...]
item =  newBook();

Ενώ αν το δηλώσεις ως CD απο την αρχή, δεν εχεις αυτην την δυνατότητα.

Δημοσ.

Τo Item Ιtem = new CD(); αν δεν κάνω λαθος ειναι ισοδύναμο με το CD item = new CD(); απλά στην πρώτη περίπτωση μπορείς να το αρχικοποιήσεις και με άλλες υποκλάσεις της Item ενώ στην δευτερη δεν μπορεις να κανεις κάτι τετοιο. Δηλαδή αν έχεις CD και Book υποκλάσεις της Item μπορεις να πεις:

 

>Item item;
item = new CD();
[...]
item =  newBook();

Ενώ αν το δηλώσεις ως CD απο την αρχή, δεν εχεις αυτην την δυνατότητα.

 

Ναι αλλά αυτό που ρωτάω εγώ είναι τι γίνεται άμα πχ έχω δηλώσει Item item = new CD(); και στην κλάση CD έχω πχ μία μέθοδο Χ().

Μπορώ να πω item.X(); ???

Και αν δεν μπορώ τι μπορώ να κάνω?

 

..

Γενικά παρατήρησα ότι άμα η κλάση Item έχει μία συνάρτηση Χ() και η CD υπερφορτώνει την Χ(), τότε μπορώ να πω item.X();. Ενώ μία ασχετη συνάρτηση που την έχει μόνο η κλάση CD px Y()

Δεν μπορώ να την καλέσω μέσω της μεταβλητής item [item.Y();].

Το θέμα είναι γιατί?

Δημοσ.

Για να το κάνεις αυτό πρεπει να κάνεις casting το item σε τύπο CD.

 

Στην C#(δεν ειμαι σίγουρος στην Java) θα έγραφες (item as CD).Y();

 

edit: Σωστά, οπως ειπε ο MeTaXaS4 το casting στην Java ειναι (CD)item.Y();

Δημοσ.

Μπορείς όμως να κάνεις(αν δεν κάνω λάθος)

(cd)item.Y();

 

Αυτό δηλαδή γίνεται ας πούμε?

 

>
Object v = new Vehicle(...); // estw oti pernaw kapoies parametrous.
(Vehicle)v.print();

Δημοσ.

Για γραψε το error να δουμε που κανουμε λαθος.

>package object;
public class Main {
   public static void main(String[] args) {
       Object v = new Vehicle(6,2200.0,4.9,95);
       (Vehicle)v.print();
   }
}

>package object;

public class Vehicle {
   int rodes;
   double weight;
   double lenght;
   int topSpeed;
   public Vehicle(int rodes, double weight, double lenght, int topSpeed)
   {
       this.rodes = rodes;
       this.weight = weight;
       this.lenght = lenght;
       this.topSpeed = topSpeed;
   }
   public void print()
   {
       System.out.println("rodes: "+rodes+"\nvaros: "+weight+"\nmikos: "+lenght+"\nmegisti taxitita: "+topSpeed);
   }
   
}

 

run:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - not a statement

at object.Main.main(Main.java:25)

Java Result: 1

BUILD SUCCESSFUL (total time: 0 seconds)

 

Η γραμμή είναι 25 γιατί είχα κάποια σχόλια πιο πάνω ...

Δημοσ.

Από οτι φαινεται στην Java μετα απο δοκιμές που έκανα πρέπει να φτιάξεις ενα προσωρινό αντικείμενο πρώτα. Ισως γινεται και χωρίς να το κάνεις, αλλα δεν ειμαι σίγουρος πως.

 

>
public static void main(String[] args)
{
      Object v = new Vehicle(6,2200.0,4.9,95);
      
      Vehicle vt = (Vehicle)v;
      vt.print();
}

edit: Επειδή φευγω τώρα και δεν εχω πολύ χρόνο κοιτα για τον τελεστή instanceof

Δημοσ.

Method invocations allowed by the compiler are based solely on the declared type of the reference, regardless of the object type

 

Στην περίπτωση σου αναφορά (refence) Object και τύπος αντικειμένου - object type = Vehicle

 

 

http://www.learn-java-tutorial.com/Java-Inheritance.cfm

 

http://pericles.ee.duth.gr/old_site/courses/2009-10/ProgJava/DraftSlides/DSAlg%20Java04-Objects.pdf

Δημοσ.

Μην προσπαθείς αυτό που κάνεις δεν γίνεται. Δες τα links

 

Στη γραμμή

(Vehicle)v.print();

 

δοκίμασε να βάλεις ακόμα μία παρένθεση (έτσι κι αλλιώς, τζάμπα είναι!)

((Vehicle)v).print();

 

 

Δημοσ.

Μην προσπαθείς αυτό που κάνεις δεν γίνεται. Δες τα links

 

Τι εννοείς δε γίνεται ?

Αφού δουλεύει...

 

Πάντως αν δε γίνεται, δεν μπορώ να καταλάβω το νόημα μιας ArrayList<Υπερκλάση> Και σε αυτην να αποθηκεύουμε αντικείμενα υποκλάσεων.

Δε λέω εξυπηρετεί την εννοια του πολυμορφισμού αλλά τι νόημα έχει αν μετά δεν μπορείς να χρησημοποιήσεις τις μεθόδους των αντικείμένων που βρίσκονται στην ArrayList..?

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...