Java?中不全部使用?Static?方法的理由
前陣子在知乎上看到這個(gè)問(wèn)題,一開始覺得還挺無(wú)厘頭的,但細(xì)細(xì)一想?yún)s發(fā)覺這里面很考驗(yàn)對(duì)語(yǔ)言的理解。于是寫下了我的理解,今天把回答搬運(yùn)到這里,與大家一起分享。
這個(gè)問(wèn)題看起來(lái)有點(diǎn)無(wú)厘頭,但仔細(xì)想想?yún)s非??简?yàn)答主對(duì) Java 這門語(yǔ)言的理解。如果沒(méi)有什么 Java 開發(fā)經(jīng)驗(yàn),那估計(jì)是想不出所以然來(lái)的。作為一個(gè)工作了 8 年,寫了 12 年 Java 代碼的研發(fā)老兵,我來(lái)簡(jiǎn)單聊聊這個(gè)問(wèn)題。
題目說(shuō)的是為什么不全部使用 static 方法?
我們嘗試著想想:如果全部用 static 方法,世界會(huì)是怎樣?
舉個(gè)簡(jiǎn)單的例子,我們有一個(gè)汽車相關(guān)的程序,每種不同的汽車的喇叭聲音不一樣。那如果全部用 static 方法來(lái)實(shí)現(xiàn),那么結(jié)果是這樣的:
public class Car {
public static String benzBee(){
//奔馳的喇叭聲
}
public static String bydBee(){
//比亞迪的喇叭聲
}
// 其他汽車的喇叭聲
}如上面所示,每當(dāng)有一個(gè)汽車的時(shí)候,我們都需要新增一個(gè)方法,來(lái)表示這種汽車的喇叭聲。如果我們要實(shí)現(xiàn)啟動(dòng)汽車這個(gè)邏輯,在所有方法都用 static 來(lái)實(shí)現(xiàn)的情況下,其整體邏輯為:
public class StartCar {
// 1. 插入鑰匙
public static void enterKey(){
}
// 2. 通電啟動(dòng)
public static void start(){
}
// 3. 放剎車
public static void releaseBrake(){
}
// 4. 踩油門
public static void stepGas(){
}
public static void main(){
enterKey();
start();
releaseBrake();
stepGas();
}
}這樣貌似也是可以實(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ì)發(fā)現(xiàn)我們?cè)趯懩_本的時(shí)候,都是用這種「面向過(guò)程」的編程方式寫的。首先,我們做啥,接著做啥,最后做啥。
「面向過(guò)程」這種編程方式,有兩個(gè)優(yōu)點(diǎn):
- 流程化使得編程任務(wù)明確,在開發(fā)之前基本考慮了實(shí)現(xiàn)方式和最終結(jié)果,具體步驟清楚,便于節(jié)點(diǎn)分析。
- 效率高,面向過(guò)程強(qiáng)調(diào)代碼的短小精悍,善于結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)開發(fā)高效率的程序。
但是它也有缺點(diǎn):需要深入的思考,耗費(fèi)精力,代碼重用性低,擴(kuò)展能力差,后期維護(hù)難度比較大。但 Java 是面向?qū)ο蟮恼Z(yǔ)言,其設(shè)計(jì)之初就是用來(lái)以「面相對(duì)象」的編程方式寫代碼的。
所以如果你要問(wèn):Java 中的方法是否可以全部使用 static 方法?答案是:可以,但是沒(méi)必要,或者說(shuō)不合適。因?yàn)?Java 就是為面向?qū)ο蠖坑?static 方法寫不符合「面向?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)汽車這件事情,以面向?qū)ο蟮姆绞饺ゾ帉?,那么就?huì)有汽車、輪胎、發(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)化,更加符合人類的思維方式。
- 易擴(kuò)展,代碼重用率高,可繼承,可覆蓋,可以設(shè)計(jì)出低耦合的系統(tǒng)。
- 易維護(hù),系統(tǒng)低耦合的特點(diǎn)有利于減少程序的后期維護(hù)工作量。
面向?qū)ο蟮娜秉c(diǎn)是:
- 開銷大,當(dāng)要修改對(duì)象內(nèi)部時(shí),對(duì)象的屬性不允許外部直接存取,所以要增加許多沒(méi)有其他意義、只負(fù)責(zé)讀或?qū)懙男袨?。這會(huì)為編程工作增加負(fù)擔(dān),增加運(yùn)行開銷,并且使程序顯得臃腫。
- 性能低,由于面向更高的邏輯抽象層,使得面向?qū)ο笤趯?shí)現(xiàn)的時(shí)候,不得不做出性能上面的犧牲,計(jì)算時(shí)間和空間存儲(chǔ)大小都開銷很大。
那么什么時(shí)候用面向?qū)ο?,什么時(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ū)ο蟆沟木幊趟悸?,而是一種「面向過(guò)程」的編程思路,而 Java 是為面向?qū)ο蠖恼Z(yǔ)言。因此,在 Java 語(yǔ)言中這么做,就像去用鐵鏟子去舀湯 —— 可以是可以,但就是費(fèi)勁。
而面向?qū)ο?,在非常?fù)雜的系統(tǒng)面前,還是非常有價(jià)值的。大家都知道,很多電商系統(tǒng)基本都用 Java 開發(fā),這也體現(xiàn)出了面向?qū)ο笏季S的重要性。
到此這篇關(guān)于Java 中不全部使用 Static 方法的理由的文章就介紹到這了,更多相關(guān)Java不全部使用 Static 方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMvc實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了SpringMvc實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Java關(guān)于List集合去重方案詳細(xì)介紹
實(shí)際項(xiàng)目開發(fā)中,很多業(yè)務(wù)場(chǎng)景下都會(huì)遇見集合去重。在說(shuō)到List集合去重之前,首先我們回顧下普通類型的list如何去重2021-09-09
Java中easypoi導(dǎo)入excel文件列名相同的處理方案
這篇文章主要介紹了Java中easypoi導(dǎo)入excel文件列名相同的處理方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java中BigDecimal序列化科學(xué)計(jì)數(shù)法前端展示問(wèn)題踩坑實(shí)戰(zhàn)
BigDecimal是處理高精度的浮點(diǎn)數(shù)運(yùn)算的常用的一個(gè)類當(dāng)需要將BigDecimal中保存的浮點(diǎn)數(shù)值打印出來(lái),這篇文章主要給大家介紹了關(guān)于Java中BigDecimal序列化科學(xué)計(jì)數(shù)法前端展示問(wèn)題踩坑的相關(guān)資料,需要的朋友可以參考下2024-04-04
JavaAgent實(shí)現(xiàn)http接口發(fā)布方式淺析
這篇文章主要介紹了JavaAgent實(shí)現(xiàn)http接口發(fā)布方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-03-03
Java IO流對(duì)象的序列化和反序列化實(shí)例詳解
這篇文章主要介紹了Java IO流對(duì)象的序列化和反序列化實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
java使用RandomAccessFile類基于指針讀寫文件實(shí)例代碼
這篇文章主要介紹了java使用RandomAccessFile類基于指針讀寫文件實(shí)例代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
Java解決前端數(shù)據(jù)處理及亂碼問(wèn)題
大伙們有沒(méi)有遇到數(shù)據(jù)亂碼的問(wèn)題,真的是讓人心情煩躁,今天就來(lái)教下大家數(shù)據(jù)怎么傳輸?shù)角岸艘约皝y碼問(wèn)題怎么解決的,需要的朋友可以參考一下2021-12-12

