我們很容易就會(huì)遺忘那些曾經(jīng)在猿群中大熱而又被各種新技術(shù)掩蓋直至堙滅的技術(shù)的價(jià)值。就拿COBOL這個(gè)老猿們當(dāng)年所用的神器來(lái)說(shuō)钥勋,就跟條死魚(yú)一樣被現(xiàn)代猿基本這么形容:沒(méi)價(jià)值炬转,腥臭,過(guò)時(shí)了算灸,對(duì)你沒(méi)好處扼劈。Java 作為現(xiàn)代猿的中堅(jiān)力量在這點(diǎn)上可能會(huì)成為下一個(gè)COBOL。
有關(guān)JAVA的技術(shù)賣出多少本書(shū)已經(jīng)是一個(gè)很久遠(yuǎn)的記憶了》坡浚現(xiàn)處中年時(shí)期的Java語(yǔ)言的用途已經(jīng)不再出現(xiàn)在各種雜志的封面上了荐吵。JAVA從出生到現(xiàn)在已經(jīng)19年了,應(yīng)用開(kāi)發(fā)圈已經(jīng)開(kāi)始繞著那些更有吸引力的如“Node.js”,"Objective-C","Dart","Go" 等等類似的新技術(shù)轉(zhuǎn)圈了赊瞬。Java先煎? 那是Web 1.0時(shí)代的一個(gè)傳說(shuō)吧?
從Dice.com網(wǎng)站的招聘信息你就可以知道押寶在哪森逮。跟iOS相關(guān)的開(kāi)發(fā)有2500左右的招聘榨婆,Java則有17000多個(gè)。Dice的數(shù)據(jù)不一定能完美的衡量技術(shù)的價(jià)值褒侧,但是在不斷推陳出新的技術(shù)推廣壓力下良风,Java職位是iOS的7倍之多可以說(shuō)確實(shí)是神器了。
也許闷供,相比把私人開(kāi)發(fā)App的收入的30%分給Apple并期盼(更多的是等死)你的App有一天爬上了Top-25List烟央,Java開(kāi)發(fā)可能會(huì)給你一個(gè)更好的商業(yè)計(jì)劃。但是實(shí)際上歪脏,Java一直都要面對(duì)一個(gè)比怎么玩鳥(niǎo)砸豬還要大的問(wèn)題疑俭。那就是如何在任意平臺(tái)上建立統(tǒng)一平臺(tái)并流暢運(yùn)行的問(wèn)題。這樣服務(wù)端程序猿婿失,客戶端程序猿钞艇,嵌入式程序猿所面對(duì)的那些平臺(tái)不統(tǒng)一的問(wèn)題都得到了解決。
在我們忘記Java在計(jì)算機(jī)行業(yè)里所扮演的角色和做出的那些卓越貢獻(xiàn)前豪硅,這里有12個(gè)絕對(duì)的理由來(lái)告訴你Java不但不會(huì)和COBOL一樣被堙滅哩照,并且在其后時(shí)代中更加壯大。
換句話說(shuō):別說(shuō)這是Java的逆襲懒浮,Java一直就在飘弧,并且其地位無(wú)法撼動(dòng)。
** Java持續(xù)占據(jù)主導(dǎo)地位的關(guān)鍵原因,第1位:在政治(通常手段低劣)斗爭(zhēng)中不屈不撓**
開(kāi)始時(shí)次伶,技術(shù)界從來(lái)沒(méi)認(rèn)為Java會(huì)成功痴昧,因?yàn)樗膶?duì)手太多而且都是“土豪”。盡管如此冠王,Java還是繁榮發(fā)展起來(lái)赶撰。那些詫異Java仍然存在的人們,一定是花了太多時(shí)間聽(tīng)那些對(duì)Java懷恨在心的人版确,而沒(méi)有花時(shí)間去理解為什么Java會(huì)成功扣囊。
微軟是Java第一個(gè)面對(duì)的強(qiáng)大對(duì)手,因?yàn)槟菚r(shí)MS-DOS提供了通用性绒疗,而微軟看到Java是此通用性最具可能性的替代者侵歇。Redmond從一開(kāi)始就對(duì)Java惡評(píng)不斷,從每個(gè)可能方面與其斗爭(zhēng)(譯注吓蘑,Redmond惕虑,雷德蒙德,是微軟總部所在地磨镶,此處代指微軟公司)溃蔫。在桌面應(yīng)用方向,Java從來(lái)沒(méi)有找它需要的發(fā)展推動(dòng)力琳猫,部分是因?yàn)閺?qiáng)大的Java虛擬機(jī)啟動(dòng)時(shí)需要花費(fèi)太長(zhǎng)時(shí)間伟叛。盡管有些啟動(dòng)延時(shí),Java應(yīng)用在Window平臺(tái)上還是可用的脐嫂。
由于一些不明原因统刮,Steve Jobs(譯注,史蒂夫·喬布斯)從來(lái)沒(méi)接收過(guò)Java账千,即使是在Mac被除了Adobe之外所有人忽視的年代侥蒙。Java的兼容性可以帶來(lái)很多有用的代碼,但是Apple一直未把Java視作第一選擇匀奏。(的確鞭衩,iOS智能手機(jī)比起我用的Android更流暢,所以也許Steve是對(duì)的娃善。)
Java內(nèi)部的很多斗爭(zhēng)也給它帶來(lái)了巨大痛苦论衍。IBM喜歡Java,但是一直在和Sun斗爭(zhēng)聚磺。IBM將其開(kāi)發(fā)的優(yōu)秀的IDE工具稱為“Eclipse”的決定饲齐,一直沒(méi)被Sun的人員欣然接受。Sun也從來(lái)沒(méi)像IBM那樣深刻理解商業(yè)領(lǐng)域咧最。
盡管這些原因,盡管Java創(chuàng)造者也在Java發(fā)展中有許多失策之處,Java依然快速壯大矢沿,在服務(wù)器應(yīng)用領(lǐng)域如魚(yú)得水滥搭,碩果累累,在桌面應(yīng)用領(lǐng)域滿足基本業(yè)務(wù)需求捣鲸。所有技術(shù)都需要在政治湍流中前行瑟匆,但是Java走的更難也更遠(yuǎn),證明了栽惶,通常愁溜,Java對(duì)許多應(yīng)用都是一個(gè)優(yōu)良選擇。
Java持續(xù)占據(jù)主導(dǎo)地位的關(guān)鍵原因外厂,第2點(diǎn):線程的魔力
Java虛擬機(jī)的強(qiáng)項(xiàng)之一是多線程控制冕象。JVM針對(duì)大型多核機(jī)上跑數(shù)百線程的穩(wěn)定性做了極佳的優(yōu)化。這也是為什么其他語(yǔ)言會(huì)為了能跑在JVM上面搞出交叉編譯器和模擬器汁蝶。
Java的這個(gè)能力同時(shí)也吸引了很多高流量的網(wǎng)站渐扮。他們可以在臺(tái)式機(jī)上搞開(kāi)發(fā)然后丟到服務(wù)器上讓JVM發(fā)揮出多核的功效。
Ruby 因?yàn)檎Z(yǔ)法的簡(jiǎn)潔和源碼可讀性好成為了Java目前的一個(gè)對(duì)手掖棉。但是當(dāng)性能成為瓶頸時(shí)墓律,Ruby開(kāi)發(fā)人員轉(zhuǎn)到了JRuby,一個(gè)用Java模擬出來(lái)的Ruby環(huán)境并增強(qiáng)了高負(fù)載下的線程處理能力幔亥。Sun的老猿們?cè)诩?xì)節(jié)上的處理讓JRuby大受歡迎耻讽。(譯注:好像多數(shù)人都是寫(xiě)完Ruby程序然后用JRuby打成war丟服務(wù)器上....)
Java持續(xù)占據(jù)主導(dǎo)地位的關(guān)鍵原因,第3點(diǎn):Java是初學(xué)者的語(yǔ)言
宗教帕棉,軍隊(duì)和國(guó)家興旺都離不開(kāi)對(duì)國(guó)人少年時(shí)期的洗腦针肥。作為大學(xué)AP計(jì)算機(jī)課程(譯注:高中生可修并計(jì)入大學(xué)學(xué)分的課程。由美國(guó)大學(xué)理事會(huì)提供笤昨,就是負(fù)責(zé)美國(guó)SAT的那個(gè)機(jī)構(gòu))意味著很多學(xué)生第一次接觸到的計(jì)算機(jī)語(yǔ)言就是Java祖驱。由于這個(gè)先入為主的原因,當(dāng)他們學(xué)習(xí)其他新的語(yǔ)言時(shí)瞒窒,他們會(huì)反觀Java的優(yōu)點(diǎn)和缺點(diǎn)捺僻,就算大部分轉(zhuǎn)行學(xué)其他語(yǔ)言了--雖然大部分學(xué)生修完課程就把Java丟一邊了--但是他們?cè)谒伎嫉臅r(shí)候仍會(huì)受到Java的影響。
Java作為一個(gè)教學(xué)語(yǔ)言是有它的原因的崇裁。有些幼猿不喜歡聲明數(shù)據(jù)類型匕坯,認(rèn)為好像有人讓你穿個(gè)背帶褲又要系皮帶一樣是多此一舉的行為。這個(gè)看上去可能比較抽象拔稳,但是為了能讓幼猿們理解計(jì)算機(jī)的一些原理葛峻,這是一個(gè)很好的方法。讓幼猿在寫(xiě)代碼的時(shí)候聲明數(shù)據(jù)類型巴比,然后編譯器會(huì)告訴他們數(shù)據(jù)類型不匹配而無(wú)法編譯時(shí)可以讓他們更好的理解計(jì)算機(jī)的底層原理术奖。
一些所謂時(shí)髦的語(yǔ)言已經(jīng)摒棄了花括號(hào)礁遵,因?yàn)樗麄冇X(jué)得維護(hù)它們很麻煩。這也許是對(duì)的采记,但是花括號(hào)對(duì)那些新手是非常有用的佣耐,因?yàn)檫@能幫助他們理解嵌套的代碼塊∵罅洌花括號(hào)幫助新人拆解所有的嵌套兼砖。
有些人想努力推廣他們自己的語(yǔ)言,在大多數(shù)情況下既棺,他們心愛(ài)的語(yǔ)言更自由讽挟,并沒(méi)有像java那么多的限制和規(guī)則。他們有一個(gè)非常好的想法丸冕,但是他們忽略了這么一個(gè)事實(shí)耽梅,就是越簡(jiǎn)單,越干凈的語(yǔ)法會(huì)在后期開(kāi)發(fā)中出現(xiàn)明顯的問(wèn)題晨仑。一些人覺(jué)得這種“穿個(gè)背帶褲又要系皮帶”方式讓人窒息褐墅,但是java在一開(kāi)始就推動(dòng)更好的編程習(xí)慣。當(dāng)新手經(jīng)過(guò)好的訓(xùn)練后洪己,他們就可以處理這種自由和危險(xiǎn)的編程方式了妥凳。
Java持續(xù)占據(jù)主導(dǎo)地位的關(guān)鍵原因,第4位:跨平臺(tái)兼容性(已經(jīng)很接近了)
雖然Java并不是第一個(gè)提供跨平臺(tái)兼容能力的語(yǔ)言答捕,但是Java已經(jīng)成為最受歡迎的(跨平臺(tái)語(yǔ)言)逝钥。這并不是說(shuō)Java是完美的——缺少的一個(gè)庫(kù)或者一個(gè)版本不匹配的庫(kù)都會(huì)導(dǎo)致程序崩潰。你也不能把使用最新的JRE 1.7編譯的需要使用大量?jī)?nèi)存的桌面程序放到一臺(tái)Java ME手機(jī)上運(yùn)行拱镐。Java并不是那么兼容艘款。
但是Sun以及現(xiàn)在的Oracle已經(jīng)為程序可以跨平臺(tái)使用做了最大的努力。當(dāng)程序(不能在多個(gè)平臺(tái)上)使用時(shí)沃琅,(導(dǎo)致這些問(wèn)題的)原因通常是可以弄懂的哗咆。如果你使用合適的Java版本,并且確保有足夠的內(nèi)存益眉,那么晌柬,(程序)一般可以正常工作。Java程序員可以使用他們的桌面開(kāi)發(fā)工具進(jìn)行編碼郭脂,并部署到目標(biāo)設(shè)備年碘,可能是一臺(tái)手機(jī)或者一臺(tái)服務(wù)器。如果編譯器包含了正確的庫(kù)并且使用了正確的版本展鸡,代碼就可以運(yùn)行屿衅。這是一個(gè)很可貴的(特性)。
Java持續(xù)占據(jù)主導(dǎo)地位的關(guān)鍵原因莹弊,第5位:在小芯片上的持續(xù)成功
Java也許從沒(méi)有在桌面領(lǐng)域造就過(guò)大型的應(yīng)用程序涤久,但它卻在移動(dòng)世界中找到了一片溫床 —— 這是一個(gè)爆發(fā)了的細(xì)分市場(chǎng)涡尘。Android平臺(tái)從上到下都是基于Java構(gòu)建起來(lái)的,并且它如今的銷量輕易的超過(guò)了iPhone响迂。
這一霸主地位并不是新晉的悟衩。JAVA ME作為精簡(jiǎn)版的語(yǔ)言和VM已經(jīng)被廣泛應(yīng)用在許多所謂功能手機(jī)之上,那些智能手機(jī)在全世界的數(shù)量也幾乎數(shù)以百億計(jì)栓拜。
當(dāng)你將它們都混合到一起,Java的優(yōu)勢(shì)是就是驚人的惠昔。
Java持續(xù)占據(jù)主導(dǎo)地位的關(guān)鍵原因幕与,第6位:藍(lán)光(Blu-ray)
Java曾經(jīng)被稱為“Oak”,是為機(jī)頂盒而設(shè)計(jì)的語(yǔ)言镇防,Sun想在占據(jù)此市場(chǎng)啦鸣。事情沒(méi)有完全按照計(jì)劃發(fā)展,但是Java卻在“客廳”中找到了合適的位置来氧。藍(lán)光標(biāo)準(zhǔn)是圍繞Java建立的诫给,任何想在藍(lán)光光碟中添加額外內(nèi)容的人,必須得到其Javac編譯器版本啦扬。
藍(lán)光光碟不止限于存放視頻內(nèi)容中狂。那些額外特性和交互工具可以使用純Java代碼修改并增強(qiáng)。藍(lán)光光碟是壓縮后的視頻和壓縮后的Java字節(jié)碼的混合扑毡。使用藍(lán)光標(biāo)準(zhǔn)胃榕,你可以實(shí)現(xiàn)不少功能。
Java持續(xù)占據(jù)主導(dǎo)地位的關(guān)鍵原因瞄摊,第7位:花括號(hào)正好能工作
那些像Ruby勋又、Python或CoffeeScript等時(shí)髦語(yǔ)言的愛(ài)好者們開(kāi)心的蔑視Java(和C)是怎樣的要求程序員們反復(fù)敲打花括號(hào)鍵來(lái)明確表達(dá)代碼段的開(kāi)始和結(jié)束。括號(hào)换帜、花括號(hào)楔壤、甚至方括號(hào)——都是這些人深惡痛絕的。(我本人也非常討厭它們惯驼,但我仍然懷念有一些類型的Lisp語(yǔ)言讓你使用一個(gè)方括號(hào)結(jié)束所有內(nèi)容的編程方式蹲嚣。)
但是改變標(biāo)點(diǎn)符號(hào)并不能消除復(fù)雜性。如果有用跳座,它也只是隱藏或者掩飾了復(fù)雜性端铛。使用像制表符等空白后你只能用直覺(jué)去感受那些無(wú)法看到的東西。如果if語(yǔ)句只引導(dǎo)了一行代碼疲眷,這樣不會(huì)有問(wèn)題禾蚕,但是當(dāng)很多層嵌套時(shí),就很難看明白狂丝。當(dāng)我用Python編程時(shí)换淆,我發(fā)現(xiàn)自己在反復(fù)數(shù)這些縮進(jìn)哗总。只是因?yàn)檫@樣看起來(lái)像英文,并不意味著它像理解一句英文那么簡(jiǎn)單倍试。
Java持續(xù)占據(jù)主導(dǎo)地位的原因讯屈,第8位:Groovy
假如Java開(kāi)發(fā)者必須要有一個(gè)帶有動(dòng)態(tài)類型的更清潔更簡(jiǎn)單的語(yǔ)法,他們沒(méi)必要去運(yùn)行一種新奇的語(yǔ)言县习。他們可以使用Groovy涮母,一個(gè)帶有預(yù)處理器的整潔的利器,它能夠生成出Java字節(jié)碼來(lái)躁愿。這種語(yǔ)言也完全集成到了Java中叛本,因此你可以在你的Groovy中混入對(duì)Java庫(kù)的調(diào)用。就像是編寫(xiě)Java代碼的縮略形式彤钟。
這一靈活性讓開(kāi)發(fā)工程師得以找到問(wèn)題的出路来候。當(dāng)然Groovy是慢——這通常是在使用了動(dòng)態(tài)方法調(diào)用的時(shí)候 —— 開(kāi)發(fā)者可以一直用Java來(lái)重寫(xiě)重要的費(fèi)時(shí)的核心操作。
Java持續(xù)占據(jù)主導(dǎo)地位的原因逸雹,第9位:Java虛擬機(jī)
Java虛擬機(jī)是按照運(yùn)行Javac編譯器產(chǎn)生的那些代碼來(lái)的目的來(lái)設(shè)計(jì)和優(yōu)化的营搅,但是某個(gè)時(shí)候開(kāi)始,開(kāi)發(fā)者們意識(shí)到Java虛擬機(jī)也可以運(yùn)行其他代碼梆砸。只要編譯器們產(chǎn)出標(biāo)準(zhǔn)的Java字節(jié)碼转质,Java虛擬機(jī)根本不關(guān)心是使用的那種編程語(yǔ)言。Haskell辫樱、Scala和Clojure的開(kāi)發(fā)者們按這個(gè)方式設(shè)計(jì)他們的編譯器搭上了Java這趟快車峭拘。而且他們只是這個(gè)由Java虛擬機(jī)產(chǎn)生的生態(tài)圈中幾個(gè)比較優(yōu)秀的代表。
吸引力是顯而易見(jiàn)的狮暑,Sun/Oracle為創(chuàng)建跨平臺(tái)環(huán)境而努力鸡挠,所有其它人從中受益。Sun/Oracle的工程師們消除平臺(tái)間差異搬男,并考慮兼容性問(wèn)題拣展,然后所有人可以運(yùn)行他們想運(yùn)行的程序。
微軟在創(chuàng)建C#時(shí)借用(并擴(kuò)展)了這個(gè)創(chuàng)意缔逛,為大部分主要語(yǔ)言設(shè)計(jì)了編譯器备埃,這樣C#虛擬機(jī)就可以運(yùn)行這些語(yǔ)言編寫(xiě)的所有程序。C#程序員說(shuō)他們可以用很多不同的語(yǔ)言編寫(xiě)程序褐奴,只要通過(guò)一個(gè)Windows盒子將其運(yùn)行在一個(gè)虛擬機(jī)上即可按脚。何等靈活!
Java持續(xù)占據(jù)主導(dǎo)地位的原因敦冬,第10位:NoSQL革命很大部分建立在Java之上
很久之前辅搬,數(shù)據(jù)庫(kù)是一個(gè)神秘的黑盒子,它保存信息并快速有效的應(yīng)對(duì)查詢請(qǐng)求脖旱。然后NoSQL革命來(lái)臨堪遂,程序員們意識(shí)到他們可以自己編寫(xiě)自己的數(shù)據(jù)庫(kù)介蛉,并根據(jù)需求修剪其代碼。那些最重要的NoSQL工具中很多都是用Java編寫(xiě)的溶褪。Cassandra币旧、Lucene、ElasticSearch猿妈、HBase和Neo4J只是一些經(jīng)常提到的NoSQL選擇吹菱。然后還有一些像acid-state等程序,使用Haskell編寫(xiě)并運(yùn)行在Java虛擬機(jī)中彭则。
這些工具通常是開(kāi)源的毁葱,可以方便的集成。一些開(kāi)發(fā)者將其獨(dú)立運(yùn)行贰剥,另一些人將它們集成在自己的模塊比如庫(kù)中。不論哪種方式筷频,Java在數(shù)據(jù)庫(kù)層中成為通用語(yǔ)言的情況蚌成,保證了Java開(kāi)發(fā)者們的生活更簡(jiǎn)單了些。 他們更少擔(dān)心由于字符編碼和行結(jié)束符帶來(lái)的小故障凛捏。這意味著Java開(kāi)發(fā)者們可以享受由NoSQL革命帶來(lái)的豐碩果實(shí)担忧。
Java持續(xù)占據(jù)主導(dǎo)地位的原因,第11位:Minecraft游戲融入00后們的共同情結(jié)中
也許布魯克林時(shí)尚的非主流們對(duì)Java嗤之以鼻坯癣,但是Java程序員們卻領(lǐng)先一步瓶盛。在Ruby時(shí)尚團(tuán)正聚集起自己的一群粉絲時(shí),他們之后的一代人卻愛(ài)上了Java示罗。為什么惩猫?一個(gè)詞:Minecraft。它用Java編寫(xiě)而成蚜点。如果孩子們想要擴(kuò)展該游戲轧房,他們就需要學(xué)習(xí)Java來(lái)設(shè)計(jì)其插件。這保證下一代程序員第一個(gè)學(xué)習(xí)的是Java绍绘。
Java持續(xù)占據(jù)主導(dǎo)地位的原因奶镶,第12位:開(kāi)源
Sun一直是開(kāi)源領(lǐng)域中的領(lǐng)導(dǎo)者之一,但它卻在完全開(kāi)放Java的過(guò)程中時(shí)有猶豫陪拘。但這并沒(méi)有妨礙Java程序員們發(fā)布很多偉大的有著寬松開(kāi)源許可的庫(kù)和項(xiàng)目厂镇。Apache項(xiàng)目一直都在使用一個(gè)沒(méi)要求太多回報(bào)的許可證來(lái)提供優(yōu)秀的Java代碼。
Sun在2007年完成了在GPL許可下公開(kāi)大部分代碼的工作左刽,從那時(shí)開(kāi)始捺信,它和它之后的新主人Oracle想努力成為它認(rèn)為的Java的合格管家。當(dāng)然悠反,這種開(kāi)放的立場(chǎng)并沒(méi)有阻止Oracle將Google拖入一場(chǎng)混亂的法律訴訟中残黑,但是另一方面馍佑,Java平臺(tái)很大程度是開(kāi)放和免費(fèi)的。
討厭它的人很多梨水,但Java持續(xù)前行
的確Java有它自己的問(wèn)題拭荤,而且討厭的Java人們也會(huì)越來(lái)越多, 并將他們的不滿情緒充斥在線上評(píng)論區(qū)中疫诽。Java垃圾回收器會(huì)引起程序的小抽風(fēng)舅世。程序書(shū)寫(xiě)規(guī)則繁重,也并不能阻止那些確實(shí)差勁的代碼奇徒。注解(譯注:annotation)太復(fù)雜雏亚。各個(gè)特性也不如之前演進(jìn)的頻繁∧Ω疲花括號(hào)增加混亂罢低。其缺點(diǎn)列表很長(zhǎng),但是通常是合情理的胖笛。
然而目前還沒(méi)有出現(xiàn)一個(gè)廣度和深度上可與之競(jìng)爭(zhēng)的對(duì)手网持。雖然一些抱怨很容易解決,但是解決方案本身會(huì)帶來(lái)自己的問(wèn)題长踊。最接近的也許是JavaScript功舀,依靠有閃電般速度的Node.js,它在服務(wù)器領(lǐng)域越來(lái)越有吸引力身弊。不過(guò)這些創(chuàng)意可以被復(fù)制辟汰,程序員們也可以用其來(lái)編寫(xiě)快速的Java。
在最后阱佛,這是Java的優(yōu)勢(shì)之一:它運(yùn)行所有程序帖汞,而且接受改變。如果你需要不同的功能凑术,你可以將大部分庫(kù)替換成自己的代碼涨冀。語(yǔ)言是開(kāi)源的而且靈活多變。不論語(yǔ)言和平臺(tái)有什么限制麦萤,都可以相對(duì)輕松的解決鹿鳖。這意味著Java程序員繼續(xù)是最具生產(chǎn)力的人員之一。即使相關(guān)圖書(shū)不在能再占據(jù)暢銷榜壮莹,軟件更新也沒(méi)之前頻繁翅帜,Java將依然存在甚至更加興旺。
歡迎添加小編的Java學(xué)習(xí)群命满,不管你是小白還是大牛涝滴,小編我都?xì)g迎,不定期分享干貨,包括小編自己整理的一份2019年最新的Java資料和0基礎(chǔ)入門教程視頻歼疮,歡迎初學(xué)和進(jìn)階中的小伙伴杂抽。在不忙的時(shí)間我會(huì)給大家解惑
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!