Java零基礎(chǔ)快速入門|方法(上)

本篇文章主要內(nèi)容:
方法的本質(zhì)以及作用
方法的定義以及調(diào)用
方法返回值詳解
棧數(shù)據(jù)結(jié)構(gòu)
方法執(zhí)行過程中內(nèi)存的變化
學(xué)習(xí)目標(biāo)
理解方法的本質(zhì)以及作用;掌握方法的定義;掌握方法如何調(diào)用;理解棧數(shù)據(jù)結(jié)構(gòu);理解方法執(zhí)行過程中內(nèi)存是如何變化的;掌握方法的重載機(jī)制;掌握方法遞歸算法。
?知識(shí)框架

方法的本質(zhì)以及作用
我們先不講方法是什么,先來看一段代碼,分析以下程序存在哪些缺點(diǎn),應(yīng)該如何去改進(jìn):

以上代碼完成了三個(gè)求和的功能,每一次求和的時(shí)候都把代碼重新寫了一遍,顯然代碼沒有得到 “重復(fù)利用”,表面上看是三個(gè)功能,但實(shí)際上只是“一個(gè)”求和功能,只不過每一次參與求和的實(shí) 際數(shù)值不同。java 中有沒有一種方式或者語法,能讓我們把功能性代碼寫一次,然后給這個(gè)功能性代碼傳遞不同的數(shù)據(jù),來完成對(duì)應(yīng)的功能呢?
答案是:當(dāng)然有。這就需要我們掌握 java 語言中的方法機(jī)制,接下來大家看看改進(jìn)之后的代碼(這里先不需要掌握方法是怎么定義的以及怎么調(diào)用的,只要看 以下代碼就行,此小節(jié)是為了讓大家理解方法的本質(zhì)以及作用):

運(yùn)行結(jié)果如下圖所示:

通過以上程序我們可以看出,其實(shí)方法也沒什么神秘的,方法其實(shí)就是一段普通的代碼片段,并且這段代碼可以完成某個(gè)特定的功能,而且可以被重復(fù)的調(diào)用/使用。java??中的方法又叫做method,在C 語言中叫做函數(shù)。
從現(xiàn)在開始大家以后在寫代碼的時(shí)候就要有定義方法的意識(shí)了,只要是可以獨(dú)立出來的功能,我們都可以定義為單獨(dú)的一個(gè)方法來完成,如果以后需要使用此功能時(shí)直接調(diào)用這個(gè)方法就行了,不要把所有的代碼都扔到main 方法當(dāng)中,這樣會(huì)導(dǎo)致程序的“復(fù)用性”很差。
?
方法的定義以及調(diào)用
通過以上內(nèi)容的學(xué)習(xí),可以看出方法是一段可以完成某個(gè)特定功能的并且可以被重復(fù)利用的代碼片段。接下來我們來學(xué)習(xí)一下方法應(yīng)該怎么定義以及怎么調(diào)用。
定義/聲明方法的語法格式如下所示:


接下來我將列出方法的相關(guān)規(guī)則,其中一些規(guī)則目前可能需要大家死記硬背,還有一些規(guī)則希望大家在理解的前提下進(jìn)行記憶:
[修飾符列表],此項(xiàng)是可選項(xiàng),不是必須的,目前大家統(tǒng)一寫成public?static,后面的課程會(huì)詳細(xì)講解。
返回值類型,此項(xiàng)可以是 java?語言當(dāng)中任何一種數(shù)據(jù)類型,包括基本數(shù)據(jù)類型,也包括所有的引用數(shù)據(jù)類型,當(dāng)然,如果一個(gè)方法執(zhí)行結(jié)束之后不準(zhǔn)備返回任何數(shù)據(jù),則返回值類型必須寫 void。返回值類型例如:byte,short,int,long,float,double,boolean,char,String,void 等。
方法名,此項(xiàng)需要是合法的標(biāo)識(shí)符,開發(fā)規(guī)范中要求方法名首字母小寫,后面每個(gè)單詞首字母大寫,遵循駝峰命名方式,見名知意,例如:login、getUsername、findAllUser????等。
形式參數(shù)列表(int?a, int?b),此項(xiàng)又被稱為形參,其實(shí)每一個(gè)形參都是“局部變量”, 形參的個(gè)數(shù)為 0~N?個(gè),如果是多個(gè)參數(shù),則采用半角“,”進(jìn)行分隔,形參中起決定性作用的是參數(shù)的數(shù)據(jù)類型,參數(shù)名就是變量名,變量名是可以修改的,也就是說(int?a?, int?b)也可以寫成(int?x?, int?y)。
方法體,由一對(duì)兒大括號(hào)括起來,在形參的后面,這個(gè)大括號(hào)當(dāng)中的是實(shí)現(xiàn)功能的核 心代碼,方法體由java?語句構(gòu)成,方法體當(dāng)中的代碼只能遵循自上而下的順序依次逐行執(zhí)行, 不能跳行執(zhí)行,核心代碼在執(zhí)行過程中如果需要外部提供數(shù)據(jù),則通過形參進(jìn)行獲取。
整體來說方法的聲明語法是很簡(jiǎn)單的,我相信每個(gè)人都能記住,其實(shí)我覺得方法的定義難度最大的不是語法,而是方法在定義的時(shí)候,返回值類型定為什么類型比較合適?方法的形式參數(shù)列表中定義幾個(gè)參數(shù)合適?每個(gè)參數(shù)的數(shù)據(jù)類型定義為什么比較合適?以上的一系列問題實(shí)際上還是需要和具體的功能結(jié)合在一起才能決定,當(dāng)然,這不是一天兩天的事兒,不是說這一章節(jié)的內(nèi)容學(xué)完之后就真正的會(huì)定義方法了,我們只能說語法會(huì)了,還需要后期不斷的做項(xiàng)目,寫代碼才能找到感覺,找到編程思路。到那時(shí),你自然就會(huì)定義返回值類型、形式參數(shù)列表了。
當(dāng)一個(gè)方法聲明之后,我們應(yīng)該如何去讓這個(gè)方法執(zhí)行呢,當(dāng)然,這個(gè)時(shí)候就需要親自去調(diào)用這個(gè)方法了,調(diào)用方法的語法格式是(前提是方法的修飾符列表中帶有static 關(guān)鍵字): “類名.方法名(實(shí)際參數(shù)列表);”,例如以下代碼:

運(yùn)行結(jié)果如下圖所示:

需要注意的是,方法在調(diào)用的時(shí)候,實(shí)際傳給這個(gè)方法的數(shù)據(jù)被稱為實(shí)際參數(shù)列表,簡(jiǎn)稱實(shí)參,java 語法中有這樣的規(guī)定:實(shí)參和形參必須一一對(duì)應(yīng),所謂的一一對(duì)應(yīng)就是,個(gè)數(shù)要一樣,數(shù)據(jù)類型要對(duì)應(yīng)相同。例如:實(shí)參(100?, 200)對(duì)應(yīng)的形參(int x?, int y),如果不是一一對(duì)應(yīng)則編譯器就會(huì)報(bào)錯(cuò)。當(dāng)然也可能會(huì)存在自動(dòng)類型轉(zhuǎn)換,例如:實(shí)參(100?, 200)也可以傳遞給這樣的形參(long?a?, long b),這里我們先不談這個(gè)。
實(shí)際上方法在調(diào)用的時(shí)候,有的情況下“類名.”是可以省略的,我們來看看什么情況下它可以省略不寫:


運(yùn)行結(jié)果如下圖所示:

通過以上程序的分析,我們得知,當(dāng)在 a()方法執(zhí)行過程中調(diào)用 b()方法的時(shí)候,并且 a()
方法和 b()方法在同一個(gè)類當(dāng)中,此時(shí)“類名.”可以省略不寫,但如果 a()方法和 b()方法不在同一個(gè)類當(dāng)中,“類名.”則不能省略。
?
方法返回值詳解
每個(gè)方法都是為了完成某個(gè)特定的功能,例如:登錄功能、求和功能等,既然是功能,那么當(dāng)這個(gè)功能完成之后,大多數(shù)情況下都會(huì)有一個(gè)結(jié)果的,比如,登錄成功了或者失敗了(true/false),求和之后最后的結(jié)果是100 或者 200,當(dāng)然也有極少數(shù)的情況下是沒有結(jié)果的。這個(gè)結(jié)果本質(zhì)上就是一個(gè)數(shù)據(jù),那么既然是一個(gè)數(shù)據(jù),就一定會(huì)有對(duì)應(yīng)的類型,所以在方法定 義的時(shí)候需要指定該方法的返回值類型。
java 語言中方法的返回值類型可以是任何一種數(shù)據(jù)類型,包括基本數(shù)據(jù)類型,也包括引用數(shù)據(jù)類型,例如:byte,short,int,long,float,double,boolean,char,String,Student(自定義類)等。當(dāng) 然,如果這個(gè)方法在執(zhí)行完之后不需要返回任何數(shù)據(jù),返回值類型必須寫 void 關(guān)鍵字,不能空著不寫。
關(guān)于方法的返回值在使用的時(shí)候有哪些注意事項(xiàng)呢,我們來看幾段代碼:

