PDA

Επιστροφή στο Forum : Constructors - JAVA



bicco
11-01-09, 20:17
Καλησπέρα σε όλους!

Είμαι ένας καινούργιος χρήστης της JAVA (ή τουλάχιστον ευελπιστώ να γίνω) και για την ώρα προσπαθώ να καταλάβω έστω και θεωρητικά κάποιες απο τις λειτουργίες της. Αντιμετωπίζω όμως κάποια μικρά προβληματάκια και νομίζω οτι θα χρειαστώ την βοήθεια σας... Είναι περισσότερο θεωρητικά οπότε ελπίζω να μην σας κουράσω!

1)Πώς περνάμε γενικά τιμές σε μία κλάση της java που εμείς έχουμε δημιουργήσει πέραν απο την χρήση κάποιου constructor στην αρχή?

(π.χ θέλω να περάσω 20 τιμές διαφορετικού τύπου σε κάποια χρονική στιγμή στην κλάση μου χωρίς όμως να θέλω να χρησιμοποιήσω τον constructor είτε γιατί θα γίνει χάος μέσα στη παρένθεση, είτε γιατί τον έχω ήδη χρησιμοποιήσει.)

2)Άμα χρησιμοποιήσω έναν κενό constructor και εάν δεν χρησιμοποιήσω καθόλου constructor, τι διαφορά θα υπάρξει?

Όπως ίσως να έχετε καταλάβει είμαι αρκετά μπερδεμένος οπότε θα ήθελα να σας παρακαλέσω να μου τα εξηγήσετε όσο πιο απλά γίνεται!

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

hammer21
11-01-09, 20:28
Γεια χαρα,



1)Πώς περνάμε γενικά τιμές σε μία κλάση της java που εμείς έχουμε δημιουργήσει πέραν απο την χρήση κάποιου constructor στην αρχή?

(π.χ θέλω να περάσω 20 τιμές διαφορετικού τύπου σε κάποια χρονική στιγμή στην κλάση μου χωρίς όμως να θέλω να χρησιμοποιήσω τον constructor είτε γιατί θα γίνει χάος μέσα στη παρένθεση, είτε γιατί τον έχω ήδη χρησιμοποιήσει.)

Με τις μεθοδους set.Αυτες οι μεθοδοι δημιουργουνται απο την προγραμματιστη και αλλαζουν την τιμη μια ςυποστασιακης μεταβλητης της κλασης.πχ


void setX(int x)
{
this.x=x;

}
Αν και παλι μπορεις να χρησιμοποιησεις τον constructor 2η και 3η και 4η κλπ φορα αλλα δεν συνισταται για λογους μνημης.


2)Άμα χρησιμοποιήσω έναν κενό constructor και εάν δεν χρησιμοποιήσω καθόλου constructor, τι διαφορά θα υπάρξει?

αν η κλαση σου δεν εχει καθολου constructor,o compiler θα δημιουργησει αυτοματα εναν constructor που θα:
1.Αρχικοποιει ολες τις μεταβλητες-αριθμους σε 0

2.Ολες τις string σε ""(string μηδενικου μηκους)

3.Ολα τα αντικειμενα σε null.

Ελπιζω να σε βοηθησα και να καταλαβα καλα τι θες να μαθεις.:)

manicx
11-01-09, 20:49
Θέλει και λίγο προσοχή γενικά με τα objects και τις τιμές που περνάς ειδικά αν αυτά είναι dependent σε άλλα. Βέβαια αυτό είναι άλλη ιστορία (Dependency Injection) αλλά καλό είναι όταν εξοικειωθεί κανείς με Constructors και Objects να διαβάσει άμεσα τι είναι το Dependency Injection.

gkarak
11-01-09, 21:11
Διάβασε αυτό http://java.sun.com/docs/books/tutorial/java/javaOO/objectcreation.html

Θα σε βοηθήσει να καταλάβεις αρκετά γύρω απο το πρόβλημά σου. Πρέπει να κατανοήσεις την σημασία των objects.

bicco
11-01-09, 21:23
Γεια χαρα,



Με τις μεθοδους set.Αυτες οι μεθοδοι δημιουργουνται απο την προγραμματιστη και αλλαζουν την τιμη μια ςυποστασιακης μεταβλητης της κλασης.πχ


