Một số câu hỏi “hóc búa” về hàm main trong Java

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.”

Mặc dù chúng ta gặp nó hàng ngày tuy nhiên ít ai biết được những bí mật đằng sau method này, trong bài viết này sẽ đưa ra một số câu hỏi về hàm main trong java, và hãy xem liệu bạn trả lời được bao nhiêu câu nhé. 

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;

Note: Reserved keyword được dùng trong những cú pháp của một ngôn ngữ, chúng không thể dùng để định danh cho các biến, method, label etc. Ví dụ static là một Reserved keyword dùng để khai biến static trong Java.

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.

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

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.

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.

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
  }
}

 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.

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.

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 HandlerLooperMessageQueue 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.

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

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

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.

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 lấy từ https://viblo.asia/p/ban-hieu-ve-ham-main-trong-java-den-muc-nao-12-cau-hoi-don-gian-de-kiem-tra-kien-thuc-cua-ban-Az45bbPz5xY.

Trong đó mình chọn những câu cảm thấy hay, và giải thích một số khái niệm có thể khó hiểu với các bạn mới bắt đầu học Java.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x