Biến cục bộ

"Xin chào, học sinh yêu quý của tôi! Đã đến lúc nghiêm túc hơn một chút về các biến. Nhưng lần này chúng ta sẽ không thảo luận về cấu trúc bên trong của chúng. Thay vào đó, chúng ta sẽ tập trung vào cách các biến tương tác với mã nơi chúng được đặt.

"Tất cả các biến được khai báo bên trong các phương thức được gọi là biến cục bộ . Một biến cục bộ chỉ tồn tại trong khối mã mà nó được khai báo. Hay nói chính xác hơn, nó tồn tại từ thời điểm nó được khai báo cho đến khi kết thúc khối lệnh của mã mà nó được khai báo."

"Rõ ràng, tôi cần một ví dụ."

"Không thành vấn đề. Đây là:

Mã số tính khả dụng của biến
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}


a
a
a
a, b
a, b
a, b
a, b, x
a, b, x
a, b
a, b
a
a

"Hãy xem lại các quy tắc để truy cập các biến cục bộ một lần nữa. Đây là một khối mã. Cái gì đánh dấu điểm bắt đầu và điểm kết thúc của nó?"

"Dấu ngoặc nhọn?"

"Đúng. Đây có thể là phần thân của phương thức, phần thân của vòng lặp hoặc chỉ là một khối mã cho câu lệnh có điều kiện. Một biến được khai báo trong một khối mã tồn tại cho đến hết khối mã đó. Hãy cho tôi biết, biến sẽ ở đâu một biến tồn tại nếu nó được khai báo trong phần thân của một vòng lặp?"

"Nó sẽ chỉ tồn tại trong phần thân của vòng lặp."

"Đúng vậy. Hơn nữa, nó sẽ được tạo và hủy ở mỗi lần lặp lại vòng lặp."

"Điều đó có nghĩa là bạn không thể khai báo hai biến cục bộ có cùng tên trong một phương thức — chương trình sẽ không biên dịch. Nhưng bạn có thể thực hiện việc này nếu các khối mã mà các biến được khai báo không trùng nhau. "

"Có một lý do tại sao bạn là người yêu thích của tôi, Amigo. Lấy một ví dụ nữa để củng cố điều này trong não của bạn.

Mã số khả năng hiển thị thay đổi
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     System.out.println(b);
   }

   if (a < 20)
   {
     int b = 20;
     System.out.println(b);
   }
}


a
a
a
a, b
a, b
a
a
a
a
a, b
a, b
a

"Chúng tôi có thể khai báo một biến cục bộ thứ hai được đặt tên bchỉ vì biến đầu tiên bkhông hiển thị trong khối mã nơi bbiến thứ hai được khai báo.

Thông số

"Như chúng ta đã nói trước đây, mỗi phương thức có thể có các biến mà chúng ta gọi là tham số. Còn khả năng hiển thị và thời gian tồn tại của chúng thì sao?"

"Hmm... Tôi bối rối rồi..."

"Mọi thứ ở đây khá đơn giản. Các tham số được tạo khi thực thi các bước vào phương thức (tức là khi mã của phương thức bắt đầu thực thi). Chúng bị loại bỏ khi phương thức kết thúc."

"Nói cách khác, chúng có thể nhìn thấy trong toàn bộ cơ thể của phương pháp và chỉ ở đó?"

"Vâng. Ví dụ:

Mã số khả năng hiển thị thay đổi
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}

args
args, a
args, a
args, a
args, a, b
args, a, b
args, a, b
args, a, b, x
args, a, b, x
args, a, b
args, a, b
args, a
args, a

"Như chúng ta đã nói trước đó, argsbiến chỉ là một biến có kiểu là một mảng các chuỗi. Và giống như tất cả các tham số, nó có sẵn ở mọi nơi trong phần thân của phương thức. Điều đó nói rằng, chúng ta thường bỏ qua nó trong các ví dụ của mình.

Các biến trong một lớp

"Hãy nhớ lại các bài học ở Cấp độ 1, nơi chúng tôi đã nói rằng một lớp có thể có các phương thức và biến. Các phương thức đôi khi được gọi là các phương thức thể hiện và các biến - các biến thể hiện hoặc các trường.

"Các biến (hoặc trường) của một lớp là gì ?

Chúng là các biến được khai báo không phải trong một phương thức, mà trong một lớp."

"Và họ ở đó để làm gì?"

"Đối với những người mới bắt đầu, chúng có thể được truy cập từ bất kỳ phương thức (không tĩnh) nào của một lớp. Nói một cách đơn giản, các biến thể hiện là các biến được chia sẻ bởi tất cả các phương thức của một lớp.

Ví dụ:

Mã số khả năng hiển thị thay đổi
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     count++;
   }

   public void remove(int data)
   {
     sum = sum - data;
     count--;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum

"Trong ví dụ này, chúng ta có hai phương thức — add()remove(). add()Phương thức này tăng các biến thể hiện sumcountremove()phương thức này giảm các biến thể hiện sumcount. Cả hai phương thức đều hoạt động trên các biến thể hiện được chia sẻ."

"Tôi hiểu tất cả! Các biến cục bộ tồn tại trong khi một phương thức đang thực thi. Các biến thể hiện của một lớp tồn tại trong một đối tượng của một lớp miễn là đối tượng đó tồn tại."

"Làm tốt lắm, Amigo. Chúng tôi đã đặt một số nền tảng và bạn sẽ tìm hiểu chi tiết về các đối tượng của một lớp ở cấp độ tiếp theo.

Biến tĩnh

"Giống như các phương thức, các biến trong một lớp có thể là tĩnh hoặc không tĩnh. Các phương thức tĩnh chỉ có thể truy cập các biến tĩnh.

"Tôi chưa hiểu rõ về các biến tĩnh."

"Ồ, tôi biết, nhưng đừng lo lắng. Bây giờ, hãy thoải mái với chúng. Hãy làm quen với chúng. Ở Cấp độ 11, chúng ta sẽ phân tích cấu trúc của các biến và phương thức tĩnh và bạn sẽ hiểu lý do của những điều này những hạn chế.

"Để tạo một biến tĩnh (biến lớp), bạn phải viết statictừ khóa trong phần khai báo của nó.

"Các biến tĩnh không bị ràng buộc với một đối tượng hoặc thể hiện của lớp mà chúng được khai báo. Thay vào đó, chúng thuộc về chính lớp đó. Đó là lý do tại sao chúng tồn tại ngay cả khi không một đối tượng nào của lớp được tạo. Bạn có thể tham khảo thêm chúng từ các lớp khác bằng cách sử dụng một cấu trúc như:

ClassName.variableName

Ví dụ:

Mã số khả năng hiển thị thay đổi
public class Solution
{
   public void add(int data)
   {
     Storage.sum = Storage.sum + data;
     Storage.count++;
   }

   public void remove(int data)
   {
     Storage.sum = Storage.sum - data;
     Storage.count--;
   }
}

public class Storage
{
   public static int count = 0;
   public static int sum = 0;
}

Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum



Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum

"Trong ví dụ trên, chúng tôi đã tạo một Storagelớp riêng biệt, di chuyển các biến countsumvào trong đó và khai báo chúng là tĩnh . Các biến tĩnh công khai có thể được truy cập từ bất kỳ phương thức nào trong chương trình (và không chỉ từ một phương thức)."

"Tôi không hiểu lắm, nhưng điều này có vẻ thuận tiện với tôi."

"Đúng vậy. Và đôi khi nó là cần thiết. Nếu không có các biến và phương thức tĩnh, chúng ta sẽ bị mắc kẹt."

"Hy vọng, tôi sẽ dần dần có thể tìm ra nó."

"Vâng, tất nhiên bạn sẽ."