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

ερωτηση java


lolek

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

Δημοσ.

Εχουμε την παρακάτω κλάση , παρακάτω την υποκλάση της και πιο κάτω τη main()

class Parent{

double value = 0;

public Parent(){

value = 1.0;

System.out.println("Parent value " +value);}

public Parent(double value){

System.out.println("Parent value " + value);}

public void setValue (double value){

this.value -= value;}}

 

class Child extends Parent{

String message;

public Child (String message){

this.message = message;

System.out.println("Child "+message);}

public Child (double value){

super(value);

this.value = value++;

System.out.println("Child value " +value);}

 

public class RunParent{

public static void main(String args []){

Child C1 = new Child(5.5);

System.out.println (C1.value);}

 

τρέχοντας το παραπάνω προγραμμα παίρνω την εξής έξοδο:

Parent value 5.5

Child Value 6.5

5.5

 

το σκεπτικο μου για την εκτελεση της main() ειναι:Δημιουργειται ένα νέο στιγμιότυπο

της Child (το C1) και καλούνται πρώτα οι κατάλληλοι δημιουργοί .όλα καλά μεχρι εδω.

Αυτο που με μπερδευει ειναι γιατί με την εντολή System.out.println (C1.value); εκτυπώνεται 5.5 και οχι 6.5 . Αφου

υπάρχει αυτή η εντολή this.value = value++; δεν θα επρεπε το value του αντικειμενου C1 να γίνει 6.5 ???

Δημοσ.

Χρησιμοποιείτε σας παρακαλώ το CODE ή το PHP tag μαζί με proper indentation, ώστε ο κώδικας που παραθέτετε να είναι ευανάγνωστος. Μην κάνετε δύσκολη τη ζωή αυτών από τους οποίους ζητάτε βοήθεια!

 

>
class Parent {
   double value = 0;

   public Parent() {
       value = 1.0;
       System.out.println("Parent value " + value);
   }

   public Parent(double value) {
       System.out.println("Parent value " + value);
   }

   public void setValue(double value) {
       this.value -= value;
   }
}

class Child extends Parent {
   String message;

   public Child(String message) {
       this.message = message;
       System.out.println("Child " + message);
   }

   public Child(double value) {
       super(value);
       this.value = value++;
       System.out.println("Child value " + value);
   }
}

public class RunParent {
   public static void main(String args []) {
       Child C1 = new Child(5.5);
       System.out.println(C1.value);
   }
}

Δημοσ.
Αυτο που με μπερδευει ειναι γιατί με την εντολή System.out.println (C1.value); εκτυπώνεται 5.5 και οχι 6.5 . Αφου υπάρχει αυτή η εντολή this.value = value++; δεν θα επρεπε το value του αντικειμενου C1 να γίνει 6.5 ???

 

Κι όμως, δε θα έπρεπε. Η παράσταση (value++) αποτιμάται λαμβάνοντας υπ' όψιν την τιμή της μεταβλητής value πριν να γίνει η αύξηση κατά 1 που ορίζει ο τελεστής postfix increment. Αφού επιστραφεί λοιπόν η τιμή 5.5, τότε γίνεται η αύξηση στην τιμή της μεταβλητής.

 

Για να λάβεις τη συμπεριφορά που αναμένεις εσύ, θα έπρεπε στον κώδικα να χρησιμοποιείται ο τελεστής για prefix increment (μορφή: ++variable_name), δηλαδή:

 

>this.value = ++value;

 

Περισσότερα μπορείς να δεις εδώ: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html

Δημοσ.

Τι να σου πω.. Δεν ξερω java, αλλα βλεπω οτι το keyword super ευθυνεται για το αποτελεσμα.

 

Τεσπα. Καλο ειναι να δουλευεις με debugger, εφοσον εισαι ακομα στο "μαθαινω". Ψαξε στο internet πως βαζεις breakpoint στο ide σου, και πως κανεις step by step την εκτελεση του προγραμματος.

 

Με τα παραπανω, θα δεις τι ακριβος γινεται στο προγραμμα σου, τι τιμες περνουν οι μεταβλητες σου ποιες συναρτησεις καλουντε κλπ κλπ.

 

Θα τα βρει πολυ βολικα, πιστεψε με.

Δημοσ.

parsifal δεν νομίζω πως ισχύει αυτο που λες στη συγκεκριμένη περίπτωση

θα ίσχυε για παράδειγμα εδώ:System.out.println(value++) που δίνει διαφορετικο αποτέλεσμα απο το System.out.println(++value).Αλλά το θεμα μου δεν ειναι αυτό.Ειναι το πώς επιδρά η λεξη this στην εντολή this.value = value++;

 

edit:Λάθος αυτό που είπα.parsifal εχεις δικιο.ευχαριστώ

Δημοσ.
parsifal δεν νομίζω πως ισχύει αυτο που λες στη συγκεκριμένη περίπτωση

θα ίσχυε για παράδειγμα εδώ:System.out.println(value++) που δίνει διαφορετικο αποτέλεσμα απο το System.out.println(++value).Αλλά το θεμα μου δεν ειναι αυτό.Ειναι το πώς επιδρά η λεξη this στην εντολή this.value = value++;

 

Και ομως εχει δικαιο. Με εναν debugger θα το δεις.

Δημοσ.

χμ, μάλλον δεν πρόσεξες καλά τον κώδικα πιθανόν δεν είναι δικός σου, Evgenios1 το keyword super είναι να καλέσεις τον δημιουργό της γονικής άρα σωστός και η λύση είναι αυτή που έδωσε ο parsifal δηλαδή όταν θα έχεις μία συνάρτηση ή απλώς μία εντολή και του πεις return(value++) θα επιστρέψει την 1η τιμή της value και μετά θα κάνει το value=value+1 ενώ άμα ήταν ++value πρώτα θα έτρεχε το value=value+1 και μετά το retun value..

Δημοσ.
Αλλά το θεμα μου δεν ειναι αυτό.Ειναι το πώς επιδρά η λεξη this στην εντολή this.value = value++;

 

Άλλο θέμα αυτό, όντως. Η χρησιμότητα του "this" keyword σε αυτήν την περίπτωση είναι ότι προσδιορίζει σε ποια από τις 2 μεταβλητές "value" αναφέρεσαι κατά την εκτέλεση του κώδικα του constructor: Έχεις ένα "value" που είναι member του Child object, έχεις κι ένα ακόμη "value" ως το όνομα της μεταβλητής που χρησιμοποιείς για να περάσεις δια τιμής (by value) την παράμετρο 5.5 ή οποιαδήποτε άλλη στον constructor. Με σκέτο "value" προσπελαύνεις το 2ο, με "this.value" το πρώτο. Αν στον constructor όριζες διαφορετικό όνομα μεταβλητής για την παράμετρο, π.χ. myValue:

 

>public Child(double myValue) { ... }

 

τότε δε θα χρειαζόσουν το "this" πιο κάτω. Θα αρκούσε π.χ. ένα:

 

>
       value = myValue++;

 

 

Γενικότερα, το "this" keyword επιστρέφει τη διεύθυνση μνήμης του object που καλεί τη δεδομένη μέθοδο.

Δημοσ.

ναι το εγραψα παραπάνω πριν δω και τα δικά σας μηνυματα οτι εχει δικιο.μου λυθηκε η απορία.ευχαριστω

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...