以上程序在編譯的時(shí)候,報(bào)錯(cuò)了,錯(cuò)誤信息是“缺少返回語句”,為什么呢?這是因?yàn)樵?/span>方法在聲明的時(shí)候指定了方法結(jié)束之后返回int 類型的數(shù)據(jù),但是以上方法體中并沒有編寫“返回?cái)?shù)據(jù)”的代碼。也就是說當(dāng)一個(gè)方法在聲明的時(shí)候返回值類型不是 void 的情況下,要求方法體中必須有負(fù)責(zé)“返回?cái)?shù)據(jù)”的語句。這樣的語句怎么寫呢?
答案是:“return??數(shù)據(jù);”(大家還記得第六章節(jié)控制語句中的返回語句嗎?這個(gè)就是),并且要求這個(gè)“數(shù)據(jù)”的類型要和聲明的返回值類型一致,要不然編譯器就會(huì)報(bào)錯(cuò)了。代碼這樣寫就沒問題了:

如果代碼這樣寫呢?

編 譯 以 上 程 序 , 我 們 可 以 看 到 編 譯 器 報(bào) 錯(cuò) 了 , 提 示 的 錯(cuò) 誤 信 息 是 : “System.out.println("hello?world!");”這行代碼是無法訪問的語句。這是為什么呢?
因為在方法中如果一旦執(zhí)行了帶有“return”關(guān)鍵字的語句,此方法就會(huì)結(jié)束,所以以上的程序中“System.out.println("hello?world!");”這行代碼是永遠(yuǎn)無法執(zhí)行到的,所以編譯報(bào)錯(cuò)了。得到的結(jié)論是:帶有return 關(guān)鍵字的語句只要執(zhí)行,所在的方法則執(zhí)行結(jié)束。
那這樣寫呢?

還是編譯報(bào)錯(cuò),錯(cuò)誤信息是“缺少返回語句”,為什么呢?實(shí)際上方法在聲明的時(shí)候指定了返回值類型為int 類型,java 語法則要求方法必須能夠“百分百的保證”在結(jié)束的時(shí)候返回int 類型的數(shù)據(jù),以上程序“return 1;”出現(xiàn)在if 語句的分支當(dāng)中,對(duì)于編譯器來說,它只知道“return 1;”有可能執(zhí)行,也有可能不執(zhí)行,所以java 編譯器報(bào)錯(cuò)了,不允許程序員這樣編寫代碼。來看以下代碼:

這樣就能編譯通過了,為什么呢?這是因?yàn)榫幾g器能夠檢測(cè)出以上的 if..else..語句必然會(huì)有一個(gè)分支執(zhí)行,這樣就不缺少返回語句了。其實(shí)以上代碼也可以這樣寫:

以上代碼也可以達(dá)到同樣的效果,因?yàn)椤?/span>return?1;”如果不執(zhí)行,則一定會(huì)執(zhí)行“return?0;”, 當(dāng)然,如果執(zhí)行了“return?1;”則方法一定會(huì)結(jié)束,“return?0;”也就沒有執(zhí)行的機(jī)會(huì)了。
再看下面的代碼:

以上程序還是編譯報(bào)錯(cuò),哪里出錯(cuò)了,為什么呢?其中“第 1 行”和“第 3 行”代碼沒有執(zhí)行機(jī)會(huì),編譯報(bào)錯(cuò),但“第2 行”是有執(zhí)行機(jī)會(huì)的。
通過以上程序我們可以得出這樣的結(jié)論: 在同一個(gè)“域”中,“return”語句后面是不能寫任何代碼的,因?yàn)樗鼰o法執(zhí)行到。如果只是單純的完成以上代碼的功能我們也可以這樣寫:

所以,一個(gè)功能的實(shí)現(xiàn),代碼可以寫很多種不同的方式,慢慢培養(yǎng)吧同學(xué)們,這需要一個(gè)過程,千萬戒驕戒躁。我們接著看關(guān)于返回值還有哪些注意事項(xiàng):

以上代碼編譯報(bào)錯(cuò),為什么呢?這是因?yàn)橐粋€(gè)方法在聲明的時(shí)候返回值類型定義為 void, 這就表示該方法執(zhí)行結(jié)束的時(shí)候不能返回任何數(shù)據(jù),而以上程序中編寫了“return 10;”這樣的代碼,自然編譯器會(huì)報(bào)錯(cuò)的。也就是說前后說法要一致,聲明的時(shí)候有返回值,那么代碼編寫的時(shí)候就必須有“return??值;”這樣的語句。如果聲明的時(shí)候沒有返回值,那么方法結(jié)束的時(shí)候就不能編寫“return 值;”這樣的語句。那么,大家再來看看以下的代碼:

經(jīng)過測(cè)試,以上的代碼編譯通過了,也就是說當(dāng)一個(gè)方法的返回值類型是 void 的時(shí)候,方法體當(dāng)中允許出現(xiàn)“return;”語句(注意:不允許出現(xiàn)“return 值;”),這個(gè)語法的作用主要是用來終止方法的執(zhí)行。當(dāng)一個(gè)方法的返回值類型是 void 的時(shí)候,在方法執(zhí)行過程中,如果滿足了某個(gè)條件,則這個(gè)方法可能就沒必要往下繼續(xù)執(zhí)行了,想終止這個(gè)方法的執(zhí)行,此時(shí)執(zhí)行“return;”就行了。
有一些同學(xué)在最初的學(xué)習(xí)過程中,對(duì) break 和 return 認(rèn)識(shí)的不夠清晰, 我們來研究一下,請(qǐng)看以下代碼:

運(yùn)行結(jié)果如下圖所示:


運(yùn)行結(jié)果如下圖所示:

通過以上的測(cè)試,我們可以得出 break 和return 根本不是一個(gè)級(jí)別的,break 用來終止循環(huán),
return 用來終止一個(gè)方法的執(zhí)行。接下來再看一段代碼:

經(jīng)過測(cè)試,以上代碼編譯報(bào)錯(cuò),錯(cuò)誤信息是:缺少返回值,為什么呢?這是因?yàn)榉椒ㄔ诼?/span>明的時(shí)候規(guī)定了返回 int 類型的值,但是在方法體當(dāng)中執(zhí)行了“return;”語句,并沒有返回具體的值,所以“return;”只能出現(xiàn)在返回值類型是 void 的方法中。
接下來我們來看看,當(dāng)一個(gè)方法執(zhí)行結(jié)束之后怎么接收這個(gè)返回值呢?請(qǐng)看下面代碼:

運(yùn)行結(jié)果如下圖所示:

通過以上的測(cè)試我們得知,方法執(zhí)行結(jié)束之后的返回值我們可以接收,也可以不接收,不 是必須的,但大多數(shù)情況下方法的返回值還是需要接收的,要不然就沒有意義了,另外方法的 返回值在接收的時(shí)候采用變量的方式接收,要求這個(gè)變量的數(shù)據(jù)類型和返回值類型一致(當(dāng)然, 也可以遵守自動(dòng)類型轉(zhuǎn)換規(guī)則)。
?
棧數(shù)據(jù)結(jié)構(gòu)
要想理解方法執(zhí)行過程中內(nèi)存的分配,我們需要先學(xué)習(xí)一下棧數(shù)據(jù)結(jié)構(gòu),那么什么是數(shù)據(jù)結(jié)構(gòu)呢?
其實(shí)數(shù)據(jù)結(jié)構(gòu)是一門獨(dú)立的學(xué)科,不僅是在 java 編程中需要使用,在其它編程語言中也會(huì)使用,在大學(xué)的計(jì)算機(jī)課程當(dāng)中,數(shù)據(jù)結(jié)構(gòu)和算法通常作為必修課出現(xiàn),而且是在學(xué)習(xí)任何一門編程語言之前先進(jìn)行數(shù)據(jù)結(jié)構(gòu)和算法的學(xué)習(xí)。數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運(yùn)行或者存儲(chǔ)效率。數(shù)據(jù)結(jié)構(gòu)往往同高效的檢索算法和索引技術(shù)有關(guān)。
常見的數(shù)據(jù)結(jié)構(gòu)有哪些呢?
例如:棧、隊(duì)列、鏈表、數(shù)組、樹、圖、堆、散列表等。目前我們先來學(xué)習(xí)一下棧(stack)數(shù)據(jù)結(jié)構(gòu),這是一種非常簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。如下圖所示:

棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。其限制是:僅允許在表的一端進(jìn)行插入和刪除運(yùn)算。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入?;驂簵?/span>(push),它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個(gè)棧刪除元素又稱作出棧、退?;驈棗?/span>(pop),它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。如下圖所示:

通過以上的學(xué)習(xí),我們可以得知棧數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)有這樣的特點(diǎn):先進(jìn)后出,或者后進(jìn)先出原則。也就是說最先進(jìn)去的元素一定是最后出去,最后進(jìn)去的元素一定是最先出去,因?yàn)?/span>一端是開口的,另一端是封閉的。
對(duì)于棧數(shù)據(jù)結(jié)構(gòu),目前我們了解這么多就可以了,等學(xué)完“方法執(zhí)行的時(shí)候內(nèi)存是如何變化的”,到那個(gè)時(shí)候大家再思考一個(gè)問題,為什么方法執(zhí)行過程的內(nèi)存要采用棧這種數(shù)據(jù)結(jié)構(gòu)呢,為什么不選擇其它數(shù)據(jù)結(jié)構(gòu)呢?
方法執(zhí)行過程中內(nèi)存的變化
以上內(nèi)容中講解了方法是什么,怎么定義,怎么調(diào)用,目前來說大家實(shí)際上掌握這些內(nèi)容就行了,接下來的內(nèi)容大家盡量去學(xué),實(shí)在是掌握不了,也沒有關(guān)系,后期的內(nèi)容會(huì)對(duì)這一部分的知識(shí)點(diǎn)進(jìn)行不斷的講解,慢慢的大家就會(huì)了,其實(shí)在學(xué)習(xí)編程的過程中會(huì)遇到很多這樣的情況,沒事,大家不要心急,學(xué)習(xí)后面內(nèi)容的過程中你會(huì)對(duì)前面的內(nèi)容豁然開朗。
以下要講解的是程序的內(nèi)存,例如:代碼片段被存儲(chǔ)在什么位置?方法調(diào)用的時(shí)候,在哪里開辟內(nèi)存空間等等。所以這一部分內(nèi)容還是很高端大氣上檔次的。不過話又說回來,要想真正掌握java,內(nèi)存的分析是必要的。一旦掌握內(nèi)存的分配,在程序沒有運(yùn)行之前我們就可以很精準(zhǔn)的預(yù)測(cè)到程序的執(zhí)行結(jié)果。
好了,接下來我們開始學(xué)習(xí)方法執(zhí)行過程中內(nèi)存是如何變化的?我們先來看一張圖片:

上圖是一張標(biāo)準(zhǔn)的java 虛擬機(jī)內(nèi)存結(jié)構(gòu)圖,目前我們只看其中的“棧”和“方法區(qū)”,其它的后期研究,方法區(qū)中存儲(chǔ)類的信息,或者也可以理解為代碼片段,方法在執(zhí)行過程中需要的內(nèi)存空間在棧中分配。java 程序開始執(zhí)行的時(shí)候先通過類加載器子系統(tǒng)找到硬盤上的字節(jié)碼(class)文件,然后將其加載到 java 虛擬機(jī)的方法區(qū)當(dāng)中,開始調(diào)用main 方法,main 方法被調(diào)用的瞬間,會(huì)給main 方法在“?!眱?nèi)存中分配所屬的活動(dòng)空間,此時(shí)發(fā)生壓棧動(dòng)作,main 方法的活動(dòng)空間處于棧底。
也就是說,方法只定義不去調(diào)用的話,只是把它的代碼片段存儲(chǔ)在方法區(qū)當(dāng)中,java???虛擬機(jī)是不會(huì)在棧內(nèi)存當(dāng)中給該方法分配活動(dòng)空間的,只有在調(diào)用的瞬間,java??虛擬機(jī)才會(huì)在“棧內(nèi)存”當(dāng)中給該方法分配活動(dòng)空間,此時(shí)發(fā)生壓棧動(dòng)作,直到這個(gè)方法執(zhí)行結(jié)束的時(shí)候,這個(gè) 方法在棧內(nèi)存中所對(duì)應(yīng)的活動(dòng)空間就會(huì)釋放掉,此時(shí)發(fā)生彈棧動(dòng)作。由于棧的特點(diǎn)是先進(jìn)后出, 所以最先調(diào)用的方法(最先壓棧)一定是最后結(jié)束的(最后彈棧)。
比如:main???方法最先被調(diào)用,那么它一定是最后一個(gè)結(jié)束的。換句話說:main???方法結(jié)束了,程序也就結(jié)束了(目前來說是這樣)。
接下來我們來看一段代碼,同時(shí)畫出內(nèi)存結(jié)構(gòu)圖,以及使用文字描述該程序的內(nèi)存變化:

運(yùn)行結(jié)果如下圖所示:

通過上圖的執(zhí)行結(jié)果我們了解到,main 方法最先被調(diào)用,但是它是最后結(jié)束的,其中 m2 方法最后被調(diào)用,但它是最先結(jié)束的。大家別忘了調(diào)用的時(shí)候分配內(nèi)存是壓棧,結(jié)束的時(shí)候是釋放內(nèi)存彈棧哦。為什么會(huì)是上圖的結(jié)果呢,我們來看看它執(zhí)行的內(nèi)存變化,請(qǐng)看下圖:

通過上圖的分析,可以很快明白,為什么輸出結(jié)果是這樣的順序,接下來我們?cè)俨捎梦淖?/span>的方式描述它的內(nèi)存變化:
類加載器將class?文件加載到方法區(qū)。
開始調(diào)用main?方法,在棧內(nèi)存中給 main?方法分配空間,開始執(zhí)行main?方法,輸出”main begin”。
調(diào)用m1()方法,在棧內(nèi)存中給m1()方法分配空間,m1()方法處于棧頂,具備活躍權(quán), 輸出”m1?begin”。
調(diào)用m2()方法,在棧內(nèi)存中給m2()方法分配空間,m2()方法處于棧頂,具備活躍權(quán),輸出”m2 begin”,繼續(xù)輸出”m2 over”。
m2()方法執(zhí)行結(jié)束,內(nèi)存釋放,彈棧。
m1()方法這時(shí)處于棧頂,具備活躍權(quán),輸出”m1?over”。
m1()方法執(zhí)行結(jié)束,內(nèi)存釋放,彈棧。
main()方法這時(shí)處于棧頂,具備活躍權(quán),輸出”main?over”。
main()方法執(zhí)行結(jié)束,內(nèi)存釋放,彈棧。
?棧空了,程序結(jié)束。
大家是否還記得之前的課程中曾經(jīng)提到方法體當(dāng)中的代碼是有執(zhí)行順序的,必須遵循自上而下的順序依次逐行執(zhí)行,當(dāng)前行代碼必須執(zhí)行結(jié)束之后,下一行代碼才能執(zhí)行,不能跳行執(zhí)行,還記得嗎?現(xiàn)在再和棧數(shù)據(jù)結(jié)構(gòu)一起聯(lián)系起來思考一下,為什么要采用棧數(shù)據(jù)結(jié)構(gòu)呢?是不是只有采用這種先進(jìn)后出的棧數(shù)據(jù)結(jié)構(gòu)才可以保證代碼的執(zhí)行順序呢!此時(shí),你是不是感覺程序的設(shè)計(jì)者在此處設(shè)計(jì)的非常巧妙呢!
最后附Java零基礎(chǔ)視頻教程給大家,配合學(xué)習(xí)效果更佳??!
