Xem thêm

Biến và Hằng Trong Java

Huy Erick
Chào mừng các bạn đến với bài học Java số 4, bài học về Biến và Hằng trong Java. Bài học này nằm trong chuỗi bài học lập trình ngôn ngữ Java của Yellow Code...

Chào mừng các bạn đến với bài học Java số 4, bài học về Biến và Hằng trong Java. Bài học này nằm trong chuỗi bài học lập trình ngôn ngữ Java của Yellow Code Books.

Khái Niệm Biến

Biến là các định nghĩa từ bạn, khi bạn định nghĩa ra một biến, hệ thống sẽ căn cứ vào biến này để tạo ra các vùng nhớ, để lưu giữ các giá trị trong ứng dụng giúp cho bạn.

Mỗi biến đều có một kiểu dữ liệu riêng, kiểu dữ liệu này sẽ được hệ thống biết và cấp phát một "độ lớn" cho nó. Độ lớn của biến sẽ cho biết khả năng lưu trữ giá trị của biến. Bạn sẽ được nắm rõ về độ lớn lưu trữ của mỗi loại biến ở bài học này. Ngoài ra thì mỗi biến còn phải được bạn đặt một cái tên giúp hệ thống có thể quản lý, truy xuất dữ liệu trong vùng nhớ của biến đó.

Khai Báo Biến

Như khái niệm trên đây, chắc bạn cũng đã nắm phần nào, việc khai báo một biến thực chất là việc bạn sẽ đặt tên cho biến, rồi đặt một kiểu dữ liệu cho biến, và có thể lưu trữ giá trị ban đầu vào cùng nhớ của biến nữa.

Để khai báo một biến trong Java, bạn hãy ghi nhớ cú pháp sau:

kiểu_dữ_liệu tên_biến;

hoặc

kiểu_dữ_liệu tên_biến = giá_trị;

Mình giải thích một chút về cú pháp trên.

  • kiểu_dữ_liệu sẽ quyết định đến độ lớn của biến, các loại kiểu_dữ_liệu và các cách dùng sẽ được nói rõ hơn ở phần tiếp theo của bài học.
  • tên_biến là… tên của biến :)), cách đặt tên cho biến sẽ được mình nói rõ hơn ở phần bên dưới luôn.
  • Khi khai báo biến, bạn có thể “gán” cho biến một giá_trị ban đầu, việc gán giá trị này sẽ làm cho biến có được dữ liệu ban đầu ngay khi được tạo ra. Nếu một biến được tạo ra mà không có giá trị gì được gán, nó sẽ được gán giá trị mặc định, giá trị mặc định này sẽ tùy theo kiểu_dữ_liệu của biến mà chúng ta sẽ nói đến bên dưới.
  • Cuối cùng, sau mỗi khai báo biến bạn nhớ có dấu “;” để báo cho hệ thống biết là kết thúc việc khai báo, nếu không có “;” hệ thống sẽ báo lỗi ngay.
public class MyFirstClass {   public static void main(String[] args) {     System.out.println("Hello World!");      double salary;     int count = 0;     boolean done = false;     long earthPopulation;   } }

Đặt Tên Cho Biến

Như ví dụ ở trên, các tên biến được đặt tên là salary, count, done hay earthPopulation. Việc đặt tên cho biến đơn giản đúng không nào, đặt như thế nào cũng được, miễn sao bạn đọc lên được (ngôn ngữ của con người), và bạn thấy nó dễ hiểu và đúng với công năng của biến đó là được rồi.

Tuy nhiên thì việc đặt tên cho biến cũng không hoàn toàn tự do, có một số “luật” đặt tên sau đây, nếu bạn mắc phải một trong các quy tắc đặt tên này thì hệ thống sẽ báo lỗi ngay đấy.

Quy Tắc 1

Ký tự bắt đầu của tên biến phải là chữ cái, hoặc dấu gạch dưới (_), hoặc ký tự đô la ($). Ví dụ cho việc đặt tên biến đúng như sau.

Đúng

int a; int _b; int $c;

Còn đặt tên biến như sau sẽ bị lỗi. Vì các ký tự đầu tiên của chúng hoặc là một số, hoặc là một ký tự đặc biệt không được phép. Nếu không tin bạn cứ thử gõ vào IDE xem sao nhé.

Sai

int 1x; int #y; int z!;

Quy Tắc 2

Không được có khoảng trắng giữa các ký tự của biến. Ví dụ đặt tên biến như sau là sai.

Sai

int first name;

Nếu bạn muốn tên biến trên được tách biệt rõ ràng từng chữ cho rõ nghĩa thì có thể đặt như sau.

Đúng

int firstName;

Đến đây thì cho mình nói ngoài lề xíu: trong trường hợp biến có nhiều từ như ví dụ trên, việc bạn chọn muốn đặt theo kiểu nào trong 3 cách đúng như trên đều được, chúng đều là các cách đặt tên biến phổ biến ngày nay. Thậm chí một trong số cách đó còn có những cái tên thú vị.

Chẳng hạn biến thisIsCount được gọi là cách đặt tên theo camelCase (đặt kiểu con lạc đà), có lẽ là bởi hình dáng của nó. Với cách này thì chữ đầu tiên this được viết thường, nên trông thấp nhỏ như phần đầu lạc đà. Các chữ cái ở mỗi từ tiếp theo sẽ viết hoa IsCount, từng chữ viết hoa làm chúng nhô lên cao như những cái bứu trên lưng con lạc đà vậy.

Còn biến this_is_count được gọi là cách đặt tên theo snake_case (đặt kiểu con rắn), cũng bởi đặc điểm hình dáng của biến. Với cách đặt tên này thì các chữ cái đều viết thường hết (cũng có người viết hoa mỗi chữ cái đầu như với This_Is_Count, nhưng cách đặt này làm chúng ta tốn thời gian gõ tên biến hơn) và được nối với nhau bởi dấu gạch dưới. Việc đặt tên này làm cho biến bị kéo dài ra giống như con rắn vậy. Cách đặt này giúp chúng ta rất dễ đọc từng từ vì chúng cách biệt khá rõ ràng.

Với lập trình Java thì các bạn nên chọn ra cho mình một phong cách đặt tên biến rõ ràng, đừng nhập nhằng lúc thì camelCase lúc thì snake_case. Với mình thì mình khuyên bạn nên đặt tên biến theo kiểu camelCase (bạn sẽ thấy từ đây về sau mình sẽ dùng cách đặt tên này) vì đó là “lệ” đặt tên biến chung của các ngôn ngữ Pascal, Java, C# hay Visual Basic rồi.

Lưu ý là đặt kiểu nào cho biến cũng được nhưng nhớ đừng có chữ nào cũng viết hoa hết như ThisIsCount vì nó rất dễ nhầm lẫn với đặt tên cho class mà bạn sẽ học ở các bài sau, hay THIS_IS_COUNT vì nó lại nhầm với hằng số mà bạn cũng sắp được làm quen ở bài hôm nay nhé.

Quy Tắc 3

**Không chứa ký tự đặc biệt bên trong tên biến như !@#%^&***. Ví dụ đặt tên biến như sau là sai.

Sai

int hello@world;

Quy Tắc 4

Không được đặt tên biến trùng với keyword. Keyword là các từ khóa mà ngôn ngữ Java dành riêng cho một số mục đích của hệ thống. Các keyword của Java được liệt kê trong bảng sau.

Sai

int int;

Tuy nhiên bạn có thể đặt tên biến có chứa keyword bên trong đó mà không bị bắt lỗi, như ví dụ sau.

Đúng

int myInt;

Kiểu Dữ Liệu Của Biến

Như đã nói ở trên, mỗi biến đều phải có một kiểu_dữ_liệu kèm theo nó. Kiểu dữ liệu sẽ báo cho hệ thống biết biến đó có “độ lớn” bao nhiêu, độ lớn này sẽ cho biết khả năng lưu trữ giá trị của biến.

Việc chọn một kiểu dữ liệu cho biến là phụ thuộc ở bạn. Thông thường bạn nên dựa trên công năng của biến đó, chẳng hạn như biến thuộc kiểu ký tự hay kiểu số, với kiểu số thì lại là số nguyên hay số thực. Hoặc bạn có thể dựa trên khả năng lưu trữ giá trị của biến đó, như biến là số integer hay số long, số float hay số double.

Chúng ta hãy bắt đầu làm quen với 8 kiểu dữ liệu nguyên thủy của biến thông qua sơ đồ sau.

