亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

我們能從java的HelloWorld學(xué)到什么?

系統(tǒng) 2549 0

這是每個(gè)Java程序員都知道的。雖然簡(jiǎn)單,但是從一個(gè)簡(jiǎn)單的問(wèn)題可以引入更深的思考。在這篇文章中,我們將討論這個(gè)簡(jiǎn)單的程序。如果能更多的幫到你,請(qǐng)留下寶貴的意見(jiàn)。

HelloWorld.java

    
  1. public class HelloWorld {
  2. /**
  3. * @param args
  4. */
  5. public static void main ( String [] args ) {
  6. // TODO Auto-generated method stub
  7. System . out . println ( "Hello World" );
  8. }
  9. }

1、為什么一切都開(kāi)始于一個(gè)類?

Java程序是由類組成,一個(gè)類包含方法和屬性。這是由于它的面向?qū)ο蟮奶卣鳎阂磺薪詫?duì)象,每個(gè)對(duì)象都是一個(gè)類的實(shí)例。面向?qū)ο缶幊逃泻芏鄡?yōu)勢(shì),比如更好的模塊化,擴(kuò)展性強(qiáng)等

2、為什么總有一個(gè)“main”方法?

“main”方法是程序的入口,它是靜態(tài)的。 “static”是指該方法是類的一部分,而不是對(duì)象的一部分。

這是為什么?我們?yōu)槭裁床话岩粋€(gè)非靜態(tài)方法作為程序的入口?

如果方法不是靜態(tài)的,那么需要?jiǎng)?chuàng)建一個(gè)對(duì)象后才能使用方法。因?yàn)楸仨氂脤?duì)象去調(diào)用方法。對(duì)于程序的入口,這是不現(xiàn)實(shí)的。所以,程序的入口方法是靜態(tài)的。

參數(shù)“String[] args”表示一個(gè)字符串?dāng)?shù)組可以被傳入到該程序,用來(lái)初始化程序。

3、HelloWorld的字節(jié)碼

執(zhí)行這個(gè)程序,Java文件首先編譯為java字節(jié)碼儲(chǔ)存在.class文件里。

字節(jié)碼是什么樣子的呢?

首先,字節(jié)碼本身是無(wú)法讀取。如果我們用一個(gè)十六進(jìn)制編輯器打開(kāi),它看起來(lái)像下面這樣:

我們能從java的HelloWorld學(xué)到什么?

我們能看到很多操作碼(比如 CA、4C 等)在字節(jié)碼上,它們每個(gè)都有一個(gè)相應(yīng)的助記碼(比如,aload_0 在下面的例子中)。操作碼是不可讀的,但我們可以用javap命令查看.class文件的助記符形式。

“javap -C”打印出每個(gè)方法的反匯編代碼。反匯編代碼的意思是包括Java字節(jié)碼的說(shuō)明。

    
  1. javap - classpath . - c HelloWorld

    
  1. Compiled from "HelloWorld.java"
  2. public class HelloWorld extends java . lang . Object {
  3. public HelloWorld ();
  4. Code :
  5. 0 : aload_0
  6. 1 : invokespecial #1; //Method java/lang/Object."<init>":()V
  7. 4 : return
  8. public static void main ( java . lang . String []);
  9. Code :
  10. 0 : getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
  11. 3 : ldc #3; //String Hello World
  12. 5 : invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
  13. 8 : return
  14. }

上面的代碼中包含兩個(gè)方法:一個(gè)是默認(rèn)構(gòu)造函數(shù),這是由編譯器推斷出,另一個(gè)是main方法。

每個(gè)方法下面,都有一系列指令,比如 aload_0,invokespecial #1,等

下面的每個(gè)方法,也有說(shuō)明,如aload_0,invokespecial#1,等指令可以在java指令清單里 查到 。例如,aload_0指令是加載一個(gè)從棧中引用的本地變量0,getstatic 指令獲取一個(gè)類的靜態(tài)字段值。注意“#2” 指令在getstatic指令后指向運(yùn)行常量池。常量池是一個(gè)JVM運(yùn)行時(shí)數(shù)據(jù)區(qū), 查看 。我們可以用“javap -verbose”命令來(lái)查看常量池。

