Minęło już trochę czasu od publikacji strony i jak do tej pory nic się nie ukazało. Było to spowodowane pochłaniającym mnie innym zajęciem, które równierz zmuszało mnie poniekąd do pracy przed komputerem, a zarazem, uniemożliwiało rozwijanie tej witryny. Jednak w tej chwili praca z tym językiem będzie moim osobistym priorytetem(przynajmniej przez około 2 miesiące), a zatem blog ten będzie aktualizowany w miarę często(szczerze postaram się).

Przechodząc jednak do rzeczy, dzisiaj zajmę się pierwszą częścią podstaw tego języka, która będzie niezbędna przy realizacji większego projektu, który już czeka w kolejce. Informacja na temat jak i czym kompilować pliki java, a także jakiego środowiska używać znajdziecie w zakładkach w górnej części strony.

Zaczynamy:

Pakiety: Pakiet w Java to zbiór plików zawierających klasy, umieszczone w katalogu o nazwie takiej jak nazwa pakietu. Aby zaznaczyć, że plik należy do pakietu, należy jako pierwszy element, pomijając komentarze, zadeklarować słowem package przynależność do pakietu. Oczywiście po tym słowie następuje nazwa pakietu, np.

package mojpakiet;
public class PierwszaKlasa{
//ciało klasy
}

W ten sposób dołączamy plik do pakietu “mojpakiet”. Konwencja nazywania pakietów polega na używaniu tylko małych liter! Warto równierz pamiętać, że pliki pakietu umieszczamy w katalogu o takiej samej nazwie jak nazwa pakietu!

Jak korzystać z pakietów? Aby skorzystać z “PierwszejKlasy” należy użyć słowa import. A oto meteody używania pakietów:

