1. Wprowadzenie
Gdy dopiero zaczynasz programować, wydaje się, że można po prostu pisać kod linijka po linijce i wszystko będzie działać. Jednak gdy program staje się bardziej złożony, w głowie zaczyna się chaos: gdzie co się znajduje, po co to napisano i jeśli trzeba zmienić jedną linijkę — gdzie ona w ogóle leży?
Dlatego Java, podobnie jak większość nowoczesnych języków, oferuje sposób na „poukładanie” kodu, aby w każdej chwili można było zrozumieć, co robi program, i szybko znaleźć potrzebne miejsce.
Wyobraź sobie firmę. Jest w niej dział kadr, księgowość, dział IT, dział logistyki i tak dalej. Każdy dział — ma własny zakres odpowiedzialności, własnych pracowników i zadania.
W programie na Java każdy taki „dział” — to klasa. Jedna klasa odpowiada na przykład za pracę z użytkownikami, inna — za obliczenia, jeszcze inna — za pracę z plikami.
Oto typowa struktura prostego projektu:
- Main.java — główne biuro: tutaj znajduje się „punkt wejścia”, od którego wszystko się zaczyna.
- User.java — dział, w którym przechowywane i przetwarzane są dane użytkownika.
- Calculator.java — dział obliczeń.
- FileHelper.java — specjaliści od plików.
Nawet w zupełnie małym programie zwykle jest co najmniej jedna klasa. A duże projekty — to już cały „wieżowiec” z setek klas!
2. Klasa — to skrzynka z narzędziami
Java — to język obiektowy, i wszystko w nim jest obiektami. Typy obiektów nazywają się klasami.
Klasa — to jak pudełko lub szafka, do której wkładamy potrzebne nam rzeczy: zmienne, metody. Wyobraź sobie pudełko z napisem „Młotki”: w środku leżą tylko narzędzia związane z młotkami.
class Example
{
// Tutaj będą nasze narzędzia: zmienne i metody
}
Klasy zwykle zawierają zmienne i funkcje. W Java zmienne klasy nazywa się polami, a funkcje klasy — metodami. Sens pozostaje ten sam.
Pamiętasz nasz pierwszy kod?
System.out.println("Cześć wszystkim!");
W tym kodzie są zarówno klasa, jak i metody:
- System — to klasa, która zawiera metody do pracy z systemem.
- out — to pole, które jest obiektem klasy PrintStream.
- println — to metoda klasy PrintStream, która wypisuje tekst na ekran.
W pewnym sensie całe programowanie sprowadza się do pisania własnych klas i metod, które wywołują metody innych klas.
3. Skrócony zapis metody main()
W istocie minimalny program na Java wygląda tak:
class Program
{
public static void main(String[] args)
{
// Tutaj Twój kod
}
}
Zawiera co najmniej jedną klasę, która musi zawierać metodę main o następującym nagłówku (sygnaturze):
public static void main(String[] args)
main w Javie
Jednak w Java 21 pojawiła się możliwość pisania metody main() w skróconej formie. A kompilator Javy następnie (podczas kompilacji) przekształci ją w poprawną metodę main().
Dlatego za każdym razem, gdy piszesz kod typu:
void main()
{
Scanner console = new Scanner(System.in);
int age = console.nextInt();
System.out.println("Wiek: " + age);
}
Kompilator Javy przekształci go w kod:
class Program
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
int age = console.nextInt();
System.out.println("Wiek: " + age);
}
}
4. Typowa klasa Javy
Typowa klasa w Javie wygląda mniej więcej tak:
public class MathUtils
{
// Statyczne zmienne (globalne dla klasy)
static final double PI = 3.14159;
static int callCounter = 0;
// Metoda statyczna: obliczanie pola koła
public static double circleArea(double radius)
{
callCounter++;
return PI * radius * radius;
}
// Metoda statyczna: znajdowanie maksimum z dwóch liczb
public static int max(int a, int b)
{
callCounter++;
return (a > b) ? a : b;
}
// Metoda statyczna: ile razy wywoływano metody
public static int getCallCount()
{
return callCounter;
}
// Odwołujemy się do pól i metod z metody main()
public static void main(String[] args)
{
System.out.println("Pole koła: " + circleArea(5));
System.out.println("Maksimum: " + max(10, 42));
System.out.println("Metody były wywoływane " + getCallCount() + " razy");
}
}
Co tu widzimy:
- Klasa może mieć wiele metod.
- Klasa może mieć własne zmienne.
- Metody klasy mogą wywoływać się nawzajem.
- Metody klasy mogą odwoływać się do wspólnych zmiennych.
- Przed każdą metodą są takie same „magiczne słowa”, np.: public static.
- Przed każdą metodą są różne typy: int, double, void.
Poniżej omówimy wszystkie te niuanse.
5. Pola (zmienne) klasy — to jej pamięć
Wewnątrz klasy można przechowywać zmienne, które często nazywa się polami (fields). To jak komórki pamięci, w których odkładamy pewne dane.
public class MathUtils
{
// Statyczne zmienne (globalne dla klasy)
static final double PI = 3.14159;
static int callCounter = 0;
}
Pola pozwalają klasie coś „pamiętać” między wywołaniami różnych metod. Na przykład liczyć, ile razy naciśnięto przycisk. Albo ile razy wywołano metodę (callCounter). Pól może być dowolnie dużo.
6. Metody — działania, które może wykonywać klasa
Metody — to „umiejętności” naszej klasy. Jeśli klasa — to pracownik, to metody — to jego kompetencje: co potrafi robić.
Na przykład metoda może:
- wyświetlić coś na ekran,
- obliczyć sumę dwóch liczb,
- przyjąć dane „na wejściu” i zwrócić wynik.
Budowa metody:
- Typ zwracanego wyniku (na przykład void — jeśli nic nie zwraca, lub int — jeśli zwraca liczbę).
- Nazwa metody (na przykład circleArea).
- Parametry w nawiasach (mogą nie występować).
- Nawiasy klamrowe { ... } — ciało metody.
public class MathUtils
{
// Metoda statyczna: obliczanie pola koła
public static double circleArea(double radius)
{
callCounter++;
return PI * radius * radius;
}
// Metoda statyczna: znajdowanie maksimum z dwóch liczb
public static int max(int a, int b)
{
callCounter++;
return (a > b) ? a : b;
}
}
Więcej o metodach i wszystkich związanych z nimi niuansach poznasz w najbliższych wykładach.
7. Modyfikatory dostępu
W Java można określić, które części klasy są dostępne z innych klas, a które pozostają tylko do użytku wewnętrznego. Służą do tego modyfikatory dostępu.
- public — widoczne dla wszystkich. Takie metody i pola można używać/wywoływać z dowolnego miejsca programu.
- private — widoczne tylko wewnątrz samej klasy. To detale wewnętrzne, które nie powinny być dostępne dla innych. Jakby ich w ogóle nie było.
public class MathUtils
{
// Statyczne zmienne (globalne dla klasy)
private static final double PI = 3.14159;
private static int callCounter = 0;
// Metoda statyczna: obliczanie pola koła
public static double circleArea(double radius)
{
callCounter++;
return PI * radius * radius;
}
}
Złota zasada: pola zazwyczaj robi się private, a na zewnątrz „wystawia” się tylko potrzebne metody z modyfikatorem public. Więcej o modyfikatorach widoczności — w najbliższych wykładach.
8. Metody i zmienne statyczne
Zwykle w Java klasa służy jako szablon do tworzenia obiektów. Piszesz własną klasę, następnie tworzysz obiekty tej klasy za pomocą słowa kluczowego new. I dopiero potem wywołujesz metody na obiektach.
Istnieje jednak i drugi sposób używania klasy — jako kontenera na globalne zmienne i metody, które można wywołać z dowolnego miejsca programu. Właśnie do tego służy słowo kluczowe static. Mówi ono kompilatorowi Javy, że metody i pola klasy są powiązane nie z obiektem klasy, lecz bezpośrednio z samą klasą. Dzięki temu można je wywoływać, w ogóle nie tworząc obiektów tej klasy.
Zresztą, ciągle korzystasz z takich metod:
Integer.parseInt(); // Statyczna metoda parseInt() w klasie Integer
String.valueOf(); // Statyczna metoda valueOf() w klasie String
Double.isInfinite(); // Statyczna metoda isInfinite() w klasie Double
Arrays.copy(); // Statyczna metoda copy() w klasie Arrays
Metoda main() zawsze jest deklarowana jako statyczna, ponieważ od niej zaczyna się wykonywanie twojego programu w Javie. Zanim powstaną jakiekolwiek obiekty.
9. Lifehack w IDEA
Pełna sygnatura metody main() wygląda tak:
public static void main(String[] args)
Aby nie pisać jej za każdym razem w IntelliJ IDEA, istnieje dla niej skrót. Wystarczy napisać psvm i nacisnąć Tab, a IntelliJ IDEA sama za ciebie wygeneruje taki kod:
public static void main(String[] args)
{
}
Łatwo to zapamiętać — psvm — to pierwsze litery od public static void main.
GO TO FULL VERSION