此外,每個(gè)指令開(kāi)始于一個(gè)數(shù)字,如0,1,4等。在.class文件中,每個(gè)方法都有一個(gè)對(duì)應(yīng)的字節(jié)碼數(shù)組。這些數(shù)字對(duì)應(yīng)的每一個(gè)操作碼和它的參數(shù)都存儲(chǔ)在數(shù)組中的索引中。每個(gè)操作碼為1個(gè)字節(jié),指令可以有0個(gè)或多個(gè)參數(shù)。這就是為什么數(shù)字是不連續(xù)的。

現(xiàn)在,我們可以用“javap -verbose” 查看.class文件進(jìn)一步研究。

    
  1. javap - classpath . - verbose HelloWorld

    
  1. Compiled from "HelloWorld.java"
  2. public class HelloWorld extends java . lang . Object
  3. SourceFile : "HelloWorld.java"
  4. minor version : 0
  5. major version : 50
  6. Constant pool :
  7. const #1 = Method #6.#15; // java/lang/Object."<init>":()V
  8. const #2 = Field #16.#17; // java/lang/System.out:Ljava/io/PrintStream;
  9. const #3 = String #18; // Hello World
  10. const #4 = Method #19.#20; // java/io/PrintStream.println:(Ljava/lang/String;)V
  11. const #5 = class #21; // HelloWorld
  12. const #6 = class #22; // java/lang/Object
  13. const #7 = Asciz <init>;
  14. const #8 = Asciz ()V;
  15. const #9 = Asciz Code;
  16. const #10 = Asciz LineNumberTable;
  17. const #11 = Asciz main;
  18. const #12 = Asciz ([Ljava/lang/String;)V;
  19. const #13 = Asciz SourceFile;
  20. const #14 = Asciz HelloWorld.java;
  21. const #15 = NameAndType #7:#8;// "<init>":()V
  22. const #16 = class #23; // java/lang/System
  23. const #17 = NameAndType #24:#25;// out:Ljava/io/PrintStream;
  24. const #18 = Asciz Hello World;
  25. const #19 = class #26; // java/io/PrintStream
  26. const #20 = NameAndType #27:#28;// println:(Ljava/lang/String;)V
  27. const #21 = Asciz HelloWorld;
  28. const #22 = Asciz java/lang/Object;
  29. const #23 = Asciz java/lang/System;
  30. const #24 = Asciz out;
  31. const #25 = Asciz Ljava/io/PrintStream;;
  32. const #26 = Asciz java/io/PrintStream;
  33. const #27 = Asciz println;
  34. const #28 = Asciz (Ljava/lang/String;)V;
  35. {
  36. public HelloWorld ();
  37. Code :
  38. Stack = 1 , Locals = 1 , Args_size = 1
  39. 0 : aload_0
  40. 1 : invokespecial #1; //Method java/lang/Object."<init>":()V
  41. 4 : return
  42. LineNumberTable :
  43. line 2 : 0
  44. public static void main ( java . lang . String []);
  45. Code :
  46. Stack = 2 , Locals = 1 , Args_size = 1
  47. 0 : getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
  48. 3 : ldc #3; //String Hello World
  49. 5 : invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
  50. 8 : return
  51. LineNumberTable :
  52. line 9 : 0
  53. line 10 : 8
  54. }

JVM定義 :運(yùn)行常量池提供一個(gè)類似于傳統(tǒng)的編程語(yǔ)言的符號(hào)表函數(shù),盡管它包含了比典型的符號(hào)表范圍更廣的數(shù)據(jù)

“invokespecial #1″指令指向#1常量在常量池中.常量是”Method #6.#15;“從數(shù)字上看,我們就可以按遞歸方式來(lái)得到最終的常量。

