Cách sử dụng từ khóa Static trong Java
Khi làm việc với lớp trong Java, thường cần tạo thể hiện (instance) của lớp trước khi truy cập thành viên. Tuy nhiên, bạn có thể gặp tình huống muốn định nghĩa thành viên lớp mà không tạo thể hiện của lớp.
Đó là nơi từ khóa static Java xuất hiện. Từ khóa static Java dùng để định nghĩa thành viên lớp bạn có thể truy cập mà không cần tạo thể hiện của lớp.
Hướng dẫn này sẽ thảo luận, với ví dụ, cơ bản từ khóa static Java và cách dùng trong chương trình Java.
Lớp Java (Java Classes)
Trong Java, lớp là bản thiết kế cho đối tượng. Ví dụ, lớp OrderCoffee có thể bao gồm tất cả hàm liên quan đặt cà phê, như đặt đơn, thay đổi đơn hiện có, thêm món mới vào đơn.
Chúng ta có thể tạo đối tượng là thể hiện của lớp đó. Ví dụ, đối tượng CoffeeOrder12 dùng bản thiết kế từ lớp CoffeeOrder lưu dữ liệu đơn cà phê riêng lẻ. Đối tượng CoffeeOrder12 truy cập tất cả hàm và phương thức khai báo trong lớp CoffeeOrder. Xem Hình 1 minh họa ý tưởng.
Giờ đã thảo luận cơ bản lớp Java, chuyển sang khám phá từ khóa static Java.
Phương thức Static trong Java (Java Static Methods)
Phương thức static, còn gọi phương thức lớp (class methods), là phương thức thuộc về lớp và không phải thể hiện. Vì phương thức static thuộc lớp, bạn chỉ có thể gọi phương thức từ chính lớp, không phải từ đối tượng của lớp.
Cú pháp gọi phương thức static:
Lớp.tênPhươngThức();
Hãy xem ví dụ để hiểu cách hoạt động.
Giả sử tạo chương trình quản lý đơn hàng quán cà phê. Muốn tạo lớp CoffeeOrder lưu tất cả hàm đặt cà phê.
Quyết định muốn in thông báo đơn mới ra console pha chế. Muốn thông báo đơn mới này static vì không phụ thuộc mã khác trong đối tượng đơn cà phê. Chúng ta dùng mã sau thực hiện nhiệm vụ:
class CoffeeOrder { int createOrder() { // Code here int orderNumber = 92; return orderNumber; } static void printOrder(int order) { System.out.println("Order #" + order + " order has been placed."); } } class Main { public static void main(String[] args) { CoffeeOrder order92 = new CoffeeOrder(); int number = order92.createOrder(); System.out.println("Order number: " + number); CoffeeOrder.printOrder(number); } } Mã trả về:
Order number: 92 Order #92 has been placed.
Hãy phân tích mã từng bước. Đầu tiên khai báo lớp CoffeeOrder. CoffeeOrder chứa hai phương thức: createOrder() và printOrder().
createOrder() là phương thức thường tạo đơn và trả về số đơn. printOrder() là phương thức static in thông báo ra console báo cho pha chế biết đơn mới đã đặt.
Trong chương trình chính, tạo đối tượng CoffeeOrder tên order92. Đối tượng này lưu dữ liệu đơn #92. Sau đó dùng createOrder() lấy số đơn, in số đơn, tiền tố "Order number: ", ra console.
Khi gọi createOrder(), dùng order92.createOrder(). Vì createOrder() không phải static, truy cập được khi thao tác đối tượng.
Cuối mã chính, dùng CoffeeOrder.printOrder() in thông báo "Order #[số đơn] order has been placed." ra console. Trong thông báo, số đơn bằng số liên kết đơn cụ thể. Vì printOrder() là static, phải dùng CoffeeOrder (lớp) truy cập nó.
Nếu thử dùng order92.printOrder() (gọi thể hiện lớp), như dùng createOrder(), mã sẽ cảnh báo.
Biến Static trong Java (Java Static Variables)
Từ khóa static trong Java cũng dùng tạo biến thể hiện static. Biến static thuộc lớp và khởi tạo một lần, khi bắt đầu thực thi chương trình.
Biến static không thuộc đối tượng. Nghĩa là để truy cập, cần tham chiếu lớp liên quan. Cú pháp khai báo biến static trong Java:
static String COFFEE_NAME = "Espresso";
Trong ví dụ, khai báo biến static tên COFFEE_NAME, gán giá trị chuỗi Espresso.
Hãy đi qua ví dụ trình diễn biến static Java dùng.
Giả sử tạo chương trình xử lý đơn tại quán cà phê. Chương trình lưu số pha chế trực, và khi tạo đơn, liên kết đơn với tên pha chế chuẩn bị đơn đó.
Chúng ta dùng mã sau tạo chương trình xử lý cà phê:
class CoffeeOrder { int baristasOnDuty = 2; static String name = "Hannah Johnson"; public static void main(String[] args) { CoffeeOrder order111 = new CoffeeOrder(); System.out.println("Baristas on duty: " + baristasOnDuty); System.out.println("Assigned barista: " + order111.name); } } Mã trả về:
Baristas on duty: 2 Assigned barista: Hannah Johnson
Trong mã, khai báo hai biến:
- baristasOnDuty. Biến tiêu chuẩn, truy cập xuyên suốt lớp.
- name. Biến static, nghĩa là cần tham chiếu đối tượng liên kết để lấy giá trị.
Trong chương trình chính, tạo thể hiện CoffeeOrder gọi order111. In thông báo "Baristas on duty: " theo sau nội dung biến baristasOnDuty. Vì biến tiêu chuẩn, không cần tham chiếu tên lớp.
Dòng tiếp theo, in "Assigned barista: " ra console, theo sau tên pha chế phân công đơn. Tuy nhiên, tên pha chế lưu là biến static.
Nghĩa là, để lấy tên pha chế, cần tham chiếu tên đối tượng biến liên kết. Trong trường hợp này, dùng order111.name lấy tên pha chế. Vì biến name static, chỉ truy cập được khi tham chiếu đối tượng order111.
Khối Static trong Java (Java Static Block)
Từ khóa static Java cũng dùng tạo khối static (static block). Nếu lớp có nhiều biến static cần khởi tạo riêng lẻ, nên dùng static block.
Khối static thực thi một lần – khi lớp đầu tiên nạp vào bộ nhớ máy tính. Cú pháp khối static trong Java:
static { // Code here } Hãy đi qua ví dụ chứng minh static block hoạt động. Giả sử yêu cầu in thông báo A new order is incoming ... ra console trước khi gán đơn cho pha chế để pha chế biết chuẩn bị. Làm được bằng tạo static class. Static class chạy lần đầu tiên chương trình thực thi.
Đây là ví dụ static class in thông báo, sau đó gán đơn cho pha chế:
class CoffeeOrder { int baristasOnDuty = 2; static String name = "Hannah Johnson"; static { System.out.println("A new order is incoming ..."); } public static void main(String[] args) { CoffeeOrder order111 = new CoffeeOrder(); System.out.println("Baristas on duty: " + baristasOnDuty); System.out.println("Assigned barista: " + order111.name); } } Mã trả về:
A new order is incoming ... Baristas on duty: 2 Assigned barista: Hannah Johnson
Trong mã, đầu tiên khởi tạo biến baristasOnDuty và name. Sau đó chương trình in "A new order is incoming ..." ra console. Thông báo lưu trong static block. Sau khi thực thi nội dung static block, chạy chương trình chính, trả về đầu ra giống chương trình chính ví dụ trước.
Kết luận
Từ khóa static Java có nhiều dùng. Bạn có thể dùng static tạo phương thức static, biến static, và khối mã static.
Hướng dẫn này đi qua, với ví dụ, cơ bản từ khóa static và cách dùng static với phương thức, biến, và khối mã. Sau đọc, bạn sẵn sàng dùng từ khóa static Java như chuyên gia.