// Main.java public class Main { public static void main(String[] args) { System.out.println("Hello World!"); } }
System - predefiniowana klasa w bibliotece standardowej Javy, zawierająca m.in. strumienie wejścia/wyjścia (in, out, err)public static void main(String[] args) - punkt wejścia aplikacjiabstract assert boolean break byte case catch char class const continue default do double else enum exports extends final finally float for goto if implements import instanceof int interface long module native new non-sealed open opens package permits private protected provides public record requires return sealed short static strictfp super switch synchronized this throw throws to transient transitive try uses var void volatile while with yield
true, false i null - literały, także zarezerwowane słowa
String, Math, System, itp.), jedyna paczka importowana domyślnieimportimport java.util.Scanner; // import pojedynczej klasy Scanner import java.util.*; // import wszystkich klas z pakietu
.java o nazwie klasy.package myMain;// Main.java package myMain; public class Main { public static void main(String[] args) { System.out.println("Hello World!"); } }
Komentarz jednoliniowy:
// TO JEST KOMENTARZ
Komentarz blokowy:
/*
TO JEST KOMENTARZ
I TO TEŻ JEST KOMENTARZ
*/
Typy proste (ang. primitives):
byte, short, int, longfloat, doubleboolean (true/false, nie jest liczbą)charTypy złożone (obiektowe):
String, tablice, Object, klasy użytkownika, interfejsy, kolekcje (List, Set, Map), itp.
Dla typów prostych istnieją klasy opakowujące (wrappery), które rozszerzają Number:
int → Integer, double → Double, float → Float, itd.
// typy proste int a, b = 42; double d = 3.14; boolean flag = true; char c = 'a'; // typy obiektowe Scanner sc = new Scanner(System.in); String str = "Hello"; int [] arr = {1, 2, 3, 4, 5};
0 dla liczb, false dla boolean, \u0000 dla charnull (nie wskazuje na żaden obiekt) int a = 42; // stała całkowitoliczbowa (int) int b = 0x2A; // stała szesnastkowa (42 w systemie szesnastkowym) int c = 0b101010; // stała binarna (42 w systemie binarnym) int d = 042; // stała ósemkowa (34 w systemie ósemkowym) long e = 42L; // stała typu long int f = 3_000_000; // podkreślenia dla czytelności (3000000) float x1 = 3.14f; // stała typu float double x2 = 3.14; // stała zmiennoprzecinkowa (double) double x3 = 1.5e-3; // stała w notacji naukowej (0.0015) char c1 = 'A'; // stała znakowa (pojedynczy znak) char c2 = 65; // stała znakowa jako liczba (również 'A', bo 65 to kod ASCII dla 'A') char c3 = '\u0041'; // stała znakowa w notacji Unicode (również 'A') char c4 = '\101'; // stała znakowa w notacji ósemkowej (również 'A') char c5 = '\n'; // stała znakowa dla nowej linii String str1 = "Hello"; // stała łańcuchowa (ciąg znaków) String str2 = "Line1\nLine2"; // stała łańcuchowa z nową linią
byte → short → int → long → float → doubledouble → float → long → int → short → byte int i = (int) 3.14;
byte, short i char do int byte b = 10; b = b*2; // BŁĄD, bo wynik jest int, a nie byte b = (byte)(b*2); // OK, rzutowanie zawężające, wynik jest byte
Jednowymiarowa:
Typ[] tablica1D = { ... }; Typ[] tablica1D = new Typ[rozmiar]; Typ tablica1D[] = new Typ[rozmiar]; // alternatywna składnia
Wielowymiarowa:
Typ[][] tablica2D = { { ... }, ..., { ... } }; Typ[][] tablica2D = new Typ[rozmiar1][rozmiar2]; Typ[][] tablica2D = new Typ[rozmiar1][]; // tablica tablic
Dostęp do elementów:
tablica[i] - i-ty element jednowymiarowej tablicytablica[i][j] - element tablicy dwuwymiarowej
Java posiada rozbudowaną bibliotekę do obsługi łańcuchów znaków (String), dokumentacja:
String str = "abc"; // is equivalent to: char data[] = {'a', 'b', 'c'}; String str = new String(data);
StringBuilder i StringBuffer +, -, *, /, %, ++, --&&, ||, !, ^, &, | (bez skracania)int i long): &, |, ~, ^, <<, >>, >>> (bez znaku)==, !=, >, <, >=, <==, +=, -=, *=, /=, %=, &=, |=, ^=, >>=, <<=
Java dostarcza klasę Math z wieloma przydatnymi funkcjami.
Dokumentacja: Math (Java SE 17 & JDK 17) (oracle.com)
if (warunek) { // ... } else if (innyWarunek) { // ... } else { // ... }
booleanOperatory logiczne bez skracania
if(x != 0 & 10/x > 1) { // BŁĄD, bo x może być równe 0, a wtedy dzielenie przez zero spowoduje wyjątek }
Operatory skracające
if(x != 0 && 10/x > 1) { // OK, bo jeśli x jest równe 0, to drugi operand nie jest sprawdzany }
Operacje warunkowe tylko dla typu boolean:
int x = 5; if (!x) { /* BŁĄD, bo x nie jest typu boolean */ } if (x > 0) { /* OK, bo x > 0 jest wyrażeniem typu boolean */ }
switch (wyrazenie) { case wartosc1: // ... break; case wartosc2: // ... break; default: // ... }
byte, short, char, int, String lub wyliczeniowego (enum)while (warunek) { // ... }
do { // ... } while (warunek);
for (inicjalizacja; warunek; inkrementacja) { // ... }
for (Typ zmienna : tablica) { // foreach (pętla rozszerzona) }
break - przerywa najbliższą pętlę lub instrukcję switchcontinue - przeskakuje do następnej iteracji pętligoto - nie istnieje w Javie (ale jest słowem kluczowym)return - zwraca wartość z metody i kończy jej wykonanietry, catch, finally - obsługa wyjątków. Jeżeli jakaś metoda deklaruje, że operacja rzuca wyjątek, to musi być on obsłużony lub zadeklarowany w sygnaturze metody (throws).try { // ... } catch (Wyjatek e) { // ... } finally { // ... }
label: while (warunek) { // ... while(innyWarunek) { // ... if (jeszczeInnyWarunek) { break label; // przerywa pętlę oznaczoną etykietą } } }
label: for (int i = 0; i < n; i = i + 1) { // ... for (int j = 0; j < m; j = j +1) { // ... if (warunek) { continue label; // przeskakuje do następnej iteracji // pętli oznaczonej etykietą } } }
Main, Scanner, String)main, nextLine, myVariable)MAX_VALUE, PI)java.util, myapp)
Strumień wejściowy System.in - odczyt danych z konsoli:
BufferedReader i InputStreamReader var reader = new BufferedReader(new InputStreamReader(System.in)); String line = reader.readLine(); // czyta linię tekstu Integer.parseInt(line); // konwersja tekstu na liczbę całkowitą
Scanner Scanner sc = new Scanner(System.in); sc.nextLine(); // czyta linię tekstu sc.nextInt(); // czyta liczbę całkowitą
Strumień wyjściowy System.out
System.out.println("Hello World!"); // wypisuje tekst i przechodzi do nowej linii System.out.print("Hello World!"); // wypisuje tekst bez przechodzenia do nowej linii System.out.printf("Wartość: %.2f", 3.14159); // formatowanie jak w C
Stwórz pakiet factorial i napisz program FactorialCalculator, który czyta nieujemne $n$ i oblicza silnię $n!$
$$n! = 1 \cdot 2 \cdot ... \cdot n$$.
Spróbuj zrealizować program w taki sposób, aby działał poprawnie dla dużych wartości n (np. 1000). Użyj typu java.math.BigInteger.
Napisz program, który oblicza przybliżenie funkcji wykładniczej $e^x$ przy pomocy szeregu Taylora:
$$e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!}$$
obliczając sumę $n$ pierwszych wyrazów tego szeregu. Użyj typu java.math.BigDecimal do przechowywania wyniku i zapewnij odpowiednią precyzję obliczeń. Kolejne wyrazy szeregu $t_0, t_1, t_2, ...$ umieść w tablicy.
Wskazówki:
BigDecimal określ kontekst matematyczny MathContext (lub scale i RoundingMode) aby uniknąć ArithmeticException dla nieskończonych rozwinięć.Wejście programu:
Wartości domyślne są używane, gdy użytkownik poda pustą linię zamiast liczby.
Wyjście programu:
Math.exp(x).