CodeGym /Blog Java /Ngẫu nhiên /Phạm vi Java

Phạm vi Java

Xuất bản trong nhóm
Chúng ta đều biết rằng các quốc gia có biên giới và luật pháp riêng của họ. Luật pháp của đất nước hoạt động trong biên giới. Ví dụ, trong nước cũng có các tổ chức, chẳng hạn như trường học hoặc viện bảo tàng, có các quy tắc địa phương riêng. Họ không vi phạm luật pháp của đất nước, nhưng chỉ hoạt động trong khuôn khổ của tổ chức được chỉ định. Điều này cũng đúng trong lập trình. Vì vậy, trong lập trình, và đặc biệt là trong ngôn ngữ Java, có một thuật ngữ "phạm vi". Nó đề cập đến các khu vực của chương trình nơi dữ liệu nhất định, chẳng hạn như các biến hoặc phương thức, hoạt động. Trong bài viết này, chúng ta sẽ tìm hiểu phạm vi của các biến trong Java là gì và cách xác định chúng.

Phạm vi Java nói chung

Tại sao cần phải tách phạm vi của biến và phương thức? Thực tế là đôi khi các chương trình rất lớn và có thể khó theo dõi biến này hay biến khác. Ngoài ra, trong các dự án lớn, nên đặt tên rõ ràng cho các biến để rõ ràng chúng dùng để làm gì. Phạm vi cụ thể cho phép bạn có các biến khác nhau có cùng tên trong các phần khác nhau của chương trình. Mã như vậy dễ bảo trì và đọc hơn. Phạm vi Java xác định nơi một biến hoặc phương thức nhất định có thể truy cập được trong một chương trình. Tóm tắt:
  • Một biến được khai báo trong một phương thức hiển thị từ đầu khai báo đến cuối phương thức (phạm vi phương thức).
  • 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ã đó.
  • Các biến là đối số của phương thức tồn tại cho đến khi kết thúc phương thức.
  • Các biến lớp/đối tượng tồn tại trong suốt thời gian tồn tại của đối tượng chứa. Khả năng hiển thị của chúng được điều chỉnh bởi các công cụ sửa đổi truy cập đặc biệt.
  • 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ác công cụ sửa đổi quyền truy cập.

Mức độ Phương pháp Phạm vi

Bất kỳ biến nào được khai báo trong một phương thức, kể cả các đối số, đều không thể truy cập được bên ngoài phương thức đó. Tất cả các biến được khai báo bên trong các phương thức đều hiển thị từ đầu khai báo đến cuối phương thức. Dưới đây là một ví dụ về phạm vi biến phương thức:

public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
Ở đây chúng ta có secondArg , một biến cục bộ hoặc đối số phương thức. Chúng ta không thể sử dụng biến này bên ngoài phương thức myMethod hoặc trước khi nó được khai báo. Nếu một biến là một đối số của hàm, thì nó sẽ hiển thị trong toàn bộ phần thân của phương thức này. Trong ví dụ trên, chúng ta có hai đối số như vậy: arg trong myMethod và args trong phương thức chính.

Phạm vi cấp lớp

Phạm vi cấp độ lớp (Biến thể hiện) — bất kỳ biến nào được khai báo trong một lớp đều có sẵn cho tất cả các phương thức của lớp đó. Tùy thuộc vào công cụ sửa đổi truy cập của nó (nghĩa là công khai hoặc riêng tư), đôi khi nó có thể được truy cập bên ngoài lớp. Vì vậy, nếu một biến là một biến lớp, thì nó được liên kết với một đối tượng cụ thể và tồn tại miễn là có một đối tượng của lớp này. Nếu không có đối tượng, thì không có bản sao của biến. Biến có thể nhìn thấy 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ỗi đối tượng có biến riêng độc lập với các đối tượng khác. Không thể truy cập vào một biến từ các phương thức tĩnh.

Ví dụ về mã


public class Student {
   
//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
Surname , name , secondNamebirthday là các biến Instance.

Phạm vi khối

Nếu một biến được xác định/khai báo trong một số khối mã, thì nó tồn tại cho đến khi kết thúc khối mã đó. Thông thường, các biến như vậy tồn tại giữa các dấu ngoặc nhọn mà chúng được định nghĩa. Rất thường phạm vi khối có thể là một biến vòng lặp. Một biến được khai báo trong điều kiện của vòng lặp for không thể truy cập được bên ngoài vòng lặp, trừ khi bạn đã xác định trước nó.

public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }
      
       int sum = 1;
       System.out.println(sum);
   }
}
Cả hai biến sum và i đầu tiên đều được khai báo bên trong vòng lặp và không tồn tại bên ngoài vòng lặp này. Tuy nhiên, tổng thứ hai đã được khai báo bên ngoài vòng lặp nên biến cụ thể này sẽ được in ra.

biến tĩnh

Nếu một biến được khai báo là tĩnh (được đánh dấu bằng từ khóa tĩnh), thì nó tồn tại miễn là lớp của nó tồn tại. Thông thường, JVM tải một lớp vào bộ nhớ trong lần sử dụng đầu tiên, khi các biến tĩnh được khởi tạo.

import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

 
   public static void main(String[] args) {
       System.out.println(today);
   }

}
Bạn không nên tạo một phiên bản mới của lớp Sinh viên để sử dụng biến hôm nay tĩnh . Ở đây “2022” sẽ được in.

công cụ sửa đổi truy cập

Java có 4 công cụ sửa đổi truy cập để hạn chế quyền truy cập vào phương thức hoặc biến. Bạn có thể sử dụng chúng bên trong các lớp chứ không phải bên trong các phương thức.
  • private là công cụ sửa đổi hạn chế nhất. Nó hạn chế quyền truy cập vào các phương thức và biến đối với lớp mà chúng đã được khai báo. Nếu không cần sử dụng một số phương thức hoặc biến bên ngoài lớp, hãy sử dụng private. Các biến lớp thường là riêng tư trong Java.

  • Nếu không có công cụ sửa đổi truy cập nào được chỉ định, phương thức hoặc biến sẽ chấp nhận công cụ sửa đổi mặc định . mặc định chỉ cho phép truy cập từ gói hiện tại.

  • công cụ sửa đổi được bảo vệ chỉ cho phép truy cập vào một phương thức hoặc biến từ bên trong gói hiện tại, trừ khi nó được truy cập thông qua một lớp con bên ngoài gói.

  • public là công cụ sửa đổi ít hạn chế nhất. Nó cho phép bạn truy cập một lớp, phương thức hoặc biến không chỉ từ lớp mà chúng được khai báo mà còn từ bên ngoài. Công cụ sửa đổi này được sử dụng rất thường xuyên.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION