Java?中不全部使用?Static?方法的理由
前陣子在知乎上看到這個問題,一開始覺得還挺無厘頭的,但細細一想?yún)s發(fā)覺這里面很考驗對語言的理解。于是寫下了我的理解,今天把回答搬運到這里,與大家一起分享。
這個問題看起來有點無厘頭,但仔細想想?yún)s非??简灤鹬鲗?Java 這門語言的理解。如果沒有什么 Java 開發(fā)經(jīng)驗,那估計是想不出所以然來的。作為一個工作了 8 年,寫了 12 年 Java 代碼的研發(fā)老兵,我來簡單聊聊這個問題。
題目說的是為什么不全部使用 static 方法?
我們嘗試著想想:如果全部用 static 方法,世界會是怎樣?
舉個簡單的例子,我們有一個汽車相關(guān)的程序,每種不同的汽車的喇叭聲音不一樣。那如果全部用 static 方法來實現(xiàn),那么結(jié)果是這樣的:
public class Car { public static String benzBee(){ //奔馳的喇叭聲 } public static String bydBee(){ //比亞迪的喇叭聲 } // 其他汽車的喇叭聲 }
如上面所示,每當有一個汽車的時候,我們都需要新增一個方法,來表示這種汽車的喇叭聲。如果我們要實現(xiàn)啟動汽車這個邏輯,在所有方法都用 static 來實現(xiàn)的情況下,其整體邏輯為:
public class StartCar { // 1. 插入鑰匙 public static void enterKey(){ } // 2. 通電啟動 public static void start(){ } // 3. 放剎車 public static void releaseBrake(){ } // 4. 踩油門 public static void stepGas(){ } public static void main(){ enterKey(); start(); releaseBrake(); stepGas(); } }
這樣貌似也是可以實現(xiàn)的,但不知道你有沒有發(fā)現(xiàn),這樣其實就是一種「面向過程」的編程方式了。所謂面向過程的編程方式,指的是以事件為中心的編程方式,編程的時候把解決問題的步驟分析出來,然后用函數(shù)把這些步驟實現(xiàn),在一步一步的具體步驟中再按順序調(diào)用函數(shù)。
如果你有使用過其他腳本語言的話,你會發(fā)現(xiàn)我們在寫腳本的時候,都是用這種「面向過程」的編程方式寫的。首先,我們做啥,接著做啥,最后做啥。
「面向過程」這種編程方式,有兩個優(yōu)點:
- 流程化使得編程任務(wù)明確,在開發(fā)之前基本考慮了實現(xiàn)方式和最終結(jié)果,具體步驟清楚,便于節(jié)點分析。
- 效率高,面向過程強調(diào)代碼的短小精悍,善于結(jié)合數(shù)據(jù)結(jié)構(gòu)來開發(fā)高效率的程序。
但是它也有缺點:需要深入的思考,耗費精力,代碼重用性低,擴展能力差,后期維護難度比較大。但 Java 是面向?qū)ο蟮恼Z言,其設(shè)計之初就是用來以「面相對象」的編程方式寫代碼的。
所以如果你要問:Java 中的方法是否可以全部使用 static 方法?答案是:可以,但是沒必要,或者說不合適。因為 Java 就是為面向?qū)ο蠖坑?static 方法寫不符合「面向?qū)ο蟆沟木幊谭绞健?/p>
那么什么是面向?qū)ο竽兀?/p>
世界上有很多人和事物,每一個都可以看做一個對象,而每個對象都有自己的屬性和行為,對象與對象之間通過方法來交互。面向?qū)ο笫且环N以「對象」為中心的編程思想,把要解決的問題分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個對象在整個解決問題的步驟中的屬性和行為。
例如對于啟動汽車這件事情,以面向?qū)ο蟮姆绞饺ゾ帉?,那么就會有汽車、輪胎、發(fā)動機、鑰匙等對象,然后對象之間有對應的屬性,然后有對應的動作。
面向?qū)ο蟮膬?yōu)點是:
- 結(jié)構(gòu)清晰,程序是模塊化和結(jié)構(gòu)化,更加符合人類的思維方式。
- 易擴展,代碼重用率高,可繼承,可覆蓋,可以設(shè)計出低耦合的系統(tǒng)。
- 易維護,系統(tǒng)低耦合的特點有利于減少程序的后期維護工作量。
面向?qū)ο蟮娜秉c是:
- 開銷大,當要修改對象內(nèi)部時,對象的屬性不允許外部直接存取,所以要增加許多沒有其他意義、只負責讀或?qū)懙男袨?。這會為編程工作增加負擔,增加運行開銷,并且使程序顯得臃腫。
- 性能低,由于面向更高的邏輯抽象層,使得面向?qū)ο笤趯崿F(xiàn)的時候,不得不做出性能上面的犧牲,計算時間和空間存儲大小都開銷很大。
那么什么時候用面向?qū)ο?,什么時候用面向過程呢?
在日常生活或編程中,簡單的問題可以用面向過程的思路來解決,直接有效。但是當問題的規(guī)模變得更大時,用面向過程的思想是遠遠不夠的。所以慢慢就出現(xiàn)了面向?qū)ο蟮木幊趟枷搿?/p>
最后我們總結(jié)一下:在 Java 中不全部用 static 方法,主要原因是這種編程方式,不符合「面向?qū)ο蟆沟木幊趟悸?,而是一種「面向過程」的編程思路,而 Java 是為面向?qū)ο蠖恼Z言。因此,在 Java 語言中這么做,就像去用鐵鏟子去舀湯 —— 可以是可以,但就是費勁。
而面向?qū)ο螅诜浅碗s的系統(tǒng)面前,還是非常有價值的。大家都知道,很多電商系統(tǒng)基本都用 Java 開發(fā),這也體現(xiàn)出了面向?qū)ο笏季S的重要性。
到此這篇關(guān)于Java 中不全部使用 Static 方法的理由的文章就介紹到這了,更多相關(guān)Java不全部使用 Static 方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA8 stream中三個參數(shù)的reduce方法對List進行分組統(tǒng)計操作
這篇文章主要介紹了JAVA8 stream中三個參數(shù)的reduce方法對List進行分組統(tǒng)計操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08