Điều chỉnh phạm vi truy cập trong Java

Hãy xem từ khóa public đứng phía trước hàm main().

public static void main(String[] args)

Từ khóa public đó gọi là access modifier - điều khiển mức độ truy cập. Các modifier có thể có ở: lớp (class), phương thức, thuộc tính.

Access modifier cho lớp

Đối với các lớp tronng java, modifier sử dụng được là public (viết trước từ khóa class) hoặc là mặc định không có khai báo modifer với ý nghĩa như sau:

  • public: lớp này có thể được truy cập bởi bất kỳ lớp nào khác.
  • mặc định: không viết modifier nào (để trống) thì lớp này chỉ có thể truy cập bởi các lớp có cùng package

Access modifier đối với các phương thức và thuộc tính

Modifier viết phía trước các hàm (phương thức java) có thể là public, protected, private với các ý nghĩa như sau:

  • mặc định: không viết modifier nào (để trống) thì thuộc tính / phương thức đó chỉ có thể truy cập bởi các lớp khác cùng package
  • public: public trong java thì thuộc tính/phương thức truy cập được bởi bất kỳ lớp nào
  • protected: protected trong java giống trương hợp mặc định, nhưng thêm các lớp con có thể truy cập
  • private: private trong java chỉ truy cập được bởi chính lớp khai báo

Ví dụ:

public class Vehicle {
  private int maxSpeed;
  private int wheels;
  private String color;
  private double fuelCapacity;

  public void horn() {
    System.out.println("Beep!");
  }
}

Trong thực hành lập trình để đảm bảo những lợi ích từ các nguyên tắc lập trình hướng đối tượng là đóng gói thì các thuộc tính của lớp nên giữ là private, tức là chỉ truy cập được bởi lớp khai báo và sử dụng khái niệm phương thức Setter và Getter để thiết lập hay lấy giá trị thuộc tính.

Getter & Setter trong Java

Khi xây dựng cấu trúc một lớp, có các thuộc tính có phạm vi truy cập là private thường sẽ xây dựng thêm phương thức để lấy giá trị thuộc tính đó của lớp gọi nó là Getter và phương thức để thiết lập giá trị thuộc tính là Setter

Bạn nên theo quy tắc đặt tên các phương thức này: bắt đầu bởi set/get tiếp theo là tên thuộc tính (chữ đầu viết hoa theo tên thuộc tính, nếu kiểu dữ liệu là logic boolean thì có thể dùng tiền tố là chữ is hoắc get).

Ví dụ

public class Vehicle {
    private String color;
    private boolean electric;

    // Getter - phương thức đọc một thuộc tính
    public String getColor() {
        return this.color;
    }

    // Setter - phương thức để thiết lập giá trị thuộc tính
    public void setColor(String c) {
        this.color = c;
    }

    public String isElectric() {
        return this.electric;
    }
}

Lớp ví dụ trên, thuộc tính là color, setter là setColor() và getter là getColor(), isElectric()

Từ khóa this được dùng trong các phương thức của lớp, nó sử dụng để chỉ đến đối tượng hiện tại mà lớp tạo ra. this.color là color của đối tượng hiện tại.

Sử dụng lớp Vehicle

class MyClass {
    public static void main(String[] args) {
        Vehicle v1 = new Vehicle();
        v1.setColor("Red");
        System.out.println(v1.getColor());
    }
}
//Outputs "Red"

Phương thức khởi tạo

Các phương thức khởi tạo (Contructor) là phương thức đặc biệt, được gọi tự động ngay khi tạo ra đối tượng, nó dùng để khởi tạo các thuộc tính (dữ liệu) của đối tượng. Để có phương thức này, bạn chỉ cần khai báo phương thức như sau:

  • Cùng tên với tên lớp
  • Không khai báo kiểu trả về

Ví dụ

public class Vehicle {
    private String color;

    // phương thức khởi tạo không tham số, phương thức này là mặc định
    // nếu bạn không khai báo thì Java tự sinh ra
    public Vehicle() {
		this.color = "RED";
	}

    public Vehicle(String c) {
    	this.color = c;
    }
}

Lớp trên có hai hàm tạo (phương thức khởi tạo java), một hàm có tham số và một hàm không có tham số. Phương thức khởi tạo nào được gọi tùy thuộc tham số khởi tạo đối tượng.

public class MyClass {
    public static void main(String[ ] args) {
        Vehicle v1 = new Vehicle();
        Vehicle v2 = new Vehicle("Blue");
    }
}

Đoạn mã trên v1 sẽ gọi hàm tạo thứ nhất vì không có tham số (màu sẽ gán bằng RED), v2 sẽ gọi hàm tạo thứ 2 vì có một tham số lúc này v2 sẽ có color là Blue


Đăng ký nhận bài viết mới