6. Struktura programu. Działanie aplikacji
Jak wiemy, program w Javie jest zestawem definicji klas. Poza ciałem klasy nie może być żadnego kodu programu - oprócz dyrektywy package, dyrektyw importu oraz komentarzy.
Strukturę programu obrazuje poniższy schemat. package ... // deklaracja pakietu (niekonieczna) import ... // deklaracje importu; zwykle, ale nie zawsze potrzebne import ... // To jest klasa A public class A { ... } // To jest klasa B class B { ... } ...
Dyrektywa package służy do "umieszczenia" kompilowanych klas w nazwanym pakiecie
(w tym semestrze nie będziemy sią nią jednak zajmować). Znaczenie importów
- poznaliśmy przed chwilą.
java Work [ew. argumenty przekazywane do main jako String[ ] args] public class Main1 { public static void main(String[] args) { double a = 12.0, b = 14.0, c = 4.0; double sum = a + b + c; double avg = (a + b + c)/3; System.out.println("Suma " + sum); System.out.println("Srednia " + avg); a++; b++; c++; sum = a + b + c; avg = (a + b + c)/3; System.out.println("Suma " + sum); System.out.println("Srednia " + avg); a++; b++; c++; sum = a + b + c; avg = (a + b + c)/3; System.out.println("Suma " + sum); System.out.println("Srednia " + avg); }
Oczywiście na myśl przychodzi od razu podział programu na metody. public class Main2 { double sum(double a, double b, double c) { return a + b + c; } double average(double a, double b, double c) { return (a + b + c)/3; } void report(double a, double b, double c) { System.out.println("Suma " + sum(a, b, c)); System.out.println("Srednia " + average(a, b, c)); } public static void main(String[] args) { double a = 12.0, b = 14.0, c = 4.0; report(a, b, c); a++; b++; c++; report(a, b, c); a++; b++; c++; report(a, b, c); } } Chociaż wielkość programu zmieniła się nieznacznie, to jednak klarowne wyodrębnienie
pewnych powtarzalnych czynności w postaci metod czyni go bardziej czytelnym
i elastycznym (latwiej modyfikowalnym). Main2.java:21: non-static method report(double,double,double) cannot be referenced from a static context report(a, b, c); ^ Main2.java:25: non-static method report(double,double,double) cannot be referenced from a static context report(a, b, c); ^ Main2.java:29: non-static method report(double,double,double) cannot be referenced from a static context report(a, b, c); ^ 3 errors
Aha, przecież metoda main jest statyczna! Nie możemy odwoływac się z jej
wnętrza do niestatycznych składowych klasy Main2 (a taką jest metoda report). public class Main3 { double sum(double a, double b, double c) { return a + b + c; } double average(double a, double b, double c) { return (a + b + c)/3; } void report(double a, double b, double c) { System.out.println("Suma " + sum(a, b, c)); System.out.println("Srednia " + average(a, b, c)); } public static void main(String[] args) { double a = 12.0, b = 14.0, c = 4.0; Main3 m = new Main3(); // utworzenie obiektu m.report(a, b, c); a++; b++; c++; m.report(a, b, c); a++; b++; c++; m.report(a, b, c); } }
Ale skoro już tworzymy obiekt klasy, to nadajmy jej jakiś istotny sens. Na
przykład - niech jej obiekty będą trójkami liczb rzeczywistych. public class Trojka { double a, b, c; Trojka(double x, double y, double z) { a = x; b = y; c = z; } double sum() { return a + b + c; } double average() { return (a + b + c)/3; } void increase() { a++; b++; c++; } void report() { System.out.println("Suma " + sum()); System.out.println("Srednia " + average()); } public static void main(String[] args) { Trojka t = new Trojka(12, 14, 4); t.report(); t.increase(); t.report(); t.increase(); t.report(); } }
Główna "procedura" main (zauważmy zresztą, że umieszczona w klasie Trojka;
metoda main może przecież znajdowac się w dowolnej klasie) stała sie dzięki
temu jeszcze bardziej klarowna, a cały program jeszcze łatwiejszy do modyfikacji
i uzupełnień, bowiem dane (zmienne a, b, c - zdefiniowane jako pola) stały
się teraz dostępne dla wszystkich metod klasy i jednocześnie zachowują swoje
wartości pomiędzy wywołaniami metod, co wykorzystaliśmy definiując metodę
increase(), zwiększającą o1 wszystkie trzy dane. public class Main4 { double a = 12, b = 14, c = 4; Main4() { report(); increase(); report(); increase(); report(); } double sum() { return a + b + c; } double average() { return (a + b + c)/3; } void increase() { a++; b++; c++; } void report() { System.out.println("Suma " + sum()); System.out.println("Srednia " + average()); } public static void main(String[] args) { new Main4(); } }
Zauważmy:
|