Biến static là gì khai bao như thế nào

Static trong Java là một tính năng quan trọng và được sử dụng rộng rãi để giải quyết các vấn đề trong việc thiết kế và triển khai các ứng dụng Java hiệu quả. Để hiểu rõ hơn về tính năng này, hãy cùng Rikkei Academy tìm hiểu sâu hơn về các khái niệm cơ bản về static nhé!.

Từ khóa static trong Java là gì?

Trong Java, từ khóa static được sử dụng để chỉ ra rằng một thành phần thuộc về lớp chứa nó, chứ không phải thuộc về một đối tượng cụ thể nào của lớp đó. Điều này có nghĩa là các đối tượng của lớp chia sẻ chung một bản sao của thành phần static và không cần phải tạo đối tượng mới để truy cập nó.

Từ khóa static là một bộ điều chỉnh truy cập không trực tiếp trong Java, áp dụng cho các thành phần sau:

  • Biến [Variables]
  • Phương thức [Methods]
  • Khối [Blocks]
  • Lớp [Classes]

Biến static [static variables] trong Java

Khi một biến [variables] được khai báo là static trong Java, chỉ có một bản sao duy nhất của trường đó được tạo ra và chia sẻ giữa tất cả các đối tượng của lớp đó. Như vậy, bất kể có khởi tạo bao nhiêu đối tượng của một lớp, sẽ luôn chỉ có một bản sao của biến static thuộc về lớp đó. Giá trị của biến static này được chia sẻ giữa tất cả các đối tượng cùng lớp.

Về mặt bộ nhớ, biến static được lưu trữ trong vùng nhớ heap.

Ví dụ

public class Vehicle {

private static int totalVehicles = 0; // Biến static để đếm tổng số phương tiện

private String type;

public Vehicle[String type] {

this.type = type;

totalVehicles++; // Tăng tổng số phương tiện khi tạo đối tượng mới

}

public static int getTotalVehicles[] {

return totalVehicles;

}

}

public class Main {

public static void main[String[] args] {

Vehicle car = new Vehicle[“Car”];

Vehicle motorbike = new Vehicle[“Motorbike”];

System.out.println[“Tổng số phương tiện: ” + Vehicle.getTotalVehicles[]]; // Kết quả: 2

}

}

Lớp Vehicle với một biến static totalVehicles dùng để đếm tổng số phương tiện được tạo. Khi mỗi đối tượng Vehicle mới được tạo, biến totalVehicles được tăng lên 1. Chúng ta có thể truy cập vào biến static này thông qua phương thức static getTotalVehicles[] mà không cần tạo đối tượng của lớp Vehicle.

Lý do sử dụng biến static

  • Chia sẻ dữ liệu giữa các đối tượng: Biến static trong Java được chia sẻ giữa tất cả các đối tượng của một lớp, thay vì mỗi đối tượng có một bản sao riêng biệt của biến. Điều này hữu ích khi muốn các đối tượng cùng truy cập và cập nhật một giá trị chung.
  • Định nghĩa các hằng số: Biến static kết hợp với từ khóa final thường được sử dụng để định nghĩa các hằng số, những giá trị không thay đổi trong suốt quá trình thực thi chương trình.
  • Tiết kiệm bộ nhớ: Khi sử dụng biến static, chỉ có một bản sao của biến đó được tạo ra trong bộ nhớ, không phụ thuộc vào số lượng đối tượng của lớp. Điều này giúp tiết kiệm bộ nhớ, đặc biệt khi có nhiều đối tượng cần chia sẻ cùng một giá trị.
  • Theo dõi số lượng đối tượng được tạo ra: Bằng cách tăng giá trị của biến static mỗi khi một đối tượng mới được tạo, bạn có thể dễ dàng theo dõi số lượng đối tượng hiện có.

