blaoulis Δημοσ. 9 Δεκεμβρίου 2007 Δημοσ. 9 Δεκεμβρίου 2007 Kalispera sas, 8a i8ela na rwtisw kati pu poli sixna arketoi 8a exete adimetwpisei. Borei kapoios na mu e3igisei giati mia non-static method/klasi dn borei na kales8ei apo mia static?? non-static variable this cannot be referenced from a static context. Otan to sinadw auto eite dilwnw tin me8odo pu 8elw na kalesw ws static h dimiurgw mia kainurgia klasi pu tin dilwnw ws static kai mesa vazw tis me8odus pu 8elw. Eseis ti kanete? poio protimate?
Bspus Δημοσ. 9 Δεκεμβρίου 2007 Δημοσ. 9 Δεκεμβρίου 2007 Μηπως μπορεις να δωσεις το λινκ που το βρηκες αυτο? Ισως παρεξηγησες το τι εννοει. Αυτο που παραθετεις δεν λεει αυτο που λες. Λεει οτι το this δεν μπορεις να το καλεσεις σε static context. To this ειναι reserved word. Δες το παρακατω παραδειγμα > import java.awt.*; import javax.swing.*; public class Frame1 extends JFrame { public Frame1() { this.setSize(new Dimension(400, 200)); this.setTitle("Test"); this.setVisible(true); } public static void main(String[] args) { Frame1 MyFrame = new Frame1(); } } Το this εδω δεν αναφερεται συγκεκριμενα στο MyFrame αντικειμενο (ουτε θα μπορουσες να γραψεις κωδικα που το κανει αυτο), αλλα σε οποιοδηποτε και να εφτιαχνα σε αυτην την κλαση. Συνηθως δεν το βλεπεις γιατι μπορει να παραληφθει και να καλεσεις κατευθειαν τη μεθοδο της κλασης μεσα σε αλλες μεθοδους της ιδιας κλασης. Φυσικα αν δεν υπαρχουν αντικειμενα (static class) δεν υπαρχει this.
blaoulis Δημοσ. 10 Δεκεμβρίου 2007 Μέλος Δημοσ. 10 Δεκεμβρίου 2007 Paradigma no1. class px{ class dokimi{ int auxisi(int num ) { num++; return num; } } public static void main(String[] args) { int x = 5; dokimi d = new dokimi(); System.out.println("x:"+x); x = d.auxisi(x); System.out.println("x:"+x); } } Error: px.java:29: non-static variable this cannot be referenced from a static context dokimi d = new dokimi(); edw vazodas static class dokimi einai koble. Paradigma no2. class px{ int auxisi(int num ) { num++; return num; } public static void main(String[] args) { int x = 5; System.out.println("x:"+x); x = auxisi(x); System.out.println("x:"+x); } } Error: px.java:28: non-static method auxisi(int) cannot be referenced from a static context x = auxisi(x); to dior8wnw kanodas static int auxisi(.. na dio paradigmata + 8a i8ela kai to 8ewritiko ipova8ro giati simvenei auto..
Bspus Δημοσ. 10 Δεκεμβρίου 2007 Δημοσ. 10 Δεκεμβρίου 2007 καταρχην δεν ειναι οτι καλυτερο να φτιαχνεις κλασεις μεσα σε κλασεις. Καλυτερα η καθε μια στο δικο της αρχειο. Η κλαση δοκιμη μπορει να βρισκεται εσωτερικα στην πχ αλλα αυτο δεν σημαινει οτι οι μεθοδοι της ειναι προσβασιμες στην πχ αμα δεν τις καλει απο αντικειμενα. Οταν φτιαχνεις αντικειμενο d τοτε μεσω του d ειναι προσβασιμες. Βγαλτην εξω απο την πχ και στην πχ εχε απλως ενα αντικειμενο της κλασης δοκιμη. Θα σε βοηθησει να μπερδευεσαι λιγοτερο. Επισης, δεν μπορεις να εχεις φτιαξει ενα αντικειμενο σε μια ασχετη μεθοδο της κλασης και να περιμενεις αυτο το ιδιο αντικειμενο να ειναι προσβασιμο στις αλλες μεθοδους. Θα πρεπει το αντικειμενο να δηλωνεται στη μεθοδο που χρησιμοποιειται, εκτος αν ειναι αντικειμενο της κλασης (και οχι αντικειμενο αλλης μεθοδου) ή αμα θες να επεμβεις σε αντικειμενο αλλης κλασης θα πρεπει να το περασεις ως παραμετρο. Στο λεω αυτο γιατι με μπερδευε παρα πολυ στην αρχη. Αν δεν θες να φτιαξεις αντικειμενο, κανεις την αυξηση στατικ και την καλεις μεσα απο τη main ως dokimi.auxisi(χ) Στο δευτερο παραδειγμα εχεις το ιδιο πραγμα. Αν την κανεις στατικ δεν χρειαζεται να την καλεσεις ως px.auxisi γιατι το πχ εννοειται. Μπορεις παλι να φτιαξεις ενα αντικειμενο px μεσα στη main πχ px_obj = new px() και να την καλεσεις ως px_obj.auxisi Αρα η αρχικη σου ερωτηση δεν ειναι αν μια νον-στατικ μεθοδο μπορει να κληθει απο μια στατικ, αλλα γιατι μια νον στατικ δεν μπορει να κληθει εκτος παρα μονο μεσω αντικειμενου. Αυτος ειναι ο ορισμος του νον στατικ Αν εχεις ξεκινησει απο διαδικασιακες γλωσσες καταλαβαινω απολυτα τον εκνευρισμο σου με το θεμα! Μπορεις αν θες να σκεφτεσαι τις διαδικασιακες γλωσσες σαν την ειδικη περιπτωση που ολα ειναι public static
blaoulis Δημοσ. 11 Δεκεμβρίου 2007 Μέλος Δημοσ. 11 Δεκεμβρίου 2007 ty gia tin apadisi.. alla borei kai kapoios allos na mu dwsei ta fwta tu gia to sigekrimeno 8ema?
alex2005 Δημοσ. 11 Δεκεμβρίου 2007 Δημοσ. 11 Δεκεμβρίου 2007 Καταρχήν πρέπει σύμφωνα με τους κανόνες να κόψεις το κακό συνήθειο των Greeklish Για να σε διαφωτίσουμε πάντως θα ήταν καλό να μας πεις τι δεν σε ικανοποίησε στην απάντηση του Bspus.Γιατί ήταν αρκετά σαφής.
Wise_One Δημοσ. 11 Δεκεμβρίου 2007 Δημοσ. 11 Δεκεμβρίου 2007 Εντελώς περιληπτικά κι απ' όσα ξέρουμε απ' τη σχολή (προφανώς περιορισμένα σε σχέση με κάποιον έμπειρο προγραμματιστή εδώ μέσα), οι static μέθοδοι μπορούν να καλούνται με το όνομά τους ή μέσω της κλάσης που ανήκουν. Οι non-static μέθοδοι καλούνται μέσω αντικειμένου. Απ' τη στιγμή λοιπόν που δεν έχεις κάνει αντικείμενο, δε μπορείς να καλέσεις μια non-static μέθοδο. Δε μπορείς δηλαδή να κάνεις αυτό: myStatFunc(){ myNonStatFunc(); } αλλά μπορείς να κάνεις αυτό: myStatFunc(){ x.myNonStatFunc(); } Αν κάνω κάπου λάθος διορθώστε με.
blaoulis Δημοσ. 11 Δεκεμβρίου 2007 Μέλος Δημοσ. 11 Δεκεμβρίου 2007 Bάσικα , ξαναδιαβασα την απαντηση του Bspas και ομολογουμένως σαν να κατάλαβα περισσότερα τώρα. Εν τέλει υπάρχει καποια εξήγηση σε θεωρητικό υπόβαθρο γιατι μια non-static δεν μπορει να καλεσθει απο μια static και το αντιστροφο.
alex2005 Δημοσ. 11 Δεκεμβρίου 2007 Δημοσ. 11 Δεκεμβρίου 2007 Η απάντηση είναι πως μπορεί να καλεστεί το ερώτημα είναι πως? Για παράδειγμα δεν μπορείς να καλέσεις μία static μεταβλητή από μία μή static μέθοδο παρά μόνο αν χρησιμοποιήσεις το αναγνωριστικό της τάξης.Για παράδειγμα όταν καλείς την τάξη Math κάνεις Math.abs(number); Αν γράψεις έναν κώδικα μέσα σε αυτή την τάξη που να καλεί την μέθοδο abs() αλλά παράλληλα δεν είναι σε static μέθοδο ο ίδιος ο κώδικα τότε είναι σαν να γράφεις: H κλήση abs(number) είναι ίδια με το να κάνεις this.abs(); Αυτό είναι λάθος καθώς το this αναφέρεται σε instance που σε μία static μέθοδο δεν έχει κανένα υπόβαθρο. To αντίθετο είναι το εξής: Σκέψου να καλείς μία non static μεταβλητή από static μέθοδο. Αυτομάτως η java το βλέπει σαν this.μεταβλητή Αυτό είναι λάθος για static μεταβλητή καθώς το this δεν έχει υπόσταση μέσα σε μία static μέθοδο καθώς αναφέρεται σε instance που εξ ορισμού μία static μεταβλητή/μέθοδος δεν μπορεί να ανήκει. Ελπίζω να ήμουν σαφής
blaoulis Δημοσ. 11 Δεκεμβρίου 2007 Μέλος Δημοσ. 11 Δεκεμβρίου 2007 α μπραβο ωραία.. Το προβλημα μου δημιουργηθηκε οταν ηθελα να καλεσω την wait() και την notifyall() μεσω της main και ειχα αυτο το προβλημα με τις non-static μεσα σε static, εν τελει δεν καταφερα να βρω λύση και έφτιαξα μια υποδεέστερη μορφη wait() kai notify(). allopx.java:XX: non-static variable this cannot be referenced from a static context wait();
Dikemou Δημοσ. 12 Δεκεμβρίου 2007 Δημοσ. 12 Δεκεμβρίου 2007 Μα πρέπει να τις καλέσεις μέσω του object instance του εκάστοτε thread. Αν δεν τις καλέσεις έτσι, πού θα ξέρει ο compiler σε ποιό instance αναφέρεσαι; > public static void main(String args[]){ ThreadType myThread = new ThreadType(...); myThread.wait(); }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.