你真的懂Java怎么輸出Hello World嗎?
- 1. 你會不會輸出"Hello World!"?
- 2. 小生拋磚引玉,歡迎指正
- 3. 總結
1. 你會不會輸出"Hello World!"?
| 圖1 | 圖 2 |
|---|---|
![]() | ![]() |
當我們學習一門編程語言的時候,我們都會先學如何輸出Hello World!
👨:“你真的會嗎?”
👩:“會!”
👩:“以下這幾個例子,我背都給你背下來!!!!【驕傲】”
- C語言
printf("Hello World!");
- C++語言
cout << "Hello World!";
- Golang語言:
fmt.Print("hello world!")
- Java語言:
System.out.print("Hello World!");
- Python語言:
print('Hello World!')
👨:“但!你真的會嗎?【邪魅一笑】,這次我賭你不會!不信?那你接著往下看~”
2. 小生拋磚引玉,歡迎指正
下面這個代碼是Java輸出Hello World的代碼,代碼沒有報錯,輸出結果正確,

我們在輸出這一行打一個斷點,并且以debug模式運行,不斷點擊下一步,

首先我們可以看到是System類呼叫靜態成員out,并且out是一個PrintStream物件的實體,呼叫這個實體的println方法,就來到如下頁面,我們可以看到這個方法傳入的是我們的Hello World字串,并且呼叫print方法,再呼叫newLine方法,從這里就可以看出print和println方法的區別,聰明的你應該可以猜到,沒錯,newLine方法就是換行,好的,繼續往下走~

這個時候我們進入了print方法,這里也很好理解,你可以想想當我們的字串為null的時候,你會發現輸出的是一個字串的null,而在原始碼里面正好就是這樣的設計,緊接著,將會呼叫該類中的write方法,那行,我們繼續進入write方法,

進入write方法,我們會發現這里有一個同步鎖,學過Java語法的同學應該馬上就反應到了,這是防止在多執行緒的情況下,一個字串還未處理完,另一個字串便進來這個方法了,這會導致內部的資料出現矛盾!!接著是執行一個ensureOpen方法,按照我的蹩腳英文hh,初步理解這是“確定是否打開”的意思,那我們就進去看看到底是確定什么是否打開!

我們發現這里有一個判斷out實體是否為null的情況,當out為null的時候,拋出一個“流關閉”的例外,結合這個提示,加上對代碼的查看,我們發現這個out實體正是輸出流物件的實體,當我們要輸出什么內容的時候,當然要判斷輸出流物件是否為空呀,OK,這里我們沒啥問題,

那我們就要進入整個輸出陳述句最重要的源代碼了:執行寫入,

進去之后我們發現,同樣是呼叫多載的write方法,傳入的引數為字串,0以及字串長度,接著進入該方法,

前方高能!!!
同步鎖和ensureOpen方法上面已經講過不贅述,這里初始化變數b是0,t是0加上字串的長度,
這個時候的t-b正好就是字串的長度,那么接著下去,我們會取我們一次可以寫入最大的長度和t-b最小值,
- 當最小值是我們的字串長度的時候,我們直接獲取字串的字符陣列,讓初始變數b加上寫入的長度,這個時候我們會發現回圈條件已經不成立,那么將會結束回圈;
- 當最小值是一次可以寫入最大的長度的時候,我們直接寫入最大的長度,這時候初始變數加上寫入長度的時候,回圈條件是成立的,同時我們也有字串沒有獲取,那么將會進入下一次回圈,直到b<t不成立時退出,
同時在執行回圈體的程序中,仍然需要不斷清楚快取,

其余的幾個方法和上面的思路比較相似,這里將不一一贅述,

3. 總結
這里是我個人的一點點小小的思考,我覺得程式員有三個境界,從淺到深依次是:
- 會呼叫源代碼
- 會看懂源代碼
- 會復寫源代碼
為什么要看源代碼呢?很多急于求成的程式員會說,別人寫好的東西,你會用就好了啊,你要看懂實作原理干嘛?但我想說的是,其實看原始碼的程序正是你學習代碼的程序,Java原始碼經歷過二十幾年的沉淀,很多東西看似底層,但其實最考驗基礎語法的功底,博主本人現在讀大二,關于Java原始碼的講解肯定有很多不夠完善的地方,但我的初衷是分享,我也希望優秀的你,在評論區給我更加寶貴的建議和意見,感謝!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286764.html
標籤:java


