1. Từ khóa static
Từ khóa static giúp quản lý bộ nhớ tốt hơn và nó có thể truy cập trực tiếp qua lớp mà không cần khởi tạo. Từ khóa static thuộc về lớp chứ không thuộc về instance (thể hiện) của lớp.
Chúng ta có thể áp dụng từ khóa static với các biến, các phương thức, các khối, các lớp lồng nhau(nested class).
Các trường hợp thường dùng static:
- Biến static (static variables): khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay biến static.
- Phương thức static (static methods): khi bạn khai báo một phương thức là static, thì phương thức đó gọi là phương thức static.
- Khối static (static blocks): được sử dụng để khởi tạo thành viên dữ liệu static.
Ví dụ 1: Biến static (static variables)
Sử dụng biến static giúp chương trình của bạn sử dụng bộ nhớ hiệu quả hơn (tiết kiệm bộ nhớ).
package com.company;
class Employee {
static String part = "Lập trình viên Java";
public void getPart() {
System.out.println(part);
}
}
public class Main {
public static void main(String args[]) {
Employee employee = new Employee();
employee.getPart();
}
}
Trong trường hợp này, part là thuộc tính chung của tất cả đối tượng. Nếu chúng ta tạo nó là static, thì trường này sẽ chỉ sử dụng bộ nhớ một lần để lưu biến này.
Ví dụ 2: Phương thức static (static methods)
Nếu bạn áp dụng từ khóa static với bất cứ phương thức nào, thì phương thức đó được gọi là phương thức static.
- Một phương thức static thuộc lớp chứ không phải đối tượng của lớp.
- Một phương thức static gọi mà không cần tạo một instance của một lớp.
- Phương thức static có thể truy cập biến static và có thể thay đổi giá trị của nó.
package com.company;
class Employee {
static String part = "Lập trình viên Java";
public static void changePart() {
part="Lập trình viên PHP";
}
public void getPart() {
System.out.println(part);
}
}
public class Main {
public static void main(String args[]) {
Employee employee = new Employee();
employee.changePart();
employee.getPart();
}
}
Có hai hạn chế chính đối với phương thức static. Đó là:
- Phương thức static không thể sử dụng biến non-static hoặc gọi trực tiếp phương thức non-static.
- Từ khóa this và super không thể được sử dụng trong ngữ cảnh static.
Ví dụ 3: Khối static (static blocks)
- Được sử dụng để khởi tạo thành viên dữ liệu static.
- Nó được thực thi trước phương thức main tại lúc tải lớp.
package com.company;
public class Main {
static {
System.out.println("Khối static");
}
public static void main(String args[]) {
System.out.println("Phương thức Main");
}
}
Khối static
Phương thức Main
2. Từ khóa final
Từ khóa final trong Java được sử dụng để hạn chế người dùng. Từ khóa final có thể được sử dụng trong nhiều ngữ cảnh:
- Biến final: bạn không thể thay đổi giá trị của biến final (nó sẽ là hằng số).
- Phương thức final: bạn không thể ghi đè phương thức final.
- Lớp final: bạn không thể kế thừa lớp final.
- Biến static final trống: Một biến final mà không được khởi tạo tại thời điểm khai báo được gọi là biến final trống.
Từ khóa final có thể được áp dụng với các biến, một biến final mà không có giá trị nào được gọi là biến final trống hoặc biến final không được khởi tạo. Nó chỉ có thể được khởi tạo trong Constructor. Biến final trống cũng có thể là static mà sẽ chỉ được khởi tạo trong khối static. Chúng ta sẽ tìm hiểu chi tiết về những điều này.
Ví dụ 1: Biến final
Một biến được khai báo với từ khóa final thì sẽ không thay đổi được giá trị ( hằng số)
package com.company;
public class Main {
static final int a = 5;
public static void main(String args[]) {
System.out.println(a);
}
}
Nếu cố tình thay đổi gái trị của biến final, chương trình sẽ báo lỗi
Ví dụ 2: Phương thức final
Phương thức final không được ghi đè trong Java.
Ví dụ 3: Lớp final
Không thể kế thừa lớp final trong Java.
Ví dụ 4: Biến static final trống
Một biến static final mà không được khởi tạo tại thời điểm khai báo thì đó là biến static final trống. Nó chỉ có thể được khởi tạo trong khối static.
package com.company;
public class Main {
static final int data; // Biến static final trống
static {
data = 100;
}
public static void main(String args[]) {
System.out.println(Main.data);
}
}