Gọi là kiểu dữ liệu nguyên thủy vì chúng là các kiểu dữ liệu cơ bản và được cung cấp sẵn của Java. Về mặt lưu trữ thì kiểu dữ liệu nguyên thủy lưu trữ dữ liệu trong chính bản thân nó, việc sử dụng kiểu này cũng rất đơn giản, và không dính líu gì đến hướng đối tượng cả. Ngược lại với kiểu dữ liệu nguyên thủy là kiểu dữ liệu hướng đối tượng sẽ được mình nói ở các bài sau khi bạn đã nắm được kiến thức căn bản của Java.

Nhìn nhiều vậy thôi chứ các kiểu dữ liệu nguyên thủy mà chúng ta cần quan tâm chính là các ô màu xanh lá cây, bao gồm các kiểu int, short, long, byte, float, double, char, và boolean. Các ô màu khác chỉ là gom nhóm các kiểu dữ liệu lại để chúng ta dễ nhớ và dễ sử dụng hơn thôi.

Chúng ta cùng nhau đi vào từng loại kiểu dữ liệu để biết rõ hơn.

Kiểu Số Nguyên

Kiểu này dùng để lưu trữ và tính toán các số nguyên, bao gồm các số nguyên có giá trị âm, các số nguyên có giá trị dương và số 0. Sở dĩ có nhiều kiểu số nguyên như trên, là vì tùy vào độ lớn của biến mà bạn sẽ khai báo kiểu dữ liệu tương ứng, chúng ta cùng xem qua bảng giá trị của các kiểu dữ liệu số nguyên như sau.

Kiểu Dữ Liệu Bộ Nhớ Lưu trữ Độ Lớn Của Biến
byte 1 byte -128 đến 127
short 2 bytes -32,768 đến 32,767
int 4 bytes -2,147,483,648 đến 2,147,483,647
long 8 bytes -9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807

Theo như bảng trên thì bạn thấy việc chọn lựa độ lớn cho kiểu là rất quan trọng, như với kiểu là byte, hệ thống sẽ chỉ cấp phát cho chúng ta vùng nhớ lưu trữ đúng 1 byte dữ liệu, với vùng nhớ này bạn chỉ được phép sử dụng độ lớn của biến từ -128 đến 127 mà thôi.

Ví dụ bạn khai báo biến như sau là hợp lệ.

Đúng

byte myByte = 10;

Còn khai báo như sau sẽ vượt ra ngoài khả năng lưu trữ của biến và vì vậy bạn sẽ bị báo lỗi ngay.

Sai

byte myByte = 200;

Do đó khi sử dụng kiểu dữ liệu cho biến bạn phải cân nhắc đến độ lớn lưu trữ của chúng. Bạn không nên lúc nào cũng sử dụng kiểu dữ liệu long cho tất cả các trường hợp vì như vậy sẽ làm tiêu hao bộ nhớ của hệ thống khi chương trình được khởi chạy. Bạn nên biết giới hạn của biến để đưa ra kiểu dữ liệu phù hợp. Ví dụ nếu dùng biến để lưu trữ các tháng trong năm, thì kiểu byte là đủ. Hoặc dùng biến để lưu tiền lương của nhân viên theo VND, thì dùng kiểu int, hoặc thậm chí là kiểu long luôn vì biết đâu có người thu nhập đến hơn 2 tỷ VND mỗi tháng (eo ôi!).

Nếu không khai báo giá trị cho biến, thì biến kiểu số nguyên sẽ có giá trị mặc định0 (hoặc 0L đối với kiểu long).

Lưu ý nhỏ đối với giá trị mặc định của các kiểu dữ liệu.

Như trên mình có nói là, nếu không khai báo giá trị cho biến, thì biến kiểu số nguyên sẽ có giá trị mặc định0 (hoặc 0L đối với kiểu long). Ở các mục bên dưới, với từng loại kiểu dữ liệu khác nhau, mình cũng có nói từng loại giá trị mặc định tương ứng. Tuy nhiên nếu bạn nào đã từng biết chút Java và có thử nghiệm các kiểu giá trị mặc định như đoạn code sau.

public class MyFirstClass {   public static void main(String[] args) {     int vacationDay;     System.out.println(vacationDay);   } }

Bạn cứ nghĩ là nó sẽ in ra console giá trị 0 đúng không? Sai rồi, IDE sẽ báo lỗi như sau.

Theo như lỗi trên thì IDE bắt chúng ta phải khai báo giá trị cho biến trước khi dùng vào việc gì đó. Nếu bạn thử chọn gợi ý Initialize variable 'vacationDay' thì sẽ thấy biến vacationDay được tự sửa bằng cách gán giá trị ban đầu là 0.

