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

Προβολή μεθόδου που περιέχει static μεταβλητή στη Java


niknax

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

Δημοσ.

Kαλησπέρα σε όλους! Προσπαθώ να καλέσω μια μέθοδο που εμπλέκει μια static μεταβλητή αλλά δεν καταλαβαίνω που είναι το λάθος..

Κώδικας:

public class SavingsAccount

{

 

//η static ματαβλητή

static int AnnualInterestRate = 4; //το ετήσιο επιτόκιο

 

private double SavingsBalance;

 

String A;

//δημιουργός κλάσης

public SavingsAccount (double Poso_Apotamieusis)

{

SavingsBalance = Poso_Apotamieusis;

}

 

 

//λήψη SavingsAccount

public double getSavingsBalance()

{

return SavingsBalance;

}

 

//μέθοδος που υπολογίζει το μηνιαίο επιτόκιο

public double calculateMonthlyInterest(double SavingsBalance)

{

SavingsBalance = SavingsBalance * AnnualInterestRate / 12;

return SavingsBalance;

}

 

 

//2η κλάση:

public class Epitokio {

 

 

public static void main(String[] args)

{

//δημιουργία αντικειμένων και απόδοση αρχικών τιμών μέσω των δημουργών τους

SavingsAccount saver1 = new SavingsAccount (2000.0);

SavingsAccount saver2 = new SavingsAccount (3000.0);

 

//προβολή της AnnualInterestRate και κλήση της μεθόδου που επιστρέφει το μηνιαίο επιτόκιο

//η δήλωση SavingsAccount.AnnualInterestRate γίνεται γιατί η AnnualInterestRate είναι static μεταβλητή

//και γινεται αναφορα μέσω της κλάσης SavingsAccount.

System.out.printf("To αρχικό ποσό αποταμίευσης για το αντικείμενο saver1 είναι: %.1f με επιτοκιο %d τοις" +

" εκατό.\n",saver1.getSavingsBalance(),SavingsAccount.AnnualInterestRate);

 

///ΕΔΩ ΕΙΝΑΙ ΤΟ ΘΕΜΑ..

System.out.printf("Mετά την αύξηση το ποσό ειναι: "+saver1.calculateMonthlyInterest());

 

}//τέλος κλάσης Epitokio

 

ΑΠΟΡΙΕΣ: 1.Ισχύει ότι για να προβληθεί η static μεταβλητή AnnualInterestRate πρέπει να γίνει αναφορά στην κλάση που ανήκει (SavingsAccount) και όχι μέσω του saver1 ?

2. Εκεί που "κολλάω":-D γιατί συμβαίνει αυτό? Ποιος είναι ο σωστός τρόπος να εκτυπώσω το αποτέλεσμα της calculateMonthlyInterest()??

Ευχαριστώ όποιον μπορεί να βοηθήσει!!

Δημοσ.

ισχυει

 

σε αντιθεση με τις non-static μεταβλητες για τις οποιες ισχυει οτι υπαρχει ενα ξεχωριστο instance για καθε object τoυ class, οι static variables δημιουργουνται μονο μια φορα στη μνημη

χμ, το ειπα λιγο περιεργα ε?

 

παραδειγμα

 

εστω μια πολυ απλη κλαση

>
public class MyClass
{
   int a;
   float b;

   public MyClass( int x,float y)
   {
         a = x;
         b = y;
    }
}

ωραια?

Εστω τωρα πως φτιχνεις 2 μεταβλητες τυπου MyClass, φτιαχνεις δηλ 2 objects

>

MyClass obj1 = new MyClass(1, 1.1);
MyClass obj2 = new MyClass(2, 2.2);

 

για καθε ενα απο τα obj1& obj2, εχουν καβατζωθει θεσεις μνημης για τις μεταβλητες που περιεχουν.

Αλλη θεση μνημης για το int a του obj1 και αλλη θεση μνημης για το a του obj2. Ειναι διαφορετικα, σωστα? Έτσι, αν αλλαξεις τιμη στο a του obj1, το a του obj2 παραμενει ανενοχλητο.

Ως εδω καλα?

 

Να κανουμε μια αλλαγη τωρα. Το a το δηλωνουμε ως static.

 

>
public class MyClass
{
   static int a;
   float b;