void setX(int x)
{
this.x=x;

}
Αν και παλι μπορεις να χρησιμοποιησεις τον constructor 2η και 3η και 4η κλπ φορα αλλα δεν συνισταται για λογους μνημης.

- Τι ακριβώς είναι η "υποστασιακή μεταβλητή"?

- Επιπλέον μπορείς να γίνεις λίγο πιο συγκεκριμένος σχετικά με το πως θα μπορούσα να χρησιμοποιήσω τις μεθόδους "set"?
Φαντάσου ότι αυτή τη στιγμή είμαι σε επίπεδο τύπου:


int takis;
takis = 15;

Όπως καταλαβαίνεις αυτό το "this.x=x" δε βγάζει και πολύ νόημα για μένα...
Απορίες έως τώρα:

1)Μπορείς να γράψεις σκέτο "void"? - μήπως εννοούσες "public void"?
2)Άν μιλάμε για πολλές διαφορετικές τιμές, τότε το "int x" απο μόνο του τι κάνει ως παράμετρος?
3)Τι σημαίνει η γραμμή "this.x=x;"?

+ 1 Case study (όπως μας λένε κι εδώ) για να καταλάβω καλύτερα...

Έστω ότι έχω μια κλάση που λέγεται Car και απο αυτήν έχω δημιουργήσει ένα object που λέγεται limousine.

Χρησιμοποίησα λοιπόν έναν constuctor αρχικά και έδωσα τις διαστάσεις του αυτοκινήτου καθώς έκανα instantiation το object μου. (Θεωρώ ότι υπάρχει constructor μεσα στην κλαση που περιέχει τις αντίστοιχες παραμέτρους).
Σε κάποια χρονική στιγμή με βάση το input ενός χρήστη εγώ θέλω να περάσω 30 διαφορετικές τιμές στην Car σχετικά με μία τροποποίηση στο object limousine ως προς το χρώμα, τις διαστάσεις, τις επιδόσεις κλπ κλπ.

Πως (στο περίπου πάντα) θα εφαρμόσω την μέθοδο set που μου είπες και για τις 30 τιμές?

Και πάλι ευχαριστώ για τις απαντήσεις!

hammer21
11-01-09, 22:07
- Τι ακριβώς είναι η "υποστασιακή μεταβλητή"?

Υποστασιακη(instance) μεταβλητη ειναι καθε μεταβλητη που ειναι μελος μιας κλασης και ΔΕΝ ειναι static.


Φαντάσου ότι αυτή τη στιγμή είμαι σε επίπεδο τύπου:

Μηπως εχει παει κατευθειαν σε εννοιες αντικειμνοστρεφους προγραματισμου?Αν ναι, καλυτερα να το ξαναπαιρνες απο την αρχη το θεμα(δηλωση μετβλητων casting methods-functions κτλ);)


- Επιπλέον μπορείς να γίνεις λίγο πιο συγκεκριμένος σχετικά με το πως θα μπορούσα να χρησιμοποιήσω τις μεθόδους "set"?

Οταν φτιαχνεις μια κλαση δεν βαζεις και διαφορες μεθοδους μεσα?επειδη τις μετβλητες των κλασεων πρεπει να τις θετουμε ως private(το αντιθετο του public) δεν μπορουμε να τις αλλαξουμε με καποια μεθοδο εκτος της ταξης μας(πχ την main,αν βρισκετε σε αλλο αρχειο) χρησιμοποιυμε public μεθοδους για να αλλαζουμε την τιμη των μεταβλητων αυτων.τις μεθοδους αυτες τις λεμε setter μεθοδους.για καθε private μεταβλητη που θελουμε με καποιο τροπο να αλλαζει εκτος της κλασης μας γραφουμε μεσα στην κλαση μια set μεθοδο.Αυτες οι μεθοδοι συντασσονται με τροπο παρομοιο με αυτον που σου ειπα παραπανω.

Περι this:Πολλες φορες,θες μεσα απο μια μεθοδο της κλασης να αναφερθεις στο αντικειμενο που καλεσε την μεθοδο αυτη.Αυτο γινεται με τη λεξη κλειδι this.Συνηθως μπορεις και να μη το γραψεις αλλα βοηθαει στην αναγνωσιμοτητα;)



1)Μπορείς να γράψεις σκέτο "void"? - μήπως εννοούσες "public void"?

