1. 程式人生 > 其它 >阿里二面:main 方法可以被繼承嗎|轉

阿里二面:main 方法可以被繼承嗎|轉

摘要:java中,main方法可以被基礎,可以被過載,可以被繼承,可以被重寫。

目錄

main 函式介紹

  微信群裡一位網友,在群裡發了自己面試阿里的過程。其中一道面試題就是:Java 中的 main 方法可以繼承嗎?頭條面試官也問過同樣的問題。我們一開始學習 Java 程式的時候,最先跑的一段程式碼肯定是 main 方法,main 方法的格式如下:

public static void main(String[] args) {
 
}

  那麼 main 方法有什麼特殊的地方呢?今天我們來簡單看一下。首先針對 main 方法的格式定義:

  1. 「public」 :main 方法是啟動的時候由 JVM 進行載入的,public 的可訪問許可權是最高的,所以需要宣告為 public;
  2. 「static」 :方法的呼叫要麼是通過物件,要麼是通過類,而 main 方法的話因為是由虛擬機器呼叫的,所以無需生成物件,那麼宣告為 static 即可;
  3. 「main」 :至於為什麼方法名稱叫 main,我想應該是參考的是 C 語言的方法名吧;
  4. 「void」 :main 方法退出時,並沒有需要有相關返回值需要返回,所以是 void;
  5. 「String[]」 :此字串陣列用來執行時接受使用者輸入的引數;因為字串在 Java 中是具有通用普遍性的,所以使用字串是最優選擇;陣列的話,因為我們的引數不止一個,所以陣列肯定是合適的;

  不過自 JDK1.5 引入動態引數後,String[]陣列也可以使用String... args來實現。

public static void main(String... args){
 
}

  除了上面 JVM 規定的這個 main 方法比較特殊外,其他的 main 方法與普通的靜態方法是沒有什麼不同的。

main方法能被過載

  這個是可以的,比如說我們給它過載一個方法:

public class Main {
    public static void main(String args) {
        System.out.println("hello world:" + args);
    }
 
    public static void main(String[] args) {
        main("test");
    }
}

  編譯執行,很顯然沒啥問題,除了 JVM 規定的作為應用程式入口的 main 方法之外,其它的 main 方法都是比較普通的方法。

main方法能被其它方法呼叫

public class Main {
    private static int times = 3;
 
    public static void main2(String[] args) {
        times--;
        main(args);
    }
 
    public static void main(String[] args) {
        System.out.println("main方法執行:" + times);
        if (times <= 0) {
            System.exit(0);
        }
        main2(args);
    }
}

  執行一下程式碼,可以發現程式碼能正常執行:

main方法執行:3
main方法執行:2
main方法執行:1
main方法執行:0

  所以說即使是作為應用程式入口的 main 方法,也是可以被其他方法呼叫的,但要注意程式的關閉方式,別陷入死迴圈了。

main方法能被繼承

  子類可以繼承父類所有的屬性和方法,只是對於私有的不能訪問。那麼當父類定義了 main 方法,而子類沒有 main 方法時,理論上可以繼承父類的main方法。

定義父類和子類:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, Wiener.");
    }
}
public class subMain extends Main {
}

應用程式入口

  這時候我們執行子類 subMain,可以發現,同樣列印了Hello, Wiener.,這說明 main 方法也是可以繼承的。那麼還有一種隱藏的情況也很顯然了,子類定義自己的 main 方法,重寫父類中的實現,那麼這也是可以的。

public class subMain extends Main {
    public static void main(String [] args) {
        System.out.println("Hello, 樓蘭胡楊.");
    }
}

  執行時會讓我們選擇以父類還是子類為入口,以父類為入口,子類和父類的main方法都會執行,以子類為入口,只會執行子類的main方法。執行子類中的main分發,控制檯就會列印重寫後的的內容:Hello, 樓蘭胡楊.

  這麼來看,除了main方法作為應用程式的入口比較特殊外,其他情況下與正常的靜態方法是沒什麼區別的。

結束語

  綜上所述,java中main函式可以被過載,可以被繼承,可以被重寫。

  作為程式設計師,要有“刨根問底”的精神。知其然,更要知其所以然。這篇文章希望能抽絲剝繭,還原背後的原理。

Reference