LineNumberTable提供用來(lái)調(diào)試java源代碼對(duì)應(yīng)字節(jié)碼的行數(shù)信息例如,在main方法里Java源代碼第9行對(duì)應(yīng)字節(jié)碼0,第10行對(duì)應(yīng)字節(jié)碼8。

如果你想知道更多關(guān)于字節(jié)碼,您可以創(chuàng)建和編譯一個(gè)更復(fù)雜的類來(lái)看一看。HelloWorld確實(shí)是個(gè)很簡(jiǎn)單的例子。

4、它是如何在JVM中執(zhí)行?

現(xiàn)在的問(wèn)題是如何JVM加載類并調(diào)用main方法?

在main方法執(zhí)行之前,JVM需要分三步走加載、連接以及初始化該類。1)加載二進(jìn)制的類和接口到j(luò)vm中。 2)連接合并二進(jìn)制數(shù)據(jù)到正在運(yùn)行狀態(tài)的jvm。連接有三步構(gòu)成,驗(yàn)證、準(zhǔn)備、解析。驗(yàn)證確保了類/接口在結(jié)構(gòu)上正確的;準(zhǔn)備工作包括所需要的類/接口分配內(nèi)存;解析符號(hào)引用。最后3)初始化變量并初始化值

我們能從java的HelloWorld學(xué)到什么?

這個(gè)裝載工作是由Java類加載器完成的。當(dāng)JVM啟動(dòng)時(shí),3個(gè)類加載器被使用:

1.引導(dǎo)類加載器:加載位于/ jre / lib目錄的核心Java庫(kù)。這是jvm核心的一部分,并且是原生的代碼。

2.擴(kuò)展類加載器:加載代碼的擴(kuò)展目錄(例如,/jar/ lib / ext目錄)。

3.系統(tǒng)類加載器:在CLASSPATH中找到負(fù)載代碼。

所以HelloWorld類是由系統(tǒng)類加載器加載。當(dāng)執(zhí)行的主要方法,它會(huì)觸發(fā)加載,鏈接和其他相關(guān)的類的初始化( 查看 ),如果它們存在。

最后,main()的幀被加載到j(luò)vm堆棧,程序計(jì)數(shù)器(PC)被相應(yīng)地設(shè)置。程序計(jì)數(shù)器然后指示println()幀的加載到JVM堆棧。當(dāng)main()方法完成后,它會(huì)從堆棧中彈出執(zhí)行完成。

參考文獻(xiàn):

1、 負(fù)載

2、 類加載機(jī)制

3、 類加載器

via: http://www.programcreek.com/2013/04/what-can-you-learn-from-a-java-helloworld-program/

我們能從java的HelloWorld學(xué)到什么?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产精品揄拍100视频 | 九九re| 欧洲天堂| 亚洲国产天堂久久精品网 | 国产成人永久在线播放 | 视频福利在线 | 天天干夜夜看 | 国产精品视频一区国模私拍 | 九九精品视频一区二区三区 | 奇米狠狠 | 香蕉综合视频 | 四虎音影 | 男人天堂视频在线 | 开心激情五月婷婷 | 国产96精品 | 亚洲欧美bt | 亚洲精品综合一区二区三区 | 精品成人一区二区 | 性久久久久久久久久 | 久久久久久麻豆 | 超碰v | 中文字幕福利 | 亚洲综合狠狠99婷婷 | 99视频在线免费观看 | 日韩一二区 | 国产成人夜色91 | 欧美日韩午夜视频 | 国产在线精品观看一区 | 日韩亚洲欧美性感视频影片免费看 | 青青青爽国产在线视频 | 成人欧美视频在线观看播放 | 午夜福利毛片 | 特黄未满14周岁毛片 | 欧美男女性生活视频 | 精品在线观看一区 | 男人天堂黄色 | 天天干天天噜 | 亚洲区欧美区 | 乱人伦99久久 | 天天天操操操 | 国产亚洲欧美精品久久久 |