Điểm quan trọng cần nhớ

  • Vì biến static thuộc về lớp nên có thể truy cập chúng trực tiếp thông qua tên lớp mà không cần tham chiếu đối tượng.
  • Chỉ có thể khai báo biến static ở cấp độ lớp.
  • Có thể truy cập biến static mà không cần khởi tạo đối tượng.
  • Có thể truy cập biến static thông qua tham chiếu đối tượng. Tuy nhiên, đây không phải cách được khuyến khích vì điều này gây khó khăn trong việc phân biệt giữa biến thực thể [instance variable] và biến lớp [class variable].

Phương thức static [static methods] trong Java

Phương thức static trong Java là phương thức tĩnh của lớp, không thuộc về một đối tượng cụ thể. Chúng có thể được gọi mà không cần tạo ra đối tượng của lớp chứa chúng. Phương thức static giúp thực hiện các thao tác không phụ thuộc vào việc tạo ra các thực thể.

Ví dụ

public class MathHelper {

public static int add[int a, int b] {

return a + b;

}

public static int multiply[int a, int b] {

return a * b;

}

}

public class Main {

public static void main[String[] args] {

int sum = MathHelper.add[3, 5]; // Sử dụng phương thức static add[]

int product = MathHelper.multiply[3, 5]; // Sử dụng phương thức static multiply[]

System.out.println[“Tổng của 3 và 5 là: ” + sum]; // Kết quả: 8

System.out.println[“Tích của 3 và 5 là: ” + product]; // Kết quả: 15

}

}

Lớp MathHelper có hai phương thức static: add[] và multiply[]. Phương thức add[] cộng hai số nguyên và trả về tổng của chúng, trong khi phương thức multiply[] nhân hai số nguyên và trả về tích của chúng. lớp MathHelper có hai phương thức static: add[] và multiply[]. Phương thức add[] cộng hai số nguyên và trả về tổng của chúng, trong khi phương thức multiply[] nhân hai số nguyên và trả về tích của chúng.

Chúng ta không cần tạo đối tượng của lớp MathHelper để sử dụng các phương thức static này. Thay vào đó, chúng ta có thể gọi chúng trực tiếp thông qua tên lớp, như trong hàm main[] của lớp Main.

Lý do sử dụng

Phương thức static trong Java thường được sử dụng để:

  • Thực hiện các hành động không liên quan đến đối tượng: Vì phương thức static không yêu cầu một thực thể của lớp để gọi nó, chúng thường được sử dụng cho các hành động không liên quan trực tiếp đến trạng thái của đối tượng, nhưng vẫn liên quan đến lớp.
  • Tạo các tiện ích [utility] và hàm trợ giúp [helper] chung: Phương thức static rất phù hợp để tạo các tiện ích và hàm trợ giúp chung. Vì chúng không đòi hỏi phải tạo ra một đối tượng của lớp. Ví dụ, các phương thức toán học trong lớp Math của Java là các phương thức static.
  • Được sử dụng để tạo các “factory method”: Đây là các phương thức chịu trách nhiệm tạo ra các đối tượng mới dựa trên các tham số đầu vào. Điều này giúp tạo ra các đối tượng mà không cần sử dụng từ khóa new, giúp kiểm soát quá trình khởi tạo và cung cấp linh hoạt hơn trong việc tạo đối tượng.
  • Xây dựng phương thức main: Trong Java, phương thức main phải được đánh dấu là static để có thể chạy chương trình từ môi trường dòng lệnh. Phương thức main là điểm bắt đầu của chương trình, do đó nó được đánh dấu là static để JVM có thể gọi nó mà không cần tạo ra một thực thể của lớp chứa nó.

Lưu ý về phương thức static trong Java

  • Phương thức static trong Java được giải quyết tại thời điểm biên dịch. Vì việc ghi đè phương thức là một phần của Đa hình thời gian chạy, phương thức static không thể bị ghi đè.
  • Phương thức trừu tượng không thể là static.
  • Phương thức static không thể sử dụng các từ khóa this hoặc super.
  • Các kết hợp sau của phương thức và biến thực thể, phương thức và biến lớp là hợp lệ:
    • Phương thức thể hiện [instance methods] có thể truy cập trực tiếp vào cả phương thức và biến thực thể
    • Phương thức thể hiện [instance methods] cũng có thể truy cập trực tiếp vào biến và phương thức static
    • Phương thức static có thể truy cập vào tất cả các biến static và các phương thức static khác
    • Phương thức static không thể truy cập trực tiếp vào biến và phương thức thực thể. Chúng cần một tham chiếu đối tượng để thực hiện điều này.

Gọi phương thức non-static trong phương thức static

Trong Java, bạn không thể trực tiếp gọi một phương thức không static [non-static] từ một phương thức static. Điều này là do phương thức static không phụ thuộc vào bất kỳ đối tượng nào của lớp, trong khi phương thức không static yêu cầu một đối tượng của lớp để gọi nó.

Để gọi một phương thức không static [non-static] trong một phương thức static, chúng ta phải sử dụng một thực thể [đối tượng] của lớp chứa phương thức non-static. Đây là trường hợp phổ biến khi gọi một phương thức không static từ phương thức main[] static

Ví dụ:

public class Greeting {

private String message;

public Greeting[String message] {

this.message = message;

}

public void displayMessage[] {

System.out.println[“Message: ” + message];

}

}

public class Main {

public static void main[String[] args] {

Greeting greeting = new Greeting[“Hello, World!”]; // Tạo đối tượng của lớp Greeting

greeting.displayMessage[]; // Gọi phương thức non-static displayMessage[] thông qua đối tượng

}

Lớp Greeting có một phương thức non-static là displayMessage[]. Để gọi phương thức này trong hàm static main[] của lớp Main, chúng ta tạo một đối tượng của lớp Greeting và sau đó gọi phương thức displayMessage[] thông qua đối tượng này.

Khối static trong Java

Chúng ta sử dụng khối static để khởi tạo các biến static. Mặc dù, có thể khởi tạo các biến static trực tiếp trong quá trình khai báo, nhưng có những trường hợp cần thực hiện nhiều dòng. Trong những trường hợp như vậy, sử dụng khối static là hiệu quả.

Ngoài ra, nếu các biến static cần thêm logic đa câu lệnh trong quá trình khởi tạo, chúng ta có thể sử dụng khối static.

Ví dụ

public class Database {

private static String connectionString;

// Khối static

static {

connectionString = “jdbc:mysql://localhost:3306/sample_db”;

System.out.println[“Khối static được thực thi”];

}

public static String getConnectionString[] {

return connectionString;

}

}

public class Main {

public static void main[String[] args] {

// Khi lớp Database được nạp, khối static sẽ được thực thi

String connectionString = Database.getConnectionString[];

System.out.println[“Chuỗi kết nối: ” + connectionString];

}

}

Lớp Database với một biến static connectionString. Chúng ta sử dụng một khối static để khởi tạo giá trị cho biến này và in ra thông báo “Khối static được thực thi”. Khi lớp Database được nạp vào bộ nhớ [khi gọi phương thức getConnectionString[] trong hàm main[] của lớp Main], khối static sẽ được thực thi.

Lý do sử dụng

Dưới đây là một số lý do để sử dụng khối static:

  • Khởi tạo các thành viên tĩnh của lớp, ví dụ như các biến tĩnh hoặc các cấu trúc dữ liệu tĩnh. Điều này đặc biệt hữu ích khi việc khởi tạo yêu cầu thực hiện các hành động phức tạp hơn việc chỉ gán một giá trị.
  • Đảm bảo chỉ được thực thi một lần khi lớp được tải vào bộ nhớ. Điều này đảm bảo rằng các thành viên tĩnh chỉ được khởi tạo một lần, giúp tiết kiệm tài nguyên và tránh các vấn đề liên quan đến việc khởi tạo nhiều lần.
  • Khối static được thực thi trước phương thức main của lớp. Điều này đảm bảo rằng tất cả các thành viên tĩnh đã được khởi tạo đúng cách trước khi chương trình bắt đầu thực thi.

Lưu ý về khối static

  • Một lớp có thể có nhiều khối static.
  • Các biến static và khối static được giải quyết và chạy theo cùng một thứ tự như chúng xuất hiện trong lớp. Tuy nhiên,khi một lớp A phụ thuộc vào một lớp B, hãy cẩn thận với việc sử dụng các khối static
  • Không thể trả về giá trị từ một khối static trực tiếp

Lớp con static trong Java

Lớp con static, còn được gọi là lớp con dạng nested static, là một lớp con được định nghĩa bên trong một lớp cha và được đánh dấu với từ khóa static. Nó có thể truy cập các thành viên static của lớp cha mà không cần tạo ra một đối tượng của lớp cha. Lớp con static không có một tham chiếu đến một đối tượng của lớp cha tồn tại bên ngoài nó, điều này làm cho nó không thể truy cập các thành viên không-static của lớp cha.

Ví dụ

public class OuterClass {

private static String staticMessage = “Hello from static member of OuterClass!”;

// Lớp con static

public static class StaticNestedClass {

public void displayMessage[] {

System.out.println[staticMessage]; // Truy cập biến static của lớp bên ngoài

}

}

}

public class Main {

public static void main[String[] args] {

// Tạo đối tượng của lớp con static

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass[];

// Gọi phương thức displayMessage[] của lớp con static

nestedObject.displayMessage[]; // Kết quả: Hello from static member of OuterClass!

}

}

Lớp OuterClass với một biến static staticMessage và một lớp con static StaticNestedClass. Lớp con static này có một phương thức displayMessage[] được sử dụng để in ra giá trị của biến staticMessage của lớp OuterClass.

Lý do sử dụng

Một số lý do để sử dụng các lớp con static trong mã:

  • Tăng tính đóng gói: Khi một lớp chỉ được sử dụng ở một nơi duy nhất, việc nhóm chúng lại với lớp sử dụng chúng giúp tăng tính đóng gói. Điều này hạn chế truy cập của các lớp khác trong mã và giúp bảo vệ tính toàn vẹn của mã.
  • Tăng khả năng đọc và bảo trì mã: Khi một lớp nằm gần với nơi sử dụng nó, mã dễ đọc và bảo trì hơn. Điều này giúp lập trình viên nhanh chóng hiểu được chức năng và mối quan hệ giữa các lớp.
  • Tối ưu hóa bộ nhớ: Khi một lớp nội tại được khai báo là tĩnh, nó không liên kết với lớp bên ngoài, giúp giảm bớt sử dụng bộ nhớ heap và stack. Điều này giúp tối ưu hóa hiệu năng của chương trình.

Lưu ý về lớp static

Cơ bản, một lớp con tĩnh không có quyền truy cập vào bất kỳ thành viên thực thể nào của lớp bên ngoài bao quanh. Nó chỉ có thể truy cập chúng thông qua một tham chiếu đối tượng.

  • Các lớp con static có thể truy cập vào tất cả các thành viên static của lớp bao, bao gồm cả các thành viên riêng tư. Tuy nhiên, nếu muốn truy cập các thành viên thực thể, lớp con static cần thông qua một tham chiếu đối tượng của lớp bên ngoài.
  • Quy định lập trình Java không cho phép chúng ta khai báo lớp cấp cao nhất là static. Chỉ các lớp trong các lớp [lớp lồng] mới có thể được đặt là static.

Phương thức main và từ khóa static trong Java

Ở các phần trước, trong các ví dụ chúng ta thấy sự xuất hiện của phương thức main. Ở phần này chúng ta sẽ nói rõ hơn mới quan hệ giữa phương thức main và static trong Java.

Để hiểu rõ hơn, hãy xem xét chữ ký của phương thức main:

public static void main[String[] args]

Phương thức main là nơi mọi chương trình Java bắt đầu. Khi chạy một chương trình Java, JVM – Java Virtual Machine sẽ tìm kiếm phương thức main và bắt đầu thực thi từ đó.

Từ khóa static giúp cho phương thức main có thể được gọi mà không cần tạo ra một đối tượng của lớp mà nó thuộc về. Điều này rất quan trọng vì khi chương trình bắt đầu chạy, không có đối tượng nào được tạo ra ngay lập tức. static cho phép máy tính gọi phương thức main ngay khi chương trình được khởi động.

Ví dụ, hãy tưởng tượng một chương trình Java đơn giản như sau:

public class Greeting {

public static void main[String[] args] {

System.out.println[“Hello, world!”];

}

}

JVM sẽ tìm đến phương thức main và thực thi lệnh và in ra màn hình dòng chữ “Hello, world!”. Ở đây, từ khóa static cho phép máy tính gọi phương thức main ngay khi chương trình được khởi động, mà không cần tạo ra một đối tượng của lớp Greeting.

Như vậy, mối quan hệ giữa phương thức main và static trong Java là phương thức main phải được định nghĩa là static để chương trình có thể bắt đầu thực thi mà không cần tạo đối tượng của lớp chứa nó.

Ứng dụng thực tế của Static trong Java

Một số ví dụ về việc sử dụng static trong các ứng dụng Java để giải quyết các vấn đề thực tế:

  • Đếm số lượng đối tượng được tạo ra từ một lớp: Biến static được sử dụng để lưu trữ số lượng đối tượng được tạo ra từ lớp đó và tăng giá trị của biến mỗi khi một đối tượng mới được tạo ra. Từ đó, đếm số lượng đối tượng được tạo ra giúp mã dễ dàng quản lý hơn.
  • Truy vấn cơ sở dữ liệu: Phương thức static được sử dụng để truy vấn cơ sở dữ liệu và trả về kết quả cho người dùng. Điều này giúp giảm độ phức tạp của mã và làm cho mã dễ dàng quản lý hơn.
  • Thiết lập thông tin cấu hình cho ứng dụng: Biến static được sử dụng để lưu trữ các thông tin cấu hình cho ứng dụng như đường dẫn đến tệp tin cấu hình hoặc thông tin đăng nhập cho cơ sở dữ liệu. Điều này giúp đơn giản hóa quá trình thiết lập và quản lý thông tin cấu hình cho ứng dụng.
  • Tính toán số liệu thống kê: Phương thức static được dùng để tính toán các số liệu thống kê như tổng, trung bình, độ lệch chuẩn của một mảng số. Điều này giúp giảm độ phức tạp của mã và làm cho mã dễ dàng quản lý hơn.
  • Định nghĩa các hằng số cho ứng dụng: Lớp static được sử dụng để định nghĩa các hằng số cho ứng dụng như các mã lỗi hoặc các giá trị hằng số khác. Điều này giúp dễ dàng quản lý các hằng số và giảm sự nhầm lẫn khi thay đổi giá trị của chúng.

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu về các khái niệm cơ bản về static trong Java và các ứng dụng thực tế của nó. Việc hiểu rõ về static sẽ giúp cho bạn có cách tiếp cận hiệu quả hơn khi thiết kế và triển khai các ứng dụng Java.

Nếu bạn đang muốn tìm hiểu khóa học lập trình, tham khảo ngay Rikkei Academy! Với lộ trình tinh gọn, bám sát thực tế công việc và phương pháp đào tạo tiên tiến giúp bạn nhanh chóng trở thành lập trình viên chỉ trong 6 tháng! Đăng ký để nhận tư vấn miễn phí ngay hôm nay!

Chủ Đề