   public MyClass( int x,float y)
   {
         a = x;
         b = y;
    }
}

 

τι αλλάζει? Οτι πλεον, υπαρχει μια και μοναδικη θεση μνημης για την a για ΟΛΑ τα objects της MyClass που μπορει να ορισεις. Ειναι κοινοχρηστος αυτος ο χωρος

 

Ετσι, αν πεις

 

>

MyClass obj1 = new MyClass(1, 1.1);
MyClass obj2 = new MyClass(2, 2.2);

τωρα το obj1.a ειναι ισο με 2 γιατι τροποποιηθηκε απο τον constructor του obj2

Με 2 κουβεντες, αν ενα object αλλαξει την τιμη του a, αυτο αλλαζει σε ολα τα objects

 

Την calculateMonthlyInterest οκ την εκανες....

 

 

στο

>
        System.out.printf("To αρχικό ποσό αποταμίευσης για το αντικείμενο saver1 είναι: %.1f  με επιτοκιο %d τοις" +
         " εκατό.\n",saver1.getSavingsBalance(), SavingsAccount.AnnualInterestRate);

 

θα μπορουσες να εβαζες αντι για SavingsAccount.AnnualInterestRate το saver1.AnnualInterestRate (ή saver2.AnnualInterestRate, ειναι το ιδιο σωστα?)

Απλα θεωρειται σωστη προγραμματιστικη τεχνικη να χρησιμοποιεις το ονομα του class και οχι του object ωστε να ειναι σαφες για τι ειδος μεταβλητης προκειται....

 

 

Αυτα....

Δημοσ.

 

//μέθοδος που υπολογίζει το μηνιαίο επιτόκιο

public double calculateMonthlyInterest(double SavingsBalance)

{

SavingsBalance = SavingsBalance * AnnualInterestRate / 12;

return SavingsBalance;

}

 

....

 

///ΕΔΩ ΕΙΝΑΙ ΤΟ ΘΕΜΑ..

System.out.printf("Mετά την αύξηση το ποσό ειναι: "+saver1.calculateMonthlyInterest());

 

εεεεπ, εχεις ορισει μια calculateMonthlyInterest που διψα για ενα double ορισμα, μετα ομως την καλεις αδεια. Πως περιμενεις να δουλεψει, πως? Χμ? :shock:

Δημοσ.

¨Εχεις απόλυτο δίκιο georgemarios,αλλά δοκίμασα τα εξής και δεν δούλεψαν :

1. System.out.print("Mετά την αύξηση το ποσό ειναι: %.1f\n",saver1.calculateMonthlyInterest(SavingsBalance)); (όπως προτείνει το NetBeans) και πάλι: "cannot find symbol".

 

2.Δοκίμασα να καλέσω τη μέθοδο μέσω της κλάσης . Δηλαδή:

System.out.print("Mετά την αύξηση το ποσό ειναι: %.1f\n",SavingsAccount.calculateMonthlyInterest(SavingsBalance));

 

3.Δήλωσα μια καινούρια μεταβλητή nea_SavingsBalance και τη χρησιμοποιώ ως εξής,κάνοντας τις εξής αλλαγές στην κλάση SavingsAccount :

Κώδικας:

 

public class SavingsAccount

{

 

//η static ματαβλητή

static int AnnualInterestRate; //το ετήσιο επιτόκιο

 

private double SavingsBalance;

double nea_SavingsBalance; //η νέα μεταβλητή που δήλωσα

 

//δημιουργός κλάσης

public SavingsAccount (int Annual,double Poso_Apotamieusis)

{

AnnualInterestRate = Annual;

SavingsBalance = Poso_Apotamieusis;

}

 

 

//λήψη SavingsBalance

public double getSavingsBalance()

{

return SavingsBalance;

}

 

//μέθοδος που υπολογίζει το μηνιαίο επιτόκιο

public double calculateMonthlyInterest(double nea_SavingsBalance)

{

nea_SavingsBalance = SavingsBalance * AnnualInterestRate / 12.0;

return nea_SavingsBalance;

 

}

 

//λήψη της nea_SavingsBalance

public double getnea_SavingsBalance()

{

return nea_SavingsBalance;

}

}//τέλος κλάσης

 

3.Όταν καλώ τη μέθοδο getnea_SavingsBalance() δε βγάζει λάθος,αλλά εκτυπώνει την τιμή 0.0. "System.out.printf("Mετά την αύξηση το ποσό ειναι: %.1f\n",saver1.getnea_SavingsBalance());"

Γιατί??? Μήπως θεωρεί ότι η μεταβλητή private double nea_SavingsBalance; έχει εξορισμού τιμή 0.0? Έστω κι αν είναι έτσι, η μέθοδος calculateMonthlyInterest πάει

"στράφι"???

 

Συγγνώμη αν σας κούρασα,αλλά προσπαθώ να μάθω..

Χαιρετώ!:-)

Δημοσ.

Βασικά κανείς μερικά τραγικά πράγματα (να υποθέσω ότι δεν πέρασες από C). Το καλό είναι οτι το ψάχνεις.

 

Πρώτον, τα πάντα (int,double,float,long) όταν τα φτιάχνεις στην αρχή έχουν τιμή 0, 0.0 κτλ.

 

Δεύτερον στην calculateMonthlyInterest μην περνάς ως όρισμα το nea_SavingsBalance

 

Τρίτον έχεις κανει το ΕΓΚΛΙΜΑ που το κάνουν όλοι στην αρχή.

 

nea_SavingsBalance = SavingsBalance * AnnualInterestRate / 12.0;

 

double = double * int / float...

 

Τέλος

η getnea_SavingsBalance()

 

είναι μια χαρά και θα φτιάξει μόλις βγάλεις το argument apo thn calculateMonthlyInterest.

 

Αυτό που έχεις κάνει είναι ότι έφτιαξες local μεταβλητή και την άλλαξες αλλα μετά όταν πας στην η getnea_SavingsBalance() εκτυπώνεις το this.getnea_SavingsBalance()

 

βέβαια μπορείς να πεις

 

nea_SavingsBalance = calculateMonthlyInterest(nea_SavingsBalance);

 

αλλά έλεος

Δημοσ.

Αγαπητέ ippo00,

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

να μην ειρωνευόσουν την άγνοιά μου περί γλωσσών προγραμματισμού, για τους εξής λόγους:

1.Η ειρωνία,πρέπει να έχει-κατά το Σωκράτη-καυστικό και "διορθωτικό" χαρακτήρα,ακόμα καλύτερα,να περιέχει χιούμορ.Η δική σου απόπειρα να με ειρωνευτείς,θαρρώ πως είχε περισσότερο σκοπό να μου υποδείξεις "πόσο χαζός είμαι" επειδή ΠΟΤΕ δεν διδάχτηκα κάτι και άρα δεν το ξέρω...Η άγνοια ,φίλε μου, λόγω συνθηκών δεν είναι αξιοχλεύαστη.Η "τσάμπα μαγκιά "όμως είναι..

2.Δεν ζήτησα από κανέναν-και ΔΕ ΘΕΛΩ-να μου λύσει ασκήσεις και να τον ΕΚΜΕΤΑΛΛΕΥΤΩ ως καιροσκόπος,απλά για να "κάνω τη δουλειά μου".Ο προγραμματισμός μου αρέσει και ΘΕΛΩ ΝΑ ΜΑΘΩ.Δεν ζήτησα "έτοιμη τροφή",αλλά βοήθεια και συμβουλές από κάποιους που ενδεχομένως ΘΕΛΟΥΝ αλλά και ΜΠΟΡΟΥΝ να βοηθήσουν.

Αν δεν ήθελες να τη δώσεις,κανένα πρόλημα.Αν τη δίνεις για να πουλήσεις""πνεύμα",αν μη τι άλλο,ΜΑΘΕ ΠΡΩΤΙΣΤΩΣ ΝΑ ΓΡΑΦΕΙΣ ΕΛΛΗΝΙΚΑ (που φαντάζομαι σου χρειάζονται καθημερινά...) και ΔΕΥΤΕΡΕΥΟΝΤΩΣ ΝΑ ΓΡΑΦΕΙΣ ΚΩΔΙΚΑ:

"Δείγμα της γνώσης σου περί ορθογραφίας: "ΕΓΚΛΙΜΑ ".:fear:

 

 

ΥΓ.Αν θες να μάθεις τι σημαίνει "ειρωνεία" και να την χρησιμοποιείς αποδοτικότερα προς όφελός σου στο εξής,επισκέψου το παρακάτω: http://www.e-steki.gr/showthread.php?p=457634

 

Συμβουλή: Μάθε να σκέφτεσαι ΕΛΛΗΝΙΚΑ,για να μπορείς να μιλάς κιόλας(ή και να γράφεις..).;)

