Języki programowania obiektowego
Laboratorium nr 1
Akademia Górniczo-Hutnicza
Katedra Robotyki i Mechatroniki
Wstęp
Programowanie w języku Java, tak samo jak w innych językach, wymaga posiadania
zainstalowanych oraz odpowiednio skonfigurowanych narzędzi programistycznych. W przypadku
języka Java konieczne jest posiadanie co najmniej pakietu Java SDK dystrybuowanego na
specjalnych warunkach poprzez firmę Sun Microsystems. Pakiet dostępny jest jest nieodpłatnie pod
adresem:
http://java.sun.com/javase/downloads/index.jsp
. Po zainstalowaniu pakiet zawiera między
innymi narzędzia:
•
javac – kompilator,
•
java - interpreter,
•
appletviewer – przeglądarka apletów,
•
javadoc - generator dokumentacji,
•
jdb – debuger,
•
jar – narzędzie do tworzenia archiwów.
Przykład 1
Pierwszą czynnością jaką należy wykonać przed przystąpieniem do tworzenia programów w danym
języki jest sprawdzenie czy wszystkie elementy środowiska programistycznego którego chcemy
używać działają poprawnie. W naszym przypadku konieczne jest sprawdzenie czy narzędzia są
poprawnie zainstalowane w systemie. Można tego dokonać na kilka sposobów. Jeden z nich polega
na:
–
uruchomieniu okna konsoli (Start -> Uruchom, wpisanie cmd)
–
w oknie konsoli wpisanie: javac -version
–
system powinien odpowiedzieć wypisując bieżącą wersję kompilatora jawy np:
Jeśli odpowiedź jest inna np:
„Nazwa 'javac' nie jest rozpoznawana jako polecenie wewnętrzne lub zewnętrzne,
program wykonywalny lub plik wsadowy.”
oznacza to iż środowisko jest skonfigurowane niepoprawnie. Jeśli mamy pewność iż instalacja
przebiegła poprawnie problem może dotyczyć braku dodania jawy do zmiennej systemowej
„PATH”.
Tworzenie i uruchomienie programu
Utworzenie i uruchomienie programu za pomocą języka Java polega na:
•
utworzeniu dokumentu tekstowego za pomocą dowolnego dostępnego edytora tekstowego
(np. notatnik w systemach Windows).
•
wypełnieniu utworzonego dokumentu treścią programu zgodnie z regułami i składnią języka
programowania, przy czym należy pamiętać o tym że:
•
każdy program w Javie jest zestawem klas,
•
klasa jest podstawową jednostką enkapsulacji (nie można pisać kodu poza definicją
klasy).
•
pisany przez nas program może być zapamiętany w jednym lub wielu plikach
źródłowych o rozszerzeniu "java".
•
klasa uruchomieniowa musi zawierać statyczną metodę „main” o postaci:
public static void main(String args[]) { ... }
•
zapisaniu treści dokumentu w postaci pliku dyskowego posiadającego rozszerzenie *.java
(przy czym należy przestrzegać następującej konwencji dotyczącej nazewnictwa – nazwa
klasy powinna być zgodna z nazwą pliku, który przechowuje program),
•
wykonaniu kompilacji kodu źródłowego do postaci kodu bajtowego. Kompilacja
wykonywana jest za pomocą narzędzia javac.exe. Jej wynikiem jest otrzymanie plików
skompilowanych o nazwach zawierających rozszerzenie *.class. Podczas kompilacji pliku
źródłowego każda klasa zostaje przeniesiona do swojego własnego pliku o nazwie
właściwej zgodnej z nazwą klasy i rozszerzeniu "class".
•
uruchomienie programu za pomocą narzędzia java.exe. Przykładowe wywołanie pokazane
jest poniżej: java nazwa_pliku arg1 arg2.
Przykład 2
Zgodnie z tradycją każdego z kursów, związanego z początkami programowania w jakimś z
języków programowania, jest utworzenie najprostszego programu pozwalającego na wyświetlenie
wiadomości tekstowej w oknie konsoli. Do wykonania tego zadania konieczne jest wykonanie
następujących kroków:
–
utworzenie
–
utworzenie nowego dokumenty tekstowego (np. w notatniku)
–
umieszczenie w dokumencie kodu programu np:
public class Test{
public static void main(String[] arg){
System.out.println("To jest probny komunikat!");
}
}
–
zapisanie utworzonego pliku. Nazwa pliku powinna być zgodna z nazwą definiowanej klasy
oraz powinna mieć rozszerzenie .java. W tym konkretnym przypadku będzie to „Test.java”
–
skompilowanie programu za pomocą narzędzia javac. Np. javac Test.java
–
uruchomienie programu za pomocą narzędzia java. Np. java Test
Zastosowanie zintegrowanego środowiska programistycznego
W celu ułatwienia wykonywania przedstawionych powyżej czynności tworzone są środowiska
programistyczne pomagające programistom na szybkie tworzenie programów. Obecnie istnieje całe
mnóstwo narzędzi ułatwiających tworzenie programów. W sieci można znaleźć ponad 100 różnych
narzędzi poprawiających komfort tworzenia oprogramowanie jedynie w Javie. Jednym z najbardziej
popularnych obecnie środowisk programistycznych jest Eclipse. Narzędzie to dostępne jest
nieodpłatnie na zasadach wolnego oprogramowania na stronie:
. Poniżej pokazane
jest zastosowanie programu Eclipse do wykonania podstawowych kroków tworzenia
oprogramowania za pomocą języka Java.
1. Tworzenie projektu
W Eclipse najważniejszym pojęciem organizacji pracy jest projekt. Zajmiemy się utworzeniem
projektu, który będzie zawierał program napisany w Javie.
Aby utworzyć nowy projekt:
•
Uruchom Eclipse
•
Wybierz File -> New -> Project
•
Z listy kategorii wybierz "Java"
•
Z listy projektów wybierz "Java Project"
•
Wpisz nazwę projektu, np. "Hello World"
•
Wciśnij "Finish"
2. Tworzenie klasy
Najprostszy program w Javie składa się z pojedynczej klasy i metody main().
Aby stworzyć klasę w projekcie:
•
W widoku Navigatora, kliknij prawym klawiszem na projekt i wybierz New->Class
•
W pole Name wpisz "HelloWorld"
•
zaznacz, że chcesz stworzyć metodę main() (checkbox na dole)
•
Wciśnij Finish
3. Uruchamianie programu
Wypełnijmy utworzoną klasę kodem. Wpiszmy na przykład w metodzie main():
System.out.println("To jest mój pierwszy program w jawie!!");
Następnie zapiszmy projekt (File->Save lub Ctrl+S). Zauważmy, że efektem zapisania jest również
skompilowanie programu.
Na pasku zadań wciśnij przycisk Run (zielona strzałka).
Pokaże się okno konfiguracji uruchamiania. Wybierz "Java Application" i wciśnij "New".
Następnie wciśnij Run.
Na dole, w widoku Console, otrzymasz wynik programu. Gratulacje! Właśnie stworzyłeś,
skompilowałeś i uruchomiłeś pierwszy projekt w Eclipse :)
4. Użycie perspektyw i widoków
Główne okno Eclipse'a to tak zwany Workbench. W Workbenchu mogą znajdować się różne
Edytory oraz Widoki. Każdy układ Edytorów i Widoków stanowi Perspektywę. Pracując nad
projektem, możemy przełączać się między uruchomionymi perspektywami, a także dodawać nowe.
•
Przełącz się z perspektywy Java na perspektywę Resource. Możesz to zrobić, klikając
zakładkę Resource w prawym górnym rogu ekranu.
•
Zauważ, że niektóre widoki zniknęły, a na ich miejsce pojawiły się inne.
•
Wróć do perspektywy Javy, klikając zakładkę Java tuż obok Resource.
W ramach każdej perspektywy można przełączać się między widokami.
•
Wybierz z menu Window -> Show View -> Javadoc
•
Zauważ, jak na dole pojawił się widok Javadoc.
•
Możesz przetestować działania tego widoku. Kliknij na nazwę klasy HelloWorld w edytorze
lub w widoku Outline.
•
W widoku Javadoc pojawi się Javadoc odpowiadający wybranej klasie (został on
automatycznie wygenerowany przez Eclipse podczas tworzenia klasy, należy go oczywiście
zmienić).
5. Autopoprawianie
Jedną z licznych zalet Eclipse'a jest ogromne ułatwienie dla użytkownika, jakim jest wykrywanie
błędów składniowych jeszcze przed próbą kompilacji oraz ich automatyczne poprawianie.
Zmodyfikuj kod metody main(), aby wyglądała tak:
public static void main(String[] args) {
ArrayList n;
System.out.println("Hello World");
}
Zauważ, że słowo ArrayList zostało podkreślone na czerwono. To znaczy, że Eclipse znajduje w
tym miejscu błąd składni.
Wciśnij Ctrl+S - faktycznie, podczas kompilacji pojawił się błąd.
Jeśli spojrzymy na widok "Problems" (na dole ekranu), to zauważymy czerwony X i opis problemu:
nigdzie nie zdefiniowaliśmy typu ArrayList. Dodatkowo, Eclipse może automatycznie poprawić
błąd.
•
Wciśnij żarówkę z iksem po lewej stronie błędnej linii w edytorze. Możesz również kliknąć
prawym klawiszem na wpis w widoku Problems i wybrać QuickFix
•
Pojawi się lista sugerowanych przez Eclipse poprawek.
•
Wybierz "Import ArrayList (java.util)"
•
Zauważ, że na górze kodu pojawiła się nowa linijka, importująca odpowiedni moduł.
Eclipse potrafi wykrywać również bardziej wyrafinowane błędy, np. brak obsługi wyjątków
rzucanych przez wywołaną metodę.
6. Autouzupełnianie
Oprócz poprawiania błędów, edytor Eclipse'a wspomaga również pisanie kodu. Sprawdzimy to,
tworząc pętlę wypisującą 10 liczb, zaczynając od 1.
Dopisz do metody main() następujące linijki:
int limit = 10;
for
Następnie po for, zamiast spacji, naciśnij Ctrl+Space.
Pojawi się okienko z listą możliwych uzupełnień sugerowanych przez Eclipse. Wybierz "iterate
over array". Zauważ, że po pojedynczym kliknięciu myszki na wybraną opcję pojawia się jej
podgląd.
Do kodu został dodany szablon ze zmiennymi do uzupełnienia. Zauważ, że Eclipse próbował
zgadnąć, jaki będzie warunek końcowy pętli.
Każde obramowane na zielono pole szablonu możemy zmieniać, a zmiany zostaną odzwierciedlone
w szablonie.
Wciśnij TAB, aby przejść do warunku końca pętli. Zmień go na x < 10.
Do ciała pętli wpisz coś w rodzaju:
System.out.println("Liczba: " + i);
Zauważ, że jeśli napiszesz tylko System.out. i wciśniesz Ctrl+Space lub poczekasz chwilę, to
również pojawi się okno z podpowiedziami.
Zapisz (Ctrl+S) i wykonaj program.
7. Debugowanie kodu
Ponownie zmodyfikujmy treść głównej metody main(), aby wyglądała tak:
public static void main(String[] args) {
ArrayList n;
int x = 1;
System.out.println("Hello World");
x = 2;
System.out.println("Oto liczba: " + 2);
}
Spróbujemy dodać breakpoint w linii Hello World i sprawdzić, jaka jest wartość zmiennej x.
•
Kliknij dwukrotnie lewym klawiszem myszki po lewej stronie od linii wypisującej Hello
World, na pierwszym pionowym pasku edytora (powinien być zacieniony na niebiesko).
Pojawi się niebieska kropka, oznaczająca ustawienie breakpointu.
Możesz również wybrać z menu Run -> Toggle Line Breakpoint.
•
Jeśli klikniesz prawym klawiszem na kropkę i wybierzesz Breakpoint Properties, możesz
ustawić dodatkowe właściwości breakpointu, takie jak warunek zatrzymania czy licznik
wywołań. Teraz jednak nie będzie to nam potrzebne.
•
Zapisz projekt (Ctrl+S) i wybierz z menu Run -> Debug..., po czym wciśnij Debug w oknie,
które się pojawi.
•
Eclipse zapyta, czy przełączyć się na Perspektywę Debugowania. Potwierdź.
•
Zauważ, że układ widoków zmienił się i jest dużo wygodniejszy do obsługi debugowania
niż zwykła perspektywa Java.
•
Program zatrzymał się przed wykonaniem zaznaczonej linii.
•
Spójrz w prawy górny róg, na widok Variables. Możemy stwierdzić, że x ma wartość 1, a
metoda main dostała pustą listę argumentów.
•
Na belce na górze mamy podstawowe przyciski obsługi debugowania: Kontynuacja,
Zatrzymanie, Step Into oraz Step Over.
•
Wciśnij Step Over. Zauważ, że w Console wypisał się "Hello World"
•
Ponownie wciśnij Step Over. Wartość x zmieniła się na 2. Eclipse dodatkowo podkreśla
zmianę, zaznaczając zmienną kolorem czerwonym w widoku Variables.
•
Wciśnij Resume, aby dokończyć działanie programu.
•
Wróć do widoku Java (klikając fiszkę "Java" w prawym górnym rogu ekranu")
•
Wyłącz breakpoint, dwukrotnie klikając lewym klawiszem myszki na niebieską kulkę.
Inne przydatne funkcje
Importowanie już napisanego programu do Eclipse'a
Jeżeli zaczęliśmy tworzyć jakiś projekt w innym środowisku niż Eclipse, możesz importować ten
projekt do Eclipse'a. W tym celu należy stworzyć nowy projekt w Eclipse a następnie:
•
użyć polecenia File->Import...
•
lub skopiować pliki ręcznie do utworzonego przez Eclipse katalogu projektu, a następnie
kliknąć prawym klawiszem na nazwę projektu w widoku i wybrać Refresh From Local.
Uzyskiwanie pomocy
Eclipse posiada duże możliwości związane z podpowiadaniem składni poprawianiem błędnie
wprowadzonego kodu. Część z tych możliwości pokazana została w poprzednich częściach tego
dokumentu. Wszystkie informacje zawarte w podpowiedziach mogą być dostępne także z poziomu
menu Help środowiska.
Inną możliwością uzyskania pomocy dotyczącej klas dostarczanych wraz z pakietem Java SDK jest
wykorzystanie dokumentacji dostarczanej bezpośrednio przez Sun. API (Application Program
Interface) bibliotek dostarczanych wraz z SDK dostępne jest on-line na stronie
http://java.sun.com/javase/6/docs/api/
Tworzenie dokumentacji wykonywanego programu
Do opisu fragmentów kodu źródłowego programu używa się komentarzy. Na ich podstawie,
używając programu javadoc można później wygenerować dokumentację. Najczęściej opisuje się
elementy takie jak klasy, metody, interfejsy czy obiekty. Komentarze powinny być krótkie oraz
precyzyjne. Należy je umieszczać bezpośrednio przed dokumentowanym elementem programu.
•
Aby tekst komentarza został rozpoznany przez javadoc, musi być umieszczony pomiędzy
sekwencjami znaków /** i */.
•
Początkowe znaki * w kolejnych wierszach są pomijane.
•
Każdy wiersz zawierający znak @, po którym następuje jeden ze znaczników
dokumentacyjnych, powoduje utworzenie w dokumentacji oddzielnego paragrafu.
•
Polecenie wygenerowania dokumentacji ma postać:
•
javadoc nazwa_pliku.java
•
Jego wynikiem jest zbiór plików z opisem w formacie HTML.
Wybrane znaczniki dokumentacyjne Javy:
•
@author
– informacje o autorze programu,
•
@version
– informacje o wersji programu,
•
@return
– opis wyniku zwracanego przez metodę,
•
@serial
– opis typu danych i możliwych wartości przyjmowanych przez zmienną,
•
@see
– tworzy łącze do innego tematu,
•
@since
– opis wersji, od której zaistniał określony fragment kodu,
•
@deprecated
– informacje o elementach zdeprecjonowanych (które nie są zalecane),
•
@param
– opis parametru wywołania metody,
•
@exception
– identyfikator wyjątku.
Wybrane pakiety klas dostarczanych razem z Java SDK
Klasa System
Jest jedną z częściej wywoływanych klas w programach Javy. Zawiera ona kilka użytecznych
metod związanych z dostępem do ustawień środowiska zmiennych środowiskowych, posiada środki
do wczytywania plików i bibliotek. Posiada także narzędzia do szybkiego kopiowania części
zmiennych tablicowych. Najczęściej używanym składnikiem klasy system jest jednak możliwość
dostępu do strumieni wejściowych, wyjściowych oraz strumienia błędów. Najczęstsze użycie klasy
System związane jest z wypisaniem danych wynikowych związanych z działaniem danego
programu. W tym celu konieczne jest wykorzystanie składni:
System.out.println(„String do wypisania”).
W powyższym przykładzie out reprezentuje strumień wyjściowy którego metoda println()
powoduje wypisanie zmiennej typu String na konsoli.
Możliwe jest także wykorzystanie klasy System do pobierania danych ze standardowego wejścia
(najczęściej jest nim klawiatura).
Klasa String
Klasa String jest wbudowaną klasą Javy. Jej obiekty używane są do przechowywania łańcuchów
znaków. Obiekty klasy String tworzy się bardzo łatwo, np.:
String s;
//utworzenie zmiennej referencyjnej
s =
"abc"
;
//utworzenie obiektu zawierającego napis abc
Instrukcje te można połączyć, pisząc:
String s = "abc";
Nazwa typu String zaczyna się od dużej litery, ponieważ jest to nazwa typu obiektowego. Raz
utworzone obiekty klasy String nie mogą ulegać zmianom – ich zawartość jest tylko do odczytu.
Operacje przeprowadzane na stringach tworzą nowe obiekty klasy String. Nieużywane stringi są
automatycznie usuwane z pamięci.
Operacje jakie mogą być wykonywane są dostępne poprzez:
–
operatory konkatenacji (łączenia)
–
metody klasy String
Operatory konkatenacji + oraz += są jedynymi operatorami przeciążonymi w Javie - oprócz
sklejania łańcuchów, pozwalają również na ich łączenie z liczbami lub obiektami innych klas.
Przykłady ich wykorzystania pokazane są poniżej:
int
n = 10;
String str, str1, str2, str3, str4;
str =
"napis"
;
str1 = str + n;
// napis10
str2 = str + n + n;
// napis1010
str3 = str + (n + n);
// napis20
str4 = n + n + str;
// 20napis
Metody klasy String pozwalają na wykonanie dodatkowych operacji np:
String s=
"aBCDe"
, s1, s2;
//obiekty
int
dl=s.length();
//dl=5
int
k=s.indexOf('C');
//k=2
int
l=s.indexOf('Z');
//l=-1
s1=s.toLowerCase();
//s1=abcde
s2=s.toUpperCase();
//s2=ABCDE
boolean
b1=s1.equals(s2);
//b1=false
boolean
b2=s1.equals(s1);
//b2=true
String s3=s.substring(0,2);
//s3=aB
char
znak=s.charAt(2);
//znak=C
Porównywanie Stringów - do porównywania zawartości dwóch obiektów typu String służy
metoda equals(). Zwraca ona wartość true w przypadku gdy zawartość porównywanych obiektów
jest identyczna oraz false w przeciwnym przypadku. Do porównywania można też zastosować
metodę compareTo() jednak ona zwraca zero, gdy stringi są równe. Użycie operatora „==” może
prowadzić do błędów ponieważ operator ten pozwala jedynie stwierdzić, czy zmienne referencyjne
odwołują się do tego samego obiektu.
Przykłady użycia:
String s =
"abc"
;
s = s+12;
String s1 =
"abc12"
;
boolean
b1 = s==s1;
//false
boolean
b2 = s.equals(s1);
// true
int
k = s.compareTo(s1);
// 0
Przekształcanie liczb na łańcuchy:
●
Konwersję liczb do postaci łańcuchów znakowych przeprowadza się za pomocą metody
valueOf() klasy String. Na przykład:
double x = 12.31;
int n = 100;
String s1 = String.valueOf(x);
String s2 = String.valueOf(n);
●
Innym (bardziej kosztownym) rozwiązaniem jest użycie operatorów konkatenacji, np:
double
x = 12.31;
int
n = 100;
String s1 =
""
+ x;
String s2 =
""
+ n;
Przekształcanie łańcuchów na liczby:
●
Do przekształcania łańcuchów w liczby stosuje się metodę parseInt():
String t="125";
int i = Integer.parseInt(t);
●
Można też posłużyć się starszą metodą valueOf() klasy Double lub Integer. Na przykład:
String s="3.14", t="10";
double x;
int i;
x=Double.valueOf(s);
i=Integer.valueOf(t);
Przykład:
package
agh.krim.jpo;
public
class
Konwersja {
/**
*
@param
args
*/
public
static
void
main(String[] args) {
//
TODO
Auto-generated method stub
String s1 =
"11.1"
;
String s2 =
"6.6"
;
double
a=Double.parseDouble(s1);
double
b=Double.parseDouble(s2);
double
suma=a+b;
String wynik = String.valueOf(suma);
System.
out
.println(a);
System.
out
.println(b);
System.
out
.println(wynik);
}
}
Klasa Math
Klasa Math grupuje instrukcje matematyczne pozwalające na wykonanie podstawowych operacji na
wartościach liczbowych. Wszystkie funkcje zadeklarowane są jako statyczne, więc można ich
używać bez tworzenia egzemplarza obiektu. Funkcje matematyczne – metody klasy Math -zwykle
operują na liczbach rzeczywistych typu double i zwracają wartości typu double. Poniżej pokazana
jest tabela grupująca składnię typowych operacji matematycznych:
Metoda
Opis
abs(x)
Wartość bezwzględną liczby x
min(a, b)
Mniejsza z liczb a i b
max(a, b)
Większą z liczb a i b
ceil(double x)
Najmniejszą liczba całkowita większą lub równa x
floor(double x)
Największa liczba całkowita mniejsza lub równa x
exp(double x)
Liczba e podniesiona do potęgi x
log(double x)
Logarytm naturalny liczby x
pow(double x, double n) Liczba x podniesiona do potęgi n
random()
Generuje liczbę losową z zakresu od 0.0 do 1.0
round(float x)
Zwraca liczbę całkowitą powstałą z zaokrąglenia liczby typu float
sqrt(double x)
pierwiastek kwadratowy z liczby x
sin(double alfa)
sinus kąta alfa (podanego w radianach)
cos(double alfa)
cosinus kąta alfa (w radianach)
tan(double alfa)
tangens kąta alfa (w radianach)
toRadians(double alfa)
Zamienia stopnie na radiany
toDegrees(double alfa)
Zamienia radiany na stopnie
Przykład użycia
Napisz program obliczający wartość wyrażenia określonego wzorem:
Wynik ma być podany z dokładnością do trzech miejsc po przecinku.
Rozwiązanie:
class
Liczby{
public
static
void
main(String args[]){
double
a = Math.cos(Math.toRadians(15));
double
b = 1+Math.sqrt(17.681);
double
w = 2*a*b*b;
w=Math.round(w*1000)/1000.0;
System.out.println(
"w= "
+ w);
}
}
Zadania do wykonania
1. Napisz program, który znajduje wszystkie trzycyfrowe liczby, których suma sześcianów
poszczególnych cyfr jest równa danej liczbie. (Wskazówki: Skorzystaj z operatorów
arytmetycznych % i / dla argumentów całkowitych, gdzie:
–
% - operator modulo - reszta z dzielenia. Na przykład wartością wyrażenia 937%10 jest
liczba 7;
–
/ - operator dzielenia całkowitego. Na przykład wartością wyrażenia 937/10 jest liczba
93 (ale wartością 937/10.0 jest liczba 93.7).
2. Napisz funkcję rysującą prostokąt o zadanych wymiarach, który składa się z samych
gwiazdek. Na przykład po wywołaniu tej funkcji z parametrami 8 i 3 powinniśmy otrzymać:
* * * * * * * *
* * * * * * * *
* * * * * * * *
Oto nagłówek funkcji
public static void rysuj_prostokat( int a, int b )
3. Napisz program obliczający wartość wyrażenia:
2
0
)
681
.
17
1
(
15
cos
2
+
=
w
3
422
128
750000000
521
log
2
⋅
+
=
w
Wskazówki:
●
Liczbę 750000000 można zapisać w postaci: double x = 7.5e8;
●
W klasie Math nie ma funkcji log10x. Można obliczyć jej wartość, stosując wzór:
10
log
log
log
10
e
e
x
x
=