Java

Słownik kwalifikacji INF.04 - Projektowanie, programowanie i testowanie aplikacji

Czym jest Java?

Java to obiektowy język programowania ogólnego przeznaczenia, wykorzystywany do tworzenia aplikacji desktopowych, webowych, mobilnych (m.in. Android) oraz systemów backendowych. To jeden z najczęściej egzaminowanych języków w kwalifikacji INF.04 (Projektowanie, programowanie i testowanie aplikacji).

JavaInfografika: język Java — obiektowy język programowania kompilowany do bytecode i uruchamiany przez JVM, popularne IDE (IntelliJ IDEA, Eclipse, NetBeans, Android Studio) oraz podstawy składni i typów danych

Najważniejsze cechy Javy:

  • jest językiem obiektowym (OOP),
  • kod źródłowy zapisuje się w plikach .java,
  • jest kompilowany do bytecode'u (kod pośredni .class), a nie do kodu maszynowego,
  • bytecode uruchamiany jest przez JVM — Java Virtual Machine,
  • jest wieloplatformowy — ten sam plik .class działa wszędzie, gdzie jest JVM (Windows, Linux, macOS, Android),
  • jest silnie typowany — każda zmienna ma jawnie określony typ,
  • pamięcią zarządza garbage collector.

Java a kompilacja — bytecode kontra kod maszynowy

W odróżnieniu od języków takich jak C czy C++, w których kod musi zostać skompilowany do kodu maszynowego konkretnej architektury procesora przed uruchomieniem, Java działa inaczej:

  1. kod .java jest kompilowany do bytecode'u (.class),
  2. bytecode jest interpretowany / kompilowany w locie (JIT) przez JVM podczas wykonania.

Dzięki temu jeden plik .class działa na każdej platformie, na której zainstalowano JVM — to filozofia „write once, run anywhere".

Środowiska programistyczne (IDE)

Do programowania w Javie najczęściej wykorzystuje się:

  • IntelliJ IDEA — popularne IDE firmy JetBrains,
  • Eclipse — rozbudowane, darmowe środowisko,
  • NetBeans — IDE silnie kojarzone z Javą i projektami edukacyjnymi,
  • Android Studio — IDE do aplikacji mobilnych na Android (oparte na IntelliJ).

Jeżeli w pytaniu pojawiają się nazwy IntelliJ IDEA, Eclipse, NetBeans — z dużym prawdopodobieństwem chodzi o Javę. Android Studio też jest oparte na Javie (i Kotlinie). Visual Studio kojarzy się głównie z C# i platformą .NET.

Przykład prostego programu

public class Main {
    public static void main(String[] args) {
        System.out.println("Witaj, Java!");
    }
}

Metoda main jest punktem startowym programu konsolowego w Javie. Sygnatura public static void main(String[] args) jest stała — żeby program się uruchomił, musi mieć dokładnie taką metodę.

Komentarze w Javie

Java obsługuje trzy rodzaje komentarzy:

// komentarz jednoliniowy

/* komentarz
   wieloliniowy */

/**
 * komentarz dokumentacyjny (Javadoc)
 */

Komentarz wieloliniowy oznacza się znakami /* … */ — to ta sama składnia co w C, C++ i wielu innych językach.

Typy danych

Java jest silnie typowana. Najczęściej używane typy podstawowe (prymitywne) to:

TypCo przechowujePrzykład
intliczby całkowiteint wiek = 12;
shortkrótkie całkowiteshort s = 100;
longdługie całkowitelong l = 1_000_000L;
floatliczby rzeczywiste (zmiennoprzecinkowe)float x = 3.14f;
doubleliczby rzeczywiste wyższej precyzjidouble d = 3.14;
charpojedynczy znak w apostrofachchar plec = 'K';
booleanwartość logiczna true / falseboolean ok = true;

Dodatkowo String (obiekt, nie typ prymitywny) — łańcuch znaków w cudzysłowach.