import mojpakiet.*; // włączamy cały pakiet(wszystkie klasy i interfejsy)
/* import mojpakiet.PierwszaKlasa; //importujemy tylko potrzebną klasę
PierwszaKlasa pk = new PierwszaKlasa();
//utworzenie referencji i rezerwacja pamięci klasy z pakietu “mojpakiet”

Możemy równierz zrobić to w ten sposób:

mojpakiet.PierwszaKlasa pk = new mojpakiet.PierwszaKlasa();

Jest to sposób z pewnością mniej praktyczny, aczkolwiek skuteczny.

Ok. Tyle o pakietach. Teraz trochę o tym jak pobierać dane z wejścia w Javie. Może przeanalizujmy trochę kodu:
import java.io.*;
public class Czytacz{
public static int dajInt(){
int wynik;
String str;
BufferedReader we = new BufferedReader(InputStreamReader(System.in));
try{
str = we.readLine();
}catch(java.io.IOException e){
str = “0″;
}
try{
wynik = Integer.valueOf(str).intValue();
}catch(Exception e){
wynik = 0;
}
return wynik;
}
}

Oczywiście na początku importujemy pakiet dostarczony przez producenta kompilatora, firmę sun microsystems. Jak uzyskać dostęp do pełnej dokumentacji pakietów dostarczonych wraz z kompilatorem, można przeczytać w dziale API. Nam pakiet java.io.* posłuży do wczytaywania danych z klawiatury.
Na początku definujemy publiczną klasę Czytacz, która posłuży jako zbiornik dla metod służących do odczytu.
W tym miejscu warto zarócić uwagę na fakt, że odczytywanie danych w Java jest specyficzny i odbiega od tego jaki był np. w C czy C++. W przypadku Java musimy deklarować funkcje, która będzie odczytywała dane o określonym typie.
Na początku metody dajInt() tworzymy zmienne prostego typu. Pierwsza zmienna to “wynik” do przechowywania odczytanej liczby całkowitej. Zmienna “str” posłuży jako tymczasowy “nośnik” dla odczytywanej zmiennej. To właśnie String będzie przekształcony w int, i jako int wyświetlony.

Kolejną rzeczą, którą należy wykonać, będzie utworzenie referencij typu BufferedReader wraz z rezerwacją pamięci dla obiektu tego typu.

Jeśli chodzi o język Java należy pamiętać, że posługujemy się referencjami do obiektu, a nie samym obiektem. W przypadku, gdy ostatnia referencja do obiektu przestaje istnieć, sam obiekt trafia do “odśmiecacza”. “Odśmiecacz” jest mechanizmem, który zwalnia pamięć z obiektów bez referencji(z takich, do których nie można się w żaden sposób odwołać, a za tem dla programistów i tak one nie istnieją). To co powoduje, że mechanizm z jednej strony jest wygodny, a z drugiej trochę mało efektywny, jest fakt, że nie działa on natychmiast po tym jak ostatnia referencja do obiektu przestanie istnieć. Może inaczej - nie ma gwarancji, że w tym samym momencie przestanie istnieć obiekt. Dodatkowo mechanizm ten, jako, że funkcjonuje on bez przerwy(w trakcie działania programu głównie), zajmuje on pewne zasoby. Zatem aplikacje czasu rzeczywistego napisane w tym języku będą nieefektywne. Chociaż w aktualnej wersji maszyny wirtualnej oraz kompilatora Javy, mechanizm ten działa wydajnie, to należy stwierdzić, że język ten jest dedykowany do rozwiązań, których szybka praca “teraz” nie jest priorytetem.

W przykładzie tym mamy utworzony jeden obiekt bez referencji. Będzie on potrzebny konstruktorowi obiektu BufferedReader, który jako parametr przyjmuje źródło z którego będzie czytać. W naszym przypadku będzie to strumień wejściowy InputStreamReader. W tym przypadku równierz tworzymy obiekt, którego konstruktor pobiera źródło danych.

Referencja biektu InputStreamReader nie istnieje. Obiektu tego potrzebujemy tylko w chwili tworzenia obiektu BufferedReader, aby podać źródło pobierania danych. Zatem niemal natychmiast trafia do kolejki odśmiecacza.

Teraz potrzebujemy dwa bloki try-catch. Bloki te służą do wykonywania instrukcji obarczonych ryzykiem. Wywołują klasę wyjątku (przeskakują do instrukcji catch), w momencie gdy instrukcja się nie powiedzie.

W pierwszym bloku jest to próba odczytania danych ze strumienia, a następnie przypisanie ich do zmiennej “str”. Jeżeli dana operacja nie powiedzie się, sterowanie trafia do bloku catch, wywołują klasę wyjątku IOException, a następnie do zmiennej “str” przypisuje łańuch tekstowy - “0″;

Drugi a zarazem ostatni blok naszego mini programu służy do przekształcenia naszej zmiennej “str” w zmienną typu Integer, a następnie przypisanie rezultatu do zmiennej “wynik”. Jeżeli na tym etapie kompilator zauważy jakąś nieprawidłowość zgłosi wyjątek, którego prócz wywołania wyjątku ogólnego, przypisze zmiennej “wynik” zero. Co ważne instrukcje te zostną wywoła tylko i wyłącznie gdy instrukcje z pierwszego bloku try-catch nie zgłoszą wyjątku. Zgłoszenie wyjątku w tym przypadku, kończy działanie tej metody.

OK. Na sam koniec, pokażę jak stworzyć metodę główną, dzięki której możliwe jest przetestowanie wszystkich naszych dzisiejszych zmagań z tym językiem. Kod ten zamieszczamy jako nową metodę naszej klasy. Metodę tą tworzymy tylko raz w naszych programach, nie mogą istnieć jednocześnie dwie metody main. Umieszczamy ją z reguły w klasie, która jest naszą główną klasą naszego programu.

public static void main(String args[]){
//tworzymy zmienną int, która będzie nam potrzebna do wyświetlania wyniku
int a;
//pobiera zmienną przez zdefiniowaną przez nas metodę, wynik przepisuje do zmiennej a
a = Czytacz.dajInt();
//wyświetla wynik
System.out.println(a);
}

O funkcji głównej napiszę tylko tyle, że jako argument metoda ta pobiera tablicę Stringów args, ta z kolei przechowuje wyrazy podane przy uruchamianiu programu z linii komend. Metoda ta stanowi serce naszego programu i jest niezbędna do jego uruchomienia. Funkcja wyświetlająca(Systam.out.println()) natomiast nie jest wymyślona tak sobie. Można jej używać bez importowania żadnego api dlatego, iż jest podstawową metodą systemową.

Dla osób które zrozumiały ten temat, proponuję wykonać dwie dodatkowe metody dla typu double oraz String, a następnie uruchomić je w metodzie main(). Na dzisiaj tyle…