Wprowadzenie do Javy

Z wikipedii "Java jest obiektowym językiem programowania stworzonym przez grupę roboczą pod kierunkiem Jamesa Goslinga z firmy Sun Microsystems. Java jest językiem kompilowanym do postaci wykonywanej przez maszynę wirtualną i silnie typowanym. Jej podstawowe koncepcje zostały przejęte z języka Smalltalk (maszyna wirtualna, garbage collection) oraz z języka C++ (duża część składni i słów kluczowych). Javy nie należy mylić ze skryptowym językiem JavaScript, z którym ma niewiele wspólnego (głównie składnię podstawowych instrukcji)." (zobacz więcej). W niniejszym tutorialu zajmiemy się podstawami Javy. By móc rozpocząć naukę musisz mieć zainstalowaną Javę (JRE i SDK). W przypadku linuksa sprawdź repozytoria swojej dystrybucji lub odwiedź stronę Sun Microsystems (link).

Pierwszy "program"

Stwórz plik Test.java o kodzie:
public
class Test
{
public static void main (String args[])
	{
	System.out.println("java jest cienka :)");
	}
}
A następnie by skompilować kod wykonaj w konsoli:
javac Test.java
A następnie by uruchomić otrzymany kompilat (Test.class) wykonaj:
java Test
Co wyświetli napis "java jest cienka :)"
Każdy program w Javie składa się ze zbioru klas. Przyjmuje się że każda klasa znajduje się w oddzielnym pliku o tej samej nazwie (klasa Test w Test.java itd.). Wykonywanie programu rozpoczyna się od funkcji "main", która musi być zadeklarowana jako publiczna i statyczna. By napisany kod uruchomić musi on zostać skompilowany do bytecodu javy - formy zrozumiałej dla komputera.

Zmienne

Zmienna to miejsce przechowujące pewną wartość. Zmienna ma określony typ i nazwę. Typy liczbowe całkowite przechowują wartości liczb całkowitych. Dostępne typy to byte (od -128 do 127), short (od -32 768 do 32 767), int (od -2 147 483 648 do 2 147 482 647) oraz long (od - 9 223 372 036 854 775 808 do 9 223 372 036 854 775 807). Typy zmiennoprzecinkowe to float (pojedynczej precyzji) i double (podwójnej precyzji). Typ boolean to typ logiczny przechowujący wartość "prawda" - "true" lub "fałsz" - "false". Typ char zawiera znaki.
By zadeklarować zmienną należy skorzystać ze składni:
typ_zmiennej nazwa_zmiennej;
Można także przypisać wartość. Przykład:
public
class Test
{
public static void main (String args[])
	{
	int liczba1;
	int liczba2 = 33;
	char znak;
	
	znak = 'a';
	liczba1 = 100;
	
	System.out.println(liczba1);
	System.out.println(liczba2);
	System.out.println(znak);
	}
}

Do typów odnośnikowych należą tablice czyli zbiory elementów określonego typu (np. liczb), oto przykład:
public
class Test
{
public static void main (String args[])
	{
	int tablica[] = new int[5];
	tablica[1] = 123;
	
	System.out.println(tablica[0]);
	System.out.println(tablica[4]);
	System.out.println(tablica[1]);
	}
}
Tablicę deklarujemy za pomocą składni:
int nazwa_tablicy[] = new typ[liczba elementów]
W naszym przykładzie stworzyliśmy 5 elementową tablicę liczb całkowitych. Elementy tablicy numerowane są od zera a nie od jedynki. Do poszczególnych elementów odwołujemy się poprzez:
nazwa_tablicy[indeks]
Gdzie indeks to numer elementu tablicy.
Na zmiennych liczbowych można wykonywać proste operacje matematyczne:
public
class Test
{
public static void main (String args[])
	{
	int a = 4;
	int b = 2;
	
	// 4+2
	System.out.println("a+b:");
	System.out.println(a + b);
	// 4 -2
	System.out.println("a-b:");
	System.out.println(a - b);
	// 4/2
	System.out.println("a/b:");
	System.out.println(a/b);
	// 4*2
	System.out.println("a*b:");
	System.out.println(a*b);
	// dzielenie modulo
	System.out.println("a%b:");
	System.out.println(a%b);
	// inkrementacja o 1 (przyrost)
	a++;
	// 4/3
	System.out.println("a++/b:");
	System.out.println(a/b);
	// 4/3 dzielenie modulo
	System.out.println("a++%b:");
	System.out.println(a%b);
	}
}
Należy zwrócić uwagę że 5 podzielone przez 2 zwróci wartość 2 - zaokrąglony wynik do liczby całkowitej (bo mamy zmienną typu int). Dzielenie modulo zwraca resztę z dzielenia. Znak ++ oznacza inkrementację (przyrost wartości o 1) a znak -- oznacza dekrementację (spadek wartości o 1).

Wyrażenia warunkowe

