ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗ Προγραμματισμός H/Y-I Παναγιώηης Σθέηζος sfetsos@it.teithe.gr Περιζζόηερα για ηον έλεγτο προζπέλαζης και ηις μεθόδοσς Static Πξώηε δήισζε ζηελ ππνγξαθή (signature) κηαο κεζόδνπ είλαη ν πξναηξεηηθόο θαζνξηζηήο πξόζβαζεο (optional access specifier), πνπ κπνξεί λα είλαη γενικός (public), ιδιωηικός (private) ή προζηαηεσόμενος (protected). Μπνξνύκε λα θαιέζνπκε κία γεληθή κέζνδν από παληνύ, ελώ κία ηδησηηθή κέζνδν κόλν από ηελ θιάζε πνπ πξνζδηνξίδεηαη. Μία πξνζηαηεπκέλε κέζνδνο κπνξεί λα ρξεζηκνπνηεζεί κόλν εληόο ηνπ παθέηνπ πνπ πξνζδηνξίδεηαη. Όηαλ ε κέζνδνο δελ πξνζδηνξίδεηαη σο γεληθή ή ηδησηηθή, ηόηε ζεσξείηαη σο πξνζηαηεπόκελε. Ιδιωηικό μέλος θαιή επηινγή, γηα ηελ κε πξόζβαζε από άιιε θιάζε. Κανένας προζδιοριζηής πξόζβαζε κόλν κέζα από ην ίδην παθέην θιάζεσλ (package) θαηάινγν (directory). Προζηαηεσόμενο μέλος ρξεζηκνπνηείηαη όηαλ ζέινπκε λα έρνπκε πξόζβαζε από θάπνηα ππνθιάζε. Γενικό μέλος όηαλ ζέινπκε λα πξνζπειαζεί θαη από άιιεο θιάζεηο, εηδηθά ζηηο κεζόδνπο. Παράδειγμα Σην παξαθάησ παξάδεηγκα ζα γξάςνπκε ηελ γλσζηή κέζνδν κεηαηξνπήο ρηι. ζε κίιηα κε ηνλ ηδησηηθό πξνζδηνξηζηή, ώζηε ε πξόζβαζε λα γίλεηαη κόλν από ηελ ίδηα θιάζε. class KmToMilesMethod private static final double MILES_PER_KILOMETER = 0.621; public static void main(string[] args) String kmstr; Παλαγηώηεο Σθέηζνο, Θεσξία Java 1
double km =320.05; double mi; //... ypologismos mi = convertkmtomi(km); } //... emfanisi apotelesmatos System.out.println(km + " hiliometra einai " + mi + " miles."); //metatropi se milia private static double convertkmtomi(double kilometers) double miles = kilometers * MILES_PER_KILOMETER; return miles; Τν απνηέιεζκα: Προζοτή!! Η κέζνδνο convertkmtomi(double kilometers) δελ κπνξεί πιένλ λα πξνζπειαζεί από άιιε θιάζε. Δειαδή, αλ ηξνπνπνηήζνπκε ηνλ θώδηθα ηνπ παξαδείγκαηνο ζύκθσλα κε ηελ παξαθάησ παξαιιαγή: class KmToMilesMethod1 private static final double MILES_PER_KILOMETER = 0.621; //metatropi se milia private static double convertkmtomi(double kilometers) double miles = kilometers * MILES_PER_KILOMETER; return miles; Παλαγηώηεο Σθέηζνο, Θεσξία Java 2
class TestKmToMilesMethod1 public static void main(string[] args) String kmstr; double km =320.05; double mi; //... ypologismos mi = KmToMilesMethod1.convertKmToMi(km); //... emfanisi apotelesmatos System.out.println(km + " hiliometra einai " + mi + " miles."); Θα πάξνπκε ην παξαθάησ απνηέιεζκα πνπ ζεκαίλεη όηη δελ ππάξρεη πξόζβαζε ζηελ κέζνδν convertkmtomi(double kilometers), από άιιε θιάζε. Παλαγηώηεο Σθέηζνο, Θεσξία Java 3
Περιζζόηερα για ηις Σηαηικές Μεθόδοσς ή μεθόδοσς κλάζεων - Εμ νξηζκνύ νη κέζνδνη δελ είλαη ζηαηηθέο, δειαδή δελ είλαη κέζνδνη θιάζεσλ, αιιά κέζνδνη αληηθεηκέλσλ. Πξέπεη λα νξηζηνύλ static. - Όηαλ νξίδεηαη κία ζηαηηθή κέζνδνο ζε κία θιάζε, ηόηε όια ηα αληηθείκελα ηεο θιάζεο κνηξάδνληαη έλα αληίγξαθν ηεο ζηαηηθήο κεζόδνπ. - Αλ ε ζηαηηθή κέζνδνο βξίζθεηαη ζε άιιε θιάζε ηόηε θαιείηαη κε ην όλνκα ηεο θιάζεο. Αλ βξίζθεηαη ζηελ ίδηα θιάζε ηόηε θαιείηαη απ επζείαο. 1 ο Παράδειγμα Σην παξαθάησ παξάδεηγκα ζα θηηάμνπκε κία ζηαηηθή κέζνδν πνπ ζα ππνινγίδεη ηελ παξάγσγν ελόο αθεξαίνπ. Πξνζέμηε ηελ θιήζε ηεο ζηαηηθήο κεζόδνπ factorial (int n). class FactorialTest static long factorial (int n) int i; long result=1; for (i=1; i <= n; i++) result *= i; } return result; } public static void main(string args[]) int n; int i; long result; for (i=1; i <=10; i++) result = factorial(i); System.out.println(result); } Παλαγηώηεο Σθέηζνο, Θεσξία Java 4
Το αποηέλεζμα: 2 ο Παράδειγμα Σην παξάδεηγκα απηό ζα ιύζνπκε ηελ άζθεζε ηεο απιήο κηζζνδνζίαο κε δύν παξαιιαγέο. Σηελ πξώηε παξαιιαγή ν αθαζάξηζηνο θαη ν θαζαξόο κηζζόο ζα ππνινγίδνληαη ζε κεζόδνπο αληηθεηκέλσλ, ελώ ζηελ δεύηεξε παξαιιαγή ζε ζηαηηθέο κεζόδνπο κεζόδνπο θιάζεσλ. Πξνζέμηε ηνλ δηαθνξεηηθό ηξόπν θιήζεσο ησλ κεζόδσλ ζηηο δύν παξαιιαγέο. Σαο ππελζπκίδσ όηη ν αθαζάξηζηνο θαη ν θαζαξόο κηζζόο ππνινγίδνληαη κε ηηο ζρέζεηο: ΑΚΜ = Μέρες Εργαζίας x Ημερομίζθιο + 0.2 x Ημερομίζθιο x Υπερωρίες ΚΜ = ΑΚΜ (ΑΚΜ X Σσνη_Κραηήζεων) Α-Παραλλαγή (μέθοδοι ανηικειμένων): class Employee String name; int meres; double hm; double yper; double synt; Employee(String name, int meres, double hm, double yper, double synt) this.name=name; this.meres=meres; this.hm=hm; this.yper=yper; Παλαγηώηεο Σθέηζνο, Θεσξία Java 5
this.synt=synt; } public double ak_misth(int m,double h,double w) double ak_m=m*h+0.2*h*w; return ak_m; } public double kath_misth (double ak_m, double s) double k_m=ak_m-(ak_m*s); return k_m; class misthos2 public static void main(string args []) Employee Ypal=new Employee("Nikas Nikos", 25, 60.5, 10.5, 0.25); double akm=ypal.ak_misth (25, 60.5, 10.5); double km=ypal.kath_misth (akm, 0.25); System.out.println ("Onom/mo : " +Ypal.name); System.out.println ("Akatharistos Mishos= " + akm); System.out.println ("Katharos Misthos= " + km); Το αποηέλεζμα: Παλαγηώηεο Σθέηζνο, Θεσξία Java 6
Β-Παραλλαγή (ζηαηικές μέθοδοι μέθοδοι κλάζεων): class Employee public static double ak_misth(int m,double h,double w) double ak_m=m*h+0.2*h*w; return ak_m; } public static double kath_misth (double ak_m, double s) double k_m=ak_m-(ak_m*s); return k_m; class TestMisthos public static void main(string args []) String name="nikas Nikos"; int Meres=25; double Hmer=60.5; double Yper=10.5; double Synt=0.25; double akm = Employee.ak_misth (Meres, Hmer, Yper); double km = Employee.kath_misth (akm, Synt); System.out.println ("Onom/mo : " + name); System.out.println ("Akatharistos Mishos= " + akm); System.out.println ("Katharos Misthos= " + km); Παλαγηώηεο Σθέηζνο, Θεσξία Java 7
Το αποηέλεζμα θα είναι ηο ίδιο με ηην προηγούμενη παραλλαγή: Προζοτή!! Σηελ παξαιιαγή απηή δελ ρξεζηκνπνηείηαη αληηθείκελν. Έηζη ε είζνδνο ησλ ζηνηρείσλ ηνπ ππάιιεινπ γίλεηαη κε απιέο κεηαβιεηέο θαη όρη κε αξρηθνπνίεζε κέζσ δνκεηή. Παλαγηώηεο Σθέηζνο, Θεσξία Java 8