Εμφάνιση 1-5 από 5
  1. #1
    Εγγραφή
    16-12-2018
    Ηλικία
    25
    Μηνύματα
    3
    Downloads
    0
    Uploads
    0
    ISP
    ΟΤΕ Conn-x
    γεια σας , μηπως μπορει καποιος να μου πει εναν ασφαλη τροπο για να κραταει τη τιμη της μια τοπικη μεταβλητη που ειναι ορισμα στη μεθοδο και μετα το περας της μεθοδου στην εκτελεση στη Java;

    η τοπικη μεταβλητη δινεται στη μεθοδο ως παραμετρος , η μεθοδος της καταχωρει καποια τιμη αλλα δεν επιστρεφει αυτη τη μεταβλητη αλλα καποια αλλη
    Συγκεκριμενα ,εχω το εξης προβλημα που με ταλαιπωρει

    Επιτηδες τα ονοματα ειναι ετσι .

    εχω μια κλαση Α στην οποια εχω μια μεθοδο που μεσα και σε αλλα υπαρχουν αυτες οι 2 σειρες

    Κώδικας:
    ArrayList<String []> par2 = new ArrayList<String []>();
    String[] Y = object1.methodofobject1(par1,par2); // par1 is String ,par2 is ArrayList<String []>
    η ιδια μεθοδος μετα χρησιμοποιει το Υ και το par2 .

    Με το Υ ειναι ok , αλλα στο par2 δεν εχει περασει τη τιμη που της εβαλε η μεθοδος , ειναι κενη ( [ ]) οπως την δινω ως ορισμα στη methodofobject1 , δε της εδωσε τη τιμη που της δινει μεσα η methodofobject1

    Σε μια αλλη κλαση με ονομα Object1 εχω γραψει τη methodofobject1 που κανει κατι τετοιο

    Κώδικας:
    public String [] methodofobject1 (String x1 , ArrayList<String[]> x2)
    	{
    		
    		for (object2 element : collectionofobjects2) 
    		{
    			if (element.method1ofobject2().equals(x1)) 
    			{
    				x2 = element.method2ofobject2(); // edw exei enhmerwsei to x2 epityxws , opws katalaba apo mia println pou ebala apo katw 
    				return element.method3ofobject2();
    			}
    		}	
    		return null;
    	}
    καμια ιδεα , νομιζω οτι φταιει αυτο που λεω αρχικα .

    υπαρχουν και αλλες κλασεις φυσικα αλλα νομιζω οτι δεν επηρεαζουν σε αυτο

  2. #2
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.444
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Ειναι λίγο δύσκολο να καταλάβω έτσι, χωρίς ολοκληρωμένο παράδειγμα αλλά το πρόβλημα σε αυτές τις περιπτώσεις είναι ότι δεν καταλαβαίνεις αρκετά τις έννοιες By Reference, By Value, Mutable και Immutable.

    Στην Java υπάρχει η θεώρηση ότι όλες οι μεταβλητές στις συναρτήσεις είναι by reference εκτός από τις primitive (int, float etc) που είναι by value. Αυτό πρακτικά είναι μεγάλο λάθος καθώς τα πάντα είναι by value, απλά επειδή όλα τα objects είναι pointers γίνεται by value ο pointer, άρα έχεις ένα αντίγραφο του Pointer που δείχνει όμως στα ίδια δεδομένα. Αλλάζοντας τα δεδομένα στα οποία δείχνει ο pointer, αλλάζουν και έξω από τη συνάρτηση.

    Εκεί που έρχεται συνήθως το πρόβλημα είναι τα immutable objects. Αντικείμενα δηλαδή που δεν μπορούν να τροποποιηθούν αλλά μόνο να επαναδημιουργηθούν (πχ string).

    Έτσι αν περάσεις ένα String σε μία συνάρτηση στην ουσία περνάς το τον pointer στη συνάρτηση by value. Δηλαδή δημιουργείτε ένας καινούργιος pointer που δείχνει στα ίδια δεδομένα που έδειχνε και ο παλιός. Αν κάνεις new όμως στον καινούργιο τότε έχεις απλά αλλάξει το αντίγραφο και όχι το παλιό, καθώς αλλάζει τελείως θέση το αντίγραφο και σταματάει να δείχνει στα ίδια που έδειχνε το παλιό.

    Αντίστοιχα και οι πίνακες είναι ένας pointer. Αν περάσεις ένα "int [] x" σε μία συνάρτηση και κάνεις "x = new int[10]" τότε θα αλλάξεις το αντίγραφο του pointer και όχι τον αρχικό.

    Δεν ξέρω αν κάτι τέτοιο εφαρμόζεται στην περίπτωσή σου (καθώς δεν βλέπω την method3ofobject2()) αλλά λέω μία ιδέα.

  3. #3
    Εγγραφή
    16-12-2018
    Ηλικία
    25
    Μηνύματα
    3
    Downloads
    0
    Uploads
    0
    ISP
    ΟΤΕ Conn-x
    ευχαριστω , το προβλημα ειναι οτι οταν καλω τη methodofobject1 (2η σειρα στο πρωτο τμημα) , το Υ παιρνει τη τιμη που της επιστρεφει η methodofobject1 , ομως το ορισμα par2 που δινεται στη methodofobject1 το αλλαζει εσωτερικα μεσα στη μεθοδο , αλλα μετα δηλ στην επομενη γραμμη του τμηματος 1 (εδω δε γραφω κατι) οταν τελειωνει η μεθοδος και συνεχιζει δεν ειναι αλλαγμενο και αυτο προκαλει προβληματα μετα .Μηπως υπαρχει καμια ιδεα πως μπορω το διορθωσω αυτο(ισως με κανα modifier) , μια λυση θα ηταν να το εβαζα πεδιο το par2 αλλα δε μπορω να το κανω γιατι με δεσμευει ενα interface

  4. #4
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.444
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Παράθεση Αρχικό μήνυμα από Jackaman Εμφάνιση μηνυμάτων
    ευχαριστω , το προβλημα ειναι οτι οταν καλω τη methodofobject1 (2η σειρα στο πρωτο τμημα) , το Υ παιρνει τη τιμη που της επιστρεφει η methodofobject1 , ομως το ορισμα par2 που δινεται στη methodofobject1 το αλλαζει εσωτερικα μεσα στη μεθοδο , αλλα μετα δηλ στην επομενη γραμμη του τμηματος 1 (εδω δε γραφω κατι) οταν τελειωνει η μεθοδος και συνεχιζει δεν ειναι αλλαγμενο και αυτο προκαλει προβληματα μετα .Μηπως υπαρχει καμια ιδεα πως μπορω το διορθωσω αυτο(ισως με κανα modifier) , μια λυση θα ηταν να το εβαζα πεδιο το par2 αλλα δε μπορω να το κανω γιατι με δεσμευει ενα interface
    Είναι ακριβώς αυτό που σου εξήγησα πριν. Δεν δουλεύει γιατί αναθέτεις καινούργια τιμή στην παράμετρο που είναι Pointer. Αυτό έχει σαν αποτέλεσμα να αλλάξει το αντίγραφο του Pointer που πέρασε σαν παράμετρος και όχι τον αρχικό!

    - - - Updated - - -

    Πατήστε στην εικόνα για να τη δείτε σε μεγέθυνση. 

