Prawo Greshama - z nieważnymi sprawami czasem dajemy sobie radę, ważne sprawy nigdy nie są rozwiązywane.
Część 3.1. Typy danych i zmienne
Typy podstawowe  |   Zmienne  |   Literały

Typy podstawowe

W naszym pierwszym programie wyświetliliśmy tylko napis, który był pewną stałą: ile razy uruchomimy program, to zawsze jego wynik będzie taki sam. Jednak program najczęściej wykonuje różne operacje i dopiero później wyświetla wynik. Aby można było wykonywać operacje i przechowywać ich wyniki niezbędne są w programie zmienne: miejsca pamięci, w których przechowywane są wartości argumentów oraz wyniki pośrednie.

Zmienna z kolei musi mieć zdefiniowany typ danych, jakie będą w niej przechowywane. Bez zdefiniowanego typu, komputer nie będzie wiedział, jak ma traktować zawartość zmiennej: jako napis, liczbę całkowitą, rzeczywistą, czy w jeszcze inny sposób.

W Javie możemy tworzyć zmienne typów prostych i obiektowych. O typach obiektowych dowiesz się w dalszej części kursu (klasy i obiekty). Teraz poznasz podstawowe typy danych oraz sposób tworzenia zmiennych prostych i tablicowych.

Poniższa tabelka przedstawia listę podstawowych typów danych dostępnych w Javie:

TypPamięć (w bitach)Opis
boolean8wartość logiczne true lub false
char16kod znaku ze zbioru znaków Unicode
byte8liczba całkowita ze znakiem
short16liczba całkowita ze znakiem
int32liczba całkowita ze znakiem
long64liczba całkowita ze znakiem
float32liczba zmiennoprzecinkowa
double64liczba zmiennoprzecinkowa
W Javie nie ma wśród typów podstawowych typu łańcuchowego służącego do przechowywania napisów. Tablica znaków - inaczej niż w C i C++ - nie może być wykorzystania do przechowywania łańcuchów zakończonych znakiem NULL. W Javie do pracy z łańcuchami znakowymi służy specjalna klasa Srting, o której będziemy mówili przy klasach.

Zmienne

Znając już podstawowe typy danych Javy możemy tworzyć zmienne. Każda zmienna musi posiadać identyfikator czyli własną unikalną w danym zakresie widoczności nazwę oraz zdefiniowany typ.

Nazwa zmiennej może składać się tylko z: liter, cyfr, znaku dolara ($) i podkreślenia (_). Pierwszym znakiem nazwy nie może być cyfra. Długość nazwy jest dowolna. Nazwa zmiennej nie może być żadnym z słów kluczowych Javy.

Musisz pamiętać, że Java odróżnia w nazwach zmiennych (w ogóle we wszystkich nazwach) wielkość liter: dlatego też nazwy: zmienna, ZMIENNA i Zmienna oznaczają 3 zupełnie różne nazwy i mogą być używane do utworzenia 3 niezależnych od siebie zmiennych.

Poprawnymi nazwami są np.:

imie
Nazwisko
data_urodzenia
Wartosc$

Nie są natomiast poprawnymi nazwami:

1szaZmienna      nazwa nie może zaczynać się od cyfry
class            słowo kluczowe Javy

Składnia deklaracji zmiennej ma następującą postać:

	NazwaTypu  NazwaZmiennej  [ = WartośćPoczątkowa ] [ , ...];

gdzie:

  • NazwaTypu - jest nazwą typu podstawowego;
     
  • NazwaZmiennej - to nasza nazwa, którą nadajemy zmiennej;
     
  • WartośćPoczątkowa - opcjonalna wartość początkowa przypisywana zmiennej (musi być zgodna z typem).
     

Oto kilka przykładów poprawnych deklaracji zmiennych:

int      x, y = 0, z = 99;
boolean  b1, b2 = false, b3 = true;
char     z1, z2 = 'A';
double   a, b = 1.25;

Zobaczmy jak korzystać ze zmiennych w programie:

public class Przyklad
{  public static void main (String args[])
   {  int x;                 // deklaracja zmiennej bez inicjacji
      int y = 5;             // deklaracja zmiennej z inicjacją wartością 5
      x = 10;
      System.out.println ("Pierwsza liczba = " + x);
      System.out.println ("Druga liczba = " + y);
   }
}

Przy okazji tego przykładu kilka słów o wstawianiu komentarzy do programu. Jest dobrym zwyczajem opisywanie wewnątrz kodu, co dany jego fragment realizuje. Nie jest to konieczne i na pewno nie ma sensu opisywanie każdej linijki kodu. Jednak w istotnych miejscach programu dobrze jest wstawić komentarz opisujący, co dany fragment wykonuje lub do czego będzie wykorzystany. Program staje dzięki temu bardziej zrozumiały i przejrzysty.

Komentarze możemy wstawiać na dwa sposoby:

  • komentarz wierszowy stosując ogranicznik //: cały tekst za tym znacznikiem - do końca linii traktowany jest jako komentarz;
     
  • komentarz blokowy tworzymy przy pomocy pary ograniczników /* i */: wszystko między para tych ograniczników traktowane jest jako komentarz.
     

Oto przykład:

// przykład komentarza wierszowego 

/* a tak może wyglądać
   wielowierszowy
   komentarz blokowy */

Kompilator Javy napotykając komentarz ignoruje tekst w nim zawarty.

zmienne w Javie nie posiadają żadnych wartości domyślnych niezależnie od ich typu. Musisz pamiętać, aby każda zmienna - przed jej użyciem była zainicjowana jakąś wartością. można to zrobić przy deklarowaniu zmiennej lub później, ale brak inicjalizacji przed użyciem zmiennej spowoduje błąd już podczas kompilacji. Gdybyśmy poprzedni program napisali w taki sposób:

public class Przyklad
{  public static void main (String args[])
   {  int x;                 // deklaracja zmiennej bez inicjacji
      int y;                 // deklaracja zmiennej bez inicjacji
      System.out.println ("Pierwsza liczba = " + x);
      System.out.println ("Druga liczba = " + y);
   }
}

To podczas kompilacji pojawią się komunikaty:

Przyklad.java:5: variable x might not have been initialized
      System.out.println ("Pierwsza liczba = " + x);
Przyklad.java:6: variable y might not have been initialized
      System.out.println ("Druga liczba = " + y);
2 errors

Często w programie potrzebujemy wielu zmiennych tego samego typu. Można wtedy - zamiast tworzyć nieraz kilkadziesiąt czy kilkaset zmiennych - użyć tablicy. Jest to bardzo wygodne z kilku powodów. Po pierwsze zmniejsza ilość zmiennych, które trzeba deklarować, inicjować i których nazwy trzeba pamiętać. Po drugie - wykonanie tej samej operacji (np. zerowania) na różnych zmiennych jest bardzo żmudne, a dla tablicy wystarczy zbudować prostą pętlę.

Deklaracja tablic w Javie jest bardzo podobna do deklaracji w C++. Z jednym, ale bardzo istotnym wyjątkiem: w Javie każda tablica musi być deklarowana dynamicznie, z użyciem operatora new, który przydziela w pamięci miejsce niezbędne dla tablicy. Przykłady deklaracji tablic 10-cioelementowej w Javie:

     int tab [] = new int [10];
     int [] tab = new int [10];

Tablica stanowi jak gdyby zadeklarowanie wielu zmiennych tego samego typu. Możemy odwołać się do każdego z jej elementów oddzielnie podając w nawiasach kwadratowych numer elementu. Pamiętać przy tym należy, że elementy tablicy zawsze numerowane są od zera. Dlatego w tablicy o 10 elementach możemy używać modyfikatorów o wartościach od 0 do 9. Po trzecie tablica - w odróżnieniu od inna zmienna - nie wymaga inicjalizacji przed jej wykorzystaniem: każdy jej element domyślnie inicjowany jest wartością zero. A teraz mały przykład poprawnego odwołania się do tablicy w programie:

public class Przyklad
{  public static void main (String args[])
   {  int tab[] = new int[10];
      tab[5] = 11;
      System.out.println ("Piąty element tablicy to = " + tab[5]);
   }
}

