Skip to content · ⁨Lompat ke konten⁩
Subjects · ⁨Materi⁩
  • 1 Java basics · ⁨Dasar-dasar Java⁩
    1.1

    Kelas, main & output

    English

    Every Java program lives inside a class 类. It starts at a method 方法 named main. System.out.println(...) prints a line; System.out.print(...) prints with no new line.

    • Java is compiled 编译: the compiler 编译器 checks the whole program, then it runs.
    • Every statement 语句 ends with a semicolon ;.
    Bahasa Indonesia

    Setiap program Java berada di dalam sebuah kelas. Ia dimulai pada method bernama main. System.out.println(...) mencetak baris; System.out.print(...) mencetak tanpa baris baru.

    public class Main {
        public static void main(String[] args) {
            System.out.println("Hello, world!");
            System.out.println("I am learning Java.");
        }
    }
    
    • Java dikompilasi: komiler memeriksa seluruh program, lalu ia dijalankan.
    • Setiap statement diakhiri dengan titik koma ;.
    Program Java hidup di dalam kelas dan dimulai dari main
    Program Java hidup di dalam kelas dan dimulai dari main
    1.2

    Variabel & tipe primitif

    English

    A variable 变量 must declare 声明 its type. Common primitive types 基本类型: int (whole number), double (decimal), boolean (true/false), char (one letter).

    Bahasa Indonesia

    Sebuah variabel harus mendeklarasikan tipenya. Tipe primitif umum: int (bilangan bulat), double (desimal), boolean (true/false), char (satu huruf).

    public class Main {
        public static void main(String[] args) {
            int age = 17;
            double price = 9.99;
            boolean passed = true;
            System.out.println(age + " " + price + " " + passed);
        }
    }
    
    1.3

    Komentar & gaya

    English

    A comment 注释 is // (one line) or /* ... */ (a block). Indent the code inside braces { }. Class names start Capitalised; variables and methods use camelCase 驼峰命名 (lowercase first).

    Common mistakes

    • Every statement ends with a semicolon ;.
    • main must be exactly public static void main(String[] args).
    • println adds a new line; print does not.
    Bahasa Indonesia

    Komentar adalah // (satu baris) atau /* ... */ (blok). Indentasi kode di dalam kurung kurawal { }. Nama kelas dimulai dengan Huruf Besar; variabel dan method menggunakan camelCase (huruf kecil pertama).

    public class Main {
        public static void main(String[] args) {
            // greet the user
            String firstName = "Mei";
            System.out.println("Hi, " + firstName);
        }
    }
    

    Kesalahan umum

    • Setiap statement diakhiri dengan titik koma ;.
    • main harus tepat public static void main(String[] args).
    • println menambahkan baris baru; print tidak.
  • 2 Operators & expressions · ⁨Operator & ekspresi⁩
    2.1

    Aritmatika & penugasan

    English

    Java arithmetic 算术 uses + - * / and % (remainder). With two ints, / is integer division 整数除法 — it drops the decimal. +=, -=, and ++ are shortcuts.

    Bahasa Indonesia

    Aritmatika Java menggunakan + - * / dan % (sisa bagi). Dengan dua ints, / adalah pembagian integer — ini membuang desimal. +=, -=, dan ++ adalah jalan pintas.

    public class Main {
        public static void main(String[] args) {
            int a = 7, b = 2;
            System.out.println(a / b);    // 3 (integer division)
            System.out.println(a % b);    // 1
            double x = 7.0 / 2;           // 3.5 (one side is double)
            System.out.println(x);
        }
    }
    
    int/int memotong; melibatkan double untuk hasil bagi sebenarnya
    int/int memotong; melibatkan double untuk hasil bagi sebenarnya
    2.2

    Menggunakan objek: String, Math, wrapper

    English

    Some values are objects 对象 with methods. String has .length(), .substring(), .toUpperCase(). Math has Math.max, Math.sqrt, Math.pow. Wrapper classes 包装类 (Integer, Double) wrap a primitive — e.g. Integer.parseInt("42").

    Math.random() returns a random 随机 double from 0.0 up to (but not including) 1.0. Scale it and cast to get whole numbers — this is the AP idiom:

    • Integer.MAX_VALUE (2147483647) and Integer.MIN_VALUE are the limits of int; going past them wraps around (an overflow).
    • An object variable that points at no object holds null; calling a method on it throws a NullPointerException.
    Bahasa Indonesia

    Beberapa nilai adalah objek dengan method. String memiliki .length(), .substring(), .toUpperCase(). Math memiliki Math.max, Math.sqrt, Math.pow. Kelas wrapper (Integer, Double) membungkus primitif — mis. Integer.parseInt("42").

    public class Main {
        public static void main(String[] args) {
            String s = "Hello";
            System.out.println(s.length());                  // 5
            System.out.println(s.toUpperCase());             // HELLO
            System.out.println(Math.max(3, 9));              // 9
            System.out.println(Integer.parseInt("42") + 1);  // 43
        }
    }
    

    Math.random() mengembalikan random double dari 0.0 hingga (tetapi tidak termasuk) 1.0. Skala dan cast untuk mendapatkan bilangan bulat — ini adalah idiom AP:

    public class Main {
        public static void main(String[] args) {
            // a random whole number from 1 to 6 (a dice roll)
            int roll = (int) (Math.random() * 6) + 1;
            System.out.println(roll >= 1 && roll <= 6);   // true
        }
    }
    
    • Integer.MAX_VALUE (2147483647) dan Integer.MIN_VALUE adalah batas dari int; melampauinya akan melingkar kembali (overflow).
    • Variabel objek yang menunjuk ke objek apa pun memegang null; memanggil method padanya melempar NullPointerException.
    2.3

    Casting & konversi tipe

    English

    A cast 强制转换 changes a value's type. (int) drops the decimal; (double) avoids integer division when you need an exact result.

    Common mistakes

    • Integer division: 5 / 2 is 2, not 2.5. Cast first: (double) 5 / 2.
    • Compare Strings (and other objects) with .equals(), not ==.
    • == on two objects tests whether they are the SAME object, not whether they look equal.
    Bahasa Indonesia

    Casting mengubah tipe nilai. (int) membuang desimal; (double) menghindari pembagian integer ketika Anda membutuhkan hasil yang presisi.

    public class Main {
        public static void main(String[] args) {
            double pi = 3.99;
            System.out.println((int) pi);            // 3
            int total = 7, n = 2;
            System.out.println((double) total / n);  // 3.5
        }
    }
    

    Kesalahan umum

    • Pembagian integer: 5 / 2 adalah 2, bukan 2.5. Cast terlebih dahulu: (double) 5 / 2.
    • Bandingkan String (dan objek lainnya) dengan .equals(), bukan ==.
    • == pada dua objek menguji apakah mereka adalah OBJEK YANG SAMA, bukan apakah mereka terlihat sama.
  • 3 Booleans & selection · ⁨Boolean & seleksi⁩
    3.1

    if / else

    English

    if runs a block when a condition 条件 is true; else if and else add more cases. The condition goes in ( ), the block in { }.

    Bahasa Indonesia

    if menjalankan blok ketika kondisi true; else if dan else menambah kasus lebih lanjut. Kondisi masuk ke ( ), blok ke { }.

    public class Main {
        public static void main(String[] args) {
            int score = 72;
            if (score >= 80) {
                System.out.println("A");
            } else if (score >= 60) {
                System.out.println("B");
            } else {
                System.out.println("fail");
            }
        }
    }
    
    if memilih cabang yang benar; else memilih cabang yang salah
    if memilih cabang yang benar; else memilih cabang yang salah
    3.2

    Operator logika & perbandingan

    English

    Compare with ==, !=, <, >, <=, >= — a comparison 比较 gives a boolean. Combine with && (and), || (or), ! (not) — the logical operators 逻辑运算符. For Strings, use .equals(...), not ==.

    Bahasa Indonesia

    Bandingkan dengan ==, !=, <, >, <=, >= — perbandingan menghasilkan boolean. Gabungkan dengan && (dan), || (atau), ! (tidak) — operator logika. Untuk Strings, gunakan .equals(...), bukan ==.

    public class Main {
        public static void main(String[] args) {
            int age = 16;
            boolean member = true;
            System.out.println(age >= 18 && member);   // false
            String a = "hi";
            System.out.println(a.equals("hi"));        // true
        }
    }
    
    3.3

    switch

    English

    switch chooses among many fixed values. Each case ends with break; default is the fallback.

    Common mistakes

    • A condition must be a boolean; if (x = 5) does not compile (use ==).
    • Each switch case needs a break;, or control falls through to the next case.
    • && and || are the logical operators; & and | are bitwise.
    Bahasa Indonesia

    switch memilih di antara banyak nilai tetap. Setiap case diakhiri dengan break; default adalah fallback.

    public class Main {
        public static void main(String[] args) {
            int day = 3;
            switch (day) {
                case 1: System.out.println("Mon"); break;
                case 3: System.out.println("Wed"); break;
                default: System.out.println("other");
            }
        }
    }
    

    Kesalahan umum

    • Kondisi harus berupa boolean; if (x = 5) tidak bisa dikompilasi (gunakan ==).
    • Setiap switch case memerlukan break;, atau kontrol akan turun ke case berikutnya.
    • && dan || adalah operator logika; & dan | adalah bitwise.
  • 4 Loops · ⁨Perulangan⁩
    4.1

    while loops

    English

    A while loop repeats while a condition is true. Change something inside, or it loops forever.

    Bahasa Indonesia

    Siklus while berulang selama kondisi true. Ubah sesuatu di dalamnya, atau ia akan berulang selamanya.

    public class Main {
        public static void main(String[] args) {
            int n = 1;
            while (n <= 3) {
                System.out.println(n);
                n++;
            }
        }
    }
    
    while memeriksa kondisi sebelum setiap putaran body
    while memeriksa kondisi sebelum setiap putaran body
    4.2

    for loops

    English

    A for loop packs the start, the condition, and the step into one line. Best when you know the count.

    Bahasa Indonesia

    Siklus for menggabungkan awal, kondisi, dan langkah ke dalam satu baris. Terbaik ketika Anda mengetahui jumlahnya.

    public class Main {
        public static void main(String[] args) {
            for (int i = 0; i < 5; i++) {
                System.out.print(i + " ");
            }
            System.out.println();   // 0 1 2 3 4
        }
    }
    
    4.3

    Akumulasi

    English

    The accumulator 累加器 pattern: start a variable before the loop, then update it each turn.

    Bahasa Indonesia

    Pola akumulator: mulai variabel sebelum loop, lalu update setiap giliran.

    public class Main {
        public static void main(String[] args) {
            int total = 0;
            for (int i = 1; i <= 5; i++) {
                total += i;
            }
            System.out.println(total);   // 15
        }
    }
    
    4.4

    Perulangan bersarang

    English

    A loop inside a loop is a nested loop 嵌套循环. The inner loop runs fully on each turn of the outer one.

    Common mistakes

    • for (int i = 0; i < n; i++) runs n times (0 to n - 1); using <= runs one extra.
    • Do not put a semicolon right after for (...) or while (...) — it makes an empty loop.
    • Declare the counter in the for header so its scope ends with the loop.
    Bahasa Indonesia

    Loop di dalam loop adalah loop bersarang. Loop dalam berjalan penuh pada setiap giliran luar.

    public class Main {
        public static void main(String[] args) {
            for (int r = 0; r < 3; r++) {
                for (int c = 0; c < 3; c++) {
                    System.out.print("*");
                }
                System.out.println();
            }
        }
    }
    

    Kesalahan umum

    • for (int i = 0; i < n; i++) berjalan n kali (0 hingga n - 1); menggunakan <= berjalan satu kali ekstra.
    • Jangan letakkan titik koma tepat setelah for (...) atau while (...) — itu membuat loop kosong.
    • Deklarasikan counter di header for agar scope-nya berakhir dengan loop.
  • 5 Strings · ⁨String⁩
    5.1

    Method String

    English

    A String 字符串 is text. Useful methods: .length(), .charAt(i), .substring(a, b), .indexOf(x), .toUpperCase(), .equals(...). Strings are immutable 不可变 — each method returns a new String.

    The methods you will use every day:

    Method Meaning Example → result
    .length() how many characters "Hi".length() → 2
    .charAt(i) one character "Hi".charAt(0) → H
    .substring(a, b) part, stops before b "Python".substring(0, 3) → Pyt
    .substring(a) from a to the end "Python".substring(3) → hon
    .indexOf(x) first position, -1 if absent "banana".indexOf("na") → 2
    .equals(s) same text? "hi".equals("hi") → true
    .compareTo(s) order: negative / 0 / positive "apple".compareTo("banana") → negative

    compareTo puts Strings in dictionary order — the AP exam uses it for sorting questions:

    Bahasa Indonesia

    Sebuah String adalah teks. Method berguna: .length(), .charAt(i), .substring(a, b), .indexOf(x), .toUpperCase(), .equals(...). String bersifat immutable — setiap method mengembalikan String baru.

    public class Main {
        public static void main(String[] args) {
            String s = "Python";
            System.out.println(s.length());          // 6
            System.out.println(s.charAt(0));         // P
            System.out.println(s.substring(0, 3));   // Pyt
            System.out.println(s.toUpperCase());     // PYTHON
        }
    }
    

    Method yang akan Anda gunakan setiap hari:

    Method Makna Contoh → hasil
    .length() berapa banyak karakter "Hi".length() → 2
    .charAt(i) satu karakter "Hi".charAt(0) → H
    .substring(a, b) bagian, berhenti sebelum b "Python".substring(0, 3) → Pyt
    .substring(a) dari a hingga akhir "Python".substring(3) → hon
    .indexOf(x) posisi pertama, -1 jika tidak ada "banana".indexOf("na") → 2
    .equals(s) teks yang sama? "hi".equals("hi") → true
    .compareTo(s) urutan: negatif / 0 / positif "apple".compareTo("banana") → negatif

    compareTo menyusun String dalam urutan kamus — ujian AP menggunakannya untuk pertanyaan pengurutan:

    public class Main {
        public static void main(String[] args) {
            String a = "apple", b = "banana";
            System.out.println(a.compareTo(b) < 0);    // true (apple comes first)
            System.out.println(a.compareTo("apple"));  // 0 (equal)
        }
    }
    
    Key String methods: length, charAt, substring, equals
    Key String methods: length, charAt, substring, equals
    5.2

    Membangun & menelusuri strings

    English

    Join strings with + (concatenation 拼接). Visit each character with a loop and .charAt(i).

    When you build a long String in a loop, StringBuilder is much faster: append the pieces, then call .toString() once.

    Common mistakes

    • Strings are immutable: s.toUpperCase() returns a new String, so store the result.
    • Read a character with s.charAt(i); the length is s.length() (a method, with ()).
    • Building a String with += in a big loop is slow; use a StringBuilder.
    Bahasa Indonesia

    Gabungkan strings dengan + (konkatenasi). Kunjungi setiap karakter dengan loop dan .charAt(i).

    public class Main {
        public static void main(String[] args) {
            String word = "banana";
            int count = 0;
            for (int i = 0; i < word.length(); i++) {
                if (word.charAt(i) == 'a') count++;
            }
            System.out.println(count);   // 3
        }
    }
    

    Ketika Anda membangun String panjang dalam loop, StringBuilder jauh lebih cepat: append potongan-potongan, lalu panggil .toString() sekali.

    public class Main {
        public static void main(String[] args) {
            StringBuilder sb = new StringBuilder();
            for (int i = 1; i <= 5; i++) {
                sb.append(i).append(" ");
            }
            System.out.println(sb.toString().trim());   // 1 2 3 4 5
        }
    }
    

    Kesalahan umum

    • Strings bersifat immutable: s.toUpperCase() mengembalikan String baru, jadi simpan hasilnya.
    • Baca karakter dengan s.charAt(i); panjangnya adalah s.length() (sebuah method, dengan ()).
    • Membangun String dengan += dalam loop besar lambat; gunakan StringBuilder.
  • 6 Arrays · ⁨Array⁩
    6.1

    Array 1-D

    English

    An array 数组 holds a fixed number of values of one type. Index from 0, and get the size with .length.

    Bahasa Indonesia

    Array menyimpan jumlah nilai tetap dari satu tipe. Index dari 0, dan dapatkan ukuran dengan .length.

    public class Main {
        public static void main(String[] args) {
            int[] scores = {88, 71, 95};
            System.out.println(scores[0]);       // 88
            System.out.println(scores.length);   // 3
            scores[1] = 100;
            System.out.println(scores[1]);       // 100
        }
    }
    
    Primitif memegang nilainya; variabel array memegang referensi ke objek array
    Primitif memegang nilainya; variabel array memegang referensi ke objek array
    6.2

    Algoritma array

    English

    Walk the array with a loop to find a max, a total, a count, or to search 查找. A for-each loop (for (int x : a)) reads each value in turn.

    Bahasa Indonesia

    Jelajahi array dengan loop untuk menemukan nilai maksimum, total, jumlah, atau melakukan pencarian. Loop for-each (for (int x : a)) membaca setiap nilai secara berurutan.

    public class Main {
        public static void main(String[] args) {
            int[] a = {3, 9, 2, 7};
            int max = a[0], total = 0;
            for (int x : a) {
                if (x > max) max = x;
                total += x;
            }
            System.out.println(max + " " + total);   // 9 21
        }
    }
    
    6.3

    Array 2-D

    English

    A 2-D array 二维数组 is a grid 网格 of rows and columns: grid[row][col].

    Common mistakes

    • An array's size is a.length (no brackets, no ()), and it is fixed when created.
    • Valid indexes are 0 to a.length - 1; a[a.length] throws ArrayIndexOutOfBoundsException.
    • A new int[5] is filled with zeros, not left empty.
    Bahasa Indonesia

    Array 2-D adalah grid baris dan kolom: grid[row][col].

    public class Main {
        public static void main(String[] args) {
            int[][] grid = {{1, 2, 3}, {4, 5, 6}};
            System.out.println(grid[1][2]);   // 6
            for (int[] row : grid) {
                for (int v : row) System.out.print(v + " ");
            }
            System.out.println();             // 1 2 3 4 5 6
        }
    }
    

    Kesalahan umum

    • Ukuran array adalah a.length (tanpa kurung siku, tanpa ()), dan bersifat tetap saat dibuat.
    • Indeks yang valid adalah 0 hingga a.length - 1; a[a.length] akan menyebabkan ArrayIndexOutOfBoundsException.
    • Array baru (int[5]) diisi dengan angka nol, bukan dibiarkan kosong.
  • 7 ArrayList
    7.1

    Dasar-dasar ArrayList

    English

    An ArrayList is a resizable 可变大小 list — it grows and shrinks as you add or remove items. It stores objects, so use a wrapper 包装类 type like Integer (not int). The <Integer> part is a generic 泛型 type. Key methods: .add(x), .get(i), .set(i, x), .size(), .remove(i).

    Bahasa Indonesia

    ArrayList (ArrayList) adalah daftar yang dapat berubah ukurannya—ia membesar dan mengecil saat Anda menambah atau menghapus item. Ini menyimpan objek, jadi gunakan tipe pembungkus seperti Integer (Integer) (bukan int/int). Bagian ⟨<Integer>⟩ adalah tipe generik. Metode utama: .add(x), .get(i), .set(i, x), .size(), .remove(i).

    import java.util.ArrayList;
    
    public class Main {
        public static void main(String[] args) {
            ArrayList<Integer> nums = new ArrayList<Integer>();
            nums.add(10);
            nums.add(20);
            nums.add(30);
            System.out.println(nums.size());   // 3
            System.out.println(nums.get(1));   // 20
            nums.set(0, 99);
            System.out.println(nums);          // [99, 20, 30]
        }
    }
    
    ArrayList: add, get, size pada daftar dinamis
    ArrayList: add, get, size pada daftar dinamis
    7.2

    Algoritma ArrayList & bug remove

    English

    .remove(i) shifts 移动 every later element one place left. If you remove while counting i up, you skip the next element. Fix: loop backwards, or don't increment i after a remove.

    Common mistakes

    • ArrayList uses .size(), .get(i) and .add(...) — not the [] you use on arrays.
    • Removing items while looping forward by index skips the next item (the remove bug). Loop backwards, or use an iterator.
    • Store objects, not primitives: use ArrayList<Integer>, and Java auto-boxes int values.
    Bahasa Indonesia

    remove (.remove(i)) menggeser setiap elemen berikutnya satu posisi ke kiri. Jika Anda menghapus sambil menghitung i naik, Anda akan melewatkan elemen berikutnya. Perbaikan: loop mundur, atau jangan increment i setelah operasi remove.

    import java.util.ArrayList;
    
    public class Main {
        public static void main(String[] args) {
            ArrayList<Integer> nums = new ArrayList<Integer>();
            for (int n : new int[]{4, 7, 4, 9, 4}) nums.add(n);
            // Remove every 4 — loop backwards so removals don't skip items.
            for (int i = nums.size() - 1; i >= 0; i--) {
                if (nums.get(i) == 4) nums.remove(i);
            }
            System.out.println(nums);   // [7, 9]
        }
    }
    

    Kesalahan umum

    • ArrayList menggunakan .size(), .get(i) dan .add(...) — bukan [] yang Anda gunakan pada array.
    • Menghapus item sambil looping maju berdasarkan indeks akan melewatkan item berikutnya (bug remove). Loop mundur, atau gunakan iterator.
    • Simpan objek, bukan primitif: gunakan Integer (ArrayList<Integer>), dan Java melakukan auto-boxing pada nilai int (int).
  • 8 Writing classes · ⁨Menulis kelas⁩
    8.1

    Field, constructor & method

    English

    A class 类 is a blueprint for objects. Its fields 字段 store data, its constructor 构造方法 sets up a new object, and its methods 方法 are the actions. this.name means "this object's name". Create an object with new.

    A static member belongs to the class itself, not to any one object. Call a static method on the class name — like Math.max — and a static field is shared by every object:

    Bahasa Indonesia

    Kelas adalah cetak biru untuk objek. Medan menyimpan data, konstruktor mengatur objek baru, dan metodenya adalah tindakan. this.name berarti "name dari objek ini". Buatlah sebuah objek dengan new.

    public class Main {
        public static void main(String[] args) {
            Dog d = new Dog("Rex", 3);
            System.out.println(d.describe());   // Rex is 3 years old
            d.haveBirthday();
            System.out.println(d.describe());   // Rex is 4 years old
        }
    }
    
    class Dog {
        private String name;
        private int age;
    
        public Dog(String name, int age) {   // constructor
            this.name = name;
            this.age = age;
        }
    
        public String describe() {
            return name + " is " + age + " years old";
        }
    
        public void haveBirthday() {
            age++;
        }
    }
    

    Anggota static (static) milik class itu sendiri, bukan salah satu objek. Panggil method static pada nama class—seperti Math.random() (Math.max)—dan field static dibagikan oleh setiap objek:

    public class Main {
        public static void main(String[] args) {
            System.out.println(Counter.made());   // 0
            new Counter();
            new Counter();
            System.out.println(Counter.made());   // 2
        }
    }
    
    class Counter {
        private static int count = 0;      // shared by ALL Counter objects
    
        public Counter() { count++; }
    
        public static int made() {         // called on the class: Counter.made()
            return count;
        }
    }
    
    Field menyimpan state; constructor membangun; method bertindak
    Field menyimpan state; constructor membangun; method bertindak
    8.2

    Enkapsulasi

    English

    Encapsulation 封装 means hiding data behind methods. Mark fields private so outside code can't touch them directly; expose an accessor 访问方法 (getter) to read, and a method to change them safely. The method can guard the data — here a deposit must be positive.

    Common mistakes

    • A constructor has the class name and no return type (not even void).
    • Use this.field to tell a field apart from a parameter with the same name.
    • Make fields private and reach them through getter/setter methods (encapsulation).
    Bahasa Indonesia

    Enkapsulasi berarti menyembunyikan data di balik method. Tandai field sebagai private (private) agar kode luar tidak bisa menyentuhnya langsung; tampilkan accessor (getter) untuk membaca, dan method untuk mengubahnya dengan aman. Method tersebut dapat mengawasi data—di sini deposit harus bernilai positif.

    public class Main {
        public static void main(String[] args) {
            Account a = new Account(100);
            a.deposit(50);
            a.deposit(-999);                       // rejected by the guard
            System.out.println(a.getBalance());    // 150
        }
    }
    
    class Account {
        private int balance;                       // hidden from outside
    
        public Account(int start) {
            balance = start;
        }
    
        public void deposit(int amount) {
            if (amount > 0) balance += amount;     // guard keeps balance valid
        }
    
        public int getBalance() {                  // accessor (getter)
            return balance;
        }
    }
    

    Kesalahan umum

    • Constructor memiliki nama class dan tanpa tipe pengembalian (bahkan bukan void/void).
    • Gunakan this. (this.field) untuk membedakan field dari parameter dengan nama yang sama.
    • Buat field menjadi private (private) dan akses melalui method getter/setter (enkapsulasi).
  • 9 Inheritance & polymorphism · ⁨Inheritance & polimorfisme⁩
    9.1

    Pewarisan (Inheritance)

    English

    Inheritance 继承 lets a subclass 子类 reuse a superclass 父类. Write class Cat extends Animal and Cat gets Animal's fields and methods for free. Call the parent constructor with super(...).

    Bahasa Indonesia

    Pewarisan memungkinkan subclass mendaur ulang superclass. Tulis extends (class Cat extends Animal) dan subclass (Cat) akan mendapatkan field dan method dari parent (Animal) secara gratis. Panggil constructor parent dengan super (super(...)).

    public class Main {
        public static void main(String[] args) {
            Cat c = new Cat("Milo");
            c.eat();      // Milo is eating  (inherited from Animal)
            c.speak();    // Meow            (Cat's own method)
        }
    }
    
    class Animal {
        protected String name;
        public Animal(String name) { this.name = name; }
        public void eat() { System.out.println(name + " is eating"); }
    }
    
    class Cat extends Animal {
        public Cat(String name) { super(name); }     // call Animal's constructor
        public void speak() { System.out.println("Meow"); }
    }
    
    Cat dan Dog mewarisi Animal: mereka mewarisi anggotanya dan menambahkan miliknya sendiri
    Cat dan Dog mewarisi Animal: mereka mewarisi anggotanya dan menambahkan miliknya sendiri
    9.2

    Polimorfisme & toString

    English

    A subclass can override 重写 a method to replace the parent's version. Polymorphism 多态 means a Shape variable can hold any subtype, and Java picks the right toString at run time. System.out.println(obj) automatically calls obj.toString().

    Common mistakes

    • An overriding method must match the signature exactly; add @Override so the compiler catches slips.
    • super(...) must be the first line of a subclass constructor.
    • A subclass object IS-A superclass object, but not the other way round.
    Bahasa Indonesia

    Subclass dapat menimpa (override) method untuk menggantikan versi orang tuanya. Polimorfisme berarti variabel bertipe parent (Shape) dapat menyimpan subtype mana pun, dan Java memilih method yang tepat (toString) saat waktu eksekusi. @Override (System.out.println(obj)) secara otomatis memanggil method yang ditimpa (obj.toString()).

    public class Main {
        public static void main(String[] args) {
            Shape[] shapes = { new Circle(2), new Square(3) };
            for (Shape s : shapes) {
                System.out.println(s);          // each calls its own toString
            }
        }
    }
    
    class Shape {
        public String toString() { return "a shape"; }
    }
    
    class Circle extends Shape {
        private int r;
        public Circle(int r) { this.r = r; }
        public String toString() { return "Circle r=" + r; }     // override
    }
    
    class Square extends Shape {
        private int side;
        public Square(int side) { this.side = side; }
        public String toString() { return "Square side=" + side; }   // override
    }
    

    Kesalahan umum

    • Method yang ditimpa harus mencocokkan tanda tangannya persis; tambahkan @Override (@Override) agar compiler menangkap kesalahan.
    • super(...) harus menjadi baris pertama dari constructor subclass.
    • Objek subclass IS-A objek superclass, tetapi sebaliknya tidak.
  • 10 Recursion
    10.1

    Rekursi

    English

    Recursion 递归 is a method that calls itself. Every recursion needs a base case 基准情形 (when to stop) and a recursive call 递归调用 that moves toward it. Without a base case it never stops and crashes with a stack overflow.

    Trace it: factorial(5) waits for factorial(4), which waits for factorial(3)… down to factorial(1) returning 1. Then the answers multiply back up: 1 → 2 → 6 → 24 → 120.

    Recursion also works on Strings — peel off one character each call:

    Merge sort 归并排序 is the recursive sort on the AP exam: split the array in half, sort each half recursively, then merge 合并 the two sorted halves. It runs in O(n log n) — far faster than the O(n²) sorts on big arrays.

    Common mistakes

    • Recursion needs a base case, or it throws StackOverflowError.
    • Each recursive call must move CLOSER to the base case.
    • Trace a small example by hand to check the recursion returns the right value.
    • In merge sort, the merge step does the real work; the recursion only splits the array.
    Bahasa Indonesia

    Rekursi adalah method yang memanggil dirinya sendiri. Setiap rekursi memerlukan kasus dasar (kapan berhenti) dan pemanggilan rekursif yang mendekatinya. Tanpa kasus dasar, ia tidak akan pernah berhenti dan menyebabkan stack overflow.

    Stack pemanggilan untuk factorial(3): setiap pemanggilan menunggu, lalu mengembalikan dalam urutan terbalik
    Stack pemanggilan untuk factorial(3): setiap pemanggilan menunggu, lalu mengembalikan dalam urutan terbalik
    public class Main {
        public static void main(String[] args) {
            System.out.println(factorial(5));   // 120
        }
    
        public static int factorial(int n) {
            if (n <= 1) return 1;            // base case
            return n * factorial(n - 1);     // recursive call: n * (n-1)!
        }
    }
    

    Jejakkan: factorial(5) menunggu factorial(4), yang menunggu factorial(3)… hingga factorial(1) mengembalikan 1. Kemudian jawaban dikalikan kembali ke atas: 1 → 2 → 6 → 24 → 120.

    Rekursi juga bekerja pada String—lepas satu karakter setiap pemanggilan:

    public class Main {
        public static void main(String[] args) {
            System.out.println(reverse("PYTHON"));   // NOHTYP
        }
    
        static String reverse(String s) {
            if (s.length() <= 1) return s;               // base case
            return reverse(s.substring(1)) + s.charAt(0);
        }
    }
    

    Merge sort adalah sorting rekursif pada ujian AP: belah array menjadi dua, urutkan masing-masing bagian secara rekursif, lalu gabungkan kedua bagian yang sudah terurut. Berjalan dalam O(n log n)—jauh lebih cepat daripada sorting O(n²) pada array besar.

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            int[] a = {5, 2, 9, 1, 7, 3};
            mergeSort(a, 0, a.length - 1);
            System.out.println(Arrays.toString(a));   // [1, 2, 3, 5, 7, 9]
        }
    
        static void mergeSort(int[] a, int lo, int hi) {
            if (lo >= hi) return;                 // base case: one element
            int mid = (lo + hi) / 2;
            mergeSort(a, lo, mid);                // sort the left half
            mergeSort(a, mid + 1, hi);            // sort the right half
            merge(a, lo, mid, hi);                // merge the two halves
        }
    
        static void merge(int[] a, int lo, int mid, int hi) {
            int[] tmp = new int[hi - lo + 1];
            int i = lo, j = mid + 1, k = 0;
            while (i <= mid && j <= hi) {
                if (a[i] <= a[j]) tmp[k++] = a[i++];
                else              tmp[k++] = a[j++];
            }
            while (i <= mid) tmp[k++] = a[i++];
            while (j <= hi)  tmp[k++] = a[j++];
            for (k = 0; k < tmp.length; k++) a[lo + k] = tmp[k];
        }
    }
    

    Kesalahan umum

    • Rekursi memerlukan kasus dasar, atau akan menyebabkan StackOverflowError.
    • Setiap pemanggilan rekursif harus bergerak LEBIH DEKAT ke kasus dasar.
    • Jejakkan contoh kecil secara manual untuk memeriksa apakah rekursi mengembalikan nilai yang benar.
    • Dalam merge sort, langkah merge melakukan pekerjaan nyata; rekursi hanya membelah array.
  • 11 Searching & sorting · ⁨Pencarian & pengurutan⁩
    11.1

    Pencarian linear & biner

    English

    Linear search 线性查找 checks every element — works on any array. Binary search 二分查找 is much faster but needs a sorted 已排序 array: it looks at the middle, then throws away half each step. Both return the index, or -1 if not found.

    Bahasa Indonesia

    Pencarian linear memeriksa setiap elemen — bekerja pada array apa pun. Pencarian biner jauh lebih cepat tetapi memerlukan array terurut: ia melihat nilai tengah, lalu membuang separuh setiap langkah. Keduanya mengembalikan indeks, atau -1 jika tidak ditemukan.

    public class Main {
        public static void main(String[] args) {
            int[] a = {2, 5, 8, 12, 16, 23};      // sorted, so binary search works
            System.out.println(linear(a, 12));    // 3
            System.out.println(binary(a, 12));    // 3
            System.out.println(binary(a, 9));     // -1 (not found)
        }
    
        static int linear(int[] a, int target) {
            for (int i = 0; i < a.length; i++)
                if (a[i] == target) return i;
            return -1;
        }
    
        static int binary(int[] a, int target) {
            int lo = 0, hi = a.length - 1;
            while (lo <= hi) {
                int mid = (lo + hi) / 2;
                if (a[mid] == target) return mid;
                else if (a[mid] < target) lo = mid + 1;
                else hi = mid - 1;
            }
            return -1;
        }
    }
    
    Pencarian biner membagi dua jangkauan setiap langkah, sehingga array terurut dicari dalam O(log n)
    Pencarian biner membagi dua jangkauan setiap langkah, sehingga array terurut dicari dalam O(log n)
    11.2

    Selection & insertion sort

    English

    Selection sort 选择排序 repeatedly finds the smallest remaining value and swaps it to the front. Insertion sort 插入排序 takes each value and slides it back into its place among the already-sorted values.

    How the speeds compare:

    Algorithm Time
    linear search O(n)
    binary search O(log n), sorted arrays only
    selection / insertion sort O(n²)
    merge sort (topic 10) O(n log n)

    Common mistakes

    • Binary search only works on a sorted array.
    • Linear search is O(n); binary search is O(log n) but needs the sort first.
    • Selection and insertion sort are O(n²) — clear to learn, slow on big data.
    Bahasa Indonesia

    Selection sort berulang kali menemukan nilai tersisa terkecil dan menukarnya ke depan. Insertion sort mengambil setiap nilai dan menggesernya kembali ke tempatnya di antara nilai-nilai yang sudah terurut.

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            int[] a = {5, 2, 9, 1, 7};
            for (int i = 0; i < a.length - 1; i++) {
                int min = i;
                for (int j = i + 1; j < a.length; j++)
                    if (a[j] < a[min]) min = j;
                int t = a[min]; a[min] = a[i]; a[i] = t;   // swap into place
            }
            System.out.println(Arrays.toString(a));   // [1, 2, 5, 7, 9]
        }
    }
    
    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            int[] a = {5, 2, 9, 1, 7};
            for (int i = 1; i < a.length; i++) {
                int key = a[i], j = i - 1;
                while (j >= 0 && a[j] > key) {    // shift bigger values right
                    a[j + 1] = a[j];
                    j--;
                }
                a[j + 1] = key;                  // drop key into the gap
            }
            System.out.println(Arrays.toString(a));   // [1, 2, 5, 7, 9]
        }
    }
    

    Bagaimana kecepatan membandingkan:

    Algorithm Time
    linear search O(n)
    binary search O(log n), hanya array terurut
    selection / insertion sort O(n²)
    merge sort (topik 10) O(n log n)

    Kesalahan umum

    • Pencarian biner hanya berfungsi pada array yang terurut.
    • Pencarian linear adalah O(n); pencarian biner adalah O(log n) tetapi memerlukan pengurutan terlebih dahulu.
    • Selection dan insertion sort adalah O(n²)—mudah dipelajari, lambat pada data besar.
  • 12 Files & the FRQ · ⁨File & FRQ⁩
    12.1

    File teks dengan Scanner

    English

    A Scanner reads text one line at a time. For a real file you write new Scanner(new File("scores.txt")); here we wrap a String so the example runs anywhere. Use .split(" ") to split 拆分 a line into parts and Integer.parseInt(...) to parse 解析 a number from text.

    Bahasa Indonesia

    Scanner (Scanner) membaca teks satu baris per baris. Untuk file sungguhan Anda menulis new FileReader(...); (new Scanner(new File("scores.txt"))) di sini kita membungkus Scanner (String) agar contoh berjalan di mana saja. Gunakan nextLine().split() (.split(" ")) untuk memecah baris menjadi bagian-bagian dan Integer.parseInt() (Integer.parseInt(...)) untuk parsing angka dari teks.

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            // Real file:  Scanner in = new Scanner(new File("scores.txt"));
            String data = "Alice 80\nBob 95\nCara 72";
            Scanner in = new Scanner(data);
            int total = 0, count = 0;
            while (in.hasNextLine()) {
                String line = in.nextLine();
                String[] parts = line.split(" ");      // break the line on the space
                total += Integer.parseInt(parts[1]);
                count++;
            }
            System.out.println("average = " + (total / count));   // average = 82
        }
    }
    
    Scanner membaca baris selama hasNextLine() bernilai true
    Scanner membaca baris selama hasNextLine() bernilai true
    12.2

    Jenis soal FRQ AP

    English

    The AP CS A exam has four free-response 自由作答 questions, each a fixed shape:

    • Q1 — Methods & control: write methods to a given spec; loops, if, String/Math.
    • Q2 — Class design: write a full class (fields, constructor, methods) from a description.
    • Q3 — Array / ArrayList: process a 1-D array or ArrayList (search, count, build a new list).
    • Q4 — 2-D array: traverse a grid by row and column.

    The skill is always the same: read the spec, write the method exactly as described, return the right type.

    Common mistakes

    • nextInt() leaves the newline behind, so a following nextLine() reads an empty line — read it away first.
    • Check hasNext() before reading, to avoid running off the end of the file.
    • In the FRQ, read the method header carefully: match the return type and parameters exactly.
    Bahasa Indonesia

    Ujian AP CS A memiliki empat pertanyaan respons bebas, masing-masing dengan bentuk tetap:

    • Q1 — Metode & kontrol: tulis metode sesuai spesifikasi yang diberikan; perulangan, if, String/Math.
    • Q2 — Desain kelas: tulis satu kelas lengkap (bidang, konstruktor, metode) berdasarkan deskripsi.
    • Q3 — Array / ArrayList: proses array 1-D atau ArrayList (pencarian, penghitungan, membuat daftar baru).
    • Q4 — Array 2-D: jelajahi grid berdasarkan baris dan kolom.

    Keterampilan yang selalu sama: baca spesifikasi, tulis metode tepat seperti yang dijelaskan, kembalikan tipe yang benar.

    public class Main {
        public static void main(String[] args) {
            // Q1 style: implement a method to a spec, then it is tested.
            System.out.println(countEven(new int[]{4, 7, 10, 3, 6}));   // 3
        }
    
        /** Returns how many values in arr are even. */
        public static int countEven(int[] arr) {
            int count = 0;
            for (int x : arr)
                if (x % 2 == 0) count++;
            return count;
        }
    }
    

    Kesalahan umum

    • nextInt() meninggalkan baris baru di belakang, sehingga nextLine() berikutnya membaca baris kosong — bacalah itu terlebih dahulu.
    • Periksa hasNext() sebelum membaca, untuk menghindari keluar dari akhir file.
    • Dalam FRQ, baca header metode dengan teliti: cocokkan tipe kembalian dan parameter secara eksak.

Log in or create account · ⁨Masuk atau buat akun⁩

IGCSE, A-Level & AP