Όνομα:  Drawing1.png 
Εμφανίσεις:  2 
Μέγεθος:  16,0 KB 
ID: 199693
    Αυτά είναι τα βήματα τα οποία κάνεις.
    Στην ουσία το x2 "δείχνει" στο ίδιο σημείο με το par2 γιατί έγινε ένα αντίγραφο του pointer. Μετά όμως αλλάζεις το ίδιο το x2 (όχι x2.variable) με αποτέλεσμα να αλλάζεις τον δείκτη να δείχνει κάπου αλλού. Το par2 όμως δεν άλλαξε. Παρέμεινε ακριβώς το ίδιο.

    Αυτό που θα μπορούσες να κάνεις (πιθανολογώ) είναι
    Κώδικας:
    x2.addAll(element.method2ofobject2());
    Με αυτό τον τρόπο δεν αλλάζεις τον δείκτη x2, αλλά βάζεις δεδομένα στην θέση που δείχνει, η οποία είναι η ίδια με το par2.

  5. #5
    Εγγραφή
    16-12-2018
    Ηλικία
    25
    Μηνύματα
    3
    Downloads
    0
    Uploads
    0
    ISP
    ΟΤΕ Conn-x
    ok , ευχαριστω !
    Το διορθωσα και τωρα μου τρεχει .

Παρόμοια Θέματα

  1. Μηνύματα: 12
    Τελευταίο Μήνυμα: 19-09-18, 17:09
  2. Απόψεις περί εκμάθησης Java
    Από NetJim στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 24
    Τελευταίο Μήνυμα: 26-06-18, 16:54
  3. Java
    Από 5th yonko στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 3
    Τελευταίο Μήνυμα: 26-06-18, 16:44
  4. Μηνύματα: 5
    Τελευταίο Μήνυμα: 29-05-18, 20:14
  5. Μηνύματα: 12
    Τελευταίο Μήνυμα: 29-03-18, 08:59

Tags για αυτό το Θέμα

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας