Biến (Variable) Trong Java
Trong lập trình Java, bạn sẽ gặp hai cụm từ "field" và "variable" và chúng dễ khiến bạn bối rối vì có vẻ giống nhau. Đơn giản thế này:
Biến (variable): Là một vị trí nhớ tạm thời để lưu trữ dữ liệu trong một phương thức (method) hoặc khối lệnh (block). Biến thường được dùng để lưu trữ kết quả tính toán, giá trị trung gian trong quá trình thực hiện của phương thức.
Ví dụ: MyClass.java
public class MyClass {
public static void main(String[] args) {
int x = 10; // Biến cục bộ (local variable) được khai báo trong phương thức main()
System.out.println(x);
// Biến x chỉ tồn tại trong khi phương thức main() được thực thi
}
}
Trường (field): Là một phần tử của lớp (class), dùng để lưu trữ dữ liệu liên quan đến đối tượng (object) được tạo từ lớp đó. Giá trị của trường thường đại diện cho trạng thái của đối tượng.
Ví dụ: MyClass.java
public class MyClass {
public int age; // Trường (field) được khai báo trong lớp MyClass
public static void main(String[] args) {
MyClass myObject = new MyClass(); // Tạo đối tượng myObject từ lớp MyClass
myObject.age = 25; // Gán giá trị 25 cho trường age của đối tượng myObject
System.out.println(myObject.age); // In ra giá trị của trường age
// Trường age tồn tại trong suốt vòng đời của đối tượng myObject
}
}
Biến trong Java là một vị trí trong bộ nhớ được sử dụng để lưu trữ dữ liệu. Mỗi biến được đặt tên để dễ dàng truy cập và sử dụng. Giá trị của biến có thể thay đổi tùy thuộc vào kiểu dữ liệu của nó. Trong Java, có ba loại biến chính: Biến cục bộ (Local Variable), Biến toàn cục (Instance Variable), Biến tĩnh (Static Variable).

Khai báo biến và truy cập biến
Để khai báo biến, bạn sử dụng cú pháp sau:
Cú pháp
<kiểu_dữ_liệu> <tên_biến> = <giá_trị_khởi_tạo>;
Giải thích các thành phần:
↳ <kiểu_dữ_liệu>: Là kiểu dữ liệu của biến, cho biết giá trị biến sẽ lưu trữ thuộc loại gì.
↳ <tên_biến>: Là tên bạn đặt cho biến để sử dụng trong chương trình.
↳ Dấu bằng: (Không bắt buộc) Là toán tử gán, dùng để gán giá trị ban đầu cho biến.
↳ <giá_trị_khởi_tạo>: (Không bắt buộc) Là giá trị mà bạn muốn gán cho biến khi khai báo.
Ví dụ
// Khai báo biến kiểu nguyên thủy
int age; // Khai báo một biến kiểu int có tên là age
double salary = 1000.50; // Khai báo và khởi tạo một biến kiểu double
// Khai báo biến kiểu dữ liệu tham chiếu
String name; // Khai báo một biến kiểu String
// Gán giá trị cho biến
age = 30; // Gán giá trị 30 cho biến age
name = "DK"; // Gán giá trị "DK" cho biến name
Truy cập biến
Để truy cập biến, bạn sử dụng tên của biến.
Ví dụ
// Sử dụng biến
System.out.println("Age: " + age); // In ra giá trị của biến age
System.out.println("Name: " + name); // In ra giá trị của biến name
Quy tắc đặt tên biến
Tên của biến phải tuân theo các quy tắc sau:
↳ Bắt đầu bằng một chữ cái hoặc dấu gạch dưới _.
↳ Có thể chứa chữ cái, chữ số và dấu gạch dưới _.
↳ Không được sử dụng các từ khóa của Java như public, class, void,...
↳ Quy tắc camelCase được khuyến khích để đặt tên biến (firstName, totalScore,...).
Ⅰ. Biến cục bộ (Local variable)
Biến cục bộ (Local variable) Là biến được khai báo trong một phương thức, hàm contructor, khối lệnh (block) hoặc vòng lặp.
↳ Các biến được khai báo trong phương thức-chúng được gọi là tham số.
↳ Không được sử dụng "access modifier" khi khai báo biến local.
↳ Các biến local được lưu trên vùng nhớ stack của bộ nhớ.
↳ Bạn cần khởi tạo giá trị mặc định cho biến local trước khi có thể sử dụng.
↳ Phạm vi(scope): Chỉ có thể truy cập trong phạm vi của nơi nó được khai báo.
↳ Thời gian tồn tại (Lifetime): Tồn tại trong phạm vi của nơi nó được khai báo và sẽ bị hủy khi phạm vi kết thúc.
Ví dụ: Example.java
public class Example {
public void SumAge() {
// Biến cục bộ age được khai báo bên trong phương thức SumAge()
int age = 30;
System.out.println("Age bên trong phương thức SumAge(): " + age);
// Biến cục bộ sum được khai báo và khởi tạo trong phương thức SumAge()
int sum = age + 10;
System.out.println("Tổng age bên trong phương thức SumAge(): " + sum);
}
public static void main(String[] args) {
// Tạo một đối tượng của lớp Example
Example example = new Example();
// Gọi phương thức SumAge()
example.SumAge();
// Biến cục bộ num được khai báo trong phương thức main()
int num = 100;
System.out.println("Số bên trong phương thức main(): " + num);
}
}
Kết quả của chương trình là:
Tổng age bên trong phương thức SumAge(): 40
Số bên trong phương thức main(): 100
Trong ví dụ này: Các biến cục bộ chỉ tồn tại và có thể sử dụng trong phương thức hoặc khối mã mà chúng được khai báo. Sau khi phương thức hoàn thành việc thực thi của nó, các biến cục bộ sẽ bị hủy và không thể truy cập từ bên ngoài phạm vi của chúng. Điều này giúp giữ cho quản lý bộ nhớ hiệu quả và tránh xung đột tên trong các phương thức và khối mã khác nhau trong chương trình Java.
Ⅱ. Biến toàn cục (Instance variable)
Biến toàn cục (Instance variable) Là biến được khai báo trong một lớp nhưng bên ngoài các phương thức, constructor và khối.
↳ Bạn được phép sử dụng "access modifier" khi khai báo biến instance, mặc định là "default".
↳ Bên trong class mà bạn khai báo biến instance, bạn có thể gọi nó trực tiếp bằng tên khi sử dụng ở khắp nới bên trong class đó.
↳ Phạm vi(scope): Có thể truy cập từ bất kỳ nơi nào trong lớp.
↳ Thời gian tồn tại (Lifetime): Tồn tại trong suốt vòng đời của đối tượng.
Ví dụ: Example.java
public class Example {
// Biến toàn cục "name" được khai báo ở mức lớp
String name;
// Phương thức khởi tạo, được gọi khi tạo mới một đối tượng của lớp
public Example(String n) {
// Gán giá trị của tham số "n" cho biến toàn cục "name"
this.name = n;
}
// Phương thức để in ra tên của đối tượng
public void printName() {
System.out.println("Name: " + name);
}
public static void main(String[] args) {
// Tạo một đối tượng của lớp Example với tên là "DDD1"
Example obj1 = new Example("DDD1");
// Gọi phương thức printName() của đối tượng obj1
obj1.printName(); // Output: Name: DDD1
// Tạo một đối tượng khác của lớp Example với tên là "DDD2"
Example obj2 = new Example("DDD2");
// Gọi phương thức printName() của đối tượng obj2
obj2.printName(); // Output: Name: DDD2
}
}
Kết quả của chương trình là:
Name: DDD2
Trong ví dụ này: mỗi đối tượng (obj1 và obj2) có một bản sao riêng của biến name, vì vậy các giá trị của biến toàn cục này có thể khác nhau giữa các đối tượng khác nhau của cùng một lớp.
Ⅲ. Biến tĩnh (Static variable)
Biến tĩnh (Static variable) là biến được khai báo trong một class với từ khóa "static", phía bên ngoài các phương thức, constructor và block.
↳ Biến static được truy cập thông qua tên của class chứa nó, với cú pháp: TenClass.tenBien.
↳ Trong class, các phương thức sử dụng biến static bằng cách gọi tên của nó khi phương thức đó cũng được khai báo với từ khóa "static".
↳ Phạm vi(scope): Có thể truy cập từ bất kỳ nơi nào trong chương trình.
↳ Thời gian tồn tại (Lifetime): Tồn tại trong suốt thời gian chương trình chạy.
Ví dụ: Example.java
public class Example {
// Biến tĩnh "count" được khai báo ở mức lớp
static int count;
// Phương thức khởi tạo, được gọi khi tạo mới một đối tượng của lớp
public Example() {
count++; // Mỗi khi tạo mới một đối tượng, tăng giá trị của biến tĩnh "count" lên 1
}
// Phương thức để in ra số lượng đối tượng đã được tạo
public static void printCount() {
System.out.println("Số lượng phiên bản được tạo: " + count);
}
public static void main(String[] args) {
// Tạo ba đối tượng của lớp Example
Example obj1 = new Example();
Example obj2 = new Example();
Example obj3 = new Example();
// Gọi phương thức static printCount() để in ra số lượng đối tượng đã được tạo
Example.printCount(); // Output: Số lượng phiên bản được tạo: 3
}
}
Kết quả của chương trình là:
Trong ví dụ này: biến tĩnh rất hữu ích khi bạn muốn theo dõi các thông tin chung, chẳng hạn như số lượng đối tượng đã được tạo, hoặc khi bạn cần chia sẻ một giá trị chung giữa tất cả các đối tượng của lớp mà không cần tạo bản sao cho mỗi đối tượng.