Δημοσ.

Κοίτα να δεις για μένα τα ελληνικά είναι ξένη γλώσσα. Στην αυστραλία μεγάλωσα.. οι παρατηρήσεις σου πάνω σ' αυτό το θέμα μου είναι αδιάφορες. Δεν σκέφτομαι ελληνικά.

 

Στο θέμα μας όμως. Δεν σε ειρωνεύτηκα, εσύ το πήρες λάθος. Έμφαση ήθελα να βάλω. Άμα ήθελα να το παίξω μάγκας δεν θα τό 'κανα σε forum προγραμματισμού, έλεος

 

<3

Δημοσ.

Συγγνώμη που επαιμβαίνω στην συζήτηση αλλά η άποψη μου είναι η εξής:

 

Από την στιγμή που γράφεις σε ένα forum και ποστάρεις δημόσια τότε να ξέρεις πως θα δεχτείς κριτική για αυτό που ποστάρεις. Υπάρχει βέβαια η σωστή και καλοπροαίρετη κριτική και κακοπροαίρετη. Οπότε είναι δικαίωμα του καθενός να απαντάει με τον δικό του τρόπο χωρίς βέβαια να σε προσβάλλει. Η κριτική δεν κρίνεται φιλαράκι να το ξέρεις. Την δέχεσαι και συνεχίζεις. Αλλιώς γνώμη μου είναι να πάρεις κανά βιβλίο και να μάθεις όπως έχει μάθει όλος ο κόσμος. Έχεις ρωτήσει από σοβαρά μέχρι και απίστευτα ανόητα πράγματα σε αυτό το φόρουμ. Δικαίωμα σου. Αλλά είναι δικαίωμα μου να κρίνω αυτά που γράφεις με τον δικό μου τρόπο. Αυτό δεν θα το στερήσεις σε κανέναν. Αν δεν σου αρέσει μην γράφεις, είναι απλό. Όσον αφορά τα Ελληνικά και τον χειρισμό της Ελληνικής γλώσσας καλά κάνεις και κρίνεις, αλλά να θυμάσαι. Εδώ είναι φόρουμ προγραμματισμού φιλαράκι και όχι φόρουμ ορθογραφίας. Για αυτό χαλάρωσε. Κρίνε κάποιον για αυτό που σου λέει και όχι για το πως μπορεί να το γράφει. Είδες εσύ δεν ξέρεις προγραμματισμό πχ, κάποιος δεν ξέρει καλά ορθογραφία, σε αυτό το μέρος που βρίσκεσαι το δεύτερο δεν είναι μειονέκτημα.

Δημοσ.
Συγγνώμη που επαιμβαίνω στην συζήτηση αλλά η άποψη μου είναι η εξής:

 

Από την στιγμή που γράφεις σε ένα forum και ποστάρεις δημόσια τότε να ξέρεις πως θα δεχτείς κριτική για αυτό που ποστάρεις. Υπάρχει βέβαια η σωστή και καλοπροαίρετη κριτική και κακοπροαίρετη. Οπότε είναι δικαίωμα του καθενός να απαντάει με τον δικό του τρόπο χωρίς βέβαια να σε προσβάλλει. Η κριτική δεν κρίνεται φιλαράκι να το ξέρεις. Την δέχεσαι και συνεχίζεις. Αλλιώς γνώμη μου είναι να πάρεις κανά βιβλίο και να μάθεις όπως έχει μάθει όλος ο κόσμος. Έχεις ρωτήσει από σοβαρά μέχρι και απίστευτα ανόητα πράγματα σε αυτό το φόρουμ. Δικαίωμα σου. Αλλά είναι δικαίωμα μου να κρίνω αυτά που γράφεις με τον δικό μου τρόπο. Αυτό δεν θα το στερήσεις σε κανέναν. Αν δεν σου αρέσει μην γράφεις, είναι απλό. Όσον αφορά τα Ελληνικά και τον χειρισμό της Ελληνικής γλώσσας καλά κάνεις και κρίνεις, αλλά να θυμάσαι. Εδώ είναι φόρουμ προγραμματισμού φιλαράκι και όχι φόρουμ ορθογραφίας. Για αυτό χαλάρωσε. Κρίνε κάποιον για αυτό που σου λέει και όχι για το πως μπορεί να το γράφει. Είδες εσύ δεν ξέρεις προγραμματισμό πχ, κάποιος δεν ξέρει καλά ορθογραφία, σε αυτό το μέρος που βρίσκεσαι το δεύτερο δεν είναι μειονέκτημα.

 