Οι μεθοδοι των κλασεων ειναι σωστο να γραφονται ως public,τις περισσοτερες φορες.Επειδη δεν εβαλα τιποτα σημαινει οτι θα εχει εμβελεια πακετου.Μην σε αγχωσει τωρα τι σημαινει αυτο,απλα σκεψου οτι δεν ειναι συντακτικο λαθος;)



2)Άν μιλάμε για πολλές διαφορετικές τιμές, τότε το "int x" απο μόνο του τι κάνει ως παράμετρος?

Δεν καταλαβα τι εννοεις:hmm:


3)Τι σημαίνει η γραμμή "this.x=x;"?

αν και ειπα 2 λογακια παραπανω,ας σου πω και το παραδειγμα.

Ενα αντικειμενο σου πχ απο την main καλει την μεθοδο setX του για να αλλαξει την τιμη της υποστασιακης μεταβλητης του,χ.Αρχικα υπολογιζουμε το αριστερο μερος του =.Ειναι απλως η τιμη του x που περναει ως ορισμα απο την μεθοδο που καλεσε την setX(εδω την main).Το αριστερο μερος λεει "Παρε την μεταβλητη(υποστασιακη;)) χ του αντικειμενου που καλεσε την setX και εκχωρησε της την τιμης της παραμετρου χ".
Eδω οπως βλεπεις,το ονομα της παραμετρου ειναι x.αν ηταν πχ z τοτε θα ηταν αχρειαστο το this.Τωρα ομως εχουν κοινο ονομα και ειναι απαραιτητο;)


Σε κάποια χρονική στιγμή με βάση το input ενός χρήστη εγώ θέλω να περάσω 30 διαφορετικές τιμές στην Car σχετικά με μία τροποποίηση στο object limousine ως προς το χρώμα, τις διαστάσεις, τις επιδόσεις κλπ κλπ.

Αν καταλαβα καλα η Car εχει 30 μεταβλητες?:hmm:
ή μηπως θες να φτιαξεις 30 διαφορετικα Car?


Πως (στο περίπου πάντα) θα εφαρμόσω την μέθοδο set που μου είπες και για τις 30 τιμές?

Οπως ειπα και παραπανω μια set αλλαζει την τιμη μιας μεταβλητης.Αρα θες 30 set:)

bicco
12-01-09, 19:43
Καταρχήν συγνώμη για την καθυστέρηση και ένα τεράστιο ευχαριστώ για το χρόνο που έχεις ασχοληθεί έως τώρα μαζί μου!

Πιστεύω ότι έχω αρχίσει να καταλαβαίνω περίπου τι μου λες, χρειάζομαι όμως μερικές ακόμα διευκρινήσεις:

1)Αν κατάλαβα καλά, προκειμένου να αλλάξει μια "instance variable" η οποία είναι δηλωμένη ως "private", χρησιμοποιούμε το "τρικ" της "public" μεθόδου την οποία δημιουργούμε μέσα στην εκάστοτε κλάση και η οποία έχει πρόσβαση στα πάντα εντός της κλάσης. Σωστά μέχρι εδώ?
-Σε περίπτωση όμως που θέλουμε να επιστραφεί μία τιμή μέσω της μεθόδου set, τι ακριβώς χρησιμοποιούμε? Ρωτάω επειδή παρατήρησα το "void" που δεν επιστρέφει τίποτα στον caller....

2)Οι μεθόδοι set γιατι αλλάζουν μία μόνο τιμή? Αν για παράδειγμα θέλω να αλλάξω 30 τιμές, θα πρέπει να περάσω 30 μεθόδους μέσα στην κλάση μου?! ή απλά θα βάλω 30 παραμέτρους? η μήπως θα καλέσω τη μέθοδο χωρίς παραμέτρους και μέσα στο body περνάω τις 30 νέες τιμές στις private variables μου?

--Αυτή είναι παράλληλα και η απορία μου στο τελευταίο σκέλος που σου είπα ότι θέλω να περάσω 30 διαφορετικών τύπων τιμές σε μια κλάση. (Η Car δηλαδή να έχει 30 μεταβλητές)

