OOP

Modifiers

public

Các thuộc tính và phương thức public có thể được truy cập từ bất cứ đâu

package mypackage;

public class Animal {
    public String name = "Dog";  // Biến public có thể truy cập từ bất kỳ đâu

    public void makeSound() { // Phương thức public có thể gọi từ bất kỳ class nào
        System.out.println("Woof! Woof!");
    }
}

// Class khác có thể truy cập biến và phương thức `public`
package anotherpackage;
import mypackage.Animal;

public class Main {
    public static void main(String[] args) {
        Animal a = new Animal();
        System.out.println(a.name); // ✅ Truy cập được biến public
        a.makeSound(); // ✅ Gọi được phương thức public
    }
}


protected

Các thuộc tính và phương thức protected chỉ có thể được truy cập từ trong cùng 1 package hoặc subclass từ package khác

package animals;

public class Animal {
    protected String name = "Lion"; // ✅ Có thể truy cập từ subclass

    protected void makeSound() { // ✅ Có thể gọi từ subclass
        System.out.println("Roar!");
    }
}

// Class con ở package khác
package main;
import animals.Animal;

class Dog extends Animal {
    void show() {
        System.out.println(name); // ✅ Truy cập được biến protected từ class cha
        makeSound(); // ✅ Gọi được phương thức protected
    }
}

public class Main {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.show(); // ✅ Truy cập được vì Dog kế thừa Animal
    }
}


default

Chỉ có thể truy cập trong cùng một package

package animals;

class Animal { // Không khai báo "public" -> phạm vi default
    String name = "Elephant"; // ✅ Chỉ có thể truy cập từ cùng package

    void makeSound() { // ✅ Chỉ có thể gọi từ cùng package
        System.out.println("Trumpet sound!");
    }
}

// Class khác trong cùng package có thể truy cập biến & phương thức default
package animals;

public class Main {
    public static void main(String[] args) {
        Animal a = new Animal(); // ✅ Truy cập được vì cùng package
        System.out.println(a.name);
        a.makeSound();
    }
}

// ❌ Nếu Main.java nằm trong package khác thì không thể truy cập Animal.

private

Chỉ có thể truy cập trong chính class đó

package mypackage;

public class Animal {
    private String name = "Cat"; // ❌ Không thể truy cập từ bên ngoài class

    private void makeSound() { // ❌ Không thể gọi từ class khác
        System.out.println("Meow! Meow!");
    }

    // Tạo phương thức public để truy cập biến private
    public void showName() {
        System.out.println("Animal: " + name);
        makeSound(); // ✅ Gọi được phương thức private từ trong class
    }
}

public class Main {
    public static void main(String[] args) {
        Animal a = new Animal();
        // System.out.println(a.name); // ❌ Lỗi! Không thể truy cập biến private
        // a.makeSound(); // ❌ Lỗi! Không thể gọi phương thức private
        a.showName(); // ✅ Gọi được vì showName() là public
    }
}