VieTopik
Tiếng HànTiếng Anh.NET (C#)Java
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
Java CoreClass cơ bản
Bài 11/19
5 phút

Getter, setter và constructor

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Ở bài trước, tạo một sản phẩm tốn ba dòng: new, gán tên, gán giá. Quên một dòng là có sản phẩm không tên. Bài này dùng constructor để bắt buộc truyền đủ dữ liệu lúc tạo, và getter, setter để quyết định phần nào được sửa về sau.

Khái niệm

🔒 private: từ khoá cho biết field hoặc method chỉ dùng được bên trong class khai báo nó.

🔐 Getter và setter: method public dùng để đọc (getX) và ghi (setX) một field private từ bên ngoài class.

🏗️ Constructor: method đặc biệt trùng tên class, tự chạy khi gọi new, dùng để gán giá trị ban đầu.

Ví dụ

// Main.java
void main() {
    var pen = new Product("Bút bi", 5000);
    pen.setStock(120);

    System.out.println(pen.getName() + ": "
            + pen.getPrice() + "đ");
    System.out.println(pen.getStock());
}

// Product.java
class Product {
    private String name;
    private long price;
    private int stock;

    public Product(String name, long price) {
        this.name = name;
        this.price = price;
    }

    public String getName() { return name; }
    public long getPrice() { return price; }
    public int getStock() { return stock; }

    public void setStock(int stock) {
        this.stock = stock;
    }
}
  • Có cả getter và setter: đọc và ghi được từ bên ngoài, như stock.
  • Chỉ có getter: bên ngoài chỉ đọc được. Chỉ code bên trong class gán được name và price, ở đây là constructor.
  • Constructor không có kiểu trả về, tên trùng với tên class.
  • this.name là field của object, name là tham số.
  • Class có constructor nhận tham số thì new Product() không còn dùng được. Muốn tạo sản phẩm thì phải truyền đủ tên và giá.

Thử ngay

Trong Product.java, thêm dòng System.out.println("Tạo sản phẩm: " + name); vào đầu constructor. Rồi thay nội dung Main.java bằng đoạn dưới và chạy java Main.java:

// Main.java
void main() {
    System.out.println("Bắt đầu");
    var pen = new Product("Bút bi", 5000);
    var book = new Product("Vở", 12000);
    System.out.println("Kết thúc");
}

Đoán trước khi chạy: dòng "Tạo sản phẩm" in ra mấy lần, và nằm ở đâu?

Xem kết quả
Bắt đầu
Tạo sản phẩm: Bút bi
Tạo sản phẩm: Vở
Kết thúc

Hai lần, mỗi lần gọi new in một lần. Constructor chạy đúng lúc object được tạo.

Lỗi hay gặp

Truy cập thẳng field private. Compiler chặn ngay.

// SAI — lỗi compile: price là private
var pen = new Product("Bút bi", 5000);
pen.price = 4000;
// ĐÚNG — truyền giá đúng ngay lúc tạo
var pen = new Product("Bút bi", 4000);

Muốn cho sửa giá thì phải viết thêm setPrice. Không có setter nghĩa là giá đã chốt từ lúc tạo.

Quên this. Tên tham số trùng tên field, thiếu this. thì Java gán tham số cho chính nó.

// SAI — gán price cho price, field price vẫn là 0
// Item.java
class Item {
    private long price;

    public Item(long price) {
        price = price;
    }
}
// ĐÚNG — vế trái là field this.price
// Item.java
class Item {
    private long price;

    public Item(long price) {
        this.price = price;
    }
}

Tóm tắt

  • Field để private, bên ngoài đọc qua getter, ghi qua setter.
  • Không viết setter thì field chỉ đọc được từ bên ngoài.
  • Constructor trùng tên class, chạy khi new, gán giá trị ban đầu.
  • Trong constructor, vế trái là field (this.price), vế phải là tham số (price).

Tự kiểm tra

0/3 câu
Câu 1

Class Customer có field private String email, có getEmail() nhưng không có setEmail. Dòng customer.setEmail("moi@shop.vn"); thì sao?

Câu 2

Class Order chỉ có constructor Order(int id). Dòng var o = new Order(); thì sao?

Câu 3

Field nào nên có setter?

Class và objectKiểu nguyên thuỷ và kiểu tham chiếu

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt