Menu

Biến trong Java: khai báo, gán giá trị và phạm vi

Cách biến hoạt động trong Java: khai báo kèm kiểu, gán giá trị, quy tắc đặt tên, từ khóa var, hằng số với final và quy tắc phạm vi quyết định biến tồn tại ở đâu.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Biến là gì

Biến (variable) là một chiếc hộp có tên, chứa một giá trị. Trong Java, mỗi biến có một kiểu cố định, được quyết định khi bạn khai báo, và kiểu đó không bao giờ thay đổi. Đây là điều làm Java trở thành ngôn ngữ kiểu tĩnh: trình biên dịch biết kiểu của mọi biến trước khi chương trình chạy, và sẽ từ chối biên dịch code đặt sai loại giá trị vào hộp.

Một khai báo gồm ba phần: kiểu, tên và (thường là) giá trị ban đầu.

Hãy đọc int age = 30; là "tạo một int tên age và đặt 30 vào đó". Dấu chấm phẩy kết thúc câu lệnh, đúng như trang chú thích đã cho thấy mọi câu lệnh đều như vậy.

Khai báo trước, gán sau

Bạn có thể tách khai báo khỏi lần gán đầu tiên. Kiểu chỉ xuất hiện một lần, lúc khai báo; sau đó bạn gán chỉ bằng tên và =:

Một quy tắc hay làm người mới vấp: bạn phải gán giá trị cho biến cục bộ trước khi đọc nó. Trình biên dịch theo dõi điều này và từ chối code đọc một biến cục bộ chưa được khởi tạo:

int score;
System.out.println(score);   // compile error: variable score might not have been initialized

Đây là một tính năng chứ không phải điều phiền toái: nó bắt được cả một nhóm bug trước khi chương trình kịp chạy.

Quy tắc và quy ước đặt tên

Java áp đặt vài quy tắc bắt buộc, rồi thêm các quy ước bên trên. Quy tắc: tên có thể chứa chữ cái, chữ số, _ và $, nhưng không được bắt đầu bằng chữ số, không được trùng từ khóa dành riêng (như int hay class), và phân biệt chữ hoa chữ thường (age và Age là hai biến khác nhau).

Các quy ước mà ai cũng theo:

  • Biến và phương thức dùng camelCase: firstName, totalScore.
  • Hằng số dùng UPPER_SNAKE_CASE: MAX_USERS.
  • Tên nên mô tả giá trị: count chứ không phải c; userEmail chứ không phải x.

Tên rõ ràng không phải để trang trí: đó là cách chính bạn trong tương lai đọc lại code. totalPrice = itemCount * pricePerItem tự giải thích theo cách mà t = c * p không bao giờ làm được.

An toàn kiểu: chiếc hộp giữ nguyên kiểu

Vì kiểu được khóa lại lúc khai báo, bạn không thể bỏ một giá trị sai kiểu vào biến. Điều này bắt lỗi ngay lúc biên dịch:

int age = 30;
age = "thirty";   // compile error: incompatible types - String cannot become int

Gán giữa các kiểu số tuân theo quy tắc mở rộng: kiểu nhỏ tự động chuyển sang kiểu lớn hơn, nhưng chiều ngược lại thì không. Chúng ta sẽ nói đầy đủ về điều này ở trang kiểu dữ liệu và ép kiểu; lúc này bạn chỉ cần biết trình biên dịch luôn để mắt tới.

Từ khóa var

Từ Java 10, bạn có thể viết var thay cho kiểu và để trình biên dịch suy ra kiểu từ giá trị bên phải:

var không phải kiểu động: name vẫn là một String y như khi bạn viết String name, và sau đó bạn vẫn không thể gán một int cho nó. Nó chỉ giúp bạn gõ ít hơn. Điểm cần lưu ý: var cần một giá trị khởi tạo để suy ra kiểu, nên var x; là không hợp lệ, và nó chỉ dùng được cho biến cục bộ, không bao giờ cho thuộc tính, tham số của phương thức hay kiểu trả về. Hãy dùng nó khi kiểu đã rõ ràng từ vế phải; viết rõ kiểu khi điều đó giúp code dễ hiểu hơn.

Hằng số với final

Khi một giá trị không bao giờ được thay đổi sau khi gán, hãy đánh dấu nó là final. Mọi lần thử gán lại sẽ thành lỗi biên dịch:

final thể hiện ý định ("đây là giá trị cố định") và để trình biên dịch canh giữ nó giúp bạn. Hãy dùng nó bất cứ khi nào một giá trị về bản chất là hằng số, như tỷ lệ, giới hạn, khóa cấu hình, để một lần gán lại vô tình bị phát hiện thay vì lặng lẽ đưa bug lên sản phẩm.

Phạm vi của biến

Một biến chỉ tồn tại bên trong khối lệnh, cặp { ... }, nơi nó được khai báo, và biến mất ở dấu ngoặc đóng. Đó là phạm vi (scope) của nó. Biến khai báo bên trong một vòng lặp for hay khối if không thể thấy được từ bên ngoài:

Cả i và square thuộc về vòng lặp và biến mất khi vòng lặp kết thúc; total được khai báo ở khối bên ngoài nên vẫn còn. Bài học thực tế: khai báo mỗi biến trong khối nhỏ nhất cần đến nó. Phạm vi hẹp nghĩa là ít tên tranh giành sự chú ý của bạn hơn và ít cơ hội dùng sai một giá trị ở xa nơi nó được gán.

Tiếp theo: kiểu dữ liệu

Mọi biến trong trang này đều bắt đầu bằng một kiểu: int, double, String, boolean. Trang tiếp theo phân tích chi tiết các kiểu dữ liệu của Java: tám kiểu nguyên thủy, kích thước của từng kiểu, khác biệt giữa kiểu nguyên thủy và đối tượng, và khi nào nên dùng kiểu nào.

Câu hỏi thường gặp

Khai báo biến trong Java như thế nào?

Viết kiểu, rồi đến tên, rồi gán giá trị nếu muốn: int age = 30;. Kiểu (int) cố định suốt vòng đời của biến; tên (age) là cách bạn gọi đến nó. Bạn có thể tách thành khai báo và gán sau, int age; age = 30;, nhưng phải gán giá trị trước khi đọc một biến cục bộ.

Từ khóa var trong Java là gì?

Từ Java 10, var cho phép trình biên dịch suy ra kiểu của biến cục bộ từ giá trị bạn gán: var name = "Ada"; khiến name là một String. Nó vẫn là kiểu tĩnh: kiểu được cố định lúc biên dịch, không phải kiểu động. var chỉ dùng được cho biến cục bộ có giá trị khởi tạo, không bao giờ cho thuộc tính, tham số hay một khai báo chưa khởi tạo.

Tạo hằng số trong Java như thế nào?

Thêm từ khóa final: final double PI = 3.14159;. Một khi đã gán, biến final không thể gán lại: trình biên dịch từ chối mọi lần thử. Theo quy ước, hằng số được viết bằng UPPER_SNAKE_CASE để nổi bật so với biến thông thường.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu