+2

Primitives-Object-References

Sau N lần được giới thiệu về cuốn effective Java, mãi ko chịu đọc tới dạo gần đây mới lôi ra đọc. Đọc xong rồi mới biết vì sao ban mình hỏi gì nó cũng biết, mà mình đụng đâu cũng là mới. Nhân dịp vừa đọc vừa tìm hiểu thì có một cái cơ bản, mà ngày xưa tới giờ vẫn có nhiều chỗ hiểu chưa đúng, hoặc là biết nó là thế nhưng không hiểu nó chạy như thế nào. Như là chuyện các loại kiểu dữ liệu, các truyền giá trị ở java,… Luyên thuyên vậy đủ rồi vào vấn đề nào. À tks Trí, thanh niên cho link sách lậu 😃)))

I. Java Variables

Trước hết chắc cũng nên nhắc lại lý thuyết tí, ae có thể bỏ qua và next tiếp phần tiếp theo nhá. Đến với việc phân loại giá trị ở trong Java. Thì nó bao gồm các loại như sau:

1. Primitive variables

Hay còn gọi là dữ liệu nguyên thuỷ, là giá trị thông tin được lưu trữ tại biến (variable) đấy. Java có 8 loại biến nguyên thuỷ:

  • Intergers
    • byte (-128 - 127)
    • short (+-32 thousand)
    • int (+-2 bilion)
    • long (+-9 quintillion)
  • Reals
    • float (~6 digit precision)
    • double (~15 digits precision)
  • char (unicode characters)
  • boolean (true/falsle)

2. Reference variables

Hay còn gọi là biến tham chiếu, có thể dễ dàng hiểu là ngoài 8 giá trị primitive ra thì còn lại đều là biến tham chiếu.

Có một điều thường hay nhầm lẫn ở đây là thông thường chúng ta hay gọi là tạo 1 object, thao tác trên object đấy. Thực chất là đúng là chúng ta tạo object, nhưng chúng ta đang thao tác với tham chiếu của nó, không phải trực tiếp object đấy. Nó tương tự như là pointer trong C/C++. Và trong java chỉ có kiểu tham chiếu (reference type), không có kiểu đối tượng (object type).

Cùng đến với cách hoạt động để hiểu rõ hơn nào.

3. Giải thích cách hoạt động.

a. Primitive

Có đoạn code mẫu như dưới

boolean truthValue = false;
int integer = 42;
double floatingPointNumber = 4.2;

System.out.println(truthValue);
System.out.println(integer);
System.out.println(floatingPointNumber);
  • false
  • 42
  • 4.2

Việc khai báo biến primitive khiến cho máy tính sẽ lưu lại vùng nhớ nơi mà lưu trữ giá trị đã khai báo. Mỗi cái như thế thì nó sẽ có một vùng nhớ riêng, và những biến được gán vào thì sẽ được sao chép giá trị đấy. Nghe khó hiểu nhưng xem tiếp ví dụ dưới nhá:

int first = 10;
int second = first;
int third = second;
System.out.println(first + " " + second + " " + third);
second = 5;
System.out.println(first + " " + second + " " + third);
  • 10 10 10
  • 10 5 10

Tên biến nó nói lên tên vùng nhớ mà lưu trữ biến đấy. Khi gán một giá trị bởi dấu bằng, giá trị bên phải sẽ copy đến vùng nhớ mà được khai báo bởi tên biến (trước dấu bằng).

Như ví dụ trên thì ta có thể thấy ở line 1, thì sẽ tạo 1 vùng nhớ gọi là first và sau đấy copy giá trị 10 vào đấy.

Tương tự ở line 2, tạo vùng nhớ second và copy vào đấy giá trị của vùng nhớ first

Cho nên khi thay đổi giá trị của second, giá trị của first vẫn được giữ nguyên.

b. Reference

Trước hết đến với việc khai báo mà ai cũng làm khi làm việc với một reference:

Name mitsu = new Name("Mitsukeru");

Khai báo trên sẽ hoạt động với trình tự sau:

  • trước hết nó sẽ khởi tạo object bởi constructor của nó.
  • Khi gọi constructor, ngoài việc khởi tạo object, nó còn đồng thời trả về một giá trị tham chiếu đến đối tượng mới được khởi tạo
  • Khai báo bằng dấu bằng thì nó giống ở trên, cũng sẽ là copy giá trị bên phải gán vào giá trị bên trái.

Có thể thấy ở bước khai gán giá trị vào cho phía bên trái thì thì qua có thể thấy khai báo biến Primitive và Reference khá là giống nhau. Vậy điểm khác biệt của nó là gì?

Đó là primitive thì nó lưu trữ giá trị được lưu, trong khi reference thì nó lưu giá trị tham chiếu đến object.

Name yuki = new Name("Yuki Snow");
System.out.println(yuki);
  • Name@4aa298b7

Trái ngược với việc dùng hàm print in ra giá trị ở primitive, thì với reference nó trả về một giá trị tham chiếu, giá trị chưa biến và mã định danh mà java đã tạo ra. Biến đã cho thuộc type Name và có mã định danh là @4aa298b7.

II. Tổng kết

Như phía trên, chúng ta cũng có ít nhiều phân biệt sơ qua 2 loại kiểu dữ liệu được định nghĩa trong java.

Chính sự khác biệt này nên khi sử dụng hàm compare, đối với các kiểu Primitive thì chúng ta chỉ cần dùng dấu bằng để compare giá trị của nó, thì đối với các Reference thì phải sử dụng hàm equals (), dùng để lấy giá trị trong vùng nhớ mà nó tham chiếu tới.

Ngoài ra có sự khác biệt quan trọng khác là việc sử dụng như parameter của method. Hẹn anh em bài tiếp theo.

Cảm ơn anh em đã đọc đến cuối bài.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.