hammer21
12-01-09, 20:06
1)Αν κατάλαβα καλά, προκειμένου να αλλάξει μια "instance variable" η οποία είναι δηλωμένη ως "private", χρησιμοποιούμε το "τρικ" της "public" μεθόδου την οποία δημιουργούμε μέσα στην εκάστοτε κλάση και η οποία έχει πρόσβαση στα πάντα εντός της κλάσης. Σωστά μέχρι εδώ?

σωστοτατα:oneup:


-Σε περίπτωση όμως που θέλουμε να επιστραφεί μία τιμή μέσω της μεθόδου set, τι ακριβώς χρησιμοποιούμε? Ρωτάω επειδή παρατήρησα το "void" που δεν επιστρέφει τίποτα στον caller....

Αν θες και να επιστρεφει τιμη φτιαχνεις και μια get στο στυλ


public type_of_X getX()
{
return this.x;
}

οπου type_of_x ειναι η τυπος που εχει το χ(int float String etc).


2)Οι μεθόδοι set γιατι αλλάζουν μία μόνο τιμή? Αν για παράδειγμα θέλω να αλλάξω 30 τιμές, θα πρέπει να περάσω 30 μεθόδους μέσα στην κλάση μου?! ή απλά θα βάλω 30 παραμέτρους? η μήπως θα καλέσω τη μέθοδο χωρίς παραμέτρους και μέσα στο body περνάω τις 30 νέες τιμές στις private variables μου?


Μπορεις να φτιαξεις μια μεθοδο που θα αλλαζει τις τιμες ολων των μεταβλητων μαζι.Δεν σε εμποδιζει κανεις.Αλλα αν θες να αλλαξεις τις 28/30 μετβλητες δεν θα μπορεις να το κανεις με τον τροπο που το σκεφτεσαι.Το καλυτερο σε αυτο που ζητας ειναι να εχεις 30 set και μια αλλη που θα τα αλλαζει ολα μαζι καλωντας στο σωμα της τις 30 set που ειπα πριν μια γραμμη.
Η τελευταια προταση σου νομιζω πως δεν ειναι εφικτη


η μήπως θα καλέσω τη μέθοδο χωρίς παραμέτρους και μέσα στο body περνάω τις 30 νέες τιμές στις private variables μου?
δηλαδη μεσα στη μεθοδο θα λες πχ
max_spped=180;(?)
Τοτε το max_speed θα γινεται παντα 180,δεν θα μπορεις να το αλλαξεις οπως εσυ θες.Θα ειναι κτα καποιο τροπο μεθοδος που θα κανει reset.ελπιζω να με πιανεις;)

bicco
12-01-09, 21:12
Η τελευταια προταση σου νομιζω πως δεν ειναι εφικτη


δηλαδη μεσα στη μεθοδο θα λες πχ
max_spped=180;(?)
Τοτε το max_speed θα γινεται παντα 180,δεν θα μπορεις να το αλλαξεις οπως εσυ θες.Θα ειναι κτα καποιο τροπο μεθοδος που θα κανει reset.ελπιζω να με πιανεις;)

Περίπου αυτό εννοώ...κάτι σαν reset. Άσε το αν είναι χρηστικό...αυτό είναι μια άλλη ιστορία!

Θα μπορώ δηλαδή απ'την "main" να καλέσω την "
limousine.changeVars()"
και μέσα να λέει:


speed = 100;
color = blue;
name = takis;
κλπ κλπ

Γίνεται αυτό, έτσι? - το μειονέκτημα πιστεύω είναι οτι δε θα μπορώ να "μιλήσω" σε συγκεκριμένες μεταβλητές ξεχωριστά...γιαυτό άλλωστε και μου προτείνεις τις 30 ξεχωριστές set...
Το πέτυχα ή αστόχησα?

Επιπλέον υπάρχει τρόπος με μία μέθοδο να δώσω και να πάρω τιμή ταυτόχρονα?
Δηλαδή μου είπες προηγουμένως ότι μπορώ να χρησιμοποιήσω την get για να πάρω τιμή....Μπορώ π.χ να δώσω μια τιμή με την set η οποία θα υποστεί κάποια αλλαγή μέσα στην μέθοδο και θα μου επιστραφεί απευθείας με κάποιον return τύπο προσπενόντας εντελώς την get? - Ή πρέπει σε κάθε περίπτωση αν θέλω να πάρω πίσω τιμή, να χρησιμοποιήσω την get?

