互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
來自:網(wǎng)絡(luò)
昨天,微信群里一位網(wǎng)友,在群里發(fā)了自己面試阿里的過程。其中一個(gè)面試,他在群里 PUA 其他網(wǎng)友。這道面試題就是:Java 中的 main 方法可以繼承嗎?
我們一開始學(xué)習(xí) Java 程序的時(shí)候,最先跑的一段代碼肯定是 main 方法,main 方法的格式如下:public?static?void?main(String[]?args)?{
}
那么 main 方法有什么特殊的地方呢?今天我們來簡(jiǎn)單看一下。「public」?:main 方法是啟動(dòng)的時(shí)候由 JVM 進(jìn)行加載的,public 的可訪問權(quán)限是最高的,所以需要聲明為 public;「static」?:方法的調(diào)用要么是通過對(duì)象,要么是通過類,而 main 方法的話因?yàn)槭怯商摂M機(jī)調(diào)用的,所以無需生成對(duì)象,那么聲明為 static 即可;「main」?:至于為什么方法名稱叫 main,我想應(yīng)該是參考的是 C 語(yǔ)言的方法名吧;「void」?:main 方法退出時(shí),并沒有需要有相關(guān)返回值需要返回,所以是 void;「String[]」?:此字符串?dāng)?shù)組用來運(yùn)行時(shí)接受用戶輸入的參數(shù);因?yàn)樽址?Java 中是具有通用普遍性的,所以使用字符串是最優(yōu)選擇;數(shù)組的話,因?yàn)槲覀兊膮?shù)不止一個(gè),所以數(shù)組肯定是合適的;不過自 JDK1.5 引入動(dòng)態(tài)參數(shù)后,String[]數(shù)組也可以使用String... args來實(shí)現(xiàn)。public static void main(String... args){}
除了上面 JVM 規(guī)定的這個(gè) main 方法比較特殊外,其他的 main 方法與普通的靜態(tài)方法是沒有什么不同的。
這個(gè)是可以的,比如說我們給它重載一個(gè)方法:public class Main { public static void main(String args) { System.out.println("hello world:" + args); }
public static void main(String[] args) { main("test"); }}
編譯運(yùn)行,很顯然沒啥問題,除了 JVM 規(guī)定的作為應(yīng)用程序入口的 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方法執(zhí)行:" + times); if (times <= 0) { System.exit(0); } main2(args); }}
運(yùn)行一下代碼,可以發(fā)現(xiàn)代碼能正常執(zhí)行:main方法執(zhí)行:3main方法執(zhí)行:2main方法執(zhí)行:1main方法執(zhí)行:0
所以說即使是作為應(yīng)用程序入口的 main 方法,也是可以被其他方法調(diào)用的,但要注意程序的關(guān)閉方式,別陷入死循環(huán)了。
我們以前了解過,當(dāng)類繼承時(shí),子類可以繼承父類的方法和變量,那么當(dāng)父類定義了 main 方法,而子類沒有 main 方法時(shí),能繼承父類的 main 方法,從而正常的運(yùn)行程序么?public class Main { public static void main(String[] args) { System.out.println("hello world"); }}
public class Main2 extends Main {}
這時(shí)候我們運(yùn)行子類 Main2,可以發(fā)現(xiàn),同樣打印了hello world,這說明 main 方法也是可以繼承的。那么還有一種隱藏的情況也很顯然了,子類定義自己的 main 方法,隱藏掉父類中的實(shí)現(xiàn),那么這也是可以的。public class Main2 extends Main { public static void main(String [] args) { System.out.println("hello world Main2"); }}
這時(shí)候就會(huì)打印子類自己的內(nèi)容了:hello world Main2。這么來看,除了main方法作為應(yīng)用程序的入口比較特殊外,其他情況下與正常的靜態(tài)方法是沒什么區(qū)別的。推薦閱讀:
RedisJson 橫空出世,性能碾壓ES和Mongo!
面試官:Redis新版本開始引入多線程,談?wù)勀愕目捶ǎ?/a>
互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G)內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper、數(shù)據(jù)結(jié)構(gòu)、限流熔斷降級(jí)......等技術(shù)棧!
?戳閱讀原文領(lǐng)??!? ? ? ? ? ? ? ??? ??? ? ? ? ? ? ? ? ? ?朕已閱?