W tym przykładzie zadeklarowaliśmy tablice o 10 elementach, zainicjowaliśmy piąty element tablicy i następnie wyświetliliśmy jego wartość. Tak napisany program będzie działał poprawnie. Jeśli jednak spróbujesz - nie zmieniając pozostałej części programu - wyświetlić element np. 10:

public class Przyklad
{  public static void main (String args[])
   {  int tab[] = new int[10];
      tab[10] = 11;                          // błąd - maksymalny wskaźnik może być = 9
      System.out.println ("Dziesiąty element tablicy to = " + tab[10]);
   }
}

to kompilator wyświetli komunikat błędu o przekroczeniu zakresu wskaźnika tablicy.

Typ zmiennej określamy w momencie jej deklarowania. Zdarza się jednak, że program wymaga przypisania do zmiennej jednego typu wartości innego typu. Musimy wtedy dokonać konwersji między typami, aby uniknąć błędu. W postaci ogólnej konwersja wygląda następująco:

(NazwaTypu) wyrażenie

gdzie:

  • NazwaTypu - nazwa typu na który dokonujemy konwersji;
     
  • wyrażenie - konwertowana wartość, zmienna lub wyrażenie.
     
Przykłady:
double x = 12;           // zmiana typu int na float 
int    y = (int) 12.5;   // zmiana typu float na int
int    z = (int) x;      // zmiana typu float na int

Literały

Inicjując zmienne lub wykonując działania najczęściej używamy - oprócz zmiennych - również stałych. W Javie możemy używać literałów dowolnego typu:
  • literały całkowite możemy używać ze zmiennymi typu int i long. Możemy je zapisywać dziesiętnie, ósemkowo lub szesnastkowo. Jeżeli:
     
    • zapiszemy ciąg cyfr (ewentualnie ze znakiem), to Java automatycznie traktuje go jako literał całkowity typu int;
       
    • umieścimy na końcu takiego literału literę L lub l to wskażemy, że mamy literał typu long;
       
    • wartości bezwzględnej literału jest większej niż 2.147.483.647, to automatycznie przyjmuje on typ long;
       
    • literał całkowity rozpoczyna się znakiem 0 (zero), to jest traktowany jako liczba ósemkowa;
       
    • literał całkowity zaczyna się sekwencją 0x lub 0X, to traktowany jest jako liczba szesnastkowa. Do zapisu cyfr szesnastkowych można używać zarówno małych jak i wielkich liter alfabetu (od A do F).
       
  • literały rzeczywiste (stało- i zmiennoprzecinkowe) odpowiadają typom float i double. Obowiązują przy tym następujące reguły:
     
    • literały rzeczywiste traktowane są domyślnie jako liczby typu double;
       
    • umieszczenie na końcu literału litery F lub f wymusza traktowanie literału jako typu float;
       
    • można jawne przypisać literałowi typu double poprzez dodanie litery D lub d.
       
  • literały znakowe związanych są z typem char:
    • zapisujemy je w apostrofach;
       
    • do zapisu znaków specjalnych służą następujące literały:
      \n	znak nowej linii
      \t	tabulacja pozioma
      \b	Backspace
      \r	powrót karetki
      \f	znak nowej strony
      \'	apostrof
      \"	cudzysłów
      \\	Backslash
      
  • literały logiczne reprezentują dwie wartości typu boolean: true i false reprezentujące wartości prawda i fałsz. Nie ma możliwości konwersji wartości typu boolean do wartości typu int.
     

Przykłady literałów:

   123, 123L, 0456, 0xA9, 0XA9, 0xa9        literały całkowite typu int i long
   4.565556, 0.2, 50.0, 30.5E-11            literały rzeczywiste typu double
   4.565556f, 0.2F, 50.0f, 30.5E-11f        literały rzeczywiste typu float
   4.565556d, 0.2D, 50.0d, 30.5E-11d        literały rzeczywiste typu double

  ' '                spacja 
  '\\'               lewy ukośnik 
  'G'                znak G 
  '\x20'             spacja 

  false              fałsz
  true               prawda
« wstecz   dalej »