Αν και ο ippo από τι κατάλαβα δεν το είπε κακοπροέραιτα, αυτό που λες εσύ είναι τελείως λάθος. Εξάλου όταν ΄καποιος ΄ρωτάει σε ένα θέμα κάτι και εσυ αρχίζεις να κρίνεις το πόσο καλός έιναι στο προγραμματισμό δηλαδή άσχετο με το θέμα του τόπικ, τότε είσαι εκτός θέματος, κάτι που απαγορεύεται αν δεν κάνω λάθος σε όλα τα forum. So... νομίζω δεν υσχύει αυτό που λες. Αλήμονο, αν είναι για να βοηθήσεις κάποιο να πρέπει πρώτα να του πεις ποσό καλός η ασχετός είναι.. καλλύτερα να μην μπεις καν στην διαδικασία :mad:

Δημοσ.

Γενικά συμφωνώ μαζί σου bokarinho.Αλλα δεν είμαστε "φιλαράκια" και έχεις αποδείξει το "ντεμέκ" ύφος σου σε προσωπικό μήνυμα προς εμένα -αν θυμάσαι: "Συγγνώμη αλλά δεν μπορώ να κρατηθώ...

 

ΕΛΕΟΣ ΡΕ ΦΙΛΕ ΕΛΕΟΣ, που λέει και ο Γεωργίου.";)

Υπάρχει για όποιον ενδιαφέρεται στα μηνύματα που έχεις ανεβάσει στο forum.

 

Ο ippo00 ξεκαθάρισε τη θέση του και από εκεί και πέρα ο καθένας βγάζει τα συμπεράσματά του για το ποιόν του καθενός από όσους συμμετέχουν σ'αυτή τη συζήτηση.Σαφές.

Εσύ όμως?

Μήπως επειδή στο παρελθόν σε είχα "διορθώσει" για τα Ελληνικά σου αποζητάς ρεβάνς να με πικάρεις??:lol::lol::lol::lol::lol:

Μα καλά σε forum προγραμματισμού κοκορομαχίες τύπου "Τατιάνας"???:confused:

Πάντως τα μηνύματά σας έχουν τον ίδιο καταληκτικό χαρακτήρα: "...έλεος..".

Ενδιαφέρον...Προτείνω να το δείχνετε και να το δέχεστε..αφού είστε τόσο "ελεήμονες"..

 

Εγώ ΕΧΩ ΔΙΑΒΑΣΜΑ!

και επειδή έχω ευαισθησία με την Ελληνική Γλώσσα διόρθωσε σε παρακαλώ τα εξής στο μήνυμα σου:

1. Εγραψες:" επαιμβαίνω ".Το σωστό : "επεμβαίνω".

2.Εγραψες:"Όσον αφορά τα Ελληνικά και τον χειρισμό της Ελληνικής γλώσσας καλά κάνεις και κρίνεις, αλλά να θυμάσαι."

