Java 中為什么不全部使用 Static 方法玄糟?

前陣子在知乎上看到這個(gè)問(wèn)題,一開(kāi)始覺(jué)得還挺無(wú)厘頭的袄秩,但細(xì)細(xì)一想?yún)s發(fā)覺(jué)這里面很考驗(yàn)對(duì)語(yǔ)言的理解阵翎。于是寫(xiě)下了我的理解,今天把回答搬運(yùn)到這里之剧,與大家一起分享郭卫。

這個(gè)問(wèn)題看起來(lái)有點(diǎn)無(wú)厘頭,但仔細(xì)想想?yún)s非潮臣冢考驗(yàn)答主對(duì) Java 這門(mén)語(yǔ)言的理解箱沦。如果沒(méi)有什么 Java 開(kāi)發(fā)經(jīng)驗(yàn),那估計(jì)是想不出所以然來(lái)的雇庙。作為一個(gè)工作了 8 年谓形,寫(xiě)了 12 年 Java 代碼的研發(fā)老兵,我來(lái)簡(jiǎn)單聊聊這個(gè)問(wèn)題疆前。

題目說(shuō)的是為什么不全部使用 static 方法寒跳?

我們嘗試著想想:如果全部用 static 方法,世界會(huì)是怎樣竹椒?

舉個(gè)簡(jiǎn)單的例子童太,我們有一個(gè)汽車(chē)相關(guān)的程序,每種不同的汽車(chē)的喇叭聲音不一樣胸完。那如果全部用 static 方法來(lái)實(shí)現(xiàn)书释,那么結(jié)果是這樣的:

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class Car {
    public static String benzBee(){
        //奔馳的喇叭聲
    }
    public static String bydBee(){
        //比亞迪的喇叭聲
    }
    // 其他汽車(chē)的喇叭聲
}</pre>

如上面所示,每當(dāng)有一個(gè)汽車(chē)的時(shí)候赊窥,我們都需要新增一個(gè)方法爆惧,來(lái)表示這種汽車(chē)的喇叭聲。如果我們要實(shí)現(xiàn)啟動(dòng)汽車(chē)這個(gè)邏輯锨能,在所有方法都用 static 來(lái)實(shí)現(xiàn)的情況下扯再,其整體邏輯為:

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class StartCar {
    // 1\. 插入鑰匙
    public static void enterKey(){

    }
   // 2\. 通電啟動(dòng)
    public static void start(){

    }
   // 3\. 放剎車(chē)
    public static void releaseBrake(){

    }
    // 4\. 踩油門(mén)
    public static void stepGas(){

    }

    public static void main(){
        enterKey();
        start();
        releaseBrake();
        stepGas();
    }
}</pre>

這樣貌似也是可以實(shí)現(xiàn)的芍耘,但不知道你有沒(méi)有發(fā)現(xiàn),這樣其實(shí)就是一種「面向過(guò)程」的編程方式了熄阻。所謂面向過(guò)程的編程方式斋竞,指的是以事件為中心的編程方式,編程的時(shí)候把解決問(wèn)題的步驟分析出來(lái)秃殉,然后用函數(shù)把這些步驟實(shí)現(xiàn)坝初,在一步一步的具體步驟中再按順序調(diào)用函數(shù)。

如果你有使用過(guò)其他腳本語(yǔ)言的話(huà)钾军,你會(huì)發(fā)現(xiàn)我們?cè)趯?xiě)腳本的時(shí)候脖卖,都是用這種「面向過(guò)程」的編程方式寫(xiě)的。首先巧颈,我們做啥畦木,接著做啥,最后做啥砸泛。

「面向過(guò)程」這種編程方式十籍,有兩個(gè)優(yōu)點(diǎn):

  • 流程化使得編程任務(wù)明確,在開(kāi)發(fā)之前基本考慮了實(shí)現(xiàn)方式和最終結(jié)果唇礁,具體步驟清楚勾栗,便于節(jié)點(diǎn)分析。
  • 效率高盏筐,面向過(guò)程強(qiáng)調(diào)代碼的短小精悍围俘,善于結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)開(kāi)發(fā)高效率的程序。

但是它也有缺點(diǎn):需要深入的思考琢融,耗費(fèi)精力界牡,代碼重用性低,擴(kuò)展能力差漾抬,后期維護(hù)難度比較大宿亡。但 Java 是面向?qū)ο蟮恼Z(yǔ)言,其設(shè)計(jì)之初就是用來(lái)以「面相對(duì)象」的編程方式寫(xiě)代碼的纳令。

所以如果你要問(wèn):Java 中的方法是否可以全部使用 static 方法挽荠?答案是:可以,但是沒(méi)必要平绩,或者說(shuō)不合適圈匆。因?yàn)?Java 就是為面向?qū)ο蠖坑?static 方法寫(xiě)不符合「面向?qū)ο蟆沟木幊谭绞健?/p>

那么什么是面向?qū)ο竽兀?/p>

世界上有很多人和事物捏雌,每一個(gè)都可以看做一個(gè)對(duì)象跃赚,而每個(gè)對(duì)象都有自己的屬性和行為,對(duì)象與對(duì)象之間通過(guò)方法來(lái)交互腹忽。面向?qū)ο笫且环N以「對(duì)象」為中心的編程思想来累,把要解決的問(wèn)題分解成各個(gè)對(duì)象砚作,建立對(duì)象的目的不是為了完成一個(gè)步驟窘奏,而是為了描敘某個(gè)對(duì)象在整個(gè)解決問(wèn)題的步驟中的屬性和行為嘹锁。

例如對(duì)于啟動(dòng)汽車(chē)這件事情,以面向?qū)ο蟮姆绞饺ゾ帉?xiě)着裹,那么就會(huì)有汽車(chē)领猾、輪胎、發(fā)動(dòng)機(jī)骇扇、鑰匙等對(duì)象摔竿,然后對(duì)象之間有對(duì)應(yīng)的屬性,然后有對(duì)應(yīng)的動(dòng)作少孝。

面向?qū)ο蟮膬?yōu)點(diǎn)是:

  • 結(jié)構(gòu)清晰继低,程序是模塊化和結(jié)構(gòu)化,更加符合人類(lèi)的思維方式稍走。
  • 易擴(kuò)展袁翁,代碼重用率高,可繼承婿脸,可覆蓋粱胜,可以設(shè)計(jì)出低耦合的系統(tǒng)。
  • 易維護(hù)狐树,系統(tǒng)低耦合的特點(diǎn)有利于減少程序的后期維護(hù)工作量焙压。

面向?qū)ο蟮娜秉c(diǎn)是:

  • 開(kāi)銷(xiāo)大,當(dāng)要修改對(duì)象內(nèi)部時(shí)抑钟,對(duì)象的屬性不允許外部直接存取涯曲,所以要增加許多沒(méi)有其他意義、只負(fù)責(zé)讀或?qū)懙男袨樵谒_@會(huì)為編程工作增加負(fù)擔(dān)掀抹,增加運(yùn)行開(kāi)銷(xiāo),并且使程序顯得臃腫心俗。
  • 性能低傲武,由于面向更高的邏輯抽象層,使得面向?qū)ο笤趯?shí)現(xiàn)的時(shí)候城榛,不得不做出性能上面的犧牲揪利,計(jì)算時(shí)間和空間存儲(chǔ)大小都開(kāi)銷(xiāo)很大。

那么什么時(shí)候用面向?qū)ο蠛莩郑裁磿r(shí)候用面向過(guò)程呢疟位?

在日常生活或編程中,簡(jiǎn)單的問(wèn)題可以用面向過(guò)程的思路來(lái)解決喘垂,直接有效甜刻。但是當(dāng)問(wèn)題的規(guī)模變得更大時(shí)绍撞,用面向過(guò)程的思想是遠(yuǎn)遠(yuǎn)不夠的。所以慢慢就出現(xiàn)了面向?qū)ο蟮木幊趟枷搿?/p>

最后我們總結(jié)一下:在 Java 中不全部用 static 方法得院,主要原因是這種編程方式傻铣,不符合「面向?qū)ο蟆沟木幊趟悸罚且环N「面向過(guò)程」的編程思路祥绞,而 Java 是為面向?qū)ο蠖恼Z(yǔ)言非洲。因此,在 Java 語(yǔ)言中這么做蜕径,就像去用鐵鏟子去舀湯 —— 可以是可以两踏,但就是費(fèi)勁。

而面向?qū)ο蠖涤鳎诜浅?fù)雜的系統(tǒng)面前梦染,還是非常有價(jià)值的。大家都知道朴皆,很多電商系統(tǒng)基本都用 Java 開(kāi)發(fā)帕识,這也體現(xiàn)出了面向?qū)ο笏季S的重要性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末车荔,一起剝皮案震驚了整個(gè)濱河市渡冻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忧便,老刑警劉巖族吻,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異珠增,居然都是意外死亡超歌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)蒂教,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巍举,“玉大人,你說(shuō)我怎么就攤上這事凝垛“妹酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵梦皮,是天一觀的道長(zhǎng)炭分。 經(jīng)常有香客問(wèn)我,道長(zhǎng)剑肯,這世上最難降的妖魔是什么捧毛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上呀忧,老公的妹妹穿的比我還像新娘师痕。我一直安慰自己,他們只是感情好而账,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布胰坟。 她就那樣靜靜地躺著,像睡著了一般福扬。 火紅的嫁衣襯著肌膚如雪腕铸。 梳的紋絲不亂的頭發(fā)上惜犀,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天铛碑,我揣著相機(jī)與錄音,去河邊找鬼虽界。 笑死汽烦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莉御。 我是一名探鬼主播撇吞,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼礁叔!你這毒婦竟也來(lái)了牍颈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤琅关,失蹤者是張志新(化名)和其女友劉穎煮岁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體涣易,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡画机,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了新症。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片步氏。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徒爹,靈堂內(nèi)的尸體忽然破棺而出荚醒,到底是詐尸還是另有隱情,我是刑警寧澤隆嗅,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布界阁,位于F島的核電站,受9級(jí)特大地震影響榛瓮,放射性物質(zhì)發(fā)生泄漏铺董。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望精续。 院中可真熱鬧坝锰,春花似錦、人聲如沸重付。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)确垫。三九已至弓颈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間删掀,已是汗流浹背翔冀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留披泪,地道東北人纤子。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像款票,于是被迫代替她去往敵國(guó)和親控硼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容