Pojedynczy znak — typ char

Aby przechować pojedynczy znak (np. 'T', 'K', 'A') używa się typu char:

int zm1;
float zm2;
char zm3;       // tu można przechować 'T'
boolean zm4;

Znak zapisuje się w apostrofach ('T'), a nie cudzysłowach ("T" to już String).

Typowa deklaracja w Javie

String imie = "Anna";
short wiek = 12;
int i = 0;
char plec = 'K';
boolean jestUczniem = true;

Pole formularza typu „Dostępne środki" (wartość rzeczywista, np. 1234.56) najlepiej obsłużyć typem double lub float — typami zmiennoprzecinkowymi.

Tablice

Tablicę w Javie deklaruje się przez typ[] nazwa = new typ[rozmiar]:

int[] tablica = new int[10];

Wypełnianie tablicy w pętli for

Typowy fragment kodu wypełniający tablicę:

int[] tablica = new int[10];
int j = 2;
for (int i = 0; i < tablica.length; i++) {
    tablica[i] = j;
    j += 2;
}

Tablica zostaje wypełniona kolejnymi liczbami parzystymi: 2, 4, 6, 8, 10, 12, 14, 16, 18, 20. To popularny wzorzec — pętla for z licznikiem + wartość rosnąca z określonym krokiem.

Wyjątki — try / catch

Java wymusza obsługę wyjątków dla wielu operacji. Sekcja, która obsługuje wyjątek wygenerowany przez aplikację, znajduje się w bloku catch (po try):

try {
    int wynik = 10 / 0;  // może rzucić wyjątek
} catch (ArithmeticException e) {
    System.out.println("Błąd: " + e.getMessage());
}

Najczęstsze wyjątki na egzaminie

ArrayIndexOutOfBoundsException — występuje, gdy następuje próba dostępu do elementu tablicy, którego indeks jest poza dopuszczalnym zakresem (mniejszy od 0 lub większy/równy długości tablicy). Przykład:

int[] t = new int[5];
t[10] = 1;  // ArrayIndexOutOfBoundsException

ArithmeticException: / by zero — pojawia się przy próbie dzielenia przez zero (dla liczb całkowitych). Komunikat:

Exception in thread "main" java.lang.ArithmeticException: / by zero

dotyczy kodu, który wykonał dzielenie typu int / 0.

OOP w Javie

Java jest językiem w pełni obiektowym — cały kod musi znaleźć się w klasach. Wszystkie filary OOP są dostępne natywnie. Szczegóły opisuje hasło klasa i obiekt oraz programowanie obiektowe.

Dziedziczenie — słowo kluczowe extends

W Javie dziedziczenie zapisuje się słowem extends:

public class Owoc { }
public class Truskawka extends Owoc { }

Klasa Truskawka dziedziczy po klasie Owoc — to jeden z fundamentów OOP.

Klasa abstrakcyjna i konkretna implementacja

Klasę abstrakcyjną oznacza się słowem abstract. Klasa pochodna musi zaimplementować wszystkie odziedziczone metody abstrakcyjne. Przykład:

abstract class Figura {
    abstract double pole();
}

class Prostokat extends Figura {
    double a, b;
    Prostokat(double a, double b) {
        this.a = a;
        this.b = b;
    }

    @Override
    double pole() {
        return a * b;
    }
}

Minimalna implementacja Prostokat musi zawierać konstruktor oraz nadpisaną metodę abstrakcyjną pole().

GUI — okna i kontrolki (Swing/AWT)

Klasyczne aplikacje desktopowe w Javie tworzy się przy użyciu bibliotek Swing (lub starszej AWT). Główne okno aplikacji to obiekt klasy JFrame.

class Okno extends JFrame

Zapis:

public class Okno extends JFrame {
    public Okno() {
        // konfiguracja okna i kontrolek
    }
}

oznacza, że klasa Okno dziedziczy po JFrame, czyli jest oknem aplikacji. Dziedziczenie pozwala dostać „za darmo" obsługę paska tytułu, zamykania, rozmiaru itd.

Najczęstsze kontrolki Swing

  • JTextField — pole tekstowe (np. wpisywanie kwoty „Dostępne środki"),
  • JLabel — etykieta,
  • JButton — przycisk,
  • JCheckBox — pole wyboru,
  • JComboBox — lista rozwijana,
  • JRadioButton — przycisk opcji,
  • JPanel — kontener grupujący inne kontrolki.

W pytaniach z obrazkiem (strzałka na pole jednowierszowego wpisywania tekstu) szukaną kontrolką jest najczęściej JTextField.

Element zaznaczony w kodzie extends JFrame / WPF

Jeśli w pytaniu pojawia się obok siebie kod Java (extends JFrame) i WPF/XAML (<Window ...>), wyróżnione elementy mają na celu utworzenie okna głównego aplikacji — w obu technologiach.

Wyrażenia regularne — Pattern.compile

Java obsługuje wyrażenia regularne przez klasę java.util.regex.Pattern i metodę compile:

Pattern p = Pattern.compile("^abc");
Matcher m = p.matcher(tekst);

Najczęstsze symbole:

SymbolZnaczenie
^początek linii / ciągu
$koniec linii / ciągu
.dowolny znak
*zero lub więcej powtórzeń
+jeden lub więcej powtórzeń
\dcyfra
\sbiały znak

Aby znaleźć dopasowanie na początku linii, używa się symbolu ^.

Algorytm odwracania ciągu znaków

Pętla iterująca od ostatniego znaku do pierwszego i dopisująca znaki do nowego stringa to klasyczny algorytm odwracania ciągu:

public static String fun1(String str) {
    String output = "";
    for (var i = (str.length() - 1); i >= 0; i--) {
        output += str.charAt(i);
    }
    return output;
}

Dla wejścia "abc" metoda zwróci "cba". Klucz: pętla od length-1 do 0 + sklejanie znaków po jednym → odwracanie stringa.

Częste pomyłki — nie myl tego!

  • Java ≠ JavaScript — to dwa różne języki, o podobnej nazwie i zupełnie innej składni/zastosowaniach.
  • Java kompiluje się do bytecode'u, nie do kodu maszynowego — kod maszynowy generują m.in. C/C++.
  • charStringchar to pojedynczy znak w apostrofach ('T'), String to tekst w cudzysłowach ("T").
  • ArrayIndexOutOfBoundsExceptionNullPointerException — pierwszy to zły indeks tablicy, drugi to próba użycia obiektu, który ma wartość null.
  • /* *////* */ to komentarz wieloliniowy, // jednoliniowy.
  • extends JFrame to dziedziczenie, a nie tylko „import" okna — klasa staje się oknem.
  • IntelliJ/Eclipse/NetBeans → Java, Android Studio → Java/Kotlin (Android), Visual Studio → C#/.NET — typowe skojarzenia w pytaniach.
  • ^ w regex to początek linii, nie negacja (negacja występuje w klasie znaków: [^abc]).

Najważniejsze do zapamiętania

Java to obiektowy język programowania kompilowany do bytecode'u uruchamianego przez JVM — dzięki temu jest wieloplatformowy. Klasycznie wybierane IDE to IntelliJ IDEA, Eclipse, NetBeans (mobilnie — Android Studio). Typ char przechowuje pojedynczy znak ('T'), double/float — liczby rzeczywiste. Komentarz wieloliniowy: /* */. Tablica poza zakresem rzuca ArrayIndexOutOfBoundsException, dzielenie przez zero — ArithmeticException. Wyjątki obsługuje się w bloku catch. GUI w Swing buduje się przez JFrame (class Okno extends JFrame) i kontrolki typu JTextField. Dziedziczenie zapisuje się słowem extends.