Từ khóa static và final trong java

0
62
Rate this post

Bạn đã nghe nhiều về từ khóa static và final trong ngôn ngữ lập trình Java, nhưng bạn có thực sự hiểu rõ ý nghĩa và cách sử dụng của chúng không? Trong bài viết này, chúng ta sẽ cùng tìm hiểu về từ khóa static và final trong Java để có cái nhìn tổng quan về những khái niệm quan trọng này.

Từ khóa static trong Java: Quản lý bộ nhớ tốt hơn

Trong Java, từ khóa static được sử dụng để quản lý bộ nhớ tốt hơn và nó có thể được truy cập trực tiếp thông qua lớp mà không cần khởi tạo. Từ khóa static thuộc về lớp chứ không thuộc về các thể hiện của lớp.

Chúng ta có thể áp dụng từ khóa static với các biến, các phương thức, các khối, và các lớp lồng nhau (nested class).

Biến static (static variables) trong Java

Trong Java, biến có thể được khai báo cùng với từ khóa static, và khi đó nó được gọi là biến tĩnh, hay biến static. Việc cấp phát bộ nhớ cho biến static chỉ xảy ra một lần khi lớp được nạp vào bộ nhớ.

Một biến static có thể được sử dụng làm thuộc tính chung để dùng chung dữ liệu cho tất cả các thể hiện của lớp đó, giúp chương trình tiết kiệm bộ nhớ hơn.

Nếu một biến vừa khai báo từ khóa final vừa khai báo từ khóa static, thì nó được xem như là một hằng số.

Ví dụ:

public class MyWebsite {
    public static String WEBSITE = "gpcoder.com";
}

Phương thức static (static methods) trong Java

Nếu một phương thức được khai báo với từ khóa static, thì phương thức đó được gọi là phương thức static.

Một số đặc điểm của phương thức static:

  • Một phương thức static thuộc về lớp chứ không phải đối tượng của lớp.
  • Một phương thức static có thể được gọi mà không cần tạo khởi tạo (instance) của một lớp.
  • Phương thức static có thể truy cập biến static và có thể thay đổi giá trị của nó.
  • Một phương thức static chỉ có thể gọi một phương thức static khác, không thể gọi được một phương thức non-static.
  • Một phương thức static không thể được sử dụng từ khóa this và super.
  • Người dùng không thể override (đè) phương thức static trong Java.

Khi nào sử dụng từ khóa static cho một phương thức?

  • Khi phương thức không phụ thuộc vào trạng thái của đối tượng, nghĩa là không cần sử dụng bất kỳ dữ liệu thành viên nào của đối tượng, mọi thứ được truyền như các tham số.
  • Các phương thức tiện ích là một trường hợp thường được sử dụng nhất trong Java vì chúng có thể được truy cập trực tiếp bằng tên lớp mà không cần tạo thể hiện nào.
  • Sử dụng trong các Design Pattern cần truy cập global như Singleton pattern, Factory pattern, …

Ví dụ:

public class MyWebsite {
    public static String WEBSITE = "gpcoder.com";
}

public class UsingStaticExample {
    private String subject;

    UsingStaticExample (String subject) {
        this.subject = subject;
    }

    public void print() {
        System.out.println("Subject = " + subject);
        System.out.println("Website = " + MyWebsite.WEBSITE);
    }
}

Khối static (static blocks) trong Java

  • Khối static được dùng để khởi tạo hoặc thay đổi giá trị của các biến static.
  • Nó được thực thi trước phương thức main tại thời gian tải lớp.
  • Một class có thể có nhiều static blocks.

Ví dụ:

public class UsingStaticExample {
    private static String subject;

    static {
        System.out.println("Khối static được gọi");
        subject = "Khối static (static blocks)";
    }

    UsingStaticExample () {
        System.out.println("hàm main() được gọi");
        System.out.println("Subject = " + subject);
    }

    public static void main(String[] args) {
        UsingStaticExample ex1 = new UsingStaticExample();
    }
}

Lớp static (static class) trong Java

Một class được có thể được đặt là static chỉ khi nó là một nested class (tức nằm trong một lớp khác). Một nested static class có thể được truy cập mà không cần một object của outer class (lớp bên ngoài).

Ví dụ:

public class UsingStaticExample {
    private String subject;

    UsingStaticExample (String subject) {
        this.subject = subject;
    }

    static class MyWebsite {
        public static String WEBSITE = "gpcoder.com";
    }

    public void print() {
        System.out.println("Subject = " + subject);
        System.out.println("Website = " + MyWebsite.WEBSITE);
    }

    public static void main(String[] args) {
        UsingStaticExample ex1 = new UsingStaticExample("Core Java");
        ex1.print();
    }
}

Import static trong Java

Java cho phép import các thành viên tĩnh (static member) của một class hoặc package vào một class khác bằng cách sử dụng từ khóa import và sau đó sử dụng chúng như là thành viên của lớp đó.

Ví dụ:

public final class SystemConfig {
    public static final String USER_NAME = "gpcoder";
    public static final String PASSWORD = "123";
    public static final String EMAIL = "gpcodervn@gmail.com";

    private SystemConfig() {
    }
}

import static com.gpcoder.SystemConfig.*;

public class StaticImportDemo {
    public static void main(String[] args) {
        System.out.println("Username: " + USER_NAME);
        System.out.println("Password: " + PASSWORD);
        System.out.println("Email: " + EMAIL);
    }
}

Từ khóa final trong Java: Hạn chế thao tác của người dùng

Từ khóa final trong Java được sử dụng để hạn chế thao tác của người dùng. Có nhiều trường hợp sử dụng từ khóa final:

  • Biến final: khi một biến được khai báo với từ khoá final, nó chỉ chứa một giá trị duy nhất trong toàn bộ chương trình, hay dễ hiểu hơn gọi là biến hằng.
  • Phương thức final: khi một phương thức được khai báo với từ khoá final, các class con kế thừa sẽ không thể ghi đè (override) phương thức này.
  • Lớp final: khi từ khoá final sử dụng cho một lớp, lớp này sẽ không thể được kế thừa.
  • Biến static final trống: một biến final mà không được khởi tạo tại thời điểm khai báo được gọi là biến final trống.

Ví dụ về biến final và phương thức final:

public class UsingFinalExample {
    public static final String WEBSITE = "gpcoder.com";

    public final void print() {
        System.out.println("Website: " + WEBSITE);
    }
}

Ví dụ về lớp final:

public final class FinalClassExample {
    // Class implementation
}

public class ChildClass extends FinalClassExample {
    // Compile-time error: The type ChildClass cannot subclass the final class FinalClassExample
}

Ví dụ về biến static final trống:

public class FinalExample {
    public static final double PI;

    static {
        PI = 3.14;
    }

    // Class implementation
}

Đó là những điều cơ bản về từ khóa static và final trong ngôn ngữ lập trình Java. Hi vọng bài viết này giúp bạn hiểu rõ hơn về cách sử dụng và ý nghĩa của chúng. Đừng ngần ngại để lại bình luận nếu bạn có bất kỳ câu hỏi hoặc góp ý nào.

Được sửa đổi bởi: Dnulib