Το σωστό: όταν γράφεις μια πρόταση επεξηγηματική που θα αναλύσεις κάτι στον συζητητή σου να βάζεις τη γνωστή από το Δημοτικό "ανω και κάτω τελεία" ":".Όχι τελεία.

3.Το ύφος σου και ο τρόπος σου για μένα ήταν γνωστοί ("χαλάρωσε","φιλαράκι" κ.τ.λ.). Ευτυχώς κι άλλοι θα έχουν τώρα γνώμη,για όλους μας .

Καλό σας βράδυ!

Δημοσ.

Αίχεις δήκειο σαι ότι λαις κε δαιν πρόκειτε να σου ξαναφαίρω αντίρρρησει.

Αν είσε μάγκας ώμος φτιάξαι μου 1να πρώγγραμμα που να βρήσκι ώλα τα λάθει σαι μήα πρώταση.

 

 

Τώρα λοιπόν έχεις 3 κινήσεις για να αντιμετωπίσεις το post μου:

(Είδες έβαλα και το ":", χμμμ μάλλον αρχίζω να συμπαθώ τον τρόπο σου, ":")

 

Διόρθωσε αρχικά το post μου και μείωσε με μέχρι θανάτου, μέχρι αιξαθλίοσης μαίχρη να με κάνεις ένα με το δάπεδο για τα Ελληνικά μου. (Μπράβο όμως καλός είσαι τσίμπησες στην παγίδα μου και τα βρήκες στο προηγούμενο, έλα τώρα έχει πολύ τροφή εδώ.)..(Μηλάμε και λάθι και σε τελείες με παρανθέσεις...)..

Κατόπιν κλάψου εδώ και σε ότι άλλο φόρουμ είσαι για το πως σου απαντάμε. Και τέλος πόσταρε ένα νέο θέμα με τίτλο πως θα ξεκινήσω να βάζω στοιχεία σε ένα πίνακα από την 2 θέση γιατί από την πρώτη έμαθες.

Λοιπόν είναι δικαίωμα μου να απαντάω με όποιο τρόπο θέλω χωρίς να σε βρίζω, και ναι δεν το αρνούμε πέθανα στο γέλιο με το θέμα αυτό με τον πίνακα το οποίο δείχνει ένα πράγμα. Ότι βέβαια θέλεις να μάθεις προγραμματισμό αλλά μάλλον ακόμα δεν έχεις μάθει να σκέφτεσαι. Η απάντηση μου στο μήνυμα σου μπορεί να είχε και τόνο χιούμορ το οποίο εσύ δεν διαθέτεις από ότι φαίνεται γιατί αρπάζεσαι με όλους και κλασσικά σινταγή σου να απαντάς με τα λάθη στην Ελληνική γραμματική. Όσον αφορά αν με ξέρουν ή όχι εδώ μέσα ποιος είμαι, εσύ ζητάς βοήθεια για κάνε μία αναζίτησι να βρεις τι σημαίνει να δίνεις βοήθεια. Βάλε Bokarinho, DirectX, Bilco, Georgemarios και συγγνώμη που ξεχνάω κάποιους. Για αυτό άστο καλύτερα είσαι πολύ πίσω. Σαν "μικρότερος" πάντως ζητάω συγγνώμη για το ύφος μου αλλά πρόσεχε και εσύ γιατί έχω και τα προσωπικά μηνύματα που έχουμε μιλήσει και το πως σου απάντησα. Όποτε....

;)

Δημοσ.

Πάντος bokarinho αν όχι όλοι, οι περισσότεροι απο το "Hello World" έχουνε ξεκινήσει. Εντάξει μάλλον τα λες λόγο της κόντρας σας :P

Δημοσ.
Πάντος bokarinho αν όχι όλοι, οι περισσότεροι απο το "Hello World" έχουνε ξεκινήσει. Εντάξει μάλλον τα λες λόγο της κόντρας σας :P

 

οχι ολοι,

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

ειχε ομως ανορθογραφα σχολια στο κωδικα και γιαυτο απετυχε παταγωδως εμπορικα... :-(

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

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

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