"Giáo sư không thể thoát ra khỏi lối mòn của mình. Những ông thầy già đã quen với việc giảng bài luôn như vậy. Không có điều gì ông ấy có thể nói với bạn mà bạn không thể tìm thấy trong sách. Bạn không thể học bơi bằng cách lắng nghe đến các bài giảng về bơi lội. Các bài giảng chỉ hữu ích khi bạn quen thuộc với chủ đề này và biết nhiều như giáo sư của bạn."

"Tuy nhiên, bài học của anh ấy rất hữu ích."

"Vâng. Ý tôi là, chúng tôi hy vọng là như vậy. Bạn nghe càng nhiều quan điểm về chủ đề, bạn càng tiến gần đến sự thật. Khi bạn chỉ nghe một, tất cả những gì bạn có thể làm là tin hoặc không tin. OK, chúng ta hãy trở lại công việc kinh doanh."

"Hãy xem một bức tranh mà tôi đã cho bạn xem trước đây."

┏
┃public class Variables
┃┏
┃┃{
┃┃   private static String TEXT = "The end.";
┃┃  ┗━━━━━━━━━━━━━━━━━━━┛
┃┃   public static void main (String[] args)
┃┃ ┏                         ┗━━━━━━━┛
┃┃ ┃ {
┃┃ ┃    System.out.println("Hi");
┃┃ ┃    String s = "Hi!";
┃┃ ┃  ┏┗━━━━┛
┃┃ ┃  ┃ System.out.println(s);
┃┃ ┃  ┃ if (args != NULL)
┃┃ ┃  ┃ {
┃┃ ┃  ┃    String s2 = s;
┃┃ ┃  ┃   ┗━━━━┛
┃┃ ┃  ┃  ┏
┃┃ ┃  ┃  ┃ System.out.println(s2);
┃┃ ┃  ┃  ┗
┃┃ ┃  ┃ }
┃┃ ┃  ┃ Variables variables = new Variables();
┃┃ ┃  ┃ System.out.println(variables.instanceVariable);
┃┃ ┃  ┃ System.out.println(TEXT);
┃┃ ┃  ┗
┃┃ ┃ }
┃┃ ┗
┃┃   public String instanceVariable;
┃┃  ┗━━━━━━━━━━━━━━━┛
┃┃   public Variables()
┃┃   {
┃┃      instanceVariable = "Instance variable test.";
┃┃   }
┃┃}
┃┗
┗

1. Một biến được khai báo trong một phương thức tồn tại (hiển thị) từ khi bắt đầu khai báo cho đến khi kết thúc phương thức.

2. Một biến được khai báo trong khối mã tồn tại đến hết khối mã.

3. Các tham số của phương thức tồn tại cho đến khi phương thức trả về.

4. Các biến trong một đối tượng tồn tại trong toàn bộ vòng đời của đối tượng chứa chúng. Khả năng hiển thị của chúng cũng được điều chỉnh bởi các công cụ sửa đổi truy cập đặc biệt.

5. Các biến (lớp) tĩnh tồn tại trong suốt thời gian chương trình đang chạy. Khả năng hiển thị của chúng cũng được xác định bởi công cụ sửa đổi truy cập."

"Phải. Tôi nhớ bức ảnh này."

"Tuyệt. Để tôi nhắc bạn về một số điểm chính."

"Tất cả các biến được khai báo bên trong các phương thức đều tồn tại (hiển thị) từ thời điểm chúng được khai báo cho đến khi kết thúc phương thức (Ví dụ 1)."

"Nếu một biến được khai báo trong một khối mã, thì nó tồn tại cho đến hết khối mã (Ví dụ 2)."

"Nếu một biến là tham số của phương thức, thì nó tồn tại (hiển thị) trong toàn bộ nội dung của phương thức (Ví dụ 3)."

"Nếu một biến là biến thể hiện (Ví dụ 4), nó được liên kết với một đối tượng nhất định và tồn tại chừng nào đối tượng đó tồn tại. Nếu không có đối tượng nào tồn tại, thì không có thể hiện nào của biến. Bạn có thể truy cập vào biến (tức là biến được hiển thị) từ tất cả các phương thức của lớp, bất kể chúng được khai báo trước hay sau nó. Một biến mới được tạo cho mỗi đối tượng. Nó độc lập với các đối tượng khác. Bạn không thể truy cập một biến thể hiện từ các phương thức tĩnh . "

"Nếu một biến được khai báo là tĩnh, nghĩa là được đánh dấu bằng từ khóa tĩnh , thì nó tồn tại chừng nào lớp của nó còn tồn tại. JVM thường tải một lớp vào bộ nhớ ở lần sử dụng đầu tiên. Đó cũng là lúc các biến tĩnh được khởi tạo."

Tìm hiểu thêm về phạm vi biến - 1

"Ví dụ trên khai báo lớp Cat, lớp này có bốn biến: a, b, s (biến không tĩnh) và đếm (biến tĩnh). Nếu chúng ta tạo một số đối tượng của lớp này (giả sử ba), mỗi đối tượng chúng sẽ chứa các phiên bản riêng của các biến không tĩnh của lớp. Một biến tĩnh được chia sẻ bởi tất cả các đối tượng của một lớp. Về mặt kỹ thuật, nó thậm chí không nằm trong các đối tượng này, vì nó đã tồn tại ngay cả trước khi bất kỳ đối tượng Cat nào được tạo."

"Đây là những gì sẽ xảy ra nếu chúng ta khai báo biến tĩnh s:"

Tìm hiểu thêm về phạm vi biến - 2

"OK. Tôi nghĩ tôi hiểu rồi."

"Bạn có thể khai báo các biến có cùng tên không?"

"Không phải bên trong một phương thức. Tất cả các biến được khai báo bên trong một phương thức phải có tên duy nhất. Các đối số của phương thức cũng được coi là biến cục bộ."

"Còn các biến thành viên thì sao?"

"Các biến thành viên cũng phải là duy nhất cho mỗi lớp."

"Nhưng có một ngoại lệ: tên của biến cục bộ và biến thành viên có thể giống nhau. "

"Nếu chúng ta thay đổi một biến như vậy, một trong hai biến được đặt tên giống nhau sẽ bị thay đổi?"

"Nếu có một số biến hiển thị (có thể truy cập) trong mã của chúng tôi – giả sử, một biến đối tượng và một biến cục bộ – thì biến cục bộ sẽ được truy cập."

Ví dụ với hai biến đếm
class Main
{
    public int count = 0;     // Declare an instance variable

    public void run()
    {
        count = 15;           // Access the instance variable
        int count = 10;       // Declare a local method variable
        count++;             // Access the method variable
    }
}

"Mã này khai báo hai biến đếm. Dòng 3 khai báo một biến thể hiện và dòng 8 – một biến cục bộ ."

"Đây là những gì xảy ra khi phương thức chạy được thực thi:"

"Ở dòng 7, chúng ta truy cập biến thể hiện và gán giá trị 15 cho nó"

"Ở dòng 8, chúng tôi khai báo (tạo) một biến cục bộ mới : count. Nó che giấu biến thực thể. Biến cục bộ là thứ mà tất cả các mã tiếp theo trong phương thức sẽ nhìn thấy (truy cập)."

"Hiểu rồi."

"Biến cục bộ che dấu biến thể hiện. Nói cách khác, biến cục bộ là biến được truy cập. Tuy nhiên, bạn cũng có thể truy cập biến thể hiện. Việc này chỉ phức tạp hơn một chút."

Biến (lớp) tĩnh
ClassName.variableName

// Here are some examples:
Cat.catsCount
Biến không tĩnh (ví dụ)
this.variableName

// Here are some examples:
this.catsCount

"Bạn có thể cho tôi biết điều gì khác về các phương thức tĩnh và biến tĩnh không?"

"Các phương thức và biến tĩnh không được liên kết với các đối tượng của lớp; chúng được liên kết với chính lớp đó. Nếu chúng ta tạo mười đối tượng Biến (xem ví dụ ở đầu cấp độ này), chúng ta sẽ có mười biến instanceVariable (một biến cho mỗi đối tượng). đối tượng) và chỉ một biến (tĩnh) được chia sẻ TEXT ."

"Tôi có một câu hỏi."

"Sự khác biệt giữa các phương thức tĩnh và không tĩnh là gì?"

"Chúng ta hãy xem một phương thức không tĩnh hoạt động như thế nào:"

Mã trông như thế nào
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Điều gì thực sự xảy ra
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

"Khi bạn gọi một phương thức bằng cách sử dụng <object> dot <tên phương thức> , bạn thực sự đang gọi một phương thức lớp và truyền cùng một đố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 pháp được thực hiện trên đối tượng này và dữ liệu của nó."

"Chà! Thì ra mọi chuyện là như vậy!"

"Và đây là cách một phương thức tĩnh hoạt động."

Mã trông như thế nào
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Điều gì thực sự xảy ra
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

"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ó 'cái này' để truyền với các phương pháp này)."

"Hmmm. Tôi nghĩ là tôi hiểu rồi. Ít nhất là một chút."

"Và đây là chú Diego... và nhiệm vụ của chú ấy."