Điều này có nghĩa là vacationDay không có giá trị mặc định ban đầu như mình có nói. Vậy bạn có thể nhớ nhanh ở mục này là, giá trị mặc định của một biến chỉ dùng cho trường hợp khi biến này đóng vai trò là thuộc tính của lớp mà bạn sẽ tìm hiểu sau. Còn với vai trò là biến cục bộ bên trong một phương thức như ví dụ trên, bạn vẫn phải khai báo tường minh một giá trị mặc định ban đầu cho biến.

Kiểu Số Thực

Kiểu này dùng để lưu trữ và tính toán các số thực, chính là các số có dấu chấm động. Cũng giống như kiểu số nguyên, kiểu số thực cũng được chia ra thành nhiều loại với nhiều độ lớn khác nhau tùy theo từng mục đích, như bảng sau.

Kiểu Dữ Liệu Bộ Nhớ Lưu trữ Độ Lớn Của Biến
float 4 bytes khoảng 7 chữ số thập phân
double 8 bytes khoảng 15 chữ số thập phân

Với sự thoải mái trong cấp phát bộ nhớ của kiểu số thực thì bạn không quá lo lắng đến việc phân biệt khi nào nên dùng kiểu float hay double. Ví dụ sau đây cho thấy trường hợp dùng kiểu số thực.

Đúng

float rating = 3.5f; double radius = 34.162;

Sở dĩ với kiểu float ở trên phải để chữ f vào cuối khai báo float rating = 3.5f; là vì thỉnh thoảng chúng ta phải nhấn mạnh cho hệ thống biết rằng chúng ta đang xài kiểu float chứ không phải kiểu double, nếu bạn không để thêm f vào cuối giá trị thì hệ thống sẽ báo lỗi. Tương tự bạn cũng có thể khai báo double radius = 34.162; nhưng vì hệ thống đã hiểu đây là số double rồi nên bạn không có chữ d trong trường hợp này cũng không sao.

Nếu không khai báo giá trị cho biến, thì biến kiểu số thực sẽ có giá trị mặc định là 0.0f đối với kiểu float0.0d đối với kiểu double.

Kiểu char

Kiểu char dùng để khai báo và chứa đựng một ký tự. Bạn có thể gán một ký tự cho kiểu này trong một cặp dấu nháy đơn như ‘a’ hay ‘B’ như ví dụ sau.

Đúng

char grade = 'A';

Bạn phải luôn nhớ là ký tự ‘a’ được khai báo ở trên phải nằm trong cặp nháy đơn chứ không phải nháy kép nhé. Nháy kép là dành cho chuỗi sẽ được nói đến ở bài học sau. Và nhớ là nếu không có nháy cũng sai. Ví dụ sau khai báo sai kiểu char.

Sai

char wrong = "a";

Ngoài việc khai báo như trên, kiểu char còn được dùng theo mã Unicode. Mã Unicode bắt đầu bằng ‘u0000’ và kết thúc bằng ‘uffff’. Lưu ý là với cách dùng kiểu mã Unicode này, bạn vẫn phải dùng nháy đơn cho việc khai báo. Ký hiệu u cho biết bạn đang dùng với mã Unicode chứ không phải ký tự bình thường. Với cách khai báo theo kiểu mã Unicode này, bạn có thể đưa vào chương trình một số ký tự đặc biệt.

char testUnicode1 = 'u2122'; char testUnicode2 = 'u03C0'; System.out.println("See this character " + testUnicode1 + " and this character " + testUnicode2);

Kết quả in ra console như sau.

Nếu không khai báo giá trị cho biến, thì biến kiểu char sẽ có giá trị mặc định là ‘u0000’.

Kiểu boolean

Khác với C/C++, kiểu boolean trong ngôn ngữ Java chỉ được biểu diễn bởi hai giá trị là truefalse mà thôi. Do vậy mà kiểu dữ liệu này chỉ được dùng trong việc kiểm tra các điều kiện logic, chứ không dùng trong tính toán, và bạn cũng không thể gán một kiểu số nguyên về kiểu boolean như trong C/C++ được.

Khai báo một kiểu boolean đúng như sau.

Đúng

boolean isDone = true;

Việc khai báo một biến boolean như sau là sai.

Sai

boolean isTrue = 1;

Nếu không khai báo giá trị cho biến, thì biến kiểu boolean sẽ có giá trị mặc định là false.

Cảm ơn bạn đã đọc các bài viết của Yellow Code Books.

1