hammer21
12-01-09, 22:22
Μπορώ π.χ να δώσω μια τιμή με την set η οποία θα υποστεί κάποια αλλαγή μέσα στην μέθοδο και θα μου επιστραφεί απευθείας με κάποιον return τύπο προσπενόντας εντελώς την get?

Βεβαιως, γινεται και ετσι.Εγω απλως σου λεω πως ειναι οι καλες πρακτικες;)


το μειονέκτημα πιστεύω είναι οτι δε θα μπορώ να "μιλήσω" σε συγκεκριμένες μεταβλητές ξεχωριστά...γιαυτό άλλωστε και μου προτείνεις τις 30 ξεχωριστές set...

Μα, αυτες δεν θα προσπελασεις μεσα απο την changeVars?Εκτος και αν εννοεις να αναφερθεις στην γραμμη 10 της main στην μια spped και στην γραμμη 20 στην name για παραδειγμα.τοτε ναι,ειναι οπως τα λες.

Επειδη απο οτι καταλαβα κανεις ταχυρυθμα(διορθωσε με αν κανεις λαθος) μια λιστα με tutorial να δεις(στα ελληνικα).αν ξερεις καλα αγγλικα το tutorial της sun (http://java.sun.com/docs/books/tutorial/reallybigindex.html) ειναι must

bicco
13-01-09, 03:04
Εκτος και αν εννοεις να αναφερθεις στην γραμμη 10 της main στην μια spped και στην γραμμη 20 στην name για παραδειγμα.τοτε ναι,ειναι οπως τα λες.

Αυτό ακριβώς εννοούσα! thnx!

Και κάτι τελευταίο:

Οι μοναδικοί δηλαδή τρόποι για να περάσεις μεταβλητές σε μια κλάση της JAVA είναι

1)στην αρχή μέσω constructor
2)χρησιμοποιώντας κάποια μέθοδο

Υπάρχει κάποιος άλλος τρόπος που αγνοώ?

__alex__
13-01-09, 03:44
Αυτό ακριβώς εννοούσα! thnx!

Και κάτι τελευταίο:

Οι μοναδικοί δηλαδή τρόποι για να περάσεις μεταβλητές σε μια κλάση της JAVA είναι

1)στην αρχή μέσω constructor
2)χρησιμοποιώντας κάποια μέθοδο

Υπάρχει κάποιος άλλος τρόπος που αγνοώ?

Να έχεις public την μία μεταβλητή της τάξης, οπότε έχεις απευθείας πρόσβαση στην μεταβλητή. Αυτό βέβαια είναι θεωρητικά λάθος και το αναφέρω γιατί απλά γίνεται, και όχι γιατί είναι σωστό να γίνεται.
Πολλές φορές όμως θα δεις ότι χρησιμοποιούνται public static final μεταβλητές. Αυτές δεν έχουν το νόημα να μπορείς να στέλνεις δεδομένα στην τάξη αλλά να μπορείς να διαβάζεις κάποιες σταθερές που ποτέ δεν αλλάζουν. Σε αυτήν την περίπτωση δεν έχει κάποιο ιδιαίτερο νόημα να χρησιμοποιήσεις get μεθόδους.

bicco
13-01-09, 21:57
Δηλαδή πέρα απο τις λεγόμενες static variables που αναφέρεις, είτε χρησιμοποιώντας class constructor είτε χρησιμοποιώντας method constructor, μόνο με "παρενθέσεις" περνάω μεταβλητές έτσι?

hammer21
13-01-09, 23:19
Δηλαδή πέρα απο τις λεγόμενες static variables που αναφέρεις, είτε χρησιμοποιώντας class constructor είτε χρησιμοποιώντας method constructor, μόνο με "παρενθέσεις" περνάω μεταβλητές έτσι?

Method constructor δεν υπαρχει.Ο ιδιος ο constructor ειναι μια μεθοδος;)
Παντως γενικα οι τιμες ως παραμετροι περνιουνται με παρανθεσεις.

bicco
14-01-09, 19:20
Σας ευχαριστώ πάρα πολύ όλους για τις απαντήσεις σας!
Να είστε όλοι καλά!

hammer21
14-01-09, 22:10
Παρακαλουμε.Καλο κουραγιο...:)

@ ADSLgr.com All rights reserved.