"Hãy chuyển sang một chủ đề mới. Bây giờ, tôi muốn thảo luận về các biến và phương thức tĩnh."
"Ellie, tôi đã học về các phương thức và biến tĩnh. Nhưng tôi muốn tìm hiểu thêm chi tiết."
"Khi chúng tôi khai báo các biến trong một lớp, chúng tôi xác định liệu các biến này sẽ được tạo chỉ một lần hay mỗi phiên bản (đối tượng) của lớp sẽ có bản sao của chính nó. Theo mặc định, một bản sao mới của biến được tạo cho mỗi đối tượng . Cái này nó thì trông như thế nào:"
class Cat // Class
{
String name; // Variable
Cat(String name) // Constructor
{
this.name = name; // Variable initialization
}
}
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
Oscar
Missy
"Mặc dù được khai báo trong cùng một lớp (Cat), các biến cat1.name
và cat2.name
chứa các giá trị khác nhau vì chúng tham chiếu đến các đối tượng khác nhau."
"Điều đó có ý nghĩa."
"Tuy nhiên, chỉ tồn tại một bản sao của biến tĩnh cho mọi phiên bản của một lớp và nó phải được truy cập bằng tên lớp."
class Cat // Сlass
{
String name; // Instance (non-static) variable
static int catCount; // Static variable
Cat(String name)
{
this.name = name;
Cat.catCount++; // Increment the static variable by 1
}
}
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");
System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");
System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
0
1
Oscar
Missy
2
"Được, cũng có lý."
"Các phương thức Java được chia thành hai loại. Các phương thức sơ thẩm được gọi trên một đối tượng và có quyền truy cập vào dữ liệu của đối tượng đó. Các phương thức tĩnh không có quyền truy cập đó, vì đơn giản là chúng không có tham chiếu đối tượng. Tuy nhiên, chúng có thể tham chiếu đến biến tĩnh của lớp và các phương thức tĩnh khác.
Các phương thức tĩnh không thể giải quyết các phương thức không tĩnh hoặc các biến không tĩnh!"
"Tại sao lại thế, Ellie?"
"Mỗi biến thể hiện được chứa trong một đối tượng. Nó chỉ có thể được truy cập nếu bạn có một tham chiếu đến đối tượng đó. Không có tham chiếu nào như vậy có sẵn cho một phương thức tĩnh."
"Các phương thức cá thể có tham chiếu như vậy không?"
"Có, nó được truyền gián tiếp cho các phương thức thể hiện. Một tham chiếu đến đối tượng mà một phương thức thể hiện được gọi sẽ được truyền gián tiếp cho phương thức thể hiện. Biến lưu trữ tham chiếu này được gọi là this . Điều này cho phép phương thức luôn truy cập vào đối tượng data hoặc gọi một phương thức không tĩnh khác trên cùng một đối tượng.
Thay vì một tham chiếu đối tượng, null được truyền cho các phương thức tĩnh. Đó là lý do tại sao họ không thể xử lý các biến và phương thức không tĩnh. Đơn giản là chúng không có tham chiếu đến một đối tượng được liên kết với các biến và phương thức này."
"OK, Ellie, tôi hiểu điều đó."
"Đây là cách các phương thức không tĩnh hoạt động:
Mã trông như thế nào
|
Điều gì thực sự xảy ra
|
Khi bạn gọi một phương thức bằng cách sử dụng <đối tượng> dấu chấm <tên phương thức>, thì thực ra bạn đang gọi một phương thức của lớp và truyền cùng đối tượng đó làm đối số đầu tiên. Bên trong phương thức, đối tượng được gọi là 'this' . Tất cả các hoạt động trong phương thức được thực hiện trên đối tượng này và dữ liệu của nó." |
"Đây là cách các phương thức tĩnh hoạt động:
Mã trông như thế nào
|
Điều gì thực sự xảy ra
|
Khi bạn gọi một phương thức tĩnh, không có đối tượng nào được truyền cho nó. Nói cách khác, 'cái này' bằng null . Đó là lý do tại sao một phương thức tĩnh không thể truy cập các biến và phương thức không tĩnh (vì nó không có gì để chuyển hoàn toàn sang các phương thức không tĩnh)." |
"Một biến hoặc phương thức là tĩnh nếu nó có từ khóa tĩnh trước nó."
"Tại sao những phương pháp như vậy lại cần thiết nếu chúng bị hạn chế nghiêm trọng như vậy?"
"Chà, những phương pháp như vậy có lợi ích của chúng."
"Đầu tiên, chúng ta không phải truyền tham chiếu đối tượng để sử dụng các phương thức và biến tĩnh. "
"Thứ hai, đôi khi cần có một và chỉ một bản sao của một biến. Ví dụ: System.out (biến tĩnh out của lớp Hệ thống)."
"Thứ ba, đôi khi bạn cần gọi một phương thức trước khi có thể tạo đối tượng."
"Ellie, bạn có thể cho tôi một ví dụ về điều này?"
"Bạn nghĩ tại sao phương thức main() là tĩnh? Nó tĩnh để lập trình viên có thể gọi nó ngay sau khi tải một lớp vào bộ nhớ, trước khi bất kỳ đối tượng nào được tạo."
GO TO FULL VERSION