Jak wygląda program w Javie
Z poprzedniej strony wiesz już, jak uruchomić Javę. Teraz przyjrzyjmy się, z czego tak naprawdę składa się sam kod. Java jest rygorystyczna i jawna: każdy program musi mieć ustaloną budowę, a kompilator sprawdza ją, zanim wykona się choć jedna linia.
Oto najmniejszy kompletny program w Javie. Uruchom go:
To sporo słów jak na wypisanie jednej linii i, w odróżnieniu od Pythona czy JavaScriptu, żadnego nie da się pominąć. Każdy element jest wymagany, więc warto rozumieć, co robi. Rozbierzemy go na części od zewnątrz do środka.
Wszystko żyje w klasie
W Javie nie ma „luźnego” kodu na najwyższym poziomie pliku. Cały kod znajduje się wewnątrz klasy, deklarowanej słowem kluczowym class i nazwą:
public class Main {
// everything goes in here
}
Otwierający { i pasujący do niego zamykający } wyznaczają ciało klasy. Nazwę Main wybierasz sam, z jedną ważną zasadą: w zwykłym pliku .java klasa public musi dokładnie odpowiadać nazwie pliku. public class Main należy do Main.java. Pomyłka w wielkości liter sprawi, że kompilator odmówi zbudowania kodu.
Czym naprawdę są klasy, dowiesz się w rozdziale o klasach. Na razie traktuj public class Main { ... } jako obowiązkowe opakowanie twojego kodu.
Metoda main to linia startu
Gdy uruchamiasz program w Javie, środowisko uruchomieniowe szuka jednej konkretnej metody, od której zaczyna wykonanie:
public static void main(String[] args) {
// your code starts here
}
Ta sygnatura nie podlega negocjacjom. Każde słowo ma swoje zadanie:
public: środowisko uruchomieniowe może się do niej dostać spoza klasy.static: działa bez wcześniejszego tworzenia obiektu klasy.void: po zakończeniu niczego nie zwraca.main: dokładna nazwa, której szuka środowisko uruchomieniowe.String[] args: tablica z argumentami wiersza poleceń przekazanymi do programu.
Jeśli choć jedno słowo się nie zgadza (Static zamiast static, String args zamiast String[] args), kod może się nadal skompilować, ale uruchomienie zakończy się błędem Error: Main method not found in class Main. Ten komunikat prawie zawsze oznacza literówkę w tej linii.
Instrukcje kończą się średnikiem
Instrukcja to jedno kompletne polecenie. W Javie każda instrukcja kończy się średnikiem ;. Kompilator po średniku poznaje, gdzie kończy się jedno polecenie, a zaczyna następne. Znaki nowej linii go nie obchodzą.
Ponieważ podziały linii są ignorowane, wszystkie trzy instrukcje mogłyby stać w jednej linii i nadal działać, choć nikt tak nie pisze w Javie:
int score = 90; score = score + 5; System.out.println(score);
Zapomnij o średniku, a kompilator zatrzyma cię, zanim program się uruchomi:
int score = 90
System.out.println(score);
error: ';' expected
int score = 90
^
Brakujący średnik to najczęstszy błąd kompilacji, na jaki trafisz na początku. Gdy kompilator wskazuje linię, sprawdź też linię nad nią: często to tam jest prawdziwe przeoczenie.
Bloki i nawiasy klamrowe
Nawiasy klamrowe { } grupują instrukcje w blok. Ciało klasy to blok, ciało metody to blok, a ciało if lub pętli to też blok. Bloki można zagnieżdżać w innych blokach:
Zwróć uwagę na różnicę względem instrukcji: linia, która otwiera blok, kończy się znakiem {, a nie średnikiem, i nie stawia się średnika po zamykającym } metody, klasy, if czy pętli. Mylenie tego to klasyczny błąd na starcie:
public static void main(String[] args) {
System.out.println("hi");
}; // <- this semicolon is unnecessary (and after a class/method, wrong)
Wcięcia w przykładach są wyłącznie dla ludzi. Java je ignoruje, ale spójne wcięcia pozwalają tobie i wszystkim innym śledzić, który { pasuje do którego }. Pozwól edytorowi robić wcięcia automatycznie, a nawiasy same się wyrównają.
Java rozróżnia wielkość liter
Java traktuje wielkie i małe litery jako coś zupełnie innego. score, Score i SCORE to trzy osobne nazwy. To samo dotyczy słów kluczowych i nazw wbudowanych:
Kod z system.out.println (z małym s) albo z String Name, a potem z próbą użycia name, zostałby odrzucony przez kompilator. Kilka nazw, w których początkujący często mylą wielkość liter:
System: wielkieS.system.out.println(...)się nie skompiluje.String: wielkieS. To klasa, w odróżnieniu od typów prostych pisanych małymi literami.void,int,public,static: wszystkie małymi literami. To słowa kluczowe.
Większość błędów „cannot find symbol” wynika z pomyłki w wielkości liter. Sam błąd mówi, którego symbolu nie udało się znaleźć: porównaj jego zapis z tym, co jest w twoim kodzie.
Składamy wszystko razem
Oto nieco większy program, który wykorzystuje wszystko z tej strony: klasę, metodę main, kilka instrukcji, zagnieżdżony blok i spójną wielkość liter:
Przeczytaj go od góry do dołu: klasa obejmuje wszystko, main to miejsce, w którym zaczyna się wykonanie, każde polecenie kończy się ;, ciało if jest zgrupowane we własnym bloku, a każda wbudowana nazwa ma poprawną wielkość liter. To szkielet praktycznie każdego programu w Javie, jaki napiszesz.
Dalej: komentarze
Umiesz już odczytać strukturę pliku w Javie. Następna rzecz do dodania to notatki dla ludzi: tekst, który kompilator całkowicie ignoruje. Kolejna strona omawia komentarze: jednoliniowe //, blokowe /* */ i to, kiedy komentarz naprawdę zasługuje na miejsce w kodzie.
Najczęściej zadawane pytania
Jaka jest podstawowa składnia programu w Javie?
Każdy program w Javie żyje wewnątrz klasy, a wykonanie zaczyna się w metodzie o dokładnej sygnaturze public static void main(String[] args). Instrukcje kończą się średnikiem, a bloki kodu grupuje się nawiasami klamrowymi { }. Minimalny program to public class Main { public static void main(String[] args) { System.out.println("Hi"); } }.
Po co Javie public static void main(String[] args)?
To dokładnie ten punkt wejścia, którego szuka środowisko uruchomieniowe Javy. public pozwala wywołać metodę z zewnątrz, static oznacza, że działa bez wcześniejszego tworzenia obiektu, void oznacza, że nic nie zwraca, a String[] args odbiera argumenty wiersza poleceń. Zmień dowolne słowo (nawet wielkość liter), a program się skompiluje, ale nie wystartuje i pokaże Error: Main method not found.
Czy każda instrukcja w Javie potrzebuje średnika?
Każda instrukcja kończy się średnikiem: deklaracje zmiennych, przypisania, wywołania metod. Linie, które otwierają blok (if, for, while, nagłówek klasy lub metody), kończą się jednak znakiem {, a po zamykającym } takich bloków nie stawia się średnika. Zapomniany średnik to najczęstszy błąd kompilacji u początkujących w Javie.