Mając zmienne można je sprawdzać i wykonywać określone czynności bazując na wyniku porównania. W tym celu stosuje się wyrażenia warunkowe zwracające wartość logiczną (prawda lub fałsz). Oto przykłady:
public
class Test
{
public static void main (String args[])
	{
	int a = 4;
	int b = 2;
	
	//jeżeli a większe od b
	if (a > b)
		{
		System.out.println("a większe od b");
		}
	// w przeciwnym wypadku
	else
		{
		System.out.println("b większe od a");
		}
	
	// jeżeli a równe 4
	if (a == 4)
		{
		System.out.println("a ma wartość 4");
		}
	// jeżeli a nie równe 3 i (&) nie równe 2
	if (a != 3 & a !=2)
		{
		System.out.println("a nie ma wartości 3 ani 2");
		}
	// jeżeli a większe od 2 lub (||) mniejsze od zera
	if (a > 2 || a < 0)
		{
		System.out.println("a jest większe od 2 lub mniejsze od 0");
		}
		
	int y;
	// jeżeli a < 1 to y = 1, jeżeli nie to y = 2
	y = (a < 1 ? 1 : 2);
	System.out.println(y);
	y = (a > 1 ? 1 : 2);
	System.out.println(y);
	}
}
Wyrażenie if.. else if... else wykona kod z określonego obszaru jeżeli warunek dla niego zostanie spełniony. Wyrażenie zmienna = (warunek ? wartość1 : wartość 2); przypisze wartość1 jeżeli warunek będzie spełniony lub wartość2 jeżeli nie. Czasami zamiast złożonych "if, else if, else" można zastosować wyrażenie switch:
public
class Test
{
public static void main (String args[])
	{
	int a = 4;
	int b = 2;
	
	switch(a)
		{
		case 1:
			System.out.println("a ma wartość 1");
			break;
		case 4:
			System.out.println("a ma wartość 4");
			break;
		default:
			System.out.println("a ma wartość inną niż 1 i 4");
			break;
		}
	}
}
Instrukcja switch(zmienna) zawiera wewnątrz siebie przypadki (case wartość) i jeżeli natrawi na przypadek o wartości takiej jak wartość zmiennej to wykona kod zdefiniowany dla tego przypadku. Polecenie break; spowoduje opuszczenie pętli (inaczej doszłaby do końca wykonują również przypadek "default" czyli przypadek wykonywany normalnie jeżeli nie udało się dopasować jednego ze wcześniejszych przypadków).

Pętle

W Javie mamy dostępnych kilka pętli. Pierwsza z nich to for(zmienna ; warunek ; zmiana wartości):
public
class Test
{
public static void main (String args[])
	{
	System.out.println("Zwykła pętla:");
	for(int i = 0; i <= 10; i++)
		{
		System.out.println(i);
		}
	
	System.out.println("");
	System.out.println("Pętla nieskończona stająca na 7 (pierwsza podzielna przez 7 liczba):");
	for(int j = 1; ;j++)
		{
		if (j%7 == 0)
			{
			System.out.println(j);
			break;
			}
		}
	
	System.out.println("");
	System.out.println("Pętla działająca do czasu znalezienia podzielnej przez 7 liczby:");
	for(int a = 1; a < 1000 ;a++)
		{
		if (a%7 != 0)
			{
			System.out.println(a);
			continue;
			}
		// dopóki wykonywane jest continue to break nie jest "wykonywany"
		break;
		}
	}
}
W przypadku for(int i = 0; i <= 10; i++) pętla będzie wykonywać się dopóki zmienna i nie przekroczy wartości 10. Startuje ona od wartości 0 i w każdej iteracji przyrasta o 1. W pętli możemy korzystać z break;, który przerwie wykonywanie pętli oraz continue;, które wywoła nową iterację (omijając kod zawarty po tej instrukcji).
Kolejne pętle to while(warunek) i do {} while(warunek):
public
class Test
{
public static void main (String args[])
	{
	int i = 1;
	while(i < 10)
		{
		System.out.println(i);
		i++;
		}
	
	System.out.println("");
	
	int j = 1;
	do
		{
		System.out.println(j);
		j++;
		}
	while(j < 5);
	}
}

Klasy

Każdy program w javie składa się z klas. Do tej pory stosowaliśmy jedną, prostą klasę. Klasę tworzymy wg. schematu:
public
class Nazwa klasy
{
	// Zawartość klasy
}
Gdzie public oznacza dostępność klasy (o tym później). Klasa może zawierać pola - zmienne oraz metody. Przykład klasy z metodą:
public
class Footest
{
int foo()
	{
	return 4;
	}
}
By skorzystać z danej klasy należy utworzyć odnośnik do niej (obiekt):
NAZWA_KLASY nazwa_zmiennej = new NAZWA_KLASY();
Jeżeli klasę Footest zapiszemy w Footest.java w tym samym katalogu co klasa Test to z poziomu klasy Test łatwo będzie można korzystać z klasy Footest:
public
class Test
{
public static void main (String args[])
	{
	Footest i = new Footest();
	System.out.println(i.foo());
	}

}
Kompilacja klasy Test spowoduje kompilację wszystkich klas używanych przez nią.
Metody mogą operować na zmiennych danej klasy bądź też na zmiennych dostarczanych do nich jako parametry:
public
class Footest
{
int przyrost(int liczba)
	{
	return ++liczba;
	}
}
public
class Test
{
public static void main (String args[])
	{
	Footest i = new Footest();
	System.out.println(i.przyrost(33));
	}

}
Gdy tworzymy obiekt klasy to zazwyczaj chcemy "na starcie" wykonać jakiś kod, ustawić wartości zmiennych itd. Do tego wykorzystuje się konstruktor klasy. Konstruktor to metoda o takiej samej nazwie jak klasa. Konstruktory nie zwracają wartości lecz mogą przyjmować parametry:
public
class Footest
{
public Footest()
	{
	System.out.println("konstruktor");
	}
int przyrost(int liczba)
	{
	return ++liczba;
	}
}
RkBlog

C/C++ i Java, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact