Bạn hiểu về hàm main trong Java đến mức nào? 12 câu hỏi đơn giản để kiểm tra kiến thức của bạn.

Hàm main trong hầu hết các ngôn ngữ lập trình có lẽ là hàm đầu tiên mà chúng ta làm quen khi học 1 ngôn ngữ mới. Nó đóng vai trò như 1 điểm bắt đầu (entry point) "nơi mà quyền điều khiển được chuyển từ hệ thống đến một chương trình máy tính, và tại đó thì CPU sẽ truy cập vào 1 chương trình hoặc một đoạn code và tiến hành thực thi."

Phần lớn động lực để tôi viết ra bài này là sau khi nói chuyện với vài người bạn về những nguyên tắc trong Java, chúng tôi nhanh chóng nhận ra là mình đã bỏ qua vài thứ cơ bản, cụ thể là hàm main. Do đó tôi đã thu thập các câu hỏi thú vị về chủ đề này, các bạn hãy thử trả lời chúng trước khi đọc đáp án nhé, và nếu không trả lời được thì cũng chả sao, đáp án trong này tôi cũng phải search google hết đấy 😄

1. main có phải là một reserved keyword trong Java không?

Từ main này chỉ là 1 convention lấy từ những ngôn ngữ như C và C++, nó không phải là một reserved keyword trong Java. Ví dụ bạn có thể đặt tên biến với nó:

int main;

2. Hàm main có cần modifier là static không?

Hàm main cần có modifier là static để cho máy ảo Java có thể dễ dàng tìm ra nó mà không cần phải chạy constructor của class. Hàm main mà không có modifier là static sẽ gây ra tính mơ hồ cho JVM bởi vì những hàm không phải static cần phải được gọi thông qua constructor và JVM sẽ không biết phải gọi constructor của class nào. Nếu nó chọn 1 class ngẫu nhiên, có thể nó sẽ cần phải cung cấp những tham số của constructor đó, nó sẽ không biết phải truyền vào cái gì. Thử tưởng tượng bằng cách kì diệu nào đó mà nó có thể tự nhận biết và truyền tham số một cách tự động, thì hàm nào trong class đó sẽ là entry point thực sự? Hãy nhớ rằng main không phải là một keyword.

3. Tham số String[] args có bao giờ null được không?

The String []args in the main method can never be null even if no arguments are passed. It is simply an empty initialized array of strings.

Tham số này trong hàm main không bao giờ null kể cả khi không có tham số nào được truyền vào. Nó chỉ đơn giản là một string array trống đã được khởi tạo.

4. Có thể viết là static public void main thay vì public static void main được không?

Vị trí của modifier như public hay static không quan trọng đối với hàm main hay bất cứ hàm nào khác trong Java, nên static public void main cũng vẫn OK. Tuy vậy thì return type bắt buộc phải đi sau các modifier.

5. Có thể overload hàm main được không?

Bạn có thể overload hàm main miễn là nó khác signature. JVM sẽ chỉ gọi hàm main với parameter là String []args mà thôi. Bạn cần phải tự gọi những hàm main khác nếu bạn muốn dùng chúng.


public class FunMainMethodTrivia {
  //Hàm main nguyên bản
  //JVM sẽ luôn gọi hàm này
  public static void main(String []args) {
    //
  }
  //Overload hợp lệ
  //JVM sẽ không gọi nó
  public static void main(String s1) {
    //Bạn cần phải tự gọi nếu muốn dùng
  }
//Overload hợp lệ
  //JVM sẽ không gọi nó
  public static void main(String s1, String s2, String s3) {
     //Bạn cần phải tự gọi nếu muốn dùng
  }
}

6. Có thể dùng tên hàm khác thay vì main không?

Câu trả lời là không. JVM sẽ không nhận diện bất cứ một hàm nào khác như là một entry point.

7. Android có hàm main hay không?

Câu trả lời là có, nhưng nó nằm sâu bên trong Android framework.

7b. Bạn có biết hàm nào trong Android framework chứa hàm này không?

Nếu bạn tò mò đến mức đào sâu theo stack trace hay bất cứ một exception nào, bạn sẽ thấy nó đi qua Handler, Looper, MessageQueue và sau đó là entry point của chương trình của bạn. Có một class đặc biệt tên là ActivityThread có chứa hàm main đóng vai trò là entry point trong một chương trình Android.

8. Đoạn code dưới đây có compile được không?

public class Parent {
  public static void main(String []args) {
    System.out.println("Im in the parent main method!");
  }
}

//Chúng ta sẽ cho chạy class này
public class Child {
  public static void main(String []args) {
    Parent.main(args);
  }
}

Câu trả lời là có, vẫn chạy bình thường.

9. Có thể override hàm main được không?

Hàm static không thể được override.

10. Có thể chạy được 1 chương trình sử dụng đoạn code dưới đây không?

public class Parent {
    public static void main(Object []args) {
        System.out.println("Im in the main method!");
    }
}

Câu trả lời là không. JVM chỉ quan tâm đến hàm có tham số là String[], với trường hợp trên thì nó sẽ không tìm được entry point để khởi động chương trình.

11. Bạn có biết những ngôn ngữ nào khác dùng hàm main như entry point không?

Từ khoá main đóng vai trò như entry point là khá phổ biến. Dưới đây là một vài ngôn ngữ lập trình ứng dụng từ khoá này: C/C++, C#, D, Java, Go, Haskell, Pike, Visual Basic*, Python, ... Bạn có thể xem thêm về các ngôn ngữ khác và hàm main của chúng được implement ra sao trên Wikipedia.

Bài viết được dịch từ How well do you know the Java main method? 12 simple questions to test your knowledge! của tác giả Martin Ombura Jr.