Java輸出Hello World完美過(guò)程解析
1. 你會(huì)不會(huì)輸出"Hello World!"?
圖 2
當(dāng)我們學(xué)習(xí)一門(mén)編程語(yǔ)言的時(shí)候,我們都會(huì)先學(xué)如何輸出Hello World!
👨:“你真的會(huì)嗎?”
👩:“會(huì)!”
👩:“以下這幾個(gè)例子,我背都給你背下來(lái)?。。?!【驕傲】”
C語(yǔ)言
printf("Hello World!");
C++語(yǔ)言
cout << "Hello World!";
Golang語(yǔ)言:
fmt.Print("hello world!")
Java語(yǔ)言:
System.out.print("Hello World!");
Python語(yǔ)言:
print('Hello World!')
👨:“但!你真的會(huì)嗎?【邪魅一笑】。這次我賭你不會(huì)!不信?那你接著往下看~”
2. 小生拋磚引玉,歡迎指正
下面這個(gè)代碼是Java輸出Hello World的代碼,代碼沒(méi)有報(bào)錯(cuò),輸出結(jié)果正確。
我們?cè)谳敵鲞@一行打一個(gè)斷點(diǎn),并且以debug模式運(yùn)行,不斷點(diǎn)擊下一步。
首先我們可以看到是System類調(diào)用靜態(tài)成員out,并且out是一個(gè)PrintStream對(duì)象的實(shí)例,調(diào)用這個(gè)實(shí)例的println方法,就來(lái)到如下頁(yè)面。我們可以看到這個(gè)方法傳入的是我們的Hello World字符串,并且調(diào)用print方法,再調(diào)用newLine方法。從這里就可以看出print和println方法的區(qū)別。聰明的你應(yīng)該可以猜到,沒(méi)錯(cuò),newLine方法就是換行。好的,繼續(xù)往下走~
這個(gè)時(shí)候我們進(jìn)入了print方法。這里也很好理解。你可以想想當(dāng)我們的字符串為null的時(shí)候,你會(huì)發(fā)現(xiàn)輸出的是一個(gè)字符串的null,而在源碼里面正好就是這樣的設(shè)計(jì)。緊接著,將會(huì)調(diào)用該類中的write方法。那行,我們繼續(xù)進(jìn)入write方法。
進(jìn)入write方法,我們會(huì)發(fā)現(xiàn)這里有一個(gè)同步鎖。學(xué)過(guò)Java語(yǔ)法的同學(xué)應(yīng)該馬上就反應(yīng)到了,這是防止在多線程的情況下,一個(gè)字符串還未處理完,另一個(gè)字符串便進(jìn)來(lái)這個(gè)方法了,這會(huì)導(dǎo)致內(nèi)部的數(shù)據(jù)出現(xiàn)矛盾??!接著是執(zhí)行一個(gè)ensureOpen方法,按照我的蹩腳英文hh,初步理解這是“確定是否打開(kāi)”的意思。那我們就進(jìn)去看看到底是確定什么是否打開(kāi)!
我們發(fā)現(xiàn)這里有一個(gè)判斷out實(shí)例是否為null的情況,當(dāng)out為null的時(shí)候,拋出一個(gè)“流關(guān)閉”的異常。結(jié)合這個(gè)提示,加上對(duì)代碼的查看,我們發(fā)現(xiàn)這個(gè)out實(shí)例正是輸出流對(duì)象的實(shí)例。當(dāng)我們要輸出什么內(nèi)容的時(shí)候,當(dāng)然要判斷輸出流對(duì)象是否為空呀。OK,這里我們沒(méi)啥問(wèn)題。
那我們就要進(jìn)入整個(gè)輸出語(yǔ)句最重要的源代碼了:執(zhí)行寫(xiě)入。
進(jìn)去之后我們發(fā)現(xiàn),同樣是調(diào)用重載的write方法,傳入的參數(shù)為字符串,0以及字符串長(zhǎng)度。接著進(jìn)入該方法。
前方高能!??!
同步鎖和ensureOpen方法上面已經(jīng)講過(guò)不贅述。這里初始化變量b是0,t是0加上字符串的長(zhǎng)度。
這個(gè)時(shí)候的t-b正好就是字符串的長(zhǎng)度,那么接著下去,我們會(huì)取我們一次可以寫(xiě)入最大的長(zhǎng)度和t-b最小值。
- 當(dāng)最小值是我們的字符串長(zhǎng)度的時(shí)候,我們直接獲取字符串的字符數(shù)組,讓初始變量b加上寫(xiě)入的長(zhǎng)度,這個(gè)時(shí)候我們會(huì)發(fā)現(xiàn)循環(huán)條件已經(jīng)不成立,那么將會(huì)結(jié)束循環(huán);
- 當(dāng)最小值是一次可以寫(xiě)入最大的長(zhǎng)度的時(shí)候,我們直接寫(xiě)入最大的長(zhǎng)度,這時(shí)候初始變量加上寫(xiě)入長(zhǎng)度的時(shí)候,循環(huán)條件是成立的,同時(shí)我們也有字符串沒(méi)有獲取,那么將會(huì)進(jìn)入下一次循環(huán),直到b<t不成立時(shí)退出。
同時(shí)在執(zhí)行循環(huán)體的過(guò)程中,仍然需要不斷清楚緩存。
其余的幾個(gè)方法和上面的思路比較相似,這里將不一一贅述。
3. 總結(jié)
這里是我個(gè)人的一點(diǎn)點(diǎn)小小的思考,我覺(jué)得程序員有三個(gè)境界,從淺到深依次是:
- 會(huì)調(diào)用源代碼
- 會(huì)看懂源代碼
- 會(huì)復(fù)寫(xiě)源代碼
為什么要看源代碼呢?很多急于求成的程序員會(huì)說(shuō),別人寫(xiě)好的東西,你會(huì)用就好了啊,你要看懂實(shí)現(xiàn)原理干嘛?但我想說(shuō)的是,其實(shí)看源碼的過(guò)程正是你學(xué)習(xí)代碼的過(guò)程。Java源碼經(jīng)歷過(guò)二十幾年的沉淀,很多東西看似底層,但其實(shí)最考驗(yàn)基礎(chǔ)語(yǔ)法的功底。博主本人現(xiàn)在讀大二,關(guān)于Java源碼的講解肯定有很多不夠完善的地方,但我的初衷是分享。我也希望優(yōu)秀的你,在評(píng)論區(qū)給我更加寶貴的建議和意見(jiàn),感謝??!
以上就是Java輸出Hello World完美過(guò)程解析的詳細(xì)內(nèi)容,更多關(guān)于Java輸出Hello World的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 使用IntelliJ IDEA2020.2.2 x64 新建java項(xiàng)目并且輸出Hello World
- linux環(huán)境下java程序打包成簡(jiǎn)單的hello world輸出jar包示例
- Java的MyBatis框架項(xiàng)目搭建與hellow world示例
- 使用Java的Spring框架編寫(xiě)第一個(gè)程序Hellow world
- Linux下Java開(kāi)發(fā)環(huán)境搭建以及第一個(gè)HelloWorld
- Java之JFrame輸出Helloworld實(shí)例
- Java基礎(chǔ)教程之Hello World到面向?qū)ο?/a>
- java 學(xué)習(xí)筆記(入門(mén)篇)_java程序helloWorld
相關(guān)文章
Java?MyBatis實(shí)戰(zhàn)之QueryWrapper中and和or拼接技巧大全
在Java中QueryWrapper是MyBatis-Plus框架中的一個(gè)查詢構(gòu)造器,它提供了豐富的查詢方法,其中包括and和or方法,可以用于構(gòu)建復(fù)雜的查詢條件,這篇文章主要給大家介紹了關(guān)于Java?MyBatis實(shí)戰(zhàn)之QueryWrapper中and和or拼接技巧的相關(guān)資料,需要的朋友可以參考下2024-07-07SpringMVC之@requestBody的作用及說(shuō)明
這篇文章主要介紹了SpringMVC之@requestBody的作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法
這篇文章主要介紹了IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Java啟用Azure Linux虛擬機(jī)診斷設(shè)置
這篇文章主要介紹了Java啟用Azure Linux虛擬機(jī)診斷設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05springboot動(dòng)態(tài)注入配置與docker設(shè)置環(huán)境變量的方法
這篇文章主要介紹了springboot動(dòng)態(tài)注入配置與docker設(shè)置環(huán)境變量的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04詳解SpringCloud新一代網(wǎng)關(guān)Gateway
SpringCloud Gateway是Spring Cloud的一個(gè)全新項(xiàng)目,Spring 5.0+ Spring Boot 2.0和Project Reactor等技術(shù)開(kāi)發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的API路由管理方式2021-06-06如何解決Spring事務(wù)注解@Transactional在類內(nèi)部方法調(diào)用不生效
這篇文章主要介紹了如何解決Spring事務(wù)注解@Transactional在類內(nèi)部方法調(diào)用不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08spring boot和spring cloud之間的版本關(guān)系
這篇文章主要介紹了spring boot和spring cloud之間的版本關(guān)系,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Java操作IO對(duì)象流進(jìn)行數(shù)據(jù)的讀寫(xiě)
這篇文章主要介紹了Java操作IO對(duì)象流進(jìn)行數(shù)據(jù)的讀寫(xiě),本文通過(guò)例子逐步介紹了java如何操作IO流,和文字解析,需要的朋友可以參考下2021-07-07